@go-to-k/cdkd 0.50.8 → 0.50.10

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
@@ -16755,23 +16755,28 @@ var DynamoDBTableProvider = class {
16755
16755
  WriteCapacityUnits: table.ProvisionedThroughput.WriteCapacityUnits
16756
16756
  };
16757
16757
  }
16758
- if (table.StreamSpecification) {
16758
+ if (table.StreamSpecification?.StreamEnabled && table.StreamSpecification.StreamViewType) {
16759
16759
  result["StreamSpecification"] = {
16760
- StreamEnabled: table.StreamSpecification.StreamEnabled,
16760
+ StreamEnabled: true,
16761
16761
  StreamViewType: table.StreamSpecification.StreamViewType
16762
16762
  };
16763
16763
  }
16764
- result["GlobalSecondaryIndexes"] = table.GlobalSecondaryIndexes ?? [];
16765
- result["LocalSecondaryIndexes"] = table.LocalSecondaryIndexes ?? [];
16766
- const sse = {
16767
- SSEEnabled: table.SSEDescription?.Status === "ENABLED"
16768
- };
16769
- if (table.SSEDescription?.KMSMasterKeyArn !== void 0) {
16770
- sse["KMSMasterKeyId"] = table.SSEDescription.KMSMasterKeyArn;
16764
+ if (table.GlobalSecondaryIndexes && table.GlobalSecondaryIndexes.length > 0) {
16765
+ result["GlobalSecondaryIndexes"] = table.GlobalSecondaryIndexes;
16766
+ }
16767
+ if (table.LocalSecondaryIndexes && table.LocalSecondaryIndexes.length > 0) {
16768
+ result["LocalSecondaryIndexes"] = table.LocalSecondaryIndexes;
16769
+ }
16770
+ if (table.SSEDescription?.Status === "ENABLED") {
16771
+ const sse = { SSEEnabled: true };
16772
+ if (table.SSEDescription.KMSMasterKeyArn !== void 0) {
16773
+ sse["KMSMasterKeyId"] = table.SSEDescription.KMSMasterKeyArn;
16774
+ }
16775
+ if (table.SSEDescription.SSEType !== void 0) {
16776
+ sse["SSEType"] = table.SSEDescription.SSEType;
16777
+ }
16778
+ result["SSESpecification"] = sse;
16771
16779
  }
16772
- if (table.SSEDescription?.SSEType !== void 0)
16773
- sse["SSEType"] = table.SSEDescription.SSEType;
16774
- result["SSESpecification"] = sse;
16775
16780
  if (table.DeletionProtectionEnabled !== void 0) {
16776
16781
  result["DeletionProtectionEnabled"] = table.DeletionProtectionEnabled;
16777
16782
  }
@@ -17724,9 +17729,9 @@ var SecretsManagerSecretProvider = class {
17724
17729
  };
17725
17730
  if (secretString)
17726
17731
  updateParams.SecretString = secretString;
17727
- if (properties["Description"])
17732
+ if (properties["Description"] !== void 0)
17728
17733
  updateParams.Description = properties["Description"];
17729
- if (properties["KmsKeyId"])
17734
+ if (properties["KmsKeyId"] !== void 0 && properties["KmsKeyId"] !== "")
17730
17735
  updateParams.KmsKeyId = properties["KmsKeyId"];
17731
17736
  await this.smClient.send(new UpdateSecretCommand(updateParams));
17732
17737
  const newTags = properties["Tags"];
@@ -19407,7 +19412,11 @@ var EC2Provider = class {
19407
19412
  case "AWS::EC2::NetworkAcl":
19408
19413
  case "AWS::EC2::NetworkAclEntry":
19409
19414
  case "AWS::EC2::SubnetNetworkAclAssociation":
19410
- return { physicalId, wasReplaced: false };
19415
+ throw new ResourceUpdateNotSupportedError(
19416
+ resourceType,
19417
+ logicalId,
19418
+ "destroy + redeploy. The property surface for this resource type is effectively immutable in cdkd today."
19419
+ );
19411
19420
  default:
19412
19421
  throw new ProvisioningError(
19413
19422
  `Unsupported resource type: ${resourceType}`,
@@ -19552,21 +19561,28 @@ var EC2Provider = class {
19552
19561
  async updateVpc(logicalId, physicalId, resourceType, properties, previousProperties) {
19553
19562
  this.logger.debug(`Updating VPC ${logicalId}: ${physicalId}`);
19554
19563
  try {
19555
- if (properties["EnableDnsHostnames"] !== void 0) {
19556
- const value = properties["EnableDnsHostnames"] === true || properties["EnableDnsHostnames"] === "true";
19564
+ const asBool = (v) => {
19565
+ if (v === void 0)
19566
+ return void 0;
19567
+ return v === true || v === "true";
19568
+ };
19569
+ const newDnsHostnames = asBool(properties["EnableDnsHostnames"]);
19570
+ const oldDnsHostnames = asBool(previousProperties["EnableDnsHostnames"]);
19571
+ if (newDnsHostnames !== void 0 && newDnsHostnames !== oldDnsHostnames) {
19557
19572
  await this.ec2Client.send(
19558
19573
  new ModifyVpcAttributeCommand({
19559
19574
  VpcId: physicalId,
19560
- EnableDnsHostnames: { Value: value }
19575
+ EnableDnsHostnames: { Value: newDnsHostnames }
19561
19576
  })
19562
19577
  );
19563
19578
  }
19564
- if (properties["EnableDnsSupport"] !== void 0) {
19565
- const value = properties["EnableDnsSupport"] === true || properties["EnableDnsSupport"] === "true";
19579
+ const newDnsSupport = asBool(properties["EnableDnsSupport"]);
19580
+ const oldDnsSupport = asBool(previousProperties["EnableDnsSupport"]);
19581
+ if (newDnsSupport !== void 0 && newDnsSupport !== oldDnsSupport) {
19566
19582
  await this.ec2Client.send(
19567
19583
  new ModifyVpcAttributeCommand({
19568
19584
  VpcId: physicalId,
19569
- EnableDnsSupport: { Value: value }
19585
+ EnableDnsSupport: { Value: newDnsSupport }
19570
19586
  })
19571
19587
  );
19572
19588
  }
@@ -19749,8 +19765,13 @@ var EC2Provider = class {
19749
19765
  }
19750
19766
  }
19751
19767
  updateSubnet(logicalId, physicalId) {
19752
- this.logger.debug(`Updating Subnet ${logicalId}: ${physicalId} (no-op, immutable properties)`);
19753
- return Promise.resolve({ physicalId, wasReplaced: false });
19768
+ return Promise.reject(
19769
+ new ResourceUpdateNotSupportedError(
19770
+ "AWS::EC2::Subnet",
19771
+ logicalId,
19772
+ "destroy + redeploy the Subnet (and the resources that depend on it). Subnet properties are immutable in AWS."
19773
+ )
19774
+ );
19754
19775
  }
19755
19776
  async deleteSubnet(logicalId, physicalId, resourceType, context) {
19756
19777
  this.logger.debug(`Deleting Subnet ${logicalId}: ${physicalId}`);
@@ -19885,8 +19906,13 @@ var EC2Provider = class {
19885
19906
  }
19886
19907
  }
19887
19908
  updateInternetGateway(logicalId, physicalId) {
19888
- this.logger.debug(`Updating InternetGateway ${logicalId}: ${physicalId} (no-op)`);
19889
- return Promise.resolve({ physicalId, wasReplaced: false });
19909
+ return Promise.reject(
19910
+ new ResourceUpdateNotSupportedError(
19911
+ "AWS::EC2::InternetGateway",
19912
+ logicalId,
19913
+ "destroy + redeploy the InternetGateway. IGW properties are immutable in AWS."
19914
+ )
19915
+ );
19890
19916
  }
19891
19917
  async deleteInternetGateway(logicalId, physicalId, resourceType, context) {
19892
19918
  this.logger.debug(`Deleting InternetGateway ${logicalId}: ${physicalId}`);
@@ -19955,8 +19981,13 @@ var EC2Provider = class {
19955
19981
  }
19956
19982
  }
19957
19983
  updateVpcGatewayAttachment(logicalId, physicalId) {
19958
- this.logger.debug(`Updating VPCGatewayAttachment ${logicalId}: ${physicalId} (no-op)`);
19959
- return Promise.resolve({ physicalId, wasReplaced: false });
19984
+ return Promise.reject(
19985
+ new ResourceUpdateNotSupportedError(
19986
+ "AWS::EC2::VPCGatewayAttachment",
19987
+ logicalId,
19988
+ "destroy + redeploy the VPCGatewayAttachment. The (VpcId, InternetGatewayId) pair is immutable."
19989
+ )
19990
+ );
19960
19991
  }
19961
19992
  async deleteVpcGatewayAttachment(logicalId, physicalId, resourceType, context) {
19962
19993
  this.logger.debug(`Deleting VPCGatewayAttachment ${logicalId}: ${physicalId}`);
@@ -20071,8 +20102,13 @@ var EC2Provider = class {
20071
20102
  }
20072
20103
  }
20073
20104
  updateNatGateway(logicalId, physicalId) {
20074
- this.logger.debug(`Updating NatGateway ${logicalId}: ${physicalId} (no-op)`);
20075
- return Promise.resolve({ physicalId, wasReplaced: false });
20105
+ return Promise.reject(
20106
+ new ResourceUpdateNotSupportedError(
20107
+ "AWS::EC2::NatGateway",
20108
+ logicalId,
20109
+ "destroy + redeploy the NatGateway (and the dependent Routes). NAT Gateway properties are immutable in AWS."
20110
+ )
20111
+ );
20076
20112
  }
20077
20113
  async deleteNatGateway(logicalId, physicalId, resourceType, context) {
20078
20114
  this.logger.debug(`Deleting NatGateway ${logicalId}: ${physicalId}`);
@@ -20147,8 +20183,13 @@ var EC2Provider = class {
20147
20183
  }
20148
20184
  }
20149
20185
  updateRouteTable(logicalId, physicalId) {
20150
- this.logger.debug(`Updating RouteTable ${logicalId}: ${physicalId} (no-op)`);
20151
- return Promise.resolve({ physicalId, wasReplaced: false });
20186
+ return Promise.reject(
20187
+ new ResourceUpdateNotSupportedError(
20188
+ "AWS::EC2::RouteTable",
20189
+ logicalId,
20190
+ "destroy + redeploy the RouteTable (and its associated Routes / SubnetRouteTableAssociations). VpcId is immutable."
20191
+ )
20192
+ );
20152
20193
  }
20153
20194
  async deleteRouteTable(logicalId, physicalId, resourceType, context) {
20154
20195
  this.logger.debug(`Deleting RouteTable ${logicalId}: ${physicalId}`);
@@ -20223,8 +20264,11 @@ var EC2Provider = class {
20223
20264
  );
20224
20265
  }
20225
20266
  }
20226
- async updateRoute(logicalId, physicalId, resourceType, properties, _previousProperties) {
20267
+ async updateRoute(logicalId, physicalId, resourceType, properties, previousProperties) {
20227
20268
  this.logger.debug(`Updating Route ${logicalId}: ${physicalId}`);
20269
+ if (JSON.stringify(properties) === JSON.stringify(previousProperties)) {
20270
+ return { physicalId, wasReplaced: false };
20271
+ }
20228
20272
  try {
20229
20273
  await this.deleteRoute(logicalId, physicalId, resourceType);
20230
20274
  const createResult = await this.createRoute(logicalId, resourceType, properties);
@@ -20327,10 +20371,13 @@ var EC2Provider = class {
20327
20371
  }
20328
20372
  }
20329
20373
  updateSubnetRouteTableAssociation(logicalId, physicalId) {
20330
- this.logger.debug(
20331
- `Updating SubnetRouteTableAssociation ${logicalId}: ${physicalId} (no-op, requires replacement)`
20374
+ return Promise.reject(
20375
+ new ResourceUpdateNotSupportedError(
20376
+ "AWS::EC2::SubnetRouteTableAssociation",
20377
+ logicalId,
20378
+ "destroy + redeploy the association. (SubnetId, RouteTableId) is immutable."
20379
+ )
20332
20380
  );
20333
- return Promise.resolve({ physicalId, wasReplaced: false });
20334
20381
  }
20335
20382
  async deleteSubnetRouteTableAssociation(logicalId, physicalId, resourceType, context) {
20336
20383
  this.logger.debug(`Deleting SubnetRouteTableAssociation ${logicalId}: ${physicalId}`);
@@ -20628,6 +20675,9 @@ var EC2Provider = class {
20628
20675
  }
20629
20676
  async updateSecurityGroupIngress(logicalId, physicalId, resourceType, properties, previousProperties) {
20630
20677
  this.logger.debug(`Updating SecurityGroupIngress ${logicalId}: ${physicalId}`);
20678
+ if (JSON.stringify(properties) === JSON.stringify(previousProperties)) {
20679
+ return { physicalId, wasReplaced: false };
20680
+ }
20631
20681
  try {
20632
20682
  await this.deleteSecurityGroupIngress(
20633
20683
  logicalId,
@@ -23901,6 +23951,24 @@ var CloudFrontOAIProvider = class {
23901
23951
  throw err;
23902
23952
  }
23903
23953
  }
23954
+ /**
23955
+ * State property paths the comparator must skip during drift detection.
23956
+ *
23957
+ * `CloudFrontOriginAccessIdentityConfig.CallerReference` is set by cdkd
23958
+ * to `logicalId` at create time regardless of what the CDK template
23959
+ * specified, so it ends up in `state.properties` (from the resolved
23960
+ * template) but is intentionally not surfaced by `readCurrentState`. A
23961
+ * keys-from-state walk would otherwise compare `state.CallerReference`
23962
+ * against `aws=undefined` and fire a guaranteed false positive on every
23963
+ * clean run for any stack whose template templated CallerReference.
23964
+ *
23965
+ * The field is also immutable in AWS — the OAI's CallerReference cannot
23966
+ * change post-create — so omitting it from drift is also semantically
23967
+ * correct.
23968
+ */
23969
+ getDriftUnknownPaths() {
23970
+ return ["CloudFrontOriginAccessIdentityConfig.CallerReference"];
23971
+ }
23904
23972
  /**
23905
23973
  * Adopt an existing CloudFront Origin Access Identity into cdkd state.
23906
23974
  *
@@ -26544,7 +26612,8 @@ var ELBv2Provider = class {
26544
26612
  async updateTargetGroup(logicalId, physicalId, resourceType, properties, previousProperties) {
26545
26613
  this.logger.debug(`Updating TargetGroup ${logicalId}: ${physicalId}`);
26546
26614
  try {
26547
- const matcher = properties["Matcher"];
26615
+ const rawMatcher = properties["Matcher"];
26616
+ const matcher = rawMatcher && (rawMatcher.HttpCode !== void 0 || rawMatcher.GrpcCode !== void 0) ? rawMatcher : void 0;
26548
26617
  await this.getClient().send(
26549
26618
  new ModifyTargetGroupCommand({
26550
26619
  TargetGroupArn: physicalId,
@@ -27250,13 +27319,14 @@ var RDSProvider = class {
27250
27319
  async updateDBSubnetGroup(logicalId, physicalId, resourceType, properties, previousProperties) {
27251
27320
  this.logger.debug(`Updating DBSubnetGroup ${logicalId}: ${physicalId}`);
27252
27321
  try {
27253
- await this.getClient().send(
27254
- new ModifyDBSubnetGroupCommand({
27255
- DBSubnetGroupName: physicalId,
27256
- DBSubnetGroupDescription: properties["DBSubnetGroupDescription"],
27257
- SubnetIds: properties["SubnetIds"]
27258
- })
27259
- );
27322
+ const subnetIds = properties["SubnetIds"];
27323
+ const sendSubnetIds = subnetIds !== void 0 && subnetIds.length > 0;
27324
+ const modifyInput = {
27325
+ DBSubnetGroupName: physicalId,
27326
+ DBSubnetGroupDescription: properties["DBSubnetGroupDescription"],
27327
+ ...sendSubnetIds && { SubnetIds: subnetIds }
27328
+ };
27329
+ await this.getClient().send(new ModifyDBSubnetGroupCommand(modifyInput));
27260
27330
  const desc = await this.getClient().send(
27261
27331
  new DescribeDBSubnetGroupsCommand({ DBSubnetGroupName: physicalId })
27262
27332
  );
@@ -27386,16 +27456,19 @@ var RDSProvider = class {
27386
27456
  this.logger.debug(`Updating DBCluster ${logicalId}: ${physicalId}`);
27387
27457
  try {
27388
27458
  const serverlessV2Config = properties["ServerlessV2ScalingConfiguration"];
27459
+ const hasServerlessV2 = serverlessV2Config !== void 0 && (serverlessV2Config.MinCapacity !== void 0 || serverlessV2Config.MaxCapacity !== void 0);
27460
+ const vpcSgIds = properties["VpcSecurityGroupIds"];
27461
+ const sendVpcSgIds = vpcSgIds !== void 0 && vpcSgIds.length > 0;
27389
27462
  await this.getClient().send(
27390
27463
  new ModifyDBClusterCommand({
27391
27464
  DBClusterIdentifier: physicalId,
27392
27465
  EngineVersion: properties["EngineVersion"],
27393
27466
  DeletionProtection: properties["DeletionProtection"],
27394
27467
  BackupRetentionPeriod: properties["BackupRetentionPeriod"] != null ? Number(properties["BackupRetentionPeriod"]) : void 0,
27395
- VpcSecurityGroupIds: properties["VpcSecurityGroupIds"],
27468
+ ...sendVpcSgIds && { VpcSecurityGroupIds: vpcSgIds },
27396
27469
  MasterUserPassword: properties["MasterUserPassword"],
27397
27470
  Port: properties["Port"] != null ? Number(properties["Port"]) : void 0,
27398
- ...serverlessV2Config && {
27471
+ ...hasServerlessV2 && {
27399
27472
  ServerlessV2ScalingConfiguration: {
27400
27473
  MinCapacity: serverlessV2Config.MinCapacity,
27401
27474
  MaxCapacity: serverlessV2Config.MaxCapacity
@@ -27894,7 +27967,7 @@ var RDSProvider = class {
27894
27967
  if (cluster.DeletionProtection !== void 0) {
27895
27968
  result["DeletionProtection"] = cluster.DeletionProtection;
27896
27969
  }
27897
- {
27970
+ if (cluster.ServerlessV2ScalingConfiguration?.MinCapacity !== void 0 || cluster.ServerlessV2ScalingConfiguration?.MaxCapacity !== void 0) {
27898
27971
  const sc = {};
27899
27972
  if (cluster.ServerlessV2ScalingConfiguration?.MinCapacity !== void 0) {
27900
27973
  sc["MinCapacity"] = cluster.ServerlessV2ScalingConfiguration.MinCapacity;
@@ -28518,7 +28591,7 @@ var Route53Provider = class {
28518
28591
  }
28519
28592
  }
28520
28593
  const setIdentifier = properties["SetIdentifier"];
28521
- if (setIdentifier) {
28594
+ if (setIdentifier !== void 0) {
28522
28595
  recordSet.SetIdentifier = setIdentifier;
28523
28596
  }
28524
28597
  const weight = properties["Weight"];
@@ -28526,11 +28599,11 @@ var Route53Provider = class {
28526
28599
  recordSet.Weight = Number(weight);
28527
28600
  }
28528
28601
  const region = properties["Region"];
28529
- if (region) {
28602
+ if (region !== void 0) {
28530
28603
  recordSet.Region = region;
28531
28604
  }
28532
28605
  const failover = properties["Failover"];
28533
- if (failover) {
28606
+ if (failover !== void 0) {
28534
28607
  recordSet.Failover = failover;
28535
28608
  }
28536
28609
  const multiValueAnswer = properties["MultiValueAnswer"];
@@ -28538,15 +28611,15 @@ var Route53Provider = class {
28538
28611
  recordSet.MultiValueAnswer = typeof multiValueAnswer === "string" ? multiValueAnswer.toLowerCase() === "true" : multiValueAnswer;
28539
28612
  }
28540
28613
  const healthCheckId = properties["HealthCheckId"];
28541
- if (healthCheckId) {
28614
+ if (healthCheckId !== void 0) {
28542
28615
  recordSet.HealthCheckId = healthCheckId;
28543
28616
  }
28544
28617
  const geoLocation = properties["GeoLocation"];
28545
28618
  if (geoLocation) {
28546
28619
  recordSet.GeoLocation = {
28547
- ...geoLocation["ContinentCode"] ? { ContinentCode: geoLocation["ContinentCode"] } : {},
28548
- ...geoLocation["CountryCode"] ? { CountryCode: geoLocation["CountryCode"] } : {},
28549
- ...geoLocation["SubdivisionCode"] ? { SubdivisionCode: geoLocation["SubdivisionCode"] } : {}
28620
+ ...geoLocation["ContinentCode"] !== void 0 ? { ContinentCode: geoLocation["ContinentCode"] } : {},
28621
+ ...geoLocation["CountryCode"] !== void 0 ? { CountryCode: geoLocation["CountryCode"] } : {},
28622
+ ...geoLocation["SubdivisionCode"] !== void 0 ? { SubdivisionCode: geoLocation["SubdivisionCode"] } : {}
28550
28623
  };
28551
28624
  }
28552
28625
  return recordSet;
@@ -28776,14 +28849,16 @@ var Route53Provider = class {
28776
28849
  }
28777
28850
  result["HostedZoneConfig"] = cfg;
28778
28851
  }
28779
- result["VPCs"] = (resp.VPCs ?? []).map((v) => {
28780
- const out = {};
28781
- if (v.VPCId !== void 0)
28782
- out["VPCId"] = v.VPCId;
28783
- if (v.VPCRegion !== void 0)
28784
- out["VPCRegion"] = v.VPCRegion;
28785
- return out;
28786
- });
28852
+ if (resp.HostedZone.Config?.PrivateZone === true) {
28853
+ result["VPCs"] = (resp.VPCs ?? []).map((v) => {
28854
+ const out = {};
28855
+ if (v.VPCId !== void 0)
28856
+ out["VPCId"] = v.VPCId;
28857
+ if (v.VPCRegion !== void 0)
28858
+ out["VPCRegion"] = v.VPCRegion;
28859
+ return out;
28860
+ });
28861
+ }
28787
28862
  const idTail = physicalId.replace(/^\/hostedzone\//, "");
28788
28863
  try {
28789
28864
  const tagsResp = await this.getClient().send(
@@ -28828,9 +28903,11 @@ var Route53Provider = class {
28828
28903
  Name: name,
28829
28904
  Type: type
28830
28905
  };
28831
- if (recordSet.TTL !== void 0)
28832
- result["TTL"] = recordSet.TTL;
28833
- result["ResourceRecords"] = (recordSet.ResourceRecords ?? []).map((r) => r.Value).filter((v) => typeof v === "string");
28906
+ if (!recordSet.AliasTarget) {
28907
+ if (recordSet.TTL !== void 0)
28908
+ result["TTL"] = recordSet.TTL;
28909
+ result["ResourceRecords"] = (recordSet.ResourceRecords ?? []).map((r) => r.Value).filter((v) => typeof v === "string");
28910
+ }
28834
28911
  if (recordSet.AliasTarget) {
28835
28912
  const at = {};
28836
28913
  if (recordSet.AliasTarget.HostedZoneId !== void 0) {
@@ -30084,11 +30161,13 @@ var ElastiCacheProvider = class {
30084
30161
  async updateCacheCluster(logicalId, physicalId, resourceType, properties, previousProperties) {
30085
30162
  this.logger.debug(`Updating CacheCluster ${logicalId}: ${physicalId}`);
30086
30163
  try {
30164
+ const rawSgIds = properties["VpcSecurityGroupIds"];
30165
+ const sgIds = rawSgIds && rawSgIds.length > 0 ? rawSgIds : void 0;
30087
30166
  await this.getClient().send(
30088
30167
  new ModifyCacheClusterCommand({
30089
30168
  CacheClusterId: physicalId,
30090
30169
  NumCacheNodes: properties["NumCacheNodes"] != null ? Number(properties["NumCacheNodes"]) : void 0,
30091
- SecurityGroupIds: properties["VpcSecurityGroupIds"],
30170
+ SecurityGroupIds: sgIds,
30092
30171
  CacheParameterGroupName: properties["CacheParameterGroupName"],
30093
30172
  EngineVersion: properties["EngineVersion"],
30094
30173
  PreferredMaintenanceWindow: properties["PreferredMaintenanceWindow"],
@@ -30366,7 +30445,7 @@ var ElastiCacheProvider = class {
30366
30445
  result["IpDiscovery"] = cluster.IpDiscovery;
30367
30446
  if (cluster.NetworkType !== void 0)
30368
30447
  result["NetworkType"] = cluster.NetworkType;
30369
- if (cluster.TransitEncryptionEnabled !== void 0) {
30448
+ if (cluster.Engine === "redis" && cluster.TransitEncryptionEnabled !== void 0) {
30370
30449
  result["TransitEncryptionEnabled"] = cluster.TransitEncryptionEnabled;
30371
30450
  }
30372
30451
  if (cluster.CacheNodes?.[0]?.Endpoint?.Port !== void 0) {
@@ -33008,6 +33087,36 @@ var KMSProvider = class {
33008
33087
  }
33009
33088
  return result;
33010
33089
  }
33090
+ /**
33091
+ * Declare state property paths cdkd cannot round-trip from AWS, so the
33092
+ * drift comparator skips them instead of firing guaranteed false-
33093
+ * positive drift on every clean run.
33094
+ *
33095
+ * - `KeyPolicy`: cdkd does NOT call `GetKeyPolicy` in `readCurrentState`.
33096
+ * The policy body needs JSON parsing for comparison and a separate
33097
+ * SDK call; deferred to a follow-up. Until then, any user who
33098
+ * templates `KeyPolicy` would see guaranteed drift.
33099
+ * - `EnableKeyRotation` / `RotationPeriodInDays`: cdkd does NOT call
33100
+ * `GetKeyRotationStatus`. Same reason — deferred to a follow-up.
33101
+ * `EnableKeyRotation` is also a Class 1 candidate (only valid for
33102
+ * `KeySpec=SYMMETRIC_DEFAULT`); when we lift this gap the read side
33103
+ * must gate the emit on the discriminator.
33104
+ * - `BypassPolicyLockoutSafetyCheck` / `PendingWindowInDays`: not part
33105
+ * of the persisted AWS state visible via `DescribeKey` — both are
33106
+ * create / delete-time-only inputs.
33107
+ */
33108
+ getDriftUnknownPaths(resourceType) {
33109
+ if (resourceType === "AWS::KMS::Key") {
33110
+ return [
33111
+ "KeyPolicy",
33112
+ "EnableKeyRotation",
33113
+ "RotationPeriodInDays",
33114
+ "BypassPolicyLockoutSafetyCheck",
33115
+ "PendingWindowInDays"
33116
+ ];
33117
+ }
33118
+ return [];
33119
+ }
33011
33120
  async readCurrentStateAlias(physicalId) {
33012
33121
  let marker;
33013
33122
  do {
@@ -43628,7 +43737,7 @@ function reorderArgs(argv) {
43628
43737
  }
43629
43738
  async function main() {
43630
43739
  const program = new Command14();
43631
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.50.8");
43740
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.50.10");
43632
43741
  program.addCommand(createBootstrapCommand());
43633
43742
  program.addCommand(createSynthCommand());
43634
43743
  program.addCommand(createListCommand());