@go-to-k/cdkd 0.248.0 → 0.250.0

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,10 +1,7 @@
1
1
  #!/usr/bin/env node
2
- 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-BzO-joNR.js";
3
- import { A as withErrorHandling, C as StackHasActiveImportsError, S as ResourceUpdateNotSupportedError, _ as MissingCdkCliError, a as normalizeAwsTagsToCfn, b as ProvisioningError, f as LocalInvokeBuildError$1, i as matchesCdkPath, k as normalizeAwsError, l as CdkdError, m as LocalStartServiceError, n as isTerminationProtectionPropagationError, o as resolveExplicitPhysicalId, p as LocalMigrateError, r as CDK_PATH_TAG, s as assertRegionMatch, t as disableInstanceApiTermination, v as NestedStackChildDirectDestroyError, w as StackTerminationProtectionError, x as ResourceTimeoutError, y as PartialFailureError } from "./ec2-termination-protection-q-WGWgxa.js";
4
- import { a as setAwsClients, i as resetAwsClients, r as getAwsClients, t as AwsClients } from "./aws-clients-B15NAPbL.js";
5
- import { $ as getDockerCmd, A as DiffCalculator, B as buildAssetRedirectMap, C as findActionableSilentDrops, Ct as resolveBucketRegion, D as refStateLookupFromResource, E as cfnRefValueFromPhysicalId, F as rebuildClientForBucketRegion, G as BOOTSTRAP_MARKER_PREFIX, H as loadPublishableAssetManifest, I as shouldRetainResource, J as parseBootstrapMarker, K as ensureAssetStorage, L as AssetPublisher, M as TemplateParser, N as LockManager, O as WAFv2WebACLProvider, P as S3StateBackend, Q as formatDockerLoginError, R as stringifyValue, S as ProviderRegistry, T as IntrinsicFunctionResolver, U as rewriteTemplateAssetReferences, V as createAssetRedirectResolver, W as AssetModeResolver, X as validateContainerRepoName, Y as validateAssetBucketName, Z as buildDockerImage, _ as green, _t as CFN_TEMPLATE_URL_LIMIT, a as withRetry, at as synthesisStatusMessage, b as IAMRoleProvider, bt as uploadCfnTemplate, c as computeImplicitDeleteEdges, ct as resolveApp, d as isStatefulRecreateTargetSync, dt as resolveSkipPrefix, et as runDockerForeground, f as renderStatefulReason, ft as resolveStateBucketWithDefault, g as gray, gt as CFN_TEMPLATE_BODY_LIMIT, h as cyan, ht as warnDeprecatedNoPrefixCliFlag, i as withResourceDeadline, it as Synthesizer, j as DagBuilder, k as applyRoleArnIfSet, l as extractDeploymentEventError, lt as resolveAutoAssetStorage, m as bold, mt as resolveUseCdkBootstrapAssets, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nt as AssetManifestLoader, o as isRetryableTransientError, ot as getDefaultStateBucketName, p as formatResourceLine, pt as resolveStateBucketWithDefaultAndSource, q as getBootstrapMarkerKey, r as DeployEngine, rt as getDockerImageBySourceHash, s as IMPLICIT_DELETE_DEPENDENCIES, st as getLegacyStateBucketName, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as runDockerStreaming, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as resolveCaptureObservedState, v as red, vt as MIGRATE_TMP_PREFIX, w as CloudControlProvider, x as collectInlinePolicyNamesManagedBySiblings, xt as AssemblyReader, y as yellow, yt as findLargeInlineResources, z as WorkGraph } from "./deploy-engine-D6U-Cm8B.js";
6
- import { t as expectedOwnerParam } from "./expected-bucket-owner-BjEfUnkA.js";
7
- import { t as ASGProvider } from "./asg-provider-Dbl1_mwT.js";
2
+ import { $ as ensureAssetStorage, A as WAFv2WebACLProvider, B as LockManager, Bt as LocalInvokeBuildError$1, C as findActionableSilentDrops, Ct as CFN_TEMPLATE_BODY_LIMIT, D as IntrinsicFunctionResolver, Dt as uploadCfnTemplate, E as isTerminationProtectionPropagationError, Et as findLargeInlineResources, F as assertRegionMatch, Ft as setAwsClients, G as stringifyValue, Gt as NestedStackChildDirectDestroyError, H as rebuildClientForBucketRegion, Ht as LocalStartServiceError, I as applyRoleArnIfSet, J as createAssetRedirectResolver, Jt as ResourceTimeoutError, K as WorkGraph, Kt as PartialFailureError, L as DiffCalculator, Lt as CdkdError, M as matchesCdkPath, Mt as AwsClients, N as normalizeAwsTagsToCfn, Nt as getAwsClients, O as cfnRefValueFromPhysicalId, Ot as expectedOwnerParam, P as resolveExplicitPhysicalId, Pt as resetAwsClients, Q as BOOTSTRAP_MARKER_PREFIX, R as DagBuilder, S as ProviderRegistry, St as warnDeprecatedNoPrefixCliFlag, T as disableInstanceApiTermination, Tt as MIGRATE_TMP_PREFIX, U as shouldRetainResource, V as S3StateBackend, Vt as LocalMigrateError, W as AssetPublisher, Wt as MissingCdkCliError, X as rewriteTemplateAssetReferences, Xt as StackHasActiveImportsError, Y as loadPublishableAssetManifest, Yt as ResourceUpdateNotSupportedError, Z as AssetModeResolver, Zt as StackTerminationProtectionError, _ as green, _t as resolveCaptureObservedState, a as withRetry, at as formatDockerLoginError, b as IAMRoleProvider, bt as resolveStateBucketWithDefaultAndSource, c as computeImplicitDeleteEdges, ct as runDockerStreaming, d as isStatefulRecreateTargetSync, dt as Synthesizer, et as getBootstrapMarkerKey, f as renderStatefulReason, ft as synthesisStatusMessage, g as gray, gt as resolveAutoAssetStorage, h as cyan, ht as resolveApp, i as withResourceDeadline, it as buildDockerImage, j as CDK_PATH_TAG, jt as resolveBucketRegion, k as refStateLookupFromResource, kt as AssemblyReader, l as extractDeploymentEventError, lt as AssetManifestLoader, m as bold, mt as getLegacyStateBucketName, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as normalizeAwsError, nt as validateAssetBucketName, o as isRetryableTransientError, ot as getDockerCmd, p as formatResourceLine, pt as getDefaultStateBucketName, q as buildAssetRedirectMap, qt as ProvisioningError, r as DeployEngine, rn as withErrorHandling, rt as validateContainerRepoName, s as IMPLICIT_DELETE_DEPENDENCIES, st as runDockerForeground, t as DEFAULT_RESOURCE_TIMEOUT_MS, tt as parseBootstrapMarker, u as MULTI_REGION_RECREATE_BLOCKED_TYPES, ut as getDockerImageBySourceHash, v as red, vt as resolveSkipPrefix, w as CloudControlProvider, wt as CFN_TEMPLATE_URL_LIMIT, x as collectInlinePolicyNamesManagedBySiblings, xt as resolveUseCdkBootstrapAssets, y as yellow, yt as resolveStateBucketWithDefault, z as TemplateParser } from "./deploy-engine-D-gBbMiZ.js";
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-er3xGYRo.js";
8
5
  import { AsyncLocalStorage } from "node:async_hooks";
