@go-to-k/cdkd 0.284.12 → 0.284.13

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/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as isTerminationProtectionPropagationError, $n as ResourceUpdateNotSupportedError, $t as validateAssetBucketName, A as renderStatefulReason, An as derivePartitionAndUrlSuffix, At as INTRINSIC_KEYS, B as exportAliasCollisionScrubWarning, Bn as CdkdError, Bt as stringifyValue, C as isFinalSnapshotError, Cn as CFN_TEMPLATE_URL_LIMIT, Ct as s3BucketArn, D as extractDeploymentEventError, Dn as expectedOwnerParam, Dt as s3BucketWebsiteUrl, E as makeCanonicalizePropertiesFn, En as uploadCfnTemplate, Et as s3BucketRegionalDomainName, F as green, Fn as AwsClients, Ft as LockManager, G as collectInlinePolicyNamesManagedBySiblings, Gn as LocalMigrateError, Gt as rewriteTemplateAssetReferences, H as secretBearingStateKeyWarning, Ht as buildAssetRedirectMap, I as red, In as getAwsClients, It as S3StateBackend, J as findActionableSilentDrops, Jn as MissingCdkCliError, Jt as AssetModeResolver, K as clearOnUpdateRemoval, Kn as LocalStartServiceError, Kt as escapeRegExp, L as yellow, Ln as resetAwsClients, Lt as rebuildClientForBucketRegion, M as bold, Mn as processStackMessages, Mt as withRetry, N as cyan, Nt as DagBuilder, O as MULTI_REGION_RECREATE_BLOCKED_TYPES, On as PARTITION_TABLE, Ot as applyRoleArnIfSet, P as gray, Pn as resolveBucketRegion, Pt as TemplateParser, Q as disableInstanceApiTermination, Qn as ResourceTimeoutError, Qt as parseBootstrapMarker, R as collectDeclaredOutputNames, Rn as setAwsClients, Rt as shouldRetainResource, S as createPreDeleteFinalSnapshot, Sn as CFN_TEMPLATE_BODY_LIMIT, St as scrubResourceRecord, T as unsupportedFinalSnapshotError, Tn as findLargeInlineResources, Tt as s3BucketDualStackDomainName, U as stateKeySecretExposure, Un as DeployCancelledError, Ut as createAssetRedirectResolver, V as isExportAliasCollision, Vt as WorkGraph, W as IAMRoleProvider, Wn as LocalInvokeBuildError$1, Wt as loadPublishableAssetManifest, X as CloudControlProvider, Xn as PartialFailureError, Xt as ensureAssetStorage, Y as findSilentDropProperties, Yn as NestedStackChildDirectDestroyError, Yt as BOOTSTRAP_MARKER_PREFIX, Z as slowCcOperationTimeoutMs, Zn as ProvisioningError, Zt as getBootstrapMarkerKey, _ as computeImplicitDeleteEdges, _n as resolveStateBucketWithDefault, _t as STATE_SOURCED_READBACK_RULES, a as DeploymentEventsStore, an as runDockerForeground, at as normalizeAwsTagsToCfn, b as buildFinalSnapshotIdentifier, bn as stateBucketExistenceConfirmed, bt as maskSecretsInText, c as replayFailedOperations, cn as getDockerImageBySourceHash, cr as isMarkedNonRetryable, ct as coerceCfnBoolean, d as updatePartialReason, dn as getDefaultStateBucketName, dr as markNonRetryable, dt as readConfigString, en as validateContainerRepoName, er as StackHasActiveImportsError, et as IntrinsicFunctionResolver, f as UNSPECIFIED_SKIP_REASON, fn as getLegacyStateBucketName, ft as replayWarn, g as IMPLICIT_DELETE_DEPENDENCIES, gn as resolveSkipPrefix, gt as STATE_SOURCED_CROSS_GENERATION_RULES, h as maskingRetryLogger, hn as resolveCaptureObservedState, ht as requireConfigString, i as DeploymentEventsReader, in as getDockerCmd, it as WAFv2WebACLProvider, j as formatResourceLine, jn as AssemblyReader, jt as describeTypeWithThrottleRetry, k as isStatefulRecreateTargetSync, kn as canonicalizeRegion, kt as DiffCalculator, l as replayRollback, ln as Synthesizer, lr as isRetryableTransientError, lt as configBooleanRefusal, m as withResourceDeadline, mn as resolveAutoAssetStorage, mt as requireConfigObject, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as buildDockerImage, nt as getAccountInfo, o as planFailedOps, on as runDockerStreaming, or as normalizeAwsError, ot as resolveExplicitPhysicalId, p as deleteSkipReason, pn as resolveApp, pt as requireConfigArray, q as ProviderRegistry, qt as stripControlChars, r as DeployEngine, rn as formatDockerLoginError, rt as refStateLookupFromResource, s as planRollback, sn as AssetManifestLoader, sr as withErrorHandling, st as assertRegionMatch, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as buildDenyExternalAccessPolicy, tr as StackTerminationProtectionError, tt as cfnRefValueFromPhysicalId, u as updatePartialMessage, un as synthesisStatusMessage, ur as isThrottlingError, ut as configStringRefusal, v as ATOMIC_FINAL_SNAPSHOT_TYPES, vn as resolveStateBucketWithDefaultAndSource, vt as TEMPLATE_SOURCED_RULES, w as refusesFinalSnapshot, wn as MIGRATE_TMP_PREFIX, wt as s3BucketDomainName, x as ccRoutedFinalSnapshotError, xn as warnDeprecatedNoPrefixCliFlag, xt as redactSecretsForState, y as PRE_DELETE_SNAPSHOT_TYPES, yn as resolveUseCdkBootstrapAssets, yt as createSecretMasker, z as collectPublishedOutputNames, zt as AssetPublisher } from "./deploy-engine-nwoIJsLn.js";
2
+ import { $ as isTerminationProtectionPropagationError, $n as ResourceUpdateNotSupportedError, $t as validateAssetBucketName, A as renderStatefulReason, An as derivePartitionAndUrlSuffix, At as INTRINSIC_KEYS, B as exportAliasCollisionScrubWarning, Bn as CdkdError, Bt as stringifyValue, C as isFinalSnapshotError, Cn as CFN_TEMPLATE_URL_LIMIT, Ct as s3BucketArn, D as extractDeploymentEventError, Dn as expectedOwnerParam, Dt as s3BucketWebsiteUrl, E as makeCanonicalizePropertiesFn, En as uploadCfnTemplate, Et as s3BucketRegionalDomainName, F as green, Fn as AwsClients, Ft as LockManager, G as collectInlinePolicyNamesManagedBySiblings, Gn as LocalMigrateError, Gt as rewriteTemplateAssetReferences, H as secretBearingStateKeyWarning, Ht as buildAssetRedirectMap, I as red, In as getAwsClients, It as S3StateBackend, J as findActionableSilentDrops, Jn as MissingCdkCliError, Jt as AssetModeResolver, K as clearOnUpdateRemoval, Kn as LocalStartServiceError, Kt as escapeRegExp, L as yellow, Ln as resetAwsClients, Lt as rebuildClientForBucketRegion, M as bold, Mn as processStackMessages, Mt as withRetry, N as cyan, Nt as DagBuilder, O as MULTI_REGION_RECREATE_BLOCKED_TYPES, On as PARTITION_TABLE, Ot as applyRoleArnIfSet, P as gray, Pn as resolveBucketRegion, Pt as TemplateParser, Q as disableInstanceApiTermination, Qn as ResourceTimeoutError, Qt as parseBootstrapMarker, R as collectDeclaredOutputNames, Rn as setAwsClients, Rt as shouldRetainResource, S as createPreDeleteFinalSnapshot, Sn as CFN_TEMPLATE_BODY_LIMIT, St as scrubResourceRecord, T as unsupportedFinalSnapshotError, Tn as findLargeInlineResources, Tt as s3BucketDualStackDomainName, U as stateKeySecretExposure, Un as DeployCancelledError, Ut as createAssetRedirectResolver, V as isExportAliasCollision, Vt as WorkGraph, W as IAMRoleProvider, Wn as LocalInvokeBuildError$1, Wt as loadPublishableAssetManifest, X as CloudControlProvider, Xn as PartialFailureError, Xt as ensureAssetStorage, Y as findSilentDropProperties, Yn as NestedStackChildDirectDestroyError, Yt as BOOTSTRAP_MARKER_PREFIX, Z as slowCcOperationTimeoutMs, Zn as ProvisioningError, Zt as getBootstrapMarkerKey, _ as computeImplicitDeleteEdges, _n as resolveStateBucketWithDefault, _t as STATE_SOURCED_READBACK_RULES, a as DeploymentEventsStore, an as runDockerForeground, at as normalizeAwsTagsToCfn, b as buildFinalSnapshotIdentifier, bn as stateBucketExistenceConfirmed, bt as maskSecretsInText, c as replayFailedOperations, cn as getDockerImageBySourceHash, cr as isMarkedNonRetryable, ct as coerceCfnBoolean, d as updatePartialReason, dn as getDefaultStateBucketName, dr as markNonRetryable, dt as readConfigString, en as validateContainerRepoName, er as StackHasActiveImportsError, et as IntrinsicFunctionResolver, f as UNSPECIFIED_SKIP_REASON, fn as getLegacyStateBucketName, ft as replayWarn, g as IMPLICIT_DELETE_DEPENDENCIES, gn as resolveSkipPrefix, gt as STATE_SOURCED_CROSS_GENERATION_RULES, h as maskingRetryLogger, hn as resolveCaptureObservedState, ht as requireConfigString, i as DeploymentEventsReader, in as getDockerCmd, it as WAFv2WebACLProvider, j as formatResourceLine, jn as AssemblyReader, jt as describeTypeWithThrottleRetry, k as isStatefulRecreateTargetSync, kn as canonicalizeRegion, kt as DiffCalculator, l as replayRollback, ln as Synthesizer, lr as isRetryableTransientError, lt as configBooleanRefusal, m as withResourceDeadline, mn as resolveAutoAssetStorage, mt as requireConfigObject, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as buildDockerImage, nt as getAccountInfo, o as planFailedOps, on as runDockerStreaming, or as normalizeAwsError, ot as resolveExplicitPhysicalId, p as deleteSkipReason, pn as resolveApp, pt as requireConfigArray, q as ProviderRegistry, qt as stripControlChars, r as DeployEngine, rn as formatDockerLoginError, rt as refStateLookupFromResource, s as planRollback, sn as AssetManifestLoader, sr as withErrorHandling, st as assertRegionMatch, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as buildDenyExternalAccessPolicy, tr as StackTerminationProtectionError, tt as cfnRefValueFromPhysicalId, u as updatePartialMessage, un as synthesisStatusMessage, ur as isThrottlingError, ut as configStringRefusal, v as ATOMIC_FINAL_SNAPSHOT_TYPES, vn as resolveStateBucketWithDefaultAndSource, vt as TEMPLATE_SOURCED_RULES, w as refusesFinalSnapshot, wn as MIGRATE_TMP_PREFIX, wt as s3BucketDomainName, x as ccRoutedFinalSnapshotError, xn as warnDeprecatedNoPrefixCliFlag, xt as redactSecretsForState, y as PRE_DELETE_SNAPSHOT_TYPES, yn as resolveUseCdkBootstrapAssets, yt as createSecretMasker, z as collectPublishedOutputNames, zt as AssetPublisher } from "./deploy-engine-4Eh5Qqlm.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, h as withStackName, i as runStackBuffered, m as withSkipPrefix, n as getLogger, o as PATTERN_B_NAME_OPTIONS, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-zRrlbaQt.js";
4
- import { t as ASGProvider } from "./asg-provider-CkIFzX7p.js";
4
+ import { t as ASGProvider } from "./asg-provider-H-Dl8qng.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -33995,6 +33995,44 @@ var ECSProvider = class {
33995
33995
  }
