@go-to-k/cdkd 0.298.8 → 0.299.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{asg-provider-B8N6UPAH.js → asg-provider-BxW2FkQz.js} +4 -4
- package/dist/{asg-provider-B8N6UPAH.js.map → asg-provider-BxW2FkQz.js.map} +1 -1
- package/dist/{aws-client-defaults-D0q0z4dG.js → aws-client-defaults-DBXBcg0J.js} +79 -3
- package/dist/aws-client-defaults-DBXBcg0J.js.map +1 -0
- package/dist/{aws-clients-CnmtbrxD.js → aws-clients-Bj7qH5Ph.js} +2 -2
- package/dist/{aws-clients-CnmtbrxD.js.map → aws-clients-Bj7qH5Ph.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-HKmcD4Kn.js → deploy-engine-CZUhJ1IZ.js} +932 -207
- package/dist/deploy-engine-CZUhJ1IZ.js.map +1 -0
- package/dist/{iam-policy-targets-CwKiK9nS.js → iam-policy-targets-Pn2m0R67.js} +3 -3
- package/dist/{iam-policy-targets-CwKiK9nS.js.map → iam-policy-targets-Pn2m0R67.js.map} +1 -1
- package/dist/{iam-role-provider-BiCib2zp.js → iam-role-provider-C24I_FvR.js} +47 -7
- package/dist/iam-role-provider-C24I_FvR.js.map +1 -0
- package/dist/index.d.ts +24 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/{neptune-provider-D3Qcci3J.js → neptune-provider-D7sAjt4U.js} +4 -4
- package/dist/{neptune-provider-D3Qcci3J.js.map → neptune-provider-D7sAjt4U.js.map} +1 -1
- package/dist/{program-MMwB_CTT.js → program-w-kAH85e.js} +272 -97
- package/dist/program-w-kAH85e.js.map +1 -0
- package/dist/{provider-classes--iMwAb7q.js → provider-classes-Xrt4DIC7.js} +89 -16
- package/dist/provider-classes-Xrt4DIC7.js.map +1 -0
- package/dist/{rds-provider-BdUme0V8.js → rds-provider-Bz8JUYBp.js} +4 -4
- package/dist/{rds-provider-BdUme0V8.js.map → rds-provider-Bz8JUYBp.js.map} +1 -1
- package/dist/{version-n6UXfuUI.js → version-DMqEiJIt.js} +2 -2
- package/dist/{version-n6UXfuUI.js.map → version-DMqEiJIt.js.map} +1 -1
- package/package.json +1 -1
- package/dist/aws-client-defaults-D0q0z4dG.js.map +0 -1
- package/dist/deploy-engine-HKmcD4Kn.js.map +0 -1
- package/dist/iam-role-provider-BiCib2zp.js.map +0 -1
- package/dist/program-MMwB_CTT.js.map +0 -1
- package/dist/provider-classes--iMwAb7q.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { r as getAwsClients, s as __exportAll } from "./aws-clients-
|
|
1
|
+
import { r as getAwsClients, s as __exportAll } from "./aws-clients-Bj7qH5Ph.js";
|
|
2
2
|
import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, H as truncateCodePoints, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as terminalSafe, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-DtvlUugx.js";
|
|
3
|
-
import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-
|
|
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-
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
3
|
+
import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Pn2m0R67.js";
|
|
4
|
+
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-DBXBcg0J.js";
|
|
5
|
+
import { t as getCdkdVersion } from "./version-DMqEiJIt.js";
|
|
6
6
|
import { createHash, randomUUID } from "node:crypto";
|
|
7
7
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
8
8
|
import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
|
|
@@ -2308,7 +2308,7 @@ async function resolveStateBucketWithDefaultAndSource(cliBucket, region, legacyF
|
|
|
2308
2308
|
logger.debug("No state bucket specified, resolving default from account...");
|
|
2309
2309
|
const { GetCallerIdentityCommand } = await import("@aws-sdk/client-sts");
|
|
2310
2310
|
const { S3Client, HeadBucketCommand, ListObjectsV2Command } = await import("@aws-sdk/client-s3");
|
|
2311
|
-
const { getAwsClients } = await import("./aws-clients-
|
|
2311
|
+
const { getAwsClients } = await import("./aws-clients-Bj7qH5Ph.js").then((n) => n.n);
|
|
2312
2312
|
const { expectedOwnerParam, recordResolvedAccountId } = await Promise.resolve().then(() => expected_bucket_owner_exports);
|
|
2313
2313
|
const probeDeps = {
|
|
2314
2314
|
HeadBucketCommand,
|
|
@@ -4751,7 +4751,8 @@ const STATE_SCHEMA_VERSIONS_READABLE = [
|
|
|
4751
4751
|
8,
|
|
4752
4752
|
9,
|
|
4753
4753
|
10,
|
|
4754
|
-
11
|
|
4754
|
+
11,
|
|
4755
|
+
12
|
|
4755
4756
|
];
|
|
4756
4757
|
function hasUnverifiableParameterRefusal(record) {
|
|
4757
4758
|
return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
|
|
@@ -5482,6 +5483,19 @@ async function rebuildClientForBucketRegion(client, bucket, opts = {}) {
|
|
|
5482
5483
|
return replacement;
|
|
5483
5484
|
}
|
|
5484
5485
|
|
|
5486
|
+
//#endregion
|
|
5487
|
+
//#region src/state/token-free-state.ts
|
|
5488
|
+
const tokenFreeStates = /* @__PURE__ */ new WeakSet();
|
|
5489
|
+
function bodyMayCarryReferences(body) {
|
|
5490
|
+
return body.includes("{{resolve:") || body.includes("\"referenceProvenance\"") || body.includes("\"outputReferenceProvenance\"");
|
|
5491
|
+
}
|
|
5492
|
+
function markTokenFreeState(state) {
|
|
5493
|
+
tokenFreeStates.add(state);
|
|
5494
|
+
}
|
|
5495
|
+
function isKnownTokenFreeState(state) {
|
|
5496
|
+
return state !== void 0 && tokenFreeStates.has(state);
|
|
5497
|
+
}
|
|
5498
|
+
|
|
5485
5499
|
//#endregion
|
|
5486
5500
|
//#region src/state/s3-state-backend.ts
|
|
5487
5501
|
function errorDetail$2(error) {
|
|
@@ -5649,6 +5663,7 @@ var S3StateBackend = class S3StateBackend {
|
|
|
5649
5663
|
const bodyString = await response.Body.transformToString();
|
|
5650
5664
|
const parsed = this.parseStateBody(bodyString, stackName);
|
|
5651
5665
|
const { state, divergentBodyRegion } = this.adoptKeyRegion(parsed, region, shownStackName, shownRegionName);
|
|
5666
|
+
if (!bodyMayCarryReferences(bodyString)) markTokenFreeState(state);
|
|
5652
5667
|
this.logger.debug(`Retrieved state: ${shownStackName} (${shownRegionName}), ETag: ${response.ETag}`);
|
|
5653
5668
|
return {
|
|
5654
5669
|
state,
|
|
@@ -5679,7 +5694,7 @@ var S3StateBackend = class S3StateBackend {
|
|
|
5679
5694
|
const { expectedEtag, migrateLegacy } = options;
|
|
5680
5695
|
const body = {
|
|
5681
5696
|
...state,
|
|
5682
|
-
version:
|
|
5697
|
+
version: 12,
|
|
5683
5698
|
stackName,
|
|
5684
5699
|
region
|
|
5685
5700
|
};
|
|
@@ -7174,7 +7189,7 @@ const WHOLE_DYNAMIC_REFERENCE_PATTERN = new RegExp(`^\\{\\{resolve:${DYNAMIC_REF
|
|
|
7174
7189
|
function isSingleDynamicReferenceToken(value) {
|
|
7175
7190
|
return WHOLE_DYNAMIC_REFERENCE_PATTERN.test(value);
|
|
7176
7191
|
}
|
|
7177
|
-
function isPlainObject$
|
|
7192
|
+
function isPlainObject$5(value) {
|
|
7178
7193
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
7179
7194
|
}
|
|
7180
7195
|
|
|
@@ -7423,7 +7438,7 @@ function crossStackSourceKey(source) {
|
|
|
7423
7438
|
}
|
|
7424
7439
|
if (key === "Fn::GetStackOutput") {
|
|
7425
7440
|
const args = source[key];
|
|
7426
|
-
if (!isPlainObject$
|
|
7441
|
+
if (!isPlainObject$5(args)) return void 0;
|
|
7427
7442
|
const stackName = Object.hasOwn(args, "StackName") ? literalStringOrUndefined(args["StackName"]) : void 0;
|
|
7428
7443
|
const outputName = Object.hasOwn(args, "OutputName") ? literalStringOrUndefined(args["OutputName"]) : void 0;
|
|
7429
7444
|
if (stackName === void 0 || outputName === void 0) return void 0;
|
|
@@ -7469,7 +7484,7 @@ function crossStackSourceKey(source) {
|
|
|
7469
7484
|
let template;
|
|
7470
7485
|
let variables;
|
|
7471
7486
|
if (typeof raw === "string") template = raw;
|
|
7472
|
-
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$
|
|
7487
|
+
else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$5(raw[1])) {
|
|
7473
7488
|
if (typeof raw[0] !== "string") return void 0;
|
|
7474
7489
|
template = raw[0];
|
|
7475
7490
|
variables = raw[1];
|
|
@@ -7712,12 +7727,12 @@ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
|
|
|
7712
7727
|
function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
|
|
7713
7728
|
if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
|
|
7714
7729
|
if (secrets.size === 0) return;
|
|
7715
|
-
if (!isPlainObject$
|
|
7730
|
+
if (!isPlainObject$5(resolvedProperties) || !isPlainObject$5(sourceProperties)) return;
|
|
7716
7731
|
if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
|
|
7717
7732
|
if (!Object.hasOwn(sourceProperties, "Parameters")) return;
|
|
7718
7733
|
const resolvedParameters = resolvedProperties["Parameters"];
|
|
7719
7734
|
const sourceParameters = sourceProperties["Parameters"];
|
|
7720
|
-
if (!isPlainObject$
|
|
7735
|
+
if (!isPlainObject$5(resolvedParameters) || !isPlainObject$5(sourceParameters)) return;
|
|
7721
7736
|
const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
|
|
7722
7737
|
let table = nestedStackParameterExpressions.get(secrets);
|
|
7723
7738
|
for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
|
|
@@ -7766,7 +7781,7 @@ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedPr
|
|
|
7766
7781
|
if (typeof resolvedValue !== "string") return void 0;
|
|
7767
7782
|
const sourceLeaf = sourceParameters[name];
|
|
7768
7783
|
if (typeof sourceLeaf === "string") return sourceLeaf;
|
|
7769
|
-
if (!isPlainObject$
|
|
7784
|
+
if (!isPlainObject$5(sourceLeaf)) return void 0;
|
|
7770
7785
|
const written = positioned[name];
|
|
7771
7786
|
if (typeof written !== "string") return void 0;
|
|
7772
7787
|
const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
|
|
@@ -7977,7 +7992,7 @@ function appendValuePlaceholderParts(value, out, budget, depth) {
|
|
|
7977
7992
|
if (budget.exhausted) return;
|
|
7978
7993
|
const literal = joinPartLiteralText(value);
|
|
7979
7994
|
if (literal !== void 0) return pushPlaceholderPart(out, literal, budget);
|
|
7980
|
-
if (isPlainObject$
|
|
7995
|
+
if (isPlainObject$5(value) && Object.keys(value).length === 1) {
|
|
7981
7996
|
const ref = value["Ref"];
|
|
7982
7997
|
if (typeof ref === "string" && ref !== "") return pushPlaceholderPart(out, keyedPart({ Ref: ref }), budget);
|
|
7983
7998
|
if (depth >= MAX_PLACEHOLDER_DEPTH) {
|
|
@@ -8009,7 +8024,7 @@ function appendParameterPlaceholderParts(source, out, budget, depth) {
|
|
|
8009
8024
|
let template;
|
|
8010
8025
|
let variables = {};
|
|
8011
8026
|
if (typeof args === "string") template = args;
|
|
8012
|
-
else if (Array.isArray(args) && args.length === 2 && isPlainObject$
|
|
8027
|
+
else if (Array.isArray(args) && args.length === 2 && isPlainObject$5(args[1])) {
|
|
8013
8028
|
template = args[0];
|
|
8014
8029
|
variables = args[1];
|
|
8015
8030
|
} else return false;
|
|
@@ -8157,7 +8172,7 @@ function isUniquelyKeyedBy(items, key) {
|
|
|
8157
8172
|
if (items.length === 0) return false;
|
|
8158
8173
|
const seen = /* @__PURE__ */ new Set();
|
|
8159
8174
|
for (const item of items) {
|
|
8160
|
-
if (!isPlainObject$
|
|
8175
|
+
if (!isPlainObject$5(item) || !Object.hasOwn(item, key)) return false;
|
|
8161
8176
|
const id = item[key];
|
|
8162
8177
|
if (typeof id !== "string" || id === "") return false;
|
|
8163
8178
|
if (seen.has(id)) return false;
|
|
@@ -8187,11 +8202,11 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
8187
8202
|
}
|
|
8188
8203
|
return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
|
|
8189
8204
|
}
|
|
8190
|
-
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$
|
|
8205
|
+
if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$5(source)) {
|
|
8191
8206
|
const inherited = positionByInheritedParameter(bag, source, secrets);
|
|
8192
8207
|
if (inherited !== void 0) return inherited;
|
|
8193
8208
|
}
|
|
8194
|
-
if (typeof bag === "string" && isPlainObject$
|
|
8209
|
+
if (typeof bag === "string" && isPlainObject$5(source)) {
|
|
8195
8210
|
const certified = positionByCrossStackSource(bag, source, secrets);
|
|
8196
8211
|
if (certified !== void 0) return certified;
|
|
8197
8212
|
const placeheld = positionByParameterPlaceholders(bag, source, secrets);
|
|
@@ -8201,7 +8216,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
8201
8216
|
const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
|
|
8202
8217
|
if (framed !== void 0) return framed;
|
|
8203
8218
|
}
|
|
8204
|
-
if (Array.isArray(bag) && isPlainObject$
|
|
8219
|
+
if (Array.isArray(bag) && isPlainObject$5(source)) {
|
|
8205
8220
|
const positionedList = positionListByCrossStackSource(bag, source, secrets);
|
|
8206
8221
|
if (positionedList !== void 0) return positionedList;
|
|
8207
8222
|
}
|
|
@@ -8229,7 +8244,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
8229
8244
|
}
|
|
8230
8245
|
if (rules.descendArrays && bag.length === source.length) return bag.map((item, i) => redactByPath(item, source[i], secrets, rules, secretExpressions, bagIsSameGeneration));
|
|
8231
8246
|
}
|
|
8232
|
-
if (isPlainObject$
|
|
8247
|
+
if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
|
|
8233
8248
|
const out = Object.create(null);
|
|
8234
8249
|
for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactSecretsForState(v, secrets);
|
|
8235
8250
|
return out;
|
|
@@ -8242,7 +8257,7 @@ function isReadbackProjectedFromState(rules) {
|
|
|
8242
8257
|
function subtreeHasDynamicReference(value) {
|
|
8243
8258
|
if (isDynamicReferenceString(value)) return true;
|
|
8244
8259
|
if (Array.isArray(value)) return value.some(subtreeHasDynamicReference);
|
|
8245
|
-
if (isPlainObject$
|
|
8260
|
+
if (isPlainObject$5(value)) return Object.values(value).some(subtreeHasDynamicReference);
|
|
8246
8261
|
return false;
|
|
8247
8262
|
}
|
|
8248
8263
|
function pathCrossesDottedKey(bag, path) {
|
|
@@ -8317,8 +8332,8 @@ function deepEqualJsonValue(a, b) {
|
|
|
8317
8332
|
if (!Array.isArray(b) || a.length !== b.length) return false;
|
|
8318
8333
|
return a.every((item, i) => deepEqualJsonValue(item, b[i]));
|
|
8319
8334
|
}
|
|
8320
|
-
if (isPlainObject$
|
|
8321
|
-
if (!isPlainObject$
|
|
8335
|
+
if (isPlainObject$5(a)) {
|
|
8336
|
+
if (!isPlainObject$5(b)) return false;
|
|
8322
8337
|
if (!hasPlainPrototype(a) || !hasPlainPrototype(b)) return false;
|
|
8323
8338
|
const keys = Object.keys(a);
|
|
8324
8339
|
if (keys.length !== Object.keys(b).length) return false;
|
|
@@ -8344,7 +8359,7 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE
|
|
|
8344
8359
|
for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, seen));
|
|
8345
8360
|
return out;
|
|
8346
8361
|
}
|
|
8347
|
-
if (isPlainObject$
|
|
8362
|
+
if (isPlainObject$5(value) && hasPlainPrototype(value)) {
|
|
8348
8363
|
const out = Object.create(null);
|
|
8349
8364
|
seen.set(value, out);
|
|
8350
8365
|
for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, seen);
|
|
@@ -8372,7 +8387,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
8372
8387
|
return mark ? POSITION_DECIDED : source;
|
|
8373
8388
|
}
|
|
8374
8389
|
if (!subtreeHasDynamicReference(source)) return bag;
|
|
8375
|
-
if (isPlainObject$
|
|
8390
|
+
if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
|
|
8376
8391
|
const out = Object.create(null);
|
|
8377
8392
|
for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
|
|
8378
8393
|
return out;
|
|
@@ -8399,14 +8414,14 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
|
|
|
8399
8414
|
function isDistinguishingAnchor(value) {
|
|
8400
8415
|
if (typeof value === "string") return value !== "";
|
|
8401
8416
|
if (Array.isArray(value)) return value.some(isDistinguishingAnchor);
|
|
8402
|
-
if (isPlainObject$
|
|
8417
|
+
if (isPlainObject$5(value)) return Object.values(value).some(isDistinguishingAnchor);
|
|
8403
8418
|
return false;
|
|
8404
8419
|
}
|
|
8405
8420
|
const ANCHOR_REFERENCE_MASK = "<ref>";
|
|
8406
8421
|
function anchorSignature(source) {
|
|
8407
8422
|
if (isDynamicReferenceString(source)) return ANCHOR_REFERENCE_MASK;
|
|
8408
8423
|
if (Array.isArray(source)) return `[${source.map(anchorSignature).sort().join(",")}]`;
|
|
8409
|
-
if (isPlainObject$
|
|
8424
|
+
if (isPlainObject$5(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
|
|
8410
8425
|
return JSON.stringify(source) ?? "undefined";
|
|
8411
8426
|
}
|
|
8412
8427
|
function anchorsCorroboratePairing(bag, source, anchors) {
|
|
@@ -8416,8 +8431,8 @@ function anchorsCorroboratePairing(bag, source, anchors) {
|
|
|
8416
8431
|
return true;
|
|
8417
8432
|
}
|
|
8418
8433
|
if (isDynamicReferenceString(source)) return typeof bag === "string";
|
|
8419
|
-
if (isPlainObject$
|
|
8420
|
-
if (!isPlainObject$
|
|
8434
|
+
if (isPlainObject$5(source)) {
|
|
8435
|
+
if (!isPlainObject$5(bag)) return false;
|
|
8421
8436
|
return Object.keys(source).every((k) => Object.hasOwn(bag, k) && anchorsCorroboratePairing(bag[k], source[k], anchors));
|
|
8422
8437
|
}
|
|
8423
8438
|
if (Array.isArray(source)) {
|
|
@@ -8508,13 +8523,13 @@ function learnMixedLeafNeedle(collector, bag, source) {
|
|
|
8508
8523
|
learnNeedle(collector, plaintext, token);
|
|
8509
8524
|
}
|
|
8510
8525
|
function asChild(marks, key) {
|
|
8511
|
-
return isPlainObject$
|
|
8526
|
+
return isPlainObject$5(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
|
|
8512
8527
|
}
|
|
8513
8528
|
function asIndex(marks, index) {
|
|
8514
8529
|
return Array.isArray(marks) ? marks[index] : void 0;
|
|
8515
8530
|
}
|
|
8516
8531
|
function preferPositionDecisions(scanned, refused, bag, marks, inferred) {
|
|
8517
|
-
if (isPlainObject$
|
|
8532
|
+
if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(refused) && isPlainObject$5(scanned)) {
|
|
8518
8533
|
const out = Object.create(null);
|
|
8519
8534
|
for (const [k, v] of Object.entries(refused)) out[k] = preferPositionDecisions(scanned[k], v, bag[k], asChild(marks, k), inferred);
|
|
8520
8535
|
return out;
|
|
@@ -8953,6 +8968,95 @@ function positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIs
|
|
|
8953
8968
|
}, bagIsSameGeneration);
|
|
8954
8969
|
}
|
|
8955
8970
|
|
|
8971
|
+
//#endregion
|
|
8972
|
+
//#region src/deployment/secret-redaction/reference-provenance.ts
|
|
8973
|
+
const passProvenanceOf = /* @__PURE__ */ new WeakMap();
|
|
8974
|
+
const MAX_REFERENCE_VERSIONS = 8;
|
|
8975
|
+
function entryFor(secrets, token) {
|
|
8976
|
+
let table = passProvenanceOf.get(secrets);
|
|
8977
|
+
if (table === void 0) {
|
|
8978
|
+
table = /* @__PURE__ */ new Map();
|
|
8979
|
+
passProvenanceOf.set(secrets, table);
|
|
8980
|
+
}
|
|
8981
|
+
let entry = table.get(token);
|
|
8982
|
+
if (entry === void 0) {
|
|
8983
|
+
entry = {
|
|
8984
|
+
regions: /* @__PURE__ */ new Set(),
|
|
8985
|
+
regionUnknown: false,
|
|
8986
|
+
versions: /* @__PURE__ */ new Set(),
|
|
8987
|
+
versionUnknown: false,
|
|
8988
|
+
readVersions: /* @__PURE__ */ new Set()
|
|
8989
|
+
};
|
|
8990
|
+
table.set(token, entry);
|
|
8991
|
+
}
|
|
8992
|
+
return entry;
|
|
8993
|
+
}
|
|
8994
|
+
function recordReferenceResolution(secrets, token, resolution) {
|
|
8995
|
+
const entry = entryFor(secrets, token);
|
|
8996
|
+
if (resolution.region === void 0) entry.regionUnknown = true;
|
|
8997
|
+
else entry.regions.add(resolution.region);
|
|
8998
|
+
if (resolution.version === void 0) {
|
|
8999
|
+
entry.versionUnknown = true;
|
|
9000
|
+
return;
|
|
9001
|
+
}
|
|
9002
|
+
entry.versions.add(resolution.version);
|
|
9003
|
+
if (resolution.route === "read") entry.readVersions.add(resolution.version);
|
|
9004
|
+
}
|
|
9005
|
+
function recordReferenceProvenanceEntry(secrets, token, provenance, route) {
|
|
9006
|
+
const entry = entryFor(secrets, token);
|
|
9007
|
+
if (provenance.region === void 0) entry.regionUnknown = true;
|
|
9008
|
+
else entry.regions.add(provenance.region);
|
|
9009
|
+
if (provenance.versions === void 0 || provenance.versions.length === 0) {
|
|
9010
|
+
entry.versionUnknown = true;
|
|
9011
|
+
return;
|
|
9012
|
+
}
|
|
9013
|
+
for (const version of provenance.versions) {
|
|
9014
|
+
entry.versions.add(version);
|
|
9015
|
+
if (route === "read") entry.readVersions.add(version);
|
|
9016
|
+
}
|
|
9017
|
+
if (route === "literal") for (const version of provenance.readVersions ?? []) entry.readVersions.add(version);
|
|
9018
|
+
}
|
|
9019
|
+
function mergeReferenceProvenance(from, to) {
|
|
9020
|
+
const source = passProvenanceOf.get(from);
|
|
9021
|
+
if (source === void 0 || from === to) return;
|
|
9022
|
+
for (const [token, entry] of source) {
|
|
9023
|
+
const target = entryFor(to, token);
|
|
9024
|
+
for (const region of entry.regions) target.regions.add(region);
|
|
9025
|
+
target.regionUnknown ||= entry.regionUnknown;
|
|
9026
|
+
for (const version of entry.versions) target.versions.add(version);
|
|
9027
|
+
target.versionUnknown ||= entry.versionUnknown;
|
|
9028
|
+
for (const version of entry.readVersions) target.readVersions.add(version);
|
|
9029
|
+
}
|
|
9030
|
+
}
|
|
9031
|
+
function hasPassProvenance(secrets) {
|
|
9032
|
+
if (secrets === void 0) return false;
|
|
9033
|
+
const table = passProvenanceOf.get(secrets);
|
|
9034
|
+
return table !== void 0 && table.size > 0;
|
|
9035
|
+
}
|
|
9036
|
+
function passProvenanceFor(secrets, token) {
|
|
9037
|
+
if (secrets === void 0) return void 0;
|
|
9038
|
+
const entry = passProvenanceOf.get(secrets)?.get(token);
|
|
9039
|
+
if (entry === void 0) return void 0;
|
|
9040
|
+
return finalize(entry);
|
|
9041
|
+
}
|
|
9042
|
+
function finalize(entry) {
|
|
9043
|
+
const out = {};
|
|
9044
|
+
if (!entry.regionUnknown && entry.regions.size === 1) out.region = [...entry.regions][0];
|
|
9045
|
+
if (!entry.versionUnknown && entry.versions.size > 0 && entry.versions.size <= 8) {
|
|
9046
|
+
out.versions = [...entry.versions].sort();
|
|
9047
|
+
if (entry.readVersions.size > 0) out.readVersions = [...entry.readVersions].sort();
|
|
9048
|
+
}
|
|
9049
|
+
return out;
|
|
9050
|
+
}
|
|
9051
|
+
function snapshotPassProvenance(secrets) {
|
|
9052
|
+
if (secrets === void 0) return void 0;
|
|
9053
|
+
const table = passProvenanceOf.get(secrets);
|
|
9054
|
+
if (table === void 0 || table.size === 0) return void 0;
|
|
9055
|
+
const out = /* @__PURE__ */ new Map();
|
|
9056
|
+
for (const [token, entry] of table) out.set(token, finalize(entry));
|
|
9057
|
+
return out;
|
|
9058
|
+
}
|
|
9059
|
+
|
|
8956
9060
|
//#endregion
|
|
8957
9061
|
//#region src/deployment/secret-redaction/pairs.ts
|
|
8958
9062
|
const resolvedPairsOf = /* @__PURE__ */ new WeakMap();
|
|
@@ -8973,6 +9077,7 @@ function recordResolvedPair(secrets, expression, plaintext) {
|
|
|
8973
9077
|
}
|
|
8974
9078
|
function mergeResolvedPairs(from, to) {
|
|
8975
9079
|
carryMaskOnlyMarks(from, to);
|
|
9080
|
+
mergeReferenceProvenance(from, to);
|
|
8976
9081
|
const pairs = resolvedPairsOf.get(from);
|
|
8977
9082
|
if (pairs === void 0) return;
|
|
8978
9083
|
for (const [expression, plaintext] of pairs) if (typeof plaintext === "string") recordResolvedPair(to, expression, plaintext);
|
|
@@ -9543,7 +9648,7 @@ function readsNoEchoSource(node, sources) {
|
|
|
9543
9648
|
if (typeof argument === "string") return subStringReadsNoEcho(argument, void 0, sources);
|
|
9544
9649
|
if (Array.isArray(argument)) {
|
|
9545
9650
|
const [text, variables] = argument;
|
|
9546
|
-
const vars = isPlainObject$
|
|
9651
|
+
const vars = isPlainObject$5(variables) ? variables : void 0;
|
|
9547
9652
|
if (typeof text === "string" && subStringReadsNoEcho(text, vars, sources)) return true;
|
|
9548
9653
|
return vars !== void 0 && Object.values(vars).some(walk);
|
|
9549
9654
|
}
|
|
@@ -9577,7 +9682,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
9577
9682
|
parameters: sources.parameters,
|
|
9578
9683
|
...sources.conditions !== void 0 && { conditions: sources.conditions }
|
|
9579
9684
|
};
|
|
9580
|
-
const isBareDeclaredGetAtt = (node) => isPlainObject$
|
|
9685
|
+
const isBareDeclaredGetAtt = (node) => isPlainObject$5(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
|
|
9581
9686
|
const walk = (source, value, path) => {
|
|
9582
9687
|
if (value === void 0) return;
|
|
9583
9688
|
if (source === null || typeof source !== "object") return;
|
|
@@ -9593,7 +9698,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
|
|
|
9593
9698
|
const record = source;
|
|
9594
9699
|
const intrinsic = intrinsicKeyOf(record);
|
|
9595
9700
|
if (intrinsic === void 0) {
|
|
9596
|
-
if (!isPlainObject$
|
|
9701
|
+
if (!isPlainObject$5(value)) {
|
|
9597
9702
|
if (readsNoEchoSource(record, parametersOnly)) push(path, source);
|
|
9598
9703
|
return;
|
|
9599
9704
|
}
|
|
@@ -9641,7 +9746,7 @@ function maskWholeValue(value) {
|
|
|
9641
9746
|
if (value === null || value === void 0) return value;
|
|
9642
9747
|
if (typeof value === "string" && isSingleDynamicReferenceToken(value)) return value;
|
|
9643
9748
|
if (Array.isArray(value)) return value.map(maskWholeValue);
|
|
9644
|
-
if (isPlainObject$
|
|
9749
|
+
if (isPlainObject$5(value)) {
|
|
9645
9750
|
const out = {};
|
|
9646
9751
|
for (const [key, child] of Object.entries(value)) Object.defineProperty(out, key, {
|
|
9647
9752
|
value: maskWholeValue(child),
|
|
@@ -9664,7 +9769,7 @@ function readAt(bag, coordinate) {
|
|
|
9664
9769
|
node = node[segment];
|
|
9665
9770
|
continue;
|
|
9666
9771
|
}
|
|
9667
|
-
if (!isPlainObject$
|
|
9772
|
+
if (!isPlainObject$5(node) || !Object.hasOwn(node, segment)) return {
|
|
9668
9773
|
found: false,
|
|
9669
9774
|
value: void 0
|
|
9670
9775
|
};
|
|
@@ -9680,7 +9785,7 @@ function valueAtCoordinate(bag, coordinate) {
|
|
|
9680
9785
|
}
|
|
9681
9786
|
function cloneContainer(node) {
|
|
9682
9787
|
if (Array.isArray(node)) return [...node];
|
|
9683
|
-
if (isPlainObject$
|
|
9788
|
+
if (isPlainObject$5(node)) return { ...node };
|
|
9684
9789
|
return node;
|
|
9685
9790
|
}
|
|
9686
9791
|
function maskAtCoordinates(bag, coordinates) {
|
|
@@ -9747,20 +9852,20 @@ function readbackPathFor(readback, properties, coordinate) {
|
|
|
9747
9852
|
if (!Array.isArray(live)) return path.length === 0 ? void 0 : path;
|
|
9748
9853
|
const key = Array.isArray(desired) ? identityKeyFor(live, desired) : void 0;
|
|
9749
9854
|
const element = Array.isArray(desired) ? desired[segment] : void 0;
|
|
9750
|
-
if (key === void 0 || !isPlainObject$
|
|
9855
|
+
if (key === void 0 || !isPlainObject$5(element)) return path;
|
|
9751
9856
|
const identity = element[key];
|
|
9752
|
-
const index = live.findIndex((item) => isPlainObject$
|
|
9857
|
+
const index = live.findIndex((item) => isPlainObject$5(item) && item[key] === identity);
|
|
9753
9858
|
if (index < 0) return path;
|
|
9754
9859
|
path.push(index);
|
|
9755
9860
|
live = live[index];
|
|
9756
9861
|
desired = element;
|
|
9757
9862
|
continue;
|
|
9758
9863
|
}
|
|
9759
|
-
if (!isPlainObject$
|
|
9864
|
+
if (!isPlainObject$5(live)) return path.length === 0 ? void 0 : path;
|
|
9760
9865
|
if (!Object.hasOwn(live, segment)) return void 0;
|
|
9761
9866
|
path.push(segment);
|
|
9762
9867
|
live = live[segment];
|
|
9763
|
-
desired = isPlainObject$
|
|
9868
|
+
desired = isPlainObject$5(desired) ? desired[segment] : void 0;
|
|
9764
9869
|
}
|
|
9765
9870
|
return path;
|
|
9766
9871
|
}
|
|
@@ -9789,7 +9894,7 @@ function witnessNormalize(stored, today, v11) {
|
|
|
9789
9894
|
const confirmed = [];
|
|
9790
9895
|
const differing = [];
|
|
9791
9896
|
const walk = (s, t, v, path) => {
|
|
9792
|
-
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$
|
|
9897
|
+
if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$5(v) ? !isPlainObject$5(s) : false)) {
|
|
9793
9898
|
if (s === void 0 || containsMask(s)) return s;
|
|
9794
9899
|
if (jsonEqual(s, t)) {
|
|
9795
9900
|
confirmed.push(path);
|
|
@@ -9818,8 +9923,8 @@ function witnessNormalize(stored, today, v11) {
|
|
|
9818
9923
|
});
|
|
9819
9924
|
return changed ? out : s;
|
|
9820
9925
|
}
|
|
9821
|
-
if (isPlainObject$
|
|
9822
|
-
const tt = isPlainObject$
|
|
9926
|
+
if (isPlainObject$5(v) && isPlainObject$5(s)) {
|
|
9927
|
+
const tt = isPlainObject$5(t) ? t : {};
|
|
9823
9928
|
let out;
|
|
9824
9929
|
for (const key of Object.keys(v)) {
|
|
9825
9930
|
if (!Object.hasOwn(s, key)) continue;
|
|
@@ -9842,7 +9947,7 @@ function witnessNormalize(stored, today, v11) {
|
|
|
9842
9947
|
function containsMask(value) {
|
|
9843
9948
|
if (value === "***") return true;
|
|
9844
9949
|
if (Array.isArray(value)) return value.some(containsMask);
|
|
9845
|
-
if (isPlainObject$
|
|
9950
|
+
if (isPlainObject$5(value)) return Object.values(value).some(containsMask);
|
|
9846
9951
|
return false;
|
|
9847
9952
|
}
|
|
9848
9953
|
function jsonEqual(a, b) {
|
|
@@ -9886,7 +9991,7 @@ function noEchoComparison(options) {
|
|
|
9886
9991
|
const out = node.map(walk);
|
|
9887
9992
|
return out.some((item, i) => item !== node[i]) ? out : node;
|
|
9888
9993
|
}
|
|
9889
|
-
if (isPlainObject$
|
|
9994
|
+
if (isPlainObject$5(node)) {
|
|
9890
9995
|
let out;
|
|
9891
9996
|
for (const [key, child] of Object.entries(node)) {
|
|
9892
9997
|
const next = walk(child);
|
|
@@ -11813,6 +11918,14 @@ const inFlightLookups = /* @__PURE__ */ new Map();
|
|
|
11813
11918
|
function getCreateOnlyPropertyPaths(resourceType) {
|
|
11814
11919
|
return lookupCreateOnlyPropertyPaths(resourceType, false);
|
|
11815
11920
|
}
|
|
11921
|
+
function cachedCreateOnlyPropertyPaths(resourceType) {
|
|
11922
|
+
if (hasNoRegistrySchema(resourceType)) return Promise.resolve([]);
|
|
11923
|
+
if (inFlightLookups.has(resourceType)) return void 0;
|
|
11924
|
+
const cached = createOnlyPropertiesCache.get(resourceType);
|
|
11925
|
+
if (cached !== void 0) return cached;
|
|
11926
|
+
const snapshot = CREATE_ONLY_PATHS_SNAPSHOT.get(resourceType);
|
|
11927
|
+
return snapshot === void 0 ? void 0 : Promise.resolve(snapshot);
|
|
11928
|
+
}
|
|
11816
11929
|
function prefetchCreateOnlyPropertyPaths(resourceTypes) {
|
|
11817
11930
|
const started = [];
|
|
11818
11931
|
for (const type of new Set(resourceTypes)) {
|
|
@@ -12765,7 +12878,7 @@ function probeFoundSameId(resourceType, a, b) {
|
|
|
12765
12878
|
//#region src/provisioning/config-shape.ts
|
|
12766
12879
|
function readConfigString(container, key, fallback, containerPath, options) {
|
|
12767
12880
|
if (container === void 0 || container === null) return fallback;
|
|
12768
|
-
if (!isPlainObject$
|
|
12881
|
+
if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) {
|
|
12769
12882
|
const detail = malformedShapeDetail(container);
|
|
12770
12883
|
if (options?.onUnusable) {
|
|
12771
12884
|
const named = fallback === "" ? "" : ` (${fallback})`;
|
|
@@ -12805,7 +12918,7 @@ function requireConfigArray(value, path, options) {
|
|
|
12805
12918
|
return value;
|
|
12806
12919
|
}
|
|
12807
12920
|
function requireConfigObject(value, path, options) {
|
|
12808
|
-
if (!isPlainObject$
|
|
12921
|
+
if (!isPlainObject$4(value) || isUnresolvedIntrinsicContainer(value)) {
|
|
12809
12922
|
const detail = malformedShapeDetail(value);
|
|
12810
12923
|
if (options?.onUnusable) {
|
|
12811
12924
|
options.onUnusable(`${path} must be an object ${detail}. Leaving this configuration unapplied here; the same value is REFUSED on a template-path create.`);
|
|
@@ -12817,7 +12930,7 @@ function requireConfigObject(value, path, options) {
|
|
|
12817
12930
|
}
|
|
12818
12931
|
function configStringRefusal(container, key, fallback, containerPath, options) {
|
|
12819
12932
|
if (container === void 0 || container === null) return void 0;
|
|
12820
|
-
if (!isPlainObject$
|
|
12933
|
+
if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
12821
12934
|
return configValueRefusal(container[key], fallback, `${containerPath}.${key}`, options);
|
|
12822
12935
|
}
|
|
12823
12936
|
function coerceCfnBoolean(value) {
|
|
@@ -12830,7 +12943,7 @@ function coerceCfnBoolean(value) {
|
|
|
12830
12943
|
}
|
|
12831
12944
|
function configBooleanRefusal(container, key, containerPath) {
|
|
12832
12945
|
if (container === void 0 || container === null) return void 0;
|
|
12833
|
-
if (!isPlainObject$
|
|
12946
|
+
if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
12834
12947
|
const value = container[key];
|
|
12835
12948
|
if (value === void 0) return void 0;
|
|
12836
12949
|
if (coerceCfnBoolean(value) !== void 0) return void 0;
|
|
@@ -12844,7 +12957,7 @@ function coerceCfnInteger(value) {
|
|
|
12844
12957
|
}
|
|
12845
12958
|
function configIntegerRefusal(container, key, containerPath, min, max) {
|
|
12846
12959
|
if (container === void 0 || container === null) return void 0;
|
|
12847
|
-
if (!isPlainObject$
|
|
12960
|
+
if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
|
|
12848
12961
|
const value = container[key];
|
|
12849
12962
|
if (value === void 0) return void 0;
|
|
12850
12963
|
const n = coerceCfnInteger(value);
|
|
@@ -12858,10 +12971,10 @@ function configValueRefusal(value, fallback, path, options) {
|
|
|
12858
12971
|
if (typeof value !== "string" || value.trim() === "") return `${path} must be a non-empty string ${malformedShapeDetail(value)}`;
|
|
12859
12972
|
}
|
|
12860
12973
|
function malformedShapeDetail(value) {
|
|
12861
|
-
if (isPlainObject$
|
|
12974
|
+
if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
|
|
12862
12975
|
return `(got ${describe(value)}) — check for an unresolved intrinsic or a mis-nested template value`;
|
|
12863
12976
|
}
|
|
12864
|
-
function isPlainObject$
|
|
12977
|
+
function isPlainObject$4(value) {
|
|
12865
12978
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12866
12979
|
}
|
|
12867
12980
|
const NAMEABLE_INTRINSIC_KEYS = /* @__PURE__ */ new Set([
|
|
@@ -12888,7 +13001,7 @@ function describe(value) {
|
|
|
12888
13001
|
if (value === null) return "null";
|
|
12889
13002
|
if (Array.isArray(value)) return "an array";
|
|
12890
13003
|
if (typeof value === "string") return value.trim() === "" ? "a blank string" : "a string";
|
|
12891
|
-
if (isPlainObject$
|
|
13004
|
+
if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) {
|
|
12892
13005
|
const key = Object.keys(value)[0];
|
|
12893
13006
|
return NAMEABLE_INTRINSIC_KEYS.has(key) ? `an unresolved ${key} intrinsic` : "an unresolved intrinsic";
|
|
12894
13007
|
}
|
|
@@ -17778,7 +17891,7 @@ function maskedPropertyFingerprint(templateValue) {
|
|
|
17778
17891
|
return `${FINGERPRINT_PREFIX}${digest}`;
|
|
17779
17892
|
}
|
|
17780
17893
|
var UnknownInput = class extends Error {};
|
|
17781
|
-
function isPlainObject$
|
|
17894
|
+
function isPlainObject$3(value) {
|
|
17782
17895
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
17783
17896
|
}
|
|
17784
17897
|
const DYNAMIC_REFERENCE_OPEN = "{{resolve:";
|
|
@@ -17798,7 +17911,7 @@ function carriesSecretValue(value, corpora) {
|
|
|
17798
17911
|
return false;
|
|
17799
17912
|
}
|
|
17800
17913
|
function parameterInputsFor(args) {
|
|
17801
|
-
const declared = isPlainObject$
|
|
17914
|
+
const declared = isPlainObject$3(args.template.Parameters) ? args.template.Parameters : {};
|
|
17802
17915
|
const values = args.values ?? {};
|
|
17803
17916
|
const inputs = /* @__PURE__ */ new Map();
|
|
17804
17917
|
const bound = {};
|
|
@@ -17809,7 +17922,7 @@ function parameterInputsFor(args) {
|
|
|
17809
17922
|
continue;
|
|
17810
17923
|
}
|
|
17811
17924
|
const value = values[name];
|
|
17812
|
-
let secret = isPlainObject$
|
|
17925
|
+
let secret = isPlainObject$3(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
|
|
17813
17926
|
if (!secret && args.nestedChild === true && args.supplied !== void 0) {
|
|
17814
17927
|
if (Object.hasOwn(args.supplied, name)) {
|
|
17815
17928
|
const passed = args.passedClasses?.get(name);
|
|
@@ -17860,7 +17973,7 @@ function intrinsicKey(value) {
|
|
|
17860
17973
|
const OPAQUE_ATTRIBUTE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", NESTED_STACK_TYPE$4]);
|
|
17861
17974
|
function hasOpaqueAttributes(logicalId, walk) {
|
|
17862
17975
|
const definition = walk.resources[logicalId];
|
|
17863
|
-
const type = isPlainObject$
|
|
17976
|
+
const type = isPlainObject$3(definition) ? definition["Type"] : void 0;
|
|
17864
17977
|
return typeof type === "string" && (type.startsWith("Custom::") || OPAQUE_ATTRIBUTE_TYPES.has(type));
|
|
17865
17978
|
}
|
|
17866
17979
|
function getAttTarget(operand) {
|
|
@@ -17885,7 +17998,7 @@ function taintOf(logicalId, walk) {
|
|
|
17885
17998
|
const visit = (value) => {
|
|
17886
17999
|
if (typeof value === "string") return value.includes(DYNAMIC_REFERENCE_OPEN);
|
|
17887
18000
|
if (Array.isArray(value)) return value.some(visit);
|
|
17888
|
-
if (!isPlainObject$
|
|
18001
|
+
if (!isPlainObject$3(value)) return false;
|
|
17889
18002
|
const key = intrinsicKey(value);
|
|
17890
18003
|
const operand = key === void 0 ? void 0 : value[key];
|
|
17891
18004
|
let verdict = "clean";
|
|
@@ -17897,7 +18010,7 @@ function taintOf(logicalId, walk) {
|
|
|
17897
18010
|
else if (key === "Fn::FindInMap" && mapReadClass(operand, walk.sources.template) !== "clean") verdict = "tainted";
|
|
17898
18011
|
else if (key === "Fn::Sub") {
|
|
17899
18012
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
17900
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
18013
|
+
const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
|
|
17901
18014
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
17902
18015
|
if (Object.hasOwn(vars, name)) continue;
|
|
17903
18016
|
const owner = name.includes(".") ? name.split(".")[0] : name;
|
|
@@ -17911,7 +18024,7 @@ function taintOf(logicalId, walk) {
|
|
|
17911
18024
|
return Object.values(value).some(visit);
|
|
17912
18025
|
};
|
|
17913
18026
|
const definition = walk.resources[logicalId];
|
|
17914
|
-
const result = visit(isPlainObject$
|
|
18027
|
+
const result = visit(isPlainObject$3(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
|
|
17915
18028
|
walk.inProgress.delete(logicalId);
|
|
17916
18029
|
walk.taint.set(logicalId, result);
|
|
17917
18030
|
return result;
|
|
@@ -17927,7 +18040,7 @@ function conditionInput(name, walk) {
|
|
|
17927
18040
|
return typeof verdict === "boolean" ? verdict : "unknown";
|
|
17928
18041
|
}
|
|
17929
18042
|
function conditionClosure(name, walk) {
|
|
17930
|
-
const definitions = isPlainObject$
|
|
18043
|
+
const definitions = isPlainObject$3(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
|
|
17931
18044
|
let secret = false;
|
|
17932
18045
|
let unknown = false;
|
|
17933
18046
|
let unread = false;
|
|
@@ -17942,7 +18055,7 @@ function conditionClosure(name, walk) {
|
|
|
17942
18055
|
value.forEach(visit);
|
|
17943
18056
|
return;
|
|
17944
18057
|
}
|
|
17945
|
-
if (!isPlainObject$
|
|
18058
|
+
if (!isPlainObject$3(value)) return;
|
|
17946
18059
|
const keys = Object.keys(value);
|
|
17947
18060
|
if (keys.length === 1 && keys[0] === "Condition" && typeof value["Condition"] === "string") {
|
|
17948
18061
|
pending.push(value["Condition"]);
|
|
@@ -17975,7 +18088,7 @@ function conditionClosure(name, walk) {
|
|
|
17975
18088
|
if (key === "Fn::Sub") {
|
|
17976
18089
|
const operand = value["Fn::Sub"];
|
|
17977
18090
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
17978
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
18091
|
+
const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
|
|
17979
18092
|
if (typeof text === "string") for (const name of subPlaceholders(text)) {
|
|
17980
18093
|
if (Object.hasOwn(vars, name)) continue;
|
|
17981
18094
|
if (name.includes(".") && !name.startsWith("AWS::")) secret = true;
|
|
@@ -18004,8 +18117,8 @@ function mapReadClass(operand, template) {
|
|
|
18004
18117
|
const mapName = Array.isArray(operand) ? operand[0] : void 0;
|
|
18005
18118
|
if (typeof mapName !== "string") return "unknown";
|
|
18006
18119
|
const mappings = template.Mappings;
|
|
18007
|
-
const map = isPlainObject$
|
|
18008
|
-
if (!isPlainObject$
|
|
18120
|
+
const map = isPlainObject$3(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
|
|
18121
|
+
if (!isPlainObject$3(map)) return "unknown";
|
|
18009
18122
|
return carriesSecretValue(map, []) ? "secret" : "clean";
|
|
18010
18123
|
}
|
|
18011
18124
|
async function resolvedInput(node, walk) {
|
|
@@ -18073,7 +18186,7 @@ async function inputForm(value, walk) {
|
|
|
18073
18186
|
concrete: parts.every((p) => p.concrete)
|
|
18074
18187
|
};
|
|
18075
18188
|
}
|
|
18076
|
-
if (!isPlainObject$
|
|
18189
|
+
if (!isPlainObject$3(value)) return {
|
|
18077
18190
|
form: value,
|
|
18078
18191
|
concrete: true
|
|
18079
18192
|
};
|
|
@@ -18136,7 +18249,7 @@ async function inputForm(value, walk) {
|
|
|
18136
18249
|
concrete: false
|
|
18137
18250
|
};
|
|
18138
18251
|
}
|
|
18139
|
-
const explicit = Array.isArray(operand) && isPlainObject$
|
|
18252
|
+
const explicit = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
|
|
18140
18253
|
const vars = await inputForm(explicit, walk);
|
|
18141
18254
|
const placeholders = [];
|
|
18142
18255
|
let concrete = vars.concrete && !text.includes(DYNAMIC_REFERENCE_OPEN);
|
|
@@ -18189,8 +18302,8 @@ function newWalk(sources, nested = {
|
|
|
18189
18302
|
}) {
|
|
18190
18303
|
return {
|
|
18191
18304
|
sources,
|
|
18192
|
-
resources: isPlainObject$
|
|
18193
|
-
parameters: isPlainObject$
|
|
18305
|
+
resources: isPlainObject$3(sources.template.Resources) ? sources.template.Resources : {},
|
|
18306
|
+
parameters: isPlainObject$3(sources.template.Parameters) ? sources.template.Parameters : {},
|
|
18194
18307
|
taint: /* @__PURE__ */ new Map(),
|
|
18195
18308
|
inProgress: /* @__PURE__ */ new Set(),
|
|
18196
18309
|
stackChain: nested.stackChain,
|
|
@@ -18214,34 +18327,34 @@ function passedKey(passed) {
|
|
|
18214
18327
|
function isNestedStackRow(logicalId, walk) {
|
|
18215
18328
|
if (!Object.hasOwn(walk.resources, logicalId)) return false;
|
|
18216
18329
|
const definition = walk.resources[logicalId];
|
|
18217
|
-
return isPlainObject$
|
|
18330
|
+
return isPlainObject$3(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
|
|
18218
18331
|
}
|
|
18219
18332
|
function getAttAttribute(operand, target) {
|
|
18220
18333
|
if (Array.isArray(operand)) return operand.length === 2 && typeof operand[1] === "string" ? operand[1] : void 0;
|
|
18221
18334
|
return typeof operand === "string" ? operand.slice(target.length + 1) : void 0;
|
|
18222
18335
|
}
|
|
18223
18336
|
function rowParameters(definition) {
|
|
18224
|
-
const properties = isPlainObject$
|
|
18337
|
+
const properties = isPlainObject$3(definition) ? definition["Properties"] : void 0;
|
|
18225
18338
|
if (properties === void 0) return {};
|
|
18226
|
-
if (!isPlainObject$
|
|
18339
|
+
if (!isPlainObject$3(properties)) return "unknown";
|
|
18227
18340
|
const parameters = properties["Parameters"];
|
|
18228
18341
|
if (parameters === void 0) return {};
|
|
18229
|
-
if (!isPlainObject$
|
|
18342
|
+
if (!isPlainObject$3(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
|
|
18230
18343
|
return parameters;
|
|
18231
18344
|
}
|
|
18232
18345
|
function childParameterInputs(template, passed) {
|
|
18233
|
-
const declared = isPlainObject$
|
|
18346
|
+
const declared = isPlainObject$3(template.Parameters) ? template.Parameters : {};
|
|
18234
18347
|
const inputs = /* @__PURE__ */ new Map();
|
|
18235
18348
|
for (const name of Object.keys(declared)) {
|
|
18236
18349
|
const definition = declared[name];
|
|
18237
|
-
if (isPlainObject$
|
|
18350
|
+
if (isPlainObject$3(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
|
|
18238
18351
|
else if (passed.has(name)) {
|
|
18239
18352
|
const passedClass = passed.get(name);
|
|
18240
18353
|
inputs.set(name, passedClass === "clean" ? {
|
|
18241
18354
|
kind: "value",
|
|
18242
18355
|
value: void 0
|
|
18243
18356
|
} : passedClass === "unknown" ? { kind: "unknown" } : { kind: "secret" });
|
|
18244
|
-
} else if (isPlainObject$
|
|
18357
|
+
} else if (isPlainObject$3(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
|
|
18245
18358
|
kind: "value",
|
|
18246
18359
|
value: definition["Default"]
|
|
18247
18360
|
});
|
|
@@ -18258,7 +18371,7 @@ function closureClass(closure) {
|
|
|
18258
18371
|
return closure.unread ? "unread" : "clean";
|
|
18259
18372
|
}
|
|
18260
18373
|
async function childOutputClass(loaded, outputName, passed, chain, shared) {
|
|
18261
|
-
if (loaded === void 0 || !isPlainObject$
|
|
18374
|
+
if (loaded === void 0 || !isPlainObject$3(loaded.template)) return "unknown";
|
|
18262
18375
|
const scopeKey = JSON.stringify([loaded.identity, passedKey(passed)]);
|
|
18263
18376
|
const memoKey = JSON.stringify([scopeKey, outputName]);
|
|
18264
18377
|
const memo = shared.outputs.get(memoKey);
|
|
@@ -18271,8 +18384,8 @@ async function classifyChildOutput(loaded, outputName, passed, chain, shared, sc
|
|
|
18271
18384
|
if (++shared.steps > MAX_NESTED_OUTPUT_STEPS) return "unknown";
|
|
18272
18385
|
if (chain.includes(loaded.identity) || chain.length >= MAX_NESTED_OUTPUT_DEPTH) return "unknown";
|
|
18273
18386
|
const template = loaded.template;
|
|
18274
|
-
const output = (isPlainObject$
|
|
18275
|
-
if (!isPlainObject$
|
|
18387
|
+
const output = (isPlainObject$3(template.Outputs) ? template.Outputs : {})[outputName];
|
|
18388
|
+
if (!isPlainObject$3(output) || !Object.hasOwn(output, "Value")) return "unknown";
|
|
18276
18389
|
const scope = {
|
|
18277
18390
|
walk: newWalk({
|
|
18278
18391
|
template,
|
|
@@ -18344,7 +18457,7 @@ async function expressionClass(value, scope) {
|
|
|
18344
18457
|
return result;
|
|
18345
18458
|
};
|
|
18346
18459
|
if (Array.isArray(value)) return all(value);
|
|
18347
|
-
if (!isPlainObject$
|
|
18460
|
+
if (!isPlainObject$3(value)) return "clean";
|
|
18348
18461
|
const key = intrinsicKey(value);
|
|
18349
18462
|
if (key === void 0) return all(Object.values(value));
|
|
18350
18463
|
const operand = value[key];
|
|
@@ -18359,7 +18472,7 @@ async function expressionClass(value, scope) {
|
|
|
18359
18472
|
case "Fn::Sub": {
|
|
18360
18473
|
const text = Array.isArray(operand) ? operand[0] : operand;
|
|
18361
18474
|
if (typeof text !== "string") return worseOf("unknown", await expressionClass(operand, scope));
|
|
18362
|
-
const vars = Array.isArray(operand) && isPlainObject$
|
|
18475
|
+
const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
|
|
18363
18476
|
let result = text.includes(DYNAMIC_REFERENCE_OPEN) ? "secret" : "clean";
|
|
18364
18477
|
result = worseOf(result, await all(Object.values(vars)));
|
|
18365
18478
|
for (const name of subPlaceholders(text)) {
|
|
@@ -18437,7 +18550,7 @@ async function classifyPassedParameters(parameters, sources) {
|
|
|
18437
18550
|
}
|
|
18438
18551
|
async function classifyPassed(parameters, sources, nested) {
|
|
18439
18552
|
const classes = /* @__PURE__ */ new Map();
|
|
18440
|
-
if (!isPlainObject$
|
|
18553
|
+
if (!isPlainObject$3(parameters)) return classes;
|
|
18441
18554
|
for (const [name, expression] of Object.entries(parameters)) {
|
|
18442
18555
|
let passedClass;
|
|
18443
18556
|
try {
|
|
@@ -18478,7 +18591,7 @@ function possiblyMaskedKeys(resolvedProps, corpora) {
|
|
|
18478
18591
|
const wholeShortLeaf = (value) => {
|
|
18479
18592
|
if (typeof value === "string") return short.includes(value);
|
|
18480
18593
|
if (Array.isArray(value)) return value.some(wholeShortLeaf);
|
|
18481
|
-
if (isPlainObject$
|
|
18594
|
+
if (isPlainObject$3(value)) return Object.values(value).some(wholeShortLeaf);
|
|
18482
18595
|
return false;
|
|
18483
18596
|
};
|
|
18484
18597
|
return Object.keys(resolvedProps).filter((key) => {
|
|
@@ -18509,7 +18622,7 @@ function maskedPropertyFingerprintsOf(record) {
|
|
|
18509
18622
|
const read = /* @__PURE__ */ new Map();
|
|
18510
18623
|
if (record === null || typeof record !== "object") return read;
|
|
18511
18624
|
const field = record.maskedPropertyFingerprints;
|
|
18512
|
-
if (!isPlainObject$
|
|
18625
|
+
if (!isPlainObject$3(field)) return read;
|
|
18513
18626
|
for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
|
|
18514
18627
|
return read;
|
|
18515
18628
|
}
|
|
@@ -18517,7 +18630,7 @@ function maskedPropertyInputFingerprintsOf(record) {
|
|
|
18517
18630
|
const read = /* @__PURE__ */ new Map();
|
|
18518
18631
|
if (record === null || typeof record !== "object") return read;
|
|
18519
18632
|
const field = record.maskedPropertyInputFingerprints;
|
|
18520
|
-
if (!isPlainObject$
|
|
18633
|
+
if (!isPlainObject$3(field)) return read;
|
|
18521
18634
|
const text = maskedPropertyFingerprintsOf(record);
|
|
18522
18635
|
for (const [key, value] of Object.entries(field)) {
|
|
18523
18636
|
if (typeof value !== "string" || !value.startsWith(INPUT_FINGERPRINT_PREFIX)) continue;
|
|
@@ -18564,7 +18677,7 @@ async function movedMaskedProperties(record, templateProps, fingerprinter, onReb
|
|
|
18564
18677
|
function withRebaselinedFingerprints(record, fingerprints) {
|
|
18565
18678
|
const text = maskedPropertyFingerprintsOf(record);
|
|
18566
18679
|
const field = record.maskedPropertyInputFingerprints;
|
|
18567
|
-
const next = isPlainObject$
|
|
18680
|
+
const next = isPlainObject$3(field) ? Object.entries(field) : [];
|
|
18568
18681
|
let changed = false;
|
|
18569
18682
|
for (const [key, value] of Object.entries(fingerprints)) {
|
|
18570
18683
|
if (text.get(key) !== splitInputFingerprint(value).text) continue;
|
|
@@ -18597,10 +18710,10 @@ function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, sec
|
|
|
18597
18710
|
fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
|
|
18598
18711
|
inputs = boundInputFingerprints(fingerprints, inputFingerprints);
|
|
18599
18712
|
} else {
|
|
18600
|
-
if (!isPlainObject$
|
|
18713
|
+
if (!isPlainObject$3(previous)) return scrubbed;
|
|
18601
18714
|
if (corpora.length === 0) return scrubbed;
|
|
18602
18715
|
fingerprints = { ...previous };
|
|
18603
|
-
inputs = isPlainObject$
|
|
18716
|
+
inputs = isPlainObject$3(previousInputs) ? { ...previousInputs } : void 0;
|
|
18604
18717
|
}
|
|
18605
18718
|
if (fingerprints !== void 0 && corpora.length > 0) {
|
|
18606
18719
|
const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
|
|
@@ -19350,6 +19463,14 @@ function classifyReplaySecretRegion(expression, consumerRegion, importedProducer
|
|
|
19350
19463
|
foreignProducerRegions
|
|
19351
19464
|
};
|
|
19352
19465
|
}
|
|
19466
|
+
function classifyRecordedSecretRegion(expression, consumerRegion, importedProducerRegions, recordedRegions) {
|
|
19467
|
+
const recorded = recordedRegions?.get(expression);
|
|
19468
|
+
if (recorded === void 0 || regionLessSecretName(expression) === void 0) return classifyReplaySecretRegion(expression, consumerRegion, importedProducerRegions);
|
|
19469
|
+
return canonicalizeRegion(recorded) === canonicalizeRegion(consumerRegion) ? { kind: "local" } : {
|
|
19470
|
+
kind: "recorded-region",
|
|
19471
|
+
region: recorded
|
|
19472
|
+
};
|
|
19473
|
+
}
|
|
19353
19474
|
|
|
19354
19475
|
//#endregion
|
|
19355
19476
|
//#region src/utils/s3-endpoints.ts
|
|
@@ -19538,6 +19659,335 @@ async function constructAttributeForCoreTypes(resource, attributeName, context,
|
|
|
19538
19659
|
return NOT_CONSTRUCTED;
|
|
19539
19660
|
}
|
|
19540
19661
|
|
|
19662
|
+
//#endregion
|
|
19663
|
+
//#region src/deployment/reference-provenance-record.ts
|
|
19664
|
+
const SSM_VERSION = /^[0-9]{1,10}$/;
|
|
19665
|
+
const SECRETS_MANAGER_VERSION = /^[A-Za-z0-9_+=.@/-]{32,64}$/;
|
|
19666
|
+
function referenceTokensIn(value, into = /* @__PURE__ */ new Set()) {
|
|
19667
|
+
const walk = (v) => {
|
|
19668
|
+
if (typeof v === "string") {
|
|
19669
|
+
if (!v.includes("{{resolve:")) return;
|
|
19670
|
+
for (const token of dynamicReferenceTokens(v)) into.add(token);
|
|
19671
|
+
return;
|
|
19672
|
+
}
|
|
19673
|
+
if (Array.isArray(v)) {
|
|
19674
|
+
for (const item of v) walk(item);
|
|
19675
|
+
return;
|
|
19676
|
+
}
|
|
19677
|
+
if (v !== null && typeof v === "object") for (const item of Object.values(v)) walk(item);
|
|
19678
|
+
};
|
|
19679
|
+
walk(value);
|
|
19680
|
+
return into;
|
|
19681
|
+
}
|
|
19682
|
+
function recordReferenceTokens(record) {
|
|
19683
|
+
const tokens = referenceTokensIn(record.properties);
|
|
19684
|
+
referenceTokensIn(record.attributes, tokens);
|
|
19685
|
+
referenceTokensIn(record.observedProperties, tokens);
|
|
19686
|
+
return tokens;
|
|
19687
|
+
}
|
|
19688
|
+
function versionShapeOf(token) {
|
|
19689
|
+
if (token.startsWith("{{resolve:secretsmanager:")) return SECRETS_MANAGER_VERSION;
|
|
19690
|
+
if (token.startsWith("{{resolve:ssm:") || token.startsWith("{{resolve:ssm-secure:")) return SSM_VERSION;
|
|
19691
|
+
}
|
|
19692
|
+
function isValidReferenceVersion(token, version) {
|
|
19693
|
+
const shape = versionShapeOf(token);
|
|
19694
|
+
return shape !== void 0 && typeof version === "string" && shape.test(version);
|
|
19695
|
+
}
|
|
19696
|
+
function validReferenceRegion(region) {
|
|
19697
|
+
if (typeof region !== "string") return void 0;
|
|
19698
|
+
return canonicalizeRegion(region) === region && isClientSafeRegion(region) ? region : void 0;
|
|
19699
|
+
}
|
|
19700
|
+
function isPlainObject$2(value) {
|
|
19701
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
19702
|
+
}
|
|
19703
|
+
function validateReferenceProvenance(token, raw) {
|
|
19704
|
+
if (!isSingleDynamicReferenceToken(token) || !isPlainObject$2(raw)) return void 0;
|
|
19705
|
+
const versionsRaw = Object.hasOwn(raw, "versions") ? raw["versions"] : void 0;
|
|
19706
|
+
const readRaw = Object.hasOwn(raw, "readVersions") ? raw["readVersions"] : void 0;
|
|
19707
|
+
if (readRaw !== void 0) {
|
|
19708
|
+
if (!Array.isArray(readRaw)) return void 0;
|
|
19709
|
+
const all = Array.isArray(versionsRaw) ? versionsRaw : [];
|
|
19710
|
+
if (!readRaw.every((v) => all.includes(v))) return void 0;
|
|
19711
|
+
}
|
|
19712
|
+
const out = {};
|
|
19713
|
+
const region = validReferenceRegion(Object.hasOwn(raw, "region") ? raw["region"] : void 0);
|
|
19714
|
+
if (region !== void 0) out.region = region;
|
|
19715
|
+
if (Array.isArray(versionsRaw) && versionsRaw.length > 0 && versionsRaw.length <= 8 && versionsRaw.every((v) => isValidReferenceVersion(token, v)) && (readRaw === void 0 || readRaw.every((v) => typeof v === "string"))) {
|
|
19716
|
+
out.versions = [...new Set(versionsRaw)].sort();
|
|
19717
|
+
if (readRaw !== void 0 && readRaw.length > 0) out.readVersions = [...new Set(readRaw)].sort();
|
|
19718
|
+
}
|
|
19719
|
+
return out;
|
|
19720
|
+
}
|
|
19721
|
+
function referenceProvenanceOf(record) {
|
|
19722
|
+
if (!isPlainObject$2(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
19723
|
+
return validatedBag(record["referenceProvenance"]);
|
|
19724
|
+
}
|
|
19725
|
+
function validatedBag(field) {
|
|
19726
|
+
if (!isPlainObject$2(field)) return void 0;
|
|
19727
|
+
const out = Object.create(null);
|
|
19728
|
+
for (const [token, raw] of Object.entries(field)) {
|
|
19729
|
+
const entry = validateReferenceProvenance(token, raw);
|
|
19730
|
+
if (entry !== void 0) out[token] = entry;
|
|
19731
|
+
}
|
|
19732
|
+
return { ...out };
|
|
19733
|
+
}
|
|
19734
|
+
function recordedProvenanceOf(record, token) {
|
|
19735
|
+
if (!isPlainObject$2(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
|
|
19736
|
+
const field = record["referenceProvenance"];
|
|
19737
|
+
if (!isPlainObject$2(field) || !Object.hasOwn(field, token)) return void 0;
|
|
19738
|
+
return validateReferenceProvenance(token, field[token]);
|
|
19739
|
+
}
|
|
19740
|
+
function recordedReferenceRegions(record) {
|
|
19741
|
+
const field = referenceProvenanceOf(record);
|
|
19742
|
+
return field === void 0 ? void 0 : regionsOf(field);
|
|
19743
|
+
}
|
|
19744
|
+
function recordedOutputReferenceRegions(state, outputKey) {
|
|
19745
|
+
const field = outputReferenceProvenanceOf(state, outputKey);
|
|
19746
|
+
return field === void 0 ? void 0 : regionsOf(field);
|
|
19747
|
+
}
|
|
19748
|
+
function regionsOf(field) {
|
|
19749
|
+
let out;
|
|
19750
|
+
for (const [token, entry] of Object.entries(field)) {
|
|
19751
|
+
if (entry.region === void 0) continue;
|
|
19752
|
+
(out ??= /* @__PURE__ */ new Map()).set(token, entry.region);
|
|
19753
|
+
}
|
|
19754
|
+
return out;
|
|
19755
|
+
}
|
|
19756
|
+
function keepHeldTokenProvenance(record) {
|
|
19757
|
+
if (!hasReferenceProvenanceField(record)) return record;
|
|
19758
|
+
const field = record.referenceProvenance;
|
|
19759
|
+
if (!isPlainObject$2(field)) return record;
|
|
19760
|
+
const held = recordReferenceTokens(record);
|
|
19761
|
+
const keys = Object.keys(field);
|
|
19762
|
+
if (keys.every((token) => held.has(token))) return record;
|
|
19763
|
+
const kept = {};
|
|
19764
|
+
for (const token of keys) if (held.has(token)) kept[token] = field[token];
|
|
19765
|
+
return {
|
|
19766
|
+
...record,
|
|
19767
|
+
referenceProvenance: kept
|
|
19768
|
+
};
|
|
19769
|
+
}
|
|
19770
|
+
function hasReferenceProvenanceField(record) {
|
|
19771
|
+
return isPlainObject$2(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
|
|
19772
|
+
}
|
|
19773
|
+
function outputReferenceProvenanceOf(state, outputKey) {
|
|
19774
|
+
if (!isPlainObject$2(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
|
|
19775
|
+
const field = state["outputReferenceProvenance"];
|
|
19776
|
+
if (!isPlainObject$2(field) || !Object.hasOwn(field, outputKey)) return void 0;
|
|
19777
|
+
return validatedBag(field[outputKey]);
|
|
19778
|
+
}
|
|
19779
|
+
function persistable(token, entry) {
|
|
19780
|
+
return (entry === void 0 ? void 0 : validateReferenceProvenance(token, entry)) ?? {};
|
|
19781
|
+
}
|
|
19782
|
+
function tokensUnderPaths(properties, paths) {
|
|
19783
|
+
const out = /* @__PURE__ */ new Set();
|
|
19784
|
+
const descend = (value, path, at) => {
|
|
19785
|
+
if (at === path.length) {
|
|
19786
|
+
referenceTokensIn(value, out);
|
|
19787
|
+
return;
|
|
19788
|
+
}
|
|
19789
|
+
if (Array.isArray(value)) {
|
|
19790
|
+
const next = path[at] === "*" ? at + 1 : at;
|
|
19791
|
+
for (const item of value) descend(item, path, next);
|
|
19792
|
+
return;
|
|
19793
|
+
}
|
|
19794
|
+
if (isPlainObject$2(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
|
|
19795
|
+
};
|
|
19796
|
+
for (const path of paths) descend(properties, path, 0);
|
|
19797
|
+
return out;
|
|
19798
|
+
}
|
|
19799
|
+
function provenanceForWrittenRecord(args) {
|
|
19800
|
+
const { record, secrets, previous, inPlace } = args;
|
|
19801
|
+
const previousField = inPlace === void 0 ? void 0 : referenceProvenanceOf(previous);
|
|
19802
|
+
if (!hasPassProvenance(secrets) && previousField === void 0 && args.walkWithoutPassProvenance !== true) return;
|
|
19803
|
+
const tokens = recordReferenceTokens(record);
|
|
19804
|
+
if (tokens.size === 0) return void 0;
|
|
19805
|
+
let kept;
|
|
19806
|
+
if (inPlace !== void 0) {
|
|
19807
|
+
kept = inPlace.createOnly === "all" ? tokens : tokensUnderPaths(record.properties, inPlace.createOnly);
|
|
19808
|
+
if (inPlace.attributesCarried) referenceTokensIn(record.attributes, kept);
|
|
19809
|
+
}
|
|
19810
|
+
const out = {};
|
|
19811
|
+
for (const token of [...tokens].sort()) {
|
|
19812
|
+
const pass = passProvenanceFor(secrets, token);
|
|
19813
|
+
if (kept === void 0 || !kept.has(token)) {
|
|
19814
|
+
out[token] = persistable(token, pass);
|
|
19815
|
+
continue;
|
|
19816
|
+
}
|
|
19817
|
+
const before = previousField !== void 0 && Object.hasOwn(previousField, token) ? previousField[token] : void 0;
|
|
19818
|
+
if (pass === void 0) {
|
|
19819
|
+
out[token] = before === void 0 ? {} : { ...before };
|
|
19820
|
+
continue;
|
|
19821
|
+
}
|
|
19822
|
+
out[token] = persistable(token, unionWithPrevious(pass, before));
|
|
19823
|
+
}
|
|
19824
|
+
return out;
|
|
19825
|
+
}
|
|
19826
|
+
function unionWithPrevious(pass, before) {
|
|
19827
|
+
const out = {};
|
|
19828
|
+
if (pass.region !== void 0 && (before?.region === void 0 || before.region === pass.region)) out.region = pass.region;
|
|
19829
|
+
if (pass.versions !== void 0 && before?.versions !== void 0) {
|
|
19830
|
+
out.versions = [.../* @__PURE__ */ new Set([...before.versions, ...pass.versions])].sort();
|
|
19831
|
+
if (pass.readVersions !== void 0) out.readVersions = [...pass.readVersions];
|
|
19832
|
+
}
|
|
19833
|
+
return out;
|
|
19834
|
+
}
|
|
19835
|
+
function outputProvenanceForPersist(args) {
|
|
19836
|
+
const { outputs, resolvedThisRun, carriedFrom, sinkOf } = args;
|
|
19837
|
+
if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$2(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
|
|
19838
|
+
let out;
|
|
19839
|
+
for (const [outputKey, value] of Object.entries(outputs)) {
|
|
19840
|
+
const sink = sinkOf(outputKey);
|
|
19841
|
+
if (!hasPassProvenance(sink)) continue;
|
|
19842
|
+
const tokens = referenceTokensIn(value);
|
|
19843
|
+
if (tokens.size === 0) continue;
|
|
19844
|
+
const entries = {};
|
|
19845
|
+
for (const token of [...tokens].sort()) entries[token] = persistable(token, passProvenanceFor(sink, token));
|
|
19846
|
+
out ??= Object.create(null);
|
|
19847
|
+
out[outputKey] = entries;
|
|
19848
|
+
}
|
|
19849
|
+
return out === void 0 ? void 0 : { ...out };
|
|
19850
|
+
}
|
|
19851
|
+
const KEEP_REFERENCE_PROVENANCE = Symbol("keep reference provenance");
|
|
19852
|
+
function withReferenceProvenance(record, field) {
|
|
19853
|
+
if (field === KEEP_REFERENCE_PROVENANCE) return record;
|
|
19854
|
+
if (field === void 0 && !Object.hasOwn(record, "referenceProvenance")) return record;
|
|
19855
|
+
const { referenceProvenance: _previous, ...rest } = record;
|
|
19856
|
+
return field === void 0 ? rest : {
|
|
19857
|
+
...rest,
|
|
19858
|
+
referenceProvenance: field
|
|
19859
|
+
};
|
|
19860
|
+
}
|
|
19861
|
+
|
|
19862
|
+
//#endregion
|
|
19863
|
+
//#region src/deployment/intrinsic-resolver/recorded-reference-routes.ts
|
|
19864
|
+
function tokensOf(value) {
|
|
19865
|
+
const out = /* @__PURE__ */ new Set();
|
|
19866
|
+
for (const leaf of wholeStringLeavesOf(value)) for (const token of dynamicReferenceTokens(leaf)) out.add(token);
|
|
19867
|
+
return [...out];
|
|
19868
|
+
}
|
|
19869
|
+
function recordedTokenRoutes(value, record) {
|
|
19870
|
+
if (!hasReferenceProvenanceField(record)) return void 0;
|
|
19871
|
+
const routes = /* @__PURE__ */ new Map();
|
|
19872
|
+
let recorded = false;
|
|
19873
|
+
for (const token of tokensOf(value)) {
|
|
19874
|
+
const entry = recordedProvenanceOf(record, token);
|
|
19875
|
+
const region = entry?.region;
|
|
19876
|
+
const pin = entry?.versions?.length === 1 ? entry.versions[0] : void 0;
|
|
19877
|
+
if (region !== void 0 || pin !== void 0) recorded = true;
|
|
19878
|
+
routes.set(token, {
|
|
19879
|
+
region,
|
|
19880
|
+
pin
|
|
19881
|
+
});
|
|
19882
|
+
}
|
|
19883
|
+
return recorded ? routes : void 0;
|
|
19884
|
+
}
|
|
19885
|
+
async function reresolveByRecordedRoutes(resolver, value, logicalId, context, origin, sourceKey, routes, defaults) {
|
|
19886
|
+
const tokens = [...routes.keys()];
|
|
19887
|
+
const regionOf = (token) => routes.get(token)?.region ?? defaults.region;
|
|
19888
|
+
const unrouted = tokens.filter((token) => routes.get(token)?.region === void 0);
|
|
19889
|
+
if (defaults.proofs !== void 0 && unrouted.length > 0) {
|
|
19890
|
+
if (!defaults.proofs.regionProven(unrouted)) {
|
|
19891
|
+
defaults.proofs.onRegionUnproven();
|
|
19892
|
+
return value;
|
|
19893
|
+
}
|
|
19894
|
+
}
|
|
19895
|
+
const routeOf = (token) => {
|
|
19896
|
+
const region = regionOf(token);
|
|
19897
|
+
return region ? {
|
|
19898
|
+
resolver: resolver.resolverForProducerRegion(region, context),
|
|
19899
|
+
context: withoutProducerRegions(context)
|
|
19900
|
+
} : {
|
|
19901
|
+
resolver,
|
|
19902
|
+
context
|
|
19903
|
+
};
|
|
19904
|
+
};
|
|
19905
|
+
const pins = /* @__PURE__ */ new Map();
|
|
19906
|
+
for (const token of tokens) {
|
|
19907
|
+
const pin = routes.get(token)?.pin;
|
|
19908
|
+
if (pin === void 0) continue;
|
|
19909
|
+
const read = await readsPinnedVersion(token, pin, routeOf(token));
|
|
19910
|
+
if (read === "read") pins.set(token, pin);
|
|
19911
|
+
else if (read === "failed" && context.provenanceCapture !== true) resolver.logger.warn(safeMsg`Could not read the secret version ${resolver.displayMasked(logicalId, context)} was deployed with for ${resolver.displayMasked(origin, context)} (it may have been deprecated or deleted); ${defaults.proofs === void 0 ? "serving its current value instead" : "checking its current value against the physical id instead"}.`);
|
|
19912
|
+
if (read === "short" && defaults.proofs === void 0 && context.provenanceCapture !== true) resolver.logger.warn(safeMsg`Not serving ${resolver.displayMasked(origin, context)} at the secret version ${resolver.displayMasked(logicalId, context)} was deployed with: that value is shorter than four characters, so cdkd could not keep it out of state; serving its current value instead.`);
|
|
19913
|
+
}
|
|
19914
|
+
if (defaults.proofs !== void 0) {
|
|
19915
|
+
const unpinned = tokens.filter((token) => !pins.has(token));
|
|
19916
|
+
if (unpinned.length > 0 && !await defaults.proofs.generationProven(unpinned, routeOf)) {
|
|
19917
|
+
defaults.proofs.onGenerationUnproven();
|
|
19918
|
+
return value;
|
|
19919
|
+
}
|
|
19920
|
+
}
|
|
19921
|
+
const walkContext = pins.size > 0 ? {
|
|
19922
|
+
...context,
|
|
19923
|
+
referencePins: pins
|
|
19924
|
+
} : context;
|
|
19925
|
+
const regions = new Set(tokens.map((token) => regionOf(token) ?? ""));
|
|
19926
|
+
if (regions.size <= 1) {
|
|
19927
|
+
const [only] = regions;
|
|
19928
|
+
return await resolver.reresolveCrossStackValue(value, only || void 0, walkContext, origin, sourceKey);
|
|
19929
|
+
}
|
|
19930
|
+
return await rebuildByToken(value, async (token) => String(await resolver.reresolveCrossStackValue(token, regionOf(token), walkContext, origin, void 0)));
|
|
19931
|
+
}
|
|
19932
|
+
const failedPins = /* @__PURE__ */ new WeakMap();
|
|
19933
|
+
async function readsPinnedVersion(token, pin, { resolver, context }) {
|
|
19934
|
+
const key = injectiveKey(token, pin);
|
|
19935
|
+
let failed = failedPins.get(resolver);
|
|
19936
|
+
if (failed?.has(key) === true) return "known";
|
|
19937
|
+
const { abandonedResolutions: _collected, ...throwing } = context;
|
|
19938
|
+
const quiet = {
|
|
19939
|
+
...throwing,
|
|
19940
|
+
provenanceSuppressed: true
|
|
19941
|
+
};
|
|
19942
|
+
try {
|
|
19943
|
+
await resolver.resolveDynamicReferences(token, quiet);
|
|
19944
|
+
} catch (err) {
|
|
19945
|
+
if (isDeliberateResolutionRefusal(err)) throw err;
|
|
19946
|
+
}
|
|
19947
|
+
try {
|
|
19948
|
+
const served = await resolver.resolveDynamicReferences(token, {
|
|
19949
|
+
...quiet,
|
|
19950
|
+
referencePins: /* @__PURE__ */ new Map([[token, pin]])
|
|
19951
|
+
});
|
|
19952
|
+
return !served.includes("{{resolve:") && served.length < 4 ? "short" : "read";
|
|
19953
|
+
} catch (err) {
|
|
19954
|
+
if (isDeliberateResolutionRefusal(err)) throw err;
|
|
19955
|
+
resolver.logger.debug(safeMsg`Pinned read of ${resolver.displayMasked(token, context)} failed: ${resolver.displayMasked(err instanceof Error ? err.message : String(err), context)}`);
|
|
19956
|
+
if (!isThrottlingError(err)) {
|
|
19957
|
+
if (failed === void 0) {
|
|
19958
|
+
failed = /* @__PURE__ */ new Set();
|
|
19959
|
+
failedPins.set(resolver, failed);
|
|
19960
|
+
}
|
|
19961
|
+
failed.add(key);
|
|
19962
|
+
}
|
|
19963
|
+
return "failed";
|
|
19964
|
+
}
|
|
19965
|
+
}
|
|
19966
|
+
async function rebuildByToken(value, resolveToken) {
|
|
19967
|
+
if (typeof value === "string") {
|
|
19968
|
+
let out = "";
|
|
19969
|
+
let cursor = 0;
|
|
19970
|
+
for (const token of dynamicReferenceTokens(value)) {
|
|
19971
|
+
const at = value.indexOf(token, cursor);
|
|
19972
|
+
if (at < 0) throw new Error("Internal invariant: a scanned dynamic reference was not found in the value it was scanned from");
|
|
19973
|
+
out += value.slice(cursor, at) + await resolveToken(token);
|
|
19974
|
+
cursor = at + token.length;
|
|
19975
|
+
}
|
|
19976
|
+
return out + value.slice(cursor);
|
|
19977
|
+
}
|
|
19978
|
+
if (Array.isArray(value)) {
|
|
19979
|
+
const out = new Array(value.length);
|
|
19980
|
+
for (let i = 0; i < value.length; i++) out[i] = await rebuildByToken(value[i], resolveToken);
|
|
19981
|
+
return out;
|
|
19982
|
+
}
|
|
19983
|
+
if (value !== null && typeof value === "object") {
|
|
19984
|
+
const out = Object.create(null);
|
|
19985
|
+
for (const [k, v] of Object.entries(value)) out[k] = await rebuildByToken(v, resolveToken);
|
|
19986
|
+
return out;
|
|
19987
|
+
}
|
|
19988
|
+
return value;
|
|
19989
|
+
}
|
|
19990
|
+
|
|
19541
19991
|
//#endregion
|
|
19542
19992
|
//#region src/deployment/intrinsic-resolver/getatt-construct-app.ts
|
|
19543
19993
|
async function constructAttributeForAppTypes(resource, attributeName, context, logicalId, resourceType, physicalId, accountId, partition, region) {
|
|
@@ -19942,7 +20392,14 @@ async function resolveGetAtt(getAtt, context) {
|
|
|
19942
20392
|
structured: isStructured(flatValue),
|
|
19943
20393
|
redacted: isSensitiveAttributeName(attributeName)
|
|
19944
20394
|
})}`);
|
|
19945
|
-
if (reresolvesNestedReference)
|
|
20395
|
+
if (reresolvesNestedReference) {
|
|
20396
|
+
const childRegion = nestedStackChildRegionFromLocalArn(resource.physicalId);
|
|
20397
|
+
const nestedOrigin = `nested stack ${logicalId} ${this.displayLeaf(attributeName, context)}`;
|
|
20398
|
+
const nestedSourceKey = crossStackSourceKey({ "Fn::GetAtt": getAtt });
|
|
20399
|
+
const routes = context.recordedSecretValues === void 0 || carriesSecretMask(flatValue) ? void 0 : recordedTokenRoutes(flatValue, resource);
|
|
20400
|
+
if (routes !== void 0) return await reresolveByRecordedRoutes(this, flatValue, logicalId, context, nestedOrigin, nestedSourceKey, routes, { region: childRegion });
|
|
20401
|
+
return await this.reresolveCrossStackValue(flatValue, childRegion, context, nestedOrigin, nestedSourceKey);
|
|
20402
|
+
}
|
|
19946
20403
|
return await this.reresolveRecordedReferences(notedFlatValue, logicalId, context, `${logicalId}.${this.displayLeaf(attributeName, context)}`, crossStackSourceKey({ "Fn::GetAtt": getAtt }));
|
|
19947
20404
|
}
|
|
19948
20405
|
if (attributeName.includes(".")) {
|
|
@@ -20026,6 +20483,17 @@ function recordProducerSecretPairs(logicalId, value, context) {
|
|
|
20026
20483
|
if (bag === void 0 || context.producerSecrets === void 0) return;
|
|
20027
20484
|
const producer = context.producerSecrets(logicalId);
|
|
20028
20485
|
if (producer === void 0 || producer === bag || producer.size === 0) return;
|
|
20486
|
+
if (hasPassProvenance(producer)) {
|
|
20487
|
+
const served = [...wholeStringLeavesOf(value)];
|
|
20488
|
+
for (const [plaintext, expression] of producer) {
|
|
20489
|
+
if (plaintext.length < 4 || !expression.startsWith("{{resolve:")) continue;
|
|
20490
|
+
if (!served.some((leaf) => leaf.includes(plaintext))) continue;
|
|
20491
|
+
const entry = passProvenanceFor(producer, expression);
|
|
20492
|
+
if (entry === void 0) continue;
|
|
20493
|
+
recordReferenceProvenanceEntry(bag, expression, entry, "read");
|
|
20494
|
+
if (context.provenanceSink !== void 0) recordReferenceProvenanceEntry(context.provenanceSink, expression, entry, "read");
|
|
20495
|
+
}
|
|
20496
|
+
}
|
|
20029
20497
|
const preRun = context.producerPreRunPhysicalId?.(logicalId);
|
|
20030
20498
|
const record = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
|
|
20031
20499
|
if (typeof preRun !== "string" || record?.physicalId !== preRun) return;
|
|
@@ -20053,21 +20521,38 @@ function recordSecretNamedRead(logicalId, value, context) {
|
|
|
20053
20521
|
async function reresolveRecordedReferences(value, logicalId, context, origin, sourceKey) {
|
|
20054
20522
|
if (!carriesDynamicReference(value) || carriesSecretMask(value)) return value;
|
|
20055
20523
|
if (context.recordedSecretValues === void 0) return value;
|
|
20524
|
+
const notReresolvingLine = () => this.logger.debug(safeMsg`Not re-resolving the reference(s) in ${this.displayMasked(origin, context)}: the template of ${this.displayMasked(logicalId, context)} does not spell them, and this stack may read a stack in another region, so the region that resolved them is unknown`);
|
|
20525
|
+
const servingAsRecordedLine = () => this.logger.warn(safeMsg`Serving ${this.displayMasked(origin, context)} as recorded, with its {{resolve:...}} reference(s) unresolved: cdkd cannot confirm the secret still holds the value ${this.displayMasked(logicalId, context)} was deployed with, because its physical id does not contain it. Either the secret changed since then (update ${this.displayMasked(logicalId, context)} so cdkd deploys it with the new value), or the value is not part of its name (a custom resource's Data, a name shorter than four characters), and cdkd sends the recorded reference as before.`);
|
|
20526
|
+
const record = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
|
|
20527
|
+
const routes = recordedTokenRoutes(value, record);
|
|
20528
|
+
if (routes !== void 0) return await reresolveByRecordedRoutes(this, value, logicalId, context, origin, sourceKey, routes, {
|
|
20529
|
+
region: void 0,
|
|
20530
|
+
proofs: {
|
|
20531
|
+
regionProven: (tokens) => referencesProvenLocal(tokens, logicalId, context) || referencesRegionProven(tokens, context, this.resolverRegion),
|
|
20532
|
+
onRegionUnproven: notReresolvingLine,
|
|
20533
|
+
generationProven: (tokens, routeOf) => this.referencesMatchPhysicalId(tokens, logicalId, context, routeOf),
|
|
20534
|
+
onGenerationUnproven: () => {
|
|
20535
|
+
if (context.provenanceCapture !== true) servingAsRecordedLine();
|
|
20536
|
+
}
|
|
20537
|
+
}
|
|
20538
|
+
});
|
|
20056
20539
|
if (!referencesProvenLocal(value, logicalId, context) && !referencesRegionProven(value, context, this.resolverRegion)) {
|
|
20057
|
-
|
|
20540
|
+
notReresolvingLine();
|
|
20058
20541
|
return value;
|
|
20059
20542
|
}
|
|
20060
20543
|
if (!await this.referencesMatchPhysicalId(value, logicalId, context)) {
|
|
20061
|
-
|
|
20544
|
+
if (context.provenanceCapture) return value;
|
|
20545
|
+
servingAsRecordedLine();
|
|
20062
20546
|
return value;
|
|
20063
20547
|
}
|
|
20064
20548
|
return await this.reresolveCrossStackValue(value, void 0, context, origin, sourceKey);
|
|
20065
20549
|
}
|
|
20066
|
-
async function referencesMatchPhysicalId(value, logicalId, context) {
|
|
20550
|
+
async function referencesMatchPhysicalId(value, logicalId, context, routeOf) {
|
|
20067
20551
|
const record = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
|
|
20068
20552
|
const physicalId = typeof record?.physicalId === "string" ? record.physicalId.toLowerCase() : "";
|
|
20069
20553
|
for (const leaf of wholeStringLeavesOf(value)) for (const token of dynamicReferenceTokens(leaf)) {
|
|
20070
|
-
const
|
|
20554
|
+
const route = routeOf?.(token);
|
|
20555
|
+
const plaintext = route === void 0 ? await this.resolveDynamicReferences(token, context) : await route.resolver.resolveDynamicReferences(token, route.context);
|
|
20071
20556
|
if (plaintext.includes("{{resolve:")) continue;
|
|
20072
20557
|
if (plaintext.length < 4) return false;
|
|
20073
20558
|
if (!physicalId.includes(plaintext.toLowerCase())) return false;
|
|
@@ -20345,7 +20830,10 @@ async function reresolveCrossStackValue(value, producerRegion, context, origin,
|
|
|
20345
20830
|
}
|
|
20346
20831
|
if (!carriesDynamicReference(value)) return value;
|
|
20347
20832
|
const resolver = this.resolverForProducerRegion(producerRegion, context, producerRegionLogText);
|
|
20348
|
-
const pinnedContext =
|
|
20833
|
+
const pinnedContext = {
|
|
20834
|
+
...producerRegion ? withoutProducerRegions(context) : context,
|
|
20835
|
+
provenanceRoute: "read"
|
|
20836
|
+
};
|
|
20349
20837
|
const walk = async (v) => {
|
|
20350
20838
|
if (typeof v === "string") return v.includes("{{resolve:") ? await resolver.resolveDynamicReferences(v, pinnedContext) : v;
|
|
20351
20839
|
if (Array.isArray(v)) {
|
|
@@ -21147,6 +21635,16 @@ async function getCrossAccountStackState(roleArn, stackName, region, context) {
|
|
|
21147
21635
|
function secretVerdictScope(resolver) {
|
|
21148
21636
|
return injectiveKey(credentialFingerprint(ambientCredentialConfig()), canonicalizeRegion(resolver.explicitRegion) ?? "");
|
|
21149
21637
|
}
|
|
21638
|
+
function recordProvenanceOfResolution(resolver, context, token, version) {
|
|
21639
|
+
if (context === void 0 || context.provenanceSuppressed === true) return;
|
|
21640
|
+
const resolution = {
|
|
21641
|
+
region: canonicalizeRegion(resolver.explicitRegion),
|
|
21642
|
+
version,
|
|
21643
|
+
route: context.provenanceRoute ?? "literal"
|
|
21644
|
+
};
|
|
21645
|
+
if (context.recordedSecretValues !== void 0) recordReferenceResolution(context.recordedSecretValues, token, resolution);
|
|
21646
|
+
if (context.provenanceSink !== void 0) recordReferenceResolution(context.provenanceSink, token, resolution);
|
|
21647
|
+
}
|
|
21150
21648
|
async function resolveDynamicReferences(value, context) {
|
|
21151
21649
|
return (await this.resolveDynamicReferencesWithLogTwin(value, value, context, void 0, true)).result;
|
|
21152
21650
|
}
|
|
@@ -21205,15 +21703,23 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
|
|
|
21205
21703
|
if (!foreign.complete || foreign.substitutions.length !== 1) complete = false;
|
|
21206
21704
|
continue;
|
|
21207
21705
|
}
|
|
21208
|
-
const
|
|
21209
|
-
const
|
|
21706
|
+
const pin = context?.referencePins?.get(fullMatch);
|
|
21707
|
+
const credentialKey = credentialFingerprint(ambientCredentialConfig());
|
|
21708
|
+
let dynamicReferenceCacheKey = injectiveKey(credentialKey, fullMatch);
|
|
21709
|
+
let cached = this.cachedDynamicReferences.get(dynamicReferenceCacheKey);
|
|
21710
|
+
const pinnedGeneration = pin !== void 0 && cached?.version !== pin;
|
|
21711
|
+
if (pinnedGeneration) {
|
|
21712
|
+
dynamicReferenceCacheKey = injectiveKey(credentialKey, fullMatch, pin);
|
|
21713
|
+
cached = this.cachedDynamicReferences.get(dynamicReferenceCacheKey);
|
|
21714
|
+
}
|
|
21210
21715
|
if (cached) {
|
|
21211
21716
|
if (cached.secret && cached.value && !persistedText) this.refuseSecretAssembledReference(fullMatch, tokenLogText, context);
|
|
21212
21717
|
const recorded = context?.recordedSecretValues;
|
|
21213
21718
|
if (cached.secret && cached.value && recorded) {
|
|
21214
21719
|
recorded.set(cached.value, fullMatch);
|
|
21215
|
-
recordResolvedPair(recorded, fullMatch, cached.value);
|
|
21720
|
+
if (!pinnedGeneration) recordResolvedPair(recorded, fullMatch, cached.value);
|
|
21216
21721
|
}
|
|
21722
|
+
if (cached.secret && cached.value) recordProvenanceOfResolution(this, context, fullMatch, cached.version);
|
|
21217
21723
|
if (service === "ssm" && !cached.secret && recorded && !this.producerRegionGuest) recordProvenPublicExpression(recorded, fullMatch, cached.value);
|
|
21218
21724
|
result = result.replace(fullMatch, () => cached.value);
|
|
21219
21725
|
twin = twin.replace(fullMatch, () => cached.secret && cached.value ? "***" : cached.value);
|
|
@@ -21229,17 +21735,22 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
|
|
|
21229
21735
|
let isSecret = isKnownSecret;
|
|
21230
21736
|
let cacheable = true;
|
|
21231
21737
|
let pinSecureVerdict = false;
|
|
21232
|
-
|
|
21233
|
-
|
|
21738
|
+
let resolvedVersion;
|
|
21739
|
+
if (service === "secretsmanager") {
|
|
21740
|
+
const versionOut = {};
|
|
21741
|
+
resolved = await this.resolveSecretsManagerReference(inner, context, nameLogText, versionOut, pinnedGeneration ? pin : void 0);
|
|
21742
|
+
resolvedVersion = versionOut.version;
|
|
21743
|
+
} else if (service === "ssm") {
|
|
21234
21744
|
const decrypt = context?.skipDynamicReferences !== true;
|
|
21235
|
-
const param = await this.resolveSSMReference(parts, decrypt, "ssm", context, nameLogText);
|
|
21745
|
+
const param = await this.resolveSSMReference(parts, decrypt, "ssm", context, nameLogText, pinnedGeneration ? pin : void 0);
|
|
21236
21746
|
const proofBag = context?.recordedSecretValues;
|
|
21747
|
+
const writesVerdict = !pinnedGeneration;
|
|
21237
21748
|
if (param.type === "SecureString") {
|
|
21238
21749
|
if (proofBag) contradictProvenPublicExpression(proofBag, fullMatch);
|
|
21239
|
-
if (decrypt) pinSecureVerdict =
|
|
21240
|
-
else if (persistedText || !this.tokenAssembledForRecording(fullMatch, tokenLogText, context)) this.pinSecretVerdict(fullMatch, true, verdictScope);
|
|
21750
|
+
if (decrypt) pinSecureVerdict = writesVerdict;
|
|
21751
|
+
else if (writesVerdict && (persistedText || !this.tokenAssembledForRecording(fullMatch, tokenLogText, context))) this.pinSecretVerdict(fullMatch, true, verdictScope);
|
|
21241
21752
|
} else if (!param.secure) {
|
|
21242
|
-
this.pinSecretVerdict(fullMatch, false, verdictScope);
|
|
21753
|
+
if (writesVerdict) this.pinSecretVerdict(fullMatch, false, verdictScope);
|
|
21243
21754
|
if (proofBag && !this.producerRegionGuest) recordProvenPublicExpression(proofBag, fullMatch, param.value);
|
|
21244
21755
|
} else {
|
|
21245
21756
|
if (proofBag) contradictProvenPublicExpression(proofBag, fullMatch);
|
|
@@ -21253,11 +21764,13 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
|
|
|
21253
21764
|
}
|
|
21254
21765
|
}
|
|
21255
21766
|
resolved = param.value;
|
|
21767
|
+
resolvedVersion = param.version;
|
|
21256
21768
|
} else if (service === "ssm-secure") {
|
|
21257
|
-
const param = await this.resolveSSMReference(parts, true, "ssm-secure", context, nameLogText);
|
|
21769
|
+
const param = await this.resolveSSMReference(parts, true, "ssm-secure", context, nameLogText, pinnedGeneration ? pin : void 0);
|
|
21258
21770
|
if (!param.secure) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to resolve ${this.displayMasked(tokenLogText, context)}: the parameter is a ${param.type} parameter, and the ssm-secure spelling is defined for SecureString parameters only. Reference it as {{resolve:ssm:...}} if it is public configuration.`));
|
|
21259
21771
|
isSecret = true;
|
|
21260
21772
|
resolved = param.value;
|
|
21773
|
+
resolvedVersion = param.version;
|
|
21261
21774
|
} else {
|
|
21262
21775
|
if (!persistedText && this.tokenAssembledFromSecret(fullMatch, tokenLogText, context)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to resolve ${this.displayMasked(tokenLogText, context)}: its service is not one cdkd resolves (secretsmanager, ssm, ssm-secure), and the reference was assembled from a secret value, so leaving it as written would send that value to AWS and record it in state in the clear.`));
|
|
21263
21776
|
this.logger.warn(this.displayMasked(`Unsupported dynamic reference service: ${this.displayMasked(nameLogText(String(service)), context)}`, context));
|
|
@@ -21268,14 +21781,16 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
|
|
|
21268
21781
|
if (pinSecureVerdict) this.pinSecretVerdict(fullMatch, true, verdictScope);
|
|
21269
21782
|
if (cacheable) this.cachedDynamicReferences.set(dynamicReferenceCacheKey, {
|
|
21270
21783
|
value: resolved,
|
|
21271
|
-
secret: isSecret
|
|
21784
|
+
secret: isSecret,
|
|
21785
|
+
...resolvedVersion !== void 0 && { version: resolvedVersion }
|
|
21272
21786
|
});
|
|
21273
21787
|
if (isSecret && resolved) {
|
|
21274
21788
|
const recorded = context?.recordedSecretValues;
|
|
21275
21789
|
if (recorded) {
|
|
21276
21790
|
recorded.set(resolved, fullMatch);
|
|
21277
|
-
recordResolvedPair(recorded, fullMatch, resolved);
|
|
21791
|
+
if (!pinnedGeneration) recordResolvedPair(recorded, fullMatch, resolved);
|
|
21278
21792
|
}
|
|
21793
|
+
recordProvenanceOfResolution(this, context, fullMatch, resolvedVersion);
|
|
21279
21794
|
if (service === "secretsmanager" || service === "ssm-secure") this.pinSecretVerdict(fullMatch, true, verdictScope);
|
|
21280
21795
|
}
|
|
21281
21796
|
result = result.replace(fullMatch, () => resolved);
|
|
@@ -21312,7 +21827,7 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
|
|
|
21312
21827
|
|
|
21313
21828
|
//#endregion
|
|
21314
21829
|
//#region src/deployment/intrinsic-resolver/dynamic-ref-lookups.ts
|
|
21315
|
-
async function resolveSecretsManagerReference(inner, context, nameLogText) {
|
|
21830
|
+
async function resolveSecretsManagerReference(inner, context, nameLogText, versionOut, pinVersion) {
|
|
21316
21831
|
const afterService = inner.substring(15);
|
|
21317
21832
|
let secretId;
|
|
21318
21833
|
let jsonKey = "";
|
|
@@ -21339,7 +21854,10 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
|
|
|
21339
21854
|
versionStage = remainingParts[1] || "";
|
|
21340
21855
|
versionId = remainingParts[2] || "";
|
|
21341
21856
|
} else secretId = afterService;
|
|
21342
|
-
if (
|
|
21857
|
+
if (pinVersion !== void 0) {
|
|
21858
|
+
versionStage = "";
|
|
21859
|
+
versionId = pinVersion;
|
|
21860
|
+
} else if (!versionStage) versionStage = "AWSCURRENT";
|
|
21343
21861
|
if (!secretId) throw markNonRetryable(/* @__PURE__ */ new Error("Dynamic reference: secretsmanager SECRET_ID is required"));
|
|
21344
21862
|
const loggedSecretId = this.displayMasked(nameLogText(secretId), context);
|
|
21345
21863
|
const loggedJsonKey = this.displayMasked(nameLogText(jsonKey), context);
|
|
@@ -21350,11 +21868,13 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
|
|
|
21350
21868
|
...versionStage && versionStage !== "" && { VersionStage: versionStage },
|
|
21351
21869
|
...versionId && versionId !== "" && { VersionId: versionId }
|
|
21352
21870
|
});
|
|
21353
|
-
const
|
|
21871
|
+
const response = await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`, this.namedRequestMasks([
|
|
21354
21872
|
[secretId, loggedSecretId],
|
|
21355
21873
|
[versionStage, this.displayMasked(nameLogText(versionStage), context)],
|
|
21356
21874
|
[versionId, this.displayMasked(nameLogText(versionId), context)]
|
|
21357
|
-
], context))
|
|
21875
|
+
], context));
|
|
21876
|
+
const secretString = response.SecretString;
|
|
21877
|
+
if (versionOut !== void 0 && typeof response.VersionId === "string") versionOut.version = response.VersionId;
|
|
21358
21878
|
if (!secretString) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`));
|
|
21359
21879
|
if (jsonKey) try {
|
|
21360
21880
|
const parsed = JSON.parse(secretString);
|
|
@@ -21379,11 +21899,12 @@ async function sendWithThrottleRetry(operation, label, masks) {
|
|
|
21379
21899
|
throw masks.error(error);
|
|
21380
21900
|
}
|
|
21381
21901
|
}
|
|
21382
|
-
async function resolveSSMReference(parts, decrypt, service, context, nameLogText) {
|
|
21383
|
-
const
|
|
21902
|
+
async function resolveSSMReference(parts, decrypt, service, context, nameLogText, pinVersion) {
|
|
21903
|
+
const namedParameter = parts.slice(1).join(":");
|
|
21904
|
+
const parameterName = pinVersion === void 0 ? namedParameter : `${withoutSsmSelector(namedParameter)}:${pinVersion}`;
|
|
21384
21905
|
if (!parameterName) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: ${service} PARAMETER_NAME is required`));
|
|
21385
|
-
const loggedParameterName = this.displayMasked(nameLogText(
|
|
21386
|
-
this.logger.debug(`Resolving dynamic reference: ${service}:${loggedParameterName}`);
|
|
21906
|
+
const loggedParameterName = this.displayMasked(nameLogText(namedParameter), context);
|
|
21907
|
+
this.logger.debug(`Resolving dynamic reference: ${service}:${loggedParameterName}${pinVersion === void 0 ? "" : ` (version ${pinVersion})`}`);
|
|
21387
21908
|
const client = this.clientsForRegion(this.explicitRegion).ssm;
|
|
21388
21909
|
const command = new GetParameterCommand({
|
|
21389
21910
|
Name: parameterName,
|
|
@@ -21394,17 +21915,25 @@ async function resolveSSMReference(parts, decrypt, service, context, nameLogText
|
|
|
21394
21915
|
if (paramValue === void 0 || paramValue === null) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: SSM parameter ${quotedRender(loggedParameterName, "'")} not found or has no value`));
|
|
21395
21916
|
const paramType = response.Parameter?.Type;
|
|
21396
21917
|
const secure = paramType !== "String" && paramType !== "StringList";
|
|
21397
|
-
if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(
|
|
21398
|
-
this.warnedUnrecognizedSsmTypes.add(injectiveKey(
|
|
21918
|
+
if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(namedParameter, String(paramType)))) {
|
|
21919
|
+
this.warnedUnrecognizedSsmTypes.add(injectiveKey(namedParameter, String(paramType)));
|
|
21399
21920
|
const reported = paramType === void 0 ? "(absent)" : quotedRender(this.displayMasked(String(paramType), context), "'");
|
|
21400
21921
|
this.logger.warn(`SSM parameter ${quotedRender(loggedParameterName, "'")} reported an unrecognized Type ${reported} — treating its value as a secret, so cdkd will persist the {{resolve:${service}:...}} expression rather than the resolved value. Declare the parameter as String / StringList if it is public config.`);
|
|
21401
21922
|
}
|
|
21923
|
+
const paramVersion = response.Parameter?.Version;
|
|
21402
21924
|
return {
|
|
21403
21925
|
value: paramValue,
|
|
21404
21926
|
secure,
|
|
21405
|
-
type: paramType
|
|
21927
|
+
type: paramType,
|
|
21928
|
+
...typeof paramVersion === "number" && Number.isSafeInteger(paramVersion) && { version: String(paramVersion) }
|
|
21406
21929
|
};
|
|
21407
21930
|
}
|
|
21931
|
+
function withoutSsmSelector(parameterName) {
|
|
21932
|
+
const arnName = parameterName.startsWith("arn:") ? parameterName.indexOf(":parameter/") : -1;
|
|
21933
|
+
const nameStart = arnName < 0 ? 0 : arnName + 11;
|
|
21934
|
+
const selector = parameterName.indexOf(":", nameStart);
|
|
21935
|
+
return selector < 0 ? parameterName : parameterName.slice(0, selector);
|
|
21936
|
+
}
|
|
21408
21937
|
|
|
21409
21938
|
//#endregion
|
|
21410
21939
|
//#region src/deployment/intrinsic-resolver/string-functions.ts
|
|
@@ -22401,7 +22930,10 @@ function recordInheritedParameterSecrets(parameterName, value, context) {
|
|
|
22401
22930
|
if (inherited && recorded) recordInheritedNoEchoListElements(this, inherited, recorded, value, context);
|
|
22402
22931
|
if (!inherited || inherited.size === 0 || !recorded) return;
|
|
22403
22932
|
for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
22404
|
-
|
|
22933
|
+
const carried = carriedExpressionFor(inherited, parameterName, value, plaintext, expression);
|
|
22934
|
+
recorded.set(plaintext, carried);
|
|
22935
|
+
const parentEntry = context.inheritedReferenceProvenance?.get(carried);
|
|
22936
|
+
if (parentEntry !== void 0) recordReferenceProvenanceEntry(recorded, carried, parentEntry, "read");
|
|
22405
22937
|
recordInheritedParameterRead(recorded, inherited, parameterName);
|
|
22406
22938
|
carryFreshNoEchoMark(inherited, recorded, plaintext);
|
|
22407
22939
|
}
|
|
@@ -22750,6 +23282,9 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
22750
23282
|
}
|
|
22751
23283
|
return resolved;
|
|
22752
23284
|
}
|
|
23285
|
+
resolverForRecordedRegion(region) {
|
|
23286
|
+
return this.resolverForProducerRegion(region);
|
|
23287
|
+
}
|
|
22753
23288
|
resolverForProducerRegion(producerRegion, context, producerRegionLogText) {
|
|
22754
23289
|
if (!producerRegion) return this;
|
|
22755
23290
|
const target = canonicalizeRegion(producerRegion);
|
|
@@ -25092,7 +25627,7 @@ var CloudControlProvider = class {
|
|
|
25092
25627
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
25093
25628
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
25094
25629
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
25095
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
25630
|
+
const { ASGProvider } = await import("./asg-provider-BxW2FkQz.js");
|
|
25096
25631
|
const delegateRegion = ambientRegion();
|
|
25097
25632
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
25098
25633
|
if (asgProvider === void 0) {
|
|
@@ -25198,7 +25733,7 @@ var CloudControlProvider = class {
|
|
|
25198
25733
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
25199
25734
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
25200
25735
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
25201
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
25736
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-Bz8JUYBp.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-D7sAjt4U.js"))).NeptuneProvider({ region: ccRegion });
|
|
25202
25737
|
this.sdkDeleteDelegates.set(family, {
|
|
25203
25738
|
region: ccRegion,
|
|
25204
25739
|
provider
|
|
@@ -30005,6 +30540,161 @@ async function reserveStackCreateToken(options) {
|
|
|
30005
30540
|
};
|
|
30006
30541
|
}
|
|
30007
30542
|
|
|
30543
|
+
//#endregion
|
|
30544
|
+
//#region src/deployment/deploy-value-equality.ts
|
|
30545
|
+
function isReplacementCeiling(pc) {
|
|
30546
|
+
return pc.requiresReplacement && (pc.inPlacePropagated === true || pc.replacementPropagated === true);
|
|
30547
|
+
}
|
|
30548
|
+
function keyOrderFreeJson(value) {
|
|
30549
|
+
return JSON.stringify(value, (_key, node) => {
|
|
30550
|
+
if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
|
|
30551
|
+
const sorted = Object.create(null);
|
|
30552
|
+
for (const key of Object.keys(node).sort()) sorted[key] = node[key];
|
|
30553
|
+
return sorted;
|
|
30554
|
+
});
|
|
30555
|
+
}
|
|
30556
|
+
function liveHoldsFreshLeaves(live, leaves) {
|
|
30557
|
+
for (const leaf of leaves) {
|
|
30558
|
+
let node = live;
|
|
30559
|
+
for (const segment of leaf.path) {
|
|
30560
|
+
if (typeof segment === "number") {
|
|
30561
|
+
if (!Array.isArray(node) || segment >= node.length) return false;
|
|
30562
|
+
node = node[segment];
|
|
30563
|
+
continue;
|
|
30564
|
+
}
|
|
30565
|
+
if (node === null || typeof node !== "object" || Array.isArray(node)) return false;
|
|
30566
|
+
if (!Object.prototype.hasOwnProperty.call(node, segment)) return false;
|
|
30567
|
+
node = node[segment];
|
|
30568
|
+
}
|
|
30569
|
+
if (typeof leaf.plaintext === "string") {
|
|
30570
|
+
if (typeof node !== "string" || node !== leaf.plaintext) return false;
|
|
30571
|
+
} else if (node === void 0 || keyOrderFreeJson(node) !== keyOrderFreeJson(leaf.plaintext)) return false;
|
|
30572
|
+
}
|
|
30573
|
+
return true;
|
|
30574
|
+
}
|
|
30575
|
+
function outputMapsEqual(a, b) {
|
|
30576
|
+
return deepEqualValue(a, b);
|
|
30577
|
+
}
|
|
30578
|
+
function deepEqualValue(a, b) {
|
|
30579
|
+
if (a === b) return true;
|
|
30580
|
+
if (a == null || b == null) return a === b;
|
|
30581
|
+
if (typeof a !== typeof b) return false;
|
|
30582
|
+
if (typeof a !== "object") return false;
|
|
30583
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
30584
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
30585
|
+
return a.every((v, i) => deepEqualValue(v, b[i]));
|
|
30586
|
+
}
|
|
30587
|
+
const ao = a;
|
|
30588
|
+
const bo = b;
|
|
30589
|
+
const ak = Object.keys(ao);
|
|
30590
|
+
if (ak.length !== Object.keys(bo).length) return false;
|
|
30591
|
+
for (const k of ak) {
|
|
30592
|
+
if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;
|
|
30593
|
+
if (!deepEqualValue(ao[k], bo[k])) return false;
|
|
30594
|
+
}
|
|
30595
|
+
return true;
|
|
30596
|
+
}
|
|
30597
|
+
|
|
30598
|
+
//#endregion
|
|
30599
|
+
//#region src/deployment/deploy-engine/provenance-capture.ts
|
|
30600
|
+
function kickOffProvenanceCapture(args) {
|
|
30601
|
+
const { noChange, resources, template } = args;
|
|
30602
|
+
let chain = Promise.resolve();
|
|
30603
|
+
for (const logicalId of noChange) {
|
|
30604
|
+
const record = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
|
|
30605
|
+
if (record === void 0 || hasReferenceProvenanceField(record)) continue;
|
|
30606
|
+
const tokens = recordReferenceTokens(record);
|
|
30607
|
+
if (tokens.size === 0) continue;
|
|
30608
|
+
const properties = (Object.hasOwn(template.Resources, logicalId) ? template.Resources[logicalId] : void 0)?.Properties ?? {};
|
|
30609
|
+
const task = chain.then(() => captureOne(this, logicalId, record, tokens, properties, args)).catch(() => ({
|
|
30610
|
+
record,
|
|
30611
|
+
field: void 0
|
|
30612
|
+
}));
|
|
30613
|
+
chain = task;
|
|
30614
|
+
this.provenanceCaptureTasks.set(logicalId, task);
|
|
30615
|
+
}
|
|
30616
|
+
}
|
|
30617
|
+
function warnUnattributed(engine, logicalId) {
|
|
30618
|
+
engine.logger.warn(safeMsg`Could not record where the secret reference(s) in ${logicalId} were resolved (state schema v12 migration). cdkd keeps its previous handling of them; update ${logicalId} to record it.`);
|
|
30619
|
+
}
|
|
30620
|
+
async function captureOne(engine, logicalId, record, tokens, properties, args) {
|
|
30621
|
+
const bag = /* @__PURE__ */ new Map();
|
|
30622
|
+
const { attributeHealer: _healer, ...base } = engine.buildResolverContext({
|
|
30623
|
+
template: args.template,
|
|
30624
|
+
resources: { ...args.resources },
|
|
30625
|
+
...args.parameters && { parameters: args.parameters },
|
|
30626
|
+
...args.conditions && { conditions: args.conditions }
|
|
30627
|
+
}, args.stackName);
|
|
30628
|
+
const { producerSecrets: _producer, ...withoutRecorders } = base;
|
|
30629
|
+
const context = {
|
|
30630
|
+
...withoutRecorders,
|
|
30631
|
+
recordedSecretValues: bag,
|
|
30632
|
+
recordedImports: [],
|
|
30633
|
+
recordedOutputReads: [],
|
|
30634
|
+
staleAttributeHeal: { phase: "probe" },
|
|
30635
|
+
printingSecrets: /* @__PURE__ */ new Map(),
|
|
30636
|
+
provenanceCapture: true
|
|
30637
|
+
};
|
|
30638
|
+
const stored = record.properties ?? {};
|
|
30639
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
30640
|
+
if (!Object.hasOwn(stored, key) || recordReferenceTokens({ properties: stored[key] }).size === 0) continue;
|
|
30641
|
+
try {
|
|
30642
|
+
await engine.resolver.resolve(structuredClone(value), context);
|
|
30643
|
+
} catch (error) {
|
|
30644
|
+
if (isThrottlingError(error)) return {
|
|
30645
|
+
record,
|
|
30646
|
+
field: void 0
|
|
30647
|
+
};
|
|
30648
|
+
}
|
|
30649
|
+
}
|
|
30650
|
+
const physicalId = typeof record.physicalId === "string" ? record.physicalId.toLowerCase() : "";
|
|
30651
|
+
const field = {};
|
|
30652
|
+
let unattributed = false;
|
|
30653
|
+
for (const token of [...tokens].sort()) {
|
|
30654
|
+
const pass = passProvenanceFor(bag, token);
|
|
30655
|
+
const plaintext = resolvedPlaintextOf(bag, token);
|
|
30656
|
+
const named = plaintext !== void 0 && plaintext.length >= 4 && physicalId.includes(plaintext.toLowerCase());
|
|
30657
|
+
const entry = validateReferenceProvenance(token, {
|
|
30658
|
+
...pass?.region !== void 0 && { region: pass.region },
|
|
30659
|
+
...named && pass?.versions !== void 0 && { versions: pass.versions }
|
|
30660
|
+
}) ?? {};
|
|
30661
|
+
if (entry.region === void 0 && entry.versions === void 0) unattributed = true;
|
|
30662
|
+
field[token] = entry;
|
|
30663
|
+
}
|
|
30664
|
+
if (unattributed) warnUnattributed(engine, logicalId);
|
|
30665
|
+
return {
|
|
30666
|
+
record,
|
|
30667
|
+
field
|
|
30668
|
+
};
|
|
30669
|
+
}
|
|
30670
|
+
async function drainProvenanceCaptures(stateResources) {
|
|
30671
|
+
if (this.provenanceCaptureTasks.size === 0) return 0;
|
|
30672
|
+
const entries = [...this.provenanceCaptureTasks.entries()];
|
|
30673
|
+
this.provenanceCaptureTasks.clear();
|
|
30674
|
+
const outcomes = await Promise.all(entries.map(([, task]) => task));
|
|
30675
|
+
let installed = 0;
|
|
30676
|
+
for (let i = 0; i < entries.length; i++) {
|
|
30677
|
+
const logicalId = entries[i][0];
|
|
30678
|
+
const { record, field } = outcomes[i];
|
|
30679
|
+
if (field === void 0) continue;
|
|
30680
|
+
const target = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
|
|
30681
|
+
if (target === void 0 || target.physicalId !== record.physicalId || target.resourceType !== record.resourceType) continue;
|
|
30682
|
+
stateResources[logicalId] = {
|
|
30683
|
+
...target,
|
|
30684
|
+
referenceProvenance: field
|
|
30685
|
+
};
|
|
30686
|
+
installed++;
|
|
30687
|
+
}
|
|
30688
|
+
return installed;
|
|
30689
|
+
}
|
|
30690
|
+
function provenanceBaselineOf(state, tokenFree) {
|
|
30691
|
+
return {
|
|
30692
|
+
outputs: state.outputs,
|
|
30693
|
+
...state.outputReferenceProvenance !== void 0 && { outputReferenceProvenance: state.outputReferenceProvenance },
|
|
30694
|
+
tokenFree
|
|
30695
|
+
};
|
|
30696
|
+
}
|
|
30697
|
+
|
|
30008
30698
|
//#endregion
|
|
30009
30699
|
//#region src/analyzer/destructive-changes.ts
|
|
30010
30700
|
const IGNORED_RESOURCE_TYPES = /* @__PURE__ */ new Set(["AWS::CDK::Metadata"]);
|
|
@@ -31482,10 +32172,13 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
|
|
|
31482
32172
|
continue;
|
|
31483
32173
|
}
|
|
31484
32174
|
const ownReads = [];
|
|
32175
|
+
const provenanceSink = /* @__PURE__ */ new Map();
|
|
32176
|
+
this.outputProvenanceSinks.set(outputKey, provenanceSink);
|
|
31485
32177
|
try {
|
|
31486
32178
|
const resolved = await this.resolver.resolve(output.Value, {
|
|
31487
32179
|
...context,
|
|
31488
|
-
redactedAttributeReads: ownReads
|
|
32180
|
+
redactedAttributeReads: ownReads,
|
|
32181
|
+
provenanceSink
|
|
31489
32182
|
});
|
|
31490
32183
|
refuseMaskedOutputReads(outputKey, ownReads);
|
|
31491
32184
|
if (resolved === void 0 && this.options.strictGetAtt) throw markNonRetryable(/* @__PURE__ */ new Error("the value resolved to nothing"));
|
|
@@ -31540,6 +32233,8 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
|
|
|
31540
32233
|
else if (isExportAliasCollision(exportName, outputKey, publishedOutputNames)) this.logger.warn(exportAliasCollisionWarning(outputKey, exportName, outputsPassSecrets));
|
|
31541
32234
|
else {
|
|
31542
32235
|
outputs[exportName] = value;
|
|
32236
|
+
const aliasedSink = this.outputProvenanceSinks.get(outputKey);
|
|
32237
|
+
if (aliasedSink !== void 0) this.outputProvenanceSinks.set(exportName, aliasedSink);
|
|
31543
32238
|
if (!this.resolvedExportNames.includes(exportName)) this.resolvedExportNames.push(exportName);
|
|
31544
32239
|
this.outputsTemplateSource[exportName] = outputValue;
|
|
31545
32240
|
}
|
|
@@ -31553,6 +32248,8 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
|
|
|
31553
32248
|
this.outputsTemplateSource[outputKey] = output.Value;
|
|
31554
32249
|
}
|
|
31555
32250
|
this.skippedOutputs = collectSkippedOutputs(digestSource, outputs);
|
|
32251
|
+
this.outputsResolvedThisRun.add(outputs);
|
|
32252
|
+
this.resolvedOutputsBag = outputs;
|
|
31556
32253
|
return markSameGenerationBag(outputs);
|
|
31557
32254
|
}
|
|
31558
32255
|
function buildDisplayOutputs(template, resolvedOutputs) {
|
|
@@ -32085,15 +32782,19 @@ var ReplayResolvers = class {
|
|
|
32085
32782
|
this.pinned.set(target, scoped);
|
|
32086
32783
|
return scoped;
|
|
32087
32784
|
}
|
|
32785
|
+
forRecordedRegion(region) {
|
|
32786
|
+
return this.primary.resolverForRecordedRegion(region);
|
|
32787
|
+
}
|
|
32088
32788
|
};
|
|
32089
32789
|
function regionAmbiguousReplaySecretError(logicalId, propertyPath, secretName, foreignProducerRegions, consumerRegion, execCtx) {
|
|
32090
32790
|
const where = propertyPath === "" ? "" : ` property ${quotedPlainOr(propertyPath, "property path")}`;
|
|
32091
32791
|
const error = new CdkdError(`Rollback of ${shownLogicalId(logicalId)}${where} cannot re-resolve the secret reference ${quotedPlainOr(secretName, "secret name")}: the reference carries no region of its own, and this stack read across a region boundary (producer region(s) on record: ${foreignProducerRegions.map((r) => plainOrDescribed(r, "region")).join(", ")}), so it may have been resolved in one of those rather than in ${quotedOrDescribed(consumerRegion, "region")}. A secret of the same name in two regions is two independent values, so replaying this would write the WRONG secret to a live resource. Refusing instead. Resolve the reference in its own region and set the property directly (or spell it as a full ARN, which names its region and is resolved there), then re-run ${rerunRollbackPhrase(execCtx, "'cdkd rollback'")}.`, "ROLLBACK_SECRET_REGION_AMBIGUOUS");
|
|
32092
32792
|
return markNonRetryable(error);
|
|
32093
32793
|
}
|
|
32094
|
-
function refuseUnprovenReplaySecret(leaf, propertyPath, logicalId, execCtx) {
|
|
32794
|
+
function refuseUnprovenReplaySecret(leaf, propertyPath, logicalId, execCtx, recordedRegions) {
|
|
32095
32795
|
if (execCtx.producerRegionsIncomplete !== true) return;
|
|
32096
32796
|
for (const token of dynamicReferenceTokens(leaf)) {
|
|
32797
|
+
if (recordedRegions?.has(token) === true) continue;
|
|
32097
32798
|
const name = classifyReplaySecretRegion(token, execCtx.region, execCtx.importedProducerRegions).kind === "local" ? regionLessSecretName(token) : void 0;
|
|
32098
32799
|
if (name !== void 0) throw regionUnknownReplaySecretError(logicalId, propertyPath, name, execCtx.region, execCtx);
|
|
32099
32800
|
}
|
|
@@ -32102,17 +32803,17 @@ function regionUnknownReplaySecretError(logicalId, propertyPath, secretName, con
|
|
|
32102
32803
|
const where = propertyPath === "" ? "" : ` property ${quotedPlainOr(propertyPath, "property path")}`;
|
|
32103
32804
|
return new CdkdError(`Rollback of ${shownLogicalId(logicalId)}${where} cannot re-resolve the secret reference ${quotedPlainOr(secretName, "secret name")}: the reference carries no region of its own, and this is a nested stack, and the cross-region reads its parent made are not known to this replay, so the parent may have resolved it in another region than ${quotedOrDescribed(consumerRegion, "region")}. A secret of the same name in two regions is two independent values, so replaying this could write the WRONG secret to a live resource. Refusing instead. Where the journal of the top-level stack still holds this run, roll back the top-level stack instead, which supplies its regions. Otherwise resolve the reference in its own region and set the property directly (or spell it as a full ARN, which names its region and is resolved there), then re-run ${rerunRollbackPhrase(execCtx, "'cdkd rollback'")}.`, "ROLLBACK_SECRET_REGION_AMBIGUOUS");
|
|
32104
32805
|
}
|
|
32105
|
-
async function resolveLeafByRegion(leaf, propertyPath, logicalId, execCtx, resolvers, resolverContext) {
|
|
32106
|
-
const verdicts = dynamicReferenceTokens(leaf).map((token) => [token,
|
|
32806
|
+
async function resolveLeafByRegion(leaf, propertyPath, logicalId, execCtx, resolvers, resolverContext, recordedRegions) {
|
|
32807
|
+
const verdicts = dynamicReferenceTokens(leaf).map((token) => [token, classifyRecordedSecretRegion(token, execCtx.region, execCtx.importedProducerRegions, recordedRegions)]);
|
|
32107
32808
|
for (const [, verdict] of verdicts) if (verdict.kind === "ambiguous") throw regionAmbiguousReplaySecretError(logicalId, propertyPath, verdict.secretName, verdict.foreignProducerRegions, execCtx.region, execCtx);
|
|
32108
|
-
if (!verdicts.some(([, verdict]) => verdict.kind === "named-region")) return await resolvers.primary.resolveDynamicReferences(leaf, resolverContext);
|
|
32809
|
+
if (!verdicts.some(([, verdict]) => verdict.kind === "named-region" || verdict.kind === "recorded-region")) return await resolvers.primary.resolveDynamicReferences(leaf, resolverContext);
|
|
32109
32810
|
let out = "";
|
|
32110
32811
|
let cursor = 0;
|
|
32111
32812
|
for (const [token, verdict] of verdicts) {
|
|
32112
32813
|
const at = leaf.indexOf(token, cursor);
|
|
32113
32814
|
if (at < 0) throw new CdkdError(`Rollback of ${logicalId}${propertyPath === "" ? "" : ` property '${propertyPath}'`} could not locate a scanned dynamic reference in the value it was scanned from. Refusing rather than resolving it in '${execCtx.region}', which would be the wrong region for a reference that names another one. This is an internal invariant failure — please report it with the resource type and property path.`, "ROLLBACK_SECRET_TOKEN_SCAN_MISMATCH");
|
|
32114
32815
|
out += leaf.slice(cursor, at);
|
|
32115
|
-
const resolver = verdict.kind === "named-region" ? resolvers.forRegion(verdict.region) : resolvers.primary;
|
|
32816
|
+
const resolver = verdict.kind === "named-region" ? resolvers.forRegion(verdict.region) : verdict.kind === "recorded-region" ? resolvers.forRecordedRegion(verdict.region) : resolvers.primary;
|
|
32116
32817
|
out += await resolver.resolveDynamicReferences(token, resolverContext);
|
|
32117
32818
|
cursor = at + token.length;
|
|
32118
32819
|
}
|
|
@@ -32847,8 +33548,9 @@ function maskRestoredNoEchoRecord(record, baseline, substituted = []) {
|
|
|
32847
33548
|
|
|
32848
33549
|
//#endregion
|
|
32849
33550
|
//#region src/deployment/rollback-executor/replay-props.ts
|
|
32850
|
-
async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId) {
|
|
33551
|
+
async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId, record) {
|
|
32851
33552
|
if (props === void 0) return void 0;
|
|
33553
|
+
const recordedRegions = recordedReferenceRegions(record);
|
|
32852
33554
|
const resolverContext = {
|
|
32853
33555
|
template: { Resources: {} },
|
|
32854
33556
|
resources: {},
|
|
@@ -32857,8 +33559,8 @@ async function resolveReplayProps(props, resolvers, secrets, execCtx, logicalId)
|
|
|
32857
33559
|
const walk = async (v, path) => {
|
|
32858
33560
|
if (typeof v === "string") {
|
|
32859
33561
|
if (!v.includes("{{resolve:")) return v;
|
|
32860
|
-
refuseUnprovenReplaySecret(v, path, logicalId, execCtx);
|
|
32861
|
-
return await resolveLeafByRegion(v, path, logicalId, execCtx, resolvers, resolverContext);
|
|
33562
|
+
refuseUnprovenReplaySecret(v, path, logicalId, execCtx, recordedRegions);
|
|
33563
|
+
return await resolveLeafByRegion(v, path, logicalId, execCtx, resolvers, resolverContext, recordedRegions);
|
|
32862
33564
|
}
|
|
32863
33565
|
if (Array.isArray(v)) {
|
|
32864
33566
|
const out = new Array(v.length);
|
|
@@ -33171,7 +33873,7 @@ async function replayRevert(s) {
|
|
|
33171
33873
|
provisionedBy: op.provisionedBy
|
|
33172
33874
|
});
|
|
33173
33875
|
const noEcho = await substituteMarkedNoEchoLeaves({
|
|
33174
|
-
desired: await resolveReplayProps(previousState.properties, resolver, secrets, ctx, op.logicalId),
|
|
33876
|
+
desired: await resolveReplayProps(previousState.properties, resolver, secrets, ctx, op.logicalId, previousState),
|
|
33175
33877
|
baseline: previousState,
|
|
33176
33878
|
live: current,
|
|
33177
33879
|
logicalId: op.logicalId,
|
|
@@ -33183,7 +33885,7 @@ async function replayRevert(s) {
|
|
|
33183
33885
|
const desiredProps = noEcho.desired;
|
|
33184
33886
|
refuseMaskedReplayBaseline(desiredProps, op.logicalId, noEcho.inert);
|
|
33185
33887
|
logger.info(` Rollback: Restoring ${safe(op.logicalId)} (${safe(op.resourceType)}) to previous state`);
|
|
33186
|
-
const currentProps = noEcho.onPreviousSide(await resolveReplayProps(current.properties, resolver, secrets, ctx, op.logicalId));
|
|
33888
|
+
const currentProps = noEcho.onPreviousSide(await resolveReplayProps(current.properties, resolver, secrets, ctx, op.logicalId, current));
|
|
33187
33889
|
recordNestedStackParameterExpressions(secrets, op.resourceType, desiredProps, previousState.properties, STATE_DERIVED_RULES);
|
|
33188
33890
|
opMasker.addNamed({
|
|
33189
33891
|
resourceType: op.resourceType,
|
|
@@ -33259,7 +33961,7 @@ async function replayReverseReplacement(s) {
|
|
|
33259
33961
|
skipUnaddressableReplay(s, logger, op, "reverse the replacement of");
|
|
33260
33962
|
return;
|
|
33261
33963
|
}
|
|
33262
|
-
const resolvedPrevProps = await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId) ?? {};
|
|
33964
|
+
const resolvedPrevProps = await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId, prev) ?? {};
|
|
33263
33965
|
refuseMarkedNoEchoRecreate(resolvedPrevProps, noEchoLeavesOf(prev), op.logicalId);
|
|
33264
33966
|
refuseMaskedReplayBaseline(resolvedPrevProps, op.logicalId);
|
|
33265
33967
|
opMasker.addNamed({
|
|
@@ -33941,7 +34643,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
33941
34643
|
provisionedBy: op.provisionedBy ?? current.provisionedBy
|
|
33942
34644
|
});
|
|
33943
34645
|
const noEcho = await substituteMarkedNoEchoLeaves({
|
|
33944
|
-
desired: await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId),
|
|
34646
|
+
desired: await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId, prev),
|
|
33945
34647
|
baseline: prev,
|
|
33946
34648
|
live: current,
|
|
33947
34649
|
logicalId: op.logicalId,
|
|
@@ -33952,7 +34654,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
|
|
|
33952
34654
|
});
|
|
33953
34655
|
const desiredProps = noEcho.desired;
|
|
33954
34656
|
refuseMaskedReplayBaseline(desiredProps, op.logicalId, noEcho.inert);
|
|
33955
|
-
const attemptedProps = noEcho.onPreviousSide(await resolveReplayProps(op.attemptedProperties ?? current.properties, resolver, secrets, ctx, op.logicalId));
|
|
34657
|
+
const attemptedProps = noEcho.onPreviousSide(await resolveReplayProps(op.attemptedProperties ?? current.properties, resolver, secrets, ctx, op.logicalId, op.attemptedProperties === void 0 ? current : void 0));
|
|
33956
34658
|
recordNestedStackParameterExpressions(secrets, op.resourceType, desiredProps, prev.properties, STATE_DERIVED_RULES);
|
|
33957
34659
|
opMasker.addNamed({
|
|
33958
34660
|
resourceType: op.resourceType,
|
|
@@ -34700,7 +35402,7 @@ async function revertNestedChildFromJournal(args) {
|
|
|
34700
35402
|
const { skippedOutputs: _dropped, ...carried } = base;
|
|
34701
35403
|
const next = () => ({
|
|
34702
35404
|
...carried,
|
|
34703
|
-
version:
|
|
35405
|
+
version: 12,
|
|
34704
35406
|
region,
|
|
34705
35407
|
resources: { ...stateResources },
|
|
34706
35408
|
...orphansAfterRollback(base, mintedOrphans),
|
|
@@ -34716,6 +35418,7 @@ async function revertNestedChildFromJournal(args) {
|
|
|
34716
35418
|
const state = next();
|
|
34717
35419
|
if (!restoring) return state;
|
|
34718
35420
|
if (restoredOutputs && !restoredOutputs.exportNames) delete state.exportNames;
|
|
35421
|
+
if (restoredOutputs) delete state.outputReferenceProvenance;
|
|
34719
35422
|
if (restoredReads && !restoredReads.imports) delete state.imports;
|
|
34720
35423
|
if (restoredReads && !restoredReads.outputReads) delete state.outputReads;
|
|
34721
35424
|
return state;
|
|
@@ -35596,7 +36299,8 @@ function kickOffObservedCapture(provider, logicalId, physicalId, resourceType, r
|
|
|
35596
36299
|
this.observedCaptureTasks.set(logicalId, promise);
|
|
35597
36300
|
}
|
|
35598
36301
|
async function drainObservedCaptures(stateResources) {
|
|
35599
|
-
|
|
36302
|
+
const captured = await this.drainProvenanceCaptures(stateResources);
|
|
36303
|
+
if (this.observedCaptureTasks.size === 0) return captured;
|
|
35600
36304
|
const entries = Array.from(this.observedCaptureTasks.entries());
|
|
35601
36305
|
this.observedCaptureTasks.clear();
|
|
35602
36306
|
const resolved = await Promise.all(entries.map(([, p]) => p));
|
|
@@ -35612,7 +36316,7 @@ async function drainObservedCaptures(stateResources) {
|
|
|
35612
36316
|
target.observedProperties = recapturedFrom !== void 0 ? observed : markSameGenerationBag({ ...observed });
|
|
35613
36317
|
}
|
|
35614
36318
|
}
|
|
35615
|
-
return installed;
|
|
36319
|
+
return installed + captured;
|
|
35616
36320
|
}
|
|
35617
36321
|
const STANDALONE_SIBLING = {
|
|
35618
36322
|
Roles: {
|
|
@@ -35795,61 +36499,6 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
|
|
|
35795
36499
|
this.observedCaptureTasks.set(logicalId, task);
|
|
35796
36500
|
}
|
|
35797
36501
|
|
|
35798
|
-
//#endregion
|
|
35799
|
-
//#region src/deployment/deploy-value-equality.ts
|
|
35800
|
-
function isReplacementCeiling(pc) {
|
|
35801
|
-
return pc.requiresReplacement && (pc.inPlacePropagated === true || pc.replacementPropagated === true);
|
|
35802
|
-
}
|
|
35803
|
-
function keyOrderFreeJson(value) {
|
|
35804
|
-
return JSON.stringify(value, (_key, node) => {
|
|
35805
|
-
if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
|
|
35806
|
-
const sorted = Object.create(null);
|
|
35807
|
-
for (const key of Object.keys(node).sort()) sorted[key] = node[key];
|
|
35808
|
-
return sorted;
|
|
35809
|
-
});
|
|
35810
|
-
}
|
|
35811
|
-
function liveHoldsFreshLeaves(live, leaves) {
|
|
35812
|
-
for (const leaf of leaves) {
|
|
35813
|
-
let node = live;
|
|
35814
|
-
for (const segment of leaf.path) {
|
|
35815
|
-
if (typeof segment === "number") {
|
|
35816
|
-
if (!Array.isArray(node) || segment >= node.length) return false;
|
|
35817
|
-
node = node[segment];
|
|
35818
|
-
continue;
|
|
35819
|
-
}
|
|
35820
|
-
if (node === null || typeof node !== "object" || Array.isArray(node)) return false;
|
|
35821
|
-
if (!Object.prototype.hasOwnProperty.call(node, segment)) return false;
|
|
35822
|
-
node = node[segment];
|
|
35823
|
-
}
|
|
35824
|
-
if (typeof leaf.plaintext === "string") {
|
|
35825
|
-
if (typeof node !== "string" || node !== leaf.plaintext) return false;
|
|
35826
|
-
} else if (node === void 0 || keyOrderFreeJson(node) !== keyOrderFreeJson(leaf.plaintext)) return false;
|
|
35827
|
-
}
|
|
35828
|
-
return true;
|
|
35829
|
-
}
|
|
35830
|
-
function outputMapsEqual(a, b) {
|
|
35831
|
-
return deepEqualValue(a, b);
|
|
35832
|
-
}
|
|
35833
|
-
function deepEqualValue(a, b) {
|
|
35834
|
-
if (a === b) return true;
|
|
35835
|
-
if (a == null || b == null) return a === b;
|
|
35836
|
-
if (typeof a !== typeof b) return false;
|
|
35837
|
-
if (typeof a !== "object") return false;
|
|
35838
|
-
if (Array.isArray(a) || Array.isArray(b)) {
|
|
35839
|
-
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
35840
|
-
return a.every((v, i) => deepEqualValue(v, b[i]));
|
|
35841
|
-
}
|
|
35842
|
-
const ao = a;
|
|
35843
|
-
const bo = b;
|
|
35844
|
-
const ak = Object.keys(ao);
|
|
35845
|
-
if (ak.length !== Object.keys(bo).length) return false;
|
|
35846
|
-
for (const k of ak) {
|
|
35847
|
-
if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;
|
|
35848
|
-
if (!deepEqualValue(ao[k], bo[k])) return false;
|
|
35849
|
-
}
|
|
35850
|
-
return true;
|
|
35851
|
-
}
|
|
35852
|
-
|
|
35853
36502
|
//#endregion
|
|
35854
36503
|
//#region src/deployment/deploy-engine/masking.ts
|
|
35855
36504
|
function diffLogMasker(diffSecrets, template, parameterValues, resources) {
|
|
@@ -35906,6 +36555,11 @@ function absorbOutputsPassSecrets() {
|
|
|
35906
36555
|
}
|
|
35907
36556
|
}
|
|
35908
36557
|
function redactOutputs(outputs) {
|
|
36558
|
+
const redacted = redactOutputsBag.call(this, outputs);
|
|
36559
|
+
if (this.outputsResolvedThisRun.has(outputs)) this.outputsResolvedThisRun.add(redacted);
|
|
36560
|
+
return redacted;
|
|
36561
|
+
}
|
|
36562
|
+
function redactOutputsBag(outputs) {
|
|
35909
36563
|
this.absorbOutputsPassSecrets();
|
|
35910
36564
|
if (this.outputSecrets.size === 0) return this.maskOutputsByPosition(outputs);
|
|
35911
36565
|
return this.maskOutputsByPosition(redactSecretsForState(outputs, this.outputSecrets, this.outputsSourceUsable ? this.outputsTemplateSource : void 0, TEMPLATE_SOURCED_RULES));
|
|
@@ -36557,6 +37211,7 @@ function buildResolverContext(base, stackName) {
|
|
|
36557
37211
|
attributeHealer: (logicalId, resource) => this.healStaleAttributes(logicalId, resource, stackName),
|
|
36558
37212
|
...this.options.inheritedSecrets && hasMaskableValues(this.options.inheritedSecrets) && { inheritedSecrets: this.options.inheritedSecrets },
|
|
36559
37213
|
...this.options.inheritedPhysicalNameCopies && { inheritedPhysicalNameCopies: this.options.inheritedPhysicalNameCopies },
|
|
37214
|
+
...this.options.inheritedReferenceProvenance && { inheritedReferenceProvenance: this.options.inheritedReferenceProvenance },
|
|
36560
37215
|
recordedSecretValues,
|
|
36561
37216
|
noEchoAttributeResources: this.noEchoAttributeResources,
|
|
36562
37217
|
secretNameNeedles: (logicalId) => this.noteSecretNamedRecord(logicalId, Object.hasOwn(base.resources, logicalId) ? base.resources[logicalId] : void 0),
|
|
@@ -42369,6 +43024,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
|
|
|
42369
43024
|
} else throw updateError;
|
|
42370
43025
|
}
|
|
42371
43026
|
this.updateWasReplaced.set(logicalId, result.wasReplaced === true);
|
|
43027
|
+
if (result.wasReplaced !== true && (hasPassProvenance(updateSecrets) || referenceProvenanceOf(currentResource) !== void 0)) {
|
|
43028
|
+
const cached = cachedCreateOnlyPropertyPaths(resourceType);
|
|
43029
|
+
this.inPlaceCreateOnlyPaths.set(logicalId, cached === void 0 ? "all" : await cached.catch(() => "all"));
|
|
43030
|
+
}
|
|
42372
43031
|
if (result.wasReplaced) {
|
|
42373
43032
|
this.noteSecretNamedRecord(logicalId, {
|
|
42374
43033
|
resourceType,
|
|
@@ -42972,7 +43631,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
42972
43631
|
saveChain = saveChain.then(async () => {
|
|
42973
43632
|
try {
|
|
42974
43633
|
const partialState = {
|
|
42975
|
-
version:
|
|
43634
|
+
version: 12,
|
|
42976
43635
|
region: this.stackRegion,
|
|
42977
43636
|
stackName: currentState.stackName,
|
|
42978
43637
|
resources: newResources,
|
|
@@ -43279,7 +43938,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
43279
43938
|
}
|
|
43280
43939
|
try {
|
|
43281
43940
|
const preRollbackState = {
|
|
43282
|
-
version:
|
|
43941
|
+
version: 12,
|
|
43283
43942
|
region: this.stackRegion,
|
|
43284
43943
|
stackName: currentState.stackName,
|
|
43285
43944
|
resources: newResources,
|
|
@@ -43332,7 +43991,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
43332
43991
|
}
|
|
43333
43992
|
try {
|
|
43334
43993
|
const postRollbackState = {
|
|
43335
|
-
version:
|
|
43994
|
+
version: 12,
|
|
43336
43995
|
region: this.stackRegion,
|
|
43337
43996
|
stackName: currentState.stackName,
|
|
43338
43997
|
resources: newResources,
|
|
@@ -43351,7 +44010,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
43351
44010
|
try {
|
|
43352
44011
|
const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
|
|
43353
44012
|
const postRollbackState = {
|
|
43354
|
-
version:
|
|
44013
|
+
version: 12,
|
|
43355
44014
|
region: this.stackRegion,
|
|
43356
44015
|
stackName: currentState.stackName,
|
|
43357
44016
|
resources: newResources,
|
|
@@ -43384,7 +44043,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
43384
44043
|
}
|
|
43385
44044
|
return {
|
|
43386
44045
|
state: {
|
|
43387
|
-
version:
|
|
44046
|
+
version: 12,
|
|
43388
44047
|
region: this.stackRegion,
|
|
43389
44048
|
stackName: currentState.stackName,
|
|
43390
44049
|
resources: newResources,
|
|
@@ -43402,7 +44061,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
|
|
|
43402
44061
|
}
|
|
43403
44062
|
async function persistStateAfterOutputFailure(stackName, currentState, newResources, currentEtag, pendingMigration) {
|
|
43404
44063
|
const buildState = () => ({
|
|
43405
|
-
version:
|
|
44064
|
+
version: 12,
|
|
43406
44065
|
region: this.stackRegion,
|
|
43407
44066
|
stackName: currentState.stackName,
|
|
43408
44067
|
resources: newResources,
|
|
@@ -44707,7 +45366,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
44707
45366
|
const currentStateData = await this.stateBackend.getState(stackName, this.stackRegion);
|
|
44708
45367
|
noteDeployStateRecord(currentStateData?.state !== void 0);
|
|
44709
45368
|
const currentState = currentStateData?.state ?? {
|
|
44710
|
-
version:
|
|
45369
|
+
version: 12,
|
|
44711
45370
|
region: this.stackRegion,
|
|
44712
45371
|
stackName,
|
|
44713
45372
|
resources: {},
|
|
@@ -44724,6 +45383,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
44724
45383
|
refuseMalformedResourceProperties(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
44725
45384
|
refuseMalformedOrphans(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
44726
45385
|
refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
|
|
45386
|
+
this.provenanceBaseline = provenanceBaselineOf(currentState, isKnownTokenFreeState(currentStateData?.state));
|
|
44727
45387
|
const migrationPending = currentStateData?.migrationPending ?? false;
|
|
44728
45388
|
this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
|
|
44729
45389
|
if (this.options.onCurrentStateLoaded) {
|
|
@@ -44879,8 +45539,20 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
44879
45539
|
firstDeployStateGate = void 0;
|
|
44880
45540
|
await gate;
|
|
44881
45541
|
}
|
|
45542
|
+
const startProvenanceCapture = () => {
|
|
45543
|
+
if (this.options.dryRun || isKnownTokenFreeState(currentStateData?.state)) return;
|
|
45544
|
+
this.kickOffProvenanceCapture({
|
|
45545
|
+
noChange: this.diffCalculator.filterByType(changes, "NO_CHANGE").map((change) => change.logicalId),
|
|
45546
|
+
resources: currentState.resources,
|
|
45547
|
+
template: effectiveTemplate,
|
|
45548
|
+
parameters: parameterValues,
|
|
45549
|
+
conditions,
|
|
45550
|
+
stackName
|
|
45551
|
+
});
|
|
45552
|
+
};
|
|
44882
45553
|
if (!this.diffCalculator.hasChanges(changes)) {
|
|
44883
45554
|
this.logger.info("No changes detected. Stack is up to date.");
|
|
45555
|
+
startProvenanceCapture();
|
|
44884
45556
|
let persistedOutputs = currentState.outputs ?? {};
|
|
44885
45557
|
if (!this.options.dryRun) {
|
|
44886
45558
|
const resolvedOutputs = this.redactOutputs(await withSharedDrainBudget(() => this.resolveOutputs(effectiveTemplate, currentState.resources, stackName, outputsDigestSource, parameterValues, conditions)));
|
|
@@ -44918,9 +45590,10 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
44918
45590
|
options: this.options,
|
|
44919
45591
|
stackName
|
|
44920
45592
|
});
|
|
44921
|
-
|
|
45593
|
+
const outputProvenanceBackfill = !outputsChanged && currentState.outputReferenceProvenance === void 0 && this.provenanceBaseline?.tokenFree === false && this.outputReferenceProvenanceFor(persistedOutputs, this.redactOutputs(persistedOutputs)) !== void 0;
|
|
45594
|
+
if (observedRefresh || outputProvenanceBackfill || maskedFingerprintsBackfilled || conditionVerdictsChanged || outputsChanged || exportSetChanged || skippedOutputsChanged || orphansChanged || healedAttributesPending) try {
|
|
44922
45595
|
const refreshedState = {
|
|
44923
|
-
version:
|
|
45596
|
+
version: 12,
|
|
44924
45597
|
region: this.stackRegion,
|
|
44925
45598
|
stackName: currentState.stackName,
|
|
44926
45599
|
resources: currentState.resources,
|
|
@@ -45030,6 +45703,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
|
|
|
45030
45703
|
recreateTargetIds: recreateTargetIdsFor(this.options.recreateTargets, stackName),
|
|
45031
45704
|
secretMask: () => this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources)
|
|
45032
45705
|
})) this.generatedNameGuard?.noteApprovalPrompted();
|
|
45706
|
+
startProvenanceCapture();
|
|
45033
45707
|
this.generatedNameGuard?.recordPlannedIntents();
|
|
45034
45708
|
this.resolver.resetPhysicalIdFallbackCount();
|
|
45035
45709
|
const progress = {
|
|
@@ -45365,6 +46039,12 @@ var DeployEngine = class {
|
|
|
45365
46039
|
restoredLostChildren = /* @__PURE__ */ new Set();
|
|
45366
46040
|
updatesThatSentNothing = /* @__PURE__ */ new Set();
|
|
45367
46041
|
updateWasReplaced = /* @__PURE__ */ new Map();
|
|
46042
|
+
inPlaceCreateOnlyPaths = /* @__PURE__ */ new Map();
|
|
46043
|
+
outputProvenanceSinks = /* @__PURE__ */ new Map();
|
|
46044
|
+
outputsResolvedThisRun = /* @__PURE__ */ new WeakSet();
|
|
46045
|
+
provenanceBaseline = void 0;
|
|
46046
|
+
resolvedOutputsBag = void 0;
|
|
46047
|
+
provenanceCaptureTasks = /* @__PURE__ */ new Map();
|
|
45368
46048
|
oldDeletedBeforeCreate = /* @__PURE__ */ new Set();
|
|
45369
46049
|
healBaseline = {};
|
|
45370
46050
|
runProducerRegionEvidence = void 0;
|
|
@@ -45434,6 +46114,12 @@ var DeployEngine = class {
|
|
|
45434
46114
|
this.restoredLostChildren = /* @__PURE__ */ new Set();
|
|
45435
46115
|
this.updatesThatSentNothing = /* @__PURE__ */ new Set();
|
|
45436
46116
|
this.updateWasReplaced = /* @__PURE__ */ new Map();
|
|
46117
|
+
this.inPlaceCreateOnlyPaths = /* @__PURE__ */ new Map();
|
|
46118
|
+
this.outputProvenanceSinks = /* @__PURE__ */ new Map();
|
|
46119
|
+
this.outputsResolvedThisRun = /* @__PURE__ */ new WeakSet();
|
|
46120
|
+
this.provenanceBaseline = void 0;
|
|
46121
|
+
this.resolvedOutputsBag = void 0;
|
|
46122
|
+
this.provenanceCaptureTasks = /* @__PURE__ */ new Map();
|
|
45437
46123
|
this.oldDeletedBeforeCreate = /* @__PURE__ */ new Set();
|
|
45438
46124
|
this.healBaseline = {};
|
|
45439
46125
|
this.runProducerRegionEvidence = void 0;
|
|
@@ -45454,7 +46140,7 @@ var DeployEngine = class {
|
|
|
45454
46140
|
const templateProps = this.perResourceTemplateProps.get(logicalId);
|
|
45455
46141
|
const scrubbed = scrubResourceRecord(this.withHealedAttributes(logicalId, record), secrets ?? /* @__PURE__ */ new Map(), templateProps);
|
|
45456
46142
|
const noEchoScrubbed = this.applyNoEchoPersist(logicalId, record, this.withNoEchoExactEchoes(logicalId, scrubbed), templateProps, state.resources, secrets);
|
|
45457
|
-
resources[logicalId] = withConstructPath(withMaskedPropertyFingerprints(noEchoScrubbed, record.properties, templateProps, secrets, this.fingerprintNoEchoValues, this.perResourceInputFingerprints.get(logicalId)), constructPathOf(this.constructPathTemplate, logicalId));
|
|
46143
|
+
resources[logicalId] = withReferenceProvenance(withConstructPath(withMaskedPropertyFingerprints(noEchoScrubbed, record.properties, templateProps, secrets, this.fingerprintNoEchoValues, this.perResourceInputFingerprints.get(logicalId)), constructPathOf(this.constructPathTemplate, logicalId)), this.referenceProvenanceToPersist(logicalId, record, noEchoScrubbed, secrets));
|
|
45458
46144
|
}
|
|
45459
46145
|
const orphans = state.orphans?.map((entry) => {
|
|
45460
46146
|
const sameResource = this.perResourceResolvedType.get(entry.logicalId) === entry.state.resourceType;
|
|
@@ -45466,14 +46152,51 @@ var DeployEngine = class {
|
|
|
45466
46152
|
});
|
|
45467
46153
|
const outputs = this.redactOutputs(state.outputs);
|
|
45468
46154
|
const crossStackReads = this.redactCrossStackReads(state);
|
|
46155
|
+
const { outputReferenceProvenance: _incoming, ...rest } = state;
|
|
46156
|
+
const outputReferenceProvenance = this.outputReferenceProvenanceFor(state.outputs, outputs);
|
|
45469
46157
|
return {
|
|
45470
|
-
...
|
|
46158
|
+
...rest,
|
|
45471
46159
|
resources,
|
|
45472
46160
|
outputs,
|
|
45473
46161
|
...orphans === void 0 ? {} : { orphans },
|
|
45474
|
-
...crossStackReads
|
|
46162
|
+
...crossStackReads,
|
|
46163
|
+
...outputReferenceProvenance !== void 0 && { outputReferenceProvenance }
|
|
45475
46164
|
};
|
|
45476
46165
|
}
|
|
46166
|
+
outputReferenceProvenanceFor(outputs, redacted) {
|
|
46167
|
+
const sinkOf = (outputKey) => this.outputProvenanceSinks.get(outputKey);
|
|
46168
|
+
const baseline = this.provenanceBaseline;
|
|
46169
|
+
if (!this.outputsResolvedThisRun.has(outputs) && baseline !== void 0 && outputs === baseline.outputs && baseline.outputReferenceProvenance === void 0 && !baseline.tokenFree && this.resolvedOutputsBag !== void 0 && outputMapsEqual(this.redactOutputs(this.resolvedOutputsBag), redacted)) return outputProvenanceForPersist({
|
|
46170
|
+
outputs: redacted,
|
|
46171
|
+
resolvedThisRun: true,
|
|
46172
|
+
carriedFrom: void 0,
|
|
46173
|
+
sinkOf
|
|
46174
|
+
});
|
|
46175
|
+
return outputProvenanceForPersist({
|
|
46176
|
+
outputs: redacted,
|
|
46177
|
+
resolvedThisRun: this.outputsResolvedThisRun.has(outputs),
|
|
46178
|
+
carriedFrom: baseline !== void 0 && outputs === baseline.outputs ? baseline : void 0,
|
|
46179
|
+
sinkOf
|
|
46180
|
+
});
|
|
46181
|
+
}
|
|
46182
|
+
referenceProvenanceToPersist(logicalId, record, scrubbed, secrets) {
|
|
46183
|
+
const sameGeneration = isSameGenerationBag(record.properties);
|
|
46184
|
+
if (!sameGeneration && !isWrittenFromDeployedTemplate(record.properties)) return KEEP_REFERENCE_PROVENANCE;
|
|
46185
|
+
const previous = Object.hasOwn(this.healBaseline, logicalId) ? this.healBaseline[logicalId] : void 0;
|
|
46186
|
+
if (this.updatesThatSentNothing.has(logicalId) && previous !== void 0) return previous.referenceProvenance;
|
|
46187
|
+
const createOnly = sameGeneration ? this.inPlaceCreateOnlyPaths.get(logicalId) : "all";
|
|
46188
|
+
const inPlace = this.updateWasReplaced.get(logicalId) === false && previous !== void 0 ? {
|
|
46189
|
+
createOnly: createOnly ?? "all",
|
|
46190
|
+
attributesCarried: record.attributes !== void 0 && record.attributes === previous.attributes
|
|
46191
|
+
} : void 0;
|
|
46192
|
+
return provenanceForWrittenRecord({
|
|
46193
|
+
record: scrubbed,
|
|
46194
|
+
secrets,
|
|
46195
|
+
previous,
|
|
46196
|
+
inPlace,
|
|
46197
|
+
walkWithoutPassProvenance: this.provenanceBaseline?.tokenFree !== true
|
|
46198
|
+
});
|
|
46199
|
+
}
|
|
45477
46200
|
redactCrossStackReads(state) {
|
|
45478
46201
|
if (state.imports === void 0 && state.outputReads === void 0) return {};
|
|
45479
46202
|
const secrets = this.allRecordedSecrets();
|
|
@@ -45622,6 +46345,8 @@ DeployEngine.prototype.namingSecretsFor = namingSecretsFor;
|
|
|
45622
46345
|
DeployEngine.prototype.noteSecretNamedReads = noteSecretNamedReads;
|
|
45623
46346
|
DeployEngine.prototype.kickOffObservedCapture = kickOffObservedCapture;
|
|
45624
46347
|
DeployEngine.prototype.drainObservedCaptures = drainObservedCaptures;
|
|
46348
|
+
DeployEngine.prototype.kickOffProvenanceCapture = kickOffProvenanceCapture;
|
|
46349
|
+
DeployEngine.prototype.drainProvenanceCaptures = drainProvenanceCaptures;
|
|
45625
46350
|
DeployEngine.prototype.buildObservedCaptureSiblings = buildObservedCaptureSiblings;
|
|
45626
46351
|
DeployEngine.prototype.stampReasonlessParameterRefusals = stampReasonlessParameterRefusals;
|
|
45627
46352
|
DeployEngine.prototype.kickOffAutoRefreshObservedProperties = kickOffAutoRefreshObservedProperties;
|
|
@@ -45655,5 +46380,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
|
|
|
45655
46380
|
DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
|
|
45656
46381
|
|
|
45657
46382
|
//#endregion
|
|
45658
|
-
export { isTruthyCfnBoolean as $, isStatefulRecreateTargetForReplace as $a, stateBucketExistenceConfirmed as $c, malformedOrphansRefusalMessage as $i, ledgerForStack as $n, markSameGenerationBag as $o, sendableAssumeRoleCommand as $r, AssetPublisher as $s, seedsDeleteFirstGuard as $t, noEchoComparisonForTemplate as A, refuseMalformedResourcesForDeploy as Aa, redactDockerArgvValues as Ac, declaresNoEcho as Ai, journaledOrphanPrintingBag as An, maskWholeValue as Ao, deleteIndeterminateGuards as Ar, LockManager as As, dropFailedHint as At, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as B, unpreviewableOrphanRecords as Ba, getDockerImageBySourceHash as Bc, hasReadableOutputs as Bi, PRE_DELETE_SNAPSHOT_TYPES as Bn, carryLogOnlyValues as Bo, reDisableInstanceApiTermination as Br, splitImportedOps as Bs, getStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedResourceEntriesForImport as Ca, dockerSpawnEnvWithSensitive as Cc, cfnRefValueFromPhysicalId as Ci, displayAssemblyPath as Cl, collectDeclaredOutputNames as Cn, sameLambdaFunctionAddress as Co, applyCustomResourceResponseExpiration as Cr, wholeStringLeavesOf as Cs, revertNestedChildFromJournal as Ct, withResourceDeadline as D, refuseMalformedResourcePropertiesForDrift as Da, isDockerClientEnvKey as Dc, withSharedDrainBudget as Di, injectedAwsRegionValue as Dl, DEFAULT_RESOURCE_TIMEOUT_MS as Dn, isMarkedCoordinate as Do, unchangedBehindSecretReference as Dr, TEMPLATE_SOURCED_RULES as Ds, getCurrentNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourcePropertiesForDestroy as Ea, getDockerCmd as Ec, parseWebACLArn as Ei, injectAwsRegion as El, bindingSkippedOutputs as En, canonicalCoordinates as Eo, slowCcOperationTimeoutMs as Er, STATE_SOURCED_READBACK_RULES as Es, collectNestedChildUnaddressed as Et, PROTECTION_PROPERTY_BY_TYPE as F, repairMalformedOrphansForReadOnly as Fa, warnFinchArgvExposure as Fc, UNREADABLE_RESOURCES_MAP_ROW as Fi, secretNamedRecordNeedles as Fn, passedNoEchoParametersOf as Fo, markWaitAbandoned as Fr, CrossPrefixScanCache as Fs, sameJournaledOrphans as Ft, resolveDynamoDbDeleteBudgetMs as G, findSilentDropProperties as Ga, loadCdkJson as Gc, malformedExportNamesWarning as Gi, isFinalSnapshotError as Gn, printingCorpusOf as Go, poisonRenderedSpellingsCollidingIn as Gr, hasReasonlessBaselineRefusal as Gs, isJournaledOrphan as Gt, compensateRemovedDeletionProtection as H, unreadableResourceEntries as Ha, synthesisStatusMessage as Hc, isReadableOrphanRecord as Hi, ccRoutedFinalSnapshotError as Hn, hasMaskableValues as Ho, DiffCalculator as Hr, describeRegionValueKind as Hs, removeProtectionTypeList as Ht, isProtectionValueActive as I, repairMalformedOutputsForReadOnly as Ia, escapeRegExp$3 as Ic, accountArgs as Ii, stateSecretNameNeedles as In, readbackPathFor as Io, disableInstanceApiTermination as Ir, applyCrossPrefixScan as Is, replayFailedOperations as It, deleteTableWithIndexBusyRetry as J, NO_CC_HANDLERS_REASON as Ja, resolveCaptureObservedState as Jc, malformedLocalResourceEntriesWarning as Ji, maskingRetryLogger as Jn, shareLogOnlyValues as Jo, applyRoleArnIfSet as Jr, importableOutputs as Js, planRollback as Jt, DELETE_INDEX_WAIT_PROCEED_NOTE as K, unwrittenCreateOnlyReplacement as Ka, resolveApp as Kc, malformedExportSourceWarning as Ki, refusesFinalSnapshot as Kn, recordLogOnlyParameterValue as Ko, producerLookupOver as Kr, hasUnverifiableParameterRefusal as Ks, isReplacementOrphan as Kt, perType as L, repairMalformedResourceEntriesForReadOnly as La, stripControlChars as Lc, deployRefusesOrphanRowsReason as Li, storedSecretNameNeedles as Ln, readsNoEchoSource as Lo, ec2InstanceProtectionSite as Lr, crossPrefixDeniedWarning as Ls, replayRollback as Lt, noEchoParameterNamesOf as M, refuseMalformedResourcesForExport as Ma, redactedDockerCause as Mc, STATE_REGION_DIVERGED as Mi, orphanRecordsPrintingBag as Mn, noEchoCoordinatesOf as Mo, deleteSkipReason as Mr, S3StateBackend as Ms, journaledOrphanLines as Mt, recordedProtectionEvidence as N, refuseMalformedState as Na, runDockerForeground as Nc, STATE_RESOURCES_MALFORMED as Ni, secretNamePrintingBag as Nn, noEchoLeavesOf as No, withIndeterminateGuard as Nr, rebuildClientForBucketRegion as Ns, loadJournaledOrphans as Nt, diffSecurity as O, refuseMalformedResourcePropertiesForExport as Oa, isMalformedEnvKey as Oc, parameterInputsFor as Oi, clearBucketRegionCache as Ol, DEFAULT_RESOURCE_WARN_AFTER_MS as On, maskAtCoordinates as Oo, RollbackInlinePolicyWriters as Or, WHOLE_DYNAMIC_REFERENCE_PATTERN as Os, withNestedStackContext as Ot, recordedProtectionNote as P, repairMalformedOrphanRecordsForReadOnly as Pa, runDockerStreaming as Pc, UNREADABLE_ORPHANS_CONTAINER_ROW as Pi, secretNamePrintingBags as Pn, noEchoOutputsComparison as Po, isWaitAbandonedError as Pr, CrossPrefixReadError as Ps, makeForeignHolderScan as Pt, hasCdkAutoDeleteTag as Q, MULTI_REGION_RECREATE_BLOCKED_TYPES as Qa, resolveUseCdkBootstrapAssets as Qc, malformedOrphanRowsKeptWarning as Qi, earliestDefined as Qn, maskSecretsInText as Qo, isIamRoleArn as Qr, shouldRetainResource as Qs, resolveReplacementOldType as Qt, readProtection as R, repairMalformedResourcePropertiesForReadOnly as Ra, stripForDisplay as Rc, displayLogicalId as Ri, extractDeploymentEventError as Rn, valueAtCoordinate as Ro, isTerminationProtectionPropagationError as Rr, isAccessDenied$1 as Rs, awaitInFlightSibling as Rt, keptForReadoption as S, refuseMalformedResourceEntriesForDestroy as Sa, describeDockerFailure as Sc, AWS_NO_VALUE as Si, describeFileReadFailure as Sl, noEchoParameterValueSeed as Sn, lambdaFunctionNameForMask as So, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Sr, recordProvenPublicExpression as Ss, recordDisplacedSkips as St, findServiceTokenRefusals as T, refuseMalformedResourceEntriesForOrphan as Ta, formatDockerLoginError as Tc, refStateLookupFromResource as Ti, resolveAssemblyPath as Tl, isExportAliasCollision as Tn, TemplateParser as To, CloudControlProvider as Tr, STATE_SOURCED_CROSS_GENERATION_RULES as Ts, withNestedRevertRun as Tt, deleteBudgetKey as U, withheldAccountClause as Ua, getDefaultStateBucketName as Uc, isReadableResourceEntry as Ui, createPreDeleteFinalSnapshot as Un, literalSplitDelimitersOf as Uo, INTRINSIC_KEYS as Ur, exportNamesCarriedFrom as Us, recordAfterRollbackUpdate as Ut, beginDeleteWait as V, unreadableOrphanRecords as Va, Synthesizer as Vc, hasReadableResources as Vi, buildFinalSnapshotIdentifier as Vn, createUnionSecretMasker as Vo, reEnableInstanceApiTermination as Vr, acceptedCreateOnlyDropsOf as Vs, withStackRecords as Vt, resolveDynamoDbDeleteBudgetClock as W, findActionableSilentDrops as Wa, getLegacyStateBucketName as Wc, malformedDriftResourcePropertiesWarning as Wi, effectiveDeletionPolicy as Wn, logOnlyValueCount as Wo, IntrinsicFunctionResolver as Wr, hasReadableExportSet as Ws, demoteSupersededOrphans as Wt, ECR_AUTO_DELETE_IMAGES_TAG as X, findReplacedReadersOfRecreateTargets as Xa, resolveStateBucketWithDefault as Xc, malformedOrphanRecordsRefusalMessage as Xi, findDestructiveChanges as Xn, errorCauseChain as Xo, assertSendableRoleArn as Xr, orphansAfterRollback as Xs, recordUnderIdIsNotOwn as Xt, waitForIndexesSettled as Y, hasNoCloudControlHandlers as Ya, resolveSkipPrefix as Yc, malformedLocalResourcesWarning as Yi, constructPathOf as Yn, createSecretMasker as Yo, assertFlagRoleArn as Yr, isReadableBag as Ys, recheckFailedPlan as Yt, S3_AUTO_DELETE_OBJECTS_TAG as Z, shownType as Za, resolveStateBucketWithDefaultAndSource as Zc, malformedOrphanRecordsWarning as Zi, formatDestructiveChange as Zn, maskSecretsInError as Zo, explicitRoleArnOrThrow as Zr, orphansCarriedFrom as Zs, replacementNeverSwapped as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedOutputs as _a, buildDenyExternalAccessPolicy as _c, isImpossibleEmptyStoredAttribute as _i, hasOwnKey as _l, secretSafeKeyDisplay as _n, prefetchCreateOnlyPropertyPaths as _o, TemplateNoEchoReresolver as _r, provenPublicValue as _s, displacedOpClause as _t, findNestedTemplateTreeDefect as a, malformedResourcePropertiesWarning as aa, loadPublishableAssetManifest as ac, s3BucketArn as ai, findLargeInlineResources as al, isRedactedRecordedValue as an, toCfnInteger as ao, planTagDiff as ar, dynamicReferenceTokens as as, cyan as at, lookupEachName as b, refuseMalformedResourceEntries as ba, describeDockerCapturedOutput as bc, isNamelessDynamicReferenceError as bi, ownValue as bl, exportNameSecretExposure as bn, withRetry as bo, getCurrentResourceSecrets as br, recordNoEchoAttributeValues as bs, getNestedRevertRun as bt, renderNestedTemplateTreeDefect as c, malformedStateRefusalMessage as ca, BOOTSTRAP_MARKER_PREFIX as cc, s3BucketRegionalDomainName as ci, decodeListingKey as cl, updatePartialMessage as cn, coerceCfnInteger as co, tagMapAsList as cr, identityKeyFor as cs, red as ct, conditionInputsFrom as d, refuseMalformedNestedChildOutputs as da, getBootstrapMarkerKey as dc, producerRegionsFromState as di, canonicalizeRegion as dl, DeploymentEventsStore as dn, configStringRefusal as do, stringifyIfAssigned as dr, recoverMaskedOutput as ds, namesAnyDeclaredParameter as dt, malformedOrphansWarning as ea, isSensitiveAttributeName as ec, AWS_CREDENTIAL_ENV_KEYS as ei, warnDeprecatedNoPrefixCliFlag as el, orphanDeleteNeedsIdentity as en, isStatefulRecreateTargetSync as eo, reserveStackCreateToken as er, redactSecretsForState as es, getPriorAttempts as et, parentSuppliedValues as f, refuseMalformedOrphanRecords as fa, isCrossRegionRedirect as fc, regionLessSecretName as fi, derivePartitionAndUrlSuffix as fl, WITHHELD_NAME_DISPLAY as fn, readConfigString as fo, CC_BROKEN_REASON as fr, physicalNameCopiesOf as fs, reachableDivergentParameters as ft, mergeNoChangeOutputs as g, refuseMalformedOrphansForOrphan as ga, validateContainerRepoName as gc, getAccountInfo as gi, defineOwnKey as gl, secretBearingStateKeyWarning as gn, requireConfigString as go, wouldReturnToSdkProvider as gr, carriesSecretMask as gs, NESTED_PENDING_PARENT_REASON as gt, keptWholeReasonText as h, refuseMalformedOrphansForDestroy as ha, validateAssetBucketName as hc, parameterTypeMayLoseSecretIdentity as hi, processStackMessages as hl, secretBearing as hn, requireConfigObject as ho, isCustomResource as hr, splitGetAttStringForm as hs, planOrphanAdoption as ht, childTemplateLoader as i, malformedResourceEntriesWarning as ia, createAssetRedirectResolver as ic, isSettledInstanceState as ii, MIGRATE_TMP_PREFIX as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, isWarmThroughputDecrease as io, DBPROXY_TAG_OPTIONS as ir, DYNAMIC_REFERENCE_TOKEN_SCAN as is, bold as it, noEchoExactEchoLeavesOf as j, refuseMalformedResourcesForDestroy as ja, redactedCause as jc, JSON_LISTING_HOLE_VALUE as ji, maskEventTextWithBoundBags as jn, maskedLeafCoordinatesOf as jo, deleteLeftInPlace as jr, isLockInfoExpired as js, isHandledOrphan as jt, noEchoAttributeNamesOf as k, refuseMalformedResourcePropertiesForOrphan as ka, partitionSensitiveEnv as kc, passedParameterClassesOf as ki, resolveBucketRegion as kl, completedReplayEntries as kn, maskReadbackAtCoordinates as ko, UNSPECIFIED_SKIP_REASON as kr, isSingleDynamicReferenceToken as ks, deleteJournaledOrphans as kt, templateIdentity as l, previewableOrphanRecords as la, assertAssetBucketRegion as lc, s3BucketWebsiteUrl as li, expectedOwnerParam as ll, updatePartialReason as ln, configBooleanRefusal as lo, tagPlanWarning as lr, inheritNestedStackParameterAssociations as ls, yellow as lt, isSecretBearingReferenceString as m, refuseMalformedOrphans as ma, readBootstrapMarkerBody as mc, isUnboundTemplateParameter as mi, StageLoadError as ml, exportAliasCollisionScrubWarning as mn, requireConfigArray as mo, ccBrokenReason as mr, recordPhysicalNameCopy as ms, makeSiblingClaimReader as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedOutputsWarning as na, WorkGraph as nc, callerEnvCredentials as ni, CFN_TEMPLATE_BODY_LIMIT as nl, getCurrentProducerRegions as nn, WARM_THROUGHPUT_MEMBERS as no, acquireIdempotencyToken as nr, withPhysicalNameCopies as ns, formatResourceLine as nt, isAbsoluteAssetPath as o, malformedResourcesWarning as oa, rewriteTemplateAssetReferences as oc, s3BucketDomainName as oi, uploadCfnTemplate as ol, redactedDeleteAddressFields as on, toFiniteNumber as oo, readTagList as or, isUncertifiedBaselineMaskPosition as os, gray as ot, readRecordedConditionVerdicts as p, refuseMalformedOrphanRecordsForDestroy as pa, parseBootstrapMarker as pc, coerceParameterTypedValue as pi, AssemblyReader as pl, displayTextOrWithheld as pn, replayWarn as po, ProviderRegistry as pr, recordAttributeIdCopy as ps, resourcesNamingDeclaredParameter as pt, INDEX_SETTLE_POLL_INTERVAL_MS as q, withoutSilentDropProperties as qa, resolveAutoAssetStorage as qc, malformedLocalOutputsWarning as qi, unsupportedFinalSnapshotError as qn, recordLogOnlyValue as qo, refuseUnreadableCdkCrossAccountRefs as qr, importableOutputKeys as qs, planFailedOps as qt, computeImplicitDeleteEdges as r, malformedRenderedContainersWarning as ra, buildAssetRedirectMap as rc, envCredentialsAreAssumedRole as ri, CFN_TEMPLATE_URL_LIMIT as rl, inheritProducerRegions as rn, coerceWarmThroughput as ro, DBPROXY_TAGS_WHAT as rr, withoutPhysicalNameCopies as rs, createReadOnlyAttributeHealerFactory as rt, listNestedTemplateRows as s, malformedScrubResourceEntriesRefusalMessage as sa, AssetModeResolver as sc, s3BucketDualStackDomainName as si, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as sl, redactedDeleteAddressSkip as sn, coerceCfnBoolean as so, refuseMalformedDesiredTags as sr, pathCrossesDottedKey as ss, green as st, DeployEngine as t, malformedOutputsRefusalMessage as ta, stringifyValue as tc, applyCallerIdentityCredentials as ti, ssmResolvedValueType as tl, findNestedStackTypeChanges as tn, renderStatefulReason as to, withCreateTokenLedger as tr, scrubResourceRecord as ts, markRefusedBeforeApplying as tt, conditionFingerprint as u, refuseDivergentRecordRegionForDestroy as ua, ensureAssetStorage as uc, classifyReplaySecretRegion as ui, PARTITION_TABLE as ul, DeploymentEventsReader as un, configIntegerRefusal as uo, definedAttributes as ur, recordNestedStackParameterExpressions as us, computeParameterTaint as ut, chunks as v, refuseMalformedOutputsForDestroy as va, buildDockerImage as vc, carriesDynamicReference as vi, hasPlainPrototype$1 as vl, carriedExportAliasExposure as vn, templateResourceTypes as vo, readsNoEchoDeleteValues as vr, recordMaskOnlyValue as vs, displacedPhysicalIdShown as vt, deferredServiceTokenWarning as w, refuseMalformedResourceEntriesForImportSave as wa, finchSecretArgvRefusal as wc, isStalePlaceholderArnAttribute as wi, renderAssemblyPathEscape as wl, collectPublishedOutputNames as wn, DagBuilder as wo, customResourceResponseExpirationWarning as wr, STATE_SOURCED_BASELINE_RULES as ws, revertedNestedRowIds as wt, withApiLimit as x, refuseMalformedResourceEntriesForDeploy as xa, describeDockerExecFailure as xc, keepsSecretReferenceToken as xi, absoluteAssemblyPathEscape as xl, isWholeDynamicReferenceValue as xn, canonicalLambdaFunctionName as xo, withPrintingSecrets as xr, recordNoEchoParameterFreshValue as xs, nestedChildStackName as xt, isAccessDeniedError as y, refuseMalformedResourceAttributesForOrphan as ya, resolveDockerContextDirectory as yc, carriesFetchableDynamicReference as yi, nullPrototypeRecord as yl, exportNameNoEchoParameters as yn, describeTypeWithThrottleRetry as yo, isCustomResourceType as yr, recordMaskOnlyValuesIn as ys, dropSettledNestedJournals as yt, DynamoDBGlobalTableProvider as z, repairMalformedResourcesForReadOnly as za, AssetManifestLoader as zc, hasReadableOrphans as zi, ATOMIC_FINAL_SNAPSHOT_TYPES as zn, liveMatchesUnresolvedTokenFrame as zo, observeThenDisableInstanceApiTermination as zr, isNotImplemented as zs, destroyStackRecordsView as zt };
|
|
45659
|
-
//# sourceMappingURL=deploy-engine-
|
|
46383
|
+
export { isTruthyCfnBoolean as $, NO_CC_HANDLERS_REASON as $a, resolveApp as $c, malformedLocalResourceEntriesWarning as $i, ledgerForStack as $n, shareLogOnlyValues as $o, sendableAssumeRoleCommand as $r, hasUnverifiableParameterRefusal as $s, seedsDeleteFirstGuard as $t, noEchoComparisonForTemplate as A, refuseMalformedResourceEntriesForOrphan as Aa, dockerSpawnEnvWithSensitive as Ac, refStateLookupFromResource as Ai, displayAssemblyPath as Al, journaledOrphanPrintingBag as An, TemplateParser as Ao, deleteIndeterminateGuards as Ar, wholeStringLeavesOf as As, dropFailedHint as At, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as B, repairMalformedOrphansForReadOnly as Ba, runDockerForeground as Bc, UNREADABLE_RESOURCES_MAP_ROW as Bi, PRE_DELETE_SNAPSHOT_TYPES as Bn, passedNoEchoParametersOf as Bo, reDisableInstanceApiTermination as Br, rebuildClientForBucketRegion as Bs, getStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedOutputsForDestroy as Ca, validateContainerRepoName as Cc, carriesDynamicReference as Ci, defineOwnKey as Cl, collectDeclaredOutputNames as Cn, templateResourceTypes as Co, applyCustomResourceResponseExpiration as Cr, carriesSecretMask as Cs, revertNestedChildFromJournal as Ct, withResourceDeadline as D, refuseMalformedResourceEntriesForDestroy as Da, describeDockerCapturedOutput as Dc, AWS_NO_VALUE as Di, ownValue as Dl, DEFAULT_RESOURCE_TIMEOUT_MS as Dn, lambdaFunctionNameForMask as Do, unchangedBehindSecretReference as Dr, recordNoEchoAttributeValues as Ds, getCurrentNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourceEntriesForDeploy as Ea, resolveDockerContextDirectory as Ec, keepsSecretReferenceToken as Ei, nullPrototypeRecord as El, bindingSkippedOutputs as En, canonicalLambdaFunctionName as Eo, slowCcOperationTimeoutMs as Er, recordMaskOnlyValuesIn as Es, collectNestedChildUnaddressed as Et, PROTECTION_PROPERTY_BY_TYPE as F, refuseMalformedResourcesForDeploy as Fa, isMalformedEnvKey as Fc, declaresNoEcho as Fi, clearBucketRegionCache as Fl, secretNamedRecordNeedles as Fn, maskWholeValue as Fo, markWaitAbandoned as Fr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Fs, sameJournaledOrphans as Ft, resolveDynamoDbDeleteBudgetMs as G, unpreviewableOrphanRecords as Ga, stripForDisplay as Gc, hasReadableOutputs as Gi, isFinalSnapshotError as Gn, carryLogOnlyValues as Go, poisonRenderedSpellingsCollidingIn as Gr, isAccessDenied$1 as Gs, isJournaledOrphan as Gt, compensateRemovedDeletionProtection as H, repairMalformedResourceEntriesForReadOnly as Ha, warnFinchArgvExposure as Hc, deployRefusesOrphanRowsReason as Hi, ccRoutedFinalSnapshotError as Hn, readsNoEchoSource as Ho, DiffCalculator as Hr, CrossPrefixScanCache as Hs, removeProtectionTypeList as Ht, isProtectionValueActive as I, refuseMalformedResourcesForDestroy as Ia, partitionSensitiveEnv as Ic, JSON_LISTING_HOLE_VALUE as Ii, resolveBucketRegion as Il, stateSecretNameNeedles as In, maskedLeafCoordinatesOf as Io, disableInstanceApiTermination as Ir, isSingleDynamicReferenceToken as Is, replayFailedOperations as It, deleteTableWithIndexBusyRetry as J, withheldAccountClause as Ja, Synthesizer as Jc, isReadableResourceEntry as Ji, maskingRetryLogger as Jn, literalSplitDelimitersOf as Jo, applyRoleArnIfSet as Jr, acceptedCreateOnlyDropsOf as Js, planRollback as Jt, DELETE_INDEX_WAIT_PROCEED_NOTE as K, unreadableOrphanRecords as Ka, AssetManifestLoader as Kc, hasReadableResources as Ki, refusesFinalSnapshot as Kn, createUnionSecretMasker as Ko, producerLookupOver as Kr, isNotImplemented as Ks, isReplacementOrphan as Kt, perType as L, refuseMalformedResourcesForExport as La, redactDockerArgvValues as Lc, STATE_REGION_DIVERGED as Li, storedSecretNameNeedles as Ln, noEchoCoordinatesOf as Lo, ec2InstanceProtectionSite as Lr, LockManager as Ls, replayRollback as Lt, noEchoParameterNamesOf as M, refuseMalformedResourcePropertiesForDrift as Ma, formatDockerLoginError as Mc, withSharedDrainBudget as Mi, resolveAssemblyPath as Ml, orphanRecordsPrintingBag as Mn, isMarkedCoordinate as Mo, deleteSkipReason as Mr, STATE_SOURCED_CROSS_GENERATION_RULES as Ms, journaledOrphanLines as Mt, recordedProtectionEvidence as N, refuseMalformedResourcePropertiesForExport as Na, getDockerCmd as Nc, parameterInputsFor as Ni, injectAwsRegion as Nl, secretNamePrintingBag as Nn, maskAtCoordinates as No, withIndeterminateGuard as Nr, STATE_SOURCED_READBACK_RULES as Ns, loadJournaledOrphans as Nt, diffSecurity as O, refuseMalformedResourceEntriesForImport as Oa, describeDockerExecFailure as Oc, cfnRefValueFromPhysicalId as Oi, absoluteAssemblyPathEscape as Ol, DEFAULT_RESOURCE_WARN_AFTER_MS as On, sameLambdaFunctionAddress as Oo, RollbackInlinePolicyWriters as Or, recordNoEchoParameterFreshValue as Os, withNestedStackContext as Ot, recordedProtectionNote as P, refuseMalformedResourcePropertiesForOrphan as Pa, isDockerClientEnvKey as Pc, passedParameterClassesOf as Pi, injectedAwsRegionValue as Pl, secretNamePrintingBags as Pn, maskReadbackAtCoordinates as Po, isWaitAbandonedError as Pr, TEMPLATE_SOURCED_RULES as Ps, makeForeignHolderScan as Pt, hasCdkAutoDeleteTag as Q, withoutSilentDropProperties as Qa, loadCdkJson as Qc, malformedLocalOutputsWarning as Qi, earliestDefined as Qn, recordLogOnlyValue as Qo, isIamRoleArn as Qr, hasReasonlessBaselineRefusal as Qs, resolveReplacementOldType as Qt, readProtection as R, refuseMalformedState as Ra, redactedCause as Rc, STATE_RESOURCES_MALFORMED as Ri, extractDeploymentEventError as Rn, noEchoLeavesOf as Ro, isTerminationProtectionPropagationError as Rr, isLockInfoExpired as Rs, awaitInFlightSibling as Rt, keptForReadoption as S, refuseMalformedOutputs as Sa, validateAssetBucketName as Sc, isImpossibleEmptyStoredAttribute as Si, processStackMessages as Sl, noEchoParameterValueSeed as Sn, prefetchCreateOnlyPropertyPaths as So, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Sr, splitGetAttStringForm as Ss, recordDisplacedSkips as St, findServiceTokenRefusals as T, refuseMalformedResourceEntries as Ta, buildDockerImage as Tc, isNamelessDynamicReferenceError as Ti, hasPlainPrototype$1 as Tl, isExportAliasCollision as Tn, withRetry as To, CloudControlProvider as Tr, recordMaskOnlyValue as Ts, withNestedRevertRun as Tt, deleteBudgetKey as U, repairMalformedResourcePropertiesForReadOnly as Ua, escapeRegExp$3 as Uc, displayLogicalId as Ui, createPreDeleteFinalSnapshot as Un, valueAtCoordinate as Uo, INTRINSIC_KEYS as Ur, applyCrossPrefixScan as Us, recordAfterRollbackUpdate as Ut, beginDeleteWait as V, repairMalformedOutputsForReadOnly as Va, runDockerStreaming as Vc, accountArgs as Vi, buildFinalSnapshotIdentifier as Vn, readbackPathFor as Vo, reEnableInstanceApiTermination as Vr, CrossPrefixReadError as Vs, withStackRecords as Vt, resolveDynamoDbDeleteBudgetClock as W, repairMalformedResourcesForReadOnly as Wa, stripControlChars as Wc, hasReadableOrphans as Wi, effectiveDeletionPolicy as Wn, liveMatchesUnresolvedTokenFrame as Wo, IntrinsicFunctionResolver as Wr, crossPrefixDeniedWarning as Ws, demoteSupersededOrphans as Wt, ECR_AUTO_DELETE_IMAGES_TAG as X, findSilentDropProperties as Xa, getDefaultStateBucketName as Xc, malformedExportNamesWarning as Xi, findDestructiveChanges as Xn, printingCorpusOf as Xo, assertSendableRoleArn as Xr, exportNamesCarriedFrom as Xs, recordUnderIdIsNotOwn as Xt, waitForIndexesSettled as Y, findActionableSilentDrops as Ya, synthesisStatusMessage as Yc, malformedDriftResourcePropertiesWarning as Yi, constructPathOf as Yn, logOnlyValueCount as Yo, assertFlagRoleArn as Yr, describeRegionValueKind as Ys, recheckFailedPlan as Yt, S3_AUTO_DELETE_OBJECTS_TAG as Z, unwrittenCreateOnlyReplacement as Za, getLegacyStateBucketName as Zc, malformedExportSourceWarning as Zi, formatDestructiveChange as Zn, recordLogOnlyParameterValue as Zo, explicitRoleArnOrThrow as Zr, hasReadableExportSet as Zs, replacementNeverSwapped as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedOrphanRecords as _a, ensureAssetStorage as _c, regionLessSecretName as _i, PARTITION_TABLE as _l, secretSafeKeyDisplay as _n, readConfigString as _o, TemplateNoEchoReresolver as _r, recordNestedStackParameterExpressions as _s, displacedOpClause as _t, findNestedTemplateTreeDefect as a, malformedOrphansWarning as aa, shouldRetainResource as ac, keepHeldTokenProvenance as ai, resolveUseCdkBootstrapAssets as al, isRedactedRecordedValue as an, isStatefulRecreateTargetSync as ao, planTagDiff as ar, recordReferenceProvenanceEntry as as, cyan as at, lookupEachName as b, refuseMalformedOrphansForDestroy as ba, parseBootstrapMarker as bc, parameterTypeMayLoseSecretIdentity as bi, AssemblyReader as bl, exportNameSecretExposure as bn, requireConfigObject as bo, getCurrentResourceSecrets as br, recordAttributeIdCopy as bs, getNestedRevertRun as bt, renderNestedTemplateTreeDefect as c, malformedRenderedContainersWarning as ca, stringifyValue as cc, recordedReferenceRegions as ci, ssmResolvedValueType as cl, updatePartialMessage as cn, coerceWarmThroughput as co, tagMapAsList as cr, scrubResourceRecord as cs, red as ct, conditionInputsFrom as d, malformedResourcesWarning as da, createAssetRedirectResolver as dc, s3BucketDualStackDomainName as di, MIGRATE_TMP_PREFIX as dl, DeploymentEventsStore as dn, toFiniteNumber as do, stringifyIfAssigned as dr, DYNAMIC_REFERENCE_TOKEN_SCAN as ds, namesAnyDeclaredParameter as dt, malformedLocalResourcesWarning as ea, importableOutputKeys as ec, AWS_CREDENTIAL_ENV_KEYS as ei, resolveAutoAssetStorage as el, orphanDeleteNeedsIdentity as en, hasNoCloudControlHandlers as eo, reserveStackCreateToken as er, createSecretMasker as es, getPriorAttempts as et, parentSuppliedValues as f, malformedScrubResourceEntriesRefusalMessage as fa, loadPublishableAssetManifest as fc, s3BucketRegionalDomainName as fi, findLargeInlineResources as fl, WITHHELD_NAME_DISPLAY as fn, coerceCfnBoolean as fo, CC_BROKEN_REASON as fr, dynamicReferenceTokens as fs, reachableDivergentParameters as ft, mergeNoChangeOutputs as g, refuseMalformedNestedChildOutputs as ga, assertAssetBucketRegion as gc, producerRegionsFromState as gi, expectedOwnerParam as gl, secretBearingStateKeyWarning as gn, configStringRefusal as go, wouldReturnToSdkProvider as gr, inheritNestedStackParameterAssociations as gs, NESTED_PENDING_PARENT_REASON as gt, keptWholeReasonText as h, refuseDivergentRecordRegionForDestroy as ha, BOOTSTRAP_MARKER_PREFIX as hc, classifyReplaySecretRegion as hi, decodeListingKey as hl, secretBearing as hn, configIntegerRefusal as ho, isCustomResource as hr, identityKeyFor as hs, planOrphanAdoption as ht, childTemplateLoader as i, malformedOrphansRefusalMessage as ia, orphansCarriedFrom as ic, isSettledInstanceState as ii, resolveStateBucketWithDefaultAndSource as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, isStatefulRecreateTargetForReplace as io, DBPROXY_TAG_OPTIONS as ir, markSameGenerationBag as is, bold as it, noEchoExactEchoLeavesOf as j, refuseMalformedResourcePropertiesForDestroy as ja, finchSecretArgvRefusal as jc, parseWebACLArn as ji, renderAssemblyPathEscape as jl, maskEventTextWithBoundBags as jn, canonicalCoordinates as jo, deleteLeftInPlace as jr, STATE_SOURCED_BASELINE_RULES as js, isHandledOrphan as jt, noEchoAttributeNamesOf as k, refuseMalformedResourceEntriesForImportSave as ka, describeDockerFailure as kc, isStalePlaceholderArnAttribute as ki, describeFileReadFailure as kl, completedReplayEntries as kn, DagBuilder as ko, UNSPECIFIED_SKIP_REASON as kr, recordProvenPublicExpression as ks, deleteJournaledOrphans as kt, templateIdentity as l, malformedResourceEntriesWarning as la, WorkGraph as lc, s3BucketArn as li, CFN_TEMPLATE_BODY_LIMIT as ll, updatePartialReason as ln, isWarmThroughputDecrease as lo, tagPlanWarning as lr, withPhysicalNameCopies as ls, yellow as lt, isSecretBearingReferenceString as m, previewableOrphanRecords as ma, AssetModeResolver as mc, classifyRecordedSecretRegion as mi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ml, exportAliasCollisionScrubWarning as mn, configBooleanRefusal as mo, ccBrokenReason as mr, pathCrossesDottedKey as ms, makeSiblingClaimReader as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedOrphanRecordsWarning as na, isReadableBag as nc, callerEnvCredentials as ni, resolveSkipPrefix as nl, getCurrentProducerRegions as nn, shownType as no, acquireIdempotencyToken as nr, maskSecretsInError as ns, formatResourceLine as nt, isAbsoluteAssetPath as o, malformedOutputsRefusalMessage as oa, AssetPublisher as oc, outputReferenceProvenanceOf as oi, stateBucketExistenceConfirmed as ol, redactedDeleteAddressFields as on, renderStatefulReason as oo, readTagList as or, snapshotPassProvenance as os, gray as ot, readRecordedConditionVerdicts as p, malformedStateRefusalMessage as pa, rewriteTemplateAssetReferences as pc, s3BucketWebsiteUrl as pi, uploadCfnTemplate as pl, displayTextOrWithheld as pn, coerceCfnInteger as po, ProviderRegistry as pr, isUncertifiedBaselineMaskPosition as ps, resourcesNamingDeclaredParameter as pt, INDEX_SETTLE_POLL_INTERVAL_MS as q, unreadableResourceEntries as qa, getDockerImageBySourceHash as qc, isReadableOrphanRecord as qi, unsupportedFinalSnapshotError as qn, hasMaskableValues as qo, refuseUnreadableCdkCrossAccountRefs as qr, splitImportedOps as qs, planFailedOps as qt, computeImplicitDeleteEdges as r, malformedOrphanRowsKeptWarning as ra, orphansAfterRollback as rc, envCredentialsAreAssumedRole as ri, resolveStateBucketWithDefault as rl, inheritProducerRegions as rn, MULTI_REGION_RECREATE_BLOCKED_TYPES as ro, DBPROXY_TAGS_WHAT as rr, maskSecretsInText as rs, createReadOnlyAttributeHealerFactory as rt, listNestedTemplateRows as s, malformedOutputsWarning as sa, isSensitiveAttributeName as sc, recordedOutputReferenceRegions as si, warnDeprecatedNoPrefixCliFlag as sl, redactedDeleteAddressSkip as sn, WARM_THROUGHPUT_MEMBERS as so, refuseMalformedDesiredTags as sr, redactSecretsForState as ss, green as st, DeployEngine as t, malformedOrphanRecordsRefusalMessage as ta, importableOutputs as tc, applyCallerIdentityCredentials as ti, resolveCaptureObservedState as tl, findNestedStackTypeChanges as tn, findReplacedReadersOfRecreateTargets as to, withCreateTokenLedger as tr, errorCauseChain as ts, markRefusedBeforeApplying as tt, conditionFingerprint as u, malformedResourcePropertiesWarning as ua, buildAssetRedirectMap as uc, s3BucketDomainName as ui, CFN_TEMPLATE_URL_LIMIT as ul, DeploymentEventsReader as un, toCfnInteger as uo, definedAttributes as ur, withoutPhysicalNameCopies as us, computeParameterTaint as ut, chunks as v, refuseMalformedOrphanRecordsForDestroy as va, getBootstrapMarkerKey as vc, coerceParameterTypedValue as vi, canonicalizeRegion as vl, carriedExportAliasExposure as vn, replayWarn as vo, readsNoEchoDeleteValues as vr, recoverMaskedOutput as vs, displacedPhysicalIdShown as vt, deferredServiceTokenWarning as w, refuseMalformedResourceAttributesForOrphan as wa, buildDenyExternalAccessPolicy as wc, carriesFetchableDynamicReference as wi, hasOwnKey as wl, collectPublishedOutputNames as wn, describeTypeWithThrottleRetry as wo, customResourceResponseExpirationWarning as wr, provenPublicValue as ws, revertedNestedRowIds as wt, withApiLimit as x, refuseMalformedOrphansForOrphan as xa, readBootstrapMarkerBody as xc, getAccountInfo as xi, StageLoadError as xl, isWholeDynamicReferenceValue as xn, requireConfigString as xo, withPrintingSecrets as xr, recordPhysicalNameCopy as xs, nestedChildStackName as xt, isAccessDeniedError as y, refuseMalformedOrphans as ya, isCrossRegionRedirect as yc, isUnboundTemplateParameter as yi, derivePartitionAndUrlSuffix as yl, exportNameNoEchoParameters as yn, requireConfigArray as yo, isCustomResourceType as yr, physicalNameCopiesOf as ys, dropSettledNestedJournals as yt, DynamoDBGlobalTableProvider as z, repairMalformedOrphanRecordsForReadOnly as za, redactedDockerCause as zc, UNREADABLE_ORPHANS_CONTAINER_ROW as zi, ATOMIC_FINAL_SNAPSHOT_TYPES as zn, noEchoOutputsComparison as zo, observeThenDisableInstanceApiTermination as zr, S3StateBackend as zs, destroyStackRecordsView as zt };
|
|
46384
|
+
//# sourceMappingURL=deploy-engine-CZUhJ1IZ.js.map
|