@go-to-k/cdkd 0.278.45 → 0.278.47

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 DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-BmTgBkZO.js";
2
+ import { $ as DiffCalculator, $t as resolveBucketRegion, A as red, At as getDockerImageBySourceHash, B as isTerminationProtectionPropagationError, Bt as resolveStateBucketWithDefaultAndSource, C as isStatefulRecreateTargetSync, Ct as validateContainerRepoName, D as cyan, Dt as runDockerForeground, E as bold, En as withErrorHandling, Et as getDockerCmd, F as ProviderRegistry, Ft as resolveApp, G as normalizeAwsTagsToCfn, Gt as CFN_TEMPLATE_URL_LIMIT, H as cfnRefValueFromPhysicalId, Ht as stateBucketExistenceConfirmed, I as findActionableSilentDrops, It as resolveAutoAssetStorage, J as readConfigString, Jt as uploadCfnTemplate, K as resolveExplicitPhysicalId, Kt as MIGRATE_TMP_PREFIX, L as CloudControlProvider, Lt as resolveCaptureObservedState, M as IAMRoleProvider, Mt as synthesisStatusMessage, N as collectInlinePolicyNamesManagedBySiblings, Nt as getDefaultStateBucketName, O as gray, Ot as runDockerStreaming, P as clearOnUpdateRemoval, Pt as getLegacyStateBucketName, Q as applyRoleArnIfSet, R as slowCcOperationTimeoutMs, Rt as resolveSkipPrefix, S as MULTI_REGION_RECREATE_BLOCKED_TYPES, St as validateAssetBucketName, T as formatResourceLine, Tn as normalizeAwsError, Tt as formatDockerLoginError, U as refStateLookupFromResource, Ut as warnDeprecatedNoPrefixCliFlag, V as IntrinsicFunctionResolver, Vt as resolveUseCdkBootstrapAssets, W as WAFv2WebACLProvider, Wt as CFN_TEMPLATE_BODY_LIMIT, X as requireConfigArray, Xt as AssemblyReader, Y as replayWarn, Yt as expectedOwnerParam, Z as requireConfigString, Zt as processStackMessages, _ as createPreDeleteFinalSnapshot, _n as ResourceTimeoutError, _t as AssetModeResolver, a as DeploymentEventsStore, an as CdkdError, at as TemplateParser, b as unsupportedFinalSnapshotError, bn as StackTerminationProtectionError, bt as getBootstrapMarkerKey, c as replayFailedOperations, cn as DeployCancelledError, ct as rebuildClientForBucketRegion, d as IMPLICIT_DELETE_DEPENDENCIES, dn as LocalStartServiceError, dt as stringifyValue, en as AwsClients, et as describeTypeWithThrottleRetry, f as computeImplicitDeleteEdges, ft as WorkGraph, g as ccRoutedFinalSnapshotError, gn as ProvisioningError, gt as rewriteTemplateAssetReferences, h as buildFinalSnapshotIdentifier, hn as PartialFailureError, ht as loadPublishableAssetManifest, i as DeploymentEventsReader, it as DagBuilder, j as yellow, jt as Synthesizer, k as green, kt as AssetManifestLoader, l as replayRollback, ln as LocalInvokeBuildError$1, lt as shouldRetainResource, m as PRE_DELETE_SNAPSHOT_TYPES, mn as NestedStackChildDirectDestroyError, mt as createAssetRedirectResolver, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as resetAwsClients, nt as isRetryableTransientError, o as planFailedOps, ot as LockManager, p as ATOMIC_FINAL_SNAPSHOT_TYPES, pn as MissingCdkCliError, pt as buildAssetRedirectMap, q as assertRegionMatch, qt as findLargeInlineResources, r as DeployEngine, rn as setAwsClients, rt as isThrottlingError, s as planRollback, st as S3StateBackend, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as getAwsClients, tt as withRetry, u as withResourceDeadline, un as LocalMigrateError, ut as AssetPublisher, v as isFinalSnapshotError, vn as ResourceUpdateNotSupportedError, vt as BOOTSTRAP_MARKER_PREFIX, w as renderStatefulReason, wt as buildDockerImage, x as extractDeploymentEventError, xt as parseBootstrapMarker, y as refusesFinalSnapshot, yn as StackHasActiveImportsError, yt as ensureAssetStorage, z as disableInstanceApiTermination, zt as resolveStateBucketWithDefault } from "./deploy-engine-B8i-yWiB.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
4
- import { t as ASGProvider } from "./asg-provider-QfA3xnx8.js";
4
+ import { t as ASGProvider } from "./asg-provider-CLULpXoZ.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";
@@ -12529,14 +12529,19 @@ var DynamoDBGlobalTableProvider = class {
12529
12529
  * with the exact `aws dynamodb delete-table --table-name <id>` recovery
12530
12530
  * command.
12531
12531
  */
12532
- async create(logicalId, resourceType, properties) {
12532
+ async create(logicalId, resourceType, properties, context) {
12533
12533
  this.logger.debug(`Creating DynamoDB GlobalTable ${logicalId}`);
12534
12534
  const tableName = properties["TableName"] || generateResourceName(logicalId, { maxLength: 255 });
12535
12535
  const keySchema = properties["KeySchema"];
12536
12536
  const attributeDefinitions = properties["AttributeDefinitions"];
12537
12537
  if (!keySchema) throw new ProvisioningError(`KeySchema is required for DynamoDB GlobalTable ${logicalId}`, resourceType, logicalId);
12538
12538
  if (!attributeDefinitions) throw new ProvisioningError(`AttributeDefinitions is required for DynamoDB GlobalTable ${logicalId}`, resourceType, logicalId);
12539
- const billingMode = properties["BillingMode"] ?? "PAY_PER_REQUEST";
12539
+ let billingMode;
12540
+ try {
12541
+ billingMode = requireConfigString(properties["BillingMode"], "PAY_PER_REQUEST", "AWS::DynamoDB::GlobalTable BillingMode", replayWarn(this.logger, context));
12542
+ } catch (error) {
12543
+ throw new ProvisioningError(error instanceof Error ? error.message : String(error), resourceType, logicalId, void 0, error instanceof Error ? error : void 0);
12544
+ }
12540
12545
  const currentRegion = await this.dynamoDBClient.config.region() ?? "";
12541
12546
  const replicas = properties["Replicas"] ?? [];
12542
12547
  const createParams = {
@@ -12778,7 +12783,12 @@ var DynamoDBGlobalTableProvider = class {
12778
12783
  };
12779
12784
  if (tableArn) await this.applyTagDiff(tableArn, extractLocalTags(previousProperties), extractLocalTags(properties));
12780
12785
  const oldBilling = previousProperties["BillingMode"] ?? "PAY_PER_REQUEST";
12781
- const newBilling = properties["BillingMode"] ?? "PAY_PER_REQUEST";
12786
+ let billingUnusable = false;
12787
+ const requestedBilling = requireConfigString(properties["BillingMode"], "PAY_PER_REQUEST", "AWS::DynamoDB::GlobalTable BillingMode", { onUnusable: (message) => {
12788
+ billingUnusable = true;
12789
+ this.logger.warn(`${message} The table's current billing mode (${oldBilling}) is kept for this update rather than flipped to the default.`);
12790
+ } });
12791
+ const newBilling = billingUnusable ? oldBilling : requestedBilling;
12782
12792
  const onDemandCeilingLive = oldBilling === "PAY_PER_REQUEST" && newBilling === "PAY_PER_REQUEST";
12783
12793
  const diagnostics = [];
12784
12794
  const desiredCeilings = collectTableOnDemandCeilings(properties, currentRegion, diagnostics);
@@ -30442,8 +30452,8 @@ var Route53Provider = class {
30442
30452
  Id: physicalId,
30443
30453
  Comment: comment
30444
30454
  }));
30445
- await this.applyHostedZoneTags(physicalId, properties, logicalId);
30446
- await this.applyQueryLoggingConfig(physicalId, properties, logicalId);
30455
+ await this.applyHostedZoneTags(physicalId, properties, logicalId, previousProperties);
30456
+ await this.applyQueryLoggingConfig(physicalId, properties, logicalId, previousProperties);
30447
30457
  await this.syncVPCAssociations(physicalId, properties, logicalId);
30448
30458
  const prevEnabled = previousProperties["HostedZoneFeatures"]?.["AcceleratedRecoveryStatus"] === "ENABLED";
30449
30459
  const nextEnabled = properties["HostedZoneFeatures"]?.["AcceleratedRecoveryStatus"] === "ENABLED";
@@ -30462,6 +30472,7 @@ var Route53Provider = class {
30462
30472
  }
30463
30473
  };
30464
30474
  } catch (error) {
30475
+ if (error instanceof CdkdError) throw error;
30465
30476
  const cause = error instanceof Error ? error : void 0;
30466
30477
  throw new ProvisioningError(`Failed to update hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
30467
30478
  }
@@ -30786,34 +30797,95 @@ var Route53Provider = class {
30786
30797
  /**
30787
30798
  * Apply tags to a hosted zone using ChangeTagsForResource.
30788
30799
  * CFn property: HostedZoneTags (array of {Key, Value}).
30789
- */
30790
- async applyHostedZoneTags(zoneId, properties, logicalId) {
30791
- const tags = properties["HostedZoneTags"];
30792
- if (!tags || !Array.isArray(tags) || tags.length === 0) return;
30800
+ *
30801
+ * `previousProperties` is passed on the UPDATE path only, and turns this
30802
+ * from an add-only apply into a real DIFF (issue #1160). Without it a tag
30803
+ * removed from the template stayed on the zone forever — the add-only shape
30804
+ * has no way to express a removal, and the `length === 0` early return made
30805
+ * clearing ALL tags a silent no-op. `ChangeTagsForResource` takes
30806
+ * `RemoveTagKeys` alongside `AddTags` in ONE call, and CloudFormation does
30807
+ * untag a removed tag (live A/B, 2026-08-10), so the previous-minus-desired
30808
+ * key set is sent as removals. Create keeps passing `undefined` — there is
30809
+ * nothing to remove from a zone that did not exist a moment ago.
30810
+ */
30811
+ async applyHostedZoneTags(zoneId, properties, logicalId, previousProperties) {
30812
+ const desiredRaw = properties["HostedZoneTags"];
30813
+ if (desiredRaw != null && !Array.isArray(desiredRaw)) {
30814
+ this.logger.warn(`AWS::Route53::HostedZone HostedZoneTags must be an array on ${logicalId}; ignoring it and leaving the live tags untouched (no tag is added or removed)`);
30815
+ return;
30816
+ }
30817
+ const tags = this.readHostedZoneTags(properties);
30818
+ if (Array.isArray(desiredRaw) && tags.length !== desiredRaw.length) {
30819
+ this.logger.warn(`AWS::Route53::HostedZone HostedZoneTags on ${logicalId} carries ${desiredRaw.length - tags.length} entr(y|ies) with a non-string Key or Value (check for an unresolved intrinsic); leaving the live tags untouched rather than applying a partial set or removing the tags those entries name`);
30820
+ return;
30821
+ }
30822
+ const previousTags = previousProperties ? this.readHostedZoneTags(previousProperties) : void 0;
30823
+ const desiredKeys = new Set(tags.map((t) => t.Key));
30824
+ const removeTagKeys = [...new Set((previousTags ?? []).map((t) => t.Key).filter((key) => key.length > 0 && !desiredKeys.has(key)))];
30825
+ if (tags.length === 0 && removeTagKeys.length === 0) return;
30793
30826
  try {
30794
30827
  await this.getClient().send(new ChangeTagsForResourceCommand({
30795
30828
  ResourceType: "hostedzone",
30796
30829
  ResourceId: zoneId,
30797
- AddTags: tags.map((t) => ({
30830
+ ...tags.length > 0 && { AddTags: tags.map((t) => ({
30798
30831
  Key: t.Key,
30799
30832
  Value: t.Value
30800
- }))
30833
+ })) },
30834
+ ...removeTagKeys.length > 0 && { RemoveTagKeys: removeTagKeys }
30801
30835
  }));
30802
- this.logger.debug(`Applied ${tags.length} tag(s) to hosted zone ${logicalId}`);
30836
+ this.logger.debug(`Applied ${tags.length} tag(s) and removed ${removeTagKeys.length} tag(s) on hosted zone ${logicalId}`);
30803
30837
  } catch (error) {
30804
- this.logger.warn(`Failed to apply tags to hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`);
30838
+ const detail = error instanceof Error ? error.message : String(error);
30839
+ if (removeTagKeys.length > 0) throw new ProvisioningError(`Failed to remove tag(s) ${removeTagKeys.join(", ")} from hosted zone ${logicalId}: ${detail}. The removal will NOT be retried on the next deploy (state no longer records the tag), so it is reported instead of ignored.`, "AWS::Route53::HostedZone", logicalId, zoneId, error instanceof Error ? error : void 0);
30840
+ this.logger.warn(`Failed to apply tags to hosted zone ${logicalId}: ${detail}`);
30805
30841
  }
30806
30842
  }
30807
30843
  /**
30844
+ * Read `HostedZoneTags` off a property bag, dropping entries whose shape an
30845
+ * unresolved intrinsic or a hand-authored L1 made unusable. Returns a
30846
+ * possibly-SHORTER list rather than throwing — the caller compares the length
30847
+ * against the raw input to decide whether the read was lossy, and only the
30848
+ * DESIRED side treats a lossy read as a refusal. The previous (state-borne)
30849
+ * side stays permissive: a record an older binary wrote must not block an
30850
+ * ordinary update, which a rollback replay could not then edit its way out of.
30851
+ *
30852
+ * `Value` is validated as well as `Key`. Route 53 rejects a tag whose value
30853
+ * is absent or non-string, and because Add and Remove ride the SAME
30854
+ * `ChangeTagsForResource` call, one bad value would fail the whole request —
30855
+ * silently taking the REMOVALS down with it.
30856
+ */
30857
+ readHostedZoneTags(properties) {
30858
+ const tags = properties["HostedZoneTags"];
30859
+ if (!Array.isArray(tags)) return [];
30860
+ return tags.filter((t) => {
30861
+ if (typeof t !== "object" || t === null) return false;
30862
+ const entry = t;
30863
+ return typeof entry.Key === "string" && typeof entry.Value === "string";
30864
+ });
30865
+ }
30866
+ /**
30808
30867
  * Apply QueryLoggingConfig to a hosted zone.
30809
30868
  * CFn property: QueryLoggingConfig ({ CloudWatchLogsLogGroupArn }).
30810
30869
  * Only one query logging config per hosted zone is allowed.
30811
30870
  */
30812
- async applyQueryLoggingConfig(zoneId, properties, logicalId) {
30813
- const queryLoggingConfig = properties["QueryLoggingConfig"];
30814
- if (!queryLoggingConfig) return;
30815
- const cloudWatchLogsLogGroupArn = queryLoggingConfig["CloudWatchLogsLogGroupArn"];
30816
- if (!cloudWatchLogsLogGroupArn) return;
30871
+ async applyQueryLoggingConfig(zoneId, properties, logicalId, previousProperties) {
30872
+ const cloudWatchLogsLogGroupArn = this.readQueryLogGroupArn(properties);
30873
+ const desiredBlock = properties["QueryLoggingConfig"];
30874
+ const desiredBlockIsObject = typeof desiredBlock === "object" && desiredBlock !== null && !Array.isArray(desiredBlock);
30875
+ const desiredArnPresent = desiredBlockIsObject && desiredBlock["CloudWatchLogsLogGroupArn"] !== void 0;
30876
+ if (cloudWatchLogsLogGroupArn === void 0 && desiredBlock != null && (!desiredBlockIsObject || desiredArnPresent)) {
30877
+ this.logger.warn(`AWS::Route53::HostedZone QueryLoggingConfig on ${logicalId} carries no usable CloudWatchLogsLogGroupArn; leaving the live query logging config untouched (omit the block entirely to delete it)`);
30878
+ return;
30879
+ }
30880
+ if (cloudWatchLogsLogGroupArn === void 0) {
30881
+ if (previousProperties !== void 0 && this.readQueryLogGroupArn(previousProperties)) {
30882
+ this.logger.debug(`QueryLoggingConfig removed from template for hosted zone ${logicalId}; deleting the live config`);
30883
+ await this.deleteQueryLoggingConfigForZone(zoneId, logicalId);
30884
+ const remaining = await this.listQueryLoggingConfigIds(zoneId);
30885
+ if (remaining.length > 0) throw new ProvisioningError(`QueryLoggingConfig was removed from the template for hosted zone ${logicalId} but the live config (${remaining.join(", ")}) is still present. The removal will NOT be retried on the next deploy (state no longer records the property), so it is reported instead of ignored.`, "AWS::Route53::HostedZone", logicalId, zoneId);
30886
+ }
30887
+ return;
30888
+ }
30817
30889
  try {
30818
30890
  await this.deleteQueryLoggingConfigForZone(zoneId, logicalId);
30819
30891
  await this.getClient().send(new CreateQueryLoggingConfigCommand({
@@ -30830,6 +30902,36 @@ var Route53Provider = class {
30830
30902
  }
30831
30903
  }
30832
30904
  /**
30905
+ * Read `QueryLoggingConfig.CloudWatchLogsLogGroupArn` off a property bag,
30906
+ * returning `undefined` for an absent block, a malformed container, or a
30907
+ * blank / non-string ARN. One helper so the DESIRED and PREVIOUS sides
30908
+ * cannot classify the same shape differently — an asymmetry there would
30909
+ * make a removal fire (or not) depending on which side was malformed.
30910
+ */
30911
+ readQueryLogGroupArn(properties) {
30912
+ const config = properties["QueryLoggingConfig"];
30913
+ if (typeof config !== "object" || config === null || Array.isArray(config)) return void 0;
30914
+ const arn = config["CloudWatchLogsLogGroupArn"];
30915
+ return typeof arn === "string" && arn.length > 0 ? arn : void 0;
30916
+ }
30917
+ /**
30918
+ * List the live query-logging config ids for a hosted zone.
30919
+ *
30920
+ * Used by the REMOVAL path to VERIFY the delete landed, because
30921
+ * `deleteQueryLoggingConfigForZone` deliberately swallows its failures and a
30922
+ * swallowed removal is permanent (see the call site). A zone that has gone
30923
+ * away counts as "no config", so the NotFound shapes resolve to `[]` rather
30924
+ * than failing the deploy on a resource that is already absent.
30925
+ */
30926
+ async listQueryLoggingConfigIds(zoneId) {
30927
+ try {
30928
+ return ((await this.getClient().send(new ListQueryLoggingConfigsCommand({ HostedZoneId: zoneId }))).QueryLoggingConfigs ?? []).map((config) => config.Id).filter((id) => typeof id === "string");
30929
+ } catch (error) {
30930
+ if (error instanceof Error && (error.name === "NoSuchHostedZone" || error.name === "NoSuchQueryLoggingConfig")) return [];
30931
+ throw error;
30932
+ }
30933
+ }
30934
+ /**
30833
30935
  * Delete query logging config(s) for a hosted zone.
30834
30936
  */
30835
30937
  async deleteQueryLoggingConfigForZone(zoneId, logicalId) {
@@ -67462,7 +67564,7 @@ function createMigrateCommand() {
67462
67564
  */
67463
67565
  function buildProgram() {
67464
67566
  const program = new Command();
67465
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.45");
67567
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.278.47");
67466
67568
  program.hook("preAction", (_thisCommand, actionCommand) => {
67467
67569
  const { profile } = actionCommand.optsWithGlobals();
67468
67570
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;