33996
33996
  };
33997
33997
 
33998
+ //#endregion
33999
+ //#region src/provisioning/masked-retry-logger.ts
34000
+ /**
34001
+ * The masker a caller supplied, or the identity function when it supplied
34002
+ * none.
34003
+ *
34004
+ * ABSENT MEANS UNMASKED, and that is the back-compatible default the contract
34005
+ * mandates — `create()` / `update()` are also reached from the import path,
34006
+ * from `cdkd drift --revert`, and from tests, and a provider must not care
34007
+ * which caller it got. Centralised here so no call site re-spells the `??`
34008
+ * and accidentally makes the capability required.
34009
+ */
34010
+ function maskerOrIdentity(maskSecrets) {
34011
+ return maskSecrets ?? ((text) => text);
34012
+ }
34013
+ /**
34014
+ * A {@link RetryLogger} whose every line is routed through `maskSecrets`.
34015
+ *
34016
+ * `warn` is ALWAYS provided, never omitted. It is optional on `RetryLogger`,
34017
+ * and dropping it would silence the give-up summary on the calling path only —
34018
+ * trading a disclosure for the reporting hole issue #2018 closed. It goes
34019
+ * through the SAME mask as `debug` precisely because it is the line that
34020
+ * survives a run without `--verbose`; forwarding it unmasked would defeat the
34021
+ * fence at a HIGHER log level than the one the fence was written for.
34022
+ *
34023
+ * `logger` is typed structurally rather than as the concrete `Logger` so this
34024
+ * module stays a leaf and a test can pass two spies. That matches the
34025
+ * precedent already in the tree (`buildMfaConfigRequest` in
34026
+ * `cognito-provider.ts` takes an injected `logger?: { warn }`).
34027
+ */
34028
+ function createMaskedRetryLogger(logger, maskSecrets) {
34029
+ const mask = maskerOrIdentity(maskSecrets);
34030
+ return {
34031
+ debug: (message) => logger.debug(mask(message)),
34032
+ warn: (message) => logger.warn(mask(message))
34033
+ };
34034
+ }
34035
+
33998
34036
  //#endregion