9
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
10
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListBucketsCommand, ListDirectoryBucketsCommand, 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";
@@ -60,7 +57,7 @@ import { AddTagsToStreamCommand, CreateStreamCommand, DecreaseStreamRetentionPer
60
57
  import { CreateScheduleCommand, DeleteScheduleCommand, GetScheduleCommand, ResourceNotFoundException as ResourceNotFoundException$9, SchedulerClient, UpdateScheduleCommand } from "@aws-sdk/client-scheduler";
61
58
  import { AccessPointNotFound, CreateAccessPointCommand, CreateFileSystemCommand, CreateMountTargetCommand, DeleteAccessPointCommand, DeleteFileSystemCommand, DeleteMountTargetCommand, DescribeAccessPointsCommand, DescribeBackupPolicyCommand, DescribeFileSystemPolicyCommand, DescribeFileSystemsCommand, DescribeLifecycleConfigurationCommand, DescribeMountTargetSecurityGroupsCommand, DescribeMountTargetsCommand, EFSClient, FileSystemNotFound, ModifyMountTargetSecurityGroupsCommand, MountTargetNotFound, PutBackupPolicyCommand, PutFileSystemPolicyCommand, PutLifecycleConfigurationCommand, UpdateFileSystemCommand, UpdateFileSystemProtectionCommand } from "@aws-sdk/client-efs";
62
59
  import { CreateFileSystemCommand as CreateFileSystemCommand$1, CreateFileSystemFromBackupCommand, DeleteFileSystemCommand as DeleteFileSystemCommand$1, DescribeFileSystemsCommand as DescribeFileSystemsCommand$1, FSxClient, FileSystemNotFound as FileSystemNotFound$1, TagResourceCommand as TagResourceCommand$18, UntagResourceCommand as UntagResourceCommand$18, UpdateFileSystemCommand as UpdateFileSystemCommand$1 } from "@aws-sdk/client-fsx";
63
- import { AddTagsCommand as AddTagsCommand$1, DescribeClusterCommand, EMRClient, InvalidRequestException, ListClustersCommand as ListClustersCommand$1, ListInstanceFleetsCommand, ListInstanceGroupsCommand, ModifyClusterCommand, PutAutoTerminationPolicyCommand, PutManagedScalingPolicyCommand, RemoveAutoTerminationPolicyCommand, RemoveManagedScalingPolicyCommand, RemoveTagsCommand as RemoveTagsCommand$1, RunJobFlowCommand, SetTerminationProtectionCommand, SetVisibleToAllUsersCommand, TerminateJobFlowsCommand } from "@aws-sdk/client-emr";
60
+ import { AddInstanceFleetCommand, AddInstanceGroupsCommand, AddTagsCommand as AddTagsCommand$1, DescribeClusterCommand, EMRClient, InvalidRequestException, ListClustersCommand as ListClustersCommand$1, ListInstanceFleetsCommand, ListInstanceGroupsCommand, ModifyClusterCommand, ModifyInstanceFleetCommand, ModifyInstanceGroupsCommand, PutAutoScalingPolicyCommand, PutAutoTerminationPolicyCommand, PutManagedScalingPolicyCommand, RemoveAutoScalingPolicyCommand, RemoveAutoTerminationPolicyCommand, RemoveManagedScalingPolicyCommand, RemoveTagsCommand as RemoveTagsCommand$1, RunJobFlowCommand, SetTerminationProtectionCommand, SetVisibleToAllUsersCommand, TerminateJobFlowsCommand } from "@aws-sdk/client-emr";
64
61
  import { CreateDeliveryStreamCommand, DeleteDeliveryStreamCommand, DescribeDeliveryStreamCommand, FirehoseClient, ListDeliveryStreamsCommand, ListTagsForDeliveryStreamCommand, ResourceNotFoundException as ResourceNotFoundException$10, TagDeliveryStreamCommand, UntagDeliveryStreamCommand, UpdateDestinationCommand } from "@aws-sdk/client-firehose";
65
62
  import { AddTagsCommand as AddTagsCommand$2, CloudTrailClient, CreateTrailCommand, DeleteTrailCommand, GetEventSelectorsCommand, GetInsightSelectorsCommand, GetTrailCommand, GetTrailStatusCommand, ListTagsCommand as ListTagsCommand$1, ListTrailsCommand, PutEventSelectorsCommand, PutInsightSelectorsCommand, RemoveTagsCommand as RemoveTagsCommand$2, StartLoggingCommand, StopLoggingCommand, TrailNotFoundException, UpdateTrailCommand } from "@aws-sdk/client-cloudtrail";
66
63
  import { BatchGetProjectsCommand, CodeBuildClient, CreateProjectCommand, DeleteProjectCommand, ListProjectsCommand, ResourceNotFoundException as ResourceNotFoundException$11, UpdateProjectCommand } from "@aws-sdk/client-codebuild";
@@ -321,7 +318,7 @@ function validateResourceTimeouts(opts) {
321
318
  } else if (typeof globalWarn === "number" && globalWarn >= 18e5) throw new Error(`--resource-warn-after (${formatMs(globalWarn)}) must be less than --resource-timeout (default ${formatMs(DEFAULT_RESOURCE_TIMEOUT_MS)}). Pass --resource-timeout <duration> alongside it to raise the deadline.`);
322
319
  const warnPerType = opts.resourceWarnAfter?.perTypeMs ?? {};
323
320
  const timeoutPerType = timeout?.perTypeMs ?? {};
324
- const types = new Set([...Object.keys(warnPerType), ...Object.keys(timeoutPerType)]);
321
+ const types = /* @__PURE__ */ new Set([...Object.keys(warnPerType), ...Object.keys(timeoutPerType)]);
325
322
  for (const t of types) {
326
323
  const explicitPerTypeWarn = warnPerType[t];
327
324
  const explicitPerTypeTimeout = timeoutPerType[t];
@@ -1891,7 +1888,7 @@ const FLUSH_INTERVAL_MS = 2e3;
1891
1888
  const FLUSH_EVENT_THRESHOLD = 50;
1892
1889
  /** Build-time cdkd version, with a dev fallback for non-built contexts. */
1893
1890
  function getCdkdVersion() {
1894
- return "0.248.0";
1891
+ return "0.250.0";
1895
1892
  }
1896
1893
  /**
1897
1894
  * Generate a time-sortable unique run id, e.g.
@@ -2924,7 +2921,7 @@ function collectCrossStackRefs(node, onRef) {
2924
2921
  var IAMPolicyProvider = class {
2925
2922
  iamClient;
2926
2923
  logger = getLogger().child("IAMPolicyProvider");
2927
- handledProperties = new Map([["AWS::IAM::Policy", new Set([
2924
+ handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::Policy", /* @__PURE__ */ new Set([
2928
2925
  "PolicyName",
2929
2926
  "PolicyDocument",
2930
2927
  "Roles",
@@ -3258,7 +3255,7 @@ var IAMPolicyProvider = class {
3258
3255
  var IAMManagedPolicyProvider = class {
3259
3256
  iamClient;
3260
3257
  logger = getLogger().child("IAMManagedPolicyProvider");
3261
- handledProperties = new Map([["AWS::IAM::ManagedPolicy", new Set([
3258
+ handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::ManagedPolicy", /* @__PURE__ */ new Set([
3262
3259
  "ManagedPolicyName",
3263
3260
  "Description",
3264
3261
  "Path",
@@ -3759,7 +3756,7 @@ function derivePolicyNameFromArn(arn) {
3759
3756
  var IAMInstanceProfileProvider = class {
3760
3757
  iamClient;
3761
3758
  logger = getLogger().child("IAMInstanceProfileProvider");
3762
- handledProperties = new Map([["AWS::IAM::InstanceProfile", new Set([
3759
+ handledProperties = /* @__PURE__ */ new Map([["AWS::IAM::InstanceProfile", /* @__PURE__ */ new Set([
3763
3760
  "InstanceProfileName",
3764
3761
  "Path",
3765
3762
  "Roles"
@@ -3979,8 +3976,8 @@ var IAMInstanceProfileProvider = class {
3979
3976
  var IAMUserGroupProvider = class {
3980
3977
  iamClient;
3981
3978
  logger = getLogger().child("IAMUserGroupProvider");
3982
- handledProperties = new Map([
3983
- ["AWS::IAM::User", new Set([
3979
+ handledProperties = /* @__PURE__ */ new Map([
3980
+ ["AWS::IAM::User", /* @__PURE__ */ new Set([
3984
3981
  "UserName",
3985
3982
  "Path",
3986
3983
  "Tags",
@@ -3990,13 +3987,13 @@ var IAMUserGroupProvider = class {
3990
3987
  "Policies",
3991
3988
  "PermissionsBoundary"
3992
3989
  ])],
3993
- ["AWS::IAM::Group", new Set([
3990
+ ["AWS::IAM::Group", /* @__PURE__ */ new Set([
3994
3991
  "GroupName",
3995
3992
  "Path",
3996
3993
  "ManagedPolicyArns",
3997
3994
  "Policies"
3998
3995
  ])],
3999
- ["AWS::IAM::UserToGroupAddition", new Set(["GroupName", "Users"])]
3996
+ ["AWS::IAM::UserToGroupAddition", /* @__PURE__ */ new Set(["GroupName", "Users"])]
4000
3997
  ]);
4001
3998
  constructor() {
4002
3999
  const awsClients = getAwsClients();
@@ -4880,7 +4877,7 @@ var IAMUserGroupProvider = class {
4880
4877
  var S3BucketProvider = class {
4881
4878
  s3Client;
4882
4879
  logger = getLogger().child("S3BucketProvider");
4883
- handledProperties = new Map([["AWS::S3::Bucket", new Set([
4880
+ handledProperties = /* @__PURE__ */ new Map([["AWS::S3::Bucket", /* @__PURE__ */ new Set([
4884
4881
  "BucketName",
4885
4882
  "VersioningConfiguration",
4886
4883
  "Tags",
@@ -4901,7 +4898,7 @@ var S3BucketProvider = class {
4901
4898
  "ObjectLockConfiguration",
4902
4899
  "ObjectLockEnabled"
4903
4900
  ])]]);
4904
- unhandledByDesign = new Map([["AWS::S3::Bucket", new Map([["AccessControl", "Legacy canned ACL; AWS disables ACLs by default since 2023-04 — use BucketOwnershipControls + BucketPolicy / PublicAccessBlockConfiguration instead"]])]]);
4901
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::S3::Bucket", /* @__PURE__ */ new Map([["AccessControl", "Legacy canned ACL; AWS disables ACLs by default since 2023-04 — use BucketOwnershipControls + BucketPolicy / PublicAccessBlockConfiguration instead"]])]]);
4905
4902
  constructor() {
4906
4903
  const awsClients = getAwsClients();
4907
4904
  this.s3Client = awsClients.s3;
@@ -6460,7 +6457,7 @@ function findTemplateCanonicalUser(awsStmt, templateStmts) {
6460
6457
  var S3BucketPolicyProvider = class {
6461
6458
  s3Client;
6462
6459
  logger = getLogger().child("S3BucketPolicyProvider");
6463
- handledProperties = new Map([["AWS::S3::BucketPolicy", new Set(["Bucket", "PolicyDocument"])]]);
6460
+ handledProperties = /* @__PURE__ */ new Map([["AWS::S3::BucketPolicy", /* @__PURE__ */ new Set(["Bucket", "PolicyDocument"])]]);
6464
6461
  constructor() {
6465
6462
  const awsClients = getAwsClients();
6466
6463
  this.s3Client = awsClients.s3;
@@ -6846,7 +6843,7 @@ var SQSQueueProvider = class {
6846
6843
  sqsClient;
6847
6844
  stsClient;
6848
6845
  logger = getLogger().child("SQSQueueProvider");
6849
- handledProperties = new Map([["AWS::SQS::Queue", new Set([
6846
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SQS::Queue", /* @__PURE__ */ new Set([
6850
6847
  "QueueName",
6851
6848
  "VisibilityTimeout",
6852
6849
  "MaximumMessageSize",
@@ -7189,7 +7186,7 @@ var SQSQueueProvider = class {
7189
7186
  var SQSQueuePolicyProvider = class {
7190
7187
  sqsClient;
7191
7188
  logger = getLogger().child("SQSQueuePolicyProvider");
7192
- handledProperties = new Map([["AWS::SQS::QueuePolicy", new Set(["Queues", "PolicyDocument"])]]);
7189
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SQS::QueuePolicy", /* @__PURE__ */ new Set(["Queues", "PolicyDocument"])]]);
7193
7190
  constructor() {
7194
7191
  const awsClients = getAwsClients();
7195
7192
  this.sqsClient = awsClients.sqs;
@@ -7396,7 +7393,7 @@ function isSqsQueueUrl(value) {
7396
7393
  var SNSTopicProvider = class {
7397
7394
  snsClient;
7398
7395
  logger = getLogger().child("SNSTopicProvider");
7399
- handledProperties = new Map([["AWS::SNS::Topic", new Set([
7396
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::Topic", /* @__PURE__ */ new Set([
7400
7397
  "TopicName",
7401
7398
  "FifoTopic",
7402
7399
  "ContentBasedDeduplication",
@@ -8029,7 +8026,7 @@ function mapDeliveryStatusLogging(attrs, stateCaseMap = /* @__PURE__ */ new Map(
8029
8026
  var SNSSubscriptionProvider = class {
8030
8027
  snsClient;
8031
8028
  logger = getLogger().child("SNSSubscriptionProvider");
8032
- handledProperties = new Map([["AWS::SNS::Subscription", new Set([
8029
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::Subscription", /* @__PURE__ */ new Set([
8033
8030
  "TopicArn",
8034
8031
  "Protocol",
8035
8032
  "Endpoint",
@@ -8041,7 +8038,7 @@ var SNSSubscriptionProvider = class {
8041
8038
  "ReplayPolicy",
8042
8039
  "SubscriptionRoleArn"
8043
8040
  ])]]);
8044
- unhandledByDesign = new Map([["AWS::SNS::Subscription", new Map([["Region", "CFn-only cross-region subscription hint; cdkd uses the SDK client region directly and has no per-resource region override"]])]]);
8041
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::SNS::Subscription", /* @__PURE__ */ new Map([["Region", "CFn-only cross-region subscription hint; cdkd uses the SDK client region directly and has no per-resource region override"]])]]);
8045
8042
  constructor() {
8046
8043
  const awsClients = getAwsClients();
8047
8044
  this.snsClient = awsClients.sns;
@@ -8210,7 +8207,7 @@ var SNSSubscriptionProvider = class {
8210
8207
  */
8211
8208
  var SNSTopicPolicyProvider = class {
8212
8209
  logger = getLogger().child("SNSTopicPolicyProvider");
8213
- handledProperties = new Map([["AWS::SNS::TopicPolicy", new Set(["Topics", "PolicyDocument"])]]);
8210
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SNS::TopicPolicy", /* @__PURE__ */ new Set(["Topics", "PolicyDocument"])]]);
8214
8211
  /**
8215
8212
  * Create an SNS topic policy
8216
8213
  *
@@ -8446,7 +8443,7 @@ var LambdaFunctionProvider = class {
8446
8443
  lambdaClient;
8447
8444
  ec2Client;
8448
8445
  logger = getLogger().child("LambdaFunctionProvider");
8449
- handledProperties = new Map([["AWS::Lambda::Function", new Set([
8446
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Function", /* @__PURE__ */ new Set([
8450
8447
  "FunctionName",
8451
8448
  "Code",
8452
8449
  "Role",
@@ -9284,7 +9281,7 @@ var LambdaFunctionProvider = class {
9284
9281
  var LambdaPermissionProvider = class {
9285
9282
  lambdaClient;
9286
9283
  logger = getLogger().child("LambdaPermissionProvider");
9287
- handledProperties = new Map([["AWS::Lambda::Permission", new Set([
9284
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Permission", /* @__PURE__ */ new Set([
9288
9285
  "FunctionName",
9289
9286
  "Action",
9290
9287
  "Principal",
@@ -9506,7 +9503,7 @@ var LambdaPermissionProvider = class {
9506
9503
  var LambdaUrlProvider = class {
9507
9504
  lambdaClient;
9508
9505
  logger = getLogger().child("LambdaUrlProvider");
9509
- handledProperties = new Map([["AWS::Lambda::Url", new Set([
9506
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::Url", /* @__PURE__ */ new Set([
9510
9507
  "TargetFunctionArn",
9511
9508
  "AuthType",
9512
9509
  "Qualifier",
@@ -9757,12 +9754,12 @@ function classifyEventSourceFromProperties(properties) {
9757
9754
  DocumentDBEventSourceConfig: properties["DocumentDBEventSourceConfig"]
9758
9755
  });
9759
9756
  }
9760
- const KINDS_WITH_FUNCTION_RESPONSE_TYPES = new Set([
9757
+ const KINDS_WITH_FUNCTION_RESPONSE_TYPES = /* @__PURE__ */ new Set([
9761
9758
  "sqs",
9762
9759
  "kinesis",
9763
9760
  "dynamodb"
9764
9761
  ]);
9765
- const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = new Set([
9762
+ const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = /* @__PURE__ */ new Set([
9766
9763
  "kafka",
9767
9764
  "mq",
9768
9765
  "documentdb"
@@ -9775,7 +9772,7 @@ const KINDS_WITH_SOURCE_ACCESS_CONFIGURATIONS = new Set([
9775
9772
  * so the removal-on-UPDATE path only restores `0` for these kinds — see the
9776
9773
  * comment at the `MaximumBatchingWindowInSeconds` clear in `update()`.
9777
9774
  */
9778
- const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = new Set([
9775
+ const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = /* @__PURE__ */ new Set([
9779
9776
  "sqs",
9780
9777
  "kinesis",
9781
9778
  "dynamodb"
@@ -9788,7 +9785,7 @@ const KINDS_WITH_ZERO_BATCHING_WINDOW_DEFAULT = new Set([
9788
9785
  * removal-on-UPDATE default-restore path is gated on this set (see the numeric
9789
9786
  * restores in `update()`).
9790
9787
  */
9791
- const KINDS_WITH_STREAM_NUMERICS = new Set(["kinesis", "dynamodb"]);
9788
+ const KINDS_WITH_STREAM_NUMERICS = /* @__PURE__ */ new Set(["kinesis", "dynamodb"]);
9792
9789
  /**
9793
9790
  * AWS Lambda Event Source Mapping Provider
9794
9791
  *
@@ -9799,7 +9796,7 @@ const KINDS_WITH_STREAM_NUMERICS = new Set(["kinesis", "dynamodb"]);
9799
9796
  var LambdaEventSourceMappingProvider = class {
9800
9797
  lambdaClient;
9801
9798
  logger = getLogger().child("LambdaEventSourceMappingProvider");
9802
- handledProperties = new Map([["AWS::Lambda::EventSourceMapping", new Set([
9799
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::EventSourceMapping", /* @__PURE__ */ new Set([
9803
9800
  "FunctionName",
9804
9801
  "EventSourceArn",
9805
9802
  "BatchSize",
@@ -10124,7 +10121,7 @@ var LambdaEventSourceMappingProvider = class {
10124
10121
  var LambdaLayerVersionProvider = class {
10125
10122
  lambdaClient;
10126
10123
  logger = getLogger().child("LambdaLayerVersionProvider");
10127
- handledProperties = new Map([["AWS::Lambda::LayerVersion", new Set([
10124
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::LayerVersion", /* @__PURE__ */ new Set([
10128
10125
  "LayerName",
10129
10126
  "Content",
10130
10127
  "CompatibleRuntimes",
@@ -10357,7 +10354,7 @@ var LambdaLayerVersionProvider = class {
10357
10354
  var LambdaEventInvokeConfigProvider = class {
10358
10355
  lambdaClient;
10359
10356
  logger = getLogger().child("LambdaEventInvokeConfigProvider");
10360
- handledProperties = new Map([["AWS::Lambda::EventInvokeConfig", new Set([
10357
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Lambda::EventInvokeConfig", /* @__PURE__ */ new Set([
10361
10358
  "FunctionName",
10362
10359
  "Qualifier",
10363
10360
  "MaximumEventAgeInSeconds",
@@ -10569,7 +10566,7 @@ function mapSSESpecification(raw) {
10569
10566
  var DynamoDBTableProvider = class {
10570
10567
  dynamoDBClient;
10571
10568
  logger = getLogger().child("DynamoDBTableProvider");
10572
- handledProperties = new Map([["AWS::DynamoDB::Table", new Set([
10569
+ handledProperties = /* @__PURE__ */ new Map([["AWS::DynamoDB::Table", /* @__PURE__ */ new Set([
10573
10570
  "TableName",
10574
10571
  "KeySchema",
10575
10572
  "AttributeDefinitions",
@@ -10590,7 +10587,7 @@ var DynamoDBTableProvider = class {
10590
10587
  "KinesisStreamSpecification",
10591
10588
  "ContributorInsightsSpecification"
10592
10589
  ])]]);
10593
- unhandledByDesign = new Map([["AWS::DynamoDB::Table", new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]])]]);
10590
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::DynamoDB::Table", /* @__PURE__ */ new Map([["ImportSourceSpecification", "S3 import uses the separate ImportTable API (not CreateTable) and is create-only with no readback; deferred to a dedicated import-from-S3 PR"]])]]);
10594
10591
  constructor() {
10595
10592
  const awsClients = getAwsClients();
10596
10593
  this.dynamoDBClient = awsClients.dynamoDB;
@@ -11510,7 +11507,7 @@ var DynamoDBGlobalTableProvider = class {
11510
11507
  * UpdateTable success.
11511
11508
  */
11512
11509
  attributeCache = /* @__PURE__ */ new Map();
11513
- handledProperties = new Map([["AWS::DynamoDB::GlobalTable", new Set([
11510
+ handledProperties = /* @__PURE__ */ new Map([["AWS::DynamoDB::GlobalTable", /* @__PURE__ */ new Set([
11514
11511
  "TableName",
11515
11512
  "KeySchema",
11516
11513
  "AttributeDefinitions",
@@ -12842,7 +12839,7 @@ var LogsLogGroupProvider = class {
12842
12839
  logsClient;
12843
12840
  stsClient;
12844
12841
  logger = getLogger().child("LogsLogGroupProvider");
12845
- handledProperties = new Map([["AWS::Logs::LogGroup", new Set([
12842
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Logs::LogGroup", /* @__PURE__ */ new Set([
12846
12843
  "LogGroupName",
12847
12844
  "KmsKeyId",
12848
12845
  "RetentionInDays",
@@ -13234,7 +13231,7 @@ var LogsLogGroupProvider = class {
13234
13231
  var CloudWatchAlarmProvider = class {
13235
13232
  cloudWatchClient;
13236
13233
  logger = getLogger().child("CloudWatchAlarmProvider");
13237
- handledProperties = new Map([["AWS::CloudWatch::Alarm", new Set([
13234
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Set([
13238
13235
  "AlarmName",
13239
13236
  "ComparisonOperator",
13240
13237
  "EvaluationPeriods",
@@ -13272,7 +13269,7 @@ var CloudWatchAlarmProvider = class {
13272
13269
  * SDK create input OR the CDK L1 is not backfillable), they are classified
13273
13270
  * unhandled-by-design rather than left as a "not yet implemented" TODO.
13274
13271
  */
13275
- unhandledByDesign = new Map([["AWS::CloudWatch::Alarm", new Map([["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."], ["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."]])]]);
13272
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::CloudWatch::Alarm", /* @__PURE__ */ new Map([["EvaluationCriteria", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."], ["EvaluationInterval", "Absent from both the SDK PutMetricAlarm input and the aws-cdk-lib CfnAlarm L1 (a newer CFn-schema-only property ahead of SDK/CDK support); no wire path to forward it and no CDK app can emit it."]])]]);
13276
13273
  constructor() {
13277
13274
  const awsClients = getAwsClients();
13278
13275
  this.cloudWatchClient = awsClients.cloudWatch;
@@ -13576,7 +13573,7 @@ var CloudWatchAlarmProvider = class {
13576
13573
  var SecretsManagerSecretProvider = class {
13577
13574
  smClient;
13578
13575
  logger = getLogger().child("SecretsManagerSecretProvider");
13579
- handledProperties = new Map([["AWS::SecretsManager::Secret", new Set([
13576
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SecretsManager::Secret", /* @__PURE__ */ new Set([
13580
13577
  "Name",
13581
13578
  "GenerateSecretString",
13582
13579
  "SecretString",
@@ -13858,7 +13855,7 @@ var SecretsManagerSecretProvider = class {
13858
13855
  var SSMParameterProvider = class {
13859
13856
  ssmClient;
13860
13857
  logger = getLogger().child("SSMParameterProvider");
13861
- handledProperties = new Map([["AWS::SSM::Parameter", new Set([
13858
+ handledProperties = /* @__PURE__ */ new Map([["AWS::SSM::Parameter", /* @__PURE__ */ new Set([
13862
13859
  "Name",
13863
13860
  "Type",
13864
13861
  "Value",
@@ -14169,7 +14166,7 @@ var SSMParameterProvider = class {
14169
14166
  var EventBridgeRuleProvider = class {
14170
14167
  eventBridgeClient;
14171
14168
  logger = getLogger().child("EventBridgeRuleProvider");
14172
- handledProperties = new Map([["AWS::Events::Rule", new Set([
14169
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Events::Rule", /* @__PURE__ */ new Set([
14173
14170
  "Name",
14174
14171
  "Description",
14175
14172
  "EventBusName",
@@ -14564,7 +14561,7 @@ function sanitizeDeadLetterConfig(value) {
14564
14561
  var EventBridgeBusProvider = class {
14565
14562
  eventBridgeClient;
14566
14563
  logger = getLogger().child("EventBridgeBusProvider");
14567
- handledProperties = new Map([["AWS::Events::EventBus", new Set([
14564
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Events::EventBus", /* @__PURE__ */ new Set([
14568
14565
  "Name",
14569
14566
  "Tags",
14570
14567
  "EventSourceName",
@@ -14817,24 +14814,24 @@ var EventBridgeBusProvider = class {
14817
14814
  var EC2Provider = class {
14818
14815
  ec2Client;
14819
14816
  logger = getLogger().child("EC2Provider");
14820
- handledProperties = new Map([
14821
- ["AWS::EC2::VPC", new Set([
14817
+ handledProperties = /* @__PURE__ */ new Map([
14818
+ ["AWS::EC2::VPC", /* @__PURE__ */ new Set([
14822
14819
  "CidrBlock",
14823
14820
  "InstanceTenancy",
14824
14821
  "EnableDnsHostnames",
14825
14822
  "EnableDnsSupport",
14826
14823
  "Tags"
14827
14824
  ])],
14828
- ["AWS::EC2::Subnet", new Set([
14825
+ ["AWS::EC2::Subnet", /* @__PURE__ */ new Set([
14829
14826
  "VpcId",
14830
14827
  "CidrBlock",
14831
14828
  "AvailabilityZone",
14832
14829
  "MapPublicIpOnLaunch",
14833
14830
  "Tags"
14834
14831
  ])],
14835
- ["AWS::EC2::InternetGateway", new Set(["Tags"])],
14836
- ["AWS::EC2::VPCGatewayAttachment", new Set(["VpcId", "InternetGatewayId"])],
14837
- ["AWS::EC2::NatGateway", new Set([
14832
+ ["AWS::EC2::InternetGateway", /* @__PURE__ */ new Set(["Tags"])],
14833
+ ["AWS::EC2::VPCGatewayAttachment", /* @__PURE__ */ new Set(["VpcId", "InternetGatewayId"])],
14834
+ ["AWS::EC2::NatGateway", /* @__PURE__ */ new Set([
14838
14835
  "AllocationId",
14839
14836
  "SubnetId",
14840
14837
  "ConnectivityType",
@@ -14845,8 +14842,8 @@ var EC2Provider = class {
14845
14842
  "MaxDrainDurationSeconds",
14846
14843
  "Tags"
14847
14844
  ])],
14848
- ["AWS::EC2::RouteTable", new Set(["VpcId", "Tags"])],
14849
- ["AWS::EC2::Route", new Set([
14845
+ ["AWS::EC2::RouteTable", /* @__PURE__ */ new Set(["VpcId", "Tags"])],
14846
+ ["AWS::EC2::Route", /* @__PURE__ */ new Set([
14850
14847
  "RouteTableId",
14851
14848
  "DestinationCidrBlock",
14852
14849
  "DestinationIpv6CidrBlock",
@@ -14857,8 +14854,8 @@ var EC2Provider = class {
14857
14854
  "NetworkInterfaceId",
14858
14855
  "VpcPeeringConnectionId"
14859
14856
  ])],
14860
- ["AWS::EC2::SubnetRouteTableAssociation", new Set(["SubnetId", "RouteTableId"])],
14861
- ["AWS::EC2::SecurityGroup", new Set([
14857
+ ["AWS::EC2::SubnetRouteTableAssociation", /* @__PURE__ */ new Set(["SubnetId", "RouteTableId"])],
14858
+ ["AWS::EC2::SecurityGroup", /* @__PURE__ */ new Set([
14862
14859
  "GroupDescription",
14863
14860
  "GroupName",
14864
14861
  "VpcId",
@@ -14866,7 +14863,7 @@ var EC2Provider = class {
14866
14863
  "SecurityGroupEgress",
14867
14864
  "Tags"
14868
14865
  ])],
14869
- ["AWS::EC2::SecurityGroupIngress", new Set([
14866
+ ["AWS::EC2::SecurityGroupIngress", /* @__PURE__ */ new Set([
14870
14867
  "GroupId",
14871
14868
  "IpProtocol",
14872
14869
  "FromPort",
@@ -14878,7 +14875,7 @@ var EC2Provider = class {
14878
14875
  "SourceSecurityGroupOwnerId",
14879
14876
  "SourcePrefixListId"
14880
14877
  ])],
14881
- ["AWS::EC2::Instance", new Set([
14878
+ ["AWS::EC2::Instance", /* @__PURE__ */ new Set([
14882
14879
  "ImageId",
14883
14880
  "InstanceType",
14884
14881
  "KeyName",
@@ -14895,8 +14892,8 @@ var EC2Provider = class {
14895
14892
  "EbsOptimized",
14896
14893
  "CreditSpecification"
14897
14894
  ])],
14898
- ["AWS::EC2::NetworkAcl", new Set(["VpcId", "Tags"])],
14899
- ["AWS::EC2::NetworkAclEntry", new Set([
14895
+ ["AWS::EC2::NetworkAcl", /* @__PURE__ */ new Set(["VpcId", "Tags"])],
14896
+ ["AWS::EC2::NetworkAclEntry", /* @__PURE__ */ new Set([
14900
14897
  "NetworkAclId",
14901
14898
  "RuleNumber",
14902
14899
  "Protocol",
@@ -14907,12 +14904,12 @@ var EC2Provider = class {
14907
14904
  "PortRange",
14908
14905
  "Icmp"
14909
14906
  ])],
14910
- ["AWS::EC2::SubnetNetworkAclAssociation", new Set(["SubnetId", "NetworkAclId"])]
14907
+ ["AWS::EC2::SubnetNetworkAclAssociation", /* @__PURE__ */ new Set(["SubnetId", "NetworkAclId"])]
14911
14908
  ]);
14912
- unhandledByDesign = new Map([
14913
- ["AWS::EC2::Instance", new Map([["ElasticGpuSpecifications", "AWS Elastic GPU end-of-life (announced 2023-11); no replacement API"], ["ElasticInferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])],
14914
- ["AWS::EC2::SecurityGroupIngress", new Map([["GroupName", "EC2-Classic-only — use GroupId for VPC security groups (EC2-Classic retired 2022-08-15)"], ["SourceSecurityGroupName", "EC2-Classic-only — use SourceSecurityGroupId for VPC peer security groups (EC2-Classic retired 2022-08-15)"]])],
14915
- ["AWS::EC2::NatGateway", new Map([["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]])]
14909
+ unhandledByDesign = /* @__PURE__ */ new Map([
14910
+ ["AWS::EC2::Instance", /* @__PURE__ */ new Map([["ElasticGpuSpecifications", "AWS Elastic GPU end-of-life (announced 2023-11); no replacement API"], ["ElasticInferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])],
14911
+ ["AWS::EC2::SecurityGroupIngress", /* @__PURE__ */ new Map([["GroupName", "EC2-Classic-only — use GroupId for VPC security groups (EC2-Classic retired 2022-08-15)"], ["SourceSecurityGroupName", "EC2-Classic-only — use SourceSecurityGroupId for VPC peer security groups (EC2-Classic retired 2022-08-15)"]])],
14912
+ ["AWS::EC2::NatGateway", /* @__PURE__ */ new Map([["VpcId", "AWS derives the VPC from SubnetId; the ec2:CreateNatGateway API has no VpcId parameter"]])]
14916
14913
  ]);
14917
14914
  constructor() {
14918
14915
  const awsClients = getAwsClients();
@@ -17283,9 +17280,9 @@ function isDefaultEgressRule(rule) {
17283
17280
  var ApiGatewayProvider = class ApiGatewayProvider {
17284
17281
  apiGatewayClient;
17285
17282
  logger = getLogger().child("ApiGatewayProvider");
17286
- handledProperties = new Map([
17287
- ["AWS::ApiGateway::Account", new Set(["CloudWatchRoleArn"])],
17288
- ["AWS::ApiGateway::Authorizer", new Set([
17283
+ handledProperties = /* @__PURE__ */ new Map([
17284
+ ["AWS::ApiGateway::Account", /* @__PURE__ */ new Set(["CloudWatchRoleArn"])],
17285
+ ["AWS::ApiGateway::Authorizer", /* @__PURE__ */ new Set([
17289
17286
  "RestApiId",
17290
17287
  "Name",
17291
17288
  "Type",
@@ -17297,13 +17294,13 @@ var ApiGatewayProvider = class ApiGatewayProvider {
17297
17294
  "IdentityValidationExpression",
17298
17295
  "AuthorizerResultTtlInSeconds"
17299
17296
  ])],
17300
- ["AWS::ApiGateway::Resource", new Set([
17297
+ ["AWS::ApiGateway::Resource", /* @__PURE__ */ new Set([
17301
17298
  "RestApiId",
17302
17299
  "ParentId",
17303
17300
  "PathPart"
17304
17301
  ])],
17305
- ["AWS::ApiGateway::Deployment", new Set(["RestApiId", "Description"])],
17306
- ["AWS::ApiGateway::Stage", new Set([
17302
+ ["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Set(["RestApiId", "Description"])],
17303
+ ["AWS::ApiGateway::Stage", /* @__PURE__ */ new Set([
17307
17304
  "RestApiId",
17308
17305
  "StageName",
17309
17306
  "DeploymentId",
@@ -17313,7 +17310,7 @@ var ApiGatewayProvider = class ApiGatewayProvider {
17313
17310
  "Variables",
17314
17311
  "MethodSettings"
17315
17312
  ])],
17316
- ["AWS::ApiGateway::Method", new Set([
17313
+ ["AWS::ApiGateway::Method", /* @__PURE__ */ new Set([
17317
17314
  "RestApiId",
17318
17315
  "ResourceId",
17319
17316
  "HttpMethod",
@@ -17329,7 +17326,7 @@ var ApiGatewayProvider = class ApiGatewayProvider {
17329
17326
  "MethodResponses"
17330
17327
  ])]
17331
17328
  ]);
17332
- unhandledByDesign = new Map([["AWS::ApiGateway::Deployment", new Map([["StageName", "CFn-only convenience for inline-creating a Stage from a Deployment; declare AWS::ApiGateway::Stage explicitly to attach to this Deployment"], ["StageDescription", "CFn-only convenience for inline-creating a Stage; declare AWS::ApiGateway::Stage with the Description property instead"]])]]);
17329
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ApiGateway::Deployment", /* @__PURE__ */ new Map([["StageName", "CFn-only convenience for inline-creating a Stage from a Deployment; declare AWS::ApiGateway::Stage explicitly to attach to this Deployment"], ["StageDescription", "CFn-only convenience for inline-creating a Stage; declare AWS::ApiGateway::Stage with the Description property instead"]])]]);
17333
17330
  /** Maximum number of retries for IAM propagation delays */
17334
17331
  static MAX_IAM_RETRIES = 3;
17335
17332
  /** Delay between IAM propagation retries (ms) - exponential backoff */
@@ -18623,8 +18620,8 @@ var ApiGatewayV2Provider = class {
18623
18620
  client;
18624
18621
  providerRegion = process.env["AWS_REGION"];
18625
18622
  logger = getLogger().child("ApiGatewayV2Provider");
18626
- handledProperties = new Map([
18627
- ["AWS::ApiGatewayV2::Api", new Set([
18623
+ handledProperties = /* @__PURE__ */ new Map([
18624
+ ["AWS::ApiGatewayV2::Api", /* @__PURE__ */ new Set([
18628
18625
  "Name",
18629
18626
  "ProtocolType",
18630
18627
  "Description",
@@ -18636,7 +18633,7 @@ var ApiGatewayV2Provider = class {
18636
18633
  "ApiKeySelectionExpression",
18637
18634
  "IpAddressType"
18638
18635
  ])],
18639
- ["AWS::ApiGatewayV2::Stage", new Set([
18636
+ ["AWS::ApiGatewayV2::Stage", /* @__PURE__ */ new Set([
18640
18637
  "ApiId",
18641
18638
  "StageName",
18642
18639
  "AutoDeploy",
@@ -18645,7 +18642,7 @@ var ApiGatewayV2Provider = class {
18645
18642
  "StageVariables",
18646
18643
  "DefaultRouteSettings"
18647
18644
  ])],
18648
- ["AWS::ApiGatewayV2::Integration", new Set([
18645
+ ["AWS::ApiGatewayV2::Integration", /* @__PURE__ */ new Set([
18649
18646
  "ApiId",
18650
18647
  "IntegrationType",
18651
18648
  "IntegrationUri",
@@ -18655,7 +18652,7 @@ var ApiGatewayV2Provider = class {
18655
18652
  "RequestParameters",
18656
18653
  "Description"
18657
18654
  ])],
18658
- ["AWS::ApiGatewayV2::Route", new Set([
18655
+ ["AWS::ApiGatewayV2::Route", /* @__PURE__ */ new Set([
18659
18656
  "ApiId",
18660
18657
  "RouteKey",
18661
18658
  "Target",
@@ -18664,7 +18661,7 @@ var ApiGatewayV2Provider = class {
18664
18661
  "AuthorizationScopes",
18665
18662
  "OperationName"
18666
18663
  ])],
18667
- ["AWS::ApiGatewayV2::Authorizer", new Set([
18664
+ ["AWS::ApiGatewayV2::Authorizer", /* @__PURE__ */ new Set([
18668
18665
  "ApiId",
18669
18666
  "AuthorizerType",
18670
18667
  "Name",
@@ -18690,7 +18687,7 @@ var ApiGatewayV2Provider = class {
18690
18687
  * Wiring them would require parsing OpenAPI semantics + a different
18691
18688
  * mutation surface and is out of scope for the SDK-Provider safety net.
18692
18689
  */
18693
- unhandledByDesign = new Map([["AWS::ApiGatewayV2::Api", new Map([
18690
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ApiGatewayV2::Api", /* @__PURE__ */ new Map([
18694
18691
  ["Body", "OpenAPI/Swagger inline spec; routed through ImportApi, not the field-by-field CreateApi path."],
18695
18692
  ["BodyS3Location", "OpenAPI/Swagger spec on S3; routed through ImportApi, not the field-by-field CreateApi path."],
18696
18693
  ["FailOnWarnings", "OpenAPI-import-only flag; meaningful only on the ImportApi code path."],
@@ -19536,7 +19533,7 @@ var ApiGatewayV2Provider = class {
19536
19533
  var CloudFrontOAIProvider = class {
19537
19534
  cloudFrontClient;
19538
19535
  logger = getLogger().child("CloudFrontOAIProvider");
19539
- handledProperties = new Map([["AWS::CloudFront::CloudFrontOriginAccessIdentity", new Set(["CloudFrontOriginAccessIdentityConfig"])]]);
19536
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFront::CloudFrontOriginAccessIdentity", /* @__PURE__ */ new Set(["CloudFrontOriginAccessIdentityConfig"])]]);
19540
19537
  constructor() {
19541
19538
  const awsClients = getAwsClients();
19542
19539
  this.cloudFrontClient = awsClients.cloudFront;
@@ -19760,7 +19757,7 @@ const CACHE_BEHAVIOR_QUANTITY_FIELDS = [
19760
19757
  var CloudFrontDistributionProvider = class {
19761
19758
  cloudFrontClient;
19762
19759
  logger = getLogger().child("CloudFrontDistributionProvider");
19763
- handledProperties = new Map([["AWS::CloudFront::Distribution", new Set(["DistributionConfig", "Tags"])]]);
19760
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFront::Distribution", /* @__PURE__ */ new Set(["DistributionConfig", "Tags"])]]);
19764
19761
  constructor() {
19765
19762
  const awsClients = getAwsClients();
19766
19763
  this.cloudFrontClient = awsClients.cloudFront;
@@ -20460,7 +20457,7 @@ function camelToPascalCaseKeys(value, preserveKeys) {
20460
20457
  var AgentCoreRuntimeProvider = class {
20461
20458
  client;
20462
20459
  logger = getLogger().child("AgentCoreRuntimeProvider");
20463
- handledProperties = new Map([["AWS::BedrockAgentCore::Runtime", new Set([
20460
+ handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Runtime", /* @__PURE__ */ new Set([
20464
20461
  "AgentRuntimeName",
20465
20462
  "RoleArn",
20466
20463
  "AgentRuntimeArtifact",
@@ -20695,7 +20692,7 @@ const DEFAULT_BROWSER_ID = "aws.browser.v1";
20695
20692
  var AgentCoreBrowserProvider = class {
20696
20693
  client;
20697
20694
  logger = getLogger().child("AgentCoreBrowserProvider");
20698
- handledProperties = new Map([["AWS::BedrockAgentCore::Browser", /* @__PURE__ */ new Set([])]]);
20695
+ handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Browser", /* @__PURE__ */ new Set([])]]);
20699
20696
  constructor() {
20700
20697
  const awsClients = getAwsClients();
20701
20698
  this.client = awsClients.bedrockAgentCoreControl;
@@ -20810,7 +20807,7 @@ const DEFAULT_CODE_INTERPRETER_ID = "aws.codeinterpreter.v1";
20810
20807
  var AgentCoreCodeInterpreterProvider = class {
20811
20808
  client;
20812
20809
  logger = getLogger().child("AgentCoreCodeInterpreterProvider");
20813
- handledProperties = new Map([["AWS::BedrockAgentCore::CodeInterpreter", /* @__PURE__ */ new Set([])]]);
20810
+ handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::CodeInterpreter", /* @__PURE__ */ new Set([])]]);
20814
20811
  constructor() {
20815
20812
  const awsClients = getAwsClients();
20816
20813
  this.client = awsClients.bedrockAgentCoreControl;
@@ -20928,8 +20925,8 @@ var AgentCoreCodeInterpreterProvider = class {
20928
20925
  * The `EvaluatorConfig` subtree keys whose values are free-form JSON
20929
20926
  * documents (user/model-defined keys) that must NOT be case-converted.
20930
20927
  */
20931
- const CFN_PRESERVE_KEYS = new Set(["AdditionalModelRequestFields"]);
20932
- const SDK_PRESERVE_KEYS = new Set(["additionalModelRequestFields"]);
20928
+ const CFN_PRESERVE_KEYS = /* @__PURE__ */ new Set(["AdditionalModelRequestFields"]);
20929
+ const SDK_PRESERVE_KEYS = /* @__PURE__ */ new Set(["additionalModelRequestFields"]);
20933
20930
  /**
20934
20931
  * Extract the evaluator ID from an evaluator ARN
20935
20932
  * (`arn:...:evaluator/<id>` → `<id>`). Falls back to the input verbatim
@@ -20960,7 +20957,7 @@ function tagMapToCfnList(tags) {
20960
20957
  var AgentCoreEvaluatorProvider = class {
20961
20958
  client;
20962
20959
  logger = getLogger().child("AgentCoreEvaluatorProvider");
20963
- handledProperties = new Map([["AWS::BedrockAgentCore::Evaluator", new Set([
20960
+ handledProperties = /* @__PURE__ */ new Map([["AWS::BedrockAgentCore::Evaluator", /* @__PURE__ */ new Set([
20964
20961
  "EvaluatorName",
20965
20962
  "Description",
20966
20963
  "EvaluatorConfig",
@@ -21171,7 +21168,7 @@ var StepFunctionsProvider = class {
21171
21168
  s3Client;
21172
21169
  providerRegion = process.env["AWS_REGION"];
21173
21170
  logger = getLogger().child("StepFunctionsProvider");
21174
- handledProperties = new Map([["AWS::StepFunctions::StateMachine", new Set([
21171
+ handledProperties = /* @__PURE__ */ new Map([["AWS::StepFunctions::StateMachine", /* @__PURE__ */ new Set([
21175
21172
  "StateMachineName",
21176
21173
  "RoleArn",
21177
21174
  "StateMachineType",
@@ -21653,8 +21650,8 @@ var ECSProvider = class {
21653
21650
  ecsClient;
21654
21651
  providerRegion = process.env["AWS_REGION"];
21655
21652
  logger = getLogger().child("ECSProvider");
21656
- handledProperties = new Map([
21657
- ["AWS::ECS::Cluster", new Set([
21653
+ handledProperties = /* @__PURE__ */ new Map([
21654
+ ["AWS::ECS::Cluster", /* @__PURE__ */ new Set([
21658
21655
  "ClusterName",
21659
21656
  "CapacityProviders",
21660
21657
  "DefaultCapacityProviderStrategy",
@@ -21663,7 +21660,7 @@ var ECSProvider = class {
21663
21660
  "ServiceConnectDefaults",
21664
21661
  "Tags"
21665
21662
  ])],
21666
- ["AWS::ECS::TaskDefinition", new Set([
21663
+ ["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Set([
21667
21664
  "Family",
21668
21665
  "ContainerDefinitions",
21669
21666
  "Cpu",
@@ -21682,7 +21679,7 @@ var ECSProvider = class {
21682
21679
  "EnableFaultInjection",
21683
21680
  "Tags"
21684
21681
  ])],
21685
- ["AWS::ECS::Service", new Set([
21682
+ ["AWS::ECS::Service", /* @__PURE__ */ new Set([
21686
21683
  "Cluster",
21687
21684
  "ServiceName",
21688
21685
  "TaskDefinition",
@@ -21704,7 +21701,7 @@ var ECSProvider = class {
21704
21701
  "Tags"
21705
21702
  ])]
21706
21703
  ]);
21707
- unhandledByDesign = new Map([["AWS::ECS::Service", new Map([["Role", "Legacy classic-ELB service-linked-role override; AWS uses the AWSServiceRoleForECS service-linked role automatically since 2017"]])], ["AWS::ECS::TaskDefinition", new Map([["InferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])]]);
21704
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ECS::Service", /* @__PURE__ */ new Map([["Role", "Legacy classic-ELB service-linked-role override; AWS uses the AWSServiceRoleForECS service-linked role automatically since 2017"]])], ["AWS::ECS::TaskDefinition", /* @__PURE__ */ new Map([["InferenceAccelerators", "AWS Elastic Inference end-of-life 2024-04; use AWS Inferentia / Trainium accelerator instance families instead"]])]]);
21708
21705
  getClient() {
21709
21706
  if (!this.ecsClient) this.ecsClient = new ECSClient(this.providerRegion ? { region: this.providerRegion } : {});
21710
21707
  return this.ecsClient;
@@ -22704,8 +22701,8 @@ var ELBv2Provider = class {
22704
22701
  elbv2Client;
22705
22702
  providerRegion = process.env["AWS_REGION"];
22706
22703
  logger = getLogger().child("ELBv2Provider");
22707
- handledProperties = new Map([
22708
- ["AWS::ElasticLoadBalancingV2::LoadBalancer", new Set([
22704
+ handledProperties = /* @__PURE__ */ new Map([
22705
+ ["AWS::ElasticLoadBalancingV2::LoadBalancer", /* @__PURE__ */ new Set([
22709
22706
  "Name",
22710
22707
  "Subnets",
22711
22708
  "SubnetMappings",
@@ -22716,7 +22713,7 @@ var ELBv2Provider = class {
22716
22713
  "LoadBalancerAttributes",
22717
22714
  "Tags"
22718
22715
  ])],
22719
- ["AWS::ElasticLoadBalancingV2::TargetGroup", new Set([
22716
+ ["AWS::ElasticLoadBalancingV2::TargetGroup", /* @__PURE__ */ new Set([
22720
22717
  "Protocol",
22721
22718
  "Port",
22722
22719
  "VpcId",
@@ -22734,7 +22731,7 @@ var ELBv2Provider = class {
22734
22731
  "Name",
22735
22732
  "Tags"
22736
22733
  ])],
22737
- ["AWS::ElasticLoadBalancingV2::Listener", new Set([
22734
+ ["AWS::ElasticLoadBalancingV2::Listener", /* @__PURE__ */ new Set([
22738
22735
  "LoadBalancerArn",
22739
22736
  "Certificates",
22740
22737
  "DefaultActions",
@@ -22829,7 +22826,7 @@ var ELBv2Provider = class {
22829
22826
  }
22830
22827
  }
22831
22828
  async updateLoadBalancer(logicalId, physicalId, _resourceType, properties, previousProperties) {
22832
- const handledKeys = new Set([
22829
+ const handledKeys = /* @__PURE__ */ new Set([
22833
22830
  "LoadBalancerAttributes",
22834
22831
  "Subnets",
22835
22832
  "SubnetMappings",
@@ -23463,14 +23460,14 @@ var RDSProvider = class {
23463
23460
  rdsClient;
23464
23461
  providerRegion = process.env["AWS_REGION"];
23465
23462
  logger = getLogger().child("RDSProvider");
23466
- handledProperties = new Map([
23467
- ["AWS::RDS::DBSubnetGroup", new Set([
23463
+ handledProperties = /* @__PURE__ */ new Map([
23464
+ ["AWS::RDS::DBSubnetGroup", /* @__PURE__ */ new Set([
23468
23465
  "DBSubnetGroupName",
23469
23466
  "DBSubnetGroupDescription",
23470
23467
  "SubnetIds",
23471
23468
  "Tags"
23472
23469
  ])],
23473
- ["AWS::RDS::DBCluster", new Set([
23470
+ ["AWS::RDS::DBCluster", /* @__PURE__ */ new Set([
23474
23471
  "DBClusterIdentifier",
23475
23472
  "Engine",
23476
23473
  "EngineVersion",
@@ -23493,7 +23490,7 @@ var RDSProvider = class {
23493
23490
  "EnableIAMDatabaseAuthentication",
23494
23491
  "PubliclyAccessible"
23495
23492
  ])],
23496
- ["AWS::RDS::DBInstance", new Set([
23493
+ ["AWS::RDS::DBInstance", /* @__PURE__ */ new Set([
23497
23494
  "DBInstanceIdentifier",
23498
23495
  "DBInstanceClass",
23499
23496
  "Engine",
@@ -23517,7 +23514,7 @@ var RDSProvider = class {
23517
23514
  "EnableIAMDatabaseAuthentication"
23518
23515
  ])]
23519
23516
  ]);
23520
- unhandledByDesign = new Map([["AWS::RDS::DBCluster", new Map([["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]])], ["AWS::RDS::DBInstance", new Map([
23517
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::RDS::DBCluster", /* @__PURE__ */ new Map([["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]])], ["AWS::RDS::DBInstance", /* @__PURE__ */ new Map([
23521
23518
  ["DBSecurityGroups", "EC2-Classic-only feature retired by AWS (2022-08-15); new accounts cannot use this — use VPCSecurityGroups instead"],
23522
23519
  ["ApplyImmediately", "cdkd always applies modifications immediately (rds:ModifyDBInstance.ApplyImmediately=true is hardcoded); users wanting maintenance-window deferral should run aws rds modify-db-instance directly"],
23523
23520
  ["DeleteAutomatedBackups", "cdkd hardcodes SkipFinalSnapshot=true on destroy; this CFn lifecycle flag has no equivalent on the runtime path"]
@@ -24282,7 +24279,7 @@ var RDSDBProxyProvider = class {
24282
24279
  providerRegion = process.env["AWS_REGION"];
24283
24280
  logger = getLogger().child("RDSDBProxyProvider");
24284
24281
  attributeCache = /* @__PURE__ */ new Map();
24285
- handledProperties = new Map([["AWS::RDS::DBProxy", new Set([
24282
+ handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxy", /* @__PURE__ */ new Set([
24286
24283
  "DBProxyName",
24287
24284
  "EngineFamily",
24288
24285
  "Auth",
@@ -24639,7 +24636,7 @@ var RDSDBProxyEndpointProvider = class {
24639
24636
  providerRegion = process.env["AWS_REGION"];
24640
24637
  logger = getLogger().child("RDSDBProxyEndpointProvider");
24641
24638
  attributeCache = /* @__PURE__ */ new Map();
24642
- handledProperties = new Map([["AWS::RDS::DBProxyEndpoint", new Set([
24639
+ handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxyEndpoint", /* @__PURE__ */ new Set([
24643
24640
  "DBProxyEndpointName",
24644
24641
  "DBProxyName",
24645
24642
  "VpcSubnetIds",
@@ -24968,7 +24965,7 @@ var RDSDBProxyTargetGroupProvider = class {
24968
24965
  rdsClient;
24969
24966
  providerRegion = process.env["AWS_REGION"];
24970
24967
  logger = getLogger().child("RDSDBProxyTargetGroupProvider");
24971
- handledProperties = new Map([["AWS::RDS::DBProxyTargetGroup", new Set([
24968
+ handledProperties = /* @__PURE__ */ new Map([["AWS::RDS::DBProxyTargetGroup", /* @__PURE__ */ new Set([
24972
24969
  "DBProxyName",
24973
24970
  "TargetGroupName",
24974
24971
  "DBClusterIdentifiers",
@@ -25252,14 +25249,14 @@ var DocDBProvider = class {
25252
25249
  docdbClient;
25253
25250
  providerRegion = process.env["AWS_REGION"];
25254
25251
  logger = getLogger().child("DocDBProvider");
25255
- handledProperties = new Map([
25256
- ["AWS::DocDB::DBSubnetGroup", new Set([
25252
+ handledProperties = /* @__PURE__ */ new Map([
25253
+ ["AWS::DocDB::DBSubnetGroup", /* @__PURE__ */ new Set([
25257
25254
  "DBSubnetGroupName",
25258
25255
  "DBSubnetGroupDescription",
25259
25256
  "SubnetIds",
25260
25257
  "Tags"
25261
25258
  ])],
25262
- ["AWS::DocDB::DBCluster", new Set([
25259
+ ["AWS::DocDB::DBCluster", /* @__PURE__ */ new Set([
25263
25260
  "DBClusterIdentifier",
25264
25261
  "EngineVersion",
25265
25262
  "MasterUsername",
@@ -25276,7 +25273,7 @@ var DocDBProvider = class {
25276
25273
  "DeletionProtection",
25277
25274
  "Tags"
25278
25275
  ])],
25279
- ["AWS::DocDB::DBInstance", new Set([
25276
+ ["AWS::DocDB::DBInstance", /* @__PURE__ */ new Set([
25280
25277
  "DBInstanceIdentifier",
25281
25278
  "DBInstanceClass",
25282
25279
  "DBClusterIdentifier",
@@ -25914,14 +25911,14 @@ var NeptuneProvider = class {
25914
25911
  neptuneClient;
25915
25912
  providerRegion = process.env["AWS_REGION"];
25916
25913
  logger = getLogger().child("NeptuneProvider");
25917
- handledProperties = new Map([
25918
- ["AWS::Neptune::DBSubnetGroup", new Set([
25914
+ handledProperties = /* @__PURE__ */ new Map([
25915
+ ["AWS::Neptune::DBSubnetGroup", /* @__PURE__ */ new Set([
25919
25916
  "DBSubnetGroupName",
25920
25917
  "DBSubnetGroupDescription",
25921
25918
  "SubnetIds",
25922
25919
  "Tags"
25923
25920
  ])],
25924
- ["AWS::Neptune::DBCluster", new Set([
25921
+ ["AWS::Neptune::DBCluster", /* @__PURE__ */ new Set([
25925
25922
  "DBClusterIdentifier",
25926
25923
  "EngineVersion",
25927
25924
  "DBPort",
@@ -25938,7 +25935,7 @@ var NeptuneProvider = class {
25938
25935
  "DeletionProtection",
25939
25936
  "Tags"
25940
25937
  ])],
25941
- ["AWS::Neptune::DBInstance", new Set([
25938
+ ["AWS::Neptune::DBInstance", /* @__PURE__ */ new Set([
25942
25939
  "DBInstanceIdentifier",
25943
25940
  "DBInstanceClass",
25944
25941
  "DBClusterIdentifier",
@@ -26572,14 +26569,14 @@ var Route53Provider = class {
26572
26569
  route53Client;
26573
26570
  providerRegion = process.env["AWS_REGION"];
26574
26571
  logger = getLogger().child("Route53Provider");
26575
- handledProperties = new Map([["AWS::Route53::HostedZone", new Set([
26572
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Route53::HostedZone", /* @__PURE__ */ new Set([
26576
26573
  "Name",
26577
26574
  "HostedZoneConfig",
26578
26575
  "HostedZoneTags",
26579
26576
  "VPCs",
26580
26577
  "QueryLoggingConfig",
26581
26578
  "HostedZoneFeatures"
26582
- ])], ["AWS::Route53::RecordSet", new Set([
26579
+ ])], ["AWS::Route53::RecordSet", /* @__PURE__ */ new Set([
26583
26580
  "HostedZoneId",
26584
26581
  "HostedZoneName",
26585
26582
  "Name",
@@ -26790,7 +26787,7 @@ var Route53Provider = class {
26790
26787
  }
26791
26788
  };
26792
26789
  const deadline = Date.now() + timeoutMs;
26793
- const TERMINAL_FAILED = new Set(["ENABLE_FAILED", "DISABLE_FAILED"]);
26790
+ const TERMINAL_FAILED = /* @__PURE__ */ new Set(["ENABLE_FAILED", "DISABLE_FAILED"]);
26794
26791
  const waitFor = async (targets, label) => {
26795
26792
  while (Date.now() < deadline) {
26796
26793
  const status = await readStatus();
@@ -26811,7 +26808,7 @@ var Route53Provider = class {
26811
26808
  if (TERMINAL_FAILED.has(current)) throw new ProvisioningError(`Cannot delete hosted zone ${logicalId} (${physicalId}): AcceleratedRecoveryStatus is '${current}' — operator must resolve before destroy can proceed`, "AWS::Route53::HostedZone", logicalId, physicalId);
26812
26809
  if (current === "ENABLING" || current === "ENABLING_HOSTED_ZONE_LOCKED") {
26813
26810
  this.logger.debug(`Hosted zone ${physicalId} is ${current} (an enabling phase); waiting for it to settle before issuing disable`);
26814
- current = await waitFor(new Set(["ENABLED", "DISABLED"]), "ENABLED or DISABLED");
26811
+ current = await waitFor(/* @__PURE__ */ new Set(["ENABLED", "DISABLED"]), "ENABLED or DISABLED");
26815
26812
  if (current === void 0 || current === "DISABLED") return;
26816
26813
  }
26817
26814
  if (current === "ENABLED") {
@@ -26821,7 +26818,7 @@ var Route53Provider = class {
26821
26818
  EnableAcceleratedRecovery: false
26822
26819
  }));
26823
26820
  } else if (current === "DISABLING" || current === "DISABLING_HOSTED_ZONE_LOCKED") this.logger.debug(`Hosted zone ${physicalId} AcceleratedRecovery is already ${current} (a disabling phase); waiting for settle`);
26824
- const settled = await waitFor(new Set(["DISABLED"]), "DISABLED");
26821
+ const settled = await waitFor(/* @__PURE__ */ new Set(["DISABLED"]), "DISABLED");
26825
26822
  this.logger.debug(`Hosted zone ${physicalId} AcceleratedRecoveryStatus settled to ${settled ?? "undefined (zone gone)"}`);
26826
26823
  }
26827
26824
  async getHostedZoneAttribute(physicalId, attributeName) {
@@ -27328,7 +27325,7 @@ var Route53Provider = class {
27328
27325
  * error (surfaced as a ProvisioningError, never a silent drop), so the failure
27329
27326
  * is loud and the fix is to append the new name here.
27330
27327
  */
27331
- const STANDARD_USER_POOL_ATTRIBUTES = new Set([
27328
+ const STANDARD_USER_POOL_ATTRIBUTES = /* @__PURE__ */ new Set([
27332
27329
  "address",
27333
27330
  "birthdate",
27334
27331
  "email",
@@ -27464,7 +27461,7 @@ var CognitoUserPoolProvider = class {
27464
27461
  cognitoClient;
27465
27462
  providerRegion = process.env["AWS_REGION"];
27466
27463
  logger = getLogger().child("CognitoUserPoolProvider");
27467
- handledProperties = new Map([["AWS::Cognito::UserPool", new Set([
27464
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Cognito::UserPool", /* @__PURE__ */ new Set([
27468
27465
  "UserPoolName",
27469
27466
  "AutoVerifiedAttributes",
27470
27467
  "UsernameAttributes",
@@ -27495,7 +27492,7 @@ var CognitoUserPoolProvider = class {
27495
27492
  "WebAuthnRelyingPartyID",
27496
27493
  "WebAuthnUserVerification"
27497
27494
  ])]]);
27498
- unhandledByDesign = new Map([["AWS::Cognito::UserPool", new Map([["WebAuthnFactorConfiguration", "No SDK wire path: @aws-sdk/client-cognito-identity-provider has no field accepting SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION (not on CreateUserPool/UpdateUserPool, nor SetUserPoolMfaConfig.WebAuthnConfiguration which only carries RelyingPartyId/UserVerification); CC-API-registry-only property"]])]]);
27495
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::Cognito::UserPool", /* @__PURE__ */ new Map([["WebAuthnFactorConfiguration", "No SDK wire path: @aws-sdk/client-cognito-identity-provider has no field accepting SINGLE_FACTOR | MULTI_FACTOR_WITH_USER_VERIFICATION (not on CreateUserPool/UpdateUserPool, nor SetUserPoolMfaConfig.WebAuthnConfiguration which only carries RelyingPartyId/UserVerification); CC-API-registry-only property"]])]]);
27499
27496
  getClient() {
27500
27497
  if (!this.cognitoClient) this.cognitoClient = new CognitoIdentityProviderClient(this.providerRegion ? { region: this.providerRegion } : {});
27501
27498
  return this.cognitoClient;
@@ -27900,13 +27897,13 @@ var ElastiCacheProvider = class {
27900
27897
  cachedAccountId;
27901
27898
  providerRegion = process.env["AWS_REGION"];
27902
27899
  logger = getLogger().child("ElastiCacheProvider");
27903
- handledProperties = new Map([["AWS::ElastiCache::SubnetGroup", new Set([
27900
+ handledProperties = /* @__PURE__ */ new Map([["AWS::ElastiCache::SubnetGroup", /* @__PURE__ */ new Set([
27904
27901
  "CacheSubnetGroupName",
27905
27902
  "CacheSubnetGroupDescription",
27906
27903
  "Description",
27907
27904
  "SubnetIds",
27908
27905
  "Tags"
27909
- ])], ["AWS::ElastiCache::CacheCluster", new Set([
27906
+ ])], ["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Set([
27910
27907
  "ClusterName",
27911
27908
  "Engine",
27912
27909
  "CacheNodeType",
@@ -27931,7 +27928,7 @@ var ElastiCacheProvider = class {
27931
27928
  "IpDiscovery",
27932
27929
  "TransitEncryptionEnabled"
27933
27930
  ])]]);
27934
- unhandledByDesign = new Map([["AWS::ElastiCache::CacheCluster", new Map([["CacheSecurityGroupNames", "EC2-Classic-only — use VpcSecurityGroupIds for VPC-deployed clusters (EC2-Classic retired 2022-08-15)"]])]]);
27931
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::ElastiCache::CacheCluster", /* @__PURE__ */ new Map([["CacheSecurityGroupNames", "EC2-Classic-only — use VpcSecurityGroupIds for VPC-deployed clusters (EC2-Classic retired 2022-08-15)"]])]]);
27935
27932
  getClient() {
27936
27933
  if (!this.client) this.client = new ElastiCacheClient(this.providerRegion ? { region: this.providerRegion } : {});
27937
27934
  return this.client;
@@ -28430,26 +28427,26 @@ var ServiceDiscoveryProvider = class ServiceDiscoveryProvider {
28430
28427
  stsClient;
28431
28428
  providerRegion = process.env["AWS_REGION"];
28432
28429
  logger = getLogger().child("ServiceDiscoveryProvider");
28433
- handledProperties = new Map([
28434
- ["AWS::ServiceDiscovery::PrivateDnsNamespace", new Set([
28430
+ handledProperties = /* @__PURE__ */ new Map([
28431
+ ["AWS::ServiceDiscovery::PrivateDnsNamespace", /* @__PURE__ */ new Set([
28435
28432
  "Name",
28436
28433
  "Vpc",
28437
28434
  "Description",
28438
28435
  "Tags",
28439
28436
  "Properties"
28440
28437
  ])],
28441
- ["AWS::ServiceDiscovery::HttpNamespace", new Set([
28438
+ ["AWS::ServiceDiscovery::HttpNamespace", /* @__PURE__ */ new Set([
28442
28439
  "Name",
28443
28440
  "Description",
28444
28441
  "Tags"
28445
28442
  ])],
28446
- ["AWS::ServiceDiscovery::PublicDnsNamespace", new Set([
28443
+ ["AWS::ServiceDiscovery::PublicDnsNamespace", /* @__PURE__ */ new Set([
28447
28444
  "Name",
28448
28445
  "Description",
28449
28446
  "Tags",
28450
28447
  "Properties"
28451
28448
  ])],
28452
- ["AWS::ServiceDiscovery::Service", new Set([
28449
+ ["AWS::ServiceDiscovery::Service", /* @__PURE__ */ new Set([
28453
28450
  "Name",
28454
28451
  "NamespaceId",
28455
28452
  "DnsConfig",
@@ -29264,20 +29261,20 @@ var AppSyncProvider = class {
29264
29261
  * and the old entry simply becomes unreachable.
29265
29262
  */
29266
29263
  arnCache = /* @__PURE__ */ new Map();
29267
- handledProperties = new Map([
29268
- ["AWS::AppSync::GraphQLApi", new Set([
29264
+ handledProperties = /* @__PURE__ */ new Map([
29265
+ ["AWS::AppSync::GraphQLApi", /* @__PURE__ */ new Set([
29269
29266
  "Name",
29270
29267
  "AuthenticationType",
29271
29268
  "XrayEnabled",
29272
29269
  "LogConfig",
29273
29270
  "Tags"
29274
29271
  ])],
29275
- ["AWS::AppSync::GraphQLSchema", new Set([
29272
+ ["AWS::AppSync::GraphQLSchema", /* @__PURE__ */ new Set([
29276
29273
  "ApiId",
29277
29274
  "Definition",
29278
29275
  "DefinitionS3Location"
29279
29276
  ])],
29280
- ["AWS::AppSync::DataSource", new Set([
29277
+ ["AWS::AppSync::DataSource", /* @__PURE__ */ new Set([
29281
29278
  "ApiId",
29282
29279
  "Name",
29283
29280
  "Type",
@@ -29287,7 +29284,7 @@ var AppSyncProvider = class {
29287
29284
  "LambdaConfig",
29288
29285
  "HttpConfig"
29289
29286
  ])],
29290
- ["AWS::AppSync::Resolver", new Set([
29287
+ ["AWS::AppSync::Resolver", /* @__PURE__ */ new Set([
29291
29288
  "ApiId",
29292
29289
  "TypeName",
29293
29290
  "FieldName",
@@ -29299,13 +29296,13 @@ var AppSyncProvider = class {
29299
29296
  "Runtime",
29300
29297
  "Code"
29301
29298
  ])],
29302
- ["AWS::AppSync::ApiKey", new Set([
29299
+ ["AWS::AppSync::ApiKey", /* @__PURE__ */ new Set([
29303
29300
  "ApiId",
29304
29301
  "Description",
29305
29302
  "Expires"
29306
29303
  ])]
29307
29304
  ]);
29308
- unhandledByDesign = new Map([["AWS::AppSync::DataSource", new Map([["ElasticsearchConfig", "Legacy Elasticsearch alias; use OpenSearchServiceConfig (AppSync deprecated the Elasticsearch DataSource type in favor of OpenSearch)"]])]]);
29305
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::AppSync::DataSource", /* @__PURE__ */ new Map([["ElasticsearchConfig", "Legacy Elasticsearch alias; use OpenSearchServiceConfig (AppSync deprecated the Elasticsearch DataSource type in favor of OpenSearch)"]])]]);
29309
29306
  getClient() {
29310
29307
  if (!this.client) this.client = new AppSyncClient(this.providerRegion ? { region: this.providerRegion } : {});
29311
29308
  return this.client;
@@ -30171,11 +30168,11 @@ var GlueProvider = class {
30171
30168
  cachedAccountId;
30172
30169
  providerRegion = process.env["AWS_REGION"];
30173
30170
  logger = getLogger().child("GlueProvider");
30174
- handledProperties = new Map([["AWS::Glue::Database", new Set([
30171
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Database", /* @__PURE__ */ new Set([
30175
30172
  "DatabaseInput",
30176
30173
  "DatabaseName",
30177
30174
  "CatalogId"
30178
- ])], ["AWS::Glue::Table", new Set([
30175
+ ])], ["AWS::Glue::Table", /* @__PURE__ */ new Set([
30179
30176
  "DatabaseName",
30180
30177
  "TableInput",
30181
30178
  "Name",
@@ -30665,7 +30662,7 @@ var GlueWorkflowProvider = class {
30665
30662
  cachedAccountId;
30666
30663
  providerRegion = process.env["AWS_REGION"];
30667
30664
  logger = getLogger().child("GlueWorkflowProvider");
30668
- handledProperties = new Map([["AWS::Glue::Workflow", new Set([
30665
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Workflow", /* @__PURE__ */ new Set([
30669
30666
  "Name",
30670
30667
  "Description",
30671
30668
  "DefaultRunProperties",
@@ -30843,7 +30840,7 @@ var GlueSecurityConfigurationProvider = class {
30843
30840
  client;
30844
30841
  providerRegion = process.env["AWS_REGION"];
30845
30842
  logger = getLogger().child("GlueSecurityConfigurationProvider");
30846
- handledProperties = new Map([["AWS::Glue::SecurityConfiguration", new Set(["Name", "EncryptionConfiguration"])]]);
30843
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::SecurityConfiguration", /* @__PURE__ */ new Set(["Name", "EncryptionConfiguration"])]]);
30847
30844
  getClient() {
30848
30845
  if (!this.client) this.client = new GlueClient(this.providerRegion ? { region: this.providerRegion } : {});
30849
30846
  return this.client;
@@ -31066,7 +31063,7 @@ var GlueJobProvider = class {
31066
31063
  cachedAccountId;
31067
31064
  providerRegion = process.env["AWS_REGION"];
31068
31065
  logger = getLogger().child("GlueJobProvider");
31069
- handledProperties = new Map([["AWS::Glue::Job", new Set([
31066
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Job", /* @__PURE__ */ new Set([
31070
31067
  "Name",
31071
31068
  "Role",
31072
31069
  "Command",
@@ -31372,7 +31369,7 @@ var GlueCrawlerProvider = class {
31372
31369
  cachedAccountId;
31373
31370
  providerRegion = process.env["AWS_REGION"];
31374
31371
  logger = getLogger().child("GlueCrawlerProvider");
31375
- handledProperties = new Map([["AWS::Glue::Crawler", new Set([
31372
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Crawler", /* @__PURE__ */ new Set([
31376
31373
  "Name",
31377
31374
  "Role",
31378
31375
  "Targets",
@@ -31609,7 +31606,7 @@ var GlueConnectionProvider = class {
31609
31606
  client;
31610
31607
  providerRegion = process.env["AWS_REGION"];
31611
31608
  logger = getLogger().child("GlueConnectionProvider");
31612
- handledProperties = new Map([["AWS::Glue::Connection", new Set(["ConnectionInput", "CatalogId"])]]);
31609
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Connection", /* @__PURE__ */ new Set(["ConnectionInput", "CatalogId"])]]);
31613
31610
  getClient() {
31614
31611
  if (!this.client) this.client = new GlueClient(this.providerRegion ? { region: this.providerRegion } : {});
31615
31612
  return this.client;
@@ -31759,7 +31756,7 @@ var GlueTriggerProvider = class {
31759
31756
  cachedAccountId;
31760
31757
  providerRegion = process.env["AWS_REGION"];
31761
31758
  logger = getLogger().child("GlueTriggerProvider");
31762
- handledProperties = new Map([["AWS::Glue::Trigger", new Set([
31759
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Glue::Trigger", /* @__PURE__ */ new Set([
31763
31760
  "Name",
31764
31761
  "Type",
31765
31762
  "Schedule",
@@ -31975,7 +31972,7 @@ var KMSProvider = class {
31975
31972
  client;
31976
31973
  providerRegion = process.env["AWS_REGION"];
31977
31974
  logger = getLogger().child("KMSProvider");
31978
- handledProperties = new Map([["AWS::KMS::Key", new Set([
31975
+ handledProperties = /* @__PURE__ */ new Map([["AWS::KMS::Key", /* @__PURE__ */ new Set([
31979
31976
  "Description",
31980
31977
  "KeyPolicy",
31981
31978
  "KeySpec",
@@ -31988,7 +31985,7 @@ var KMSProvider = class {
31988
31985
  "RotationPeriodInDays",
31989
31986
  "Origin",
31990
31987
  "BypassPolicyLockoutSafetyCheck"
31991
- ])], ["AWS::KMS::Alias", new Set(["AliasName", "TargetKeyId"])]]);
31988
+ ])], ["AWS::KMS::Alias", /* @__PURE__ */ new Set(["AliasName", "TargetKeyId"])]]);
31992
31989
  getClient() {
31993
31990
  if (!this.client) this.client = new KMSClient(this.providerRegion ? { region: this.providerRegion } : {});
31994
31991
  return this.client;
@@ -32442,7 +32439,7 @@ var BudgetsBudgetProvider = class {
32442
32439
  providerRegion = process.env["AWS_REGION"];
32443
32440
  logger = getLogger().child("BudgetsBudgetProvider");
32444
32441
  accountIdPromise;
32445
- handledProperties = new Map([["AWS::Budgets::Budget", new Set([
32442
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Budgets::Budget", /* @__PURE__ */ new Set([
32446
32443
  "Budget",
32447
32444
  "NotificationsWithSubscribers",
32448
32445
  "ResourceTags"
@@ -32916,7 +32913,7 @@ var KinesisStreamProvider = class {
32916
32913
  client;
32917
32914
  providerRegion = process.env["AWS_REGION"];
32918
32915
  logger = getLogger().child("KinesisProvider");
32919
- handledProperties = new Map([["AWS::Kinesis::Stream", new Set([
32916
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Kinesis::Stream", /* @__PURE__ */ new Set([
32920
32917
  "Name",
32921
32918
  "StreamModeDetails",
32922
32919
  "ShardCount",
@@ -33288,7 +33285,7 @@ var KinesisStreamConsumerProvider = class {
33288
33285
  client;
33289
33286
  providerRegion = process.env["AWS_REGION"];
33290
33287
  logger = getLogger().child("KinesisStreamConsumerProvider");
33291
- handledProperties = new Map([["AWS::Kinesis::StreamConsumer", new Set([
33288
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Kinesis::StreamConsumer", /* @__PURE__ */ new Set([
33292
33289
  "ConsumerName",
33293
33290
  "StreamARN",
33294
33291
  "Tags"
@@ -33555,7 +33552,7 @@ var SchedulerScheduleProvider = class {
33555
33552
  client;
33556
33553
  providerRegion = process.env["AWS_REGION"];
33557
33554
  logger = getLogger().child("SchedulerScheduleProvider");
33558
- handledProperties = new Map([["AWS::Scheduler::Schedule", new Set([
33555
+ handledProperties = /* @__PURE__ */ new Map([["AWS::Scheduler::Schedule", /* @__PURE__ */ new Set([
33559
33556
  "Name",
33560
33557
  "GroupName",
33561
33558
  "Description",
@@ -33750,8 +33747,8 @@ var EFSProvider = class {
33750
33747
  client;
33751
33748
  providerRegion = process.env["AWS_REGION"];
33752
33749
  logger = getLogger().child("EFSProvider");
33753
- handledProperties = new Map([
33754
- ["AWS::EFS::FileSystem", new Set([
33750
+ handledProperties = /* @__PURE__ */ new Map([
33751
+ ["AWS::EFS::FileSystem", /* @__PURE__ */ new Set([
33755
33752
  "FileSystemTags",
33756
33753
  "Encrypted",
33757
33754
  "KmsKeyId",
@@ -33765,19 +33762,19 @@ var EFSProvider = class {
33765
33762
  "BypassPolicyLockoutSafetyCheck",
33766
33763
  "FileSystemProtection"
33767
33764
  ])],
33768
- ["AWS::EFS::MountTarget", new Set([
33765
+ ["AWS::EFS::MountTarget", /* @__PURE__ */ new Set([
33769
33766
  "FileSystemId",
33770
33767
  "SubnetId",
33771
33768
  "SecurityGroups"
33772
33769
  ])],
33773
- ["AWS::EFS::AccessPoint", new Set([
33770
+ ["AWS::EFS::AccessPoint", /* @__PURE__ */ new Set([
33774
33771
  "FileSystemId",
33775
33772
  "PosixUser",
33776
33773
  "RootDirectory",
33777
33774
  "AccessPointTags"
33778
33775
  ])]
33779
33776
  ]);
33780
- unhandledByDesign = new Map([["AWS::EFS::FileSystem", new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider. Tracked as a follow-up to issue #609."]])], ["AWS::EFS::AccessPoint", new Map([["ClientToken", "AWS SDK manages this idempotency token internally on CreateAccessPoint; no user-supplied value is honored"]])]]);
33777
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::EFS::FileSystem", /* @__PURE__ */ new Map([["ReplicationConfiguration", "Cross-region EFS replication (CreateReplicationConfiguration) provisions a separate destination file system in another region with its own lifecycle, KMS key, and availability-zone placement; replicating + then tearing down the destination on destroy is a multi-resource, cross-region orchestration that is out of scope for the single-resource SDK provider. Tracked as a follow-up to issue #609."]])], ["AWS::EFS::AccessPoint", /* @__PURE__ */ new Map([["ClientToken", "AWS SDK manages this idempotency token internally on CreateAccessPoint; no user-supplied value is honored"]])]]);
33781
33778
  getClient() {
33782
33779
  if (!this.client) this.client = new EFSClient(this.providerRegion ? { region: this.providerRegion } : {});
33783
33780
  return this.client;
@@ -34413,14 +34410,14 @@ var EFSProvider = class {
34413
34410
  * storage-capacity growth and deletes can take substantially longer —
34414
34411
  * mirror the Custom Resource provider's 1-hour ceiling.
34415
34412
  */
34416
- const DEFAULT_MAX_WAIT_MS$1 = 3600 * 1e3;
34417
- const DEFAULT_POLL_INTERVAL_MS$1 = 15e3;
34413
+ const DEFAULT_MAX_WAIT_MS$3 = 3600 * 1e3;
34414
+ const DEFAULT_POLL_INTERVAL_MS$3 = 15e3;
34418
34415
  /**
34419
34416
  * Lustre sub-properties that `UpdateFileSystem` accepts (the mutable
34420
34417
  * subset of the CFn `LustreConfiguration` block). Everything else in the
34421
34418
  * block is fixed at creation — FSx has no API to change it in place.
34422
34419
  */
34423
- const LUSTRE_MUTABLE_SUBPROPS = new Set([
34420
+ const LUSTRE_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
34424
34421
  "WeeklyMaintenanceStartTime",
34425
34422
  "DailyAutomaticBackupStartTime",
34426
34423
  "AutomaticBackupRetentionDays",
@@ -34432,6 +34429,94 @@ const LUSTRE_MUTABLE_SUBPROPS = new Set([
34432
34429
  "DataReadCacheConfiguration"
34433
34430
  ]);
34434
34431
  /**
34432
+ * `WindowsConfiguration` sub-properties `UpdateFileSystem` accepts (the
34433
+ * mutable subset — mirrors `UpdateFileSystemWindowsConfiguration`).
34434
+ * Everything else in the CFn block (ActiveDirectoryId, DeploymentType,
34435
+ * PreferredSubnetId, Aliases, ...) is fixed at creation, so a change on one
34436
+ * is rejected by update() with a `--replace` pointer.
34437
+ */
34438
+ const WINDOWS_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
34439
+ "WeeklyMaintenanceStartTime",
34440
+ "DailyAutomaticBackupStartTime",
34441
+ "AutomaticBackupRetentionDays",
34442
+ "ThroughputCapacity",
34443
+ "SelfManagedActiveDirectoryConfiguration",
34444
+ "AuditLogConfiguration",
34445
+ "DiskIopsConfiguration",
34446
+ "FsrmConfiguration"
34447
+ ]);
34448
+ /**
34449
+ * `OntapConfiguration` sub-properties `UpdateFileSystem` accepts (mirrors
34450
+ * `UpdateFileSystemOntapConfiguration`). `RouteTableIds` is mutable but the
34451
+ * API expresses the change as Add/Remove deltas, computed in
34452
+ * {@link FSxFileSystemProvider.applyOntapUpdateField}.
34453
+ */
34454
+ const ONTAP_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
34455
+ "AutomaticBackupRetentionDays",
34456
+ "DailyAutomaticBackupStartTime",
34457
+ "FsxAdminPassword",
34458
+ "WeeklyMaintenanceStartTime",
34459
+ "DiskIopsConfiguration",
34460
+ "ThroughputCapacity",
34461
+ "ThroughputCapacityPerHAPair",
34462
+ "HAPairs",
34463
+ "RouteTableIds",
34464
+ "EndpointIpv6AddressRange"
34465
+ ]);
34466
+ /**
34467
+ * `OpenZFSConfiguration` sub-properties `UpdateFileSystem` accepts (mirrors
34468
+ * `UpdateFileSystemOpenZFSConfiguration`). `RouteTableIds` is mutable via
34469
+ * Add/Remove deltas (see {@link FSxFileSystemProvider.applyOpenZFSUpdateField}).
34470
+ * `RootVolumeConfiguration` is NOT here — its fields change through the root
34471
+ * volume's own `UpdateVolume` API, which `UpdateFileSystem` cannot express,
34472
+ * so a change is rejected with a `--replace` pointer.
34473
+ */
34474
+ const OPENZFS_MUTABLE_SUBPROPS = /* @__PURE__ */ new Set([
34475
+ "AutomaticBackupRetentionDays",
34476
+ "CopyTagsToBackups",
34477
+ "CopyTagsToVolumes",
34478
+ "DailyAutomaticBackupStartTime",
34479
+ "ThroughputCapacity",
34480
+ "WeeklyMaintenanceStartTime",
34481
+ "DiskIopsConfiguration",
34482
+ "RouteTableIds",
34483
+ "ReadCacheConfiguration",
34484
+ "EndpointIpv6AddressRange"
34485
+ ]);
34486
+ /**
34487
+ * The four `FileSystemType` values → their CFn variant-config property name.
34488
+ * Each `CreateFileSystem`/`UpdateFileSystem` call carries at most one of
34489
+ * these blocks (the one matching the file system's type).
34490
+ */
34491
+ const VARIANT_CONFIG_KEY = {
34492
+ LUSTRE: "LustreConfiguration",
34493
+ WINDOWS: "WindowsConfiguration",
34494
+ ONTAP: "OntapConfiguration",
34495
+ OPENZFS: "OpenZFSConfiguration"
34496
+ };
34497
+ const VARIANT_MUTABLE_SUBPROPS = {
34498
+ LustreConfiguration: LUSTRE_MUTABLE_SUBPROPS,
34499
+ WindowsConfiguration: WINDOWS_MUTABLE_SUBPROPS,
34500
+ OntapConfiguration: ONTAP_MUTABLE_SUBPROPS,
34501
+ OpenZFSConfiguration: OPENZFS_MUTABLE_SUBPROPS
34502
+ };
34503
+ /**
34504
+ * Compute the Add/Remove route-table-id deltas an ONTAP / OpenZFS
34505
+ * `UpdateFileSystem` needs from the previous vs. next `RouteTableIds` list.
34506
+ * Route table membership is an unordered set, so a pure reorder yields no
34507
+ * delta.
34508
+ */
34509
+ const routeTableDelta = (next, prev) => {
34510
+ const nextIds = new Set(next ?? []);
34511
+ const prevIds = new Set(prev ?? []);
34512
+ const add = [...nextIds].filter((id) => !prevIds.has(id));
34513
+ const remove = [...prevIds].filter((id) => !nextIds.has(id));
34514
+ return {
34515
+ ...add.length > 0 && { add },
34516
+ ...remove.length > 0 && { remove }
34517
+ };
34518
+ };
34519
+ /**
34435
34520
  * Top-level properties that are create-only per the CFn registry schema
34436
34521
  * (`createOnlyProperties`). A change on any of these is routed through
34437
34522
  * DELETE+CREATE by the replacement-detection layer; if a diff somehow
@@ -34445,7 +34530,7 @@ const TOP_LEVEL_IMMUTABLE_PROPS = [
34445
34530
  "KmsKeyId",
34446
34531
  "BackupId"
34447
34532
  ];
34448
- const toNumber$1 = (v) => v === void 0 ? void 0 : Number(v);
34533
+ const toNumber$3 = (v) => v === void 0 ? void 0 : Number(v);
34449
34534
  const toBoolean$1 = (v) => {
34450
34535
  if (v === void 0) return void 0;
34451
34536
  if (typeof v === "string") return v === "true";
@@ -34457,12 +34542,11 @@ const toBoolean$1 = (v) => {
34457
34542
  * The type is `ProvisioningType: NON_PROVISIONABLE` in the CFn registry,
34458
34543
  * so cdkd's Cloud Control fallback cannot handle it (issue #1042).
34459
34544
  *
34460
- * v1 scope: the **Lustre** variant (the CDK L2, `aws-fsx.LustreFileSystem`).
34461
- * The `WindowsConfiguration` / `OntapConfiguration` / `OpenZFSConfiguration`
34462
- * sub-trees are declared `unhandledByDesign`, so templates using them are
34463
- * rejected by the property-coverage pre-flight instead of silently dropping
34464
- * the whole variant config (each non-Lustre `FileSystemType` REQUIRES its
34465
- * variant block, so no non-Lustre template can slip past the pre-flight).
34545
+ * Supported variants: **Lustre** (the CDK L2 `aws-fsx.LustreFileSystem`),
34546
+ * **Windows** (FSx for Windows File Server), **ONTAP** (FSx for NetApp
34547
+ * ONTAP), and **OpenZFS** (FSx for OpenZFS) each carries its own
34548
+ * `<Variant>Configuration` block, mapped per-variant on create and diffed
34549
+ * against the `UpdateFileSystem` mutable surface on update (issue #1068).
34466
34550
  *
34467
34551
  * Lifecycle handling — every mutation is async on AWS:
34468
34552
  * - `create` → `CreateFileSystem` (or `CreateFileSystemFromBackup` when
@@ -34497,27 +34581,26 @@ var FSxFileSystemProvider = class {
34497
34581
  pollIntervalMs;
34498
34582
  maxWaitMs;
34499
34583
  constructor(options) {
34500
- this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$1;
34501
- this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$1;
34584
+ this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$3;
34585
+ this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$3;
34502
34586
  }
34503
- handledProperties = new Map([["AWS::FSx::FileSystem", new Set([
34587
+ handledProperties = /* @__PURE__ */ new Map([["AWS::FSx::FileSystem", /* @__PURE__ */ new Set([
34504
34588
  "BackupId",
34505
34589
  "FileSystemType",
34506
34590
  "FileSystemTypeVersion",
34507
34591
  "KmsKeyId",
34508
34592
  "LustreConfiguration",
34509
34593
  "NetworkType",
34594
+ "OntapConfiguration",
34595
+ "OpenZFSConfiguration",
34510
34596
  "SecurityGroupIds",
34511
34597
  "StorageCapacity",
34512
34598
  "StorageType",
34513
34599
  "SubnetIds",
34514
- "Tags"
34515
- ])]]);
34516
- unhandledByDesign = new Map([["AWS::FSx::FileSystem", new Map([
34517
- ["WindowsConfiguration", "FSx for Windows File Server variant — requires Active Directory wiring and Windows-specific update/delete semantics (final backups, throughput tiers) that v1 does not implement; only the Lustre variant (the CDK L2) is supported. Follow-up to issue #1042."],
34518
- ["OntapConfiguration", "FSx for NetApp ONTAP variant — the file system is only a container for SVMs/volumes (separate AWS::FSx::StorageVirtualMachine / AWS::FSx::Volume types, both still unsupported), so shipping it alone would be misleading; only the Lustre variant is supported in v1. Follow-up to issue #1042."],
34519
- ["OpenZFSConfiguration", "FSx for OpenZFS variant — root-volume semantics (RootVolumeId, child AWS::FSx::Volume trees) are not implemented in v1; only the Lustre variant is supported. Follow-up to issue #1042."]
34600
+ "Tags",
34601
+ "WindowsConfiguration"
34520
34602
  ])]]);
34603
+ unhandledByDesign = /* @__PURE__ */ new Map();
34521
34604
  getClient() {
34522
34605
  if (!this.client) this.client = new FSxClient(this.providerRegion ? { region: this.providerRegion } : {});
34523
34606
  return this.client;
@@ -34535,7 +34618,7 @@ var FSxFileSystemProvider = class {
34535
34618
  if (resourceType !== "AWS::FSx::FileSystem") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
34536
34619
  const backupId = properties["BackupId"];
34537
34620
  const fileSystemType = properties["FileSystemType"];
34538
- if (backupId === void 0 && fileSystemType !== "LUSTRE") throw new ProvisioningError(`AWS::FSx::FileSystem: FileSystemType '${fileSystemType ?? "(unset)"}' is not supported by cdkd yet only the LUSTRE variant is implemented (issue #1042). Windows / ONTAP / OpenZFS file systems can follow in a later PR.`, resourceType, logicalId);
34621
+ if (backupId === void 0 && !(fileSystemType !== void 0 && fileSystemType in VARIANT_CONFIG_KEY)) throw new ProvisioningError(`AWS::FSx::FileSystem: FileSystemType '${fileSystemType ?? "(unset)"}' is not supported by cdkd — expected one of ${Object.keys(VARIANT_CONFIG_KEY).join(" / ")}.`, resourceType, logicalId);
34539
34622
  this.logger.debug(`Creating FSx FileSystem ${logicalId}`);
34540
34623
  const tokenHash = createHash("sha256").update([
34541
34624
  properties["FileSystemType"],
@@ -34552,10 +34635,13 @@ var FSxFileSystemProvider = class {
34552
34635
  SecurityGroupIds: properties["SecurityGroupIds"],
34553
34636
  KmsKeyId: properties["KmsKeyId"],
34554
34637
  StorageType: properties["StorageType"],
34555
- StorageCapacity: toNumber$1(properties["StorageCapacity"]),
34638
+ StorageCapacity: toNumber$3(properties["StorageCapacity"]),
34556
34639
  FileSystemTypeVersion: properties["FileSystemTypeVersion"],
34557
34640
  NetworkType: properties["NetworkType"],
34558
34641
  LustreConfiguration: this.toCreateLustreConfiguration(properties["LustreConfiguration"]),
34642
+ WindowsConfiguration: this.toCreateWindowsConfiguration(properties["WindowsConfiguration"]),
34643
+ OntapConfiguration: this.toCreateOntapConfiguration(properties["OntapConfiguration"]),
34644
+ OpenZFSConfiguration: this.toCreateOpenZFSConfiguration(properties["OpenZFSConfiguration"]),
34559
34645
  Tags: tags?.map((t) => ({
34560
34646
  Key: t.Key,
34561
34647
  Value: t.Value
@@ -34605,27 +34691,158 @@ var FSxFileSystemProvider = class {
34605
34691
  WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
34606
34692
  ImportPath: config["ImportPath"],
34607
34693
  ExportPath: config["ExportPath"],
34608
- ImportedFileChunkSize: toNumber$1(config["ImportedFileChunkSize"]),
34694
+ ImportedFileChunkSize: toNumber$3(config["ImportedFileChunkSize"]),
34609
34695
  DeploymentType: config["DeploymentType"],
34610
34696
  AutoImportPolicy: config["AutoImportPolicy"],
34611
- PerUnitStorageThroughput: toNumber$1(config["PerUnitStorageThroughput"]),
34697
+ PerUnitStorageThroughput: toNumber$3(config["PerUnitStorageThroughput"]),
34612
34698
  DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
34613
- AutomaticBackupRetentionDays: toNumber$1(config["AutomaticBackupRetentionDays"]),
34699
+ AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
34614
34700
  CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
34615
34701
  DriveCacheType: config["DriveCacheType"],
34616
34702
  DataCompressionType: config["DataCompressionType"],
34617
34703
  EfaEnabled: toBoolean$1(config["EfaEnabled"]),
34618
- ThroughputCapacity: toNumber$1(config["ThroughputCapacity"]),
34704
+ ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
34619
34705
  MetadataConfiguration: metadata ? {
34620
34706
  Mode: metadata["Mode"],
34621
- Iops: toNumber$1(metadata["Iops"])
34707
+ Iops: toNumber$3(metadata["Iops"])
34622
34708
  } : void 0,
34623
34709
  DataReadCacheConfiguration: readCache ? {
34624
34710
  SizingMode: readCache["SizingMode"],
34625
- SizeGiB: toNumber$1(readCache["SizeGiB"])
34711
+ SizeGiB: toNumber$3(readCache["SizeGiB"])
34626
34712
  } : void 0
34627
34713
  };
34628
34714
  }
34715
+ /** Map the CFn `WindowsConfiguration` block to the SDK create shape. */
34716
+ toCreateWindowsConfiguration(config) {
34717
+ if (!config) return void 0;
34718
+ return {
34719
+ ActiveDirectoryId: config["ActiveDirectoryId"],
34720
+ SelfManagedActiveDirectoryConfiguration: this.toSelfManagedAdConfiguration(config["SelfManagedActiveDirectoryConfiguration"]),
34721
+ DeploymentType: config["DeploymentType"],
34722
+ PreferredSubnetId: config["PreferredSubnetId"],
34723
+ ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
34724
+ WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
34725
+ DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
34726
+ AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
34727
+ CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
34728
+ Aliases: config["Aliases"],
34729
+ AuditLogConfiguration: this.toWindowsAuditLogConfiguration(config["AuditLogConfiguration"]),
34730
+ DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
34731
+ FsrmConfiguration: this.toWindowsFsrmConfiguration(config["FsrmConfiguration"])
34732
+ };
34733
+ }
34734
+ /** Map the CFn `OntapConfiguration` block to the SDK create shape. */
34735
+ toCreateOntapConfiguration(config) {
34736
+ if (!config) return void 0;
34737
+ return {
34738
+ AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
34739
+ DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
34740
+ DeploymentType: config["DeploymentType"],
34741
+ EndpointIpAddressRange: config["EndpointIpAddressRange"],
34742
+ FsxAdminPassword: config["FsxAdminPassword"],
34743
+ DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
34744
+ PreferredSubnetId: config["PreferredSubnetId"],
34745
+ RouteTableIds: config["RouteTableIds"],
34746
+ ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
34747
+ WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
34748
+ HAPairs: toNumber$3(config["HAPairs"]),
34749
+ ThroughputCapacityPerHAPair: toNumber$3(config["ThroughputCapacityPerHAPair"]),
34750
+ EndpointIpv6AddressRange: config["EndpointIpv6AddressRange"]
34751
+ };
34752
+ }
34753
+ /** Map the CFn `OpenZFSConfiguration` block to the SDK create shape. */
34754
+ toCreateOpenZFSConfiguration(config) {
34755
+ if (!config) return void 0;
34756
+ return {
34757
+ AutomaticBackupRetentionDays: toNumber$3(config["AutomaticBackupRetentionDays"]),
34758
+ CopyTagsToBackups: toBoolean$1(config["CopyTagsToBackups"]),
34759
+ CopyTagsToVolumes: toBoolean$1(config["CopyTagsToVolumes"]),
34760
+ DailyAutomaticBackupStartTime: config["DailyAutomaticBackupStartTime"],
34761
+ DeploymentType: config["DeploymentType"],
34762
+ ThroughputCapacity: toNumber$3(config["ThroughputCapacity"]),
34763
+ WeeklyMaintenanceStartTime: config["WeeklyMaintenanceStartTime"],
34764
+ DiskIopsConfiguration: this.toDiskIopsConfiguration(config["DiskIopsConfiguration"]),
34765
+ RootVolumeConfiguration: this.toOpenZFSRootVolumeConfiguration(config["RootVolumeConfiguration"]),
34766
+ PreferredSubnetId: config["PreferredSubnetId"],
34767
+ EndpointIpAddressRange: config["EndpointIpAddressRange"],
34768
+ EndpointIpv6AddressRange: config["EndpointIpv6AddressRange"],
34769
+ RouteTableIds: config["RouteTableIds"],
34770
+ ReadCacheConfiguration: this.toOpenZFSReadCacheConfiguration(config["ReadCacheConfiguration"])
34771
+ };
34772
+ }
34773
+ toDiskIopsConfiguration(config) {
34774
+ if (!config) return void 0;
34775
+ return {
34776
+ Mode: config["Mode"],
34777
+ Iops: toNumber$3(config["Iops"])
34778
+ };
34779
+ }
34780
+ toSelfManagedAdConfiguration(config) {
34781
+ if (!config) return void 0;
34782
+ return {
34783
+ DomainName: config["DomainName"],
34784
+ OrganizationalUnitDistinguishedName: config["OrganizationalUnitDistinguishedName"],
34785
+ FileSystemAdministratorsGroup: config["FileSystemAdministratorsGroup"],
34786
+ UserName: config["UserName"],
34787
+ Password: config["Password"],
34788
+ DnsIps: config["DnsIps"],
34789
+ DomainJoinServiceAccountSecret: config["DomainJoinServiceAccountSecret"]
34790
+ };
34791
+ }
34792
+ toSelfManagedAdConfigurationUpdates(config) {
34793
+ if (!config) return void 0;
34794
+ return {
34795
+ UserName: config["UserName"],
34796
+ Password: config["Password"],
34797
+ DnsIps: config["DnsIps"],
34798
+ DomainName: config["DomainName"],
34799
+ OrganizationalUnitDistinguishedName: config["OrganizationalUnitDistinguishedName"],
34800
+ FileSystemAdministratorsGroup: config["FileSystemAdministratorsGroup"],
34801
+ DomainJoinServiceAccountSecret: config["DomainJoinServiceAccountSecret"]
34802
+ };
34803
+ }
34804
+ toWindowsAuditLogConfiguration(config) {
34805
+ if (!config) return void 0;
34806
+ return {
34807
+ FileAccessAuditLogLevel: config["FileAccessAuditLogLevel"],
34808
+ FileShareAccessAuditLogLevel: config["FileShareAccessAuditLogLevel"],
34809
+ AuditLogDestination: config["AuditLogDestination"]
34810
+ };
34811
+ }
34812
+ toWindowsFsrmConfiguration(config) {
34813
+ if (!config) return void 0;
34814
+ return {
34815
+ FsrmServiceEnabled: toBoolean$1(config["FsrmServiceEnabled"]),
34816
+ EventLogDestination: config["EventLogDestination"]
34817
+ };
34818
+ }
34819
+ toOpenZFSRootVolumeConfiguration(config) {
34820
+ if (!config) return void 0;
34821
+ const nfsExports = config["NfsExports"];
34822
+ const quotas = config["UserAndGroupQuotas"];
34823
+ return {
34824
+ RecordSizeKiB: toNumber$3(config["RecordSizeKiB"]),
34825
+ DataCompressionType: config["DataCompressionType"],
34826
+ NfsExports: nfsExports?.map((exp) => ({ ClientConfigurations: (exp["ClientConfigurations"] ?? []).map((cc) => ({
34827
+ Clients: cc["Clients"],
34828
+ Options: cc["Options"]
34829
+ })) })),
34830
+ UserAndGroupQuotas: quotas?.map((q) => ({
34831
+ Type: q["Type"],
34832
+ Id: toNumber$3(q["Id"]),
34833
+ StorageCapacityQuotaGiB: toNumber$3(q["StorageCapacityQuotaGiB"])
34834
+ })),
34835
+ CopyTagsToSnapshots: toBoolean$1(config["CopyTagsToSnapshots"]),
34836
+ ReadOnly: toBoolean$1(config["ReadOnly"])
34837
+ };
34838
+ }
34839
+ toOpenZFSReadCacheConfiguration(config) {
34840
+ if (!config) return void 0;
34841
+ return {
34842
+ SizingMode: config["SizingMode"],
34843
+ SizeGiB: toNumber$3(config["SizeGiB"])
34844
+ };
34845
+ }
34629
34846
  async update(logicalId, physicalId, resourceType, properties, previousProperties) {
34630
34847
  const changed = (key) => JSON.stringify(properties[key]) !== JSON.stringify(previousProperties[key]);
34631
34848
  for (const key of TOP_LEVEL_IMMUTABLE_PROPS) {
@@ -34633,55 +34850,17 @@ var FSxFileSystemProvider = class {
34633
34850
  const prev = previousProperties[key];
34634
34851
  if (JSON.stringify(next ?? null) !== JSON.stringify(prev ?? null)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem ${key} is immutable on AWS — UpdateFileSystem does not accept ${key}; the property is fixed at creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
34635
34852
  }
34636
- const nextLustre = properties["LustreConfiguration"] ?? {};
34637
- const prevLustre = previousProperties["LustreConfiguration"] ?? {};
34638
- const lustreKeys = new Set([...Object.keys(nextLustre), ...Object.keys(prevLustre)]);
34639
- const lustreMutableDiff = {};
34640
- let lustreHasMutableDiff = false;
34641
- for (const key of lustreKeys) {
34642
- const next = nextLustre[key];
34643
- const prev = prevLustre[key];
34644
- if (JSON.stringify(next) === JSON.stringify(prev)) continue;
34645
- if (!LUSTRE_MUTABLE_SUBPROPS.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem LustreConfiguration.${key} is immutable on AWS — UpdateFileSystem cannot change it after creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
34646
- lustreHasMutableDiff = true;
34647
- switch (key) {
34648
- case "WeeklyMaintenanceStartTime":
34649
- case "DailyAutomaticBackupStartTime":
34650
- lustreMutableDiff[key] = next;
34651
- break;
34652
- case "AutomaticBackupRetentionDays":
34653
- case "PerUnitStorageThroughput":
34654
- case "ThroughputCapacity":
34655
- lustreMutableDiff[key] = toNumber$1(next);
34656
- break;
34657
- case "AutoImportPolicy":
34658
- case "DataCompressionType":
34659
- lustreMutableDiff[key] = next;
34660
- break;
34661
- case "MetadataConfiguration": {
34662
- const metadata = next;
34663
- lustreMutableDiff.MetadataConfiguration = metadata ? {
34664
- Mode: metadata["Mode"],
34665
- Iops: toNumber$1(metadata["Iops"])
34666
- } : void 0;
34667
- break;
34668
- }
34669
- case "DataReadCacheConfiguration": {
34670
- const readCache = next;
34671
- lustreMutableDiff.DataReadCacheConfiguration = readCache ? {
34672
- SizingMode: readCache["SizingMode"],
34673
- SizeGiB: toNumber$1(readCache["SizeGiB"])
34674
- } : void 0;
34675
- break;
34676
- }
34677
- }
34678
- }
34853
+ const variantConfigKey = this.detectVariantConfigKey(properties, previousProperties);
34854
+ const { diff: variantDiff, hasMutableDiff: variantHasMutableDiff } = variantConfigKey ? this.computeVariantConfigDiff(resourceType, logicalId, variantConfigKey, properties[variantConfigKey] ?? {}, previousProperties[variantConfigKey] ?? {}) : {
34855
+ diff: {},
34856
+ hasMutableDiff: false
34857
+ };
34679
34858
  const storageCapacityChanged = changed("StorageCapacity");
34680
34859
  const storageTypeChanged = changed("StorageType");
34681
34860
  const typeVersionChanged = changed("FileSystemTypeVersion");
34682
34861
  const networkTypeChanged = changed("NetworkType");
34683
34862
  const tagsChanged = changed("Tags");
34684
- if (!lustreHasMutableDiff && !storageCapacityChanged && !storageTypeChanged && !typeVersionChanged && !networkTypeChanged && !tagsChanged) {
34863
+ if (!variantHasMutableDiff && !storageCapacityChanged && !storageTypeChanged && !typeVersionChanged && !networkTypeChanged && !tagsChanged) {
34685
34864
  this.logger.debug(`No mutable diff for FSx FileSystem ${logicalId}, skipping update`);
34686
34865
  return {
34687
34866
  physicalId,
@@ -34690,17 +34869,17 @@ var FSxFileSystemProvider = class {
34690
34869
  }
34691
34870
  this.logger.debug(`Updating FSx FileSystem ${logicalId}: ${physicalId}`);
34692
34871
  try {
34693
- const needsUpdateCall = lustreHasMutableDiff || storageCapacityChanged || storageTypeChanged || typeVersionChanged || networkTypeChanged;
34872
+ const needsUpdateCall = variantHasMutableDiff || storageCapacityChanged || storageTypeChanged || typeVersionChanged || networkTypeChanged;
34694
34873
  let updatedFs;
34695
34874
  if (needsUpdateCall) {
34696
34875
  const callTimeMs = Date.now();
34697
34876
  const respPendingActions = ((await this.getClient().send(new UpdateFileSystemCommand$1({
34698
34877
  FileSystemId: physicalId,
34699
- ...storageCapacityChanged && { StorageCapacity: toNumber$1(properties["StorageCapacity"]) },
34878
+ ...storageCapacityChanged && { StorageCapacity: toNumber$3(properties["StorageCapacity"]) },
34700
34879
  ...storageTypeChanged && { StorageType: properties["StorageType"] },
34701
34880
  ...typeVersionChanged && { FileSystemTypeVersion: properties["FileSystemTypeVersion"] },
34702
34881
  ...networkTypeChanged && { NetworkType: properties["NetworkType"] },
34703
- ...lustreHasMutableDiff && { LustreConfiguration: lustreMutableDiff }
34882
+ ...variantHasMutableDiff && variantConfigKey ? { [variantConfigKey]: variantDiff } : {}
34704
34883
  }))).FileSystem?.AdministrativeActions ?? []).filter((a) => a.AdministrativeActionType === "FILE_SYSTEM_UPDATE" && (a.Status === "PENDING" || a.Status === "IN_PROGRESS"));
34705
34884
  const requestTimes = respPendingActions.map((a) => a.RequestTime?.getTime()).filter((t) => t !== void 0);
34706
34885
  const actionThresholdMs = requestTimes.length > 0 ? Math.min(...requestTimes) : callTimeMs - 6e4;
@@ -34725,6 +34904,156 @@ var FSxFileSystemProvider = class {
34725
34904
  }
34726
34905
  }
34727
34906
  /**
34907
+ * Which `<Variant>Configuration` block (if any) is present on either side
34908
+ * of the update. At most one is expected — the file system's type never
34909
+ * changes (FileSystemType is registry-createOnly, guarded above).
34910
+ */
34911
+ detectVariantConfigKey(properties, previousProperties) {
34912
+ for (const key of Object.values(VARIANT_CONFIG_KEY)) if (properties[key] !== void 0 || previousProperties[key] !== void 0) return key;
34913
+ }
34914
+ /**
34915
+ * Diff a variant config block's sub-properties into the SDK
34916
+ * `UpdateFileSystem<Variant>Configuration` shape. A changed sub-field that
34917
+ * is NOT in the variant's mutable set is rejected with a `--replace`
34918
+ * pointer (UpdateFileSystem cannot express it).
34919
+ */
34920
+ computeVariantConfigDiff(resourceType, logicalId, configKey, next, prev) {
34921
+ const mutable = VARIANT_MUTABLE_SUBPROPS[configKey] ?? /* @__PURE__ */ new Set();
34922
+ const keys = /* @__PURE__ */ new Set([...Object.keys(next), ...Object.keys(prev)]);
34923
+ const diff = {};
34924
+ let hasMutableDiff = false;
34925
+ for (const key of keys) {
34926
+ const nextVal = next[key];
34927
+ const prevVal = prev[key];
34928
+ if (JSON.stringify(nextVal) === JSON.stringify(prevVal)) continue;
34929
+ if (!mutable.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS FSx FileSystem ${configKey}.${key} is immutable on AWS — UpdateFileSystem cannot change it after creation. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
34930
+ if (configKey === "LustreConfiguration" ? this.applyLustreUpdateField(key, nextVal, diff) : configKey === "WindowsConfiguration" ? this.applyWindowsUpdateField(key, nextVal, diff) : configKey === "OntapConfiguration" ? this.applyOntapUpdateField(key, nextVal, prevVal, diff) : this.applyOpenZFSUpdateField(key, nextVal, prevVal, diff)) hasMutableDiff = true;
34931
+ }
34932
+ return {
34933
+ diff,
34934
+ hasMutableDiff
34935
+ };
34936
+ }
34937
+ applyLustreUpdateField(key, next, diff) {
34938
+ const out = diff;
34939
+ switch (key) {
34940
+ case "WeeklyMaintenanceStartTime":
34941
+ case "DailyAutomaticBackupStartTime":
34942
+ diff[key] = next;
34943
+ break;
34944
+ case "AutomaticBackupRetentionDays":
34945
+ case "PerUnitStorageThroughput":
34946
+ case "ThroughputCapacity":
34947
+ diff[key] = toNumber$3(next);
34948
+ break;
34949
+ case "AutoImportPolicy":
34950
+ case "DataCompressionType":
34951
+ diff[key] = next;
34952
+ break;
34953
+ case "MetadataConfiguration": {
34954
+ const metadata = next;
34955
+ out.MetadataConfiguration = metadata ? {
34956
+ Mode: metadata["Mode"],
34957
+ Iops: toNumber$3(metadata["Iops"])
34958
+ } : void 0;
34959
+ break;
34960
+ }
34961
+ case "DataReadCacheConfiguration": {
34962
+ const readCache = next;
34963
+ out.DataReadCacheConfiguration = readCache ? {
34964
+ SizingMode: readCache["SizingMode"],
34965
+ SizeGiB: toNumber$3(readCache["SizeGiB"])
34966
+ } : void 0;
34967
+ break;
34968
+ }
34969
+ }
34970
+ return true;
34971
+ }
34972
+ applyWindowsUpdateField(key, next, diff) {
34973
+ const out = diff;
34974
+ switch (key) {
34975
+ case "WeeklyMaintenanceStartTime":
34976
+ case "DailyAutomaticBackupStartTime":
34977
+ diff[key] = next;
34978
+ break;
34979
+ case "AutomaticBackupRetentionDays":
34980
+ case "ThroughputCapacity":
34981
+ diff[key] = toNumber$3(next);
34982
+ break;
34983
+ case "SelfManagedActiveDirectoryConfiguration":
34984
+ out.SelfManagedActiveDirectoryConfiguration = this.toSelfManagedAdConfigurationUpdates(next);
34985
+ break;
34986
+ case "AuditLogConfiguration":
34987
+ out.AuditLogConfiguration = this.toWindowsAuditLogConfiguration(next);
34988
+ break;
34989
+ case "DiskIopsConfiguration":
34990
+ out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
34991
+ break;
34992
+ case "FsrmConfiguration":
34993
+ out.FsrmConfiguration = this.toWindowsFsrmConfiguration(next);
34994
+ break;
34995
+ }
34996
+ return true;
34997
+ }
34998
+ applyOntapUpdateField(key, next, prev, diff) {
34999
+ const out = diff;
35000
+ switch (key) {
35001
+ case "DailyAutomaticBackupStartTime":
35002
+ case "WeeklyMaintenanceStartTime":
35003
+ case "FsxAdminPassword":
35004
+ case "EndpointIpv6AddressRange":
35005
+ diff[key] = next;
35006
+ break;
35007
+ case "AutomaticBackupRetentionDays":
35008
+ case "ThroughputCapacity":
35009
+ case "ThroughputCapacityPerHAPair":
35010
+ case "HAPairs":
35011
+ diff[key] = toNumber$3(next);
35012
+ break;
35013
+ case "DiskIopsConfiguration":
35014
+ out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
35015
+ break;
35016
+ case "RouteTableIds": {
35017
+ const { add, remove } = routeTableDelta(next, prev);
35018
+ if (add) out.AddRouteTableIds = add;
35019
+ if (remove) out.RemoveRouteTableIds = remove;
35020
+ return add !== void 0 || remove !== void 0;
35021
+ }
35022
+ }
35023
+ return true;
35024
+ }
35025
+ applyOpenZFSUpdateField(key, next, prev, diff) {
35026
+ const out = diff;
35027
+ switch (key) {
35028
+ case "DailyAutomaticBackupStartTime":
35029
+ case "WeeklyMaintenanceStartTime":
35030
+ case "EndpointIpv6AddressRange":
35031
+ diff[key] = next;
35032
+ break;
35033
+ case "CopyTagsToBackups":
35034
+ case "CopyTagsToVolumes":
35035
+ diff[key] = toBoolean$1(next);
35036
+ break;
35037
+ case "AutomaticBackupRetentionDays":
35038
+ case "ThroughputCapacity":
35039
+ diff[key] = toNumber$3(next);
35040
+ break;
35041
+ case "DiskIopsConfiguration":
35042
+ out.DiskIopsConfiguration = this.toDiskIopsConfiguration(next);
35043
+ break;
35044
+ case "ReadCacheConfiguration":
35045
+ out.ReadCacheConfiguration = this.toOpenZFSReadCacheConfiguration(next);
35046
+ break;
35047
+ case "RouteTableIds": {
35048
+ const { add, remove } = routeTableDelta(next, prev);
35049
+ if (add) out.AddRouteTableIds = add;
35050
+ if (remove) out.RemoveRouteTableIds = remove;
35051
+ return add !== void 0 || remove !== void 0;
35052
+ }
35053
+ }
35054
+ return true;
35055
+ }
35056
+ /**
34728
35057
  * Apply a `Tags` diff via `TagResource` / `UntagResource` (the FSx
34729
35058
  * `UpdateFileSystem` API does not accept tags). Needs the ARN — resolve
34730
35059
  * it from `DescribeFileSystems`.
@@ -34878,6 +35207,7 @@ var FSxFileSystemProvider = class {
34878
35207
  if (fs.ResourceARN !== void 0) attributes["ResourceARN"] = fs.ResourceARN;
34879
35208
  if (fs.DNSName !== void 0) attributes["DNSName"] = fs.DNSName;
34880
35209
  if (fs.LustreConfiguration?.MountName !== void 0) attributes["LustreMountName"] = fs.LustreConfiguration.MountName;
35210
+ if (fs.OpenZFSConfiguration?.RootVolumeId !== void 0) attributes["RootVolumeId"] = fs.OpenZFSConfiguration.RootVolumeId;
34881
35211
  if (fs.FileSystemId !== void 0) attributes["FileSystemId"] = fs.FileSystemId;
34882
35212
  return attributes;
34883
35213
  }
@@ -34899,10 +35229,23 @@ var FSxFileSystemProvider = class {
34899
35229
  * interface ids, never the original security group list.
34900
35230
  * - `BackupId` — creation-source input, not surfaced on the deployed
34901
35231
  * file system.
35232
+ * - `WindowsConfiguration` / `OntapConfiguration` / `OpenZFSConfiguration`
35233
+ * — `readCurrentState` maps only the Lustre block back to CFn shape
35234
+ * today, so drift on the non-Lustre variant blocks is not yet computed;
35235
+ * marking them unknown avoids a guaranteed false positive on every run
35236
+ * (variant-config drift is a follow-up). Only the block matching the
35237
+ * file system's type is ever present in state, so listing all three is
35238
+ * harmless.
34902
35239
  */
34903
35240
  getDriftUnknownPaths(resourceType) {
34904
35241
  if (resourceType !== "AWS::FSx::FileSystem") return [];
34905
- return ["SecurityGroupIds", "BackupId"];
35242
+ return [
35243
+ "SecurityGroupIds",
35244
+ "BackupId",
35245
+ "WindowsConfiguration",
35246
+ "OntapConfiguration",
35247
+ "OpenZFSConfiguration"
35248
+ ];
34906
35249
  }
34907
35250
  /**
34908
35251
  * Read the AWS-current file system configuration in CFn-property shape
@@ -35010,16 +35353,16 @@ var FSxFileSystemProvider = class {
35010
35353
  * FSx providers' 1-hour ceiling so the slowest realistic create/terminate
35011
35354
  * still fits inside the per-resource deadline.
35012
35355
  */
35013
- const DEFAULT_MAX_WAIT_MS = 3600 * 1e3;
35014
- const DEFAULT_POLL_INTERVAL_MS = 15e3;
35356
+ const DEFAULT_MAX_WAIT_MS$2 = 3600 * 1e3;
35357
+ const DEFAULT_POLL_INTERVAL_MS$2 = 15e3;
35015
35358
  /** Cluster states that mean "create succeeded, the cluster is up". */
35016
- const CREATE_READY_STATES = new Set(["WAITING", "RUNNING"]);
35359
+ const CREATE_READY_STATES = /* @__PURE__ */ new Set(["WAITING", "RUNNING"]);
35017
35360
  /**
35018
35361
  * Cluster states that mean "the cluster is gone" (for delete polling and
35019
35362
  * delete idempotency). `TERMINATED_WITH_ERRORS` still counts as gone — the
35020
35363
  * cluster no longer bills — but is logged so a failed terminate is visible.
35021
35364
  */
35022
- const TERMINAL_STATES = new Set(["TERMINATED", "TERMINATED_WITH_ERRORS"]);
35365
+ const TERMINAL_STATES = /* @__PURE__ */ new Set(["TERMINATED", "TERMINATED_WITH_ERRORS"]);
35023
35366
  /**
35024
35367
  * Cluster states that mean "the cluster is alive" — the `ListClusters` filter
35025
35368
  * used by `import()` discovery so a long-gone `TERMINATED*` cluster is never
@@ -35038,14 +35381,14 @@ const NON_TERMINATED_STATES = [
35038
35381
  * replacement-detection layer) or lives inside the `Instances` block (handled
35039
35382
  * specially in `update()` — only `TerminationProtected` is mutable there).
35040
35383
  */
35041
- const MUTABLE_TOP_LEVEL_PROPS = new Set([
35384
+ const MUTABLE_TOP_LEVEL_PROPS = /* @__PURE__ */ new Set([
35042
35385
  "Tags",
35043
35386
  "VisibleToAllUsers",
35044
35387
  "StepConcurrencyLevel",
35045
35388
  "ManagedScalingPolicy",
35046
35389
  "AutoTerminationPolicy"
35047
35390
  ]);
35048
- const toNumber = (v) => {
35391
+ const toNumber$2 = (v) => {
35049
35392
  if (v === void 0) return void 0;
35050
35393
  const n = Number(v);
35051
35394
  return Number.isNaN(n) ? void 0 : n;
@@ -35055,7 +35398,7 @@ const toBoolean = (v) => {
35055
35398
  if (typeof v === "string") return v === "true";
35056
35399
  return Boolean(v);
35057
35400
  };
35058
- const jsonEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
35401
+ const jsonEqual$2 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
35059
35402
  /**
35060
35403
  * SDK Provider for `AWS::EMR::Cluster` (EMR on EC2).
35061
35404
  *
@@ -35101,10 +35444,10 @@ var EMRClusterProvider = class {
35101
35444
  pollIntervalMs;
35102
35445
  maxWaitMs;
35103
35446
  constructor(options) {
35104
- this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
35105
- this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
35447
+ this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$2;
35448
+ this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$2;
35106
35449
  }
35107
- handledProperties = new Map([["AWS::EMR::Cluster", new Set([
35450
+ handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::Cluster", /* @__PURE__ */ new Set([
35108
35451
  "AdditionalInfo",
35109
35452
  "Applications",
35110
35453
  "AutoScalingRole",
@@ -35174,10 +35517,10 @@ var EMRClusterProvider = class {
35174
35517
  CustomAmiId: properties["CustomAmiId"],
35175
35518
  OSReleaseLabel: properties["OSReleaseLabel"],
35176
35519
  SecurityConfiguration: properties["SecurityConfiguration"],
35177
- EbsRootVolumeSize: toNumber(properties["EbsRootVolumeSize"]),
35178
- EbsRootVolumeIops: toNumber(properties["EbsRootVolumeIops"]),
35179
- EbsRootVolumeThroughput: toNumber(properties["EbsRootVolumeThroughput"]),
35180
- StepConcurrencyLevel: toNumber(properties["StepConcurrencyLevel"]),
35520
+ EbsRootVolumeSize: toNumber$2(properties["EbsRootVolumeSize"]),
35521
+ EbsRootVolumeIops: toNumber$2(properties["EbsRootVolumeIops"]),
35522
+ EbsRootVolumeThroughput: toNumber$2(properties["EbsRootVolumeThroughput"]),
35523
+ StepConcurrencyLevel: toNumber$2(properties["StepConcurrencyLevel"]),
35181
35524
  VisibleToAllUsers: toBoolean(properties["VisibleToAllUsers"]),
35182
35525
  Applications: properties["Applications"],
35183
35526
  Configurations: properties["Configurations"],
@@ -35266,7 +35609,7 @@ var EMRClusterProvider = class {
35266
35609
  return {
35267
35610
  InstanceRole: role,
35268
35611
  InstanceType: raw["InstanceType"],
35269
- InstanceCount: toNumber(raw["InstanceCount"]),
35612
+ InstanceCount: toNumber$2(raw["InstanceCount"]),
35270
35613
  Name: raw["Name"],
35271
35614
  Market: raw["Market"],
35272
35615
  BidPrice: raw["BidPrice"],
@@ -35280,8 +35623,8 @@ var EMRClusterProvider = class {
35280
35623
  return {
35281
35624
  InstanceFleetType: type,
35282
35625
  Name: raw["Name"],
35283
- TargetOnDemandCapacity: toNumber(raw["TargetOnDemandCapacity"]),
35284
- TargetSpotCapacity: toNumber(raw["TargetSpotCapacity"]),
35626
+ TargetOnDemandCapacity: toNumber$2(raw["TargetOnDemandCapacity"]),
35627
+ TargetSpotCapacity: toNumber$2(raw["TargetSpotCapacity"]),
35285
35628
  InstanceTypeConfigs: raw["InstanceTypeConfigs"],
35286
35629
  LaunchSpecifications: raw["LaunchSpecifications"],
35287
35630
  ResizeSpecifications: raw["ResizeSpecifications"]
@@ -35294,28 +35637,28 @@ var EMRClusterProvider = class {
35294
35637
  return {
35295
35638
  ComputeLimits: {
35296
35639
  UnitType: limits["UnitType"],
35297
- MinimumCapacityUnits: toNumber(limits["MinimumCapacityUnits"]),
35298
- MaximumCapacityUnits: toNumber(limits["MaximumCapacityUnits"]),
35299
- MaximumOnDemandCapacityUnits: toNumber(limits["MaximumOnDemandCapacityUnits"]),
35300
- MaximumCoreCapacityUnits: toNumber(limits["MaximumCoreCapacityUnits"])
35640
+ MinimumCapacityUnits: toNumber$2(limits["MinimumCapacityUnits"]),
35641
+ MaximumCapacityUnits: toNumber$2(limits["MaximumCapacityUnits"]),
35642
+ MaximumOnDemandCapacityUnits: toNumber$2(limits["MaximumOnDemandCapacityUnits"]),
35643
+ MaximumCoreCapacityUnits: toNumber$2(limits["MaximumCoreCapacityUnits"])
35301
35644
  },
35302
- UtilizationPerformanceIndex: toNumber(config["UtilizationPerformanceIndex"]),
35645
+ UtilizationPerformanceIndex: toNumber$2(config["UtilizationPerformanceIndex"]),
35303
35646
  ScalingStrategy: config["ScalingStrategy"]
35304
35647
  };
35305
35648
  }
35306
35649
  toAutoTerminationPolicy(config) {
35307
35650
  if (!config) return void 0;
35308
- return { IdleTimeout: toNumber(config["IdleTimeout"]) };
35651
+ return { IdleTimeout: toNumber$2(config["IdleTimeout"]) };
35309
35652
  }
35310
35653
  async update(logicalId, physicalId, resourceType, properties, previousProperties) {
35311
- const changed = (key) => !jsonEqual(properties[key], previousProperties[key]);
35654
+ const changed = (key) => !jsonEqual$2(properties[key], previousProperties[key]);
35312
35655
  const nextInstances = properties["Instances"] ?? {};
35313
35656
  const prevInstances = previousProperties["Instances"] ?? {};
35314
35657
  let terminationProtectedChanged = false;
35315
35658
  if (changed("Instances")) {
35316
- const instanceKeys = new Set([...Object.keys(nextInstances), ...Object.keys(prevInstances)]);
35659
+ const instanceKeys = /* @__PURE__ */ new Set([...Object.keys(nextInstances), ...Object.keys(prevInstances)]);
35317
35660
  for (const key of instanceKeys) {
35318
- if (jsonEqual(nextInstances[key], prevInstances[key])) continue;
35661
+ if (jsonEqual$2(nextInstances[key], prevInstances[key])) continue;
35319
35662
  if (key === "TerminationProtected") {
35320
35663
  terminationProtectedChanged = true;
35321
35664
  continue;
@@ -35355,7 +35698,7 @@ var EMRClusterProvider = class {
35355
35698
  }));
35356
35699
  if (stepConcurrencyChanged) await this.getClient().send(new ModifyClusterCommand({
35357
35700
  ClusterId: physicalId,
35358
- StepConcurrencyLevel: toNumber(properties["StepConcurrencyLevel"])
35701
+ StepConcurrencyLevel: toNumber$2(properties["StepConcurrencyLevel"])
35359
35702
  }));
35360
35703
  if (managedScalingChanged) {
35361
35704
  const next = this.toManagedScalingPolicy(properties["ManagedScalingPolicy"]);
@@ -35807,6 +36150,570 @@ var EMRClusterProvider = class {
35807
36150
  }
35808
36151
  };
35809
36152
 
36153
+ //#endregion
36154
+ //#region src/provisioning/providers/emr-instance-group-config-provider.ts
36155
+ /**
36156
+ * Default polling budget for an instance group reaching RUNNING. Adding a
36157
+ * group to an already-WAITING cluster provisions + bootstraps its EC2
36158
+ * instances (typically 2-6 minutes); a resize settles faster. Reuse the
36159
+ * EMR Cluster provider's 1-hour ceiling so the slowest realistic add still
36160
+ * fits inside the per-resource deadline.
36161
+ */
36162
+ const DEFAULT_MAX_WAIT_MS$1 = 3600 * 1e3;
36163
+ const DEFAULT_POLL_INTERVAL_MS$1 = 15e3;
36164
+ /** Instance-group state that means "the group is up and idle/serving". */
36165
+ const READY_STATES$1 = /* @__PURE__ */ new Set(["RUNNING"]);
36166
+ /**
36167
+ * Instance-group states that mean "the group is gone / failed" — a hard
36168
+ * error during a create/resize wait (an ARRESTED group failed to provision;
36169
+ * TERMINATED/ENDED mean it will never reach RUNNING).
36170
+ */
36171
+ const FAILED_STATES$1 = /* @__PURE__ */ new Set([
36172
+ "ARRESTED",
36173
+ "TERMINATED",
36174
+ "ENDED"
36175
+ ]);
36176
+ const toNumber$1 = (v) => {
36177
+ if (v === void 0) return void 0;
36178
+ const n = Number(v);
36179
+ return Number.isNaN(n) ? void 0 : n;
36180
+ };
36181
+ const jsonEqual$1 = (a, b) => JSON.stringify(a) === JSON.stringify(b);
36182
+ /**
36183
+ * SDK Provider for `AWS::EMR::InstanceGroupConfig` (issue #1070).
36184
+ *
36185
+ * This type adds a standalone instance group (MASTER / CORE / TASK) to an
36186
+ * EXISTING EMR cluster (referenced by `JobFlowId`), rather than declaring the
36187
+ * group inline in `AWS::EMR::Cluster.Instances`. It is
36188
+ * `ProvisioningType: NON_PROVISIONABLE` in the CFn registry, so Cloud Control
36189
+ * cannot handle it — pre-flight would otherwise reject it via
36190
+ * `unsupported-types.generated.ts`.
36191
+ *
36192
+ * Lifecycle:
36193
+ * - `create` → `AddInstanceGroups` (one group per call) + poll
36194
+ * `ListInstanceGroups` until the new group is `RUNNING`. A failed terminal
36195
+ * (`ARRESTED` / `TERMINATED` / `ENDED`) during the wait is a hard error.
36196
+ * - `update` → only the two AWS-mutable properties: `InstanceCount`
36197
+ * (`ModifyInstanceGroups`, resize; polled until settled) and
36198
+ * `AutoScalingPolicy` (`PutAutoScalingPolicy` / `RemoveAutoScalingPolicy`).
36199
+ * Every other property is registry-createOnly → routed through
36200
+ * DELETE+CREATE by the replacement-detection layer; a createOnly change
36201
+ * that reaches `update()` anyway is refused with a `--replace` pointer.
36202
+ * - `delete` → **no standalone AWS API exists.** EMR cannot remove an
36203
+ * instance group from a running cluster; a group's only lifecycle end is
36204
+ * cluster termination. In the normal `cdkd destroy` the parent
36205
+ * `AWS::EMR::Cluster` is terminated in the same run (its `TerminateJobFlows`
36206
+ * releases every group + its EC2 instances), so this delete is a no-op that
36207
+ * just drops cdkd state — leaving ZERO orphans. As a best effort for the
36208
+ * less common "delete only the group, keep the cluster" case, a TASK group
36209
+ * is scaled to 0 instances (`ModifyInstanceGroups InstanceCount: 0`) to
36210
+ * release its instances; MASTER/CORE groups cannot be scaled to 0 and are a
36211
+ * pure no-op. Never blocks the destroy (warn-and-continue).
36212
+ *
36213
+ * `getMinResourceTimeoutMs()` lifts the deploy engine's per-resource deadline
36214
+ * to the polling ceiling (mirrors `EMRClusterProvider`) so a slow add/resize
36215
+ * does not require `--resource-timeout`.
36216
+ */
36217
+ var EMRInstanceGroupConfigProvider = class {
36218
+ /**
36219
+ * Cloud Control has NO handlers for this type
36220
+ * (`ProvisioningType: NON_PROVISIONABLE`), so the deploy engine's #614
36221
+ * silent-drop auto-route MUST NOT send an unhandled-property template to CC
36222
+ * — it would fail at provisioning time with an opaque
36223
+ * UnsupportedActionException. With this opt-out the ProviderRegistry rejects
36224
+ * such templates pre-flight with a clear error instead.
36225
+ */
36226
+ disableCcApiFallback = true;
36227
+ client;
36228
+ providerRegion = process.env["AWS_REGION"];
36229
+ logger = getLogger().child("EMRInstanceGroupConfigProvider");
36230
+ pollIntervalMs;
36231
+ maxWaitMs;
36232
+ constructor(options) {
36233
+ this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS$1;
36234
+ this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS$1;
36235
+ }
36236
+ handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::InstanceGroupConfig", /* @__PURE__ */ new Set([
36237
+ "AutoScalingPolicy",
36238
+ "BidPrice",
36239
+ "Configurations",
36240
+ "CustomAmiId",
36241
+ "EbsConfiguration",
36242
+ "InstanceCount",
36243
+ "InstanceRole",
36244
+ "InstanceType",
36245
+ "JobFlowId",
36246
+ "Market",
36247
+ "Name"
36248
+ ])]]);
36249
+ getClient() {
36250
+ if (!this.client) this.client = new EMRClient(this.providerRegion ? { region: this.providerRegion } : {});
36251
+ return this.client;
36252
+ }
36253
+ getMinResourceTimeoutMs() {
36254
+ return this.maxWaitMs + this.pollIntervalMs;
36255
+ }
36256
+ async create(logicalId, resourceType, properties) {
36257
+ if (resourceType !== "AWS::EMR::InstanceGroupConfig") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
36258
+ const jobFlowId = properties["JobFlowId"];
36259
+ if (!jobFlowId) throw new ProvisioningError(`EMR InstanceGroupConfig ${logicalId} is missing JobFlowId (the parent cluster id)`, resourceType, logicalId);
36260
+ this.logger.debug(`Adding EMR instance group ${logicalId} to cluster ${jobFlowId}`);
36261
+ try {
36262
+ const group = this.toInstanceGroupConfig(properties);
36263
+ const groupId = (await this.getClient().send(new AddInstanceGroupsCommand({
36264
+ JobFlowId: jobFlowId,
36265
+ InstanceGroups: [group]
36266
+ }))).InstanceGroupIds?.[0];
36267
+ if (!groupId) throw new ProvisioningError(`EMR AddInstanceGroups for ${logicalId} returned no instance group id`, resourceType, logicalId);
36268
+ await this.waitForGroupReady(jobFlowId, groupId, logicalId, resourceType, toNumber$1(properties["InstanceCount"]) ?? 0);
36269
+ this.logger.debug(`Successfully added EMR instance group ${logicalId}: ${groupId}`);
36270
+ return {
36271
+ physicalId: groupId,
36272
+ attributes: { Id: groupId }
36273
+ };
36274
+ } catch (error) {
36275
+ if (error instanceof ProvisioningError) throw error;
36276
+ const cause = error instanceof Error ? error : void 0;
36277
+ throw new ProvisioningError(`Failed to add EMR instance group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
36278
+ }
36279
+ }
36280
+ toInstanceGroupConfig(properties) {
36281
+ return {
36282
+ InstanceRole: properties["InstanceRole"],
36283
+ InstanceType: properties["InstanceType"],
36284
+ InstanceCount: toNumber$1(properties["InstanceCount"]),
36285
+ Name: properties["Name"],
36286
+ Market: properties["Market"],
36287
+ BidPrice: properties["BidPrice"],
36288
+ Configurations: properties["Configurations"],
36289
+ EbsConfiguration: properties["EbsConfiguration"],
36290
+ AutoScalingPolicy: properties["AutoScalingPolicy"],
36291
+ CustomAmiId: properties["CustomAmiId"]
36292
+ };
36293
+ }
36294
+ async update(logicalId, physicalId, resourceType, properties, previousProperties) {
36295
+ const changed = (key) => !jsonEqual$1(properties[key], previousProperties[key]);
36296
+ const MUTABLE = /* @__PURE__ */ new Set(["InstanceCount", "AutoScalingPolicy"]);
36297
+ for (const key of Object.keys({
36298
+ ...properties,
36299
+ ...previousProperties
36300
+ })) {
36301
+ if (!changed(key)) continue;
36302
+ if (!MUTABLE.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS EMR InstanceGroupConfig ${key} is immutable on AWS — it is fixed when the instance group is created. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
36303
+ }
36304
+ const instanceCountChanged = changed("InstanceCount");
36305
+ const autoScalingChanged = changed("AutoScalingPolicy");
36306
+ if (!instanceCountChanged && !autoScalingChanged) {
36307
+ this.logger.debug(`No mutable diff for EMR instance group ${logicalId}, skipping update`);
36308
+ return {
36309
+ physicalId,
36310
+ wasReplaced: false
36311
+ };
36312
+ }
36313
+ const jobFlowId = properties["JobFlowId"];
36314
+ this.logger.debug(`Updating EMR instance group ${logicalId}: ${physicalId}`);
36315
+ try {
36316
+ if (instanceCountChanged) {
36317
+ await this.getClient().send(new ModifyInstanceGroupsCommand({
36318
+ ...jobFlowId && { ClusterId: jobFlowId },
36319
+ InstanceGroups: [{
36320
+ InstanceGroupId: physicalId,
36321
+ InstanceCount: toNumber$1(properties["InstanceCount"])
36322
+ }]
36323
+ }));
36324
+ if (jobFlowId) await this.waitForGroupReady(jobFlowId, physicalId, logicalId, resourceType, toNumber$1(properties["InstanceCount"]) ?? 0);
36325
+ }
36326
+ if (autoScalingChanged) {
36327
+ if (!jobFlowId) throw new ProvisioningError(`EMR InstanceGroupConfig ${logicalId} AutoScalingPolicy update needs JobFlowId (the cluster id), which is absent`, resourceType, logicalId, physicalId);
36328
+ const policy = properties["AutoScalingPolicy"];
36329
+ if (policy) await this.getClient().send(new PutAutoScalingPolicyCommand({
36330
+ ClusterId: jobFlowId,
36331
+ InstanceGroupId: physicalId,
36332
+ AutoScalingPolicy: policy
36333
+ }));
36334
+ else await this.getClient().send(new RemoveAutoScalingPolicyCommand({
36335
+ ClusterId: jobFlowId,
36336
+ InstanceGroupId: physicalId
36337
+ }));
36338
+ }
36339
+ this.logger.debug(`Successfully updated EMR instance group ${logicalId}`);
36340
+ return {
36341
+ physicalId,
36342
+ wasReplaced: false,
36343
+ attributes: { Id: physicalId }
36344
+ };
36345
+ } catch (error) {
36346
+ if (error instanceof ProvisioningError || error instanceof ResourceUpdateNotSupportedError) throw error;
36347
+ const cause = error instanceof Error ? error : void 0;
36348
+ throw new ProvisioningError(`Failed to update EMR instance group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
36349
+ }
36350
+ }
36351
+ async delete(logicalId, physicalId, resourceType, properties, context) {
36352
+ const role = properties?.["InstanceRole"];
36353
+ const jobFlowId = properties?.["JobFlowId"];
36354
+ if (role === "TASK" && jobFlowId) {
36355
+ try {
36356
+ await this.getClient().send(new ModifyInstanceGroupsCommand({
36357
+ ClusterId: jobFlowId,
36358
+ InstanceGroups: [{
36359
+ InstanceGroupId: physicalId,
36360
+ InstanceCount: 0
36361
+ }]
36362
+ }));
36363
+ this.logger.debug(`Scaled EMR TASK instance group ${physicalId} to 0 to release its instances (no standalone delete API exists)`);
36364
+ } catch (error) {
36365
+ if (error instanceof InvalidRequestException) {
36366
+ assertRegionMatch(await this.getClient().config.region(), context?.expectedRegion, resourceType, logicalId, physicalId);
36367
+ this.logger.debug(`EMR instance group ${physicalId} scale-to-0 skipped (cluster/group gone): ${error.message}`);
36368
+ } else this.logger.warn(`Best-effort scale-to-0 of EMR instance group ${physicalId} failed: ${error instanceof Error ? error.message : String(error)} — its instances are released when the parent cluster terminates`);
36369
+ }
36370
+ return;
36371
+ }
36372
+ this.logger.debug(`EMR instance group ${physicalId} (role ${role ?? "unknown"}) has no standalone delete API; its instances are released when the parent cluster terminates. Removing cdkd state only.`);
36373
+ }
36374
+ async getAttribute(physicalId, _resourceType, attributeName) {
36375
+ if (attributeName === "Id") return physicalId;
36376
+ }
36377
+ /**
36378
+ * Poll until the group is `RUNNING` AND its `RunningInstanceCount` equals
36379
+ * `expectedCount`. The count check is load-bearing on a resize: right after
36380
+ * `ModifyInstanceGroups` the group is still in the PRE-resize `RUNNING`
36381
+ * state (EMR has not flipped it to `RESIZING` yet), so a State-only wait
36382
+ * would return before the resize even starts. Waiting on the running count
36383
+ * reaching the requested target settles both create (0 -> N provisioning)
36384
+ * and resize (M -> N add/remove) correctly.
36385
+ */
36386
+ async waitForGroupReady(clusterId, groupId, logicalId, resourceType, expectedCount) {
36387
+ const startTime = Date.now();
36388
+ const transientState = { count: 0 };
36389
+ while (Date.now() - startTime < this.maxWaitMs) {
36390
+ const group = await this.findGroupForPoll(clusterId, groupId, transientState);
36391
+ const state = group?.Status?.State;
36392
+ if (state && READY_STATES$1.has(state) && group?.RunningInstanceCount === expectedCount) return;
36393
+ if (state && FAILED_STATES$1.has(state)) throw new ProvisioningError(`EMR instance group ${groupId} entered failed state ${state}: ${group?.Status?.StateChangeReason?.Message ?? "no state-change reason reported"}`, resourceType, logicalId, groupId);
36394
+ this.logger.debug(`EMR instance group ${groupId} state: ${state ?? "unknown"}, running ${group?.RunningInstanceCount ?? "?"}/${expectedCount}, waiting...`);
36395
+ await new Promise((resolve) => setTimeout(resolve, this.pollIntervalMs));
36396
+ }
36397
+ throw new ProvisioningError(`Timed out waiting for EMR instance group ${groupId} to reach RUNNING with ${expectedCount} instance(s) (${Math.round(this.maxWaitMs / 6e4)} min)`, resourceType, logicalId, groupId);
36398
+ }
36399
+ /**
36400
+ * `ListInstanceGroups` (paginated) for the cluster, returning the single
36401
+ * group whose `Id` matches. Absorbs up to `maxConsecutiveTransient`
36402
+ * consecutive transient errors (throttle / 5xx / reset) so a single blip
36403
+ * during a 10-minute poll does not spuriously fail the create.
36404
+ */
36405
+ async findGroupForPoll(clusterId, groupId, transientState, maxConsecutiveTransient = 5) {
36406
+ try {
36407
+ let marker;
36408
+ do {
36409
+ const resp = await this.getClient().send(new ListInstanceGroupsCommand({
36410
+ ClusterId: clusterId,
36411
+ ...marker && { Marker: marker }
36412
+ }));
36413
+ const found = (resp.InstanceGroups ?? []).find((g) => g.Id === groupId);
36414
+ if (found) {
36415
+ transientState.count = 0;
36416
+ return found;
36417
+ }
36418
+ marker = resp.Marker;
36419
+ } while (marker);
36420
+ transientState.count = 0;
36421
+ return;
36422
+ } catch (error) {
36423
+ const name = error instanceof Error ? error.name : "";
36424
+ const msg = error instanceof Error ? error.message : String(error);
36425
+ if ((name === "ThrottlingException" || name === "InternalServerException" || name === "InternalServerError" || name === "TimeoutError" || /rate exceeded|too many requests|throttl|timed? ?out|ECONNRESET|EPIPE|socket hang up/i.test(msg)) && transientState.count < maxConsecutiveTransient) {
36426
+ transientState.count += 1;
36427
+ this.logger.debug(`Transient ListInstanceGroups error while polling ${groupId} (${transientState.count}/${maxConsecutiveTransient}): ${msg} — retrying`);
36428
+ return;
36429
+ }
36430
+ throw error;
36431
+ }
36432
+ }
36433
+ };
36434
+
36435
+ //#endregion
36436
+ //#region src/provisioning/providers/emr-instance-fleet-config-provider.ts
36437
+ /**
36438
+ * Default polling budget for an instance fleet reaching RUNNING. Adding a
36439
+ * fleet to an already-WAITING cluster provisions + bootstraps its EC2
36440
+ * instances (typically 2-6 minutes); a resize settles faster. Reuse the
36441
+ * EMR Cluster provider's 1-hour ceiling so the slowest realistic add still
36442
+ * fits inside the per-resource deadline.
36443
+ */
36444
+ const DEFAULT_MAX_WAIT_MS = 3600 * 1e3;
36445
+ const DEFAULT_POLL_INTERVAL_MS = 15e3;
36446
+ /** Instance-fleet state that means "the fleet is up and idle/serving". */
36447
+ const READY_STATES = /* @__PURE__ */ new Set(["RUNNING"]);
36448
+ /**
36449
+ * Instance-fleet states that mean "the fleet is gone" — a hard error during a
36450
+ * create/resize wait (it will never reach RUNNING).
36451
+ */
36452
+ const FAILED_STATES = /* @__PURE__ */ new Set(["TERMINATED"]);
36453
+ const toNumber = (v) => {
36454
+ if (v === void 0) return void 0;
36455
+ const n = Number(v);
36456
+ return Number.isNaN(n) ? void 0 : n;
36457
+ };
36458
+ const jsonEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
36459
+ /**
36460
+ * SDK Provider for `AWS::EMR::InstanceFleetConfig` (issue #1070).
36461
+ *
36462
+ * This type adds a standalone instance fleet (MASTER / CORE / TASK) to an
36463
+ * EXISTING EMR cluster (referenced by `ClusterId`), rather than declaring the
36464
+ * fleet inline in `AWS::EMR::Cluster.Instances`. It is
36465
+ * `ProvisioningType: NON_PROVISIONABLE` in the CFn registry, so Cloud Control
36466
+ * cannot handle it — pre-flight would otherwise reject it via
36467
+ * `unsupported-types.generated.ts`.
36468
+ *
36469
+ * Lifecycle:
36470
+ * - `create` → `AddInstanceFleet` + poll `ListInstanceFleets` until the new
36471
+ * fleet is `RUNNING`. A `TERMINATED` terminal during the wait is a hard
36472
+ * error.
36473
+ * - `update` → only the AWS-mutable properties: `TargetOnDemandCapacity`,
36474
+ * `TargetSpotCapacity`, `ResizeSpecifications`, and `InstanceTypeConfigs`
36475
+ * (all via `ModifyInstanceFleet`; the resize is polled until settled).
36476
+ * `Name` / `LaunchSpecifications` / `InstanceFleetType` are
36477
+ * registry-createOnly → routed through DELETE+CREATE by the
36478
+ * replacement-detection layer; a createOnly change that reaches `update()`
36479
+ * anyway is refused with a `--replace` pointer.
36480
+ * - `delete` → **no standalone AWS API exists.** EMR cannot remove an
36481
+ * instance fleet from a running cluster; a fleet's only lifecycle end is
36482
+ * cluster termination. In the normal `cdkd destroy` the parent
36483
+ * `AWS::EMR::Cluster` is terminated in the same run (its `TerminateJobFlows`
36484
+ * releases every fleet + its EC2 instances), so this delete is a no-op that
36485
+ * just drops cdkd state — leaving ZERO orphans. As a best effort for the
36486
+ * less common "delete only the fleet, keep the cluster" case, a TASK fleet
36487
+ * is scaled to 0 target capacity (`ModifyInstanceFleet`) to release its
36488
+ * instances; MASTER/CORE fleets cannot be scaled to 0 and are a pure no-op.
36489
+ * Never blocks the destroy (warn-and-continue).
36490
+ *
36491
+ * `getMinResourceTimeoutMs()` lifts the deploy engine's per-resource deadline
36492
+ * to the polling ceiling (mirrors `EMRClusterProvider`) so a slow add/resize
36493
+ * does not require `--resource-timeout`.
36494
+ */
36495
+ var EMRInstanceFleetConfigProvider = class {
36496
+ /**
36497
+ * Cloud Control has NO handlers for this type
36498
+ * (`ProvisioningType: NON_PROVISIONABLE`), so the deploy engine's #614
36499
+ * silent-drop auto-route MUST NOT send an unhandled-property template to CC
36500
+ * — it would fail at provisioning time with an opaque
36501
+ * UnsupportedActionException. With this opt-out the ProviderRegistry rejects
36502
+ * such templates pre-flight with a clear error instead.
36503
+ */
36504
+ disableCcApiFallback = true;
36505
+ client;
36506
+ providerRegion = process.env["AWS_REGION"];
36507
+ logger = getLogger().child("EMRInstanceFleetConfigProvider");
36508
+ pollIntervalMs;
36509
+ maxWaitMs;
36510
+ constructor(options) {
36511
+ this.pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
36512
+ this.maxWaitMs = options?.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;
36513
+ }
36514
+ handledProperties = /* @__PURE__ */ new Map([["AWS::EMR::InstanceFleetConfig", /* @__PURE__ */ new Set([
36515
+ "ClusterId",
36516
+ "InstanceFleetType",
36517
+ "InstanceTypeConfigs",
36518
+ "LaunchSpecifications",
36519
+ "Name",
36520
+ "ResizeSpecifications",
36521
+ "TargetOnDemandCapacity",
36522
+ "TargetSpotCapacity"
36523
+ ])]]);
36524
+ getClient() {
36525
+ if (!this.client) this.client = new EMRClient(this.providerRegion ? { region: this.providerRegion } : {});
36526
+ return this.client;
36527
+ }
36528
+ getMinResourceTimeoutMs() {
36529
+ return this.maxWaitMs + this.pollIntervalMs;
36530
+ }
36531
+ async create(logicalId, resourceType, properties) {
36532
+ if (resourceType !== "AWS::EMR::InstanceFleetConfig") throw new ProvisioningError(`Unsupported resource type: ${resourceType}`, resourceType, logicalId);
36533
+ const clusterId = properties["ClusterId"];
36534
+ if (!clusterId) throw new ProvisioningError(`EMR InstanceFleetConfig ${logicalId} is missing ClusterId (the parent cluster id)`, resourceType, logicalId);
36535
+ this.logger.debug(`Adding EMR instance fleet ${logicalId} to cluster ${clusterId}`);
36536
+ try {
36537
+ const fleet = this.toInstanceFleetConfig(properties);
36538
+ const fleetId = (await this.getClient().send(new AddInstanceFleetCommand({
36539
+ ClusterId: clusterId,
36540
+ InstanceFleet: fleet
36541
+ }))).InstanceFleetId;
36542
+ if (!fleetId) throw new ProvisioningError(`EMR AddInstanceFleet for ${logicalId} returned no instance fleet id`, resourceType, logicalId);
36543
+ await this.waitForFleetReady(clusterId, fleetId, logicalId, resourceType, this.targetCapacity(properties), true);
36544
+ this.logger.debug(`Successfully added EMR instance fleet ${logicalId}: ${fleetId}`);
36545
+ return {
36546
+ physicalId: fleetId,
36547
+ attributes: { Id: fleetId }
36548
+ };
36549
+ } catch (error) {
36550
+ if (error instanceof ProvisioningError) throw error;
36551
+ const cause = error instanceof Error ? error : void 0;
36552
+ throw new ProvisioningError(`Failed to add EMR instance fleet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, void 0, cause);
36553
+ }
36554
+ }
36555
+ toInstanceFleetConfig(properties) {
36556
+ return {
36557
+ InstanceFleetType: properties["InstanceFleetType"],
36558
+ Name: properties["Name"],
36559
+ TargetOnDemandCapacity: toNumber(properties["TargetOnDemandCapacity"]),
36560
+ TargetSpotCapacity: toNumber(properties["TargetSpotCapacity"]),
36561
+ InstanceTypeConfigs: properties["InstanceTypeConfigs"],
36562
+ LaunchSpecifications: properties["LaunchSpecifications"],
36563
+ ResizeSpecifications: properties["ResizeSpecifications"]
36564
+ };
36565
+ }
36566
+ async update(logicalId, physicalId, resourceType, properties, previousProperties) {
36567
+ const changed = (key) => !jsonEqual(properties[key], previousProperties[key]);
36568
+ const MUTABLE = /* @__PURE__ */ new Set([
36569
+ "TargetOnDemandCapacity",
36570
+ "TargetSpotCapacity",
36571
+ "ResizeSpecifications",
36572
+ "InstanceTypeConfigs"
36573
+ ]);
36574
+ for (const key of Object.keys({
36575
+ ...properties,
36576
+ ...previousProperties
36577
+ })) {
36578
+ if (!changed(key)) continue;
36579
+ if (!MUTABLE.has(key)) throw new ResourceUpdateNotSupportedError(resourceType, logicalId, `AWS EMR InstanceFleetConfig ${key} is immutable on AWS — it is fixed when the instance fleet is created. Re-deploy with cdkd deploy --replace, or destroy + redeploy the stack.`);
36580
+ }
36581
+ if (![...MUTABLE].some((k) => changed(k))) {
36582
+ this.logger.debug(`No mutable diff for EMR instance fleet ${logicalId}, skipping update`);
36583
+ return {
36584
+ physicalId,
36585
+ wasReplaced: false
36586
+ };
36587
+ }
36588
+ const clusterId = properties["ClusterId"];
36589
+ if (!clusterId) throw new ProvisioningError(`EMR InstanceFleetConfig ${logicalId} update needs ClusterId (the cluster id), which is absent`, resourceType, logicalId, physicalId);
36590
+ this.logger.debug(`Updating EMR instance fleet ${logicalId}: ${physicalId}`);
36591
+ try {
36592
+ const modify = {
36593
+ InstanceFleetId: physicalId,
36594
+ TargetOnDemandCapacity: toNumber(properties["TargetOnDemandCapacity"]),
36595
+ TargetSpotCapacity: toNumber(properties["TargetSpotCapacity"]),
36596
+ ResizeSpecifications: properties["ResizeSpecifications"],
36597
+ InstanceTypeConfigs: properties["InstanceTypeConfigs"]
36598
+ };
36599
+ await this.getClient().send(new ModifyInstanceFleetCommand({
36600
+ ClusterId: clusterId,
36601
+ InstanceFleet: modify
36602
+ }));
36603
+ const newTarget = this.targetCapacity(properties);
36604
+ const prevTarget = this.targetCapacity(previousProperties);
36605
+ await this.waitForFleetReady(clusterId, physicalId, logicalId, resourceType, newTarget, newTarget >= prevTarget);
36606
+ this.logger.debug(`Successfully updated EMR instance fleet ${logicalId}`);
36607
+ return {
36608
+ physicalId,
36609
+ wasReplaced: false,
36610
+ attributes: { Id: physicalId }
36611
+ };
36612
+ } catch (error) {
36613
+ if (error instanceof ProvisioningError || error instanceof ResourceUpdateNotSupportedError) throw error;
36614
+ const cause = error instanceof Error ? error : void 0;
36615
+ throw new ProvisioningError(`Failed to update EMR instance fleet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`, resourceType, logicalId, physicalId, cause);
36616
+ }
36617
+ }
36618
+ async delete(logicalId, physicalId, resourceType, properties, context) {
36619
+ const fleetType = properties?.["InstanceFleetType"];
36620
+ const clusterId = properties?.["ClusterId"];
36621
+ if (fleetType === "TASK" && clusterId) {
36622
+ try {
36623
+ await this.getClient().send(new ModifyInstanceFleetCommand({
36624
+ ClusterId: clusterId,
36625
+ InstanceFleet: {
36626
+ InstanceFleetId: physicalId,
36627
+ TargetOnDemandCapacity: 0,
36628
+ TargetSpotCapacity: 0
36629
+ }
36630
+ }));
36631
+ this.logger.debug(`Scaled EMR TASK instance fleet ${physicalId} to 0 to release its instances (no standalone delete API exists)`);
36632
+ } catch (error) {
36633
+ if (error instanceof InvalidRequestException) {
36634
+ assertRegionMatch(await this.getClient().config.region(), context?.expectedRegion, resourceType, logicalId, physicalId);
36635
+ this.logger.debug(`EMR instance fleet ${physicalId} scale-to-0 skipped (cluster/fleet gone): ${error.message}`);
36636
+ } else this.logger.warn(`Best-effort scale-to-0 of EMR instance fleet ${physicalId} failed: ${error instanceof Error ? error.message : String(error)} — its instances are released when the parent cluster terminates`);
36637
+ }
36638
+ return;
36639
+ }
36640
+ this.logger.debug(`EMR instance fleet ${physicalId} (type ${fleetType ?? "unknown"}) has no standalone delete API; its instances are released when the parent cluster terminates. Removing cdkd state only.`);
36641
+ }
36642
+ async getAttribute(physicalId, _resourceType, attributeName) {
36643
+ if (attributeName === "Id") return physicalId;
36644
+ }
36645
+ /** Total target capacity (On-Demand + Spot) requested for the fleet. */
36646
+ targetCapacity(properties) {
36647
+ return (toNumber(properties["TargetOnDemandCapacity"]) ?? 0) + (toNumber(properties["TargetSpotCapacity"]) ?? 0);
36648
+ }
36649
+ /**
36650
+ * Poll until the fleet is `RUNNING` AND its provisioned capacity
36651
+ * (On-Demand + Spot) has settled at `targetCapacity`. The capacity check is
36652
+ * load-bearing on a resize: right after `ModifyInstanceFleet` the fleet is
36653
+ * still in the PRE-resize `RUNNING` state, so a State-only wait would return
36654
+ * before the resize even starts.
36655
+ *
36656
+ * `atLeast` selects the settle direction:
36657
+ * - `true` (create / scale-UP): ready when `provisioned >= targetCapacity`
36658
+ * (`>=`, not `==`, because a weighted-capacity allocation may overshoot).
36659
+ * - `false` (scale-DOWN): ready when `provisioned <= targetCapacity` — the
36660
+ * stale pre-resize provisioned capacity is ABOVE the new lower target, so
36661
+ * an `>=` check would return instantly before instances drain.
36662
+ *
36663
+ * A `targetCapacity` of 0 on the up path (never valid for a real create —
36664
+ * at least one target must be > 0) degrades to a State-only wait.
36665
+ */
36666
+ async waitForFleetReady(clusterId, fleetId, logicalId, resourceType, targetCapacity, atLeast) {
36667
+ const startTime = Date.now();
36668
+ const transientState = { count: 0 };
36669
+ while (Date.now() - startTime < this.maxWaitMs) {
36670
+ const fleet = await this.findFleetForPoll(clusterId, fleetId, transientState);
36671
+ const state = fleet?.Status?.State;
36672
+ const provisioned = (fleet?.ProvisionedOnDemandCapacity ?? 0) + (fleet?.ProvisionedSpotCapacity ?? 0);
36673
+ const capacityReady = atLeast ? provisioned >= targetCapacity : provisioned <= targetCapacity;
36674
+ if (state && READY_STATES.has(state) && capacityReady) return;
36675
+ if (state && FAILED_STATES.has(state)) throw new ProvisioningError(`EMR instance fleet ${fleetId} entered failed state ${state}: ${fleet?.Status?.StateChangeReason?.Message ?? "no state-change reason reported"}`, resourceType, logicalId, fleetId);
36676
+ this.logger.debug(`EMR instance fleet ${fleetId} state: ${state ?? "unknown"}, provisioned ${provisioned}/${targetCapacity}, waiting...`);
36677
+ await new Promise((resolve) => setTimeout(resolve, this.pollIntervalMs));
36678
+ }
36679
+ throw new ProvisioningError(`Timed out waiting for EMR instance fleet ${fleetId} to reach RUNNING with capacity ${targetCapacity} (${Math.round(this.maxWaitMs / 6e4)} min)`, resourceType, logicalId, fleetId);
36680
+ }
36681
+ /**
36682
+ * `ListInstanceFleets` (paginated) for the cluster, returning the single
36683
+ * fleet whose `Id` matches. Absorbs up to `maxConsecutiveTransient`
36684
+ * consecutive transient errors (throttle / 5xx / reset) so a single blip
36685
+ * during a 10-minute poll does not spuriously fail the create.
36686
+ */
36687
+ async findFleetForPoll(clusterId, fleetId, transientState, maxConsecutiveTransient = 5) {
36688
+ try {
36689
+ let marker;
36690
+ do {
36691
+ const resp = await this.getClient().send(new ListInstanceFleetsCommand({
36692
+ ClusterId: clusterId,
36693
+ ...marker && { Marker: marker }
36694
+ }));
36695
+ const found = (resp.InstanceFleets ?? []).find((f) => f.Id === fleetId);
36696
+ if (found) {
36697
+ transientState.count = 0;
36698
+ return found;
36699
+ }
36700
+ marker = resp.Marker;
36701
+ } while (marker);
36702
+ transientState.count = 0;
36703
+ return;
36704
+ } catch (error) {
36705
+ const name = error instanceof Error ? error.name : "";
36706
+ const msg = error instanceof Error ? error.message : String(error);
36707
+ if ((name === "ThrottlingException" || name === "InternalServerException" || name === "InternalServerError" || name === "TimeoutError" || /rate exceeded|too many requests|throttl|timed? ?out|ECONNRESET|EPIPE|socket hang up/i.test(msg)) && transientState.count < maxConsecutiveTransient) {
36708
+ transientState.count += 1;
36709
+ this.logger.debug(`Transient ListInstanceFleets error while polling ${fleetId} (${transientState.count}/${maxConsecutiveTransient}): ${msg} — retrying`);
36710
+ return;
36711
+ }
36712
+ throw error;
36713
+ }
36714
+ }
36715
+ };
36716
+
35810
36717
  //#endregion
35811
36718
  //#region src/provisioning/providers/firehose-provider.ts
35812
36719
  /**
@@ -35818,7 +36725,7 @@ var EMRClusterProvider = class {
35818
36725
  * Membership grows as each follow-up PR lands. Keep alphabetical
35819
36726
  * to minimize merge conflicts when multiple follow-ups race.
35820
36727
  */
35821
- const SUPPORTED_UPDATE_DESTINATIONS = new Set([
36728
+ const SUPPORTED_UPDATE_DESTINATIONS = /* @__PURE__ */ new Set([
35822
36729
  "AmazonOpenSearchServerlessDestinationConfiguration",
35823
36730
  "AmazonopensearchserviceDestinationConfiguration",
35824
36731
  "ElasticsearchDestinationConfiguration",
@@ -35842,7 +36749,7 @@ var FirehoseProvider = class {
35842
36749
  client;
35843
36750
  providerRegion = process.env["AWS_REGION"];
35844
36751
  logger = getLogger().child("FirehoseProvider");
35845
- handledProperties = new Map([["AWS::KinesisFirehose::DeliveryStream", new Set([
36752
+ handledProperties = /* @__PURE__ */ new Map([["AWS::KinesisFirehose::DeliveryStream", /* @__PURE__ */ new Set([
35846
36753
  "DeliveryStreamName",
35847
36754
  "DeliveryStreamType",
35848
36755
  "S3DestinationConfiguration",
@@ -37088,7 +37995,7 @@ var CloudTrailProvider = class {
37088
37995
  client;
37089
37996
  providerRegion = process.env["AWS_REGION"];
37090
37997
  logger = getLogger().child("CloudTrailProvider");
37091
- handledProperties = new Map([["AWS::CloudTrail::Trail", new Set([
37998
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudTrail::Trail", /* @__PURE__ */ new Set([
37092
37999
  "S3BucketName",
37093
38000
  "TrailName",
37094
38001
  "S3KeyPrefix",
@@ -37431,7 +38338,7 @@ var CodeBuildProvider = class {
37431
38338
  client;
37432
38339
  providerRegion = process.env["AWS_REGION"];
37433
38340
  logger = getLogger().child("CodeBuildProvider");
37434
- handledProperties = new Map([["AWS::CodeBuild::Project", new Set([
38341
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CodeBuild::Project", /* @__PURE__ */ new Set([
37435
38342
  "Name",
37436
38343
  "Source",
37437
38344
  "Environment",
@@ -37963,7 +38870,7 @@ var CodeCommitRepositoryProvider = class {
37963
38870
  s3Client;
37964
38871
  providerRegion = process.env["AWS_REGION"];
37965
38872
  logger = getLogger().child("CodeCommitRepositoryProvider");
37966
- handledProperties = new Map([["AWS::CodeCommit::Repository", new Set([
38873
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CodeCommit::Repository", /* @__PURE__ */ new Set([
37967
38874
  "RepositoryName",
37968
38875
  "RepositoryDescription",
37969
38876
  "KmsKeyId",
@@ -38415,7 +39322,7 @@ var DLMLifecyclePolicyProvider = class {
38415
39322
  client;
38416
39323
  providerRegion = process.env["AWS_REGION"];
38417
39324
  logger = getLogger().child("DLMLifecyclePolicyProvider");
38418
- handledProperties = new Map([["AWS::DLM::LifecyclePolicy", new Set([
39325
+ handledProperties = /* @__PURE__ */ new Map([["AWS::DLM::LifecyclePolicy", /* @__PURE__ */ new Set([
38419
39326
  "Description",
38420
39327
  "ExecutionRoleArn",
38421
39328
  "State",
@@ -38665,7 +39572,7 @@ var S3VectorsProvider = class {
38665
39572
  client;
38666
39573
  providerRegion = process.env["AWS_REGION"];
38667
39574
  logger = getLogger().child("S3VectorsProvider");
38668
- handledProperties = new Map([["AWS::S3Vectors::VectorBucket", new Set([
39575
+ handledProperties = /* @__PURE__ */ new Map([["AWS::S3Vectors::VectorBucket", /* @__PURE__ */ new Set([
38669
39576
  "VectorBucketName",
38670
39577
  "EncryptionConfiguration",
38671
39578
  "Tags"
@@ -38926,7 +39833,7 @@ var S3DirectoryBucketProvider = class {
38926
39833
  s3Client;
38927
39834
  stsClient;
38928
39835
  logger = getLogger().child("S3DirectoryBucketProvider");
38929
- handledProperties = new Map([["AWS::S3Express::DirectoryBucket", new Set([
39836
+ handledProperties = /* @__PURE__ */ new Map([["AWS::S3Express::DirectoryBucket", /* @__PURE__ */ new Set([
38930
39837
  "DataRedundancy",
38931
39838
  "LocationName",
38932
39839
  "BucketName"
@@ -39173,10 +40080,10 @@ var S3TablesProvider = class {
39173
40080
  client;
39174
40081
  providerRegion = process.env["AWS_REGION"];
39175
40082
  logger = getLogger().child("S3TablesProvider");
39176
- handledProperties = new Map([
39177
- ["AWS::S3Tables::TableBucket", new Set(["TableBucketName", "Tags"])],
39178
- ["AWS::S3Tables::Namespace", new Set(["TableBucketARN", "Namespace"])],
39179
- ["AWS::S3Tables::Table", new Set([
40083
+ handledProperties = /* @__PURE__ */ new Map([
40084
+ ["AWS::S3Tables::TableBucket", /* @__PURE__ */ new Set(["TableBucketName", "Tags"])],
40085
+ ["AWS::S3Tables::Namespace", /* @__PURE__ */ new Set(["TableBucketARN", "Namespace"])],
40086
+ ["AWS::S3Tables::Table", /* @__PURE__ */ new Set([
39180
40087
  "TableBucketARN",
39181
40088
  "Namespace",
39182
40089
  "TableName",
@@ -39793,7 +40700,7 @@ var ECRProvider = class {
39793
40700
  client;
39794
40701
  providerRegion = process.env["AWS_REGION"];
39795
40702
  logger = getLogger().child("ECRProvider");
39796
- handledProperties = new Map([["AWS::ECR::Repository", new Set([
40703
+ handledProperties = /* @__PURE__ */ new Map([["AWS::ECR::Repository", /* @__PURE__ */ new Set([
39797
40704
  "RepositoryName",
39798
40705
  "ImageScanningConfiguration",
39799
40706
  "ImageTagMutability",
@@ -40140,8 +41047,8 @@ const PROTECTION_PROPERTY_BY_TYPE = {
40140
41047
  * (boolean `true`).
40141
41048
  */
40142
41049
  const PROTECTION_ACTIVE_VALUES_BY_TYPE = {
40143
- "AWS::Cognito::UserPool": new Set(["ACTIVE"]),
40144
- "AWS::AutoScaling::AutoScalingGroup": new Set(["prevent-force-deletion", "prevent-all-deletion"])
41050
+ "AWS::Cognito::UserPool": /* @__PURE__ */ new Set(["ACTIVE"]),
41051
+ "AWS::AutoScaling::AutoScalingGroup": /* @__PURE__ */ new Set(["prevent-force-deletion", "prevent-all-deletion"])
40145
41052
  };
40146
41053
  /**
40147
41054
  * Count how many resources in a stack's recorded state appear to have
@@ -40675,7 +41582,7 @@ var NestedStackProvider = class {
40675
41582
  * parameter map forwarded as `DeployEngineOptions.parameters` to the
40676
41583
  * child engine.
40677
41584
  */
40678
- handledProperties = new Map([["AWS::CloudFormation::Stack", new Set(["TemplateURL", "Parameters"])]]);
41585
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFormation::Stack", /* @__PURE__ */ new Set(["TemplateURL", "Parameters"])]]);
40679
41586
  /**
40680
41587
  * Every other property on `AWS::CloudFormation::Stack` is intentionally
40681
41588
  * not threaded through — cdkd does not go through CloudFormation, so
@@ -40687,7 +41594,7 @@ var NestedStackProvider = class {
40687
41594
  * `<parent>~<logicalId>` key per design §3, and `TemplateBody` is
40688
41595
  * superseded by the local `Metadata['aws:asset:path']` lookup.
40689
41596
  */
40690
- unhandledByDesign = new Map([["AWS::CloudFormation::Stack", new Map([
41597
+ unhandledByDesign = /* @__PURE__ */ new Map([["AWS::CloudFormation::Stack", /* @__PURE__ */ new Map([
40691
41598
  ["TemplateBody", "CFn-only inline template — cdkd reads the child template from the synth output via Metadata['aws:asset:path'] instead of accepting it inline"],
40692
41599
  ["Capabilities", "CFn-only IAM capability declaration — cdkd does not go through CloudFormation so capabilities have no equivalent"],
40693
41600
  ["Description", "CFn-only informational — no semantic effect on the recursive deploy"],
@@ -40880,7 +41787,7 @@ var NestedStackProvider = class {
40880
41787
  */
40881
41788
  var WaitConditionHandleProvider = class {
40882
41789
  logger = getLogger().child("WaitConditionHandleProvider");
40883
- handledProperties = new Map([["AWS::CloudFormation::WaitConditionHandle", /* @__PURE__ */ new Set([])]]);
41790
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CloudFormation::WaitConditionHandle", /* @__PURE__ */ new Set([])]]);
40884
41791
  /**
40885
41792
  * "Create" the handle: synthesize a unique placeholder physical id.
40886
41793
  * `Ref` on the handle resolves to this id. It is deliberately NOT
@@ -40976,7 +41883,7 @@ var ACMCertificateProvider = class {
40976
41883
  constructor() {
40977
41884
  this.acmClient = getAwsClients().acm;
40978
41885
  }
40979
- handledProperties = new Map([["AWS::CertificateManager::Certificate", new Set([
41886
+ handledProperties = /* @__PURE__ */ new Map([["AWS::CertificateManager::Certificate", /* @__PURE__ */ new Set([
40980
41887
  "DomainName",
40981
41888
  "ValidationMethod",
40982
41889
  "SubjectAlternativeNames",
@@ -41419,6 +42326,8 @@ function registerAllProviders(registry) {
41419
42326
  registry.register("AWS::EFS::AccessPoint", efsProvider);
41420
42327
  registry.register("AWS::FSx::FileSystem", new FSxFileSystemProvider());
41421
42328
  registry.register("AWS::EMR::Cluster", new EMRClusterProvider());
42329
+ registry.register("AWS::EMR::InstanceGroupConfig", new EMRInstanceGroupConfigProvider());
42330
+ registry.register("AWS::EMR::InstanceFleetConfig", new EMRInstanceFleetConfigProvider());
41422
42331
  registry.register("AWS::KinesisFirehose::DeliveryStream", new FirehoseProvider());
41423
42332
  registry.register("AWS::CloudTrail::Trail", new CloudTrailProvider());
41424
42333
  registry.register("AWS::CodeBuild::Project", new CodeBuildProvider());
@@ -41954,7 +42863,7 @@ function createDeployCommand() {
41954
42863
  * `cdkd import --migrate-from-cloudformation` retirement flow
41955
42864
  * (`src/cli/commands/retire-cfn-stack.ts`).
41956
42865
  */
41957
- const STABLE_TERMINAL_STATUSES = new Set([
42866
+ const STABLE_TERMINAL_STATUSES = /* @__PURE__ */ new Set([
41958
42867
  "CREATE_COMPLETE",
41959
42868
  "UPDATE_COMPLETE",
41960
42869
  "UPDATE_ROLLBACK_COMPLETE",
@@ -43084,7 +43993,7 @@ function diffTreeToJson(node) {
43084
43993
  children: node.children.map(diffTreeToJson)
43085
43994
  };
43086
43995
  }
43087
- const INTRINSIC_KEYS = new Set([
43996
+ const INTRINSIC_KEYS = /* @__PURE__ */ new Set([
43088
43997
  "Ref",
43089
43998
  "Fn::Sub",
43090
43999
  "Fn::GetAtt",
@@ -43494,7 +44403,7 @@ function isIgnoredPath(path, ignorePaths) {
43494
44403
  function diffAt(path, stateValue, awsValue, out, ignorePaths, unionWalkObjects) {
43495
44404
  if (deepEqual(stateValue, awsValue)) return;
43496
44405
  if (isPlainObject(stateValue) && isPlainObject(awsValue) && !Array.isArray(stateValue) && !Array.isArray(awsValue)) {
43497
- const keys = unionWalkObjects ? new Set([...Object.keys(stateValue), ...Object.keys(awsValue)]) : Object.keys(stateValue);
44406
+ const keys = unionWalkObjects ? /* @__PURE__ */ new Set([...Object.keys(stateValue), ...Object.keys(awsValue)]) : Object.keys(stateValue);
43498
44407
  for (const key of keys) {
43499
44408
  const childPath = `${path}.${key}`;
43500
44409
  if (isIgnoredPath(childPath, ignorePaths)) continue;
@@ -43624,7 +44533,7 @@ const CC_API_FALLBACK_DENY_LIST = {
43624
44533
  * managed field — the deny-list catches per-type structural divergence;
43625
44534
  * this helper catches generic noise.
43626
44535
  */
43627
- const ALWAYS_STRIPPED_FIELDS = new Set([
44536
+ const ALWAYS_STRIPPED_FIELDS = /* @__PURE__ */ new Set([
43628
44537
  "CreationDate",
43629
44538
  "CreationTime",
43630
44539
  "CreatedTime",
@@ -46736,7 +47645,7 @@ function stackTreeToJson(roots) {
46736
47645
  * support for import are surfaced as errors by the CreateChangeSet call
46737
47646
  * itself; we do not try to maintain a closed allowlist here.
46738
47647
  */
46739
- const NEVER_IMPORTABLE_TYPES = new Set(["AWS::CDK::Metadata"]);
47648
+ const NEVER_IMPORTABLE_TYPES = /* @__PURE__ */ new Set(["AWS::CDK::Metadata"]);
46740
47649
  /**
46741
47650
  * Per-non-root-child lock-acquisition retry budget for the nested-stack
46742
47651
  * export loop (`runPerStackImportLoop`). `acquireLockWithRetry` retries
@@ -46887,7 +47796,7 @@ function readStringProperty(properties, key, resourceType) {
46887
47796
  * (no `read` / `list` — inline policy attachments have no first-class
46888
47797
  * AWS resource id). See the per-entry comment for each addition.
46889
47798
  */
46890
- const IMPORT_UNSUPPORTED_RECREATABLE_TYPES = new Set(["AWS::ApiGatewayV2::Stage", "AWS::IAM::Policy"]);
47799
+ const IMPORT_UNSUPPORTED_RECREATABLE_TYPES = /* @__PURE__ */ new Set(["AWS::ApiGatewayV2::Stage", "AWS::IAM::Policy"]);
46891
47800
  const PRE_DELETE_HANDLERS = {
46892
47801
  "AWS::ApiGatewayV2::Stage": async (entry) => {
46893
47802
  const { ApiGatewayV2Client, DeleteStageCommand, NotFoundException } = await import("@aws-sdk/client-apigatewayv2");
@@ -53054,7 +53963,7 @@ async function runDetached(opts) {
53054
53963
  const ro = mount.readOnly ? ":ro" : "";
53055
53964
  args.push("-v", `${mount.hostPath}:${mount.containerPath}${ro}`);
53056
53965
  }
53057
- const sensitiveKeys = opts.sensitiveEnvKeys && opts.sensitiveEnvKeys.size > 0 ? new Set([...SENSITIVE_ENV_KEYS, ...opts.sensitiveEnvKeys]) : SENSITIVE_ENV_KEYS;
53966
+ const sensitiveKeys = opts.sensitiveEnvKeys && opts.sensitiveEnvKeys.size > 0 ? /* @__PURE__ */ new Set([...SENSITIVE_ENV_KEYS, ...opts.sensitiveEnvKeys]) : SENSITIVE_ENV_KEYS;
53058
53967
  const passthroughEnv = {};
53059
53968
  for (const [k, v] of Object.entries(opts.env)) if (sensitiveKeys.has(k)) {
53060
53969
  args.push("-e", k);
@@ -53178,7 +54087,7 @@ function pickFreePort() {
53178
54087
  * into stdout / log files. Only the matching `-e <KEY>=<value>` pair is
53179
54088
  * redacted; non-credential `-e KEY=val` entries pass through unchanged.
53180
54089
  */
53181
- const REDACTED_ENV_KEYS = new Set([
54090
+ const REDACTED_ENV_KEYS = /* @__PURE__ */ new Set([
53182
54091
  "AWS_ACCESS_KEY_ID",
53183
54092
  "AWS_SECRET_ACCESS_KEY",
53184
54093
  "AWS_SESSION_TOKEN"
@@ -53194,7 +54103,7 @@ const REDACTED_ENV_KEYS = new Set([
53194
54103
  * AgentCore local-invoke path to keep decrypted `--from-cfn-stack`
53195
54104
  * SecureString SSM values off the argv).
53196
54105
  */
53197
- const SENSITIVE_ENV_KEYS = new Set([
54106
+ const SENSITIVE_ENV_KEYS = /* @__PURE__ */ new Set([
53198
54107
  "AWS_ACCESS_KEY_ID",
53199
54108
  "AWS_SECRET_ACCESS_KEY",
53200
54109
  "AWS_SESSION_TOKEN"
@@ -56838,7 +57747,7 @@ function buildDockerRunArgs(opts) {
56838
57747
  args.push("--network", network);
56839
57748
  args.push("--network-alias", container.name);
56840
57749
  if (opts.networkAliases && opts.networkAliases.length > 0) {
56841
- const seen = new Set([container.name]);
57750
+ const seen = /* @__PURE__ */ new Set([container.name]);
56842
57751
  for (const a of opts.networkAliases) if (!seen.has(a)) {
56843
57752
  args.push("--network-alias", a);
56844
57753
  seen.add(a);
@@ -59661,7 +60570,7 @@ function compareSemver(a, b) {
59661
60570
  * - `Custom::*` — any user-defined Custom Resource type prefix.
59662
60571
  * Same rationale as `AWS::CloudFormation::CustomResource`.
59663
60572
  */
59664
- const HARD_REJECT_RESOURCE_TYPES = new Set(["AWS::CloudFormation::CustomResource", "AWS::CloudFormation::Stack"]);
60573
+ const HARD_REJECT_RESOURCE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", "AWS::CloudFormation::Stack"]);
59665
60574
  /**
59666
60575
  * Fetch the source CFn stack's current state + resources + transform
59667
60576
  * info. Issues 3 read-only AWS API calls (`DescribeStacks`,
@@ -59862,7 +60771,8 @@ async function spawnCdkMigrate(opts) {
59862
60771
  ]
59863
60772
  });
59864
60773
  } catch (err) {
59865
- rejectPromise(new LocalMigrateError(`Failed to spawn '${cdkBin} migrate': ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? err : void 0));
60774
+ const detail = err instanceof Error ? err.message : String(err);
60775
+ rejectPromise(new LocalMigrateError(`Failed to spawn '${cdkBin} migrate': ${detail}`, err instanceof Error ? err : void 0));
59866
60776
  return;
59867
60777
  }
59868
60778
  child.stdout?.on("data", (chunk) => {
@@ -59889,7 +60799,8 @@ async function spawnCdkMigrate(opts) {
59889
60799
  });
59890
60800
  return;
59891
60801
  }
59892
- rejectPromise(new LocalMigrateError(`'${cdkBin} migrate' ${signal !== null ? `killed by signal ${signal}` : code !== null ? `exited with code ${code}` : "process closed without a code or signal"}.\n--- stdout ---\n${stdout || "(empty)"}\n--- stderr ---\n${stderr || "(empty)"}\n`));
60802
+ const exitDetail = signal !== null ? `killed by signal ${signal}` : code !== null ? `exited with code ${code}` : "process closed without a code or signal";
60803
+ rejectPromise(new LocalMigrateError(`'${cdkBin} migrate' ${exitDetail}.\n--- stdout ---\n${stdout || "(empty)"}\n--- stderr ---\n${stderr || "(empty)"}\n`));
59893
60804
  });
59894
60805
  });
59895
60806
  }
@@ -60655,7 +61566,7 @@ function installPipeCloseHandler(streams = [process.stdout, process.stderr], exi
60655
61566
 
60656
61567
  //#endregion
60657
61568
  //#region src/cli/index.ts
60658
- const SUBCOMMANDS = new Set([
61569
+ const SUBCOMMANDS = /* @__PURE__ */ new Set([
60659
61570
  "bootstrap",
60660
61571
  "synth",
60661
61572
  "list",
@@ -60697,7 +61608,7 @@ function reorderArgs(argv) {
60697
61608
  async function main() {
60698
61609
  installPipeCloseHandler();
60699
61610
  const program = new Command();
60700
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.248.0");
61611
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.250.0");
60701
61612
  program.addCommand(createBootstrapCommand());
60702
61613
  program.addCommand(createSynthCommand());
60703
61614
  program.addCommand(createListCommand());