@go-to-k/cdkd 0.51.8 → 0.51.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
@@ -13792,10 +13792,15 @@ var SNSTopicProvider = class {
13792
13792
  * `create()`'s behavior of only sending Tags when the template carries
13793
13793
  * them).
13794
13794
  *
13795
- * `DeliveryStatusLogging` is intentionally omitted: it fans out into
13796
- * per-protocol attributes (`{Protocol}SuccessFeedbackRoleArn`, etc.) whose
13797
- * round-trip back to the CFn array shape needs more thought than fits in
13798
- * this PR.
13795
+ * `DeliveryStatusLogging` is reverse-mapped from per-protocol flat
13796
+ * attributes (`{Protocol}SuccessFeedbackRoleArn` etc.) back to the CFn
13797
+ * array shape `[{Protocol, SuccessFeedbackRoleArn?, SuccessFeedbackSampleRate?,
13798
+ * FailureFeedbackRoleArn?}]`. Walks the known protocol prefix list
13799
+ * (`HTTP` / `HTTPS` / `SQS` / `Lambda` / `Firehose` / `Application`); a
13800
+ * protocol is included in the result iff at least one of its three
13801
+ * sub-attributes is set on the topic. Entries are sorted by `Protocol`
13802
+ * for stable positional compare (AWS does not preserve template order
13803
+ * across `GetTopicAttributes` calls).
13799
13804
  *
13800
13805
  * `Subscription` is omitted because CDK manages it via separate
13801
13806
  * `AWS::SNS::Subscription` resources, not as a Topic property.
@@ -13844,6 +13849,7 @@ var SNSTopicProvider = class {
13844
13849
  }
13845
13850
  }
13846
13851
  }