33999
34037
  //#region src/provisioning/providers/elbv2-provider.ts
34000
34038
  /**
@@ -34004,6 +34042,41 @@ var ECSProvider = class {
34004
34042
  */
34005
34043
  const capacityReservationDelays = { sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)) };
34006
34044
  /**
34045
+ * Depth cap for {@link maskDeep}. Bounds a self-referential bag rather than
34046
+ * hanging; `JSON.stringify` would throw on one anyway, and a throw is the
34047
+ * better failure of the two.
34048
+ */
34049
+ const MASK_WALK_MAX_DEPTH$1 = 8;
34050
+ /**
34051
+ * Mask every string LEAF and KEY of an arbitrary value, returning a structure
34052
+ * safe to `JSON.stringify` into a log line (issue #2050).
34053
+ *
34054
+ * The ordering is the whole point. `maskSecretsInText` matches by literal
34055
+ * occurrence, and `JSON.stringify` escapes `"`, `\` and newlines — so a Secrets
34056
+ * Manager JSON document (the commonest real secret shape) does not occur in the
34057
+ * stringified text and survives a mask applied afterwards. Masking the leaves
34058
+ * first also hands the masker each RAW value, which reaches
34059
+ * `maskSecretsInText`'s whole-value arm at any length instead of only the
34060
+ * substring arm's 4-character floor. See the "three gaps" note in
34061
+ * `src/deployment/secret-redaction.ts`.
34062
+ *
34063
+ * Keys are masked as well as values: `JSON.stringify` renders them into the
34064
+ * same line, so a resolved secret used as a map key would otherwise escape.
34065
+ *
34066
+ * `cognito-provider.ts` carries an equivalent private walk for its own
34067
+ * stringified warnings. Two copies is the current cost of keeping this a leaf;
34068
+ * a THIRD site is the point at which this should move into
34069
+ * `../masked-retry-logger.ts` (already the shared provider-side masking module)
34070
+ * and all three converge on it.
34071
+ */
34072
+ function maskDeep(value, mask, depth = 0) {
34073
+ if (typeof value === "string") return mask(value);
34074
+ if (depth >= MASK_WALK_MAX_DEPTH$1) return value;
34075
+ if (Array.isArray(value)) return value.map((entry) => maskDeep(entry, mask, depth + 1));
34076
+ if (value !== null && typeof value === "object") return Object.fromEntries(Object.entries(value).map(([k, v]) => [mask(k), maskDeep(v, mask, depth + 1)]));
34077
+ return value;
34078
+ }
34079
+ /**
34007
34080
  * Documented AWS defaults for TargetGroup attributes, used to reset a
34008
34081
  * removed `TargetGroupAttributes` entry. Unlike ModifyLoadBalancerAttributes
34009
34082
  * / ModifyListenerAttributes, ModifyTargetGroupAttributes REJECTS an empty
@@ -34177,28 +34250,86 @@ var ELBv2Provider = class {
34177
34250
  if (!this.elbv2Client) this.elbv2Client = new ElasticLoadBalancingV2Client(this.providerRegion ? { region: this.providerRegion } : {});
34178
34251
  return this.elbv2Client;
34179
34252
  }
34180
- async create(logicalId, resourceType, properties) {
34253
+ /**
34254
+ * A {@link RetryLogger} for this provider's `withRetry` calls, bound to the
34255
+ * caller's secret masker (issue #2050).
34256
+ *
34257
+ * Thin wrapper over the shared {@link createMaskedRetryLogger} so the two
34258
+ * providers that need it cannot drift apart — see that module for why the
34259
+ * factory is shared rather than hand-rolled per file, and for the full
34260
+ * rationale on why `warn` is threaded rather than omitted.
34261
+ *
34262
+ * WHY NOT A `maskSecrets` OPTION ON `withRetry` (issue #2050 acceptance
34263
+ * item 3): `RetryLogger` is a structural type any caller can already satisfy
34264
+ * with a masking object — `drift.ts`'s revert has done exactly that since
34265
+ * issue #1914 — so the option would be a SECOND spelling of one intent
34266
+ * across ~50 existing call sites, and two spellings is how a later author
34267
+ * reaches for the unmasked one.
34268
+ */
34269
+ maskedRetryLogger(maskSecrets) {
34270
+ return createMaskedRetryLogger(this.logger, maskSecrets);
34271
+ }
34272
+ /**
34273
+ * Mask a caught AWS error's message before it is interpolated into the
34274
+ * `ProvisioningError` this provider throws (issue #2050, review round 2).
34275
+ *
34276
+ * NOT a duplicate of {@link maskedRetryLogger}, and strictly WIDER than it.
34277
+ * `withRetry` rethrows the RAW error, and `deploy-engine.ts` prints the
34278
+ * resulting message at ERROR — i.e. at DEFAULT verbosity — so a masked
34279
+ * give-up `warn` was being followed one line later by the identical text
34280
+ * unmasked. It is also the ONLY disclosure surface for a NON-RETRYABLE
34281
+ * rejection, where `withRetry` emits nothing at all: its give-up summary is
34282
+ * gated on `propagationRetries > 0 || serverErrorRetries > 0`, and a
34283
+ * validation error that fails on attempt 0 satisfies neither.
34284
+ *
34285
+ * Masks `error.message` rather than the assembled sentence ON PURPOSE. The
34286
+ * two are NOT equivalent: handing the masker the raw message can reach
34287
+ * `maskSecretsInText`'s WHOLE-VALUE arm, which matches at ANY length, while
34288
+ * a longer assembled sentence can only ever reach the SUBSTRING arm, which
34289
+ * ignores needles below 4 characters. See `SecretMaskingContext` in
34290
+ * `src/types/resource.ts`.
34291
+ *
34292
+ * The `cause` chain is deliberately left UNMASKED and unwrapped by every
34293
+ * caller of this helper: `isRetryableTransientError` walks `cause` for
34294
+ * `$metadata.httpStatusCode`, and rewriting or dropping it would silently
34295
+ * change retry classification. Only the human-readable message is rewritten.
34296
+ */
34297
+ maskErrorMessage(error, maskSecrets) {
34298
+ return maskerOrIdentity(maskSecrets)(error instanceof Error ? error.message : String(error));
34299
+ }
34300
+ /**
34301
+ * `context` is read for ONE thing today: `maskSecrets` (issue #2050). The
34302
+ * Listener create path runs a post-create `ModifyListenerAttributes` through
34303
+ * `withRetry`, whose per-attempt `debug` line and give-up `warn` summary
34304
+ * interpolate the AWS message verbatim — and that payload is built from
34305
+ * RESOLVED template properties. See {@link maskedRetryLogger}.
34306
+ */
34307
+ async create(logicalId, resourceType, properties, context) {
34181
34308
  switch (resourceType) {
34182
34309
  case "AWS::ElasticLoadBalancingV2::LoadBalancer": return this.createLoadBalancer(logicalId, resourceType, properties);
34183
- case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.createTargetGroup(logicalId, resourceType, properties);
34184
- case "AWS::ElasticLoadBalancingV2::Listener": return this.createListener(logicalId, resourceType, properties);
34310
+ case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.createTargetGroup(logicalId, resourceType, properties, context?.maskSecrets);
34311
+ case "AWS::ElasticLoadBalancingV2::Listener": return this.createListener(logicalId, resourceType, properties, context?.maskSecrets);
34185
34312
  default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
34186
34313
  }
34187
34314
  }
