@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.
Files changed (24) hide show
  1. package/dist/{asg-provider-BS5i71bK.js → asg-provider-DJdNNqDe.js} +3 -3
  2. package/dist/{asg-provider-BS5i71bK.js.map → asg-provider-DJdNNqDe.js.map} +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/{deploy-engine-BK4gG_5A.js → deploy-engine-DOBzE5TD.js} +465 -288
  5. package/dist/deploy-engine-DOBzE5TD.js.map +1 -0
  6. package/dist/{iam-policy-targets-DAs3w7QW.js → iam-policy-targets-DFk7zr0Q.js} +27 -2
  7. package/dist/iam-policy-targets-DFk7zr0Q.js.map +1 -0
  8. package/dist/{iam-role-provider-SmvPHPLC.js → iam-role-provider-C8gNXG1G.js} +3 -3
  9. package/dist/{iam-role-provider-SmvPHPLC.js.map → iam-role-provider-C8gNXG1G.js.map} +1 -1
  10. package/dist/index.js +3 -3
  11. package/dist/{neptune-provider-CqZ1FaqT.js → neptune-provider-UDy6HC5O.js} +3 -3
  12. package/dist/{neptune-provider-CqZ1FaqT.js.map → neptune-provider-UDy6HC5O.js.map} +1 -1
  13. package/dist/{program-DVPHKsxv.js → program-BDm58Wc8.js} +8 -8
  14. package/dist/{program-DVPHKsxv.js.map → program-BDm58Wc8.js.map} +1 -1
  15. package/dist/{provider-classes-CDzT2xg0.js → provider-classes-DzoIZFZK.js} +96 -24
  16. package/dist/provider-classes-DzoIZFZK.js.map +1 -0
  17. package/dist/{rds-provider-DraxDuQq.js → rds-provider-C-lGTdAb.js} +3 -3
  18. package/dist/{rds-provider-DraxDuQq.js.map → rds-provider-C-lGTdAb.js.map} +1 -1
  19. package/dist/{version-DTSDiQcV.js → version-CZbKGFSS.js} +2 -2
  20. package/dist/{version-DTSDiQcV.js.map → version-CZbKGFSS.js.map} +1 -1
  21. package/package.json +1 -1
  22. package/dist/deploy-engine-BK4gG_5A.js.map +0 -1
  23. package/dist/iam-policy-targets-DAs3w7QW.js.map +0 -1
  24. 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, $n as formatRetryClassificationSignals, $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 retryClassificationText, at as startInterruptWatch, bn as ResourceUpdateNotSupportedError, bt as maskDeep, cr as isThrottlingError, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dr as wrapMaskedAwsError, en as clientDefaultsFor, er as isAmbiguousCcHandlerErrorCode, f as removalWarning, ft as logicalIdShown, gt as stateOrphanRecordRemedy, hn as MalformedProducerRecordRefusalError, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CdkdError, ir as isTransientServerError, 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 markNonRetryable, m as withoutInjectedRemovals, mn as MacroExpansionError, mt as resourceTypeShown, nn as AccountIdUnavailableError, nr as isIamPropagationError, on as CrossAccountSecretRefusalError, ot as ElapsedBudgetRegistry, pn as LockError, qn as isNameCollisionErrorFrom, rn as AssetError, rr as isRetryableTransientError, sn as DependencyError, sr as isMarkedNonRetryable, st as monotonicNowMs, tn as credentialFingerprint, tr as isAmbiguousOutcomeError, un as IntrinsicResolutionRefusalError, ur as markRedactedCause, 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-DAs3w7QW.js";
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-DTSDiQcV.js";
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 dockerSpawnEnvWithSensitive(sensitiveEnv) {
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
- return evaluate(choose(args[0]) ? args[1] : args[2]);
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
- function rereadAssignments(source, bind, parentSecrets, untakenWhenUnbound = () => false) {
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 resolved = evaluatePureRead(source, tracked, plainSplit, choose);
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 (resolved === void 0 || redacted === void 0) out.push(void 0);
8255
- else if (resolved.value === REREAD_NO_VALUE || redacted.value === REREAD_NO_VALUE) out.push(resolved.value === redacted.value ? REREAD_NO_VALUE : void 0);
8256
- else if (!rendersReadTo(redacted.value, parentSecrets, resolved.value)) out.push(void 0);
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
- const rereads = assignments.filter((entry) => entry !== void 0 && entry !== REREAD_NO_VALUE && entry !== REREAD_UNBOUND);
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
- const declared = reads.declared;
8279
- const assignments = rereadAssignments(source, (name) => reads.values.has(name) ? { value: reads.values.get(name) } : void 0, reads.parent, (name) => declared?.has(name) === true);
8280
- if (assignments === void 0 || assignments.includes(void 0)) return void 0;
8281
- const matching = assignments.filter((entry) => entry !== void 0 && entry !== REREAD_NO_VALUE && entry !== REREAD_UNBOUND && deepEqualJsonValue(entry.resolved, bag));
8282
- if (matching.length === 0 || ambiguousRereads(matching)) return void 0;
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
- const drops = source.map((element) => arrayElementDrop(element));
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)) return (await allSettledKeepingFirstRejection(() => value.map((v) => this.resolveValue(v, context)), (pending) => this.warnAbandonedParts(pending))).filter((v) => v !== AWS_NO_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-BS5i71bK.js");
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-DraxDuQq.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-CqZ1FaqT.js"))).NeptuneProvider({ region: ccRegion });
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-BK4gG_5A.js.map
48031
+ //# sourceMappingURL=deploy-engine-DOBzE5TD.js.map