13852
+ result["DeliveryStatusLogging"] = mapDeliveryStatusLogging(attrs);
13847
13853
  try {
13848
13854
  const tagsResp = await this.snsClient.send(
13849
13855
  new ListTagsForResourceCommand({ ResourceArn: physicalId })
@@ -13858,16 +13864,13 @@ var SNSTopicProvider = class {
13858
13864
  return result;
13859
13865
  }
13860
13866
  /**
13861
- * `DeliveryStatusLogging` fans out to per-protocol attributes
13862
- * (`{Protocol}SuccessFeedbackRoleArn` etc.) whose round-trip back to the
13863
- * CFn array shape is not yet implemented; `Subscription` is managed via
13864
- * separate `AWS::SNS::Subscription` resources rather than the Topic
13865
- * itself. Both are absent from `readCurrentState`, so tell the drift
13866
- * comparator to skip them and avoid the guaranteed false-positive that
13867
- * would fire on every clean run when the user did template either.
13867
+ * Only `Subscription` remains drift-unknown CDK manages topic
13868
+ * subscriptions via separate `AWS::SNS::Subscription` resources, so the
13869
+ * inline `Topic.Subscription` property is intentionally not surfaced.
13870
+ * `DeliveryStatusLogging` is now reverse-mapped (see `readCurrentState`).
13868
13871
  */
13869
13872
  getDriftUnknownPaths() {
13870
- return ["DeliveryStatusLogging", "Subscription"];
13873
+ return ["Subscription"];
13871
13874
  }
13872
13875
  /**
13873
13876
  * Adopt an existing SNS topic into cdkd state.
@@ -13927,6 +13930,33 @@ var SNSTopicProvider = class {
13927
13930
  return null;
13928
13931
  }
13929
13932
  };
13933
+ var SNS_DELIVERY_STATUS_PROTOCOLS = [
13934
+ "Application",
13935
+ "Firehose",
13936
+ "HTTP",
13937
+ "HTTPS",
13938
+ "Lambda",
13939
+ "SQS"
13940
+ ];
13941
+ function mapDeliveryStatusLogging(attrs) {
13942
+ const result = [];
13943
+ for (const protocol of SNS_DELIVERY_STATUS_PROTOCOLS) {
13944
+ const success = attrs[`${protocol}SuccessFeedbackRoleArn`];
13945
+ const sample = attrs[`${protocol}SuccessFeedbackSampleRate`];
13946
+ const failure = attrs[`${protocol}FailureFeedbackRoleArn`];
13947
+ if (success === void 0 && sample === void 0 && failure === void 0)
13948
+ continue;
13949
+ const entry = { Protocol: protocol };
13950
+ if (success !== void 0)
13951
+ entry["SuccessFeedbackRoleArn"] = success;
13952
+ if (sample !== void 0)
13953
+ entry["SuccessFeedbackSampleRate"] = sample;
13954
+ if (failure !== void 0)
13955
+ entry["FailureFeedbackRoleArn"] = failure;
13956
+ result.push(entry);
13957
+ }
13958
+ return result;
13959
+ }
13930
13960
 
13931
13961
  // src/provisioning/providers/sns-subscription-provider.ts
13932
13962
  import {
@@ -19471,7 +19501,8 @@ import {
19471
19501
  DescribeNetworkAclsCommand,
19472
19502
  DescribeNetworkInterfacesCommand as DescribeNetworkInterfacesCommand2,
19473
19503
  DeleteNetworkInterfaceCommand as DeleteNetworkInterfaceCommand2,
19474
- DescribeVolumesCommand
19504
+ DescribeVolumesCommand,
19505
+ DescribeInstanceAttributeCommand
19475
19506
  } from "@aws-sdk/client-ec2";
19476
19507
  init_aws_clients();
19477
19508
  var EC2Provider = class {
@@ -21761,12 +21792,14 @@ var EC2Provider = class {
21761
21792
  * `(DeviceName, Ebs.VolumeId, Ebs.DeleteOnTermination)`; cdkd
21762
21793
  * additionally calls `DescribeVolumes` on the attached volume ids to
21763
21794
  * surface `VolumeType` / `VolumeSize` / `Iops` / `Throughput` /
21764
- * `Encrypted` / `KmsKeyId` / `SnapshotId`. The DescribeVolumes call
21765
- * is best-effort a permissions gap or other failure falls back to
21766
- * the partial shape (DeleteOnTermination only). All arrays / scalars
21767
- * that map to user-controllable CFn properties are always emitted
21768
- * (even as `[]` or default scalar) so the v3 `observedProperties`
21769
- * baseline catches console-side ADDs.
21795
+ * `Encrypted` / `KmsKeyId` / `SnapshotId`. `DisableApiTermination`
21796
+ * is recovered via a separate `DescribeInstanceAttribute` call (the
21797
+ * `DescribeInstances` response does not include it). Both extra
21798
+ * calls are best-effort a permissions gap or other failure falls
21799
+ * back to omitting the key. All arrays / scalars that map to
21800
+ * user-controllable CFn properties are always emitted (even as `[]`
21801
+ * or default scalar) so the v3 `observedProperties` baseline
21802
+ * catches console-side ADDs.
21770
21803
  * - **AWS::EC2::NetworkAcl**: `DescribeNetworkAcls` for `VpcId`.
21771
21804
  *
21772
21805
  * Skipped (return `undefined`, falls through to the comparator's
@@ -22037,6 +22070,21 @@ var EC2Provider = class {
22037
22070
  }
22038
22071
  result["BlockDeviceMappings"] = blockMappings;
22039
22072
  result["Tags"] = normalizeAwsTagsToCfn(instance.Tags);
22073
+ try {
22074
+ const attrResp = await this.ec2Client.send(
22075
+ new DescribeInstanceAttributeCommand({
22076
+ InstanceId: physicalId,
22077
+ Attribute: "disableApiTermination"
22078
+ })
22079
+ );
22080
+ if (attrResp.DisableApiTermination?.Value !== void 0) {
22081
+ result["DisableApiTermination"] = attrResp.DisableApiTermination.Value;
22082
+ }
22083
+ } catch (err) {
22084
+ this.logger.debug(
22085
+ `DescribeInstanceAttribute(disableApiTermination, ${physicalId}) failed: ${err instanceof Error ? err.message : String(err)}`
22086
+ );
22087
+ }
22040
22088
  return result;
22041
22089
  }
22042
22090
  async readNetworkAclCurrentState(physicalId) {
@@ -35737,10 +35785,14 @@ var FirehoseProvider = class {
35737
35785
  * from `VpcConfigurationDescription`. Write-only fields AWS strips
35738
35786
  * from descriptions (`RedshiftDestinationConfiguration.Password`,
35739
35787
  * `HttpEndpointDestinationConfiguration.EndpointConfiguration.AccessKey`)
35740
- * stay drift-unknown via `getDriftUnknownPaths`.
35741
- * `DeliveryStreamEncryptionConfigurationInput` is also still
35742
- * drift-unknown (separate `Get*` call needed for the read-side
35743
- * `DeliveryStreamEncryptionConfiguration`).
35788
+ * stay drift-unknown via `getDriftUnknownPaths` — no AWS API recovers them.
35789
+ *
35790
+ * `DeliveryStreamEncryptionConfigurationInput` is also surfaced. AWS
35791
+ * returns the read-side shape `DeliveryStreamEncryptionConfiguration`
35792
+ * (with extra `Status` / `FailureDescription` fields); we reverse-map
35793
+ * to the CFn input shape (`KeyARN` + `KeyType`) and always emit a
35794
+ * `{}` placeholder so the v3 baseline catches console-side encryption
35795
+ * enables on a previously-default stream.
35744
35796
  *
35745
35797
  * Tags are surfaced via a follow-up `ListTagsForDeliveryStream` call
35746
35798
  * with `aws:*` filtered out and always emitted as `[]` placeholder when
@@ -35814,6 +35866,13 @@ var FirehoseProvider = class {
35814
35866
  dest.HttpEndpointDestinationDescription
35815
35867
  );
35816
35868
  }
35869
+ const enc = desc.DeliveryStreamEncryptionConfiguration;
35870
+ const encOut = {};
35871
+ if (enc?.KeyARN !== void 0)
35872
+ encOut["KeyARN"] = enc.KeyARN;
35873
+ if (enc?.KeyType !== void 0)
35874
+ encOut["KeyType"] = enc.KeyType;
35875
+ result["DeliveryStreamEncryptionConfigurationInput"] = encOut;
35817
35876
  try {
35818
35877
  const tagsResp = await this.getClient().send(
35819
35878
  new ListTagsForDeliveryStreamCommand({ DeliveryStreamName: physicalId })
@@ -35836,30 +35895,23 @@ var FirehoseProvider = class {
35836
35895
  * fire false-positive drift on every run. See the `readCurrentState`
35837
35896
  * docstring for the full rationale per category.
35838
35897
  *
35839
- * Categories:
35840
- * - Write-only fields AWS strips from descriptions: Redshift
35841
- * `Password`, HttpEndpoint `EndpointConfiguration.AccessKey`. State
35842
- * that carries these fires drift on every run otherwise; declaring
35843
- * them as drift-unknown is the cleanest fix.
35844
- * - `DeliveryStreamEncryptionConfigurationInput`: input-only shape
35845
- * (`KeyARN` + `KeyType`) vs. read-side `DeliveryStreamEncryptionConfiguration`
35846
- * (extra status / failure fields); not yet round-tripped.
35898
+ * Only write-only fields AWS strips from descriptions remain:
35899
+ * Redshift `Password`, HttpEndpoint `EndpointConfiguration.AccessKey`.
35900
+ * State that carries these would otherwise fire drift on every run —
35901
+ * declaring them as drift-unknown is the cleanest fix because there
35902
+ * is no AWS read API to recover their values.
35847
35903
  *
35848
- * S3 / ExtendedS3 inner nested fields and non-S3 destination types
35904
+ * S3 / ExtendedS3 inner nested fields, non-S3 destination types
35849
35905
  * (Redshift / Elasticsearch / Amazonopensearchservice / Splunk /
35850
- * HttpEndpoint / AmazonOpenSearchServerless) are now reverse-mapped
35851
- * via `mapS3DescriptionToCfn` / `mapExtendedS3DescriptionToCfn` /
35852
- * `mapNonS3DestinationToCfn` / `mapRedshiftDescriptionToCfn` /
35853
- * `mapHttpEndpointDescriptionToCfn` and no longer drift-unknown at the
35854
- * top level.
35906
+ * HttpEndpoint / AmazonOpenSearchServerless), and
35907
+ * `DeliveryStreamEncryptionConfigurationInput` are all reverse-mapped
35908
+ * by `readCurrentState` and no longer drift-unknown.
35855
35909
  */
35856
35910
  getDriftUnknownPaths() {
35857
35911
  return [
35858
- // Write-only fields AWS does not return on read.
35912
+ // Write-only fields AWS does not return on read — no API workaround.
35859
35913
  "RedshiftDestinationConfiguration.Password",
35860
- "HttpEndpointDestinationConfiguration.EndpointConfiguration.AccessKey",
35861
- // Encryption input shape (deferred — separate Get* call needed).
35862
- "DeliveryStreamEncryptionConfigurationInput"
35914
+ "HttpEndpointDestinationConfiguration.EndpointConfiguration.AccessKey"
35863
35915
  ];
35864
35916
  }
35865
35917
  async import(input) {
@@ -45188,7 +45240,7 @@ function reorderArgs(argv) {
45188
45240
  }
45189
45241
  async function main() {
45190
45242
  const program = new Command14();
45191
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.51.8");
45243
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.51.10");
45192
45244
  program.addCommand(createBootstrapCommand());
45193
45245
  program.addCommand(createSynthCommand());
45194
45246
  program.addCommand(createListCommand());