34188
- async update(logicalId, physicalId, resourceType, properties, previousProperties) {
34315
+ /**
34316
+ * `context` is read for ONE thing today: `maskSecrets` (issue #2050) — the
34317
+ * update-path twin of the `create()` note above.
34318
+ */
34319
+ async update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
34189
34320
  try {
34190
- return await this.applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties);
34321
+ return await this.applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties, context);
34191
34322
  } catch (error) {
34192
34323
  if (error instanceof CdkdError) throw error;
34193
34324
  const cause = error instanceof Error ? error : void 0;
34194
34325
  throw new ProvisioningError(`Failed to update ELBv2 resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
34195
34326
  }
34196
34327
  }
34197
- async applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties) {
34328
+ async applyUpdate(logicalId, physicalId, resourceType, properties, previousProperties, context) {
34198
34329
  switch (resourceType) {
34199
34330
  case "AWS::ElasticLoadBalancingV2::LoadBalancer": return this.updateLoadBalancer(logicalId, physicalId, resourceType, properties, previousProperties);
34200
- case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties);
34201
- case "AWS::ElasticLoadBalancingV2::Listener": return this.updateListener(logicalId, physicalId, resourceType, properties, previousProperties);
34331
+ case "AWS::ElasticLoadBalancingV2::TargetGroup": return this.updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
34332
+ case "AWS::ElasticLoadBalancingV2::Listener": return this.updateListener(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
34202
34333
  default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId, physicalId);
34203
34334
  }
34204
34335
  }
@@ -34443,7 +34574,7 @@ var ELBv2Provider = class {
34443
34574
  throw new ProvisioningError(`Failed to delete LoadBalancer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
34444
34575
  }
34445
34576
  }
