@go-to-k/cdkd 0.300.1 → 0.300.2
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-BS5i71bK.js → asg-provider-DJdNNqDe.js} +3 -3
- package/dist/{asg-provider-BS5i71bK.js.map → asg-provider-DJdNNqDe.js.map} +1 -1
- package/dist/cli.js +2 -2
- package/dist/{deploy-engine-BK4gG_5A.js → deploy-engine-DOBzE5TD.js} +465 -288
- package/dist/deploy-engine-DOBzE5TD.js.map +1 -0
- package/dist/{iam-policy-targets-DAs3w7QW.js → iam-policy-targets-DFk7zr0Q.js} +27 -2
- package/dist/iam-policy-targets-DFk7zr0Q.js.map +1 -0
- package/dist/{iam-role-provider-SmvPHPLC.js → iam-role-provider-C8gNXG1G.js} +3 -3
- package/dist/{iam-role-provider-SmvPHPLC.js.map → iam-role-provider-C8gNXG1G.js.map} +1 -1
- package/dist/index.js +3 -3
- package/dist/{neptune-provider-CqZ1FaqT.js → neptune-provider-UDy6HC5O.js} +3 -3
- package/dist/{neptune-provider-CqZ1FaqT.js.map → neptune-provider-UDy6HC5O.js.map} +1 -1
- package/dist/{program-DVPHKsxv.js → program-BDm58Wc8.js} +8 -8
- package/dist/{program-DVPHKsxv.js.map → program-BDm58Wc8.js.map} +1 -1
- package/dist/{provider-classes-CDzT2xg0.js → provider-classes-DzoIZFZK.js} +96 -24
- package/dist/provider-classes-DzoIZFZK.js.map +1 -0
- package/dist/{rds-provider-DraxDuQq.js → rds-provider-C-lGTdAb.js} +3 -3
- package/dist/{rds-provider-DraxDuQq.js.map → rds-provider-C-lGTdAb.js.map} +1 -1
- package/dist/{version-DTSDiQcV.js → version-CZbKGFSS.js} +2 -2
- package/dist/{version-DTSDiQcV.js.map → version-CZbKGFSS.js.map} +1 -1
- package/package.json +1 -1
- package/dist/deploy-engine-BK4gG_5A.js.map +0 -1
- package/dist/iam-policy-targets-DAs3w7QW.js.map +0 -1
- package/dist/provider-classes-CDzT2xg0.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as getAwsClients, s as __exportAll } from "./aws-clients-B_CEQGE1.js";
|
|
2
2
|
import { A as UNRENDERABLE, B as safeMsg, C as looksLikeCdkdGeneratedName, D as SAFE_MSG_ALTERED_CHAR, E as withoutGeneratedFallbackName, F as displaySafe, H as terminalSafe, I as displayStackName, L as isPasteableIdent, N as displayAwsMessage, O as SECRET_REF_MAX_CODE_POINTS, P as displayIdent, S as getCurrentStackName, T as withStackName, U as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, j as asIsMessage, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as plainIdentOr } from "./aws-failure-text-BEQfs6za.js";
|
|
3
|
-
import { $ as protectedReplacementAdvice, $
|
|
3
|
+
import { $ as protectedReplacementAdvice, $t as ambientCredentialConfig, A as isQuotableImportValue, An as SHELL_ACTIVE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as shellBoundedDisplay, Bt as formatLockOperation, Cn as StateError, Ct as RETRY_AUXILIARY_OWNER, Dn as normalizeAwsError, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as isInertUnquoted, Ft as UNREPRODUCIBLE_LOCK_CLAUSE, G as runDeleteAttempt, Gn as isUpdateUnsupportedError, Gt as DEFAULT_STATE_PREFIX, H as observeThenDisableProtection, Hn as withheldTargetClause, Ht as recoveryCommandFlags, In as pasteableCommand, It as buildForceUnlockCommand, J as DELETION_PROTECTION_DOC_POINTER, Jn as isNameCooldownError, Kn as hasReplayMayCollide, Kt as injectiveKey, L as ProtectionFlipRegistry, Ln as physicalIdShownBesideCommand, M as quotedRemedyLogicalId, Mn as UNSHOWABLE_VALUE, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as commandHole, Ot as hasCreatedBeforeFailure, Pt as replayMadeAnotherResource, Q as pasteableAwsCommand, Qn as markReplayMayCollide, Qt as ambientClientDefaults, R as compensateProtectionFlip, Rn as plainOrDescribed, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, U as protectionFlipKey, Ut as sanitizeRecoveryValue, Vn as shellQuote, Vt as formatLockOwner, Wt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Xn as isReplayedNameCollisionFrom, Yn as isRecreateRetryableError, Yt as producerRecordKey, Zt as withPasteableAwsProfile, _t as createMaskedLogSinks, ar as isRetryableTransientError, at as startInterruptWatch, bn as ResourceUpdateNotSupportedError, bt as maskDeep, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dr as markNonRetryable, en as clientDefaultsFor, er as formatRetryClassificationSignals, f as removalWarning, fr as markRedactedCause, ft as logicalIdShown, gt as stateOrphanRecordRemedy, hn as MalformedProducerRecordRefusalError, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CdkdError, ir as isIamPropagationError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as SHELL_ACTIVE_WHY, jt as markAuxiliaryFailure, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, ln as DynamicReferenceRegionAmbiguousError, lr as isMarkedNonRetryable, m as withoutInjectedRemovals, mn as MacroExpansionError, mt as resourceTypeShown, nn as AccountIdUnavailableError, nr as isAmbiguousOutcomeError, on as CrossAccountSecretRefusalError, or as isTransientServerError, ot as ElapsedBudgetRegistry, pn as LockError, pr as wrapMaskedAwsError, qn as isNameCollisionErrorFrom, rn as AssetError, sn as DependencyError, sr as retryClassificationText, st as monotonicNowMs, tn as credentialFingerprint, tr as isAmbiguousCcHandlerErrorCode, un as IntrinsicResolutionRefusalError, ur as isThrottlingError, ut as compositeIdSeparatorRefusal, vn as ProvisioningError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wn as SynthesisError, wt as carryCreatedBeforeFailure, xt as maskerOrIdentity, yn as ResourceTimeoutError, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as quotedOrDescribed, zt as formatLockExpiry } from "./iam-policy-targets-DFk7zr0Q.js";
|
|
4
4
|
import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-DBXBcg0J.js";
|
|
5
|
-
import { t as getCdkdVersion } from "./version-
|
|
5
|
+
import { t as getCdkdVersion } from "./version-CZbKGFSS.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";
|
|
@@ -2888,6 +2888,12 @@ const DOCKER_CLIENT_ENV_KEYS = /* @__PURE__ */ new Set([
|
|
|
2888
2888
|
"USERPROFILE",
|
|
2889
2889
|
"HOMEDRIVE",
|
|
2890
2890
|
"HOMEPATH",
|
|
2891
|
+
"COMSPEC",
|
|
2892
|
+
"SYSTEMROOT",
|
|
2893
|
+
"WINDIR",
|
|
2894
|
+
"SYSTEMDRIVE",
|
|
2895
|
+
"PSMODULEPATH",
|
|
2896
|
+
"PSEXECUTIONPOLICYPREFERENCE",
|
|
2891
2897
|
"DOCKER_HOST",
|
|
2892
2898
|
"DOCKER_CONTEXT",
|
|
2893
2899
|
"DOCKER_CONFIG",
|
|
@@ -3016,10 +3022,13 @@ const WELL_FORMED_ENV_KEY = /^[^=\0]+$/;
|
|
|
3016
3022
|
function isMalformedEnvKey(key) {
|
|
3017
3023
|
return !WELL_FORMED_ENV_KEY.test(key);
|
|
3018
3024
|
}
|
|
3019
|
-
function partitionSensitiveEnv(env, sensitiveKeys) {
|
|
3025
|
+
function partitionSensitiveEnv(env, sensitiveKeys, options = {}) {
|
|
3026
|
+
const platform = options.platform ?? process.platform;
|
|
3020
3027
|
const flags = [];
|
|
3021
3028
|
const sensitiveEnv = {};
|
|
3022
3029
|
const collisions = [];
|
|
3030
|
+
const names = platform === "win32" ? new Win32EnvNames(Object.keys(process.env)) : void 0;
|
|
3031
|
+
const ambiguous = [];
|
|
3023
3032
|
for (const [k, v] of Object.entries(env)) {
|
|
3024
3033
|
if (!sensitiveKeys.has(k)) {
|
|
3025
3034
|
flags.push("-e", `${k}=${v}`);
|
|
@@ -3029,19 +3038,73 @@ function partitionSensitiveEnv(env, sensitiveKeys) {
|
|
|
3029
3038
|
collisions.push(k);
|
|
3030
3039
|
continue;
|
|
3031
3040
|
}
|
|
3041
|
+
if (names) {
|
|
3042
|
+
if (names.lookup(k).ambiguous) {
|
|
3043
|
+
ambiguous.push(k);
|
|
3044
|
+
continue;
|
|
3045
|
+
}
|
|
3046
|
+
names.replace(k);
|
|
3047
|
+
}
|
|
3032
3048
|
flags.push("-e", k);
|
|
3033
3049
|
defineOwnKey(sensitiveEnv, k, v);
|
|
3034
3050
|
}
|
|
3051
|
+
if (ambiguous.length > 0) getLogger().warn((options.subject === void 0 ? "" : safeMsg`${options.subject}: `) + safeMsg`Sensitive env var(s) ${ambiguous.map((k) => displayIdent(k)).join(", ")} ` + "were NOT passed to the container. On Windows each matches another variable's name (in your environment or another secret) only through a letter-case difference outside A-Z, which cdkd does not treat as the same variable. Rename the secret if the container needs it.");
|
|
3052
|
+
if (names) warnCaseVariantSensitiveKeys(Object.keys(sensitiveEnv), options.subject);
|
|
3035
3053
|
return {
|
|
3036
3054
|
flags,
|
|
3037
3055
|
sensitiveEnv,
|
|
3038
3056
|
collisions
|
|
3039
3057
|
};
|
|
3040
3058
|
}
|
|
3041
|
-
function
|
|
3059
|
+
function warnCaseVariantSensitiveKeys(keys, subject) {
|
|
3060
|
+
const byUpper = /* @__PURE__ */ new Map();
|
|
3061
|
+
for (const k of keys) {
|
|
3062
|
+
const upper = asciiUpper(k);
|
|
3063
|
+
const group = byUpper.get(upper);
|
|
3064
|
+
if (group) group.push(k);
|
|
3065
|
+
else byUpper.set(upper, [k]);
|
|
3066
|
+
}
|
|
3067
|
+
for (const group of byUpper.values()) {
|
|
3068
|
+
if (group.length < 2) continue;
|
|
3069
|
+
getLogger().warn((subject === void 0 ? "" : safeMsg`${subject}: `) + safeMsg`Sensitive env vars ${group.map((k) => displayIdent(k)).join(", ")} differ only by letter case. ` + safeMsg`Windows treats them as one variable, so the container receives the value of ` + safeMsg`${displayIdent(group[group.length - 1])} under every one of these names. ` + `Rename them to distinct names if the container needs each value.`);
|
|
3070
|
+
}
|
|
3071
|
+
}
|
|
3072
|
+
function asciiUpper(name) {
|
|
3073
|
+
return name.replace(/[a-z]/g, (c) => c.toUpperCase());
|
|
3074
|
+
}
|
|
3075
|
+
var Win32EnvNames = class {
|
|
3076
|
+
groups = /* @__PURE__ */ new Map();
|
|
3077
|
+
constructor(names) {
|
|
3078
|
+
for (const name of names) {
|
|
3079
|
+
const key = name.toUpperCase();
|
|
3080
|
+
const group = this.groups.get(key);
|
|
3081
|
+
if (group) group.push(name);
|
|
3082
|
+
else this.groups.set(key, [name]);
|
|
3083
|
+
}
|
|
3084
|
+
}
|
|
3085
|
+
lookup(name) {
|
|
3086
|
+
const others = (this.groups.get(name.toUpperCase()) ?? []).filter((n) => n !== name);
|
|
3087
|
+
const folded = asciiUpper(name);
|
|
3088
|
+
return {
|
|
3089
|
+
aliases: others,
|
|
3090
|
+
ambiguous: others.some((n) => asciiUpper(n) !== folded)
|
|
3091
|
+
};
|
|
3092
|
+
}
|
|
3093
|
+
replace(name) {
|
|
3094
|
+
this.groups.set(name.toUpperCase(), [name]);
|
|
3095
|
+
}
|
|
3096
|
+
};
|
|
3097
|
+
function dockerSpawnEnvWithSensitive(sensitiveEnv, platform = process.platform) {
|
|
3042
3098
|
const env = { ...process.env };
|
|
3099
|
+
const names = platform === "win32" ? new Win32EnvNames(Object.keys(env)) : void 0;
|
|
3043
3100
|
for (const [k, v] of Object.entries(sensitiveEnv)) {
|
|
3044
3101
|
if (isMalformedEnvKey(k) || isDockerClientEnvKey(k)) continue;
|
|
3102
|
+
if (names) {
|
|
3103
|
+
const { aliases, ambiguous } = names.lookup(k);
|
|
3104
|
+
if (ambiguous) continue;
|
|
3105
|
+
for (const alias of aliases) delete env[alias];
|
|
3106
|
+
names.replace(k);
|
|
3107
|
+
}
|
|
3045
3108
|
defineOwnKey(env, k, v);
|
|
3046
3109
|
}
|
|
3047
3110
|
return env;
|
|
@@ -7672,6 +7735,40 @@ function positionByCrossStackSource(bag, source, secrets) {
|
|
|
7672
7735
|
return certifiedExpressionForLeaf(secrets, association, bag);
|
|
7673
7736
|
}
|
|
7674
7737
|
|
|
7738
|
+
//#endregion
|
|
7739
|
+
//#region src/deployment/secret-redaction/resolver-outcomes.ts
|
|
7740
|
+
const CONFLICTING = Symbol("cdkd.resolver-outcome.conflicting");
|
|
7741
|
+
const takenBranches = /* @__PURE__ */ new WeakMap();
|
|
7742
|
+
function recordTakenIfBranch(secrets, source, tookTrueBranch) {
|
|
7743
|
+
let taken = takenBranches.get(secrets);
|
|
7744
|
+
if (taken === void 0) {
|
|
7745
|
+
taken = /* @__PURE__ */ new WeakMap();
|
|
7746
|
+
takenBranches.set(secrets, taken);
|
|
7747
|
+
}
|
|
7748
|
+
const previous = taken.get(source);
|
|
7749
|
+
if (previous === void 0) taken.set(source, tookTrueBranch);
|
|
7750
|
+
else if (previous !== tookTrueBranch) taken.set(source, CONFLICTING);
|
|
7751
|
+
}
|
|
7752
|
+
function takenIfBranchOf(secrets, source) {
|
|
7753
|
+
const taken = takenBranches.get(secrets)?.get(source);
|
|
7754
|
+
return taken === CONFLICTING ? void 0 : taken;
|
|
7755
|
+
}
|
|
7756
|
+
const droppedElements = /* @__PURE__ */ new WeakMap();
|
|
7757
|
+
function recordDroppedArrayElements(secrets, source, dropped) {
|
|
7758
|
+
let arrays = droppedElements.get(secrets);
|
|
7759
|
+
if (arrays === void 0) {
|
|
7760
|
+
arrays = /* @__PURE__ */ new WeakMap();
|
|
7761
|
+
droppedElements.set(secrets, arrays);
|
|
7762
|
+
}
|
|
7763
|
+
const previous = arrays.get(source);
|
|
7764
|
+
if (previous === void 0) arrays.set(source, [...dropped]);
|
|
7765
|
+
else if (previous !== CONFLICTING && (previous.length !== dropped.length || previous.some((index, i) => index !== dropped[i]))) arrays.set(source, CONFLICTING);
|
|
7766
|
+
}
|
|
7767
|
+
function droppedArrayElementsOf(secrets, source) {
|
|
7768
|
+
const dropped = droppedElements.get(secrets)?.get(source);
|
|
7769
|
+
return dropped === CONFLICTING ? void 0 : dropped;
|
|
7770
|
+
}
|
|
7771
|
+
|
|
7675
7772
|
//#endregion
|
|
7676
7773
|
//#region src/deployment/secret-redaction/physical-name-copies.ts
|
|
7677
7774
|
const physicalNameCopiesOf = /* @__PURE__ */ new WeakMap();
|
|
@@ -8148,7 +8245,9 @@ function evaluatePureRead(node, bind, split, choose, depth = 0) {
|
|
|
8148
8245
|
}
|
|
8149
8246
|
if (key === "Fn::If") {
|
|
8150
8247
|
if (!Array.isArray(args) || args.length !== 3 || typeof args[0] !== "string") return void 0;
|
|
8151
|
-
|
|
8248
|
+
const tookTrue = choose(args[0], node);
|
|
8249
|
+
if (tookTrue === void 0) return void 0;
|
|
8250
|
+
return evaluate(tookTrue ? args[1] : args[2]);
|
|
8152
8251
|
}
|
|
8153
8252
|
if (key === "Fn::Sub") return evaluatePureSub(args, bind, evaluate);
|
|
8154
8253
|
if (!Array.isArray(args) || args.length !== 2) return void 0;
|
|
@@ -8228,17 +8327,56 @@ function rendersReadTo(spelling, parentSecrets, value) {
|
|
|
8228
8327
|
return false;
|
|
8229
8328
|
}
|
|
8230
8329
|
const REREAD_UNBOUND = Symbol("cdkd.reread.unbound");
|
|
8231
|
-
|
|
8330
|
+
const REREAD_PARAMETER_FREE = Symbol("cdkd.reread.parameter-free");
|
|
8331
|
+
function diffSideReading(bind, parentSecrets) {
|
|
8332
|
+
return {
|
|
8333
|
+
bind: (name) => {
|
|
8334
|
+
const bound = bind(name);
|
|
8335
|
+
return bound && { value: redactInheritedParameterValue(parentSecrets, name, bound.value) };
|
|
8336
|
+
},
|
|
8337
|
+
split: (text, delimiter) => splitOutsideDynamicReferences(text, delimiter, (token) => standsForInheritedSecret(parentSecrets, token))
|
|
8338
|
+
};
|
|
8339
|
+
}
|
|
8340
|
+
function rereadUnder(source, bind, parentSecrets, choose) {
|
|
8341
|
+
const resolved = evaluatePureRead(source, bind, plainSplit, choose);
|
|
8342
|
+
if (resolved === void 0) return void 0;
|
|
8343
|
+
const diffSide = diffSideReading(bind, parentSecrets);
|
|
8344
|
+
const redacted = evaluatePureRead(source, diffSide.bind, diffSide.split, choose);
|
|
8345
|
+
if (redacted === void 0) return void 0;
|
|
8346
|
+
if (resolved.value === REREAD_NO_VALUE || redacted.value === REREAD_NO_VALUE) return resolved.value === redacted.value ? REREAD_NO_VALUE : void 0;
|
|
8347
|
+
if (!rendersReadTo(redacted.value, parentSecrets, resolved.value)) return void 0;
|
|
8348
|
+
return {
|
|
8349
|
+
resolved: resolved.value,
|
|
8350
|
+
redacted: redacted.value
|
|
8351
|
+
};
|
|
8352
|
+
}
|
|
8353
|
+
function namesParameterOnBranches(node, choose, isParameter, depth = 0) {
|
|
8354
|
+
if (depth > MAX_REREAD_DEPTH) return true;
|
|
8355
|
+
if (typeof node === "string") return node.includes("{{resolve:");
|
|
8356
|
+
if (Array.isArray(node)) return node.some((element) => namesParameterOnBranches(element, choose, isParameter, depth + 1));
|
|
8357
|
+
if (!isPlainObject$7(node)) return false;
|
|
8358
|
+
if (Object.hasOwn(node, "Fn::If")) {
|
|
8359
|
+
const args = node["Fn::If"];
|
|
8360
|
+
if (Object.keys(node).length !== 1) return true;
|
|
8361
|
+
if (!Array.isArray(args) || args.length !== 3 || typeof args[0] !== "string") return true;
|
|
8362
|
+
const tookTrue = choose(args[0], node);
|
|
8363
|
+
if (tookTrue === void 0) return true;
|
|
8364
|
+
return namesParameterOnBranches(tookTrue ? args[1] : args[2], choose, isParameter, depth + 1);
|
|
8365
|
+
}
|
|
8366
|
+
if (typeof node["Ref"] === "string" && isParameter(node["Ref"])) return true;
|
|
8367
|
+
const sub = node["Fn::Sub"];
|
|
8368
|
+
const text = typeof sub === "string" ? sub : Array.isArray(sub) ? sub[0] : void 0;
|
|
8369
|
+
if (typeof text === "string") {
|
|
8370
|
+
for (const match of text.matchAll(/\$\{([^}!][^}]*)\}/g)) if (isParameter(match[1].trim()) || isParameter(match[1])) return true;
|
|
8371
|
+
}
|
|
8372
|
+
return Object.values(node).some((child) => namesParameterOnBranches(child, choose, isParameter, depth + 1));
|
|
8373
|
+
}
|
|
8374
|
+
function rereadAssignments(source, bind, parentSecrets, untakenWhenUnbound = () => false, parameterFree) {
|
|
8232
8375
|
if (!holdsRereadTrigger(source)) return void 0;
|
|
8233
8376
|
const conditions = /* @__PURE__ */ new Set();
|
|
8234
8377
|
if (!collectRereadConditions(source, conditions)) return void 0;
|
|
8235
8378
|
if (conditions.size > MAX_REREAD_CONDITIONS) return void 0;
|
|
8236
8379
|
const names = [...conditions];
|
|
8237
|
-
const redactedBind = (name) => {
|
|
8238
|
-
const bound = bind(name);
|
|
8239
|
-
return bound && { value: redactInheritedParameterValue(parentSecrets, name, bound.value) };
|
|
8240
|
-
};
|
|
8241
|
-
const tokenSplit = (text, delimiter) => splitOutsideDynamicReferences(text, delimiter, (token) => standsForInheritedSecret(parentSecrets, token));
|
|
8242
8380
|
const out = [];
|
|
8243
8381
|
for (let assignment = 0; assignment < 2 ** names.length; assignment++) {
|
|
8244
8382
|
const choose = (condition) => Math.floor(assignment / 2 ** names.indexOf(condition)) % 2 === 1;
|
|
@@ -8248,25 +8386,18 @@ function rereadAssignments(source, bind, parentSecrets, untakenWhenUnbound = ()
|
|
|
8248
8386
|
if (bound === void 0 && untakenWhenUnbound(name)) unbound = true;
|
|
8249
8387
|
return bound;
|
|
8250
8388
|
};
|
|
8251
|
-
const
|
|
8252
|
-
const redacted = resolved && evaluatePureRead(source, redactedBind, tokenSplit, choose);
|
|
8389
|
+
const reread = rereadUnder(source, tracked, parentSecrets, choose);
|
|
8253
8390
|
if (unbound) out.push(REREAD_UNBOUND);
|
|
8254
|
-
else if (
|
|
8255
|
-
else if (
|
|
8256
|
-
else
|
|
8257
|
-
else out.push({
|
|
8258
|
-
resolved: resolved.value,
|
|
8259
|
-
redacted: redacted.value
|
|
8260
|
-
});
|
|
8391
|
+
else if (reread !== void 0) out.push(reread);
|
|
8392
|
+
else if (parameterFree !== void 0 && !namesParameterOnBranches(source, choose, parameterFree)) out.push(REREAD_PARAMETER_FREE);
|
|
8393
|
+
else out.push(void 0);
|
|
8261
8394
|
}
|
|
8262
8395
|
return out;
|
|
8263
8396
|
}
|
|
8264
8397
|
function rereadParameterExpression(source, bind, parentSecrets) {
|
|
8265
|
-
const assignments = rereadAssignments(source, bind, parentSecrets);
|
|
8398
|
+
const assignments = rereadAssignments(source, bind, parentSecrets, void 0, (name) => bind(name) !== void 0);
|
|
8266
8399
|
if (assignments === void 0 || assignments.includes(void 0) || assignments.includes(REREAD_UNBOUND)) return;
|
|
8267
|
-
|
|
8268
|
-
if (rereads.length === 0 || ambiguousRereads(rereads)) return void 0;
|
|
8269
|
-
return rereads[0];
|
|
8400
|
+
return assignments.find((entry) => entry !== void 0 && entry !== REREAD_NO_VALUE && entry !== REREAD_UNBOUND && entry !== REREAD_PARAMETER_FREE);
|
|
8270
8401
|
}
|
|
8271
8402
|
function ambiguousRereads(rereads) {
|
|
8272
8403
|
return rereads.some((a, i) => rereads.slice(i + 1).some((b) => deepEqualJsonValue(a.resolved, b.resolved) && !deepEqualJsonValue(a.redacted, b.redacted)));
|
|
@@ -8275,13 +8406,27 @@ function positionByParameterReread(bag, source, secrets) {
|
|
|
8275
8406
|
const reads = inheritedParameterReads.get(secrets);
|
|
8276
8407
|
if (reads === void 0 || typeof reads === "symbol") return void 0;
|
|
8277
8408
|
if (typeof bag !== "string" && !Array.isArray(bag)) return void 0;
|
|
8278
|
-
|
|
8279
|
-
const
|
|
8280
|
-
|
|
8281
|
-
const
|
|
8282
|
-
|
|
8409
|
+
if (!holdsRereadTrigger(source)) return void 0;
|
|
8410
|
+
const bind = (name) => reads.values.has(name) ? { value: reads.values.get(name) } : void 0;
|
|
8411
|
+
let unrecorded = false;
|
|
8412
|
+
const recorded = rereadUnder(source, bind, reads.parent, (_, node) => {
|
|
8413
|
+
const taken = takenIfBranchOf(secrets, node);
|
|
8414
|
+
if (taken === void 0) unrecorded = true;
|
|
8415
|
+
return taken;
|
|
8416
|
+
});
|
|
8417
|
+
let answer;
|
|
8418
|
+
if (!unrecorded) {
|
|
8419
|
+
if (recorded === void 0 || recorded === REREAD_NO_VALUE || !deepEqualJsonValue(recorded.resolved, bag)) return;
|
|
8420
|
+
answer = recorded.redacted;
|
|
8421
|
+
} else {
|
|
8422
|
+
const declared = reads.declared;
|
|
8423
|
+
const assignments = rereadAssignments(source, bind, reads.parent, (name) => declared?.has(name) === true);
|
|
8424
|
+
if (assignments === void 0 || assignments.includes(void 0)) return void 0;
|
|
8425
|
+
const matching = assignments.filter((entry) => entry !== void 0 && entry !== REREAD_NO_VALUE && entry !== REREAD_UNBOUND && entry !== REREAD_PARAMETER_FREE && deepEqualJsonValue(entry.resolved, bag));
|
|
8426
|
+
if (matching.length === 0 || ambiguousRereads(matching)) return void 0;
|
|
8427
|
+
answer = matching[0].redacted;
|
|
8428
|
+
}
|
|
8283
8429
|
if (carriesChildOnlyPlaintext(bag, secrets, reads.parent)) return void 0;
|
|
8284
|
-
const answer = matching[0].redacted;
|
|
8285
8430
|
if (!deepEqualJsonValue(redactSecretsForState(answer, secrets), answer)) return void 0;
|
|
8286
8431
|
return answer;
|
|
8287
8432
|
}
|
|
@@ -8542,7 +8687,12 @@ function arrayElementDrop(element, depth = 0) {
|
|
|
8542
8687
|
if (branches.every((branch) => branch === "always")) return "always";
|
|
8543
8688
|
return "maybe";
|
|
8544
8689
|
}
|
|
8545
|
-
function sourceElementsKeptFor(source, bagLength) {
|
|
8690
|
+
function sourceElementsKeptFor(source, bagLength, secrets) {
|
|
8691
|
+
const recorded = secrets && droppedArrayElementsOf(secrets, source);
|
|
8692
|
+
if (recorded !== void 0) {
|
|
8693
|
+
if (source.length - recorded.length !== bagLength) return void 0;
|
|
8694
|
+
return source.filter((_, i) => !recorded.includes(i));
|
|
8695
|
+
}
|
|
8546
8696
|
const drops = source.map((element) => arrayElementDrop(element));
|
|
8547
8697
|
if (drops.includes("unknown")) return void 0;
|
|
8548
8698
|
const always = drops.filter((drop) => drop === "always").length;
|
|
@@ -8587,8 +8737,7 @@ function corroboratesWhateverResolves(source, depth = 0) {
|
|
|
8587
8737
|
}
|
|
8588
8738
|
function arrayPairsWhateverDrops(source) {
|
|
8589
8739
|
if (!source.some((element) => isPlainObject$7(element) && (Object.hasOwn(element, "Fn::If") || element["Ref"] === "AWS::NoValue" || Array.isArray(element["Fn::FindInMap"]) && element["Fn::FindInMap"].length > 3))) return true;
|
|
8590
|
-
|
|
8591
|
-
return !drops.includes("unknown") && drops.filter((drop) => drop === "maybe").length <= 1 && source.every((element) => corroboratesWhateverResolves(element));
|
|
8740
|
+
return source.every((element) => corroboratesWhateverResolves(element));
|
|
8592
8741
|
}
|
|
8593
8742
|
function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
|
|
8594
8743
|
if (isDynamicReferenceString(source) && typeof bag === "string") {
|
|
@@ -8645,7 +8794,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
|
|
|
8645
8794
|
}
|
|
8646
8795
|
if (rules.descendArrays && bag.length === source.length) return bag.map((item, i) => redactByPath(item, source[i], secrets, rules, secretExpressions, bagIsSameGeneration));
|
|
8647
8796
|
if (rules.descendArrays && bag.length < source.length) {
|
|
8648
|
-
const kept = sourceElementsKeptFor(source, bag.length);
|
|
8797
|
+
const kept = sourceElementsKeptFor(source, bag.length, secrets);
|
|
8649
8798
|
if (kept !== void 0 && keptLiteralsCorroborate(kept, bag, secrets)) return bag.map((item, i) => redactByPath(item, kept[i], secrets, rules, secretExpressions, bagIsSameGeneration));
|
|
8650
8799
|
}
|
|
8651
8800
|
}
|
|
@@ -22925,6 +23074,271 @@ async function resolveSub(subArgs, context, source) {
|
|
|
22925
23074
|
return result;
|
|
22926
23075
|
}
|
|
22927
23076
|
|
|
23077
|
+
//#endregion
|
|
23078
|
+
//#region src/deployment/intrinsic-resolver/parameter-secrets.ts
|
|
23079
|
+
function recordInheritedParameterSecrets(parameterName, value, context) {
|
|
23080
|
+
const inherited = context.inheritedSecrets;
|
|
23081
|
+
const recorded = context.recordedSecretValues;
|
|
23082
|
+
if (inherited && recorded) carryLogOnlyValuesCarriedBy(inherited, recorded, value);
|
|
23083
|
+
if (recorded) carryPhysicalNameCopiesCarriedBy(context, recorded, value);
|
|
23084
|
+
if (inherited && recorded) recordInheritedNoEchoListElements(this, inherited, recorded, value, context);
|
|
23085
|
+
if (!inherited || inherited.size === 0 || !recorded) return;
|
|
23086
|
+
const mirror = parameterReadMirrors.get(recorded);
|
|
23087
|
+
const declared = declaredParameterNames(context);
|
|
23088
|
+
recordInheritedParameterValue(recorded, inherited, parameterName, value, declared);
|
|
23089
|
+
if (mirror) recordInheritedParameterValue(mirror, inherited, parameterName, value, declared);
|
|
23090
|
+
for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
23091
|
+
const carried = carriedExpressionFor(inherited, parameterName, value, plaintext, expression);
|
|
23092
|
+
recorded.set(plaintext, carried);
|
|
23093
|
+
const parentEntry = context.inheritedReferenceProvenance?.get(carried);
|
|
23094
|
+
if (parentEntry !== void 0) recordReferenceProvenanceEntry(recorded, carried, parentEntry, "read");
|
|
23095
|
+
recordInheritedParameterRead(recorded, inherited, parameterName);
|
|
23096
|
+
if (mirror) recordInheritedParameterRead(mirror, inherited, parameterName);
|
|
23097
|
+
carryFreshNoEchoMark(inherited, recorded, plaintext);
|
|
23098
|
+
}
|
|
23099
|
+
}
|
|
23100
|
+
function declaredParameterNames(context) {
|
|
23101
|
+
const declared = context.template?.Parameters;
|
|
23102
|
+
if (declared === null || typeof declared !== "object") return void 0;
|
|
23103
|
+
let names = declaredNamesCache.get(declared);
|
|
23104
|
+
if (names === void 0) {
|
|
23105
|
+
names = new Set(Object.keys(declared));
|
|
23106
|
+
declaredNamesCache.set(declared, names);
|
|
23107
|
+
}
|
|
23108
|
+
return names;
|
|
23109
|
+
}
|
|
23110
|
+
const declaredNamesCache = /* @__PURE__ */ new WeakMap();
|
|
23111
|
+
const parameterReadMirrors = /* @__PURE__ */ new WeakMap();
|
|
23112
|
+
function mirrorInheritedParameterReads(passSecrets, persistSecrets) {
|
|
23113
|
+
if (passSecrets !== persistSecrets) parameterReadMirrors.set(passSecrets, persistSecrets);
|
|
23114
|
+
}
|
|
23115
|
+
function recordTakenIfBranchIn(context, source, tookTrueBranch) {
|
|
23116
|
+
if (!context.inheritedSecrets || context.inheritedSecrets.size === 0) return;
|
|
23117
|
+
const recorded = context.recordedSecretValues;
|
|
23118
|
+
if (recorded === void 0) return;
|
|
23119
|
+
recordTakenIfBranch(recorded, source, tookTrueBranch);
|
|
23120
|
+
const mirror = parameterReadMirrors.get(recorded);
|
|
23121
|
+
if (mirror) recordTakenIfBranch(mirror, source, tookTrueBranch);
|
|
23122
|
+
}
|
|
23123
|
+
function recordDroppedArrayElementsIn(context, source, dropped) {
|
|
23124
|
+
const recorded = context.recordedSecretValues;
|
|
23125
|
+
if (recorded === void 0) return;
|
|
23126
|
+
recordDroppedArrayElements(recorded, source, dropped);
|
|
23127
|
+
const mirror = parameterReadMirrors.get(recorded);
|
|
23128
|
+
if (mirror) recordDroppedArrayElements(mirror, source, dropped);
|
|
23129
|
+
}
|
|
23130
|
+
function carryPhysicalNameCopiesCarriedBy(context, recorded, value) {
|
|
23131
|
+
const names = context.inheritedPhysicalNameCopies ?? (context.inheritedSecrets && physicalNameCopiesOf.get(context.inheritedSecrets));
|
|
23132
|
+
if (names === void 0 || names.size === 0) return;
|
|
23133
|
+
const leaves = [...wholeStringLeavesOf(value)];
|
|
23134
|
+
for (const name of names) if (leaves.some((leaf) => leaf.includes(name))) recordPhysicalNameCopy(recorded, name);
|
|
23135
|
+
}
|
|
23136
|
+
function carriedExpressionFor(inherited, parameterName, value, plaintext, survivor) {
|
|
23137
|
+
const own = inheritedParameterExpression(inherited, parameterName, plaintext);
|
|
23138
|
+
if (typeof own === "string") return own;
|
|
23139
|
+
return inheritedRenderedToken(inherited, parameterName, value, plaintext) ?? survivor;
|
|
23140
|
+
}
|
|
23141
|
+
function poisonRenderedSpellingsCollidingIn(template, parameterValues, inherited) {
|
|
23142
|
+
if (!inherited || inherited.size === 0 || template === void 0) return;
|
|
23143
|
+
const names = new Set(Object.keys(parameterValues));
|
|
23144
|
+
if (names.size < 2) return;
|
|
23145
|
+
const groups = [];
|
|
23146
|
+
if (template.Resources !== null && typeof template.Resources === "object") for (const resource of Object.values(template.Resources)) groups.push([{
|
|
23147
|
+
node: resource,
|
|
23148
|
+
mode: "resource"
|
|
23149
|
+
}]);
|
|
23150
|
+
if (template.Outputs !== void 0) groups.push(outputsGroupParts(template.Outputs));
|
|
23151
|
+
const bind = (name) => Object.hasOwn(parameterValues, name) ? { value: parameterValues[name] } : void 0;
|
|
23152
|
+
const withdrawn = /* @__PURE__ */ new Set();
|
|
23153
|
+
for (;;) {
|
|
23154
|
+
const fresh = [...collidingRenderedNames(groups.map((parts) => {
|
|
23155
|
+
const reads = /* @__PURE__ */ new Map();
|
|
23156
|
+
for (const { node, mode } of parts) {
|
|
23157
|
+
const reread = mode === "slot" ? void 0 : {
|
|
23158
|
+
bind,
|
|
23159
|
+
inherited
|
|
23160
|
+
};
|
|
23161
|
+
for (const [name, slotRead] of parameterReadsOf(node, names, reread, mode !== "output")) reads.set(name, slotRead || reads.get(name) === true);
|
|
23162
|
+
}
|
|
23163
|
+
return reads;
|
|
23164
|
+
}).filter((reads) => reads.size >= 2), parameterValues, inherited)].filter((name) => !withdrawn.has(name));
|
|
23165
|
+
if (fresh.length === 0) return;
|
|
23166
|
+
for (const name of fresh) {
|
|
23167
|
+
withdrawn.add(name);
|
|
23168
|
+
withdrawRenderedParameterSpelling(inherited, name);
|
|
23169
|
+
}
|
|
23170
|
+
}
|
|
23171
|
+
}
|
|
23172
|
+
function collidingRenderedNames(readsByGroup, parameterValues, inherited) {
|
|
23173
|
+
const withdraw = /* @__PURE__ */ new Set();
|
|
23174
|
+
for (const reads of readsByGroup) {
|
|
23175
|
+
const byPlaintext = /* @__PURE__ */ new Map();
|
|
23176
|
+
const slotReadPlaintexts = /* @__PURE__ */ new Set();
|
|
23177
|
+
for (const [name, slotRead] of reads) {
|
|
23178
|
+
if (!Object.hasOwn(parameterValues, name)) continue;
|
|
23179
|
+
const value = parameterValues[name];
|
|
23180
|
+
for (const [plaintext, survivor] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
23181
|
+
const expression = carriedExpressionFor(inherited, name, value, plaintext, survivor);
|
|
23182
|
+
const rendered = typeof inheritedParameterExpression(inherited, name, plaintext) !== "string" && inheritedRenderedToken(inherited, name, value, plaintext) !== void 0;
|
|
23183
|
+
let byExpression = byPlaintext.get(plaintext);
|
|
23184
|
+
if (byExpression === void 0) {
|
|
23185
|
+
byExpression = /* @__PURE__ */ new Map();
|
|
23186
|
+
byPlaintext.set(plaintext, byExpression);
|
|
23187
|
+
}
|
|
23188
|
+
let renderedNames = byExpression.get(expression);
|
|
23189
|
+
if (renderedNames === void 0) {
|
|
23190
|
+
renderedNames = [];
|
|
23191
|
+
byExpression.set(expression, renderedNames);
|
|
23192
|
+
}
|
|
23193
|
+
if (rendered) renderedNames.push(name);
|
|
23194
|
+
if (slotRead) slotReadPlaintexts.add(plaintext);
|
|
23195
|
+
}
|
|
23196
|
+
}
|
|
23197
|
+
for (const [plaintext, byExpression] of byPlaintext) {
|
|
23198
|
+
if (byExpression.size < 2 || !slotReadPlaintexts.has(plaintext)) continue;
|
|
23199
|
+
for (const renderedNames of byExpression.values()) for (const name of renderedNames) withdraw.add(name);
|
|
23200
|
+
}
|
|
23201
|
+
}
|
|
23202
|
+
return withdraw;
|
|
23203
|
+
}
|
|
23204
|
+
const POSITIONED_INTRINSICS = /* @__PURE__ */ new Set(["Fn::Join", "Fn::Sub"]);
|
|
23205
|
+
function parameterReadsOf(node, names, reread, positionsArrays) {
|
|
23206
|
+
const reads = /* @__PURE__ */ new Map();
|
|
23207
|
+
const add = (name, slotRead) => {
|
|
23208
|
+
reads.set(name, slotRead || reads.get(name) === true);
|
|
23209
|
+
};
|
|
23210
|
+
const visit = (value, slotRead, atLeaf) => {
|
|
23211
|
+
if (Array.isArray(value)) {
|
|
23212
|
+
const mayShrink = atLeaf ? !positionsArrays || !arrayPairsWhateverDrops(value) : value.some((element) => element !== null && typeof element === "object" && !Array.isArray(element) && (Object.hasOwn(element, "Fn::If") || element["Ref"] === "AWS::NoValue"));
|
|
23213
|
+
for (const element of value) visit(element, slotRead || mayShrink, atLeaf && !mayShrink);
|
|
23214
|
+
return;
|
|
23215
|
+
}
|
|
23216
|
+
if (value === null || typeof value !== "object") return;
|
|
23217
|
+
const record = value;
|
|
23218
|
+
const intrinsic = Object.keys(record).some((key) => key === "Ref" || key.startsWith("Fn::"));
|
|
23219
|
+
if (intrinsic && atLeaf && reread !== void 0 && rereadParameterExpression(record, reread.bind, reread.inherited) !== void 0) {
|
|
23220
|
+
for (const name of refNamesIn(record, names)) add(name, false);
|
|
23221
|
+
return;
|
|
23222
|
+
}
|
|
23223
|
+
const ref = record["Ref"];
|
|
23224
|
+
if (typeof ref === "string" && names.has(ref)) add(ref, slotRead);
|
|
23225
|
+
const placeholderSlot = !positionsArrays && unkeyedPlaceholderParts(record, (name) => certifiesPlaceholder(name, reread)) > MAX_UNKEYED_PARTS;
|
|
23226
|
+
const sub = record["Fn::Sub"];
|
|
23227
|
+
const text = typeof sub === "string" ? sub : Array.isArray(sub) ? sub[0] : void 0;
|
|
23228
|
+
if (typeof text === "string") for (const match of text.matchAll(/\$\{([^}!][^}]*)\}/g)) {
|
|
23229
|
+
const name = match[1].trim();
|
|
23230
|
+
if (names.has(name)) add(name, slotRead || placeholderSlot);
|
|
23231
|
+
}
|
|
23232
|
+
for (const [key, child] of Object.entries(record)) visit(child, slotRead || placeholderSlot || key.startsWith("Fn::") && !POSITIONED_INTRINSICS.has(key), atLeaf && !intrinsic);
|
|
23233
|
+
};
|
|
23234
|
+
visit(node, reread === void 0, true);
|
|
23235
|
+
return reads;
|
|
23236
|
+
}
|
|
23237
|
+
const MAX_UNKEYED_PARTS = 1;
|
|
23238
|
+
function certifiesPlaceholder(name, reread) {
|
|
23239
|
+
if (reread === void 0) return false;
|
|
23240
|
+
const bound = reread.bind(name);
|
|
23241
|
+
if (bound === void 0) return false;
|
|
23242
|
+
if (inheritedSecretsCarriedBy(bound.value, reread.inherited).length === 0) return false;
|
|
23243
|
+
return typeof inheritedParameterExpression(reread.inherited, name, bound.value) === "string";
|
|
23244
|
+
}
|
|
23245
|
+
function unkeyedPlaceholderParts(record, certified) {
|
|
23246
|
+
const keyed = (value) => typeof value === "string" || value !== null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 1 && typeof value["Ref"] === "string" && certified(value["Ref"]);
|
|
23247
|
+
if (Object.hasOwn(record, "Fn::Join")) {
|
|
23248
|
+
const args = record["Fn::Join"];
|
|
23249
|
+
if (!Array.isArray(args) || args.length !== 2 || !Array.isArray(args[1])) return Number.POSITIVE_INFINITY;
|
|
23250
|
+
return args[1].filter((part) => !keyed(part)).length;
|
|
23251
|
+
}
|
|
23252
|
+
if (Object.hasOwn(record, "Fn::Sub")) {
|
|
23253
|
+
const args = record["Fn::Sub"];
|
|
23254
|
+
const [template, variables] = typeof args === "string" ? [args, {}] : Array.isArray(args) ? [args[0], args[1]] : [];
|
|
23255
|
+
if (typeof template !== "string" || variables === null || typeof variables !== "object") return Number.POSITIVE_INFINITY;
|
|
23256
|
+
let unkeyed = 0;
|
|
23257
|
+
for (const hit of template.matchAll(/\$\{(!)?([^}]*)\}/g)) {
|
|
23258
|
+
const name = hit[2] ?? "";
|
|
23259
|
+
if (hit[1] === "!" || name === "") continue;
|
|
23260
|
+
if (!(Object.hasOwn(variables, name) ? keyed(variables[name]) : certified(name))) unkeyed += 1;
|
|
23261
|
+
}
|
|
23262
|
+
return unkeyed;
|
|
23263
|
+
}
|
|
23264
|
+
return 0;
|
|
23265
|
+
}
|
|
23266
|
+
function outputsGroupParts(outputs) {
|
|
23267
|
+
if (outputs === null || typeof outputs !== "object" || Array.isArray(outputs)) return [{
|
|
23268
|
+
node: outputs,
|
|
23269
|
+
mode: "slot"
|
|
23270
|
+
}];
|
|
23271
|
+
const parts = [];
|
|
23272
|
+
for (const output of Object.values(outputs)) {
|
|
23273
|
+
if (output === null || typeof output !== "object" || Array.isArray(output)) {
|
|
23274
|
+
parts.push({
|
|
23275
|
+
node: output,
|
|
23276
|
+
mode: "slot"
|
|
23277
|
+
});
|
|
23278
|
+
continue;
|
|
23279
|
+
}
|
|
23280
|
+
const { Value: value, ...rest } = output;
|
|
23281
|
+
parts.push({
|
|
23282
|
+
node: value,
|
|
23283
|
+
mode: "output"
|
|
23284
|
+
}, {
|
|
23285
|
+
node: rest,
|
|
23286
|
+
mode: "slot"
|
|
23287
|
+
});
|
|
23288
|
+
}
|
|
23289
|
+
return parts;
|
|
23290
|
+
}
|
|
23291
|
+
function refNamesIn(node, names) {
|
|
23292
|
+
const found = /* @__PURE__ */ new Set();
|
|
23293
|
+
const visit = (value) => {
|
|
23294
|
+
if (Array.isArray(value)) {
|
|
23295
|
+
for (const element of value) visit(element);
|
|
23296
|
+
return;
|
|
23297
|
+
}
|
|
23298
|
+
if (value === null || typeof value !== "object") return;
|
|
23299
|
+
const record = value;
|
|
23300
|
+
if (typeof record["Ref"] === "string" && names.has(record["Ref"])) found.add(record["Ref"]);
|
|
23301
|
+
const sub = record["Fn::Sub"];
|
|
23302
|
+
const text = typeof sub === "string" ? sub : Array.isArray(sub) ? sub[0] : void 0;
|
|
23303
|
+
if (typeof text === "string") for (const match of text.matchAll(/\$\{([^}!][^}]*)\}/g)) {
|
|
23304
|
+
const name = match[1].trim();
|
|
23305
|
+
if (names.has(name)) found.add(name);
|
|
23306
|
+
}
|
|
23307
|
+
for (const child of Object.values(record)) visit(child);
|
|
23308
|
+
};
|
|
23309
|
+
visit(node);
|
|
23310
|
+
return found;
|
|
23311
|
+
}
|
|
23312
|
+
function recordInheritedNoEchoListElements(resolver, inherited, recorded, value, context) {
|
|
23313
|
+
if (!Array.isArray(value)) return;
|
|
23314
|
+
const parameterValues = [...inherited.keys()].filter((plaintext) => isNoEchoParameterPlaintext(inherited, plaintext));
|
|
23315
|
+
if (parameterValues.length === 0) return;
|
|
23316
|
+
const joined = value.map((element) => String(element)).join(",");
|
|
23317
|
+
const normalized = (plaintext) => plaintext.split(",").map((piece) => piece.trim()).join(",");
|
|
23318
|
+
if (!parameterValues.some((plaintext) => `,${normalized(plaintext)},`.includes(`,${joined},`))) return;
|
|
23319
|
+
for (const element of value) {
|
|
23320
|
+
if (typeof element !== "string" || element.length < 4) continue;
|
|
23321
|
+
recordNoEchoParameterFreshValue(element, recorded, resolver.publicNoEchoTokens(context));
|
|
23322
|
+
}
|
|
23323
|
+
}
|
|
23324
|
+
function recordNoEchoParameterValue(paramDef, value, context) {
|
|
23325
|
+
const bag = context.recordedSecretValues;
|
|
23326
|
+
if (!declaresNoEcho(paramDef) || bag === void 0) return;
|
|
23327
|
+
recordLogOnlyParameterValue(bag, value);
|
|
23328
|
+
recordNoEchoParameterFreshValue(value, bag, this.publicNoEchoTokens(context));
|
|
23329
|
+
}
|
|
23330
|
+
function refuseCoercedInheritedSecret(name, paramDef, userValue, inherited) {
|
|
23331
|
+
if (!inherited || inherited.size === 0) return;
|
|
23332
|
+
const secretPairs = new Map([...inherited].filter(([plaintext]) => !isNoEchoParameterPlaintext(inherited, plaintext)));
|
|
23333
|
+
if (secretPairs.size === 0) return;
|
|
23334
|
+
const carriedBefore = inheritedSecretsCarriedBy(userValue, secretPairs).length;
|
|
23335
|
+
if (carriedBefore === 0) return;
|
|
23336
|
+
if (inheritedSecretsCarriedBy(this.coerceParameterValue(userValue, paramDef.Type), secretPairs).length >= carriedBefore) return;
|
|
23337
|
+
const loggedName = this.displayMasked(name);
|
|
23338
|
+
const loggedType = this.displayMasked(paramDef.Type);
|
|
23339
|
+
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Nested-stack parameter ${quotedRender(loggedName, "'")} is declared ${QUOTABLE_RENDER.test(loggedType) ? `'Type: ${loggedType}'` : "with a Type that is not a plain identifier"}, but the parent stack resolved a SECRET dynamic reference into it. cdkd keeps a resolved secret out of persisted state by rewriting STRING leaves back to their {{resolve:...}} expression; coercing this value to ${quotedRender(loggedType, "'", "that Type")} destroys the plaintext cdkd would have matched on, so the DECRYPTED secret would be left in the child stack's state.json with nothing to redact it back to. Declare ${quotedRender(loggedName, "'", "the parameter")} as 'Type: String' in the nested stack's template (CDK does this by default for cross-stack references), or stop passing a secret reference into it.`, void 0, "NESTED_STACK_SECRET_PARAMETER_TYPE"));
|
|
23340
|
+
}
|
|
23341
|
+
|
|
22928
23342
|
//#endregion
|
|
22929
23343
|
//#region src/deployment/intrinsic-resolver/functions.ts
|
|
22930
23344
|
async function resolveIf(ifArgs, context, source) {
|
|
@@ -22946,11 +23360,13 @@ async function resolveIf(ifArgs, context, source) {
|
|
|
22946
23360
|
};
|
|
22947
23361
|
if (!context.conditions || !Object.hasOwn(context.conditions, conditionName)) {
|
|
22948
23362
|
this.logger.warn(`Condition ${this.displayMasked(String(conditionName), context)} not found in context, assuming false`);
|
|
23363
|
+
recordTakenIfBranchIn(context, source, false);
|
|
22949
23364
|
return await resolveBranch(valueIfFalse);
|
|
22950
23365
|
}
|
|
22951
23366
|
const conditionValue = context.conditions[conditionName];
|
|
22952
23367
|
const selectedValue = conditionValue ? valueIfTrue : valueIfFalse;
|
|
22953
23368
|
this.logger.debug(`Resolved Fn::If: condition ${this.logRender(String(conditionName), context)} = ${conditionValue}, selected ${conditionValue ? "true" : "false"} branch`);
|
|
23369
|
+
recordTakenIfBranchIn(context, source, Boolean(conditionValue));
|
|
22954
23370
|
return await resolveBranch(selectedValue);
|
|
22955
23371
|
}
|
|
22956
23372
|
async function resolveEquals(equalsArgs, context) {
|
|
@@ -23505,256 +23921,6 @@ async function resolveKeyUnit(key, val, context, abandoned) {
|
|
|
23505
23921
|
}
|
|
23506
23922
|
}
|
|
23507
23923
|
|
|
23508
|
-
//#endregion
|
|
23509
|
-
//#region src/deployment/intrinsic-resolver/parameter-secrets.ts
|
|
23510
|
-
function recordInheritedParameterSecrets(parameterName, value, context) {
|
|
23511
|
-
const inherited = context.inheritedSecrets;
|
|
23512
|
-
const recorded = context.recordedSecretValues;
|
|
23513
|
-
if (inherited && recorded) carryLogOnlyValuesCarriedBy(inherited, recorded, value);
|
|
23514
|
-
if (recorded) carryPhysicalNameCopiesCarriedBy(context, recorded, value);
|
|
23515
|
-
if (inherited && recorded) recordInheritedNoEchoListElements(this, inherited, recorded, value, context);
|
|
23516
|
-
if (!inherited || inherited.size === 0 || !recorded) return;
|
|
23517
|
-
const mirror = parameterReadMirrors.get(recorded);
|
|
23518
|
-
const declared = declaredParameterNames(context);
|
|
23519
|
-
recordInheritedParameterValue(recorded, inherited, parameterName, value, declared);
|
|
23520
|
-
if (mirror) recordInheritedParameterValue(mirror, inherited, parameterName, value, declared);
|
|
23521
|
-
for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
23522
|
-
const carried = carriedExpressionFor(inherited, parameterName, value, plaintext, expression);
|
|
23523
|
-
recorded.set(plaintext, carried);
|
|
23524
|
-
const parentEntry = context.inheritedReferenceProvenance?.get(carried);
|
|
23525
|
-
if (parentEntry !== void 0) recordReferenceProvenanceEntry(recorded, carried, parentEntry, "read");
|
|
23526
|
-
recordInheritedParameterRead(recorded, inherited, parameterName);
|
|
23527
|
-
if (mirror) recordInheritedParameterRead(mirror, inherited, parameterName);
|
|
23528
|
-
carryFreshNoEchoMark(inherited, recorded, plaintext);
|
|
23529
|
-
}
|
|
23530
|
-
}
|
|
23531
|
-
function declaredParameterNames(context) {
|
|
23532
|
-
const declared = context.template?.Parameters;
|
|
23533
|
-
if (declared === null || typeof declared !== "object") return void 0;
|
|
23534
|
-
let names = declaredNamesCache.get(declared);
|
|
23535
|
-
if (names === void 0) {
|
|
23536
|
-
names = new Set(Object.keys(declared));
|
|
23537
|
-
declaredNamesCache.set(declared, names);
|
|
23538
|
-
}
|
|
23539
|
-
return names;
|
|
23540
|
-
}
|
|
23541
|
-
const declaredNamesCache = /* @__PURE__ */ new WeakMap();
|
|
23542
|
-
const parameterReadMirrors = /* @__PURE__ */ new WeakMap();
|
|
23543
|
-
function mirrorInheritedParameterReads(passSecrets, persistSecrets) {
|
|
23544
|
-
if (passSecrets !== persistSecrets) parameterReadMirrors.set(passSecrets, persistSecrets);
|
|
23545
|
-
}
|
|
23546
|
-
function carryPhysicalNameCopiesCarriedBy(context, recorded, value) {
|
|
23547
|
-
const names = context.inheritedPhysicalNameCopies ?? (context.inheritedSecrets && physicalNameCopiesOf.get(context.inheritedSecrets));
|
|
23548
|
-
if (names === void 0 || names.size === 0) return;
|
|
23549
|
-
const leaves = [...wholeStringLeavesOf(value)];
|
|
23550
|
-
for (const name of names) if (leaves.some((leaf) => leaf.includes(name))) recordPhysicalNameCopy(recorded, name);
|
|
23551
|
-
}
|
|
23552
|
-
function carriedExpressionFor(inherited, parameterName, value, plaintext, survivor) {
|
|
23553
|
-
const own = inheritedParameterExpression(inherited, parameterName, plaintext);
|
|
23554
|
-
if (typeof own === "string") return own;
|
|
23555
|
-
return inheritedRenderedToken(inherited, parameterName, value, plaintext) ?? survivor;
|
|
23556
|
-
}
|
|
23557
|
-
function poisonRenderedSpellingsCollidingIn(template, parameterValues, inherited) {
|
|
23558
|
-
if (!inherited || inherited.size === 0 || template === void 0) return;
|
|
23559
|
-
const names = new Set(Object.keys(parameterValues));
|
|
23560
|
-
if (names.size < 2) return;
|
|
23561
|
-
const groups = [];
|
|
23562
|
-
if (template.Resources !== null && typeof template.Resources === "object") for (const resource of Object.values(template.Resources)) groups.push([{
|
|
23563
|
-
node: resource,
|
|
23564
|
-
mode: "resource"
|
|
23565
|
-
}]);
|
|
23566
|
-
if (template.Outputs !== void 0) groups.push(outputsGroupParts(template.Outputs));
|
|
23567
|
-
const bind = (name) => Object.hasOwn(parameterValues, name) ? { value: parameterValues[name] } : void 0;
|
|
23568
|
-
const withdrawn = /* @__PURE__ */ new Set();
|
|
23569
|
-
for (;;) {
|
|
23570
|
-
const fresh = [...collidingRenderedNames(groups.map((parts) => {
|
|
23571
|
-
const reads = /* @__PURE__ */ new Map();
|
|
23572
|
-
for (const { node, mode } of parts) {
|
|
23573
|
-
const reread = mode === "slot" ? void 0 : {
|
|
23574
|
-
bind,
|
|
23575
|
-
inherited
|
|
23576
|
-
};
|
|
23577
|
-
for (const [name, slotRead] of parameterReadsOf(node, names, reread, mode !== "output")) reads.set(name, slotRead || reads.get(name) === true);
|
|
23578
|
-
}
|
|
23579
|
-
return reads;
|
|
23580
|
-
}).filter((reads) => reads.size >= 2), parameterValues, inherited)].filter((name) => !withdrawn.has(name));
|
|
23581
|
-
if (fresh.length === 0) return;
|
|
23582
|
-
for (const name of fresh) {
|
|
23583
|
-
withdrawn.add(name);
|
|
23584
|
-
withdrawRenderedParameterSpelling(inherited, name);
|
|
23585
|
-
}
|
|
23586
|
-
}
|
|
23587
|
-
}
|
|
23588
|
-
function collidingRenderedNames(readsByGroup, parameterValues, inherited) {
|
|
23589
|
-
const withdraw = /* @__PURE__ */ new Set();
|
|
23590
|
-
for (const reads of readsByGroup) {
|
|
23591
|
-
const byPlaintext = /* @__PURE__ */ new Map();
|
|
23592
|
-
const slotReadPlaintexts = /* @__PURE__ */ new Set();
|
|
23593
|
-
for (const [name, slotRead] of reads) {
|
|
23594
|
-
if (!Object.hasOwn(parameterValues, name)) continue;
|
|
23595
|
-
const value = parameterValues[name];
|
|
23596
|
-
for (const [plaintext, survivor] of inheritedSecretsCarriedBy(value, inherited)) {
|
|
23597
|
-
const expression = carriedExpressionFor(inherited, name, value, plaintext, survivor);
|
|
23598
|
-
const rendered = typeof inheritedParameterExpression(inherited, name, plaintext) !== "string" && inheritedRenderedToken(inherited, name, value, plaintext) !== void 0;
|
|
23599
|
-
let byExpression = byPlaintext.get(plaintext);
|
|
23600
|
-
if (byExpression === void 0) {
|
|
23601
|
-
byExpression = /* @__PURE__ */ new Map();
|
|
23602
|
-
byPlaintext.set(plaintext, byExpression);
|
|
23603
|
-
}
|
|
23604
|
-
let renderedNames = byExpression.get(expression);
|
|
23605
|
-
if (renderedNames === void 0) {
|
|
23606
|
-
renderedNames = [];
|
|
23607
|
-
byExpression.set(expression, renderedNames);
|
|
23608
|
-
}
|
|
23609
|
-
if (rendered) renderedNames.push(name);
|
|
23610
|
-
if (slotRead) slotReadPlaintexts.add(plaintext);
|
|
23611
|
-
}
|
|
23612
|
-
}
|
|
23613
|
-
for (const [plaintext, byExpression] of byPlaintext) {
|
|
23614
|
-
if (byExpression.size < 2 || !slotReadPlaintexts.has(plaintext)) continue;
|
|
23615
|
-
for (const renderedNames of byExpression.values()) for (const name of renderedNames) withdraw.add(name);
|
|
23616
|
-
}
|
|
23617
|
-
}
|
|
23618
|
-
return withdraw;
|
|
23619
|
-
}
|
|
23620
|
-
const POSITIONED_INTRINSICS = /* @__PURE__ */ new Set(["Fn::Join", "Fn::Sub"]);
|
|
23621
|
-
function parameterReadsOf(node, names, reread, positionsArrays) {
|
|
23622
|
-
const reads = /* @__PURE__ */ new Map();
|
|
23623
|
-
const add = (name, slotRead) => {
|
|
23624
|
-
reads.set(name, slotRead || reads.get(name) === true);
|
|
23625
|
-
};
|
|
23626
|
-
const visit = (value, slotRead, atLeaf) => {
|
|
23627
|
-
if (Array.isArray(value)) {
|
|
23628
|
-
const mayShrink = atLeaf ? !positionsArrays || !arrayPairsWhateverDrops(value) : value.some((element) => element !== null && typeof element === "object" && !Array.isArray(element) && (Object.hasOwn(element, "Fn::If") || element["Ref"] === "AWS::NoValue"));
|
|
23629
|
-
for (const element of value) visit(element, slotRead || mayShrink, atLeaf && !mayShrink);
|
|
23630
|
-
return;
|
|
23631
|
-
}
|
|
23632
|
-
if (value === null || typeof value !== "object") return;
|
|
23633
|
-
const record = value;
|
|
23634
|
-
const intrinsic = Object.keys(record).some((key) => key === "Ref" || key.startsWith("Fn::"));
|
|
23635
|
-
if (intrinsic && atLeaf && reread !== void 0 && rereadParameterExpression(record, reread.bind, reread.inherited) !== void 0) {
|
|
23636
|
-
for (const name of refNamesIn(record, names)) add(name, false);
|
|
23637
|
-
return;
|
|
23638
|
-
}
|
|
23639
|
-
const ref = record["Ref"];
|
|
23640
|
-
if (typeof ref === "string" && names.has(ref)) add(ref, slotRead);
|
|
23641
|
-
const placeholderSlot = !positionsArrays && unkeyedPlaceholderParts(record, (name) => certifiesPlaceholder(name, reread)) > MAX_UNKEYED_PARTS;
|
|
23642
|
-
const sub = record["Fn::Sub"];
|
|
23643
|
-
const text = typeof sub === "string" ? sub : Array.isArray(sub) ? sub[0] : void 0;
|
|
23644
|
-
if (typeof text === "string") for (const match of text.matchAll(/\$\{([^}!][^}]*)\}/g)) {
|
|
23645
|
-
const name = match[1].trim();
|
|
23646
|
-
if (names.has(name)) add(name, slotRead || placeholderSlot);
|
|
23647
|
-
}
|
|
23648
|
-
for (const [key, child] of Object.entries(record)) visit(child, slotRead || placeholderSlot || key.startsWith("Fn::") && !POSITIONED_INTRINSICS.has(key), atLeaf && !intrinsic);
|
|
23649
|
-
};
|
|
23650
|
-
visit(node, reread === void 0, true);
|
|
23651
|
-
return reads;
|
|
23652
|
-
}
|
|
23653
|
-
const MAX_UNKEYED_PARTS = 1;
|
|
23654
|
-
function certifiesPlaceholder(name, reread) {
|
|
23655
|
-
if (reread === void 0) return false;
|
|
23656
|
-
const bound = reread.bind(name);
|
|
23657
|
-
if (bound === void 0) return false;
|
|
23658
|
-
if (inheritedSecretsCarriedBy(bound.value, reread.inherited).length === 0) return false;
|
|
23659
|
-
return typeof inheritedParameterExpression(reread.inherited, name, bound.value) === "string";
|
|
23660
|
-
}
|
|
23661
|
-
function unkeyedPlaceholderParts(record, certified) {
|
|
23662
|
-
const keyed = (value) => typeof value === "string" || value !== null && typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 1 && typeof value["Ref"] === "string" && certified(value["Ref"]);
|
|
23663
|
-
if (Object.hasOwn(record, "Fn::Join")) {
|
|
23664
|
-
const args = record["Fn::Join"];
|
|
23665
|
-
if (!Array.isArray(args) || args.length !== 2 || !Array.isArray(args[1])) return Number.POSITIVE_INFINITY;
|
|
23666
|
-
return args[1].filter((part) => !keyed(part)).length;
|
|
23667
|
-
}
|
|
23668
|
-
if (Object.hasOwn(record, "Fn::Sub")) {
|
|
23669
|
-
const args = record["Fn::Sub"];
|
|
23670
|
-
const [template, variables] = typeof args === "string" ? [args, {}] : Array.isArray(args) ? [args[0], args[1]] : [];
|
|
23671
|
-
if (typeof template !== "string" || variables === null || typeof variables !== "object") return Number.POSITIVE_INFINITY;
|
|
23672
|
-
let unkeyed = 0;
|
|
23673
|
-
for (const hit of template.matchAll(/\$\{(!)?([^}]*)\}/g)) {
|
|
23674
|
-
const name = hit[2] ?? "";
|
|
23675
|
-
if (hit[1] === "!" || name === "") continue;
|
|
23676
|
-
if (!(Object.hasOwn(variables, name) ? keyed(variables[name]) : certified(name))) unkeyed += 1;
|
|
23677
|
-
}
|
|
23678
|
-
return unkeyed;
|
|
23679
|
-
}
|
|
23680
|
-
return 0;
|
|
23681
|
-
}
|
|
23682
|
-
function outputsGroupParts(outputs) {
|
|
23683
|
-
if (outputs === null || typeof outputs !== "object" || Array.isArray(outputs)) return [{
|
|
23684
|
-
node: outputs,
|
|
23685
|
-
mode: "slot"
|
|
23686
|
-
}];
|
|
23687
|
-
const parts = [];
|
|
23688
|
-
for (const output of Object.values(outputs)) {
|
|
23689
|
-
if (output === null || typeof output !== "object" || Array.isArray(output)) {
|
|
23690
|
-
parts.push({
|
|
23691
|
-
node: output,
|
|
23692
|
-
mode: "slot"
|
|
23693
|
-
});
|
|
23694
|
-
continue;
|
|
23695
|
-
}
|
|
23696
|
-
const { Value: value, ...rest } = output;
|
|
23697
|
-
parts.push({
|
|
23698
|
-
node: value,
|
|
23699
|
-
mode: "output"
|
|
23700
|
-
}, {
|
|
23701
|
-
node: rest,
|
|
23702
|
-
mode: "slot"
|
|
23703
|
-
});
|
|
23704
|
-
}
|
|
23705
|
-
return parts;
|
|
23706
|
-
}
|
|
23707
|
-
function refNamesIn(node, names) {
|
|
23708
|
-
const found = /* @__PURE__ */ new Set();
|
|
23709
|
-
const visit = (value) => {
|
|
23710
|
-
if (Array.isArray(value)) {
|
|
23711
|
-
for (const element of value) visit(element);
|
|
23712
|
-
return;
|
|
23713
|
-
}
|
|
23714
|
-
if (value === null || typeof value !== "object") return;
|
|
23715
|
-
const record = value;
|
|
23716
|
-
if (typeof record["Ref"] === "string" && names.has(record["Ref"])) found.add(record["Ref"]);
|
|
23717
|
-
const sub = record["Fn::Sub"];
|
|
23718
|
-
const text = typeof sub === "string" ? sub : Array.isArray(sub) ? sub[0] : void 0;
|
|
23719
|
-
if (typeof text === "string") for (const match of text.matchAll(/\$\{([^}!][^}]*)\}/g)) {
|
|
23720
|
-
const name = match[1].trim();
|
|
23721
|
-
if (names.has(name)) found.add(name);
|
|
23722
|
-
}
|
|
23723
|
-
for (const child of Object.values(record)) visit(child);
|
|
23724
|
-
};
|
|
23725
|
-
visit(node);
|
|
23726
|
-
return found;
|
|
23727
|
-
}
|
|
23728
|
-
function recordInheritedNoEchoListElements(resolver, inherited, recorded, value, context) {
|
|
23729
|
-
if (!Array.isArray(value)) return;
|
|
23730
|
-
const parameterValues = [...inherited.keys()].filter((plaintext) => isNoEchoParameterPlaintext(inherited, plaintext));
|
|
23731
|
-
if (parameterValues.length === 0) return;
|
|
23732
|
-
const joined = value.map((element) => String(element)).join(",");
|
|
23733
|
-
const normalized = (plaintext) => plaintext.split(",").map((piece) => piece.trim()).join(",");
|
|
23734
|
-
if (!parameterValues.some((plaintext) => `,${normalized(plaintext)},`.includes(`,${joined},`))) return;
|
|
23735
|
-
for (const element of value) {
|
|
23736
|
-
if (typeof element !== "string" || element.length < 4) continue;
|
|
23737
|
-
recordNoEchoParameterFreshValue(element, recorded, resolver.publicNoEchoTokens(context));
|
|
23738
|
-
}
|
|
23739
|
-
}
|
|
23740
|
-
function recordNoEchoParameterValue(paramDef, value, context) {
|
|
23741
|
-
const bag = context.recordedSecretValues;
|
|
23742
|
-
if (!declaresNoEcho(paramDef) || bag === void 0) return;
|
|
23743
|
-
recordLogOnlyParameterValue(bag, value);
|
|
23744
|
-
recordNoEchoParameterFreshValue(value, bag, this.publicNoEchoTokens(context));
|
|
23745
|
-
}
|
|
23746
|
-
function refuseCoercedInheritedSecret(name, paramDef, userValue, inherited) {
|
|
23747
|
-
if (!inherited || inherited.size === 0) return;
|
|
23748
|
-
const secretPairs = new Map([...inherited].filter(([plaintext]) => !isNoEchoParameterPlaintext(inherited, plaintext)));
|
|
23749
|
-
if (secretPairs.size === 0) return;
|
|
23750
|
-
const carriedBefore = inheritedSecretsCarriedBy(userValue, secretPairs).length;
|
|
23751
|
-
if (carriedBefore === 0) return;
|
|
23752
|
-
if (inheritedSecretsCarriedBy(this.coerceParameterValue(userValue, paramDef.Type), secretPairs).length >= carriedBefore) return;
|
|
23753
|
-
const loggedName = this.displayMasked(name);
|
|
23754
|
-
const loggedType = this.displayMasked(paramDef.Type);
|
|
23755
|
-
throw markNonRetryable(new IntrinsicResolutionRefusalError(`Nested-stack parameter ${quotedRender(loggedName, "'")} is declared ${QUOTABLE_RENDER.test(loggedType) ? `'Type: ${loggedType}'` : "with a Type that is not a plain identifier"}, but the parent stack resolved a SECRET dynamic reference into it. cdkd keeps a resolved secret out of persisted state by rewriting STRING leaves back to their {{resolve:...}} expression; coercing this value to ${quotedRender(loggedType, "'", "that Type")} destroys the plaintext cdkd would have matched on, so the DECRYPTED secret would be left in the child stack's state.json with nothing to redact it back to. Declare ${quotedRender(loggedName, "'", "the parameter")} as 'Type: String' in the nested stack's template (CDK does this by default for cross-stack references), or stop passing a secret reference into it.`, void 0, "NESTED_STACK_SECRET_PARAMETER_TYPE"));
|
|
23756
|
-
}
|
|
23757
|
-
|
|
23758
23924
|
//#endregion
|
|
23759
23925
|
//#region src/deployment/intrinsic-resolver/refs.ts
|
|
23760
23926
|
function nameIsNeverAResource(logicalId, context) {
|
|
@@ -23931,7 +24097,18 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
|
|
|
23931
24097
|
if (typeof value === "string" && value.includes("{{resolve:")) return await this.resolveTemplateLeafReferences(value, context);
|
|
23932
24098
|
return value;
|
|
23933
24099
|
}
|
|
23934
|
-
if (Array.isArray(value))
|
|
24100
|
+
if (Array.isArray(value)) {
|
|
24101
|
+
const resolved = await allSettledKeepingFirstRejection(() => value.map((v) => this.resolveValue(v, context)), (pending) => this.warnAbandonedParts(pending));
|
|
24102
|
+
const kept = resolved.filter((v) => v !== AWS_NO_VALUE);
|
|
24103
|
+
if (kept.length !== resolved.length) {
|
|
24104
|
+
const dropped = [];
|
|
24105
|
+
resolved.forEach((v, i) => {
|
|
24106
|
+
if (v === AWS_NO_VALUE) dropped.push(i);
|
|
24107
|
+
});
|
|
24108
|
+
recordDroppedArrayElementsIn(context, value, dropped);
|
|
24109
|
+
}
|
|
24110
|
+
return kept;
|
|
24111
|
+
}
|
|
23935
24112
|
const obj = value;
|
|
23936
24113
|
if ("Ref" in obj) {
|
|
23937
24114
|
const logicalId = obj["Ref"];
|
|
@@ -26525,7 +26702,7 @@ var CloudControlProvider = class {
|
|
|
26525
26702
|
const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
|
|
26526
26703
|
if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
|
|
26527
26704
|
this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
|
|
26528
|
-
const { ASGProvider } = await import("./asg-provider-
|
|
26705
|
+
const { ASGProvider } = await import("./asg-provider-DJdNNqDe.js");
|
|
26529
26706
|
const delegateRegion = ambientRegion();
|
|
26530
26707
|
let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
|
|
26531
26708
|
if (asgProvider === void 0) {
|
|
@@ -26631,7 +26808,7 @@ var CloudControlProvider = class {
|
|
|
26631
26808
|
const family = SDK_DELETE_FAMILIES.get(resourceType);
|
|
26632
26809
|
const cached = this.sdkDeleteDelegates.get(family);
|
|
26633
26810
|
if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
|
|
26634
|
-
const provider = family === "rds" ? new (await (import("./rds-provider-
|
|
26811
|
+
const provider = family === "rds" ? new (await (import("./rds-provider-C-lGTdAb.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-UDy6HC5O.js"))).NeptuneProvider({ region: ccRegion });
|
|
26635
26812
|
this.sdkDeleteDelegates.set(family, {
|
|
26636
26813
|
region: ccRegion,
|
|
26637
26814
|
provider
|
|
@@ -47851,4 +48028,4 @@ DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice
|
|
|
47851
48028
|
|
|
47852
48029
|
//#endregion
|
|
47853
48030
|
export { S3_AUTO_DELETE_OBJECTS_TAG as $, withheldAccountClause as $a, getDockerImageBySourceHash as $c, isReadableResourceEntry as $i, findDestructiveChanges as $n, literalSplitDelimitersOf as $o, applyRoleArnIfSet as $r, splitImportedOps as $s, recordUnderIdIsNotOwn as $t, diffSecurity as A, refuseMalformedResourceEntries as Aa, buildDenyExternalAccessPolicy as Ac, isNamelessDynamicReferenceError as Ai, hasOwnKey as Al, DEFAULT_RESOURCE_TIMEOUT_MS as An, withRetry as Ao, CloudControlProvider as Ar, provenPublicValue as As, withNestedStackContext as At, readProtection as B, refuseMalformedResourcesForDeploy as Ba, isDockerClientEnvKey as Bc, declaresNoEcho as Bi, injectedAwsRegionValue as Bl, storedSecretNameNeedles as Bn, maskWholeValue as Bo, markWaitAbandoned as Br, TEMPLATE_SOURCED_RULES as Bs, awaitInFlightSibling as Bt, withApiLimit as C, refuseMalformedOrphanRecordsForDestroy as Ca, ensureAssetStorage as Cc, coerceParameterTypedValue as Ci, PARTITION_TABLE as Cl, exportNameSecretExposure as Cn, replayWarn as Co, readsNoEchoDeleteValues as Cr, recordNestedStackParameterExpressions as Cs, nestedChildStackName as Ct, findServiceTokenRefusals as D, refuseMalformedOutputs as Da, readBootstrapMarkerBody as Dc, isImpossibleEmptyStoredAttribute as Di, StageLoadError as Dl, collectPublishedOutputNames as Dn, prefetchCreateOnlyPropertyPaths as Do, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Dr, recordPhysicalNameCopy as Ds, withNestedRevertRun as Dt, deferredServiceTokenWarning as E, refuseMalformedOrphansForOrphan as Ea, parseBootstrapMarker as Ec, getAccountInfo as Ei, AssemblyReader as El, collectDeclaredOutputNames as En, requireConfigString as Eo, withPrintingSecrets as Er, recordAttributeIdCopy as Es, revertedNestedRowIds as Et, recordedProtectionEvidence as F, refuseMalformedResourceEntriesForOrphan as Fa, describeDockerFailure as Fc, refStateLookupFromResource as Fi, describeFileReadFailure as Fl, orphanRecordsPrintingBag as Fn, TemplateParser as Fo, deleteIndeterminateGuards as Fr, recordProvenPublicExpression as Fs, loadJournaledOrphans as Ft, deleteBudgetKey as G, repairMalformedOrphansForReadOnly as Ga, redactedDockerCause as Gc, UNREADABLE_RESOURCES_MAP_ROW as Gi, ccRoutedFinalSnapshotError as Gn, passedNoEchoParametersOf as Go, reDisableInstanceApiTermination as Gr, S3StateBackend as Gs, replacedDeleteFailureVerdict as Gt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as H, refuseMalformedResourcesForExport as Ha, partitionSensitiveEnv as Hc, STATE_REGION_DIVERGED as Hi, resolveBucketRegion as Hl, ATOMIC_FINAL_SNAPSHOT_TYPES as Hn, noEchoCoordinatesOf as Ho, ec2InstanceProtectionSite as Hr, isSingleDynamicReferenceToken as Hs, getStackRecords as Ht, recordedProtectionNote as I, refuseMalformedResourcePropertiesForDestroy as Ia, dockerSpawnEnvWithSensitive as Ic, parseWebACLArn as Ii, displayAssemblyPath as Il, secretNamePrintingBag as In, canonicalCoordinates as Io, deleteLeftInPlace as Ir, wholeStringLeavesOf as Is, makeForeignHolderScan as It, DELETE_INDEX_WAIT_PROCEED_NOTE as J, repairMalformedResourcePropertiesForReadOnly as Ja, warnFinchArgvExposure as Jc, displayLogicalId as Ji, isFinalSnapshotError as Jn, valueAtCoordinate as Jo, INTRINSIC_KEYS as Jr, CrossPrefixScanCache as Js, isJournaledOrphan as Jt, resolveDynamoDbDeleteBudgetClock as K, repairMalformedOutputsForReadOnly as Ka, runDockerForeground as Kc, accountArgs as Ki, createPreDeleteFinalSnapshot as Kn, readbackPathFor as Ko, reEnableInstanceApiTermination as Kr, rebuildClientForBucketRegion as Ks, recordAfterRollbackUpdate as Kt, PROTECTION_PROPERTY_BY_TYPE as L, refuseMalformedResourcePropertiesForDrift as La, finchSecretArgvRefusal as Lc, withSharedDrainBudget as Li, renderAssemblyPathEscape as Ll, secretNamePrintingBags as Ln, isMarkedCoordinate as Lo, deleteSkipReason as Lr, STATE_SOURCED_BASELINE_RULES as Ls, sameJournaledOrphans as Lt, noEchoComparisonForTemplate as M, refuseMalformedResourceEntriesForDestroy as Ma, resolveDockerContextDirectory as Mc, AWS_NO_VALUE as Mi, nullPrototypeRecord as Ml, completedReplayEntries as Mn, lambdaFunctionNameForMask as Mo, unchangedBehindSecretReference as Mr, recordMaskOnlyValuesIn as Ms, dropFailedHint as Mt, noEchoExactEchoLeavesOf as N, refuseMalformedResourceEntriesForImport as Na, describeDockerCapturedOutput as Nc, cfnRefValueFromPhysicalId as Ni, ownValue as Nl, journaledOrphanPrintingBag as Nn, sameLambdaFunctionAddress as No, RollbackInlinePolicyWriters as Nr, recordNoEchoAttributeValues as Ns, isHandledOrphan as Nt, serviceTokenBlockingReason as O, refuseMalformedOutputsForDestroy as Oa, validateAssetBucketName as Oc, carriesDynamicReference as Oi, processStackMessages as Ol, isExportAliasCollision as On, templateResourceTypes as Oo, applyCustomResourceResponseExpiration as Or, splitGetAttStringForm as Os, collectNestedChildUnaddressed as Ot, noEchoParameterNamesOf as P, refuseMalformedResourceEntriesForImportSave as Pa, describeDockerExecFailure as Pc, isStalePlaceholderArnAttribute as Pi, absoluteAssemblyPathEscape as Pl, maskEventTextWithBoundBags as Pn, DagBuilder as Po, UNSPECIFIED_SKIP_REASON as Pr, recordNoEchoParameterFreshValue as Ps, journaledOrphanLines as Pt, ECR_AUTO_DELETE_IMAGES_TAG as Q, unreadableResourceEntries as Qa, AssetManifestLoader as Qc, isReadableOrphanRecord as Qi, constructPathOf as Qn, hasMaskableValues as Qo, refuseUnreadableCdkCrossAccountRefs as Qr, isNotImplemented as Qs, recheckFailedPlan as Qt, isProtectionValueActive as R, refuseMalformedResourcePropertiesForExport as Ra, formatDockerLoginError as Rc, parameterInputsFor as Ri, resolveAssemblyPath as Rl, secretNamedRecordNeedles as Rn, maskAtCoordinates as Ro, withIndeterminateGuard as Rr, STATE_SOURCED_CROSS_GENERATION_RULES as Rs, replayFailedOperations as Rt, lookupEachName as S, refuseMalformedOrphanRecords as Sa, assertAssetBucketRegion as Sc, regionLessSecretName as Si, expectedOwnerParam as Sl, exportNameNoEchoParameters as Sn, readConfigString as So, TemplateNoEchoReresolver as Sr, inheritNestedStackParameterAssociations as Ss, getNestedRevertRun as St, recordRetainedForReadoption as T, refuseMalformedOrphansForDestroy as Ta, isCrossRegionRedirect as Tc, parameterTypeMayLoseSecretIdentity as Ti, derivePartitionAndUrlSuffix as Tl, noEchoParameterValueSeed as Tn, requireConfigObject as To, getCurrentResourceSecrets as Tr, physicalNameCopiesOf as Ts, revertNestedChildFromJournal as Tt, beginDeleteWait as U, refuseMalformedState as Ua, redactDockerArgvValues as Uc, STATE_RESOURCES_MALFORMED as Ui, PRE_DELETE_SNAPSHOT_TYPES as Un, noEchoLeavesOf as Uo, isTerminationProtectionPropagationError as Ur, LockManager as Us, withStackRecords as Ut, DynamoDBGlobalTableProvider as V, refuseMalformedResourcesForDestroy as Va, isMalformedEnvKey as Vc, JSON_LISTING_HOLE_VALUE as Vi, clearBucketRegionCache as Vl, extractDeploymentEventError as Vn, maskedLeafCoordinatesOf as Vo, disableInstanceApiTermination as Vr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Vs, destroyStackRecordsView as Vt, compensateRemovedDeletionProtection as W, repairMalformedOrphanRecordsForReadOnly as Wa, redactedCause as Wc, UNREADABLE_ORPHANS_CONTAINER_ROW as Wi, buildFinalSnapshotIdentifier as Wn, noEchoOutputsComparison as Wo, observeThenDisableInstanceApiTermination as Wr, isLockInfoExpired as Ws, removeProtectionTypeList as Wt, deleteTableWithIndexBusyRetry as X, unpreviewableOrphanRecords as Xa, stripControlChars as Xc, hasReadableOutputs as Xi, unsupportedFinalSnapshotError as Xn, carryLogOnlyValues as Xo, poisonRenderedSpellingsCollidingIn as Xr, crossPrefixDeniedWarning as Xs, planFailedOps as Xt, INDEX_SETTLE_POLL_INTERVAL_MS as Y, repairMalformedResourcesForReadOnly as Ya, escapeRegExp$3 as Yc, hasReadableOrphans as Yi, refusesFinalSnapshot as Yn, liveMatchesUnresolvedTokenFrame as Yo, IntrinsicFunctionResolver as Yr, applyCrossPrefixScan as Ys, isReplacementOrphan as Yt, waitForIndexesSettled as Z, unreadableOrphanRecords as Za, stripForDisplay as Zc, hasReadableResources as Zi, maskingRetryLogger as Zn, createUnionSecretMasker as Zo, producerLookupOver as Zr, isAccessDenied$1 as Zs, planRollback as Zt, keptWholeReasonText as _, malformedScrubResourceEntriesRefusalMessage as _a, createAssetRedirectResolver as _c, s3BucketRegionalDomainName as _i, MIGRATE_TMP_PREFIX as _l, exportAliasCollisionScrubWarning as _n, coerceCfnBoolean as _o, CC_BROKEN_REASON as _r, DYNAMIC_REFERENCE_TOKEN_SCAN as _s, planOrphanAdoption as _t, inheritedProvenanceForChildDiff as a, malformedLocalResourcesWarning as aa, hasUnverifiableParameterRefusal as ac, AWS_CREDENTIAL_ENV_KEYS as ai, resolveApp as al, getCurrentProducerRegions as an, hasNoCloudControlHandlers as ao, acquireIdempotencyToken as ar, unionOfSecretBags as as, createReadOnlyAttributeHealerFactory as at, chunks as b, refuseDivergentRecordRegionForDestroy as ba, AssetModeResolver as bc, classifyReplaySecretRegion as bi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as bl, secretSafeKeyDisplay as bn, configIntegerRefusal as bo, isCustomResource as br, pathCrossesDottedKey as bs, displacedPhysicalIdShown as bt, isAbsoluteAssetPath as c, malformedOrphanRowsKeptWarning as ca, isReadableBag as cc, envCredentialsAreAssumedRole as ci, resolveSkipPrefix as cl, isRedactedRecordedValue as cn, MULTI_REGION_RECREATE_BLOCKED_TYPES as co, DBPROXY_TAGS_WHAT as cr, maskSecretsInError as cs, gray as ct, templateIdentity as d, malformedOutputsRefusalMessage as da, shouldRetainResource as dc, outputReferenceProvenanceOf as di, resolveUseCdkBootstrapAssets as dl, updatePartialMessage as dn, renderStatefulReason as do, readTagList as dr, recordReferenceProvenanceEntry as ds, yellow as dt, malformedDriftResourcePropertiesWarning as ea, acceptedCreateOnlyDropsOf as ec, assertFlagRoleArn as ei, Synthesizer as el, replacementNeverSwapped as en, findActionableSilentDrops as eo, formatDestructiveChange as er, logOnlyValueCount as es, hasCdkAutoDeleteTag as et, conditionFingerprint as f, malformedOutputsWarning as fa, AssetPublisher as fc, recordedOutputReferenceRegions as fi, stateBucketExistenceConfirmed as fl, updatePartialReason as fn, WARM_THROUGHPUT_MEMBERS as fo, refuseMalformedDesiredTags as fr, snapshotPassProvenance as fs, computeParameterTaint as ft, isSecretBearingReferenceString as g, malformedResourcesWarning as ga, buildAssetRedirectMap as gc, s3BucketDualStackDomainName as gi, CFN_TEMPLATE_URL_LIMIT as gl, displayTextOrWithheld as gn, toFiniteNumber as go, stringifyIfAssigned as gr, withoutPhysicalNameCopies as gs, makeSiblingClaimReader as gt, readRecordedConditionVerdicts as h, malformedResourcePropertiesWarning as ha, WorkGraph as hc, s3BucketDomainName as hi, CFN_TEMPLATE_BODY_LIMIT as hl, WITHHELD_NAME_DISPLAY as hn, toCfnInteger as ho, definedAttributes as hr, withPhysicalNameCopies as hs, resourcesNamingDeclaredParameter as ht, crossStackOutputProvenanceSource as i, malformedLocalResourceEntriesWarning as ia, hasReasonlessBaselineRefusal as ic, sendableAssumeRoleCommand as ii, loadCdkJson as il, findNestedStackTypeChanges as in, NO_CC_HANDLERS_REASON as io, withCreateTokenLedger as ir, shareLogOnlyValues as is, formatResourceLine as it, noEchoAttributeNamesOf as j, refuseMalformedResourceEntriesForDeploy as ja, buildDockerImage as jc, keepsSecretReferenceToken as ji, hasPlainPrototype$1 as jl, DEFAULT_RESOURCE_WARN_AFTER_MS as jn, canonicalLambdaFunctionName as jo, slowCcOperationTimeoutMs as jr, recordMaskOnlyValue as js, deleteJournaledOrphans as jt, withResourceDeadline as k, refuseMalformedResourceAttributesForOrphan as ka, validateContainerRepoName as kc, carriesFetchableDynamicReference as ki, defineOwnKey as kl, bindingSkippedOutputs as kn, describeTypeWithThrottleRetry as ko, customResourceResponseExpirationWarning as kr, carriesSecretMask as ks, getCurrentNestedStackContext as kt, listNestedTemplateRows as l, malformedOrphansRefusalMessage as la, orphansAfterRollback as lc, isSettledInstanceState as li, resolveStateBucketWithDefault as ll, redactedDeleteAddressFields as ln, isStatefulRecreateTargetForReplace as lo, DBPROXY_TAG_OPTIONS as lr, maskSecretsInText as ls, green as lt, parentSuppliedValues as m, malformedResourceEntriesWarning as ma, stringifyValue as mc, s3BucketArn as mi, ssmResolvedValueType as ml, DeploymentEventsStore as mn, isWarmThroughputDecrease as mo, tagPlanWarning as mr, scrubResourceRecord as ms, reachableDivergentParameters as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedExportSourceWarning as na, exportNamesCarriedFrom as nc, explicitRoleArnOrThrow as ni, getDefaultStateBucketName as nl, seedsDeleteFirstGuard as nn, unwrittenCreateOnlyReplacement as no, ledgerForStack as nr, recordLogOnlyParameterValue as ns, getPriorAttempts as nt, childTemplateLoader as o, malformedOrphanRecordsRefusalMessage as oa, importableOutputKeys as oc, applyCallerIdentityCredentials as oi, resolveAutoAssetStorage as ol, inheritProducerRegions as on, findReplacedReadersOfRecreateTargets as oo, isRefusedByName as or, createSecretMasker as os, bold as ot, conditionInputsFrom as p, malformedRenderedContainersWarning as pa, isSensitiveAttributeName as pc, recordedReferenceRegions as pi, warnDeprecatedNoPrefixCliFlag as pl, DeploymentEventsReader as pn, coerceWarmThroughput as po, tagMapAsList as pr, redactSecretsForState as ps, namesAnyDeclaredParameter as pt, resolveDynamoDbDeleteBudgetMs as q, repairMalformedResourceEntriesForReadOnly as qa, runDockerStreaming as qc, deployRefusesOrphanRowsReason as qi, effectiveDeletionPolicy as qn, readsNoEchoSource as qo, DiffCalculator as qr, CrossPrefixReadError as qs, demoteSupersededOrphans as qt, computeImplicitDeleteEdges as r, malformedLocalOutputsWarning as ra, hasReadableExportSet as rc, isIamRoleArn as ri, getLegacyStateBucketName as rl, orphanDeleteNeedsIdentity as rn, withoutSilentDropProperties as ro, reserveStackCreateToken as rr, recordLogOnlyValue as rs, markRefusedBeforeApplying as rt, findNestedTemplateTreeDefect as s, malformedOrphanRecordsWarning as sa, importableOutputs as sc, callerEnvCredentials as si, resolveCaptureObservedState as sl, REDACTED_DELETE_ADDRESS_SKIP_REASON as sn, shownType as so, markDeleteStarted as sr, errorCauseChain as ss, cyan as st, DeployEngine as t, malformedExportNamesWarning as ta, describeRegionValueKind as tc, assertSendableRoleArn as ti, synthesisStatusMessage as tl, resolveReplacementOldType as tn, findSilentDropProperties as to, earliestDefined as tr, printingCorpusOf as ts, isTruthyCfnBoolean as tt, renderNestedTemplateTreeDefect as u, malformedOrphansWarning as ua, orphansCarriedFrom as uc, keepHeldTokenProvenance as ui, resolveStateBucketWithDefaultAndSource as ul, redactedDeleteAddressSkip as un, isStatefulRecreateTargetSync as uo, planTagDiff as ur, markSameGenerationBag as us, red as ut, mergeNoChangeOutputs as v, malformedStateRefusalMessage as va, loadPublishableAssetManifest as vc, s3BucketWebsiteUrl as vi, findLargeInlineResources as vl, secretBearing as vn, coerceCfnInteger as vo, ProviderRegistry as vr, dynamicReferenceTokens as vs, NESTED_PENDING_PARENT_REASON as vt, keptForReadoption as w, refuseMalformedOrphans as wa, getBootstrapMarkerKey as wc, isUnboundTemplateParameter as wi, canonicalizeRegion as wl, isWholeDynamicReferenceValue as wn, requireConfigArray as wo, isCustomResourceType as wr, recoverMaskedOutput as ws, recordDisplacedSkips as wt, isAccessDeniedError as x, refuseMalformedNestedChildOutputs as xa, BOOTSTRAP_MARKER_PREFIX as xc, producerRegionsFromState as xi, decodeListingKey as xl, carriedExportAliasExposure as xn, configStringRefusal as xo, wouldReturnToSdkProvider as xr, identityKeyFor as xs, dropSettledNestedJournals as xt, makeCanonicalizePropertiesFn as y, previewableOrphanRecords as ya, rewriteTemplateAssetReferences as yc, classifyRecordedSecretRegion as yi, uploadCfnTemplate as yl, secretBearingStateKeyWarning as yn, configBooleanRefusal as yo, ccBrokenReason as yr, isUncertifiedBaselineMaskPosition as ys, displacedOpClause as yt, perType as z, refuseMalformedResourcePropertiesForOrphan as za, getDockerCmd as zc, passedParameterClassesOf as zi, injectAwsRegion as zl, stateSecretNameNeedles as zn, maskReadbackAtCoordinates as zo, isWaitAbandonedError as zr, STATE_SOURCED_READBACK_RULES as zs, replayRollback as zt };
|
|
47854
|
-
//# sourceMappingURL=deploy-engine-
|
|
48031
|
+
//# sourceMappingURL=deploy-engine-DOBzE5TD.js.map
|