34446
- async createTargetGroup(logicalId, resourceType, properties) {
34577
+ async createTargetGroup(logicalId, resourceType, properties, maskSecrets) {
34447
34578
  this.logger.debug(`Creating TargetGroup ${logicalId}`);
34448
34579
  try {
34449
34580
  const tags = this.extractTags(properties);
@@ -34481,7 +34612,7 @@ var ELBv2Provider = class {
34481
34612
  }));
34482
34613
  this.logger.debug(`Applied ${tgAttributes.length} TargetGroup attribute(s) for ${logicalId}`);
34483
34614
  }
34484
- const targets = this.convertTargets(properties["Targets"]);
34615
+ const targets = this.convertTargets(properties["Targets"], void 0, maskSecrets);
34485
34616
  if (targets.length > 0) {
34486
34617
  await this.getClient().send(new RegisterTargetsCommand({
34487
34618
  TargetGroupArn: tgArn,
@@ -34494,7 +34625,7 @@ var ELBv2Provider = class {
34494
34625
  await this.getClient().send(new DeleteTargetGroupCommand({ TargetGroupArn: tgArn }));
34495
34626
  this.logger.debug(`Cleaned up partially-created TargetGroup ${logicalId} (${tgArn}) after wiring failure`);
34496
34627
  } catch (cleanupError) {
34497
- this.logger.warn(`Failed to clean up partially-created TargetGroup ${logicalId} (${tgArn}): ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}. Manual deletion may be required before the next deploy: aws elbv2 delete-target-group --target-group-arn ${tgArn}`);
34628
+ this.logger.warn(`Failed to clean up partially-created TargetGroup ${logicalId} (${tgArn}): ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws elbv2 delete-target-group --target-group-arn ${tgArn}`);
34498
34629
  }
34499
34630
  throw innerError;
34500
34631
  }
@@ -34508,10 +34639,10 @@ var ELBv2Provider = class {
34508
34639
  };
34509
34640
  } catch (error) {
34510
34641
  const cause = error instanceof Error ? error : void 0;
34511
- throw new ProvisioningError(`Failed to create TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
34642
+ throw new ProvisioningError(`Failed to create TargetGroup ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
34512
34643
  }
34513
34644
  }
34514
- async updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties) {
34645
+ async updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
34515
34646
  this.logger.debug(`Updating TargetGroup ${logicalId}: ${physicalId}`);
34516
34647
  const immutableChanged = (key, coerce) => {
34517
34648
  const next = properties[key];
@@ -34539,7 +34670,7 @@ var ELBv2Provider = class {
34539
34670
  const tgAttrDiff = this.diffAttributes(this.normalizeAttributes(properties["TargetGroupAttributes"]), this.normalizeAttributes(previousProperties["TargetGroupAttributes"]), (key, currentValue) => {
34540
34671
  const fallback = Object.hasOwn(TARGET_GROUP_ATTRIBUTE_DEFAULTS, key) ? TARGET_GROUP_ATTRIBUTE_DEFAULTS[key] : void 0;
34541
34672
  if (fallback === void 0) {
34542
- this.logger.warn(`TargetGroup attribute ${key} was removed from the template but has no documented default cdkd can reset it to — the live value is retained. Set the attribute explicitly to change it.`);
34673
+ this.logger.warn(`TargetGroup attribute ${maskerOrIdentity(maskSecrets)(key)} was removed from the template but has no documented default cdkd can reset it to — the live value is retained. Set the attribute explicitly to change it.`);
34543
34674
  return;
34544
34675
  }
34545
34676
  return currentValue === fallback ? void 0 : fallback;
@@ -34551,8 +34682,8 @@ var ELBv2Provider = class {
34551
34682
  }));
34552
34683
  this.logger.debug(`Applied ${tgAttrDiff.length} TargetGroupAttributes change(s) for ${logicalId}`);
34553
34684
  }
34554
- const newTargets = this.convertTargets(properties["Targets"], properties["Port"]);
34555
- const oldTargets = this.convertTargets(previousProperties["Targets"], properties["Port"]);
34685
+ const newTargets = this.convertTargets(properties["Targets"], properties["Port"], maskSecrets);
34686
+ const oldTargets = this.convertTargets(previousProperties["Targets"], properties["Port"], maskSecrets);
34556
34687
  const targetKey = (t) => JSON.stringify([
34557
34688
  t.Id,
34558
34689
  t.Port ?? null,
@@ -34590,7 +34721,7 @@ var ELBv2Provider = class {
34590
34721
  };
34591
34722
  } catch (error) {
34592
34723
  const cause = error instanceof Error ? error : void 0;
34593
- throw new ProvisioningError(`Failed to update TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
34724
+ throw new ProvisioningError(`Failed to update TargetGroup ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
34594
34725
  }
34595
34726
  }
34596
34727
  async deleteTargetGroup(logicalId, physicalId, resourceType, context) {
@@ -34608,7 +34739,7 @@ var ELBv2Provider = class {
34608
34739
  throw new ProvisioningError(`Failed to delete TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
34609
34740
  }
34610
34741
  }
34611
- async createListener(logicalId, resourceType, properties) {
34742
+ async createListener(logicalId, resourceType, properties, maskSecrets) {
34612
34743
  this.logger.debug(`Creating Listener ${logicalId}`);
34613
34744
  try {
34614
34745
  const tags = this.extractTags(properties);
@@ -34636,7 +34767,7 @@ var ELBv2Provider = class {
34636
34767
  await withRetry(() => this.getClient().send(new ModifyListenerAttributesCommand({
34637
34768
  ListenerArn: listenerArn,
34638
34769
  Attributes: listenerAttributes
34639
- })), logicalId, { logger: this.logger });
34770
+ })), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
34640
34771
  this.logger.debug(`Applied ${listenerAttributes.length} ListenerAttribute(s) for ${logicalId}`);
34641
34772
  }
34642
34773
  } catch (innerError) {
@@ -34644,7 +34775,7 @@ var ELBv2Provider = class {
34644
34775
  await this.getClient().send(new DeleteListenerCommand({ ListenerArn: listenerArn }));
34645
34776
  this.logger.debug(`Cleaned up partially-created Listener ${logicalId} (${listenerArn}) after attributes-wiring failure`);
34646
34777
  } catch (cleanupError) {
34647
- this.logger.warn(`Failed to clean up partially-created Listener ${logicalId} (${listenerArn}): ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}. Manual deletion may be required before the next deploy: aws elbv2 delete-listener --listener-arn ${listenerArn}`);
34778
+ this.logger.warn(`Failed to clean up partially-created Listener ${logicalId} (${listenerArn}): ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws elbv2 delete-listener --listener-arn ${listenerArn}`);
34648
34779
  }
34649
34780
  throw innerError;
34650
34781
  }
@@ -34654,10 +34785,10 @@ var ELBv2Provider = class {
34654
34785
  };
34655
34786
  } catch (error) {
34656
34787
  const cause = error instanceof Error ? error : void 0;
34657
- throw new ProvisioningError(`Failed to create Listener ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
34788
+ throw new ProvisioningError(`Failed to create Listener ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
34658
34789
  }
34659
34790
  }
34660
- async updateListener(logicalId, physicalId, resourceType, properties, previousProperties) {
34791
+ async updateListener(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
34661
34792
  this.logger.debug(`Updating Listener ${logicalId}: ${physicalId}`);
34662
34793
  try {
34663
34794
  const defaultActions = this.convertActions(properties["DefaultActions"]);
@@ -34679,7 +34810,7 @@ var ELBv2Provider = class {
34679
34810
  await withRetry(() => this.getClient().send(new ModifyListenerAttributesCommand({
34680
34811
  ListenerArn: physicalId,
34681
34812
  Attributes: submittedAttrs
34682
- })), logicalId, { logger: this.logger });
34813
+ })), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
34683
34814
  this.logger.debug(`Applied ${submittedAttrs.length} ListenerAttributes change(s) for ${logicalId}`);
34684
34815
  }
34685
34816
  await this.applyTagDiff(physicalId, previousProperties["Tags"], properties["Tags"]);
@@ -34691,7 +34822,7 @@ var ELBv2Provider = class {
34691
34822
  };
34692
34823
  } catch (error) {
34693
34824
  const cause = error instanceof Error ? error : void 0;
34694
- throw new ProvisioningError(`Failed to update Listener ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
34825
+ throw new ProvisioningError(`Failed to update Listener ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
34695
34826
  }
34696
34827
  }
34697
34828
  async deleteListener(logicalId, physicalId, resourceType, context) {
@@ -34844,13 +34975,29 @@ var ELBv2Provider = class {
34844
34975
  * Absent for a `lambda` target group (no port), where both sides stay
34845
34976
  * undefined and therefore still key identically.
34846
34977
  */
34847
- convertTargets(raw, groupPort) {
34978
+ /**
34979
+ * `maskSecrets` (issue #2050) exists for the drop-warning below, which
34980
+ * stringifies a whole REJECTED `Targets` element at DEFAULT verbosity. That
34981
+ * element came out of the resolved `properties` bag, so a
34982
+ * `{{resolve:secretsmanager:...}}` scalar anywhere inside it — an `Id` built
34983
+ * by `Fn::Sub` from a secret, say — is already plaintext by the time this
34984
+ * runs.
34985
+ *
34986
+ * OPTIONAL, but all three call sites supply it today (`createTargetGroup` and
34987
+ * both `updateTargetGroup` sides). It stays optional because that is the
34988
+ * `SecretMaskingContext` contract — absent means unmasked — not because some
34989
+ * caller is known to omit it. An earlier revision of this comment claimed it
34990
+ * protected "the `readCurrentState` / diff callers that have no masker";
34991
+ * there are no such callers, and describing a defence by a consumer that does
34992
+ * not exist is how the next author concludes the parameter is dead.
34993
+ */
34994
+ convertTargets(raw, groupPort, maskSecrets) {
34848
34995
  const defaultPort = groupPort === void 0 || groupPort === null || Number.isNaN(Number(groupPort)) ? void 0 : Number(groupPort);
34849
34996
  if (!Array.isArray(raw)) return [];
34850
34997
  const out = [];
34851
34998
  for (const entry of raw) {
34852
34999
  if (entry === null || typeof entry !== "object" || typeof entry.Id !== "string" || entry.Id.length === 0) {
34853
- this.logger.warn(`Dropping malformed TargetGroup Targets entry (missing string Id): ${JSON.stringify(entry)}`);
35000
+ this.logger.warn(`Dropping malformed TargetGroup Targets entry (missing string Id): ${JSON.stringify(maskDeep(entry, maskerOrIdentity(maskSecrets)))}`);
34854
35001
  continue;
34855
35002
  }
34856
35003
  const e = entry;
@@ -41238,21 +41385,63 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41238
41385
  if (!this.stsClient) this.stsClient = new STSClient(this.providerRegion ? { region: this.providerRegion } : {});
41239
41386
  return this.stsClient;
41240
41387
  }
41241
- async create(logicalId, resourceType, properties) {
41388
+ /**
41389
+ * A {@link RetryLogger} for this provider's `withRetry` calls, bound to the
41390
+ * caller's secret masker (issue #2050).
41391
+ *
41392
+ * Thin wrapper over the shared {@link createMaskedRetryLogger} — see that
41393
+ * module for why the factory is shared with `elbv2-provider.ts` rather than
41394
+ * hand-rolled per file, and for why `warn` is threaded rather than omitted.
41395
+ *
41396
+ * NOT applied to `deleteNamespace`'s retry: that one sends a
41397
+ * `DeleteNamespaceCommand` carrying a physical id only, and `delete()` has no
41398
+ * `maskSecrets` to thread anyway (`DeleteContext` deliberately carries none).
41399
+ */
41400
+ maskedRetryLogger(maskSecrets) {
41401
+ return createMaskedRetryLogger(this.logger, maskSecrets);
41402
+ }
41403
+ /**
41404
+ * Mask a caught AWS error's message before it is interpolated into the
41405
+ * `ProvisioningError` this provider throws (issue #2050, review round 2).
41406
+ *
41407
+ * The twin of `ELBv2Provider.maskErrorMessage` — see that method for the full
41408
+ * rationale. In short: `withRetry` rethrows the RAW error and the deploy
41409
+ * engine prints the resulting message at ERROR (DEFAULT verbosity), so this
41410
+ * is a wider disclosure surface than the retry logger, and the ONLY one for a
41411
+ * NON-RETRYABLE rejection, where `withRetry` emits nothing at all.
41412
+ *
41413
+ * Masks `error.message` rather than the assembled sentence so the masker can
41414
+ * reach `maskSecretsInText`'s WHOLE-VALUE arm (any length) instead of only
41415
+ * the SUBSTRING arm (needles of 4+ characters). The `cause` chain is left
41416
+ * untouched so `isRetryableTransientError`'s `$metadata` walk is unaffected.
41417
+ */
41418
+ maskErrorMessage(error, maskSecrets) {
41419
+ return maskerOrIdentity(maskSecrets)(error instanceof Error ? error.message : String(error));
41420
+ }
41421
+ /**
41422
+ * `context` is read for ONE thing today: `maskSecrets` (issue #2050). The
41423
+ * Service create path runs a post-create `UpdateServiceAttributes` through
41424
+ * `withRetry` — see {@link maskedRetryLogger}.
41425
+ */
41426
+ async create(logicalId, resourceType, properties, context) {
41242
41427
  switch (resourceType) {
41243
41428
  case "AWS::ServiceDiscovery::PrivateDnsNamespace": return this.createNamespace(logicalId, resourceType, properties);
41244
41429
  case "AWS::ServiceDiscovery::HttpNamespace": return this.createHttpNamespace(logicalId, resourceType, properties);
41245
41430
  case "AWS::ServiceDiscovery::PublicDnsNamespace": return this.createPublicDnsNamespace(logicalId, resourceType, properties);
41246
- case "AWS::ServiceDiscovery::Service": return this.createService(logicalId, resourceType, properties);
41431
+ case "AWS::ServiceDiscovery::Service": return this.createService(logicalId, resourceType, properties, context?.maskSecrets);
41247
41432
  default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
41248
41433
  }
41249
41434
  }
41250
- update(logicalId, physicalId, resourceType, properties, previousProperties) {
41435
+ /**
41436
+ * `context` is read for ONE thing today: `maskSecrets` (issue #2050) — the
41437
+ * update-path twin of the `create()` note above.
41438
+ */
41439
+ update(logicalId, physicalId, resourceType, properties, previousProperties, context) {
41251
41440
  switch (resourceType) {
41252
41441
  case "AWS::ServiceDiscovery::PrivateDnsNamespace": return this.updateNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
41253
41442
  case "AWS::ServiceDiscovery::HttpNamespace": return this.updateHttpNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
41254
41443
  case "AWS::ServiceDiscovery::PublicDnsNamespace": return this.updatePublicDnsNamespace(logicalId, physicalId, resourceType, properties, previousProperties);
41255
- case "AWS::ServiceDiscovery::Service": return this.updateService(logicalId, physicalId, resourceType, properties, previousProperties);
41444
+ case "AWS::ServiceDiscovery::Service": return this.updateService(logicalId, physicalId, resourceType, properties, previousProperties, context?.maskSecrets);
41256
41445
  default: throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId, physicalId);
41257
41446
  }
41258
41447
  }
@@ -41540,7 +41729,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41540
41729
  throw new ProvisioningError(`Failed to update public DNS namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
41541
41730
  }
41542
41731
  }
41543
- async createService(logicalId, resourceType, properties) {
41732
+ async createService(logicalId, resourceType, properties, maskSecrets) {
41544
41733
  this.logger.debug(`Creating service discovery service ${logicalId}`);
41545
41734
  const client = this.getClient();
41546
41735
  const name = properties["Name"];
@@ -41572,7 +41761,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41572
41761
  await withRetry(() => client.send(new UpdateServiceAttributesCommand({
41573
41762
  ServiceId: serviceId,
41574
41763
  Attributes: attrs
41575
- })), logicalId, { logger: this.logger });
41764
+ })), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
41576
41765
  this.logger.debug(`Applied ${Object.keys(attrs).length} ServiceAttribute(s) for ${logicalId}`);
41577
41766
  }
41578
41767
  } catch (innerError) {
@@ -41580,7 +41769,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41580
41769
  await client.send(new DeleteServiceCommand$1({ Id: serviceId }));
41581
41770
  this.logger.debug(`Cleaned up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure`);
41582
41771
  } catch (cleanupError) {
41583
- this.logger.warn(`Failed to clean up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}. Manual deletion may be required before the next deploy: aws servicediscovery delete-service --id ${serviceId}`);
41772
+ this.logger.warn(`Failed to clean up partially-created ServiceDiscovery Service ${logicalId} (${serviceId}) after ServiceAttributes wiring failure: ${this.maskErrorMessage(cleanupError, maskSecrets)}. Manual deletion may be required before the next deploy: aws servicediscovery delete-service --id ${serviceId}`);
41584
41773
  }
41585
41774
  throw innerError;
41586
41775
  }
@@ -41594,7 +41783,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41594
41783
  };
41595
41784
  } catch (error) {
41596
41785
  const cause = error instanceof Error ? error : void 0;
41597
- throw new ProvisioningError(`Failed to create service discovery service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
41786
+ throw new ProvisioningError(`Failed to create service discovery service ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, void 0, cause);
41598
41787
  }
41599
41788
  }
41600
41789
  /**
@@ -41614,7 +41803,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41614
41803
  * full AWS-current snapshot as `properties`, so the round-trip is
41615
41804
  * value-preserving.
41616
41805
  */
41617
- async updateService(logicalId, physicalId, resourceType, properties, previousProperties) {
41806
+ async updateService(logicalId, physicalId, resourceType, properties, previousProperties, maskSecrets) {
41618
41807
  this.logger.debug(`Updating service discovery service ${logicalId}: ${physicalId}`);
41619
41808
  const client = this.getClient();
41620
41809
  const serviceChange = {};
@@ -41649,14 +41838,14 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41649
41838
  await withRetry(() => client.send(new UpdateServiceAttributesCommand({
41650
41839
  ServiceId: physicalId,
41651
41840
  Attributes: upsertAttrs
41652
- })), logicalId, { logger: this.logger });
41841
+ })), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
41653
41842
  this.logger.debug(`Applied ${Object.keys(upsertAttrs).length} ServiceAttribute change(s) for ${logicalId}`);
41654
41843
  }
41655
41844
  if (hasAttrRemove) {
41656
41845
  await withRetry(() => client.send(new DeleteServiceAttributesCommand({
41657
41846
  ServiceId: physicalId,
41658
41847
  Attributes: removedAttrKeys
41659
- })), logicalId, { logger: this.logger });
41848
+ })), logicalId, { logger: this.maskedRetryLogger(maskSecrets) });
41660
41849
  this.logger.debug(`Removed ${removedAttrKeys.length} ServiceAttribute(s) for ${logicalId}`);
41661
41850
  }
41662
41851
  this.logger.debug(`Successfully updated service discovery service ${logicalId}`);
@@ -41667,7 +41856,7 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
41667
41856
  } catch (error) {
41668
41857
  if (error instanceof ProvisioningError) throw error;
41669
41858
  const cause = error instanceof Error ? error : void 0;
41670
- throw new ProvisioningError(`Failed to update service discovery service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
41859
+ throw new ProvisioningError(`Failed to update service discovery service ${logicalId}: ${this.maskErrorMessage(error, maskSecrets)}`, resourceType, logicalId, physicalId, cause);
41671
41860
  }
41672
41861
  }
41673
41862
  async deleteService(logicalId, physicalId, resourceType, context) {
@@ -82709,7 +82898,7 @@ function createMigrateCommand() {
82709
82898
  */
82710
82899
  function buildProgram() {
82711
82900
  const program = new Command();
82712
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.12");
82901
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.13");
82713
82902
  program.hook("preAction", (_thisCommand, actionCommand) => {
82714
82903
  const { profile } = actionCommand.optsWithGlobals();
82715
82904
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;