@go-to-k/cdkd 0.0.1 → 0.0.2

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/aws-clients.ts", "../src/cli/index.ts", "../src/cli/commands/bootstrap.ts", "../src/cli/options.ts", "../src/utils/logger.ts", "../src/utils/error-handler.ts", "../src/cli/config-loader.ts", "../src/cli/commands/synth.ts", "../src/synthesis/synthesizer.ts", "../src/synthesis/app-executor.ts", "../src/synthesis/assembly-reader.ts", "../src/types/assembly.ts", "../src/synthesis/context-store.ts", "../src/synthesis/context-providers/az-provider.ts", "../src/synthesis/context-providers/ssm-provider.ts", "../src/synthesis/context-providers/hosted-zone-provider.ts", "../src/synthesis/context-providers/vpc-provider.ts", "../src/synthesis/context-providers/cc-api-provider.ts", "../src/synthesis/context-providers/ami-provider.ts", "../src/synthesis/context-providers/security-group-provider.ts", "../src/synthesis/context-providers/load-balancer-provider.ts", "../src/synthesis/context-providers/key-provider.ts", "../src/synthesis/context-providers/index.ts", "../src/cli/commands/deploy.ts", "../src/assets/asset-publisher.ts", "../src/assets/file-asset-publisher.ts", "../src/assets/docker-asset-publisher.ts", "../src/deployment/work-graph.ts", "../src/state/s3-state-backend.ts", "../src/state/lock-manager.ts", "../src/analyzer/dag-builder.ts", "../src/analyzer/template-parser.ts", "../src/analyzer/replacement-rules.ts", "../src/analyzer/diff-calculator.ts", "../src/provisioning/cloud-control-provider.ts", "../src/deployment/intrinsic-function-resolver.ts", "../src/provisioning/json-patch-generator.ts", "../src/provisioning/providers/custom-resource-provider.ts", "../src/provisioning/provider-registry.ts", "../src/provisioning/providers/iam-role-provider.ts", "../src/provisioning/resource-name.ts", "../src/provisioning/providers/iam-policy-provider.ts", "../src/provisioning/providers/iam-instance-profile-provider.ts", "../src/provisioning/providers/iam-user-group-provider.ts", "../src/provisioning/providers/s3-bucket-provider.ts", "../src/provisioning/providers/s3-bucket-policy-provider.ts", "../src/provisioning/providers/sqs-queue-provider.ts", "../src/provisioning/providers/sqs-queue-policy-provider.ts", "../src/provisioning/providers/sns-topic-provider.ts", "../src/provisioning/providers/sns-subscription-provider.ts", "../src/provisioning/providers/sns-topic-policy-provider.ts", "../src/provisioning/providers/lambda-function-provider.ts", "../src/provisioning/providers/lambda-permission-provider.ts", "../src/provisioning/providers/lambda-url-provider.ts", "../src/provisioning/providers/lambda-eventsource-provider.ts", "../src/provisioning/providers/lambda-layer-provider.ts", "../src/provisioning/providers/dynamodb-table-provider.ts", "../src/provisioning/providers/logs-loggroup-provider.ts", "../src/provisioning/providers/cloudwatch-alarm-provider.ts", "../src/provisioning/providers/secretsmanager-secret-provider.ts", "../src/provisioning/providers/ssm-parameter-provider.ts", "../src/provisioning/providers/eventbridge-rule-provider.ts", "../src/provisioning/providers/eventbridge-bus-provider.ts", "../src/provisioning/providers/ec2-provider.ts", "../src/provisioning/providers/apigateway-provider.ts", "../src/provisioning/providers/apigatewayv2-provider.ts", "../src/provisioning/providers/cloudfront-oai-provider.ts", "../src/provisioning/providers/cloudfront-distribution-provider.ts", "../src/provisioning/providers/agentcore-runtime-provider.ts", "../src/provisioning/providers/stepfunctions-provider.ts", "../src/provisioning/providers/ecs-provider.ts", "../src/provisioning/providers/elbv2-provider.ts", "../src/provisioning/providers/rds-provider.ts", "../src/provisioning/providers/route53-provider.ts", "../src/provisioning/providers/wafv2-provider.ts", "../src/provisioning/providers/cognito-provider.ts", "../src/provisioning/providers/elasticache-provider.ts", "../src/provisioning/providers/servicediscovery-provider.ts", "../src/provisioning/providers/appsync-provider.ts", "../src/provisioning/providers/glue-provider.ts", "../src/provisioning/providers/kms-provider.ts", "../src/provisioning/providers/kinesis-provider.ts", "../src/provisioning/providers/efs-provider.ts", "../src/provisioning/providers/firehose-provider.ts", "../src/provisioning/providers/cloudtrail-provider.ts", "../src/provisioning/providers/codebuild-provider.ts", "../src/provisioning/providers/s3-vectors-provider.ts", "../src/provisioning/providers/s3-directory-bucket-provider.ts", "../src/provisioning/providers/s3-tables-provider.ts", "../src/provisioning/providers/ecr-provider.ts", "../src/provisioning/register-providers.ts", "../src/deployment/deploy-engine.ts", "../src/cli/commands/diff.ts", "../src/cli/commands/destroy.ts", "../src/cli/commands/publish-assets.ts", "../src/cli/commands/force-unlock.ts"],
4
+ "sourcesContent": ["import { S3Client } from '@aws-sdk/client-s3';\nimport { CloudControlClient } from '@aws-sdk/client-cloudcontrol';\nimport { IAMClient } from '@aws-sdk/client-iam';\nimport { SQSClient } from '@aws-sdk/client-sqs';\nimport { SNSClient } from '@aws-sdk/client-sns';\nimport { LambdaClient } from '@aws-sdk/client-lambda';\nimport { STSClient } from '@aws-sdk/client-sts';\nimport { EC2Client } from '@aws-sdk/client-ec2';\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { CloudFormationClient } from '@aws-sdk/client-cloudformation';\nimport { APIGatewayClient } from '@aws-sdk/client-api-gateway';\nimport { EventBridgeClient } from '@aws-sdk/client-eventbridge';\nimport { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';\nimport { SSMClient } from '@aws-sdk/client-ssm';\nimport { CloudFrontClient } from '@aws-sdk/client-cloudfront';\nimport { CloudWatchClient } from '@aws-sdk/client-cloudwatch';\nimport { CloudWatchLogsClient } from '@aws-sdk/client-cloudwatch-logs';\nimport { BedrockAgentCoreControlClient } from '@aws-sdk/client-bedrock-agentcore-control';\n\n/**\n * AWS client configuration\n */\nexport interface AwsClientConfig {\n region?: string;\n profile?: string;\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n}\n\n/**\n * AWS clients manager\n */\nexport class AwsClients {\n private s3Client?: S3Client;\n private cloudControlClient?: CloudControlClient;\n private iamClient?: IAMClient;\n private sqsClient?: SQSClient;\n private snsClient?: SNSClient;\n private lambdaClient?: LambdaClient;\n private stsClient?: STSClient;\n private ec2Client?: EC2Client;\n private dynamoDBClient?: DynamoDBClient;\n private cloudFormationClient?: CloudFormationClient;\n private apiGatewayClient?: APIGatewayClient;\n private eventBridgeClient?: EventBridgeClient;\n private secretsManagerClient?: SecretsManagerClient;\n private ssmClient?: SSMClient;\n private cloudFrontClient?: CloudFrontClient;\n private cloudWatchClient?: CloudWatchClient;\n private cloudWatchLogsClient?: CloudWatchLogsClient;\n private bedrockAgentCoreControlClient?: BedrockAgentCoreControlClient;\n\n constructor(private config: AwsClientConfig = {}) {}\n\n /**\n * Get S3 client\n *\n * Note: If region and credentials are not provided, AWS SDK will use:\n * 1. Environment variables (AWS_REGION, AWS_ACCESS_KEY_ID, etc.)\n * 2. AWS credentials file (~/.aws/credentials)\n * 3. IAM role (if running on EC2/ECS/Lambda)\n */\n getS3Client(): S3Client {\n if (!this.s3Client) {\n this.s3Client = new S3Client({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n // Suppress \"Are you using a Stream of unknown length\" warning\n logger: { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} },\n });\n }\n return this.s3Client;\n }\n\n /**\n * Get Cloud Control API client\n *\n * Note: If region and credentials are not provided, AWS SDK will use:\n * 1. Environment variables (AWS_REGION, AWS_ACCESS_KEY_ID, etc.)\n * 2. AWS credentials file (~/.aws/credentials)\n * 3. IAM role (if running on EC2/ECS/Lambda)\n */\n getCloudControlClient(): CloudControlClient {\n if (!this.cloudControlClient) {\n this.cloudControlClient = new CloudControlClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.cloudControlClient;\n }\n\n /**\n * Get IAM client\n *\n * Note: IAM is a global service, but we accept region for consistency.\n * If not specified, defaults to us-east-1.\n */\n getIAMClient(): IAMClient {\n if (!this.iamClient) {\n this.iamClient = new IAMClient({\n region: this.config.region || 'us-east-1',\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.iamClient;\n }\n\n /**\n * Convenience getter for S3 client\n */\n get s3(): S3Client {\n return this.getS3Client();\n }\n\n /**\n * Convenience getter for Cloud Control client\n */\n get cloudControl(): CloudControlClient {\n return this.getCloudControlClient();\n }\n\n /**\n * Convenience getter for IAM client\n */\n get iam(): IAMClient {\n return this.getIAMClient();\n }\n\n /**\n * Get SQS client\n */\n getSQSClient(): SQSClient {\n if (!this.sqsClient) {\n this.sqsClient = new SQSClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.sqsClient;\n }\n\n /**\n * Convenience getter for SQS client\n */\n get sqs(): SQSClient {\n return this.getSQSClient();\n }\n\n /**\n * Get SNS client\n */\n getSNSClient(): SNSClient {\n if (!this.snsClient) {\n this.snsClient = new SNSClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.snsClient;\n }\n\n /**\n * Convenience getter for SNS client\n */\n get sns(): SNSClient {\n return this.getSNSClient();\n }\n\n /**\n * Get Lambda client\n */\n getLambdaClient(): LambdaClient {\n if (!this.lambdaClient) {\n this.lambdaClient = new LambdaClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.lambdaClient;\n }\n\n /**\n * Convenience getter for Lambda client\n */\n get lambda(): LambdaClient {\n return this.getLambdaClient();\n }\n\n /**\n * Get EC2 client\n */\n getEC2Client(): EC2Client {\n if (!this.ec2Client) {\n this.ec2Client = new EC2Client({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.ec2Client;\n }\n\n /**\n * Convenience getter for EC2 client\n */\n get ec2(): EC2Client {\n return this.getEC2Client();\n }\n\n /**\n * Get STS client\n */\n getSTSClient(): STSClient {\n if (!this.stsClient) {\n this.stsClient = new STSClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.stsClient;\n }\n\n /**\n * Convenience getter for STS client\n */\n get sts(): STSClient {\n return this.getSTSClient();\n }\n\n /**\n * Get DynamoDB client\n */\n getDynamoDBClient(): DynamoDBClient {\n if (!this.dynamoDBClient) {\n this.dynamoDBClient = new DynamoDBClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.dynamoDBClient;\n }\n\n /**\n * Convenience getter for DynamoDB client\n */\n get dynamoDB(): DynamoDBClient {\n return this.getDynamoDBClient();\n }\n\n /**\n * Get CloudFormation client\n */\n getCloudFormationClient(): CloudFormationClient {\n if (!this.cloudFormationClient) {\n this.cloudFormationClient = new CloudFormationClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.cloudFormationClient;\n }\n\n /**\n * Convenience getter for CloudFormation client\n */\n get cloudFormation(): CloudFormationClient {\n return this.getCloudFormationClient();\n }\n\n /**\n * Get API Gateway client\n */\n getAPIGatewayClient(): APIGatewayClient {\n if (!this.apiGatewayClient) {\n this.apiGatewayClient = new APIGatewayClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.apiGatewayClient;\n }\n\n /**\n * Convenience getter for API Gateway client\n */\n get apiGateway(): APIGatewayClient {\n return this.getAPIGatewayClient();\n }\n\n /**\n * Get EventBridge client\n */\n getEventBridgeClient(): EventBridgeClient {\n if (!this.eventBridgeClient) {\n this.eventBridgeClient = new EventBridgeClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.eventBridgeClient;\n }\n\n /**\n * Convenience getter for EventBridge client\n */\n get eventBridge(): EventBridgeClient {\n return this.getEventBridgeClient();\n }\n\n /**\n * Get Secrets Manager client\n */\n getSecretsManagerClient(): SecretsManagerClient {\n if (!this.secretsManagerClient) {\n this.secretsManagerClient = new SecretsManagerClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.secretsManagerClient;\n }\n\n /**\n * Convenience getter for Secrets Manager client\n */\n get secretsManager(): SecretsManagerClient {\n return this.getSecretsManagerClient();\n }\n\n /**\n * Get SSM client\n */\n getSSMClient(): SSMClient {\n if (!this.ssmClient) {\n this.ssmClient = new SSMClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.ssmClient;\n }\n\n /**\n * Convenience getter for SSM client\n */\n get ssm(): SSMClient {\n return this.getSSMClient();\n }\n\n /**\n * Get CloudFront client\n */\n getCloudFrontClient(): CloudFrontClient {\n if (!this.cloudFrontClient) {\n this.cloudFrontClient = new CloudFrontClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.cloudFrontClient;\n }\n\n /**\n * Convenience getter for CloudFront client\n */\n get cloudFront(): CloudFrontClient {\n return this.getCloudFrontClient();\n }\n\n /**\n * Get CloudWatch client\n */\n getCloudWatchClient(): CloudWatchClient {\n if (!this.cloudWatchClient) {\n this.cloudWatchClient = new CloudWatchClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.cloudWatchClient;\n }\n\n /**\n * Convenience getter for CloudWatch client\n */\n get cloudWatch(): CloudWatchClient {\n return this.getCloudWatchClient();\n }\n\n /**\n * Get CloudWatch Logs client\n */\n getCloudWatchLogsClient(): CloudWatchLogsClient {\n if (!this.cloudWatchLogsClient) {\n this.cloudWatchLogsClient = new CloudWatchLogsClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.cloudWatchLogsClient;\n }\n\n /**\n * Convenience getter for CloudWatch Logs client\n */\n get cloudWatchLogs(): CloudWatchLogsClient {\n return this.getCloudWatchLogsClient();\n }\n\n /**\n * Get BedrockAgentCoreControl client\n */\n getBedrockAgentCoreControlClient(): BedrockAgentCoreControlClient {\n if (!this.bedrockAgentCoreControlClient) {\n this.bedrockAgentCoreControlClient = new BedrockAgentCoreControlClient({\n ...(this.config.region && { region: this.config.region }),\n ...(this.config.credentials && { credentials: this.config.credentials }),\n });\n }\n return this.bedrockAgentCoreControlClient;\n }\n\n /**\n * Convenience getter for BedrockAgentCoreControl client\n */\n get bedrockAgentCoreControl(): BedrockAgentCoreControlClient {\n return this.getBedrockAgentCoreControlClient();\n }\n\n /**\n * Destroy all clients\n */\n destroy(): void {\n this.s3Client?.destroy();\n this.cloudControlClient?.destroy();\n this.iamClient?.destroy();\n this.sqsClient?.destroy();\n this.snsClient?.destroy();\n this.lambdaClient?.destroy();\n this.stsClient?.destroy();\n this.ec2Client?.destroy();\n this.dynamoDBClient?.destroy();\n this.cloudFormationClient?.destroy();\n this.apiGatewayClient?.destroy();\n this.eventBridgeClient?.destroy();\n this.secretsManagerClient?.destroy();\n this.ssmClient?.destroy();\n this.cloudFrontClient?.destroy();\n this.cloudWatchClient?.destroy();\n this.cloudWatchLogsClient?.destroy();\n this.bedrockAgentCoreControlClient?.destroy();\n }\n}\n\n/**\n * Global AWS clients instance\n */\nlet globalClients: AwsClients | null = null;\n\n/**\n * Get or create global AWS clients\n */\nexport function getAwsClients(config?: AwsClientConfig): AwsClients {\n if (!globalClients) {\n globalClients = new AwsClients(config);\n }\n return globalClients;\n}\n\n/**\n * Set global AWS clients instance\n */\nexport function setAwsClients(clients: AwsClients): void {\n globalClients = clients;\n}\n\n/**\n * Reset global AWS clients (useful for testing)\n */\nexport function resetAwsClients(): void {\n globalClients?.destroy();\n globalClients = null;\n}\n", "import { Command } from 'commander';\n\n// Injected at build time by esbuild `define` from package.json\ndeclare const __CDKD_VERSION__: string;\n\nimport { createBootstrapCommand } from './commands/bootstrap.js';\nimport { createSynthCommand } from './commands/synth.js';\nimport { createDeployCommand } from './commands/deploy.js';\nimport { createDiffCommand } from './commands/diff.js';\nimport { createDestroyCommand } from './commands/destroy.js';\nimport { createPublishAssetsCommand } from './commands/publish-assets.js';\nimport { createForceUnlockCommand } from './commands/force-unlock.js';\n\nconst SUBCOMMANDS = new Set([\n 'bootstrap',\n 'synth',\n 'deploy',\n 'diff',\n 'destroy',\n 'publish-assets',\n 'force-unlock',\n]);\n\n/**\n * Reorder args so options before the subcommand are moved after it.\n * e.g., `cdkd -c ENV=dev deploy` \u2192 `cdkd deploy -c ENV=dev`\n */\nfunction reorderArgs(argv: string[]): string[] {\n // argv[0] = node, argv[1] = script, rest = user args\n const prefix = argv.slice(0, 2);\n const userArgs = argv.slice(2);\n\n // Find the subcommand index\n const cmdIndex = userArgs.findIndex((arg) => SUBCOMMANDS.has(arg));\n if (cmdIndex <= 0) return argv; // No reordering needed\n\n const beforeCmd = userArgs.slice(0, cmdIndex);\n const cmdAndAfter = userArgs.slice(cmdIndex);\n return [...prefix, ...cmdAndAfter, ...beforeCmd];\n}\n\n/**\n * Main CLI program\n */\nasync function main(): Promise<void> {\n const program = new Command();\n\n program\n .name('cdkd')\n .description('CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API')\n .version(__CDKD_VERSION__);\n\n // Add commands\n program.addCommand(createBootstrapCommand());\n program.addCommand(createSynthCommand());\n program.addCommand(createDeployCommand());\n program.addCommand(createDiffCommand());\n program.addCommand(createDestroyCommand());\n program.addCommand(createPublishAssetsCommand());\n program.addCommand(createForceUnlockCommand());\n\n // Reorder args: move options before subcommand to after it\n // This allows `cdkd -c key=value deploy` like CDK CLI\n const args = reorderArgs(process.argv);\n await program.parseAsync(args);\n}\n\n// Run the CLI\nmain().catch((error) => {\n console.error('Fatal error:', error);\n process.exit(1);\n});\n", "import { Command } from 'commander';\nimport {\n CreateBucketCommand,\n HeadBucketCommand,\n PutBucketPolicyCommand,\n PutBucketVersioningCommand,\n PutBucketEncryptionCommand,\n type BucketLocationConstraint,\n} from '@aws-sdk/client-s3';\nimport { GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { commonOptions } from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { setAwsClients, AwsClients } from '../../utils/aws-clients.js';\nimport { getDefaultStateBucketName } from '../config-loader.js';\n\n/**\n * Bootstrap command implementation\n *\n * Creates S3 bucket for state management\n */\nasync function bootstrapCommand(options: {\n stateBucket?: string;\n region?: string;\n profile?: string;\n force: boolean;\n verbose: boolean;\n}): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n logger.info('Starting cdkd bootstrap...');\n logger.debug('Options:', options);\n\n // Initialize AWS clients with region/profile\n const awsClients = new AwsClients({\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(awsClients);\n\n const s3Client = awsClients.s3;\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n\n // Resolve bucket name: use provided value or generate default from account info\n let bucketName: string;\n let accountId: string;\n\n if (options.stateBucket) {\n bucketName = options.stateBucket;\n // Still need accountId for bucket policy\n const identity = await awsClients.sts.send(new GetCallerIdentityCommand({}));\n accountId = identity.Account!;\n } else {\n logger.info('No --state-bucket specified, resolving default bucket name...');\n const identity = await awsClients.sts.send(new GetCallerIdentityCommand({}));\n accountId = identity.Account!;\n bucketName = getDefaultStateBucketName(accountId, region);\n logger.info(`Using default state bucket: ${bucketName}`);\n }\n\n try {\n // Check if bucket already exists\n let bucketExists = false;\n try {\n await s3Client.send(new HeadBucketCommand({ Bucket: bucketName }));\n bucketExists = true;\n logger.info(`Bucket ${bucketName} already exists`);\n } catch (error) {\n const err = error as { name?: string };\n if (err.name === 'NotFound' || err.name === 'NoSuchBucket') {\n logger.debug(`Bucket ${bucketName} does not exist, will create`);\n } else {\n throw error;\n }\n }\n\n if (bucketExists) {\n if (!options.force) {\n logger.warn(\n `Bucket ${bucketName} already exists. Use --force to reconfigure (this will not delete existing state)`\n );\n return;\n }\n logger.info('--force specified, continuing with existing bucket');\n } else {\n // Create bucket\n logger.info(`Creating S3 bucket: ${bucketName} in region ${region}`);\n\n const createBucketParams: {\n Bucket: string;\n CreateBucketConfiguration?: {\n LocationConstraint: BucketLocationConstraint;\n };\n } = {\n Bucket: bucketName,\n };\n\n // For regions other than us-east-1, LocationConstraint is required\n if (region !== 'us-east-1') {\n createBucketParams.CreateBucketConfiguration = {\n LocationConstraint: region as BucketLocationConstraint,\n };\n }\n\n await s3Client.send(new CreateBucketCommand(createBucketParams));\n logger.info(`\u2713 Created S3 bucket: ${bucketName}`);\n }\n\n // Enable versioning\n logger.debug('Enabling bucket versioning...');\n await s3Client.send(\n new PutBucketVersioningCommand({\n Bucket: bucketName,\n VersioningConfiguration: {\n Status: 'Enabled',\n },\n })\n );\n logger.info('\u2713 Enabled bucket versioning');\n\n // Enable server-side encryption (AES-256)\n logger.debug('Enabling bucket encryption...');\n await s3Client.send(\n new PutBucketEncryptionCommand({\n Bucket: bucketName,\n ServerSideEncryptionConfiguration: {\n Rules: [\n {\n ApplyServerSideEncryptionByDefault: {\n SSEAlgorithm: 'AES256',\n },\n BucketKeyEnabled: true,\n },\n ],\n },\n })\n );\n logger.info('\u2713 Enabled bucket encryption (AES-256)');\n\n // Set bucket policy to deny external access\n logger.debug('Setting bucket policy...');\n const bucketPolicy = {\n Version: '2012-10-17',\n Statement: [\n {\n Sid: 'DenyExternalAccess',\n Effect: 'Deny',\n Principal: '*',\n Action: 's3:*',\n Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`],\n Condition: {\n StringNotEquals: {\n 'aws:PrincipalAccount': accountId,\n },\n },\n },\n ],\n };\n\n await s3Client.send(\n new PutBucketPolicyCommand({\n Bucket: bucketName,\n Policy: JSON.stringify(bucketPolicy),\n })\n );\n logger.info('\u2713 Set bucket policy (deny external access)');\n\n logger.info('\\n\u2713 Bootstrap completed successfully');\n logger.info(`\\nState bucket: ${bucketName}`);\n logger.info(`Region: ${region}`);\n logger.info('\\nYou can now use cdkd deploy with:');\n logger.info(` --state-bucket ${bucketName}`);\n logger.info(` --region ${region}`);\n } finally {\n awsClients.destroy();\n }\n}\n\n/**\n * Create bootstrap command\n */\nexport function createBootstrapCommand(): Command {\n const cmd = new Command('bootstrap')\n .description('Bootstrap cdkd by creating required S3 bucket for state management')\n .option(\n '--state-bucket <bucket>',\n 'Name of S3 bucket to create for state storage (default: cdkd-state-{accountId}-{region})'\n )\n .option('--force', 'Force reconfiguration of existing bucket', false)\n .action(withErrorHandling(bootstrapCommand));\n\n // Add common options (includes --region, --profile, --verbose)\n commonOptions.forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n", "import { Option } from 'commander';\n\n/**\n * Parse context key=value pairs from CLI arguments into a Record\n */\nexport function parseContextOptions(contextArgs?: string[]): Record<string, string> {\n const context: Record<string, string> = {};\n if (contextArgs) {\n for (const arg of contextArgs) {\n const eqIndex = arg.indexOf('=');\n if (eqIndex > 0) {\n context[arg.substring(0, eqIndex)] = arg.substring(eqIndex + 1);\n }\n }\n }\n return context;\n}\n\n/**\n * Common CLI options\n */\nexport const commonOptions = [\n new Option('--verbose', 'Enable verbose logging').default(false),\n new Option('--region <region>', 'AWS region'),\n new Option('--profile <profile>', 'AWS profile'),\n];\n\n/**\n * App options\n *\n * --app is optional: falls back to CDKD_APP env var, then cdk.json \"app\" field\n */\nexport const appOptions = [\n new Option(\n '--app <command>',\n 'CDK app command (e.g., \"npx ts-node app.ts\"). Falls back to cdk.json or CDKD_APP env'\n ),\n new Option('--output <path>', 'Output directory for synthesis').default('cdk.out'),\n];\n\n/**\n * State backend options\n *\n * --state-bucket is optional: falls back to CDKD_STATE_BUCKET env var,\n * then cdk.json context.cdkd.stateBucket\n */\nexport const stateOptions = [\n new Option(\n '--state-bucket <bucket>',\n 'S3 bucket for state storage. Falls back to CDKD_STATE_BUCKET env or cdk.json'\n ),\n new Option('--state-prefix <prefix>', 'S3 key prefix for state files').default('cdkd'),\n];\n\n/**\n * Stack options\n */\nexport const stackOptions = [new Option('--stack <name>', 'Stack name to operate on')];\n\n/**\n * Deploy options\n */\nexport const deployOptions = [\n new Option('--concurrency <number>', 'Maximum concurrent resource operations')\n .default(10)\n .argParser((value) => parseInt(value, 10)),\n new Option('--stack-concurrency <number>', 'Maximum concurrent stack deployments')\n .default(4)\n .argParser((value) => parseInt(value, 10)),\n new Option(\n '--asset-publish-concurrency <number>',\n 'Maximum concurrent asset publish operations (S3 uploads + ECR push)'\n )\n .default(8)\n .argParser((value) => parseInt(value, 10)),\n new Option('--image-build-concurrency <number>', 'Maximum concurrent Docker image builds')\n .default(4)\n .argParser((value) => parseInt(value, 10)),\n new Option('--dry-run', 'Show changes without applying').default(false),\n new Option('--skip-assets', 'Skip asset publishing').default(false),\n new Option('--no-rollback', 'Skip rollback on deployment failure'),\n new Option('--no-wait', 'Skip waiting for async resources (CloudFront, RDS, etc.)'),\n new Option(\n '-e, --exclusively',\n 'Only deploy requested stacks, do not include dependencies'\n ).default(false),\n];\n\n/**\n * Context options\n *\n * -c / --context can be specified multiple times to pass context key=value pairs\n */\nexport const contextOptions = [\n new Option(\n '-c, --context <key=value...>',\n 'Set context values (can be specified multiple times)'\n ),\n];\n\n/**\n * Destroy options\n */\nexport const destroyOptions = [new Option('--force', 'Skip confirmation prompt').default(false)];\n", "import type { Logger, LogLevel } from '../types/config.js';\n\n/**\n * ANSI color codes\n */\nconst colors = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n} as const;\n\n/**\n * Format timestamp\n */\nfunction formatTimestamp(): string {\n const now = new Date();\n return now.toISOString();\n}\n\n/**\n * Console logger implementation\n *\n * Supports two output modes:\n * - verbose (debug level): timestamps, module prefixes, all details\n * - compact (info level): clean output without timestamps or prefixes\n */\nexport class ConsoleLogger implements Logger {\n constructor(\n private level: LogLevel = 'info',\n private useColors: boolean = true\n ) {}\n\n private shouldLog(level: LogLevel): boolean {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const currentLevelIndex = levels.indexOf(this.level);\n const messageLevelIndex = levels.indexOf(level);\n return messageLevelIndex >= currentLevelIndex;\n }\n\n private formatMessage(level: LogLevel, message: string, ...args: unknown[]): string {\n const formattedArgs = args.length > 0 ? ' ' + args.map((a) => JSON.stringify(a)).join(' ') : '';\n\n // Verbose mode: full timestamps and level\n if (this.level === 'debug') {\n const timestamp = formatTimestamp();\n const levelStr = level.toUpperCase().padEnd(5);\n\n if (this.useColors) {\n const levelColor = {\n debug: colors.gray,\n info: colors.blue,\n warn: colors.yellow,\n error: colors.red,\n }[level];\n\n return `${colors.dim}${timestamp}${colors.reset} ${levelColor}${levelStr}${colors.reset} ${message}${formattedArgs}`;\n }\n\n return `${timestamp} ${levelStr} ${message}${formattedArgs}`;\n }\n\n // Compact mode: clean output\n if (this.useColors) {\n if (level === 'error') {\n return `${colors.red}${message}${formattedArgs}${colors.reset}`;\n }\n if (level === 'warn') {\n return `${colors.yellow}${message}${formattedArgs}${colors.reset}`;\n }\n return `${message}${formattedArgs}`;\n }\n\n return `${message}${formattedArgs}`;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.shouldLog('debug')) {\n console.debug(this.formatMessage('debug', message, ...args));\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.shouldLog('info')) {\n console.info(this.formatMessage('info', message, ...args));\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.shouldLog('warn')) {\n console.warn(this.formatMessage('warn', message, ...args));\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.shouldLog('error')) {\n console.error(this.formatMessage('error', message, ...args));\n }\n }\n\n /**\n * Set log level\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * Create a child logger with a prefix\n *\n * In verbose mode, prefix is shown as [Prefix]. In compact mode, prefix is hidden.\n */\n child(prefix: string): ChildLogger {\n return new ChildLogger(prefix, this.useColors);\n }\n}\n\n/**\n * Child logger that always syncs level from global logger\n */\nclass ChildLogger extends ConsoleLogger {\n constructor(\n private readonly prefix: string,\n useColors: boolean\n ) {\n super('info', useColors);\n }\n\n private syncLevel(): void {\n if (globalLogger) {\n this.setLevel(globalLogger.getLevel());\n }\n }\n\n override debug(message: string, ...args: unknown[]): void {\n this.syncLevel();\n super.debug(`[${this.prefix}] ${message}`, ...args);\n }\n\n override info(message: string, ...args: unknown[]): void {\n this.syncLevel();\n const msg = this.getLevel() === 'debug' ? `[${this.prefix}] ${message}` : message;\n super.info(msg, ...args);\n }\n\n override warn(message: string, ...args: unknown[]): void {\n this.syncLevel();\n const msg = this.getLevel() === 'debug' ? `[${this.prefix}] ${message}` : message;\n super.warn(msg, ...args);\n }\n\n override error(message: string, ...args: unknown[]): void {\n this.syncLevel();\n const msg = this.getLevel() === 'debug' ? `[${this.prefix}] ${message}` : message;\n super.error(msg, ...args);\n }\n}\n\n/**\n * Global logger instance\n */\nlet globalLogger: ConsoleLogger | null = null;\n\n/**\n * Get or create global logger\n */\nexport function getLogger(): ConsoleLogger {\n if (!globalLogger) {\n globalLogger = new ConsoleLogger();\n }\n return globalLogger;\n}\n\n/**\n * Set global logger instance\n */\nexport function setLogger(logger: ConsoleLogger): void {\n globalLogger = logger;\n}\n", "import { getLogger } from './logger.js';\n\n/**\n * Base error class for cdkd\n */\nexport class CdkdError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'CdkdError';\n Object.setPrototypeOf(this, CdkdError.prototype);\n }\n}\n\n/**\n * State management errors\n */\nexport class StateError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'STATE_ERROR', cause);\n this.name = 'StateError';\n Object.setPrototypeOf(this, StateError.prototype);\n }\n}\n\n/**\n * Lock acquisition errors\n */\nexport class LockError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'LOCK_ERROR', cause);\n this.name = 'LockError';\n Object.setPrototypeOf(this, LockError.prototype);\n }\n}\n\n/**\n * Synthesis errors\n */\nexport class SynthesisError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'SYNTHESIS_ERROR', cause);\n this.name = 'SynthesisError';\n Object.setPrototypeOf(this, SynthesisError.prototype);\n }\n}\n\n/**\n * Asset errors\n */\nexport class AssetError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'ASSET_ERROR', cause);\n this.name = 'AssetError';\n Object.setPrototypeOf(this, AssetError.prototype);\n }\n}\n\n/**\n * Resource provisioning errors\n */\nexport class ProvisioningError extends CdkdError {\n constructor(\n message: string,\n public readonly resourceType: string,\n public readonly logicalId: string,\n public readonly physicalId?: string,\n cause?: Error\n ) {\n super(message, 'PROVISIONING_ERROR', cause);\n this.name = 'ProvisioningError';\n Object.setPrototypeOf(this, ProvisioningError.prototype);\n }\n}\n\n/**\n * Dependency resolution errors\n */\nexport class DependencyError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'DEPENDENCY_ERROR', cause);\n this.name = 'DependencyError';\n Object.setPrototypeOf(this, DependencyError.prototype);\n }\n}\n\n/**\n * Configuration errors\n */\nexport class ConfigError extends CdkdError {\n constructor(message: string, cause?: Error) {\n super(message, 'CONFIG_ERROR', cause);\n this.name = 'ConfigError';\n Object.setPrototypeOf(this, ConfigError.prototype);\n }\n}\n\n/**\n * Check if error is a cdkd error\n */\nexport function isCdkdError(error: unknown): error is CdkdError {\n return error instanceof CdkdError;\n}\n\n/**\n * Format error for display\n */\nexport function formatError(error: unknown): string {\n if (isCdkdError(error)) {\n let message = `${error.name}: ${error.message}`;\n if (error.cause) {\n message += `\\nCaused by: ${error.cause.message}`;\n }\n return message;\n }\n\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n\n return String(error);\n}\n\n/**\n * Global error handler\n */\nexport function handleError(error: unknown): never {\n const logger = getLogger();\n logger.error(formatError(error));\n\n if (error instanceof Error && error.stack) {\n logger.debug('Stack trace:', error.stack);\n }\n\n process.exit(1);\n}\n\n/**\n * Wrap async function with error handling\n *\n * Note: Uses `any[]` for args to support Commander.js action handlers\n * which can have various parameter types\n */\nexport function withErrorHandling<Args extends unknown[], Return extends Promise<void> | void>(\n fn: (...args: Args) => Return\n): (...args: Args) => Promise<void> {\n return async (...args: Args): Promise<void> => {\n try {\n await fn(...args);\n } catch (error) {\n handleError(error);\n }\n };\n}\n", "import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * CDK configuration loaded from cdk.json and environment variables\n */\nexport interface CdkConfig {\n app?: string;\n output?: string;\n context?: Record<string, unknown>;\n}\n\n/**\n * cdkd-specific configuration extracted from cdk.json context or environment\n */\nexport interface CdkdConfig {\n stateBucket?: string;\n}\n\n/**\n * Load a JSON config file and return as CdkConfig, or null if not found.\n */\nfunction loadJsonConfig(filePath: string): CdkConfig | null {\n const logger = getLogger();\n\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const config = JSON.parse(content) as CdkConfig;\n logger.debug(`Loaded config from ${filePath}`);\n return config;\n } catch (error) {\n logger.warn(\n `Failed to parse ${filePath}: ${error instanceof Error ? error.message : String(error)}`\n );\n return null;\n }\n}\n\n/**\n * Load cdk.json from the current working directory\n */\nexport function loadCdkJson(cwd?: string): CdkConfig | null {\n const dir = cwd || process.cwd();\n return loadJsonConfig(resolve(dir, 'cdk.json'));\n}\n\n/**\n * Load user-level defaults from ~/.cdk.json\n *\n * CDK CLI reads this as user-level defaults (lowest priority).\n * Context values from ~/.cdk.json are merged below project cdk.json context.\n */\nexport function loadUserCdkJson(): CdkConfig | null {\n return loadJsonConfig(join(homedir(), '.cdk.json'));\n}\n\n/**\n * Resolve the --app option from CLI, cdk.json, or environment\n *\n * Priority: CLI option > CDKD_APP env > cdk.json app field\n */\nexport function resolveApp(cliApp?: string): string | undefined {\n if (cliApp) return cliApp;\n\n const envApp = process.env['CDKD_APP'];\n if (envApp) return envApp;\n\n const cdkJson = loadCdkJson();\n return cdkJson?.app ?? undefined;\n}\n\n/**\n * Resolve the --state-bucket option from CLI, cdk.json context, or environment\n *\n * Priority: CLI option > CDKD_STATE_BUCKET env > cdk.json context.cdkd.stateBucket\n */\nexport function resolveStateBucket(cliBucket?: string): string | undefined {\n if (cliBucket) return cliBucket;\n\n const envBucket = process.env['CDKD_STATE_BUCKET'];\n if (envBucket) return envBucket;\n\n const cdkJson = loadCdkJson();\n const cdkdContext = cdkJson?.context?.['cdkd'] as Record<string, unknown> | undefined;\n const bucket = cdkdContext?.['stateBucket'];\n return typeof bucket === 'string' ? bucket : undefined;\n}\n\n/**\n * Generate default state bucket name from account info\n * Format: cdkd-state-{accountId}-{region}\n */\nexport function getDefaultStateBucketName(accountId: string, region: string): string {\n return `cdkd-state-${accountId}-${region}`;\n}\n\n/**\n * Resolve state bucket with STS fallback\n *\n * Priority: CLI option > CDKD_STATE_BUCKET env > cdk.json > default (cdkd-state-{accountId}-{region})\n *\n * If no explicit bucket is configured, uses STS GetCallerIdentity to generate\n * a default bucket name. Requires AWS credentials to be configured.\n */\nexport async function resolveStateBucketWithDefault(\n cliBucket: string | undefined,\n region: string\n): Promise<string> {\n // Try synchronous resolution first\n const syncResult = resolveStateBucket(cliBucket);\n if (syncResult) return syncResult;\n\n // Fall back to default bucket name from account info\n const logger = getLogger();\n logger.debug('No state bucket specified, resolving default from account...');\n\n const { GetCallerIdentityCommand } = await import('@aws-sdk/client-sts');\n const { getAwsClients } = await import('../utils/aws-clients.js');\n const awsClients = getAwsClients();\n const identity = await awsClients.sts.send(new GetCallerIdentityCommand({}));\n const accountId = identity.Account!;\n const bucketName = getDefaultStateBucketName(accountId, region);\n logger.info(`State bucket: ${bucketName}`);\n return bucketName;\n}\n", "import { Command } from 'commander';\nimport { writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { appOptions, commonOptions, contextOptions, parseContextOptions } from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { Synthesizer, type SynthesisOptions } from '../../synthesis/synthesizer.js';\nimport { AssemblyReader } from '../../synthesis/assembly-reader.js';\nimport { resolveApp } from '../config-loader.js';\n\n/**\n * Synth command implementation\n */\nasync function synthCommand(options: {\n app?: string;\n output: string;\n verbose: boolean;\n region?: string;\n profile?: string;\n context?: string[];\n}): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n // Resolve --app from CLI, env, or cdk.json\n const app = resolveApp(options.app);\n if (!app) {\n throw new Error(\n 'No app command specified. Use --app, set CDKD_APP env var, or add \"app\" to cdk.json'\n );\n }\n options.app = app;\n\n logger.info('Synthesizing CDK app...');\n logger.debug('App command:', options.app);\n logger.debug('Output directory:', options.output);\n\n // Create synthesizer\n const synthesizer = new Synthesizer();\n const assemblyReader = new AssemblyReader();\n\n // Synthesize CDK app\n const context = parseContextOptions(options.context);\n const synthOptions: SynthesisOptions = {\n app: options.app,\n output: options.output,\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n ...(Object.keys(context).length > 0 && { context }),\n };\n\n const result = await synthesizer.synthesize(synthOptions);\n const { stacks, assemblyDir } = result;\n\n // Print YAML template to stdout (like CDK CLI) for single stack\n if (stacks.length === 1) {\n const template = stacks[0]!.template;\n process.stdout.write(toYaml(template));\n }\n\n logger.info(`\\n\u2705 Synthesis complete! Found ${stacks.length} stack(s):`);\n\n for (const stack of stacks) {\n const resourceCount = Object.keys(stack.template.Resources ?? {}).length;\n const outputCount = Object.keys(stack.template.Outputs ?? {}).length;\n\n logger.info(` \u2022 ${stack.stackName}`);\n logger.info(` - Resources: ${resourceCount}`);\n logger.info(` - Outputs: ${outputCount}`);\n logger.info(` - Has assets: ${assemblyReader.hasAssets(stack) ? 'Yes' : 'No'}`);\n\n if (options.verbose) {\n const templatePath = join(options.output, `${stack.stackName}.template.json`);\n writeFileSync(templatePath, JSON.stringify(stack.template, null, 2));\n logger.debug(` - Template written to: ${templatePath}`);\n }\n }\n\n logger.info(`\\nOutput: ${assemblyDir}`);\n}\n\n/**\n * Simple JSON to YAML converter (CDK CLI compatible output)\n */\nfunction toYaml(obj: unknown, indent = 0): string {\n const prefix = ' '.repeat(indent);\n\n if (obj === null || obj === undefined) return 'null\\n';\n if (typeof obj === 'boolean') return `${obj}\\n`;\n if (typeof obj === 'number') return `\"${obj}\"\\n`;\n if (typeof obj === 'string') {\n // Strings that need quoting\n if (obj.includes('\\n')) {\n // Multi-line: use single quotes with escaped content\n return `'${obj.replace(/'/g, \"''\")}'\\n`;\n }\n if (obj.startsWith('{') || obj.startsWith('[') || obj.startsWith('\"')) {\n // JSON-like strings: use single quotes (like CDK CLI)\n return `'${obj.replace(/'/g, \"''\")}'\\n`;\n }\n if (obj.includes('#') || obj === '' || obj === 'true' || obj === 'false' || obj === 'null') {\n return `\"${obj}\"\\n`;\n }\n // Plain string (no quoting needed for colons in values like AWS::S3::Bucket)\n return `${obj}\\n`;\n }\n\n if (Array.isArray(obj)) {\n if (obj.length === 0) return '[]\\n';\n let result = '\\n';\n for (const item of obj) {\n const value = toYaml(item, indent + 1).trimStart();\n result += `${prefix}- ${value}`;\n }\n return result;\n }\n\n if (typeof obj === 'object') {\n const entries = Object.entries(obj as Record<string, unknown>);\n if (entries.length === 0) return '{}\\n';\n let result = '\\n';\n for (const [key, value] of entries) {\n // Keys with special chars need quoting, but AWS:: style keys don't\n const safeKey = key.includes(' ') ? `\"${key}\"` : key;\n if (typeof value === 'object' && value !== null) {\n result += `${prefix}${safeKey}:${toYaml(value, indent + 1)}`;\n } else {\n result += `${prefix}${safeKey}: ${toYaml(value, indent + 1).trimStart()}`;\n }\n }\n return result;\n }\n\n return `${String(obj)}\\n`;\n}\n\n/**\n * Create synth command\n */\nexport function createSynthCommand(): Command {\n const cmd = new Command('synth')\n .description('Synthesize CDK app to CloudFormation template')\n .action(withErrorHandling(synthCommand));\n\n // Add options\n [...commonOptions, ...appOptions, ...contextOptions].forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n", "import { mkdirSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts';\nimport { AppExecutor } from './app-executor.js';\nimport { AssemblyReader, type StackInfo } from './assembly-reader.js';\nimport { ContextStore } from './context-store.js';\nimport { ContextProviderRegistry } from './context-providers/index.js';\nimport type { AssemblyManifest } from '../types/assembly.js';\nimport { loadCdkJson, loadUserCdkJson } from '../cli/config-loader.js';\nimport { getLogger } from '../utils/logger.js';\nimport { SynthesisError } from '../utils/error-handler.js';\n\n/**\n * Synthesis options\n */\nexport interface SynthesisOptions {\n /** CDK app command (e.g., \"npx ts-node app.ts\") */\n app: string;\n\n /** Output directory for synthesis (default: \"cdk.out\") */\n output?: string;\n\n /** AWS profile to use */\n profile?: string;\n\n /** AWS region */\n region?: string;\n\n /** Context key-value pairs (CLI -c/--context) */\n context?: Record<string, string>;\n}\n\n/**\n * Synthesis result\n */\nexport interface SynthesisResult {\n /** Cloud assembly manifest */\n manifest: AssemblyManifest;\n\n /** Assembly directory (absolute path) */\n assemblyDir: string;\n\n /** All stacks in the assembly */\n stacks: StackInfo[];\n}\n\n/**\n * CDK app synthesizer\n *\n * Replaces @aws-cdk/toolkit-lib with self-implemented:\n * - Subprocess execution of CDK app\n * - Cloud assembly manifest parsing\n * - Context provider loop (missing context \u2192 SDK lookup \u2192 re-synthesize)\n */\nexport class Synthesizer {\n private logger = getLogger().child('Synthesizer');\n private appExecutor = new AppExecutor();\n private assemblyReader = new AssemblyReader();\n private contextStore = new ContextStore();\n\n /**\n * Synthesize CDK app to cloud assembly\n *\n * Implements the context provider loop:\n * 1. Merge context (cdk.json context + cdk.context.json + CLI -c)\n * 2. Execute CDK app subprocess\n * 3. Read manifest.json\n * 4. If missing context \u2192 resolve via providers \u2192 save to cdk.context.json \u2192 re-execute\n * 5. Return assembly with stacks\n */\n async synthesize(options: SynthesisOptions): Promise<SynthesisResult> {\n const outputDir = resolve(options.output || 'cdk.out');\n\n // Ensure output directory exists\n mkdirSync(outputDir, { recursive: true });\n\n // Load static context (doesn't change during loop)\n // Priority: defaults < ~/.cdk.json < cdk.json < cdk.context.json < CLI -c\n const userCdkJson = loadUserCdkJson();\n const userContext = (userCdkJson?.context as Record<string, unknown>) ?? {};\n const cdkJson = loadCdkJson();\n const cdkJsonContext = (cdkJson?.context as Record<string, unknown>) ?? {};\n const cliContext = (options.context as Record<string, unknown>) ?? {};\n\n // CDK CLI injects these context values by default for framework compatibility\n const cdkDefaults: Record<string, unknown> = {\n 'aws:cdk:enable-path-metadata': true,\n 'aws:cdk:enable-asset-metadata': true,\n 'aws:cdk:version-reporting': true,\n 'aws:cdk:bundling-stacks': ['**'],\n };\n\n // Resolve AWS account/region for context passing\n const region = options.region || process.env['AWS_REGION'] || process.env['AWS_DEFAULT_REGION'];\n let accountId: string | undefined;\n try {\n const stsClient = new STSClient({ ...(region && { region }) });\n const identity = await stsClient.send(new GetCallerIdentityCommand({}));\n accountId = identity.Account;\n stsClient.destroy();\n } catch {\n this.logger.debug('Could not resolve AWS account ID via STS');\n }\n\n // Context provider loop\n let previousMissingKeys: Set<string> | undefined;\n const contextProviderRegistry = new ContextProviderRegistry({\n ...(region && { region }),\n ...(options.profile && { profile: options.profile }),\n });\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // Load cdk.context.json (re-read each iteration \u2014 providers may have updated it)\n const cdkContextJson = this.contextStore.load();\n\n // Merge context: defaults < ~/.cdk.json < cdk.json < cdk.context.json < CLI -c (CLI wins)\n const mergedContext: Record<string, unknown> = {\n ...cdkDefaults,\n ...userContext,\n ...cdkJsonContext,\n ...cdkContextJson,\n ...cliContext,\n };\n\n // Execute CDK app\n this.logger.debug('Executing CDK app...');\n await this.appExecutor.execute({\n app: options.app,\n outputDir,\n context: mergedContext,\n ...(region && { region }),\n ...(accountId && { accountId }),\n });\n\n // Read manifest\n const manifest = this.assemblyReader.readManifest(outputDir);\n\n // Check for missing context\n if (!manifest.missing || manifest.missing.length === 0) {\n // Synthesis complete\n const stacks = this.assemblyReader.getAllStacks(outputDir, manifest);\n this.logger.debug(`Synthesis complete: ${stacks.length} stack(s)`);\n\n return { manifest, assemblyDir: outputDir, stacks };\n }\n\n // Missing context detected\n const missingKeys = new Set(manifest.missing.map((m) => m.key));\n this.logger.debug(`Missing context: ${manifest.missing.length} value(s)`);\n\n // Check for no progress (same missing keys as last iteration)\n if (previousMissingKeys && setsEqual(missingKeys, previousMissingKeys)) {\n throw new SynthesisError(\n 'Context resolution made no progress. ' +\n `Missing context keys: ${[...missingKeys].join(', ')}. ` +\n 'Ensure cdk.context.json is correctly configured or required AWS permissions are granted.'\n );\n }\n previousMissingKeys = missingKeys;\n\n // Resolve missing context via providers\n this.logger.info('Resolving missing context...');\n const resolved = await contextProviderRegistry.resolve(manifest.missing);\n\n // Save resolved values to cdk.context.json\n this.contextStore.save(resolved);\n\n // Loop: re-execute CDK app with updated context\n this.logger.debug('Re-synthesizing with resolved context...');\n }\n }\n\n /**\n * List stack names in CDK app\n */\n async listStacks(options: SynthesisOptions): Promise<string[]> {\n const result = await this.synthesize(options);\n return result.stacks.map((s) => s.stackName);\n }\n}\n\n/**\n * Check if two sets contain the same elements\n */\nfunction setsEqual<T>(a: Set<T>, b: Set<T>): boolean {\n if (a.size !== b.size) return false;\n for (const item of a) {\n if (!b.has(item)) return false;\n }\n return true;\n}\n", "import { spawn } from 'node:child_process';\nimport { writeFileSync, mkdtempSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { getLogger } from '../utils/logger.js';\nimport { SynthesisError } from '../utils/error-handler.js';\n\n/**\n * Options for CDK app execution\n */\nexport interface AppExecutorOptions {\n /** CDK app command (e.g., \"npx ts-node app.ts\") */\n app: string;\n\n /** Output directory for cloud assembly (default: \"cdk.out\") */\n outputDir: string;\n\n /** Context key-value pairs to pass to the app */\n context: Record<string, unknown>;\n\n /** AWS region */\n region?: string;\n\n /** AWS account ID */\n accountId?: string;\n}\n\n/** Cloud assembly schema version compatible with CDK v2 */\nconst CDK_ASM_VERSION = '38.0.0';\n\n/** Maximum context size before overflow to temp file (32KB) */\nconst CONTEXT_OVERFLOW_LIMIT = 32 * 1024;\n\n/**\n * Executes CDK app as subprocess to produce a cloud assembly\n */\nexport class AppExecutor {\n private logger = getLogger().child('AppExecutor');\n\n /**\n * Execute CDK app and produce cloud assembly in outputDir\n */\n async execute(options: AppExecutorOptions): Promise<void> {\n const { app, outputDir, context, region, accountId } = options;\n\n this.logger.debug('Executing CDK app:', app);\n this.logger.debug('Output directory:', outputDir);\n\n // Build environment variables\n const env: Record<string, string> = {\n ...process.env,\n CDK_OUTDIR: outputDir,\n };\n\n if (region) {\n env['CDK_DEFAULT_REGION'] = region;\n }\n if (accountId) {\n env['CDK_DEFAULT_ACCOUNT'] = accountId;\n }\n\n // Cloud assembly version and CLI version for compatibility\n env['CDK_CLI_ASM_VERSION'] = CDK_ASM_VERSION;\n env['CDK_CLI_VERSION'] = '2.1000.0';\n\n // Pass context via environment variable or temp file\n let contextTempDir: string | undefined;\n const contextJson = JSON.stringify(context);\n\n if (Buffer.byteLength(contextJson, 'utf-8') > CONTEXT_OVERFLOW_LIMIT) {\n // Context too large: write to temp file\n contextTempDir = mkdtempSync(join(tmpdir(), 'cdkd-context-'));\n const contextFile = join(contextTempDir, 'context.json');\n writeFileSync(contextFile, contextJson, 'utf-8');\n env['CONTEXT_OVERFLOW_LOCATION_ENV'] = contextFile;\n this.logger.debug('Context overflow: written to temp file');\n } else {\n env['CDK_CONTEXT_JSON'] = contextJson;\n }\n\n // Determine executable\n const commandLine = this.guessExecutable(app);\n this.logger.debug('Command line:', commandLine);\n\n try {\n await this.spawn(commandLine, env);\n this.logger.debug('CDK app execution completed');\n } finally {\n // Clean up temp context file\n if (contextTempDir) {\n try {\n rmSync(contextTempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n }\n\n /**\n * Determine how to execute the app command\n * - If it's a .js file, prepend node\n * - Otherwise execute as shell command\n */\n private guessExecutable(app: string): string {\n const trimmed = app.trim();\n\n // If it ends with .js, prepend the current node executable\n if (trimmed.endsWith('.js') || trimmed.split(/\\s+/)[0]?.endsWith('.js')) {\n const parts = trimmed.split(/\\s+/);\n parts[0] = `\"${process.execPath}\" \"${parts[0]}\"`;\n return parts.join(' ');\n }\n\n return trimmed;\n }\n\n /**\n * Spawn subprocess and wait for completion\n */\n private spawn(commandLine: string, env: Record<string, string>): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(commandLine, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env,\n cwd: process.cwd(),\n });\n\n const stderrChunks: string[] = [];\n\n proc.stdout?.on('data', (data: Buffer) => {\n const line = data.toString().trim();\n if (line) {\n this.logger.debug('[app stdout]', line);\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const line = data.toString().trim();\n if (line) {\n stderrChunks.push(line);\n // CDK bundling progress and warnings come through stderr\n this.logger.info(line);\n }\n });\n\n proc.on('error', (error) => {\n reject(new SynthesisError(`Failed to execute CDK app: ${error.message}`, error));\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n const stderr = stderrChunks.join('\\n');\n reject(\n new SynthesisError(\n `CDK app exited with code ${code}${stderr ? `\\n\\nstderr:\\n${stderr}` : ''}`\n )\n );\n }\n });\n });\n }\n}\n", "import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type {\n AssemblyManifest,\n ArtifactManifest,\n StackArtifactProperties,\n AssetManifestArtifactProperties,\n ArtifactEnvironment,\n} from '../types/assembly.js';\nimport { parseEnvironment } from '../types/assembly.js';\nimport type { CloudFormationTemplate } from '../types/resource.js';\nimport { getLogger } from '../utils/logger.js';\nimport { SynthesisError } from '../utils/error-handler.js';\n\n/**\n * Stack information extracted from cloud assembly\n */\nexport interface StackInfo {\n /** Stack name */\n stackName: string;\n\n /** Artifact ID in manifest */\n artifactId: string;\n\n /** CloudFormation template */\n template: CloudFormationTemplate;\n\n /** Asset manifest file path (absolute) */\n assetManifestPath?: string | undefined;\n\n /** Stack dependency names (other stacks this stack depends on) */\n dependencyNames: string[];\n\n /** Target region from CDK environment */\n region?: string | undefined;\n\n /** Target account from CDK environment */\n account?: string | undefined;\n}\n\n/**\n * Reads and parses Cloud Assembly from cdk.out directory\n */\nexport class AssemblyReader {\n private logger = getLogger().child('AssemblyReader');\n\n /**\n * Read manifest.json from assembly directory\n */\n readManifest(assemblyDir: string): AssemblyManifest {\n const manifestPath = join(assemblyDir, 'manifest.json');\n\n try {\n const content = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as AssemblyManifest;\n this.logger.debug(`Loaded manifest: version=${manifest.version}`);\n return manifest;\n } catch (error) {\n throw new SynthesisError(\n `Failed to read cloud assembly manifest from ${manifestPath}: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get all stacks from assembly (recursively traverses nested assemblies / Stages)\n */\n getAllStacks(assemblyDir: string, manifest: AssemblyManifest): StackInfo[] {\n if (!manifest.artifacts) {\n this.logger.warn('No artifacts found in manifest');\n return [];\n }\n\n // Build map of artifact ID \u2192 asset manifest path\n const assetManifestMap = this.buildAssetManifestMap(assemblyDir, manifest);\n\n const stacks: StackInfo[] = [];\n\n for (const [artifactId, artifact] of Object.entries(manifest.artifacts)) {\n if (artifact.type === 'aws:cloudformation:stack') {\n const stackInfo = this.extractStackInfo(\n assemblyDir,\n artifactId,\n artifact,\n manifest,\n assetManifestMap\n );\n stacks.push(stackInfo);\n } else if (artifact.type === 'cdk:cloud-assembly') {\n // Nested assembly (Stage) \u2014 recurse into subdirectory\n const props = artifact.properties as { directoryName?: string } | undefined;\n if (props?.directoryName) {\n const nestedDir = join(assemblyDir, props.directoryName);\n try {\n const nestedManifest = this.readManifest(nestedDir);\n const nestedStacks = this.getAllStacks(nestedDir, nestedManifest);\n stacks.push(...nestedStacks);\n } catch (error) {\n this.logger.warn(\n `Failed to read nested assembly '${props.directoryName}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n }\n\n this.logger.debug(`Found ${stacks.length} stack(s) in assembly`);\n return stacks;\n }\n\n /**\n * Get a specific stack by name\n */\n getStack(assemblyDir: string, manifest: AssemblyManifest, stackName: string): StackInfo {\n const stacks = this.getAllStacks(assemblyDir, manifest);\n const stack = stacks.find((s) => s.stackName === stackName);\n\n if (!stack) {\n throw new SynthesisError(\n `Stack '${stackName}' not found in assembly. Available: ${stacks.map((s) => s.stackName).join(', ')}`\n );\n }\n\n return stack;\n }\n\n /**\n * Get template for a specific stack\n */\n getTemplate(\n assemblyDir: string,\n manifest: AssemblyManifest,\n stackName: string\n ): CloudFormationTemplate {\n return this.getStack(assemblyDir, manifest, stackName).template;\n }\n\n /**\n * Build map: stack artifact ID \u2192 asset manifest absolute path\n */\n private buildAssetManifestMap(\n assemblyDir: string,\n manifest: AssemblyManifest\n ): Map<string, string> {\n const map = new Map<string, string>();\n\n if (!manifest.artifacts) return map;\n\n for (const [artifactId, artifact] of Object.entries(manifest.artifacts)) {\n if (artifact.type !== 'cdk:asset-manifest') continue;\n\n const props = artifact.properties as AssetManifestArtifactProperties | undefined;\n if (props?.file) {\n map.set(artifactId, join(assemblyDir, props.file));\n }\n }\n\n return map;\n }\n\n /**\n * Extract stack info from artifact\n */\n private extractStackInfo(\n assemblyDir: string,\n artifactId: string,\n artifact: ArtifactManifest,\n manifest: AssemblyManifest,\n assetManifestMap: Map<string, string>\n ): StackInfo {\n const props = artifact.properties as StackArtifactProperties | undefined;\n const stackName = props?.stackName || artifactId;\n\n // Load template\n const templateFile = props?.templateFile;\n if (!templateFile) {\n throw new SynthesisError(`Stack '${stackName}' has no templateFile property`);\n }\n\n const templatePath = join(assemblyDir, templateFile);\n let template: CloudFormationTemplate;\n try {\n const content = readFileSync(templatePath, 'utf-8');\n template = JSON.parse(content) as CloudFormationTemplate;\n } catch (error) {\n throw new SynthesisError(\n `Failed to read template for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n\n this.logger.debug(\n `Stack: ${stackName}, Resources: ${Object.keys(template.Resources ?? {}).length}`\n );\n\n // Find asset manifest for this stack\n let assetManifestPath: string | undefined;\n if (artifact.dependencies) {\n for (const depId of artifact.dependencies) {\n if (assetManifestMap.has(depId)) {\n assetManifestPath = assetManifestMap.get(depId);\n this.logger.debug(`Found asset manifest for ${stackName}: ${depId}`);\n break;\n }\n }\n }\n\n // Extract stack dependencies (other stacks, not asset manifests)\n const dependencyNames: string[] = [];\n if (artifact.dependencies && manifest.artifacts) {\n for (const depId of artifact.dependencies) {\n const depArtifact = manifest.artifacts[depId];\n if (depArtifact?.type === 'aws:cloudformation:stack') {\n const depProps = depArtifact.properties as StackArtifactProperties | undefined;\n const depName = depProps?.stackName || depId;\n if (depName !== stackName) {\n dependencyNames.push(depName);\n }\n }\n }\n }\n\n if (dependencyNames.length > 0) {\n this.logger.debug(`Stack '${stackName}' depends on: [${dependencyNames.join(', ')}]`);\n }\n\n // Parse environment\n let env: ArtifactEnvironment | undefined;\n if (artifact.environment) {\n env = parseEnvironment(artifact.environment);\n }\n\n return {\n stackName,\n artifactId,\n template,\n assetManifestPath,\n dependencyNames,\n region: env?.region !== 'unknown-region' ? env?.region : undefined,\n account: env?.account !== 'unknown-account' ? env?.account : undefined,\n };\n }\n\n /**\n * Check if stack has assets\n */\n hasAssets(stackInfo: StackInfo): boolean {\n return stackInfo.assetManifestPath !== undefined;\n }\n}\n", "/**\n * Cloud Assembly types\n *\n * Based on CDK Cloud Assembly manifest format.\n * These types replace @aws-cdk/cloud-assembly-api dependency.\n */\n\n/**\n * Cloud Assembly manifest (manifest.json)\n */\nexport interface AssemblyManifest {\n /** Cloud assembly schema version */\n version: string;\n\n /** Artifacts in the assembly */\n artifacts?: Record<string, ArtifactManifest>;\n\n /** Missing context values that need to be resolved */\n missing?: MissingContext[];\n\n /** Runtime information */\n runtime?: RuntimeInfo;\n}\n\n/**\n * Artifact manifest entry\n */\nexport interface ArtifactManifest {\n /** Artifact type */\n type: ArtifactType;\n\n /** Target environment (e.g., \"aws://123456789012/us-east-1\") */\n environment?: string;\n\n /** Artifact-specific properties */\n properties?: Record<string, unknown>;\n\n /** Dependencies on other artifacts (by artifact ID) */\n dependencies?: string[];\n\n /** Metadata entries */\n metadata?: Record<string, MetadataEntry[]>;\n}\n\n/**\n * Artifact types\n */\nexport type ArtifactType =\n | 'aws:cloudformation:stack'\n | 'cdk:asset-manifest'\n | 'cdk:tree'\n | 'cdk:cloud-assembly'\n | 'cdk:feature-flag-report';\n\n/**\n * CloudFormation stack artifact properties\n */\nexport interface StackArtifactProperties {\n /** Path to template file relative to assembly directory */\n templateFile: string;\n\n /** Physical stack name */\n stackName?: string;\n\n /** Stack parameters */\n parameters?: Record<string, string>;\n\n /** Stack tags */\n tags?: Record<string, string>;\n\n /** Role to assume for deployment */\n assumeRoleArn?: string;\n\n /** CloudFormation execution role */\n cloudFormationExecutionRoleArn?: string;\n\n /** Termination protection */\n terminationProtection?: boolean;\n}\n\n/**\n * Asset manifest artifact properties\n */\nexport interface AssetManifestArtifactProperties {\n /** Path to asset manifest file relative to assembly directory */\n file: string;\n\n /** Required bootstrap stack version */\n requiresBootstrapStackVersion?: number;\n}\n\n/**\n * Missing context entry\n */\nexport interface MissingContext {\n /** Context key */\n key: string;\n\n /** Context provider type */\n provider: string;\n\n /** Provider-specific query properties */\n props: ContextQueryProperties;\n}\n\n/**\n * Base context query properties (all providers extend this)\n */\nexport interface ContextQueryProperties {\n /** Target AWS account */\n account: string;\n\n /** Target AWS region */\n region: string;\n\n /** Role to assume for lookup */\n lookupRoleArn?: string;\n\n /** Additional properties (provider-specific) */\n [key: string]: unknown;\n}\n\n/**\n * Metadata entry in artifact\n */\nexport interface MetadataEntry {\n type: string;\n data?: unknown;\n trace?: string[];\n}\n\n/**\n * Runtime information\n */\nexport interface RuntimeInfo {\n libraries?: Record<string, string>;\n}\n\n/**\n * Parsed environment from artifact\n */\nexport interface ArtifactEnvironment {\n account: string;\n region: string;\n}\n\n/**\n * Parse environment string \"aws://account/region\"\n */\nexport function parseEnvironment(env: string): ArtifactEnvironment {\n const match = env.match(/^aws:\\/\\/([^/]+)\\/(.+)$/);\n if (!match) {\n return { account: 'unknown-account', region: 'unknown-region' };\n }\n return {\n account: match[1] === 'unknown-account' ? 'unknown-account' : match[1]!,\n region: match[2] === 'unknown-region' ? 'unknown-region' : match[2]!,\n };\n}\n", "import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { getLogger } from '../utils/logger.js';\n\nconst CDK_CONTEXT_FILE = 'cdk.context.json';\n\n/**\n * Manages reading and writing of cdk.context.json\n *\n * Context values resolved by context providers are persisted here\n * so they don't need to be re-fetched on subsequent synthesis runs.\n * Format is compatible with CDK CLI.\n */\nexport class ContextStore {\n private logger = getLogger().child('ContextStore');\n\n /**\n * Load context values from cdk.context.json\n *\n * @param cwd Working directory (default: process.cwd())\n * @returns Context key-value map, or empty object if file doesn't exist\n */\n load(cwd?: string): Record<string, unknown> {\n const filePath = resolve(cwd || process.cwd(), CDK_CONTEXT_FILE);\n\n if (!existsSync(filePath)) {\n this.logger.debug('No cdk.context.json found');\n return {};\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const context = JSON.parse(content) as Record<string, unknown>;\n this.logger.debug(\n `Loaded ${Object.keys(context).length} context value(s) from cdk.context.json`\n );\n return context;\n } catch (error) {\n this.logger.warn(\n `Failed to parse cdk.context.json: ${error instanceof Error ? error.message : String(error)}`\n );\n return {};\n }\n }\n\n /**\n * Save resolved context values to cdk.context.json\n *\n * Merges with existing values. Transient values (errors) are excluded.\n *\n * @param updates Key-value pairs to save\n * @param cwd Working directory (default: process.cwd())\n */\n save(updates: Record<string, unknown>, cwd?: string): void {\n const filePath = resolve(cwd || process.cwd(), CDK_CONTEXT_FILE);\n\n // Load existing values\n const existing = this.load(cwd);\n\n // Merge, excluding transient values (provider errors)\n for (const [key, value] of Object.entries(updates)) {\n if (this.isTransient(value)) {\n this.logger.debug(`Skipping transient context value for key: ${key}`);\n continue;\n }\n existing[key] = value;\n }\n\n // Write back\n writeFileSync(filePath, JSON.stringify(existing, null, 2) + '\\n', 'utf-8');\n this.logger.debug(`Saved ${Object.keys(updates).length} context value(s) to cdk.context.json`);\n }\n\n /**\n * Check if a context value is transient (should not be persisted)\n *\n * CDK CLI marks provider errors with $dontSaveContext: true\n */\n private isTransient(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) return false;\n return (value as Record<string, unknown>)['$dontSaveContext'] === true;\n }\n}\n", "import { EC2Client, DescribeAvailabilityZonesCommand } from '@aws-sdk/client-ec2';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Availability Zones context provider\n *\n * Returns available AZ names for a region.\n * CDK provider type: \"availability-zones\"\n */\nexport class AZContextProvider implements ContextProvider {\n private logger = getLogger().child('AZContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<string[]> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n\n this.logger.debug(`Fetching availability zones for region: ${region}`);\n\n const client = new EC2Client({\n ...(region && { region }),\n });\n\n try {\n const response = await client.send(new DescribeAvailabilityZonesCommand({}));\n\n const azs = (response.AvailabilityZones ?? [])\n .filter((az) => az.State === 'available')\n .map((az) => az.ZoneName!)\n .filter(Boolean)\n .sort();\n\n this.logger.debug(`Found ${azs.length} availability zones: ${azs.join(', ')}`);\n return azs;\n } finally {\n client.destroy();\n }\n }\n}\n", "import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * SSM Parameter context provider\n *\n * Reads SSM parameter values.\n * CDK provider type: \"ssm\"\n */\nexport class SSMContextProvider implements ContextProvider {\n private logger = getLogger().child('SSMContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const parameterName = props['parameterName'] as string;\n\n if (!parameterName) {\n throw new Error('SSM context provider requires parameterName property');\n }\n\n this.logger.debug(`Reading SSM parameter: ${parameterName} (region: ${region})`);\n\n const client = new SSMClient({\n ...(region && { region }),\n });\n\n try {\n const response = await client.send(new GetParameterCommand({ Name: parameterName }));\n\n if (!response.Parameter || response.Parameter.Value === undefined) {\n // Check if we should suppress this error\n const suppressError = props['ignoreErrorOnMissingContext'] === true;\n if (suppressError && 'dummyValue' in props) {\n this.logger.debug(`SSM parameter not found, returning dummy value`);\n return props['dummyValue'];\n }\n throw new Error(`SSM parameter not found: ${parameterName}`);\n }\n\n this.logger.debug(`SSM parameter resolved: ${parameterName}`);\n return response.Parameter.Value;\n } finally {\n client.destroy();\n }\n }\n}\n", "import {\n Route53Client,\n ListHostedZonesByNameCommand,\n GetHostedZoneCommand,\n} from '@aws-sdk/client-route-53';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Hosted Zone context provider\n *\n * Looks up Route53 hosted zones by domain name.\n * CDK provider type: \"hosted-zone\"\n */\nexport class HostedZoneContextProvider implements ContextProvider {\n private logger = getLogger().child('HostedZoneContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const domainName = props['domainName'] as string;\n const privateZone = props['privateZone'] as boolean | undefined;\n const vpcId = props['vpcId'] as string | undefined;\n\n if (!domainName) {\n throw new Error('Hosted zone context provider requires domainName property');\n }\n\n this.logger.debug(`Looking up hosted zone: ${domainName} (private: ${privateZone})`);\n\n const client = new Route53Client({\n ...(region && { region }),\n });\n\n try {\n const response = await client.send(\n new ListHostedZonesByNameCommand({\n DNSName: domainName,\n MaxItems: 10,\n })\n );\n\n const zones = response.HostedZones ?? [];\n\n // Filter by domain name (exact match with trailing dot)\n const normalizedDomain = domainName.endsWith('.') ? domainName : `${domainName}.`;\n const matching = zones.filter((z) => z.Name === normalizedDomain);\n\n // Filter by private/public\n let filtered = matching;\n if (privateZone !== undefined) {\n filtered = matching.filter((z) => z.Config?.PrivateZone === privateZone);\n }\n\n // Filter by VPC (for private zones)\n if (vpcId && filtered.length > 0) {\n const vpcFiltered = [];\n for (const zone of filtered) {\n const zoneDetail = await client.send(new GetHostedZoneCommand({ Id: zone.Id }));\n const zoneVpcs = zoneDetail.VPCs ?? [];\n if (zoneVpcs.some((v) => v.VPCId === vpcId)) {\n vpcFiltered.push(zone);\n }\n }\n filtered = vpcFiltered;\n }\n\n if (filtered.length === 0) {\n throw new Error(\n `No hosted zone found for domain: ${domainName}` +\n (privateZone !== undefined ? ` (private: ${privateZone})` : '') +\n (vpcId ? ` (vpcId: ${vpcId})` : '')\n );\n }\n\n if (filtered.length > 1) {\n throw new Error(\n `Multiple hosted zones found for domain: ${domainName}. ` +\n `Found: ${filtered.map((z) => z.Id).join(', ')}`\n );\n }\n\n const zone = filtered[0]!;\n // Strip /hostedzone/ prefix from ID\n const zoneId = zone.Id!.replace('/hostedzone/', '');\n\n this.logger.debug(`Resolved hosted zone: ${zoneId} (${zone.Name})`);\n\n return {\n Id: zoneId,\n Name: zone.Name,\n };\n } finally {\n client.destroy();\n }\n }\n}\n", "import {\n EC2Client,\n DescribeVpcsCommand,\n DescribeSubnetsCommand,\n DescribeRouteTablesCommand,\n DescribeVpnGatewaysCommand,\n type Filter,\n type Subnet,\n} from '@aws-sdk/client-ec2';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * VPC context provider\n *\n * Discovers VPC details including subnets, route tables, and AZs.\n * CDK provider type: \"vpc-provider\"\n */\nexport class VpcContextProvider implements ContextProvider {\n private logger = getLogger().child('VpcContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const filter = props['filter'] as Record<string, string> | undefined;\n const returnAsymmetricSubnets = props['returnAsymmetricSubnets'] as boolean | undefined;\n const subnetGroupNameTag = (props['subnetGroupNameTag'] as string) || 'aws-cdk:subnet-name';\n const returnVpnGateways = props['returnVpnGateways'] as boolean | undefined;\n\n this.logger.debug(`Looking up VPC (region: ${region}, filter: ${JSON.stringify(filter)})`);\n\n const client = new EC2Client({\n ...(region && { region }),\n });\n\n try {\n // 1. Find VPC\n const vpcFilters: Filter[] = filter\n ? Object.entries(filter).map(([name, value]) => ({\n Name: name,\n Values: [String(value)],\n }))\n : [];\n\n const vpcsResponse = await client.send(new DescribeVpcsCommand({ Filters: vpcFilters }));\n\n const vpcs = vpcsResponse.Vpcs ?? [];\n if (vpcs.length === 0) {\n throw new Error(`No VPC found matching filter: ${JSON.stringify(filter)}`);\n }\n if (vpcs.length > 1) {\n throw new Error(\n `Multiple VPCs found matching filter: ${JSON.stringify(filter)}. ` +\n `Found: ${vpcs.map((v) => v.VpcId).join(', ')}`\n );\n }\n\n const vpc = vpcs[0]!;\n const vpcId = vpc.VpcId!;\n this.logger.debug(`Found VPC: ${vpcId}`);\n\n // 2. Get subnets\n const subnetsResponse = await client.send(\n new DescribeSubnetsCommand({\n Filters: [{ Name: 'vpc-id', Values: [vpcId] }],\n })\n );\n const subnets = subnetsResponse.Subnets ?? [];\n\n // 3. Get route tables\n const rtResponse = await client.send(\n new DescribeRouteTablesCommand({\n Filters: [{ Name: 'vpc-id', Values: [vpcId] }],\n })\n );\n const routeTables = rtResponse.RouteTables ?? [];\n\n // Build subnet \u2192 route table mapping\n const subnetRouteTableMap = new Map<string, string>();\n let mainRouteTableId: string | undefined;\n for (const rt of routeTables) {\n for (const assoc of rt.Associations ?? []) {\n if (assoc.Main) {\n mainRouteTableId = rt.RouteTableId;\n }\n if (assoc.SubnetId && rt.RouteTableId) {\n subnetRouteTableMap.set(assoc.SubnetId, rt.RouteTableId);\n }\n }\n }\n\n // 4. Classify subnets\n const routeTableInfos = routeTables.map((rt) => ({\n routeTableId: rt.RouteTableId ?? '',\n routes: (rt.Routes ?? []).map((r) => ({\n gatewayId: r.GatewayId,\n natGatewayId: r.NatGatewayId,\n })),\n }));\n\n const classifiedSubnets = this.classifySubnets(\n subnets,\n subnetRouteTableMap,\n mainRouteTableId,\n routeTableInfos,\n subnetGroupNameTag\n );\n\n // Sort by AZ for consistent ordering\n const sortByAz = (a: SubnetInfo, b: SubnetInfo) => a.az.localeCompare(b.az);\n\n const publicSubnets = classifiedSubnets.filter((s) => s.type === 'Public').sort(sortByAz);\n const privateSubnets = classifiedSubnets.filter((s) => s.type === 'Private').sort(sortByAz);\n const isolatedSubnets = classifiedSubnets.filter((s) => s.type === 'Isolated').sort(sortByAz);\n\n // 5. Get VPN gateway (optional)\n let vpnGatewayId: string | undefined;\n if (returnVpnGateways !== false) {\n const vpnResponse = await client.send(\n new DescribeVpnGatewaysCommand({\n Filters: [\n { Name: 'attachment.vpc-id', Values: [vpcId] },\n { Name: 'attachment.state', Values: ['attached'] },\n ],\n })\n );\n vpnGatewayId = vpnResponse.VpnGateways?.[0]?.VpnGatewayId;\n }\n\n // 6. Build result\n const azs = [...new Set(subnets.map((s) => s.AvailabilityZone!))].sort();\n\n const result: Record<string, unknown> = {\n vpcId,\n vpcCidrBlock: vpc.CidrBlock,\n ownerAccountId: vpc.OwnerId,\n availabilityZones: azs,\n publicSubnetIds: publicSubnets.map((s) => s.subnetId),\n publicSubnetNames: publicSubnets.map((s) => s.name),\n publicSubnetRouteTableIds: publicSubnets.map((s) => s.routeTableId),\n privateSubnetIds: privateSubnets.map((s) => s.subnetId),\n privateSubnetNames: privateSubnets.map((s) => s.name),\n privateSubnetRouteTableIds: privateSubnets.map((s) => s.routeTableId),\n isolatedSubnetIds: isolatedSubnets.map((s) => s.subnetId),\n isolatedSubnetNames: isolatedSubnets.map((s) => s.name),\n isolatedSubnetRouteTableIds: isolatedSubnets.map((s) => s.routeTableId),\n };\n\n if (vpnGatewayId) {\n result['vpnGatewayId'] = vpnGatewayId;\n }\n\n if (returnAsymmetricSubnets) {\n result['subnetGroups'] = this.buildSubnetGroups(classifiedSubnets);\n }\n\n this.logger.debug(\n `VPC ${vpcId}: ${publicSubnets.length} public, ${privateSubnets.length} private, ${isolatedSubnets.length} isolated subnets`\n );\n\n return result;\n } finally {\n client.destroy();\n }\n }\n\n /**\n * Classify subnets as Public, Private, or Isolated\n */\n private classifySubnets(\n subnets: Subnet[],\n subnetRouteTableMap: Map<string, string>,\n mainRouteTableId: string | undefined,\n routeTables: {\n routeTableId: string;\n routes: { gatewayId?: string | undefined; natGatewayId?: string | undefined }[];\n }[],\n subnetGroupNameTag: string\n ): SubnetInfo[] {\n // Build route table \u2192 has IGW/NAT mapping\n const rtHasIgw = new Map<string, boolean>();\n const rtHasNat = new Map<string, boolean>();\n for (const rt of routeTables) {\n const hasIgw = rt.routes.some((r) => r.gatewayId?.startsWith('igw-'));\n const hasNat = rt.routes.some((r) => r.natGatewayId?.startsWith('nat-'));\n rtHasIgw.set(rt.routeTableId, hasIgw);\n rtHasNat.set(rt.routeTableId, hasNat);\n }\n\n return subnets.map((subnet) => {\n const subnetId = subnet.SubnetId!;\n const az = subnet.AvailabilityZone!;\n const routeTableId = subnetRouteTableMap.get(subnetId) || mainRouteTableId || '';\n\n // Determine type from tags first\n const tags = subnet.Tags ?? [];\n const nameTag = tags.find((t) => t.Key === subnetGroupNameTag);\n let name = nameTag?.Value || '';\n\n // Determine type\n let type: 'Public' | 'Private' | 'Isolated';\n if (nameTag?.Value) {\n // Trust tag-based classification\n const lowerName = nameTag.Value.toLowerCase();\n if (lowerName.includes('public')) {\n type = 'Public';\n } else if (lowerName.includes('private')) {\n type = 'Private';\n } else if (lowerName.includes('isolated')) {\n type = 'Isolated';\n } else {\n // Fall back to route analysis\n type = this.classifyByRoute(routeTableId, rtHasIgw, rtHasNat, subnet);\n }\n } else {\n type = this.classifyByRoute(routeTableId, rtHasIgw, rtHasNat, subnet);\n name = type;\n }\n\n return { subnetId, az, routeTableId, type, name };\n });\n }\n\n private classifyByRoute(\n routeTableId: string,\n rtHasIgw: Map<string, boolean>,\n rtHasNat: Map<string, boolean>,\n subnet: Subnet\n ): 'Public' | 'Private' | 'Isolated' {\n if (rtHasIgw.get(routeTableId) || subnet.MapPublicIpOnLaunch) {\n return 'Public';\n }\n if (rtHasNat.get(routeTableId)) {\n return 'Private';\n }\n return 'Isolated';\n }\n\n /**\n * Build subnet groups for asymmetric subnet support\n */\n private buildSubnetGroups(subnets: SubnetInfo[]): unknown[] {\n const groups = new Map<string, SubnetInfo[]>();\n for (const subnet of subnets) {\n const key = `${subnet.type}/${subnet.name}`;\n const group = groups.get(key) ?? [];\n group.push(subnet);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([, groupSubnets]) => ({\n name: groupSubnets[0]!.name,\n type: groupSubnets[0]!.type,\n subnets: groupSubnets\n .sort((a, b) => a.az.localeCompare(b.az))\n .map((s) => ({\n subnetId: s.subnetId,\n availabilityZone: s.az,\n routeTableId: s.routeTableId,\n })),\n }));\n }\n}\n\ninterface SubnetInfo {\n subnetId: string;\n az: string;\n routeTableId: string;\n type: 'Public' | 'Private' | 'Isolated';\n name: string;\n}\n", "import {\n CloudControlClient,\n GetResourceCommand,\n ListResourcesCommand,\n} from '@aws-sdk/client-cloudcontrol';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Cloud Control API context provider\n *\n * Generic provider that uses Cloud Control API to lookup any resource type.\n * CDK provider type: \"cc-api-provider\"\n *\n * Used by CDK for lookups like IAM Roles, ECR repositories, RDS instances, etc.\n */\nexport class CcApiContextProvider implements ContextProvider {\n private logger = getLogger().child('CcApiContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const typeName = props['typeName'] as string;\n const exactIdentifier = props['exactIdentifier'] as string | undefined;\n const propertiesToReturn = (props['propertiesToReturn'] as string[]) || [];\n const propertyMatch = props['propertyMatch'] as Record<string, unknown> | undefined;\n const expectedMatchCount = (props['expectedMatchCount'] as string) || 'exactly-one';\n const dummyValue = props['dummyValue'];\n const ignoreErrorOnMissingContext = props['ignoreErrorOnMissingContext'] as boolean | undefined;\n\n if (!typeName) {\n throw new Error('CC API context provider requires typeName property');\n }\n\n this.logger.debug(\n `CC API lookup: ${typeName}${exactIdentifier ? ` (id: ${exactIdentifier})` : ''} (region: ${region})`\n );\n\n const client = new CloudControlClient({\n ...(region && { region }),\n });\n\n try {\n let resources: ResourceModel[];\n\n if (exactIdentifier) {\n // Get specific resource by identifier\n const resource = await this.getResource(client, typeName, exactIdentifier);\n resources = resource ? [resource] : [];\n } else {\n // List resources and filter\n resources = await this.listResources(client, typeName);\n\n // Apply property match filter\n if (propertyMatch && Object.keys(propertyMatch).length > 0) {\n resources = resources.filter((r) => this.matchesProperties(r, propertyMatch));\n }\n }\n\n // Validate match count\n this.validateMatchCount(resources, expectedMatchCount, typeName, exactIdentifier);\n\n if (resources.length === 0) {\n if (ignoreErrorOnMissingContext && dummyValue !== undefined) {\n this.logger.debug(`No resources found, returning dummy value`);\n return dummyValue;\n }\n throw new Error(\n `No ${typeName} resource found${exactIdentifier ? ` with identifier ${exactIdentifier}` : ''}`\n );\n }\n\n // Extract requested properties\n if (resources.length === 1) {\n return this.extractProperties(resources[0]!, propertiesToReturn);\n }\n\n return resources.map((r) => this.extractProperties(r, propertiesToReturn));\n } finally {\n client.destroy();\n }\n }\n\n /**\n * Get a single resource by identifier\n */\n private async getResource(\n client: CloudControlClient,\n typeName: string,\n identifier: string\n ): Promise<ResourceModel | null> {\n try {\n const response = await client.send(\n new GetResourceCommand({\n TypeName: typeName,\n Identifier: identifier,\n })\n );\n\n if (!response.ResourceDescription?.Properties) {\n return null;\n }\n\n return JSON.parse(response.ResourceDescription.Properties) as ResourceModel;\n } catch (error) {\n const err = error as { name?: string };\n if (err.name === 'ResourceNotFoundException') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * List all resources of a type\n */\n private async listResources(\n client: CloudControlClient,\n typeName: string\n ): Promise<ResourceModel[]> {\n const resources: ResourceModel[] = [];\n let nextToken: string | undefined;\n\n do {\n const response = await client.send(\n new ListResourcesCommand({\n TypeName: typeName,\n ...(nextToken && { NextToken: nextToken }),\n })\n );\n\n for (const desc of response.ResourceDescriptions ?? []) {\n if (desc.Properties) {\n resources.push(JSON.parse(desc.Properties) as ResourceModel);\n }\n }\n\n nextToken = response.NextToken;\n } while (nextToken);\n\n return resources;\n }\n\n /**\n * Check if resource matches property filter\n */\n private matchesProperties(\n resource: ResourceModel,\n propertyMatch: Record<string, unknown>\n ): boolean {\n for (const [key, expectedValue] of Object.entries(propertyMatch)) {\n const actualValue = this.getNestedProperty(resource, key);\n if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Get nested property value using dot notation\n */\n private getNestedProperty(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n }\n\n /**\n * Validate that the number of matches meets expectations\n */\n private validateMatchCount(\n resources: ResourceModel[],\n expectedMatchCount: string,\n typeName: string,\n identifier?: string\n ): void {\n const count = resources.length;\n const context = identifier ? ` with identifier ${identifier}` : '';\n\n switch (expectedMatchCount) {\n case 'exactly-one':\n if (count !== 1) {\n throw new Error(`Expected exactly one ${typeName}${context}, found ${count}`);\n }\n break;\n case 'at-least-one':\n if (count < 1) {\n throw new Error(`Expected at least one ${typeName}${context}, found none`);\n }\n break;\n case 'at-most-one':\n if (count > 1) {\n throw new Error(`Expected at most one ${typeName}${context}, found ${count}`);\n }\n break;\n case 'any':\n // No validation needed\n break;\n }\n }\n\n /**\n * Extract requested properties from resource model\n */\n private extractProperties(\n resource: ResourceModel,\n propertiesToReturn: string[]\n ): Record<string, unknown> {\n if (propertiesToReturn.length === 0) {\n return resource;\n }\n\n const result: Record<string, unknown> = {};\n for (const prop of propertiesToReturn) {\n result[prop] = this.getNestedProperty(resource, prop);\n }\n return result;\n }\n}\n\ntype ResourceModel = Record<string, unknown>;\n", "import { EC2Client, DescribeImagesCommand } from '@aws-sdk/client-ec2';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * AMI context provider\n *\n * Searches for the most recent AMI matching filters.\n * CDK provider type: \"ami\"\n */\nexport class AmiContextProvider implements ContextProvider {\n private logger = getLogger().child('AmiContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<string> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const owners = props['owners'] as string[] | undefined;\n const filters = props['filters'] as Record<string, string[]> | undefined;\n\n this.logger.debug(`Looking up AMI (region: ${region})`);\n\n const client = new EC2Client({\n ...(region && { region }),\n });\n\n try {\n const ec2Filters = filters\n ? Object.entries(filters).map(([name, values]) => ({ Name: name, Values: values }))\n : undefined;\n\n const response = await client.send(\n new DescribeImagesCommand({\n ...(owners && { Owners: owners }),\n ...(ec2Filters && { Filters: ec2Filters }),\n })\n );\n\n const images = (response.Images ?? [])\n .filter((img) => img.ImageId && img.CreationDate)\n .sort((a, b) => (b.CreationDate ?? '').localeCompare(a.CreationDate ?? ''));\n\n if (images.length === 0) {\n throw new Error('No AMI found matching the specified filters');\n }\n\n const imageId = images[0]!.ImageId!;\n this.logger.debug(`Resolved AMI: ${imageId}`);\n return imageId;\n } finally {\n client.destroy();\n }\n }\n}\n", "import { EC2Client, DescribeSecurityGroupsCommand } from '@aws-sdk/client-ec2';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Security Group context provider\n *\n * Looks up security group details by ID.\n * CDK provider type: \"security-group\"\n */\nexport class SecurityGroupContextProvider implements ContextProvider {\n private logger = getLogger().child('SecurityGroupContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const securityGroupId = props['securityGroupId'] as string | undefined;\n const securityGroupName = props['securityGroupName'] as string | undefined;\n const vpcId = props['vpcId'] as string | undefined;\n\n this.logger.debug(\n `Looking up security group (id: ${securityGroupId}, name: ${securityGroupName}, region: ${region})`\n );\n\n const client = new EC2Client({\n ...(region && { region }),\n });\n\n try {\n const filters = [];\n if (securityGroupId) {\n filters.push({ Name: 'group-id', Values: [securityGroupId] });\n }\n if (securityGroupName) {\n filters.push({ Name: 'group-name', Values: [securityGroupName] });\n }\n if (vpcId) {\n filters.push({ Name: 'vpc-id', Values: [vpcId] });\n }\n\n const response = await client.send(\n new DescribeSecurityGroupsCommand({\n ...(filters.length > 0 && { Filters: filters }),\n ...(securityGroupId && !securityGroupName && { GroupIds: [securityGroupId] }),\n })\n );\n\n const groups = response.SecurityGroups ?? [];\n if (groups.length === 0) {\n throw new Error(\n `No security group found (id: ${securityGroupId}, name: ${securityGroupName})`\n );\n }\n\n const sg = groups[0]!;\n this.logger.debug(`Resolved security group: ${sg.GroupId}`);\n\n return {\n securityGroupId: sg.GroupId,\n allowAllOutbound: (sg.IpPermissionsEgress ?? []).some(\n (perm) =>\n perm.IpProtocol === '-1' && (perm.IpRanges ?? []).some((r) => r.CidrIp === '0.0.0.0/0')\n ),\n };\n } finally {\n client.destroy();\n }\n }\n}\n", "import {\n ElasticLoadBalancingV2Client,\n DescribeLoadBalancersCommand,\n DescribeListenersCommand,\n} from '@aws-sdk/client-elastic-load-balancing-v2';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Load Balancer context provider\n *\n * Looks up ALB/NLB details.\n * CDK provider type: \"load-balancer\"\n */\nexport class LoadBalancerContextProvider implements ContextProvider {\n private logger = getLogger().child('LoadBalancerContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const loadBalancerArn = props['loadBalancerArn'] as string | undefined;\n const loadBalancerType = props['loadBalancerType'] as string | undefined;\n\n this.logger.debug(`Looking up load balancer (arn: ${loadBalancerArn}, region: ${region})`);\n\n const client = new ElasticLoadBalancingV2Client({\n ...(region && { region }),\n });\n\n try {\n const response = await client.send(\n new DescribeLoadBalancersCommand({\n ...(loadBalancerArn && { LoadBalancerArns: [loadBalancerArn] }),\n })\n );\n\n let lbs = response.LoadBalancers ?? [];\n\n if (loadBalancerType) {\n lbs = lbs.filter((lb) => lb.Type === loadBalancerType);\n }\n\n if (lbs.length === 0) {\n throw new Error(`No load balancer found (arn: ${loadBalancerArn})`);\n }\n\n const lb = lbs[0]!;\n this.logger.debug(`Resolved load balancer: ${lb.LoadBalancerArn}`);\n\n return {\n loadBalancerArn: lb.LoadBalancerArn,\n loadBalancerCanonicalHostedZoneId: lb.CanonicalHostedZoneId,\n loadBalancerDnsName: lb.DNSName,\n vpcId: lb.VpcId,\n securityGroupIds: lb.SecurityGroups ?? [],\n ipAddressType: lb.IpAddressType,\n };\n } finally {\n client.destroy();\n }\n }\n}\n\n/**\n * Load Balancer Listener context provider\n *\n * Looks up ALB/NLB listener details.\n * CDK provider type: \"load-balancer-listener\"\n */\nexport class LoadBalancerListenerContextProvider implements ContextProvider {\n private logger = getLogger().child('LoadBalancerListenerContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const listenerArn = props['listenerArn'] as string | undefined;\n const loadBalancerArn = props['loadBalancerArn'] as string | undefined;\n const listenerPort = props['listenerPort'] as number | undefined;\n const listenerProtocol = props['listenerProtocol'] as string | undefined;\n\n this.logger.debug(\n `Looking up load balancer listener (arn: ${listenerArn}, lb: ${loadBalancerArn}, region: ${region})`\n );\n\n const client = new ElasticLoadBalancingV2Client({\n ...(region && { region }),\n });\n\n try {\n const response = await client.send(\n new DescribeListenersCommand({\n ...(listenerArn && { ListenerArns: [listenerArn] }),\n ...(loadBalancerArn && { LoadBalancerArn: loadBalancerArn }),\n })\n );\n\n let listeners = response.Listeners ?? [];\n\n if (listenerPort) {\n listeners = listeners.filter((l) => l.Port === listenerPort);\n }\n if (listenerProtocol) {\n listeners = listeners.filter((l) => l.Protocol === listenerProtocol);\n }\n\n if (listeners.length === 0) {\n throw new Error(\n `No listener found (arn: ${listenerArn}, lb: ${loadBalancerArn}, port: ${listenerPort})`\n );\n }\n\n const listener = listeners[0]!;\n this.logger.debug(`Resolved listener: ${listener.ListenerArn}`);\n\n return {\n listenerArn: listener.ListenerArn,\n listenerPort: listener.Port,\n securityGroupIds: [] as string[],\n };\n } finally {\n client.destroy();\n }\n }\n}\n", "import { KMSClient, ListAliasesCommand } from '@aws-sdk/client-kms';\nimport type { ContextProvider, ContextProviderAwsConfig } from './index.js';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * KMS Key context provider\n *\n * Looks up KMS key by alias name.\n * CDK provider type: \"key-provider\"\n */\nexport class KeyContextProvider implements ContextProvider {\n private logger = getLogger().child('KeyContextProvider');\n\n constructor(private awsConfig?: ContextProviderAwsConfig) {}\n\n async resolve(props: Record<string, unknown>): Promise<unknown> {\n const region = (props['region'] as string) || this.awsConfig?.region;\n const aliasName = props['aliasName'] as string;\n\n if (!aliasName) {\n throw new Error('Key context provider requires aliasName property');\n }\n\n this.logger.debug(`Looking up KMS key by alias: ${aliasName} (region: ${region})`);\n\n const client = new KMSClient({\n ...(region && { region }),\n });\n\n try {\n // Normalize alias name\n const normalizedAlias = aliasName.startsWith('alias/') ? aliasName : `alias/${aliasName}`;\n\n let nextMarker: string | undefined;\n do {\n const response = await client.send(\n new ListAliasesCommand({\n ...(nextMarker && { Marker: nextMarker }),\n })\n );\n\n const match = (response.Aliases ?? []).find((a) => a.AliasName === normalizedAlias);\n if (match) {\n if (!match.TargetKeyId) {\n throw new Error(`KMS alias '${aliasName}' found but has no target key`);\n }\n this.logger.debug(`Resolved KMS key: ${match.TargetKeyId} (alias: ${aliasName})`);\n return { keyId: match.TargetKeyId };\n }\n\n nextMarker = response.NextMarker;\n } while (nextMarker);\n\n throw new Error(`No KMS key found with alias: ${aliasName}`);\n } finally {\n client.destroy();\n }\n }\n}\n", "import type { MissingContext } from '../../types/assembly.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { AZContextProvider } from './az-provider.js';\nimport { SSMContextProvider } from './ssm-provider.js';\nimport { HostedZoneContextProvider } from './hosted-zone-provider.js';\nimport { VpcContextProvider } from './vpc-provider.js';\nimport { CcApiContextProvider } from './cc-api-provider.js';\nimport { AmiContextProvider } from './ami-provider.js';\nimport { SecurityGroupContextProvider } from './security-group-provider.js';\nimport {\n LoadBalancerContextProvider,\n LoadBalancerListenerContextProvider,\n} from './load-balancer-provider.js';\nimport { KeyContextProvider } from './key-provider.js';\n\nconst PROVIDER_ERROR_KEY = '$providerError';\nconst TRANSIENT_CONTEXT_KEY = '$dontSaveContext';\n\n/**\n * Context provider interface\n */\nexport interface ContextProvider {\n /**\n * Resolve context value from AWS SDK\n * @param props Provider-specific query properties\n * @returns Resolved context value\n */\n resolve(props: Record<string, unknown>): Promise<unknown>;\n}\n\n/**\n * AWS client configuration for context providers\n */\nexport interface ContextProviderAwsConfig {\n region?: string;\n profile?: string;\n}\n\n/**\n * Context provider registry\n *\n * Maps provider type names to implementations.\n * Resolves missing context values by calling AWS SDK APIs.\n */\nexport class ContextProviderRegistry {\n private logger = getLogger().child('ContextProviderRegistry');\n private providers = new Map<string, ContextProvider>();\n\n constructor(awsConfig?: ContextProviderAwsConfig) {\n // Register built-in providers\n this.register('availability-zones', new AZContextProvider(awsConfig));\n this.register('ssm', new SSMContextProvider(awsConfig));\n this.register('hosted-zone', new HostedZoneContextProvider(awsConfig));\n this.register('vpc-provider', new VpcContextProvider(awsConfig));\n this.register('cc-api-provider', new CcApiContextProvider(awsConfig));\n this.register('ami', new AmiContextProvider(awsConfig));\n this.register('security-group', new SecurityGroupContextProvider(awsConfig));\n this.register('load-balancer', new LoadBalancerContextProvider(awsConfig));\n this.register('load-balancer-listener', new LoadBalancerListenerContextProvider(awsConfig));\n this.register('key-provider', new KeyContextProvider(awsConfig));\n }\n\n /**\n * Register a context provider\n */\n register(name: string, provider: ContextProvider): void {\n this.providers.set(name, provider);\n }\n\n /**\n * Resolve all missing context values\n *\n * @param missing Array of missing context entries from manifest\n * @returns Map of context key \u2192 resolved value\n */\n async resolve(missing: MissingContext[]): Promise<Record<string, unknown>> {\n const results: Record<string, unknown> = {};\n\n for (const entry of missing) {\n const provider = this.providers.get(entry.provider);\n\n if (!provider) {\n this.logger.warn(`No context provider registered for: ${entry.provider}`);\n results[entry.key] = {\n [PROVIDER_ERROR_KEY]: `Unknown context provider: ${entry.provider}`,\n [TRANSIENT_CONTEXT_KEY]: true,\n };\n continue;\n }\n\n try {\n this.logger.debug(`Resolving context: ${entry.provider} (key: ${entry.key})`);\n const value = await provider.resolve(entry.props);\n results[entry.key] = value;\n this.logger.debug(`Resolved context: ${entry.key}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger.error(`Context provider '${entry.provider}' failed: ${message}`);\n results[entry.key] = {\n [PROVIDER_ERROR_KEY]: message,\n [TRANSIENT_CONTEXT_KEY]: true,\n };\n }\n }\n\n return results;\n }\n}\n", "import { Command } from 'commander';\nimport {\n appOptions,\n commonOptions,\n stateOptions,\n stackOptions,\n deployOptions,\n contextOptions,\n parseContextOptions,\n} from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { Synthesizer } from '../../synthesis/synthesizer.js';\nimport { AssetPublisher } from '../../assets/asset-publisher.js';\nimport { S3StateBackend } from '../../state/s3-state-backend.js';\nimport { LockManager } from '../../state/lock-manager.js';\nimport { DagBuilder } from '../../analyzer/dag-builder.js';\nimport { DiffCalculator } from '../../analyzer/diff-calculator.js';\nimport { ProviderRegistry } from '../../provisioning/provider-registry.js';\nimport { registerAllProviders } from '../../provisioning/register-providers.js';\nimport { DeployEngine } from '../../deployment/deploy-engine.js';\nimport { WorkGraph } from '../../deployment/work-graph.js';\nimport { setAwsClients, AwsClients } from '../../utils/aws-clients.js';\nimport { resolveApp, resolveStateBucketWithDefault } from '../config-loader.js';\n\n/**\n * Deploy command implementation\n */\nasync function deployCommand(\n stacks: string[],\n options: {\n app?: string;\n output: string;\n stateBucket?: string;\n statePrefix: string;\n stack?: string;\n all?: boolean;\n region?: string;\n profile?: string;\n concurrency: number;\n stackConcurrency: number;\n assetPublishConcurrency: number;\n imageBuildConcurrency: number;\n dryRun: boolean;\n skipAssets: boolean;\n rollback: boolean;\n wait: boolean;\n exclusively: boolean;\n verbose: boolean;\n context?: string[];\n }\n): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n // Skip waiting for async resources (CloudFront, RDS, ElastiCache, etc.)\n if (!options.wait) {\n process.env['CDKD_NO_WAIT'] = 'true';\n }\n\n // Resolve --app from CLI, env, or cdk.json\n const app = resolveApp(options.app);\n if (!app) {\n throw new Error(\n 'No app command specified. Use --app, set CDKD_APP env var, or add \"app\" to cdk.json'\n );\n }\n options.app = app;\n\n // Resolve --state-bucket from CLI, env, cdk.json, or default (cdkd-state-{accountId}-{region})\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n const stateBucket = await resolveStateBucketWithDefault(options.stateBucket, region);\n\n logger.debug('Starting deployment...');\n logger.debug('Options:', options);\n\n // Initialize AWS clients with region/profile\n // Also set AWS_REGION env for providers using local SDK clients\n if (options.region) {\n process.env['AWS_REGION'] = options.region;\n process.env['AWS_DEFAULT_REGION'] = options.region;\n }\n const awsClients = new AwsClients({\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(awsClients);\n\n let deployInterrupted = false;\n const topLevelSigintHandler = () => {\n if (deployInterrupted) {\n process.stderr.write('\\nForce exit\\n');\n process.exit(130);\n }\n process.stderr.write('\\nInterrupted \u2014 waiting for in-progress operations to complete...\\n');\n deployInterrupted = true;\n };\n process.on('SIGINT', topLevelSigintHandler);\n\n try {\n // 1. Synthesize CDK app\n logger.info('Synthesizing CDK app...');\n const synthesizer = new Synthesizer();\n const context = parseContextOptions(options.context);\n const result = await synthesizer.synthesize({\n app: options.app,\n output: options.output,\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n ...(Object.keys(context).length > 0 && { context }),\n });\n\n const { stacks: allStacks } = result;\n\n logger.debug(`Found ${allStacks.length} stack(s) in assembly`);\n\n // Determine target stacks: positional args > --stack > --all > auto (single stack)\n const stackPatterns = stacks.length > 0 ? stacks : options.stack ? [options.stack] : [];\n let targetStacks;\n\n if (options.all) {\n targetStacks = allStacks;\n } else if (stackPatterns.length > 0) {\n targetStacks = allStacks.filter((s) =>\n stackPatterns.some((pattern) =>\n pattern.includes('*')\n ? new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$').test(s.stackName)\n : s.stackName === pattern\n )\n );\n } else if (allStacks.length === 1) {\n // Single stack: auto-select\n targetStacks = allStacks;\n } else {\n throw new Error(\n `Multiple stacks found: ${allStacks.map((s) => s.stackName).join(', ')}. ` +\n `Specify stack name(s) or use --all`\n );\n }\n\n if (targetStacks.length === 0) {\n throw new Error(\n stackPatterns.length > 0\n ? `No stacks matching ${stackPatterns.join(', ')} found in assembly. Available: ${allStacks.map((s) => s.stackName).join(', ')}`\n : 'No stacks found in assembly'\n );\n }\n\n // Auto-include dependency stacks (CDK CLI compatible behavior)\n // When deploying StackA that depends on StackB, also deploy StackB first.\n // Use -e / --exclusively to skip this and deploy only the requested stacks.\n if (!options.exclusively) {\n const targetNames = new Set(targetStacks.map((s) => s.stackName));\n const allStackMap = new Map(allStacks.map((s) => [s.stackName, s]));\n\n const addDependencies = (stackName: string): void => {\n const stack = allStackMap.get(stackName);\n if (!stack) return;\n for (const depName of stack.dependencyNames) {\n if (!targetNames.has(depName)) {\n const depStack = allStackMap.get(depName);\n if (depStack) {\n targetNames.add(depName);\n targetStacks.push(depStack);\n logger.debug(\n `Auto-including dependency stack: ${depName} (required by ${stackName})`\n );\n addDependencies(depName); // Recursive\n }\n }\n }\n };\n\n for (const stack of [...targetStacks]) {\n addDependencies(stack.stackName);\n }\n }\n\n // 3. Build work graph: asset-publish \u2192 stack deploy (DAG)\n const { STSClient, GetCallerIdentityCommand } = await import('@aws-sdk/client-sts');\n const stsClient = new STSClient({\n region: options.region || process.env['AWS_REGION'] || 'us-east-1',\n });\n const callerIdentity = await stsClient.send(new GetCallerIdentityCommand({}));\n const accountId = callerIdentity.Account!;\n stsClient.destroy();\n\n const assetPublisher = new AssetPublisher();\n const stateConfig = {\n bucket: stateBucket,\n prefix: options.statePrefix,\n };\n const dagBuilder = new DagBuilder();\n const diffCalculator = new DiffCalculator();\n const baseRegion = options.region || process.env['AWS_REGION'] || 'us-east-1';\n\n const switchRegion = (region: string): void => {\n process.env['AWS_REGION'] = region;\n process.env['AWS_DEFAULT_REGION'] = region;\n };\n\n // Build work graph\n const workGraph = new WorkGraph();\n const stackMap = new Map(targetStacks.map((s) => [s.stackName, s]));\n\n for (const stack of targetStacks) {\n const stackNodeId = `stack:${stack.stackName}`;\n const stackDeps = new Set<string>();\n\n // Add asset-publish nodes via AssetPublisher\n if (!options.skipAssets && stack.assetManifestPath) {\n try {\n const assetRegion = stack.region || baseRegion;\n const nodeIds = assetPublisher.addAssetsToGraph(workGraph, stack.assetManifestPath, {\n accountId,\n region: assetRegion,\n ...(options.profile && { profile: options.profile }),\n nodePrefix: `${stack.stackName}:`,\n });\n for (const id of nodeIds) {\n stackDeps.add(id);\n }\n } catch (error) {\n const err = error as { code?: string };\n if (err.code !== 'ENOENT') throw error;\n }\n }\n\n // Add inter-stack dependencies\n for (const depName of stack.dependencyNames) {\n if (stackMap.has(depName)) {\n stackDeps.add(`stack:${depName}`);\n }\n }\n\n workGraph.addNode({\n id: stackNodeId,\n type: 'stack',\n dependencies: stackDeps,\n state: 'pending',\n data: { stack },\n });\n }\n\n const summary = workGraph.summary();\n logger.debug(`Work graph: ${summary['asset-publish']} asset(s), ${summary['stack']} stack(s)`);\n\n // Execute work graph\n await workGraph.execute(\n {\n 'asset-build': options.imageBuildConcurrency,\n 'asset-publish': options.assetPublishConcurrency,\n stack: options.stackConcurrency,\n },\n async (node) => {\n if (node.type === 'asset-build' || node.type === 'asset-publish') {\n await assetPublisher.executeNode(node);\n } else {\n const { stack: stackInfo } = node.data as { stack: (typeof targetStacks)[0] };\n const stackRegion = stackInfo.region || baseRegion;\n\n logger.info(\n `\\nDeploying stack: ${stackInfo.stackName}${stackRegion !== baseRegion ? ` (region: ${stackRegion})` : ''}`\n );\n\n switchRegion(stackRegion);\n\n const stackAwsClients = new AwsClients({\n region: stackRegion,\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(stackAwsClients);\n\n const stateS3Client = new AwsClients({\n region: baseRegion,\n ...(options.profile && { profile: options.profile }),\n });\n const stackStateBackend = new S3StateBackend(stateS3Client.s3, stateConfig);\n const stackLockManager = new LockManager(stateS3Client.s3, stateConfig);\n const stackProviderRegistry = new ProviderRegistry();\n registerAllProviders(stackProviderRegistry);\n stackProviderRegistry.setCustomResourceResponseBucket(stateBucket, baseRegion);\n\n const stackDeployEngine = new DeployEngine(\n stackStateBackend,\n stackLockManager,\n dagBuilder,\n diffCalculator,\n stackProviderRegistry,\n {\n concurrency: options.concurrency,\n dryRun: options.dryRun,\n noRollback: !options.rollback,\n },\n stackRegion\n );\n\n try {\n const deployResult = await stackDeployEngine.deploy(\n stackInfo.stackName,\n stackInfo.template\n );\n\n logger.info('\\nDeployment Summary:');\n logger.info(` Stack: ${deployResult.stackName}`);\n logger.info(` Created: ${deployResult.created}`);\n logger.info(` Updated: ${deployResult.updated}`);\n logger.info(` Deleted: ${deployResult.deleted}`);\n logger.info(` Unchanged: ${deployResult.unchanged}`);\n logger.info(` Duration: ${(deployResult.durationMs / 1000).toFixed(2)}s`);\n\n if (options.dryRun) {\n logger.info('\\n\u2713 Dry run completed - no actual changes made');\n } else {\n logger.info('\\n\u2713 Deployment completed successfully');\n }\n } finally {\n stackAwsClients.destroy();\n stateS3Client.destroy();\n switchRegion(baseRegion);\n setAwsClients(awsClients);\n }\n }\n }\n );\n } finally {\n process.removeListener('SIGINT', topLevelSigintHandler);\n awsClients.destroy();\n }\n}\n\n/**\n * Create deploy command\n */\nexport function createDeployCommand(): Command {\n const cmd = new Command('deploy')\n .description('Deploy CDK app using SDK/Cloud Control API')\n .argument('[stacks...]', 'Stack name(s) to deploy (supports wildcards)')\n .option('--all', 'Deploy all stacks', false)\n .action(withErrorHandling(deployCommand));\n\n // Add options\n [\n ...commonOptions,\n ...appOptions,\n ...stateOptions,\n ...stackOptions,\n ...deployOptions,\n ...contextOptions,\n ].forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n", "import { readFileSync } from 'node:fs';\nimport { FileAssetPublisher } from './file-asset-publisher.js';\nimport { DockerAssetPublisher } from './docker-asset-publisher.js';\nimport type { AssetManifest, FileAsset, DockerImageAsset } from '../types/assets.js';\nimport { WorkGraph, type WorkNode } from '../deployment/work-graph.js';\nimport { getLogger } from '../utils/logger.js';\nimport { AssetError } from '../utils/error-handler.js';\n\n/**\n * Data attached to a file asset-publish node\n */\nexport interface FileAssetNodeData {\n kind: 'file';\n hash: string;\n asset: FileAsset;\n cdkOutputDir: string;\n accountId: string;\n region: string;\n profile?: string;\n}\n\n/**\n * Data attached to a Docker asset-build node\n */\nexport interface DockerBuildNodeData {\n kind: 'docker-build';\n hash: string;\n asset: DockerImageAsset;\n cdkOutputDir: string;\n localTag: string;\n}\n\n/**\n * Data attached to a Docker asset-publish node\n */\nexport interface DockerPublishNodeData {\n kind: 'docker-publish';\n asset: DockerImageAsset;\n accountId: string;\n region: string;\n localTag: string;\n}\n\nexport type AssetNodeData = FileAssetNodeData | DockerBuildNodeData | DockerPublishNodeData;\n\n/**\n * Asset publishing options\n */\nexport interface AssetPublisherOptions {\n /** AWS profile to use */\n profile?: string;\n\n /** AWS region */\n region?: string;\n\n /** AWS account ID */\n accountId?: string;\n\n /** Concurrency for asset publishing (S3 uploads + ECR push). Default: 8 */\n assetPublishConcurrency?: number;\n\n /** Concurrency for Docker image builds. Default: 4 */\n imageBuildConcurrency?: number;\n}\n\n/**\n * Asset publisher\n *\n * Orchestrates file and Docker image asset publishing via WorkGraph.\n * - File assets: single asset-publish node (S3 upload)\n * - Docker assets: asset-build node \u2192 asset-publish node (build then push)\n */\nexport class AssetPublisher {\n private logger = getLogger().child('AssetPublisher');\n private filePublisher = new FileAssetPublisher();\n private dockerPublisher = new DockerAssetPublisher();\n\n /**\n * Add asset nodes from a manifest to a WorkGraph.\n * Returns the node IDs that stack deploy should depend on.\n */\n addAssetsToGraph(\n graph: WorkGraph,\n manifestPath: string,\n options: { accountId: string; region: string; profile?: string; nodePrefix?: string }\n ): string[] {\n const content = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as AssetManifest;\n const cdkOutputDir = manifestPath.replace(/\\/[^/]+$/, '');\n const prefix = options.nodePrefix || '';\n const nodeIds: string[] = [];\n\n // File assets: single publish node\n const fileAssets = Object.entries(manifest.files || {}).filter(\n ([, asset]) =>\n !asset.source.path.endsWith('.json') && !asset.source.path.endsWith('.template.json')\n );\n for (const [hash, asset] of fileAssets) {\n const nodeId = `asset-publish:${prefix}file:${hash}`;\n graph.addNode({\n id: nodeId,\n type: 'asset-publish',\n dependencies: new Set(),\n state: 'pending',\n data: {\n kind: 'file',\n hash,\n asset,\n cdkOutputDir,\n accountId: options.accountId,\n region: options.region,\n ...(options.profile && { profile: options.profile }),\n } satisfies FileAssetNodeData,\n });\n nodeIds.push(nodeId);\n }\n\n // Docker assets: build node \u2192 publish node\n for (const [hash, asset] of Object.entries(manifest.dockerImages || {})) {\n const localTag = `cdkd-asset-${hash}`;\n const buildNodeId = `asset-build:${prefix}docker:${hash}`;\n const publishNodeId = `asset-publish:${prefix}docker:${hash}`;\n\n graph.addNode({\n id: buildNodeId,\n type: 'asset-build',\n dependencies: new Set(),\n state: 'pending',\n data: {\n kind: 'docker-build',\n hash,\n asset,\n cdkOutputDir,\n localTag,\n } satisfies DockerBuildNodeData,\n });\n\n graph.addNode({\n id: publishNodeId,\n type: 'asset-publish',\n dependencies: new Set([buildNodeId]),\n state: 'pending',\n data: {\n kind: 'docker-publish',\n asset,\n accountId: options.accountId,\n region: options.region,\n localTag,\n } satisfies DockerPublishNodeData,\n });\n\n // Stack depends on the publish node (not build)\n nodeIds.push(publishNodeId);\n }\n\n this.logger.debug(\n `Added ${fileAssets.length} file + ${Object.keys(manifest.dockerImages || {}).length} docker asset(s) to graph`\n );\n\n return nodeIds;\n }\n\n /**\n * Execute an asset node (build or publish)\n */\n async executeNode(node: WorkNode): Promise<void> {\n const data = node.data as AssetNodeData;\n\n if (data.kind === 'file') {\n await this.filePublisher.publish(\n data.hash,\n data.asset,\n data.cdkOutputDir,\n data.accountId,\n data.region,\n data.profile\n );\n } else if (data.kind === 'docker-build') {\n await this.dockerPublisher.build(data.asset, data.cdkOutputDir, data.localTag);\n } else if (data.kind === 'docker-publish') {\n await this.dockerPublisher.push(data.asset, data.accountId, data.region, data.localTag);\n }\n\n this.logger.debug(`\u2705 ${node.id}`);\n }\n\n /**\n * Publish assets from manifest file (standalone, uses WorkGraph internally)\n */\n async publishFromManifest(\n manifestPath: string,\n options: AssetPublisherOptions = {}\n ): Promise<void> {\n try {\n this.logger.debug('Loading asset manifest:', manifestPath);\n\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n let accountId = options.accountId;\n\n if (!accountId) {\n const { STSClient, GetCallerIdentityCommand } = await import('@aws-sdk/client-sts');\n const stsClient = new STSClient({ region });\n const identity = await stsClient.send(new GetCallerIdentityCommand({}));\n accountId = identity.Account!;\n stsClient.destroy();\n }\n\n const graph = new WorkGraph();\n const nodeIds = this.addAssetsToGraph(graph, manifestPath, {\n accountId,\n region,\n ...(options.profile && { profile: options.profile }),\n });\n\n if (nodeIds.length === 0) {\n this.logger.debug('No assets to publish');\n return;\n }\n\n await graph.execute(\n {\n 'asset-build': options.imageBuildConcurrency ?? 4,\n 'asset-publish': options.assetPublishConcurrency ?? 8,\n stack: 0,\n },\n (node) => this.executeNode(node)\n );\n\n this.logger.debug('\u2705 All assets published successfully');\n } catch (error) {\n if (error instanceof AssetError) {\n throw error;\n }\n const err = error as Record<string, unknown>;\n const message = String(err['message'] || err['name'] || error);\n const code = String(err['Code'] || err['code'] || err['name'] || '');\n const detail = code ? `${code}: ${message}` : message;\n throw new AssetError(\n `Asset publishing failed: ${detail}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Check if assets need to be published\n */\n hasAssets(manifestPath: string): boolean {\n try {\n const content = readFileSync(manifestPath, 'utf-8');\n const manifest = JSON.parse(content) as AssetManifest;\n const fileCount = Object.keys(manifest.files || {}).length;\n const dockerCount = Object.keys(manifest.dockerImages || {}).length;\n return fileCount + dockerCount > 0;\n } catch {\n this.logger.warn('Failed to check assets');\n return false;\n }\n }\n}\n", "import { createReadStream, statSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { S3Client, HeadObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';\nimport type { FileAsset } from '../types/assets.js';\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * Publishes file assets to S3\n *\n * Handles:\n * - Placeholder resolution (${AWS::AccountId}, ${AWS::Region})\n * - Existence check (skip if already uploaded)\n * - ZIP packaging for directory assets\n * - Direct file upload for single files\n */\nexport class FileAssetPublisher {\n private logger = getLogger().child('FileAssetPublisher');\n\n /**\n * Publish a file asset to S3\n *\n * @param assetHash Asset hash (ID)\n * @param asset File asset definition\n * @param cdkOutputDir CDK output directory (cdk.out)\n * @param accountId AWS account ID\n * @param region AWS region\n * @param profile AWS profile (optional)\n */\n async publish(\n assetHash: string,\n asset: FileAsset,\n cdkOutputDir: string,\n accountId: string,\n region: string,\n _profile?: string\n ): Promise<void> {\n // Process each destination\n for (const [, dest] of Object.entries(asset.destinations)) {\n const bucketName = this.resolvePlaceholders(dest.bucketName, accountId, region);\n const objectKey = this.resolvePlaceholders(dest.objectKey, accountId, region);\n const destRegion = dest.region\n ? this.resolvePlaceholders(dest.region, accountId, region)\n : region;\n\n this.logger.debug(\n `Publishing file asset ${asset.displayName || assetHash} \u2192 s3://${bucketName}/${objectKey}`\n );\n\n const client = new S3Client({\n region: destRegion,\n });\n\n try {\n // Check if already exists\n if (await this.objectExists(client, bucketName, objectKey)) {\n this.logger.debug(`Asset already exists, skipping: s3://${bucketName}/${objectKey}`);\n continue;\n }\n\n // Determine source path\n const sourcePath = join(cdkOutputDir, asset.source.path);\n\n if (asset.source.packaging === 'zip') {\n // ZIP packaging: create zip archive and upload\n await this.uploadZip(client, sourcePath, bucketName, objectKey);\n } else {\n // Direct file upload\n await this.uploadFile(client, sourcePath, bucketName, objectKey);\n }\n\n this.logger.debug(`\u2705 Published: s3://${bucketName}/${objectKey}`);\n } finally {\n client.destroy();\n }\n }\n }\n\n /**\n * Check if an S3 object exists\n */\n private async objectExists(client: S3Client, bucket: string, key: string): Promise<boolean> {\n try {\n await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key }));\n return true;\n } catch (error) {\n const err = error as {\n name?: string;\n message?: string;\n $metadata?: { httpStatusCode?: number };\n };\n if (err.name === 'NotFound' || err.$metadata?.httpStatusCode === 404) {\n return false;\n }\n // Provide helpful error for common issues\n const statusCode = err.$metadata?.httpStatusCode;\n if (statusCode === 301 || err.name === 'PermanentRedirect') {\n throw new Error(\n `S3 bucket '${bucket}' is in a different region. ` +\n `Use --region to specify the correct region, or check asset manifest destination.`\n );\n }\n throw new Error(\n `Failed to check S3 object s3://${bucket}/${key}: ${err.name || 'UnknownError'}: ${err.message || String(error)}`\n );\n }\n }\n\n /**\n * Upload a single file to S3\n */\n private async uploadFile(\n client: S3Client,\n filePath: string,\n bucket: string,\n key: string\n ): Promise<void> {\n const stat = statSync(filePath);\n const stream = createReadStream(filePath);\n\n await client.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: stream,\n ContentLength: stat.size,\n })\n );\n }\n\n /**\n * Create ZIP archive and upload to S3\n */\n private async uploadZip(\n client: S3Client,\n dirPath: string,\n bucket: string,\n key: string\n ): Promise<void> {\n const archiver = await import('archiver');\n\n // Collect all archive data into a buffer before uploading\n const body = await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n const archive = archiver.default('zip', { zlib: { level: 9 } });\n\n archive.on('data', (chunk: Buffer) => chunks.push(chunk));\n archive.on('end', () => resolve(Buffer.concat(chunks)));\n archive.on('error', reject);\n\n // Check if dirPath is a file or directory\n const stat = statSync(dirPath);\n if (stat.isDirectory()) {\n archive.directory(dirPath, false);\n } else {\n archive.file(dirPath, { name: basename(dirPath) });\n }\n\n void archive.finalize();\n });\n\n await client.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: body,\n ContentLength: body.length,\n })\n );\n }\n\n /**\n * Replace placeholders in destination values\n */\n private resolvePlaceholders(\n value: string,\n accountId: string,\n region: string,\n partition = 'aws'\n ): string {\n return value\n .replace(/\\$\\{AWS::AccountId\\}/g, accountId)\n .replace(/\\$\\{AWS::Region\\}/g, region)\n .replace(/\\$\\{AWS::Partition\\}/g, partition);\n }\n}\n", "import { execFile, spawn } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport {\n ECRClient,\n GetAuthorizationTokenCommand,\n DescribeImagesCommand,\n} from '@aws-sdk/client-ecr';\nimport type { DockerImageAsset } from '../types/assets.js';\nimport { getLogger } from '../utils/logger.js';\nimport { AssetError } from '../utils/error-handler.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Publishes Docker image assets to ECR\n *\n * Handles:\n * - Placeholder resolution\n * - Existence check (skip if already pushed)\n * - docker build with Dockerfile, build args, target\n * - ECR authentication\n * - docker tag + docker push\n */\nexport class DockerAssetPublisher {\n private logger = getLogger().child('DockerAssetPublisher');\n\n /**\n * Publish a Docker image asset to ECR\n */\n async publish(\n assetHash: string,\n asset: DockerImageAsset,\n cdkOutputDir: string,\n accountId: string,\n region: string\n ): Promise<void> {\n for (const [, dest] of Object.entries(asset.destinations)) {\n const repositoryName = this.resolvePlaceholders(dest.repositoryName, accountId, region);\n const imageTag = this.resolvePlaceholders(dest.imageTag, accountId, region);\n const destRegion = dest.region\n ? this.resolvePlaceholders(dest.region, accountId, region)\n : region;\n\n const ecrUri = `${accountId}.dkr.ecr.${destRegion}.amazonaws.com/${repositoryName}:${imageTag}`;\n\n this.logger.debug(`Publishing Docker image ${asset.displayName || assetHash} \u2192 ${ecrUri}`);\n\n const client = new ECRClient({ region: destRegion });\n\n try {\n // Check if image already exists\n if (await this.imageExists(client, repositoryName, imageTag)) {\n this.logger.debug(`Image already exists, skipping: ${ecrUri}`);\n continue;\n }\n\n // Build Docker image\n const localTag = `cdkd-asset-${assetHash}`;\n await this.buildImage(asset, cdkOutputDir, localTag);\n\n // Authenticate with ECR\n await this.ecrLogin(client, accountId, destRegion);\n\n // Tag and push\n const fullUri = `${accountId}.dkr.ecr.${destRegion}.amazonaws.com/${repositoryName}:${imageTag}`;\n await this.tagImage(localTag, fullUri);\n await this.pushImage(fullUri);\n\n this.logger.debug(`\u2705 Published: ${ecrUri}`);\n } finally {\n client.destroy();\n }\n }\n }\n\n /**\n * Build a Docker image (public, used by WorkGraph asset-build nodes)\n */\n async build(asset: DockerImageAsset, cdkOutputDir: string, localTag: string): Promise<void> {\n await this.buildImage(asset, cdkOutputDir, localTag);\n }\n\n /**\n * Push a pre-built Docker image to ECR (public, used by WorkGraph asset-publish nodes)\n */\n async push(\n asset: DockerImageAsset,\n accountId: string,\n region: string,\n localTag: string\n ): Promise<void> {\n for (const [, dest] of Object.entries(asset.destinations)) {\n const repositoryName = this.resolvePlaceholders(dest.repositoryName, accountId, region);\n const imageTag = this.resolvePlaceholders(dest.imageTag, accountId, region);\n const destRegion = dest.region\n ? this.resolvePlaceholders(dest.region, accountId, region)\n : region;\n\n const ecrUri = `${accountId}.dkr.ecr.${destRegion}.amazonaws.com/${repositoryName}:${imageTag}`;\n\n const client = new ECRClient({ region: destRegion });\n\n try {\n if (await this.imageExists(client, repositoryName, imageTag)) {\n this.logger.debug(`Image already exists, skipping: ${ecrUri}`);\n continue;\n }\n\n await this.ecrLogin(client, accountId, destRegion);\n\n const fullUri = `${accountId}.dkr.ecr.${destRegion}.amazonaws.com/${repositoryName}:${imageTag}`;\n await this.tagImage(localTag, fullUri);\n await this.pushImage(fullUri);\n\n this.logger.debug(`\u2705 Published: ${ecrUri}`);\n } finally {\n client.destroy();\n }\n }\n }\n\n /**\n * Check if image exists in ECR\n */\n private async imageExists(\n client: ECRClient,\n repositoryName: string,\n imageTag: string\n ): Promise<boolean> {\n try {\n const response = await client.send(\n new DescribeImagesCommand({\n repositoryName,\n imageIds: [{ imageTag }],\n })\n );\n return (response.imageDetails?.length ?? 0) > 0;\n } catch (error) {\n const err = error as { name?: string };\n if (err.name === 'ImageNotFoundException' || err.name === 'RepositoryNotFoundException') {\n return false;\n }\n throw error;\n }\n }\n\n /**\n * Build Docker image\n */\n private async buildImage(\n asset: DockerImageAsset,\n cdkOutputDir: string,\n tag: string\n ): Promise<void> {\n const args: string[] = ['build', '-t', tag];\n\n // Dockerfile\n if (asset.source.dockerFile) {\n args.push('-f', asset.source.dockerFile);\n }\n\n // Build args\n if (asset.source.dockerBuildArgs) {\n for (const [key, value] of Object.entries(asset.source.dockerBuildArgs)) {\n args.push('--build-arg', `${key}=${value}`);\n }\n }\n\n // Build target\n if (asset.source.dockerBuildTarget) {\n args.push('--target', asset.source.dockerBuildTarget);\n }\n\n // Build outputs\n if (asset.source.dockerOutputs) {\n for (const output of asset.source.dockerOutputs) {\n args.push('--output', output);\n }\n }\n\n // Context directory\n const contextDir = `${cdkOutputDir}/${asset.source.directory}`;\n args.push(contextDir);\n\n this.logger.debug(`docker ${args.join(' ')}`);\n\n try {\n await execFileAsync('docker', args, {\n maxBuffer: 50 * 1024 * 1024, // 50MB for build output\n });\n } catch (error) {\n const err = error as { stderr?: string; message?: string };\n throw new AssetError(`Docker build failed: ${err.stderr || err.message || String(error)}`);\n }\n }\n\n /**\n * Authenticate with ECR\n */\n private async ecrLogin(client: ECRClient, accountId: string, region: string): Promise<void> {\n const response = await client.send(new GetAuthorizationTokenCommand({}));\n const authData = response.authorizationData?.[0];\n\n if (!authData?.authorizationToken) {\n throw new AssetError('Failed to get ECR authorization token');\n }\n\n const token = Buffer.from(authData.authorizationToken, 'base64').toString();\n const [username, password] = token.split(':');\n const endpoint =\n authData.proxyEndpoint || `https://${accountId}.dkr.ecr.${region}.amazonaws.com`;\n\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(\n 'docker',\n ['login', '--username', username!, '--password-stdin', endpoint],\n {\n stdio: ['pipe', 'pipe', 'pipe'],\n }\n );\n\n let stderr = '';\n proc.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new AssetError(`ECR login failed: ${stderr.trim()}`));\n }\n });\n\n proc.on('error', (err) => {\n reject(new AssetError(`ECR login failed: ${err.message}`));\n });\n\n // Write password to stdin and close\n proc.stdin?.write(password);\n proc.stdin?.end();\n });\n }\n\n /**\n * Tag Docker image\n */\n private async tagImage(source: string, target: string): Promise<void> {\n await execFileAsync('docker', ['tag', source, target]);\n }\n\n /**\n * Push Docker image\n */\n private async pushImage(uri: string): Promise<void> {\n this.logger.debug(`Pushing: ${uri}`);\n try {\n await execFileAsync('docker', ['push', uri], {\n maxBuffer: 50 * 1024 * 1024,\n });\n } catch (error) {\n const err = error as { stderr?: string; message?: string };\n throw new AssetError(`Docker push failed: ${err.stderr || err.message || String(error)}`);\n }\n }\n\n /**\n * Replace placeholders in destination values\n */\n private resolvePlaceholders(\n value: string,\n accountId: string,\n region: string,\n partition = 'aws'\n ): string {\n return value\n .replace(/\\$\\{AWS::AccountId\\}/g, accountId)\n .replace(/\\$\\{AWS::Region\\}/g, region)\n .replace(/\\$\\{AWS::Partition\\}/g, partition);\n }\n}\n", "import { getLogger } from '../utils/logger.js';\n\n/**\n * Node types in the work graph\n */\nexport type WorkNodeType = 'asset-build' | 'asset-publish' | 'stack';\n\n/**\n * Node states\n */\nexport type NodeState = 'pending' | 'queued' | 'running' | 'completed' | 'failed' | 'skipped';\n\n/**\n * A node in the work graph\n */\nexport interface WorkNode {\n id: string;\n type: WorkNodeType;\n dependencies: Set<string>;\n state: NodeState;\n /** Custom data attached to this node */\n data: unknown;\n}\n\n/**\n * Concurrency limits per node type\n */\nexport interface WorkGraphConcurrency {\n 'asset-build': number;\n 'asset-publish': number;\n stack: number;\n}\n\n/**\n * Work graph for orchestrating asset building, publishing and stack deployments.\n *\n * Manages a DAG of nodes with dependencies, executing them in parallel\n * with per-type concurrency limits. Nodes become ready when all their\n * dependencies are completed.\n *\n * Node types:\n * - asset-build: Docker image build (CPU/memory bound)\n * - asset-publish: S3 upload or ECR push (I/O bound)\n * - stack: Stack deployment (depends on its asset nodes)\n *\n * Dependencies:\n * - File assets: asset-publish \u2192 stack\n * - Docker assets: asset-build \u2192 asset-publish \u2192 stack\n * - Inter-stack: stack \u2192 stack (CDK dependency order)\n */\nexport class WorkGraph {\n private nodes = new Map<string, WorkNode>();\n private logger = getLogger().child('WorkGraph');\n\n addNode(node: WorkNode): void {\n this.nodes.set(node.id, node);\n }\n\n /**\n * Execute all nodes in the graph with bounded concurrency per type.\n */\n async execute(\n concurrency: WorkGraphConcurrency,\n fn: (node: WorkNode) => Promise<void>\n ): Promise<void> {\n const active: Record<WorkNodeType, number> = { 'asset-build': 0, 'asset-publish': 0, stack: 0 };\n const errors: Array<{ nodeId: string; error: unknown }> = [];\n\n return new Promise<void>((resolve, reject) => {\n const dispatch = (): void => {\n // Find ready nodes: pending with all dependencies completed\n const ready: WorkNode[] = [];\n for (const node of this.nodes.values()) {\n if (node.state !== 'pending') continue;\n const depsReady = [...node.dependencies].every((depId) => {\n const dep = this.nodes.get(depId);\n return dep && dep.state === 'completed';\n });\n if (depsReady) {\n ready.push(node);\n }\n }\n\n // Skip nodes with failed dependencies\n for (const node of this.nodes.values()) {\n if (node.state !== 'pending') continue;\n const hasFailedDep = [...node.dependencies].some((depId) => {\n const dep = this.nodes.get(depId);\n return dep && (dep.state === 'failed' || dep.state === 'skipped');\n });\n if (hasFailedDep) {\n node.state = 'skipped';\n this.logger.debug(`Skipped ${node.id}: dependency failed`);\n }\n }\n\n // Start eligible nodes\n for (const node of ready) {\n if (active[node.type] >= concurrency[node.type]) continue;\n\n node.state = 'running';\n active[node.type]++;\n\n fn(node)\n .then(() => {\n node.state = 'completed';\n })\n .catch((error) => {\n node.state = 'failed';\n errors.push({ nodeId: node.id, error });\n this.logger.error(\n `Failed: ${node.id}: ${error instanceof Error ? error.message : String(error)}`\n );\n })\n .finally(() => {\n active[node.type]--;\n dispatch(); // Re-evaluate after each completion\n });\n }\n\n // Check termination\n const totalActive = active['asset-build'] + active['asset-publish'] + active['stack'];\n if (totalActive === 0) {\n const pending = [...this.nodes.values()].filter(\n (n) => n.state === 'pending' || n.state === 'queued'\n );\n\n if (pending.length > 0) {\n reject(\n new Error(\n `Deadlock detected: ${pending.length} node(s) stuck with unresolvable dependencies`\n )\n );\n return;\n }\n\n if (errors.length > 0) {\n const skippedCount = [...this.nodes.values()].filter(\n (n) => n.state === 'skipped'\n ).length;\n const msg = errors\n .map(\n (e) =>\n ` - ${e.nodeId}: ${e.error instanceof Error ? e.error.message : String(e.error)}`\n )\n .join('\\n');\n reject(\n new Error(\n `${errors.length} node(s) failed${skippedCount > 0 ? `, ${skippedCount} skipped` : ''}:\\n${msg}`\n )\n );\n return;\n }\n\n resolve();\n }\n };\n\n dispatch();\n });\n }\n\n /**\n * Get summary of node counts by type\n */\n summary(): Record<WorkNodeType, number> {\n const counts: Record<WorkNodeType, number> = { 'asset-build': 0, 'asset-publish': 0, stack: 0 };\n for (const node of this.nodes.values()) {\n counts[node.type]++;\n }\n return counts;\n }\n}\n", "import {\n S3Client,\n GetObjectCommand,\n PutObjectCommand,\n DeleteObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n NoSuchKey,\n} from '@aws-sdk/client-s3';\nimport type { StackState } from '../types/state.js';\nimport type { StateBackendConfig } from '../types/config.js';\nimport { getLogger } from '../utils/logger.js';\nimport { StateError } from '../utils/error-handler.js';\n\n/**\n * S3-based state backend using conditional writes for optimistic locking\n */\nexport class S3StateBackend {\n private logger = getLogger().child('S3StateBackend');\n\n constructor(\n private s3Client: S3Client,\n private config: StateBackendConfig\n ) {}\n\n /**\n * Get the S3 key for a stack's state file\n */\n private getStateKey(stackName: string): string {\n return `${this.config.prefix}/${stackName}/state.json`;\n }\n\n /**\n * Check if state exists for a stack\n */\n async stateExists(stackName: string): Promise<boolean> {\n const key = this.getStateKey(stackName);\n\n try {\n await this.s3Client.send(\n new HeadObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n return true;\n } catch (error) {\n if (error instanceof NoSuchKey || (error as { name: string }).name === 'NotFound') {\n return false;\n }\n throw new StateError(\n `Failed to check if state exists for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get state for a stack\n *\n * Note: S3 returns ETag with surrounding quotes (e.g., \"abc123\").\n * We preserve the quotes as they are required for IfMatch conditions.\n */\n async getState(stackName: string): Promise<{ state: StackState; etag: string } | null> {\n const key = this.getStateKey(stackName);\n\n try {\n this.logger.debug(`Getting state for stack: ${stackName}`);\n\n const response = await this.s3Client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n\n if (!response.Body) {\n throw new StateError(`State file for stack '${stackName}' has no body`);\n }\n\n if (!response.ETag) {\n throw new StateError(`State file for stack '${stackName}' has no ETag`);\n }\n\n const bodyString = await response.Body.transformToString();\n const state = JSON.parse(bodyString) as StackState;\n\n this.logger.debug(`Retrieved state for stack: ${stackName}, ETag: ${response.ETag}`);\n\n // ETag is returned with quotes (e.g., \"abc123\") which is required for IfMatch\n return {\n state,\n etag: response.ETag,\n };\n } catch (error) {\n if (error instanceof NoSuchKey || (error as { name: string }).name === 'NoSuchKey') {\n this.logger.debug(`No existing state for stack: ${stackName}`);\n return null;\n }\n\n if (error instanceof StateError) {\n throw error;\n }\n\n throw new StateError(\n `Failed to get state for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Save state for a stack with optimistic locking\n *\n * @param stackName Stack name\n * @param state State to save\n * @param expectedEtag Expected ETag for optimistic locking (optional for new state).\n * Must include quotes if provided (e.g., \"abc123\")\n * @returns New ETag (with quotes, e.g., \"abc123\")\n */\n async saveState(stackName: string, state: StackState, expectedEtag?: string): Promise<string> {\n const key = this.getStateKey(stackName);\n\n try {\n this.logger.debug(\n `Saving state for stack: ${stackName}${expectedEtag ? `, expected ETag: ${expectedEtag}` : ''}`\n );\n\n const body = JSON.stringify(state, null, 2);\n const response = await this.s3Client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: body,\n ContentLength: Buffer.byteLength(body),\n ContentType: 'application/json',\n ...(expectedEtag && { IfMatch: expectedEtag }),\n })\n );\n\n if (!response.ETag) {\n throw new StateError(`No ETag returned after saving state for stack '${stackName}'`);\n }\n\n this.logger.debug(`State saved for stack: ${stackName}, new ETag: ${response.ETag}`);\n\n return response.ETag;\n } catch (error) {\n if ((error as { name: string }).name === 'PreconditionFailed') {\n throw new StateError(\n `State has been modified by another process. Expected ETag: ${expectedEtag}, but state has changed.`\n );\n }\n\n throw new StateError(\n `Failed to save state for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Delete state for a stack\n */\n async deleteState(stackName: string): Promise<void> {\n const key = this.getStateKey(stackName);\n\n try {\n this.logger.debug(`Deleting state for stack: ${stackName}`);\n\n await this.s3Client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n\n this.logger.debug(`State deleted for stack: ${stackName}`);\n } catch (error) {\n throw new StateError(\n `Failed to delete state for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * List all stacks with state\n */\n async listStacks(): Promise<string[]> {\n try {\n this.logger.debug('Listing all stacks');\n\n const response = await this.s3Client.send(\n new ListObjectsV2Command({\n Bucket: this.config.bucket,\n Prefix: `${this.config.prefix}/`,\n Delimiter: '/',\n })\n );\n\n if (!response.CommonPrefixes) {\n return [];\n }\n\n // Extract stack names from prefixes\n // Prefix format: \"{prefix}/{stackName}/\"\n const stackNames = response.CommonPrefixes.map((prefix) => {\n const prefixStr = prefix.Prefix || '';\n const parts = prefixStr.split('/');\n // Get the second-to-last part (stack name)\n return parts[parts.length - 2];\n }).filter((name): name is string => Boolean(name));\n\n this.logger.debug(`Found ${stackNames.length} stacks`);\n\n return stackNames;\n } catch (error) {\n throw new StateError(\n `Failed to list stacks: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n", "import {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n NoSuchKey,\n S3ServiceException,\n} from '@aws-sdk/client-s3';\nimport type { LockInfo } from '../types/state.js';\nimport type { StateBackendConfig } from '../types/config.js';\nimport { getLogger } from '../utils/logger.js';\nimport { LockError } from '../utils/error-handler.js';\nimport { hostname } from 'os';\n\n/**\n * Options for LockManager constructor\n */\nexport interface LockManagerOptions {\n /** Lock TTL in minutes (default: 30) */\n ttlMinutes?: number;\n}\n\n/**\n * S3-based lock manager using conditional writes (If-None-Match)\n *\n * Implements distributed locking using S3's If-None-Match: \"*\" condition\n * which ensures atomic lock acquisition.\n *\n * Locks have a TTL (time-to-live). Expired locks are automatically cleaned up\n * during acquisition attempts.\n */\nexport class LockManager {\n private logger = getLogger().child('LockManager');\n private readonly ttlMs: number;\n\n constructor(\n private s3Client: S3Client,\n private config: StateBackendConfig,\n options?: LockManagerOptions\n ) {\n const ttlMinutes = options?.ttlMinutes ?? 30;\n this.ttlMs = ttlMinutes * 60 * 1000;\n }\n\n /**\n * Get the S3 key for a stack's lock file\n */\n private getLockKey(stackName: string): string {\n return `${this.config.prefix}/${stackName}/lock.json`;\n }\n\n /**\n * Get default lock owner identifier\n */\n private getDefaultOwner(): string {\n try {\n const host = hostname();\n const user = process.env['USER'] || process.env['USERNAME'] || 'unknown';\n const pid = process.pid;\n return `${user}@${host}:${pid}`;\n } catch {\n return `cdkd:${process.pid}`;\n }\n }\n\n /**\n * Check if a lock is expired based on its expiresAt field\n */\n private isLockExpired(lockInfo: LockInfo): boolean {\n return Date.now() >= lockInfo.expiresAt;\n }\n\n /**\n * Format a human-readable duration from milliseconds\n */\n private formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m${remainingSeconds}s`;\n }\n\n /**\n * Try to acquire a lock for a stack\n *\n * Uses If-None-Match: \"*\" to ensure atomic lock acquisition.\n * If an expired lock exists, it will be cleaned up and re-acquired.\n *\n * @param stackName Stack name\n * @param owner Lock owner identifier (defaults to user@hostname:pid)\n * @param operation Operation being performed (e.g., \"deploy\", \"destroy\")\n */\n async acquireLock(stackName: string, owner?: string, operation?: string): Promise<boolean> {\n const key = this.getLockKey(stackName);\n const lockOwner = owner || this.getDefaultOwner();\n const now = Date.now();\n\n const lockInfo: LockInfo = {\n owner: lockOwner,\n timestamp: now,\n expiresAt: now + this.ttlMs,\n ...(operation && { operation }),\n };\n\n try {\n this.logger.debug(`Attempting to acquire lock for stack: ${stackName}`);\n\n const lockBody = JSON.stringify(lockInfo, null, 2);\n await this.s3Client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: lockBody,\n ContentLength: Buffer.byteLength(lockBody),\n ContentType: 'application/json',\n IfNoneMatch: '*', // Only succeed if object doesn't exist\n })\n );\n\n this.logger.debug(`Lock acquired for stack: ${stackName}, owner: ${lockOwner}`);\n return true;\n } catch (error) {\n // Check for PreconditionFailed error (S3 condition not met - lock already exists)\n if (error instanceof S3ServiceException && error.name === 'PreconditionFailed') {\n this.logger.debug(`Lock already exists for stack: ${stackName}`);\n\n // Check if the existing lock is expired\n const existingLock = await this.getLockInfo(stackName);\n if (existingLock && this.isLockExpired(existingLock)) {\n this.logger.info(\n `Expired lock detected for stack: ${stackName} (owner: ${existingLock.owner}, ` +\n `expired ${this.formatDuration(now - existingLock.expiresAt)} ago). Cleaning up...`\n );\n\n // Delete the expired lock and retry acquisition\n await this.deleteLock(stackName);\n\n // Retry once after cleaning up expired lock\n try {\n const retryBody = JSON.stringify(lockInfo, null, 2);\n await this.s3Client.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: retryBody,\n ContentLength: Buffer.byteLength(retryBody),\n ContentType: 'application/json',\n IfNoneMatch: '*',\n })\n );\n\n this.logger.debug(\n `Lock acquired for stack: ${stackName} after expired lock cleanup, owner: ${lockOwner}`\n );\n return true;\n } catch (retryError) {\n if (\n retryError instanceof S3ServiceException &&\n retryError.name === 'PreconditionFailed'\n ) {\n // Another process acquired the lock between our delete and retry\n this.logger.debug(\n `Lock was acquired by another process during expired lock cleanup for stack: ${stackName}`\n );\n return false;\n }\n throw retryError;\n }\n }\n\n return false;\n }\n\n throw new LockError(\n `Failed to acquire lock for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Get current lock information\n */\n async getLockInfo(stackName: string): Promise<LockInfo | null> {\n const key = this.getLockKey(stackName);\n\n try {\n this.logger.debug(`Getting lock info for stack: ${stackName}`);\n\n const response = await this.s3Client.send(\n new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n\n if (!response.Body) {\n throw new LockError(`Lock file for stack '${stackName}' has no body`);\n }\n\n const bodyString = await response.Body.transformToString();\n const lockInfo = JSON.parse(bodyString) as LockInfo;\n\n this.logger.debug(`Lock info for stack: ${stackName}:`, lockInfo);\n\n return lockInfo;\n } catch (error) {\n if (error instanceof NoSuchKey) {\n this.logger.debug(`No lock exists for stack: ${stackName}`);\n return null;\n }\n\n if (error instanceof LockError) {\n throw error;\n }\n\n throw new LockError(\n `Failed to get lock info for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Release a lock for a stack\n */\n async releaseLock(stackName: string): Promise<void> {\n const key = this.getLockKey(stackName);\n\n try {\n this.logger.debug(`Releasing lock for stack: ${stackName}`);\n\n await this.s3Client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n\n this.logger.debug(`Lock released for stack: ${stackName}`);\n } catch (error) {\n throw new LockError(\n `Failed to release lock for stack '${stackName}': ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Force release a lock regardless of owner or expiry status\n *\n * This is intended for CLI usage (e.g., --force-unlock flag) when a lock\n * is stuck and needs manual intervention.\n */\n async forceReleaseLock(stackName: string): Promise<void> {\n const lockInfo = await this.getLockInfo(stackName);\n\n if (!lockInfo) {\n this.logger.warn(`No lock to force release for stack: ${stackName}`);\n return;\n }\n\n this.logger.warn(\n `Force releasing lock for stack: ${stackName}, owner: ${lockInfo.owner}` +\n `${lockInfo.operation ? `, operation: ${lockInfo.operation}` : ''}` +\n `, expired: ${this.isLockExpired(lockInfo)}`\n );\n\n await this.deleteLock(stackName);\n }\n\n /**\n * Internal method to delete the lock file from S3\n */\n private async deleteLock(stackName: string): Promise<void> {\n const key = this.getLockKey(stackName);\n\n await this.s3Client.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n }\n\n /**\n * Acquire lock with retry logic\n *\n * Retries up to maxRetries times with retryDelay between attempts.\n * If lock is expired, cleans it up automatically.\n * On failure, provides helpful message with lock owner and expiry information.\n *\n * @param stackName Stack name\n * @param owner Lock owner identifier\n * @param operation Operation being performed\n * @param maxRetries Maximum number of retries (default: 3)\n * @param retryDelay Delay between retries in milliseconds (default: 2000)\n */\n async acquireLockWithRetry(\n stackName: string,\n owner?: string,\n operation?: string,\n maxRetries = 3,\n retryDelay = 2000\n ): Promise<void> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const acquired = await this.acquireLock(stackName, owner, operation);\n\n if (acquired) {\n return;\n }\n\n // Lock exists and is not expired - show info and possibly retry\n const lockInfo = await this.getLockInfo(stackName);\n\n if (lockInfo) {\n const remainingMs = lockInfo.expiresAt - Date.now();\n\n if (attempt < maxRetries) {\n this.logger.info(\n `Stack '${stackName}' is locked by ${lockInfo.owner}` +\n `${lockInfo.operation ? ` (operation: ${lockInfo.operation})` : ''}` +\n `. Lock expires in ${this.formatDuration(remainingMs)}.` +\n ` Retrying in ${this.formatDuration(retryDelay)}... (attempt ${attempt + 1}/${maxRetries})`\n );\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n continue;\n }\n }\n }\n\n // Failed to acquire lock after all retries\n const lockInfo = await this.getLockInfo(stackName);\n const expiresIn = lockInfo ? this.formatDuration(lockInfo.expiresAt - Date.now()) : 'unknown';\n\n throw new LockError(\n `Failed to acquire lock for stack '${stackName}' after ${maxRetries + 1} attempts. ` +\n (lockInfo\n ? `Locked by: ${lockInfo.owner}` +\n `${lockInfo.operation ? `, operation: ${lockInfo.operation}` : ''}` +\n `, expires in: ${expiresIn}. ` +\n `Use --force-unlock to manually release the lock.`\n : 'Lock exists but could not read lock info.')\n );\n }\n}\n", "import graphlib from 'graphlib';\nimport type { CloudFormationTemplate } from '../types/resource.js';\nimport { TemplateParser } from './template-parser.js';\nimport { getLogger } from '../utils/logger.js';\nimport { DependencyError } from '../utils/error-handler.js';\n\nconst { Graph, alg } = graphlib;\ntype GraphType = graphlib.Graph;\n\n/**\n * Dependency graph builder for CloudFormation resources\n *\n * Builds a directed acyclic graph (DAG) of resource dependencies\n * based on Ref, Fn::GetAtt, and DependsOn\n */\nexport class DagBuilder {\n private logger = getLogger().child('DagBuilder');\n private parser = new TemplateParser();\n\n /**\n * Build dependency graph from CloudFormation template\n *\n * Creates a directed graph where:\n * - Nodes = resource logical IDs\n * - Edges = dependencies (A -> B means B depends on A)\n */\n buildGraph(template: CloudFormationTemplate): GraphType {\n const graph = new Graph({ directed: true });\n\n this.logger.debug('Building dependency graph...');\n\n // Add all resources as nodes\n const resourceIds = this.parser.getResourceIds(template);\n resourceIds.forEach((logicalId) => {\n const resource = this.parser.getResource(template, logicalId);\n graph.setNode(logicalId, resource);\n this.logger.debug(`Added node: ${logicalId} (${resource?.Type})`);\n });\n\n this.logger.debug(`Total nodes: ${resourceIds.length}`);\n\n // Add edges for dependencies\n let edgeCount = 0;\n for (const logicalId of resourceIds) {\n const resource = this.parser.getResource(template, logicalId);\n if (!resource) {\n continue;\n }\n\n const dependencies = this.parser.extractDependencies(resource);\n\n for (const depId of dependencies) {\n // Only add edge if the dependency exists in the template\n if (graph.hasNode(depId)) {\n graph.setEdge(depId, logicalId); // depId -> logicalId (logicalId depends on depId)\n edgeCount++;\n this.logger.debug(`Added edge: ${depId} -> ${logicalId}`);\n } else {\n this.logger.warn(\n `Resource ${logicalId} depends on ${depId}, but ${depId} not found in template`\n );\n }\n }\n }\n\n this.logger.debug(`Dependency graph built: ${resourceIds.length} nodes, ${edgeCount} edges`);\n\n // Validate graph is acyclic\n if (!alg.isAcyclic(graph)) {\n const cycles = this.findCycles(graph);\n throw new DependencyError(\n `Circular dependency detected in template. Cycles: ${cycles.map((c) => c.join(' -> ')).join('; ')}`\n );\n }\n\n return graph;\n }\n\n /**\n * Get execution levels via topological sort\n *\n * Returns resources grouped by execution level:\n * - Level 0: Resources with no dependencies\n * - Level 1: Resources that depend only on Level 0\n * - Level N: Resources that depend on Level 0..N-1\n *\n * Resources in the same level can be executed in parallel.\n */\n getExecutionLevels(graph: GraphType): string[][] {\n const levels: string[][] = [];\n const graphCopy = new Graph({ directed: true });\n\n // Copy the graph\n graph.nodes().forEach((node: string) => {\n graphCopy.setNode(node, graph.node(node));\n });\n graph.edges().forEach((edge: graphlib.Edge) => {\n graphCopy.setEdge(edge.v, edge.w);\n });\n\n this.logger.debug('Computing execution levels...');\n\n let levelNum = 0;\n while (graphCopy.nodeCount() > 0) {\n // Find nodes with no incoming edges (no dependencies)\n const readyNodes = graphCopy.nodes().filter((node) => {\n const predecessors = graphCopy.predecessors(node);\n return !predecessors || predecessors.length === 0;\n });\n\n if (readyNodes.length === 0) {\n // This should not happen if graph is acyclic, but check anyway\n const remaining = graphCopy.nodes();\n throw new DependencyError(\n `Circular dependency detected. Remaining nodes: ${remaining.join(', ')}`\n );\n }\n\n this.logger.debug(\n `Level ${levelNum}: ${readyNodes.length} resources - ${readyNodes.join(', ')}`\n );\n levels.push(readyNodes);\n\n // Remove these nodes from the graph\n readyNodes.forEach((node) => {\n graphCopy.removeNode(node);\n });\n\n levelNum++;\n }\n\n this.logger.debug(`Execution levels computed: ${levels.length} levels`);\n\n return levels;\n }\n\n /**\n * Find all cycles in the graph\n */\n private findCycles(graph: GraphType): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const path: string[] = [];\n\n const dfs = (node: string): boolean => {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const successors = graph.successors(node) || [];\n\n for (const successor of successors) {\n if (!visited.has(successor)) {\n if (dfs(successor)) {\n return true;\n }\n } else if (recursionStack.has(successor)) {\n // Found a cycle\n const cycleStart = path.indexOf(successor);\n const cycle = path.slice(cycleStart);\n cycle.push(successor);\n cycles.push(cycle);\n return true;\n }\n }\n\n path.pop();\n recursionStack.delete(node);\n return false;\n };\n\n for (const node of graph.nodes()) {\n if (!visited.has(node)) {\n dfs(node);\n }\n }\n\n return cycles;\n }\n\n /**\n * Get all dependencies for a resource (transitive)\n */\n getAllDependencies(graph: GraphType, logicalId: string): Set<string> {\n const dependencies = new Set<string>();\n\n const visit = (node: string) => {\n const predecessors = graph.predecessors(node) || [];\n predecessors.forEach((pred: string) => {\n if (!dependencies.has(pred)) {\n dependencies.add(pred);\n visit(pred); // Recursively visit dependencies\n }\n });\n };\n\n visit(logicalId);\n return dependencies;\n }\n\n /**\n * Get all dependents for a resource (transitive)\n */\n getAllDependents(graph: GraphType, logicalId: string): Set<string> {\n const dependents = new Set<string>();\n\n const visit = (node: string) => {\n const successors = graph.successors(node) || [];\n successors.forEach((succ: string) => {\n if (!dependents.has(succ)) {\n dependents.add(succ);\n visit(succ); // Recursively visit dependents\n }\n });\n };\n\n visit(logicalId);\n return dependents;\n }\n\n /**\n * Get direct dependencies for a resource\n */\n getDirectDependencies(graph: GraphType, logicalId: string): string[] {\n return graph.predecessors(logicalId) || [];\n }\n\n /**\n * Get direct dependents for a resource\n */\n getDirectDependents(graph: GraphType, logicalId: string): string[] {\n return graph.successors(logicalId) || [];\n }\n\n /**\n * Check if resource A depends on resource B\n */\n dependsOn(graph: GraphType, resourceA: string, resourceB: string): boolean {\n const deps = this.getAllDependencies(graph, resourceA);\n return deps.has(resourceB);\n }\n}\n", "import type { CloudFormationTemplate, TemplateResource } from '../types/resource.js';\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * CloudFormation template parser\n *\n * Provides utilities for parsing and extracting information from\n * CloudFormation templates\n */\nexport class TemplateParser {\n private logger = getLogger().child('TemplateParser');\n\n /**\n * Extract all resource logical IDs from template\n */\n getResourceIds(template: CloudFormationTemplate): string[] {\n return Object.keys(template.Resources);\n }\n\n /**\n * Get a specific resource from template\n */\n getResource(template: CloudFormationTemplate, logicalId: string): TemplateResource | undefined {\n return template.Resources[logicalId];\n }\n\n /**\n * Extract all dependencies for a resource\n *\n * Analyzes:\n * - DependsOn attribute\n * - Ref intrinsic functions\n * - Fn::GetAtt intrinsic functions\n */\n extractDependencies(resource: TemplateResource): Set<string> {\n const dependencies = new Set<string>();\n\n // 1. DependsOn attribute\n if (resource.DependsOn) {\n const dependsOn = Array.isArray(resource.DependsOn)\n ? resource.DependsOn\n : [resource.DependsOn];\n\n dependsOn.forEach((dep) => {\n if (typeof dep === 'string') {\n dependencies.add(dep);\n }\n });\n }\n\n // 2. Ref and Fn::GetAtt in Properties\n if (resource.Properties) {\n this.extractRefsFromValue(resource.Properties, dependencies);\n }\n\n // 3. Ref and Fn::GetAtt in other attributes (Metadata, UpdatePolicy, etc.)\n if (resource.Metadata) {\n this.extractRefsFromValue(resource.Metadata, dependencies);\n }\n\n return dependencies;\n }\n\n /**\n * Recursively extract Ref and Fn::GetAtt from a value\n */\n private extractRefsFromValue(value: unknown, dependencies: Set<string>): void {\n if (value === null || value === undefined) {\n return;\n }\n\n // Check if value is an object\n if (typeof value !== 'object') {\n return;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n value.forEach((item) => this.extractRefsFromValue(item, dependencies));\n return;\n }\n\n // Handle objects\n const obj = value as Record<string, unknown>;\n\n // Check for Ref\n if ('Ref' in obj && typeof obj['Ref'] === 'string') {\n // Ignore pseudo parameters (AWS::Region, AWS::AccountId, etc.)\n if (!obj['Ref'].startsWith('AWS::')) {\n dependencies.add(obj['Ref']);\n }\n return;\n }\n\n // Check for Fn::GetAtt\n if ('Fn::GetAtt' in obj) {\n const getAtt = obj['Fn::GetAtt'];\n if (Array.isArray(getAtt) && getAtt.length >= 1 && typeof getAtt[0] === 'string') {\n dependencies.add(getAtt[0]);\n }\n return;\n }\n\n // Recursively process all values\n Object.values(obj).forEach((v) => this.extractRefsFromValue(v, dependencies));\n }\n\n /**\n * Check if a resource has a specific property\n */\n hasProperty(resource: TemplateResource, propertyPath: string): boolean {\n if (!resource.Properties) {\n return false;\n }\n\n const parts = propertyPath.split('.');\n let current: unknown = resource.Properties;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return false;\n }\n\n const obj = current as Record<string, unknown>;\n if (!(part in obj)) {\n return false;\n }\n\n current = obj[part];\n }\n\n return true;\n }\n\n /**\n * Get a property value from a resource\n */\n getProperty(resource: TemplateResource, propertyPath: string): unknown {\n if (!resource.Properties) {\n return undefined;\n }\n\n const parts = propertyPath.split('.');\n let current: unknown = resource.Properties;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return undefined;\n }\n\n const obj = current as Record<string, unknown>;\n if (!(part in obj)) {\n return undefined;\n }\n\n current = obj[part];\n }\n\n return current;\n }\n\n /**\n * Validate template structure\n */\n validateTemplate(template: unknown): template is CloudFormationTemplate {\n if (typeof template !== 'object' || template === null) {\n this.logger.error('Template is not an object');\n return false;\n }\n\n const t = template as Record<string, unknown>;\n\n if (!('Resources' in t)) {\n this.logger.error('Template missing Resources section');\n return false;\n }\n\n if (typeof t['Resources'] !== 'object' || t['Resources'] === null) {\n this.logger.error('Template Resources is not an object');\n return false;\n }\n\n const resources = t['Resources'] as Record<string, unknown>;\n\n // Validate each resource has a Type\n for (const [logicalId, resource] of Object.entries(resources)) {\n if (typeof resource !== 'object' || resource === null) {\n this.logger.error(`Resource ${logicalId} is not an object`);\n return false;\n }\n\n const r = resource as Record<string, unknown>;\n if (!('Type' in r) || typeof r['Type'] !== 'string') {\n this.logger.error(`Resource ${logicalId} missing Type or Type is not a string`);\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get all resources of a specific type\n */\n getResourcesByType(\n template: CloudFormationTemplate,\n resourceType: string\n ): Map<string, TemplateResource> {\n const resources = new Map<string, TemplateResource>();\n\n for (const [logicalId, resource] of Object.entries(template.Resources)) {\n if (resource.Type === resourceType) {\n resources.set(logicalId, resource);\n }\n }\n\n return resources;\n }\n\n /**\n * Count resources in template\n */\n countResources(template: CloudFormationTemplate): number {\n return Object.keys(template.Resources).length;\n }\n}\n", "/**\n * Replacement rules for AWS resource types\n *\n * Defines which property changes require resource replacement (delete + recreate)\n * vs. in-place updates.\n *\n * Based on CloudFormation update behaviors:\n * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html\n */\n\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * Resource replacement rule\n */\ninterface ReplacementRule {\n /** Properties that always require replacement when changed */\n replacementProperties: Set<string>;\n /** Properties that never require replacement */\n updateableProperties?: Set<string>;\n /** Custom logic for conditional replacement */\n conditionalReplacements?: Map<string, (oldValue: unknown, newValue: unknown) => boolean>;\n}\n\n/**\n * Replacement rules registry\n *\n * Maps resource types to their replacement rules\n */\nexport class ReplacementRulesRegistry {\n private logger = getLogger().child('ReplacementRulesRegistry');\n private rules = new Map<string, ReplacementRule>();\n\n constructor() {\n this.initializeRules();\n }\n\n /**\n * Check if a property change requires replacement\n */\n requiresReplacement(\n resourceType: string,\n propertyPath: string,\n oldValue: unknown,\n newValue: unknown\n ): boolean {\n const rule = this.rules.get(resourceType);\n\n if (!rule) {\n // No specific rule for this resource type\n // Conservative approach: assume replacement may be required\n this.logger.debug(\n `No replacement rule for ${resourceType}, conservatively assuming replacement may be required for ${propertyPath}`\n );\n return false; // Default to updateable for unknown types\n }\n\n // Check if property always requires replacement\n if (rule.replacementProperties.has(propertyPath)) {\n this.logger.debug(`Property ${propertyPath} of ${resourceType} requires replacement`);\n return true;\n }\n\n // Check if property is explicitly updateable\n if (rule.updateableProperties?.has(propertyPath)) {\n return false;\n }\n\n // Check conditional replacements\n if (rule.conditionalReplacements?.has(propertyPath)) {\n const condition = rule.conditionalReplacements.get(propertyPath);\n if (condition) {\n const requires = condition(oldValue, newValue);\n this.logger.debug(\n `Conditional replacement for ${propertyPath} of ${resourceType}: ${requires}`\n );\n return requires;\n }\n }\n\n // If not explicitly defined, assume it's updateable\n return false;\n }\n\n /**\n * Initialize replacement rules for common AWS resource types\n */\n private initializeRules(): void {\n // S3 Bucket\n this.rules.set('AWS::S3::Bucket', {\n replacementProperties: new Set([\n 'BucketName', // Changing bucket name requires replacement\n ]),\n updateableProperties: new Set([\n 'Tags',\n 'VersioningConfiguration',\n 'LifecycleConfiguration',\n 'PublicAccessBlockConfiguration',\n 'BucketEncryption',\n 'LoggingConfiguration',\n 'WebsiteConfiguration',\n 'CorsConfiguration',\n 'NotificationConfiguration',\n ]),\n });\n\n // Lambda Function\n this.rules.set('AWS::Lambda::Function', {\n replacementProperties: new Set([\n 'FunctionName', // Changing function name requires replacement\n ]),\n updateableProperties: new Set([\n 'Code',\n 'Handler',\n 'Runtime',\n 'Description',\n 'Timeout',\n 'MemorySize',\n 'Role',\n 'Environment',\n 'Tags',\n 'VpcConfig',\n 'DeadLetterConfig',\n 'TracingConfig',\n 'Layers',\n 'FileSystemConfigs',\n ]),\n });\n\n // DynamoDB Table\n this.rules.set('AWS::DynamoDB::Table', {\n replacementProperties: new Set([\n 'TableName', // Changing table name requires replacement\n 'KeySchema', // Changing key schema requires replacement\n 'AttributeDefinitions', // Changing attributes (in key) requires replacement\n ]),\n updateableProperties: new Set([\n 'BillingMode',\n 'ProvisionedThroughput',\n 'GlobalSecondaryIndexes',\n 'LocalSecondaryIndexes',\n 'StreamSpecification',\n 'SSESpecification',\n 'Tags',\n 'TimeToLiveSpecification',\n 'PointInTimeRecoverySpecification',\n ]),\n });\n\n // SQS Queue\n this.rules.set('AWS::SQS::Queue', {\n replacementProperties: new Set([\n 'QueueName', // Changing queue name requires replacement\n 'FifoQueue', // Changing FIFO attribute requires replacement\n 'ContentBasedDeduplication', // Only for FIFO queues\n ]),\n updateableProperties: new Set([\n 'DelaySeconds',\n 'MaximumMessageSize',\n 'MessageRetentionPeriod',\n 'ReceiveMessageWaitTimeSeconds',\n 'VisibilityTimeout',\n 'RedrivePolicy',\n 'Tags',\n ]),\n });\n\n // IAM Role\n this.rules.set('AWS::IAM::Role', {\n replacementProperties: new Set([\n 'RoleName', // Changing role name requires replacement\n ]),\n updateableProperties: new Set([\n 'AssumeRolePolicyDocument',\n 'Description',\n 'ManagedPolicyArns',\n 'MaxSessionDuration',\n 'Path',\n 'PermissionsBoundary',\n 'Policies',\n 'Tags',\n ]),\n });\n\n // SNS Topic\n this.rules.set('AWS::SNS::Topic', {\n replacementProperties: new Set([\n 'TopicName', // Changing topic name requires replacement\n ]),\n updateableProperties: new Set(['DisplayName', 'Subscription', 'KmsMasterKeyId', 'Tags']),\n });\n\n // ECR Repository\n this.rules.set('AWS::ECR::Repository', {\n replacementProperties: new Set([\n 'RepositoryName', // Changing repository name requires replacement\n ]),\n updateableProperties: new Set([\n 'ImageScanningConfiguration',\n 'ImageTagMutability',\n 'LifecyclePolicy',\n 'RepositoryPolicyText',\n 'Tags',\n ]),\n });\n\n // CloudWatch Log Group\n this.rules.set('AWS::Logs::LogGroup', {\n replacementProperties: new Set([\n 'LogGroupName', // Changing log group name requires replacement\n ]),\n updateableProperties: new Set(['RetentionInDays', 'KmsKeyId']),\n });\n\n // API Gateway RestApi\n this.rules.set('AWS::ApiGateway::RestApi', {\n replacementProperties: new Set([\n 'Name', // Changing API name can require replacement in some cases\n ]),\n updateableProperties: new Set([\n 'Description',\n 'Policy',\n 'EndpointConfiguration',\n 'BinaryMediaTypes',\n 'MinimumCompressionSize',\n 'Tags',\n ]),\n });\n\n // ECS Task Definition\n this.rules.set('AWS::ECS::TaskDefinition', {\n replacementProperties: new Set([\n // Task definitions are immutable - any change requires replacement\n 'Family',\n 'ContainerDefinitions',\n 'Cpu',\n 'Memory',\n 'NetworkMode',\n 'RequiresCompatibilities',\n 'ExecutionRoleArn',\n 'TaskRoleArn',\n 'Volumes',\n ]),\n });\n\n // Add more resource types as needed\n this.logger.debug(`Initialized replacement rules for ${this.rules.size} resource types`);\n }\n}\n", "import type { CloudFormationTemplate } from '../types/resource.js';\nimport type { StackState, ChangeType, ResourceChange, PropertyChange } from '../types/state.js';\nimport { getLogger } from '../utils/logger.js';\nimport { ReplacementRulesRegistry } from './replacement-rules.js';\n\n/**\n * Best-effort resolver for intrinsic functions during diff calculation.\n * Should return the resolved value on success, or the original value if resolution fails.\n * Kept as a callback to avoid circular dependency between analyzer and deployment layers.\n */\nexport type IntrinsicResolveFn = (value: unknown) => Promise<unknown>;\n\n/**\n * Diff calculator for comparing desired state (template) with current state\n */\nexport class DiffCalculator {\n private logger = getLogger().child('DiffCalculator');\n private replacementRules = new ReplacementRulesRegistry();\n\n /**\n * Calculate changes needed to reach desired state\n *\n * @param currentState Current stack state (use existing state or create a new StackState with empty resources for new stacks)\n * @param desiredTemplate Desired CloudFormation template\n * @param resolveFn Optional intrinsic resolver. When provided, desired properties are\n * resolved against current state before comparison so that changes\n * buried inside intrinsics (e.g. `Fn::Join` literal args) are detected.\n * If resolution throws for a given property value, the unresolved\n * value is used (falling back to the original \"assume equal\" behavior).\n * @returns Map of logical ID to resource change\n */\n async calculateDiff(\n currentState: StackState,\n desiredTemplate: CloudFormationTemplate,\n resolveFn?: IntrinsicResolveFn\n ): Promise<Map<string, ResourceChange>> {\n const changes = new Map<string, ResourceChange>();\n\n const currentResources = currentState.resources;\n const desiredResources = desiredTemplate.Resources;\n\n this.logger.debug('Calculating diff...');\n this.logger.debug(`Current resources: ${Object.keys(currentResources).length}`);\n this.logger.debug(`Desired resources: ${Object.keys(desiredResources).length}`);\n\n // Track which resources we've seen\n const processedLogicalIds = new Set<string>();\n\n // Check for CREATE and UPDATE\n for (const [logicalId, desiredResource] of Object.entries(desiredResources)) {\n // Skip CDK metadata resources (they don't actually deploy anything)\n if (desiredResource.Type === 'AWS::CDK::Metadata') {\n this.logger.debug(`Skipping metadata resource: ${logicalId}`);\n processedLogicalIds.add(logicalId);\n continue;\n }\n\n processedLogicalIds.add(logicalId);\n\n const currentResource = currentResources[logicalId];\n\n if (!currentResource) {\n // Resource doesn't exist in current state -> CREATE\n changes.set(logicalId, {\n logicalId,\n changeType: 'CREATE',\n resourceType: desiredResource.Type,\n desiredProperties: desiredResource.Properties || {},\n });\n this.logger.debug(`CREATE: ${logicalId} (${desiredResource.Type})`);\n } else if (currentResource.resourceType !== desiredResource.Type) {\n // Resource type changed -> requires replacement (DELETE + CREATE)\n // For simplicity, we'll mark this as UPDATE with requiresReplacement\n const propertyChanges: PropertyChange[] = [\n {\n path: 'Type',\n oldValue: currentResource.resourceType,\n newValue: desiredResource.Type,\n requiresReplacement: true,\n },\n ];\n\n changes.set(logicalId, {\n logicalId,\n changeType: 'UPDATE',\n resourceType: desiredResource.Type,\n currentProperties: currentResource.properties,\n desiredProperties: desiredResource.Properties || {},\n propertyChanges,\n });\n this.logger.debug(\n `UPDATE (Type change): ${logicalId} (${currentResource.resourceType} -> ${desiredResource.Type})`\n );\n } else {\n // Resource exists with same type -> check properties.\n //\n // State stores already-resolved values (e.g. \"my-bucket-value\"), while the\n // template holds unresolved intrinsics (e.g. { \"Fn::Join\": [...] }). When an\n // intrinsic wraps literal content that changed (e.g. \"-value\" -> \"-value2\"),\n // a naive comparison would short-circuit on the intrinsic node and miss the\n // change. Resolving desired props against current state first avoids that.\n const rawDesiredProps = desiredResource.Properties || {};\n const desiredPropsForCompare = resolveFn\n ? await this.resolveBestEffort(rawDesiredProps, resolveFn)\n : rawDesiredProps;\n\n const propertyChanges = this.compareProperties(\n desiredResource.Type,\n currentResource.properties,\n desiredPropsForCompare\n );\n\n if (propertyChanges.length > 0) {\n // Properties changed -> UPDATE\n changes.set(logicalId, {\n logicalId,\n changeType: 'UPDATE',\n resourceType: desiredResource.Type,\n currentProperties: currentResource.properties,\n desiredProperties: rawDesiredProps,\n propertyChanges,\n });\n this.logger.debug(`UPDATE: ${logicalId} (${propertyChanges.length} property changes)`);\n } else {\n // No changes -> NO_CHANGE\n changes.set(logicalId, {\n logicalId,\n changeType: 'NO_CHANGE',\n resourceType: desiredResource.Type,\n currentProperties: currentResource.properties,\n desiredProperties: rawDesiredProps,\n });\n this.logger.debug(`NO_CHANGE: ${logicalId}`);\n }\n }\n }\n\n // Check for DELETE (resources in current state but not in desired template)\n for (const [logicalId, currentResource] of Object.entries(currentResources)) {\n if (!processedLogicalIds.has(logicalId)) {\n changes.set(logicalId, {\n logicalId,\n changeType: 'DELETE',\n resourceType: currentResource.resourceType,\n currentProperties: currentResource.properties,\n });\n this.logger.debug(`DELETE: ${logicalId} (${currentResource.resourceType})`);\n }\n }\n\n const summary = this.getSummary(changes);\n this.logger.debug(\n `Diff calculated: ${summary.create} CREATE, ${summary.update} UPDATE, ${summary.delete} DELETE, ${summary.noChange} NO_CHANGE`\n );\n\n return changes;\n }\n\n /**\n * Best-effort resolution of template property intrinsics against current state.\n *\n * Iterates top-level properties and resolves each independently: if resolution\n * throws (e.g. Ref to a resource that isn't in state yet), the original value\n * is kept so downstream comparison falls back to the \"assume intrinsic equals\n * anything\" behavior for that one value instead of failing the whole diff.\n */\n private async resolveBestEffort(\n properties: Record<string, unknown>,\n resolveFn: IntrinsicResolveFn\n ): Promise<Record<string, unknown>> {\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n try {\n resolved[key] = await resolveFn(value);\n } catch {\n resolved[key] = value;\n }\n }\n return resolved;\n }\n\n /**\n * Compare properties and return list of changes\n *\n * Uses ReplacementRulesRegistry to determine which property changes require replacement.\n * Reference: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html\n */\n private compareProperties(\n resourceType: string,\n currentProperties: Record<string, unknown>,\n desiredProperties: Record<string, unknown>\n ): PropertyChange[] {\n const changes: PropertyChange[] = [];\n\n // Get all property keys\n const allKeys = new Set([...Object.keys(currentProperties), ...Object.keys(desiredProperties)]);\n\n // Properties to ignore in diff (non-deterministic, changes on every synth)\n const ignoredProperties = new Set<string>();\n if (\n resourceType === 'AWS::CloudFormation::CustomResource' ||\n resourceType.startsWith('Custom::')\n ) {\n ignoredProperties.add('Timestamp');\n }\n\n for (const key of allKeys) {\n if (ignoredProperties.has(key)) continue;\n\n const oldValue = currentProperties[key];\n const newValue = desiredProperties[key];\n\n if (!this.valuesEqual(oldValue, newValue)) {\n // Check if this property change requires replacement\n const requiresReplacement = this.replacementRules.requiresReplacement(\n resourceType,\n key,\n oldValue,\n newValue\n );\n\n changes.push({\n path: key,\n oldValue,\n newValue,\n requiresReplacement,\n });\n\n if (requiresReplacement) {\n this.logger.debug(\n `Property ${key} of ${resourceType} requires replacement (${JSON.stringify(oldValue)} -> ${JSON.stringify(newValue)})`\n );\n }\n }\n }\n\n return changes;\n }\n\n private static readonly INTRINSIC_KEYS = new Set([\n 'Ref',\n 'Fn::Sub',\n 'Fn::GetAtt',\n 'Fn::Join',\n 'Fn::Select',\n 'Fn::Split',\n 'Fn::If',\n 'Fn::ImportValue',\n 'Fn::FindInMap',\n 'Fn::Base64',\n 'Fn::GetAZs',\n 'Fn::Equals',\n 'Fn::And',\n 'Fn::Or',\n 'Fn::Not',\n ]);\n\n /**\n * Check if a value is itself a CloudFormation intrinsic function.\n * e.g. { \"Ref\": \"MyResource\" } or { \"Fn::GetAtt\": [\"Res\", \"Arn\"] }\n * Does NOT match objects that merely contain intrinsics as nested children.\n */\n private static isIntrinsic(value: unknown): boolean {\n if (\n value === null ||\n value === undefined ||\n typeof value !== 'object' ||\n Array.isArray(value)\n ) {\n return false;\n }\n const keys = Object.keys(value as Record<string, unknown>);\n return keys.length === 1 && DiffCalculator.INTRINSIC_KEYS.has(keys[0]!);\n }\n\n /**\n * Deep equality check for values\n *\n * When comparing state (resolved values) with template (unresolved intrinsics),\n * treats intrinsic function nodes as \"not comparable\" and assumes equal.\n * This check happens at each level of recursion, so only the specific value\n * that IS an intrinsic gets skipped \u2014 sibling values are still compared normally.\n *\n * Example: { Variables: { AZURE_REGION: \"japaneast\", SECRET_NAME: { \"Fn::Join\": ... } } }\n * - AZURE_REGION: compared normally (string vs string)\n * - SECRET_NAME: one side is intrinsic \u2192 treated as equal (skip)\n */\n private valuesEqual(a: unknown, b: unknown): boolean {\n // Strict equality check\n if (a === b) {\n return true;\n }\n\n // Null/undefined check\n if (a == null || b == null) {\n return a === b;\n }\n\n // If either side is an intrinsic function node, we can't compare\n // (state has resolved value like \"arn:...\", template has { \"Fn::GetAtt\": [...] })\n if (DiffCalculator.isIntrinsic(a) || DiffCalculator.isIntrinsic(b)) {\n return true;\n }\n\n // Array check\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((val, index) => this.valuesEqual(val, b[index]));\n }\n\n // Object check \u2014 recurse into each key so intrinsics are detected per-value\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const bKeys = Object.keys(bObj);\n\n // Check keys in new (template) side exist in old (state) side with equal values.\n // Keys only in old side are ignored \u2014 they are typically AWS-added defaults\n // (e.g., IncludeCookies, Enabled, Prefix in CloudFront Logging) that don't\n // appear in the template but get stored in state after deployment.\n // Keys only in new side are real additions and will cause inequality.\n for (const key of bKeys) {\n if (!(key in aObj)) {\n return false; // New key added in template\n }\n if (!this.valuesEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n return true;\n }\n\n // Primitive types\n return false;\n }\n\n /**\n * Get summary of changes\n */\n getSummary(changes: Map<string, ResourceChange>): {\n create: number;\n update: number;\n delete: number;\n noChange: number;\n total: number;\n } {\n const summary = {\n create: 0,\n update: 0,\n delete: 0,\n noChange: 0,\n total: changes.size,\n };\n\n for (const change of changes.values()) {\n switch (change.changeType) {\n case 'CREATE':\n summary.create++;\n break;\n case 'UPDATE':\n summary.update++;\n break;\n case 'DELETE':\n summary.delete++;\n break;\n case 'NO_CHANGE':\n summary.noChange++;\n break;\n }\n }\n\n return summary;\n }\n\n /**\n * Filter changes by type\n */\n filterByType(changes: Map<string, ResourceChange>, type: ChangeType): ResourceChange[] {\n return Array.from(changes.values()).filter((change) => change.changeType === type);\n }\n\n /**\n * Check if there are any changes\n */\n hasChanges(changes: Map<string, ResourceChange>): boolean {\n return Array.from(changes.values()).some((change) => change.changeType !== 'NO_CHANGE');\n }\n\n /**\n * Get changes that require replacement\n */\n getReplacementChanges(changes: Map<string, ResourceChange>): ResourceChange[] {\n return Array.from(changes.values()).filter(\n (change) =>\n change.changeType === 'UPDATE' &&\n change.propertyChanges?.some((pc) => pc.requiresReplacement)\n );\n }\n}\n", "import {\n CloudControlClient,\n CreateResourceCommand,\n UpdateResourceCommand,\n DeleteResourceCommand,\n GetResourceCommand,\n GetResourceRequestStatusCommand,\n type ProgressEvent,\n} from '@aws-sdk/client-cloudcontrol';\nimport { DescribeTableCommand } from '@aws-sdk/client-dynamodb';\nimport { GetRestApiCommand } from '@aws-sdk/client-api-gateway';\nimport { GetCloudFrontOriginAccessIdentityCommand } from '@aws-sdk/client-cloudfront';\nimport { GetFunctionUrlConfigCommand } from '@aws-sdk/client-lambda';\nimport { getAccountInfo } from '../deployment/intrinsic-function-resolver.js';\nimport { getAwsClients } from '../utils/aws-clients.js';\nimport { getLogger } from '../utils/logger.js';\nimport { ProvisioningError } from '../utils/error-handler.js';\nimport { JsonPatchGenerator } from './json-patch-generator.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../types/resource.js';\n\n/**\n * AWS Cloud Control API Provider\n *\n * Provisions resources using the Cloud Control API, which provides\n * a unified interface for managing AWS resources.\n *\n * Note: Not all AWS resources are supported by Cloud Control API.\n * Use isSupportedResourceType() to check before usage.\n */\n/**\n * Properties that CC API expects as JSON strings, not objects.\n * CC API schema declares these as type: [\"string\", \"object\"] but\n * the implementation only accepts strings.\n */\nconst JSON_STRING_PROPERTIES: Record<string, Set<string>> = {\n 'AWS::Events::Rule': new Set(['EventPattern']),\n};\n\n/**\n * Stringify object properties that CC API expects as JSON strings.\n */\nfunction stringifyJsonProperties(\n resourceType: string,\n properties: Record<string, unknown>\n): Record<string, unknown> {\n const jsonProps = JSON_STRING_PROPERTIES[resourceType];\n if (!jsonProps) return properties;\n\n const result = { ...properties };\n for (const key of jsonProps) {\n if (key in result && typeof result[key] === 'object' && result[key] !== null) {\n result[key] = JSON.stringify(result[key]);\n }\n }\n return result;\n}\n\n/**\n * Recursively strip null and undefined values from an object.\n * This prevents CC API errors caused by null property values\n * (e.g., EventBridge Rule with null ScheduleExpression causes Java NPE).\n */\nfunction stripNullValues(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return undefined;\n }\n if (Array.isArray(obj)) {\n return obj.map(stripNullValues).filter((v) => v !== undefined);\n }\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n const stripped = stripNullValues(value);\n if (stripped !== undefined) {\n result[key] = stripped;\n }\n }\n return result;\n }\n return obj;\n}\n\nexport class CloudControlProvider implements ResourceProvider {\n private cloudControlClient: CloudControlClient;\n private logger = getLogger().child('CloudControlProvider');\n private patchGenerator = new JsonPatchGenerator();\n\n // Maximum time to wait for operation completion (15 minutes)\n private readonly MAX_WAIT_TIME_MS = 15 * 60 * 1000;\n // Initial poll interval (1 second) - increases with 1.5x exponential backoff\n private readonly INITIAL_POLL_INTERVAL_MS = 1_000;\n // Maximum poll interval (10 seconds)\n private readonly MAX_POLL_INTERVAL_MS = 10_000;\n\n constructor() {\n const awsClients = getAwsClients();\n this.cloudControlClient = awsClients.cloudControl;\n }\n\n /**\n * Create a resource using Cloud Control API\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating resource ${logicalId} (${resourceType})`);\n\n try {\n // Start resource creation\n const cleanProperties = stripNullValues(properties) as Record<string, unknown>;\n const ccProperties = stringifyJsonProperties(resourceType, cleanProperties);\n const desiredState = JSON.stringify(ccProperties);\n this.logger.debug(`DesiredState for ${logicalId}: ${desiredState}`);\n const createResponse = await this.cloudControlClient.send(\n new CreateResourceCommand({\n TypeName: resourceType,\n DesiredState: desiredState,\n })\n );\n\n if (!createResponse.ProgressEvent?.RequestToken) {\n throw new ProvisioningError(\n `Failed to create resource ${logicalId}: No request token received`,\n resourceType,\n logicalId\n );\n }\n\n this.logger.debug(\n `Create request submitted for ${logicalId}, token: ${createResponse.ProgressEvent.RequestToken}`\n );\n\n // Wait for creation to complete\n const progressEvent = await this.waitForOperation(\n createResponse.ProgressEvent.RequestToken,\n logicalId,\n 'CREATE'\n );\n\n if (!progressEvent.Identifier) {\n throw new ProvisioningError(\n `Failed to create resource ${logicalId}: No physical ID returned`,\n resourceType,\n logicalId\n );\n }\n\n this.logger.debug(`Created resource ${logicalId}, physical ID: ${progressEvent.Identifier}`);\n\n // Parse resource properties to extract attributes\n const result: ResourceCreateResult = {\n physicalId: progressEvent.Identifier,\n };\n\n if (progressEvent.ResourceModel) {\n result.attributes = this.parseResourceModel(progressEvent.ResourceModel);\n }\n\n // Enrich attributes with computed values for specific resource types\n result.attributes = await this.enrichResourceAttributes(\n resourceType,\n progressEvent.Identifier,\n result.attributes || {}\n );\n\n return result;\n } catch (error) {\n this.handleError(error, 'CREATE', resourceType, logicalId);\n }\n }\n\n /**\n * Update a resource using Cloud Control API\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(\n `Updating resource ${logicalId} (${resourceType}), physical ID: ${physicalId}`\n );\n\n try {\n // Strip null/undefined values and stringify JSON properties before generating patch\n const cleanPreviousProperties = stringifyJsonProperties(\n resourceType,\n stripNullValues(previousProperties) as Record<string, unknown>\n );\n const cleanProperties = stringifyJsonProperties(\n resourceType,\n stripNullValues(properties) as Record<string, unknown>\n );\n\n // Generate JSON Patch document\n const patch = this.patchGenerator.generatePatch(cleanPreviousProperties, cleanProperties);\n\n if (patch.length === 0) {\n // No changes detected\n this.logger.debug(`No property changes detected for ${logicalId}, skipping update`);\n return {\n physicalId,\n wasReplaced: false,\n };\n }\n\n this.logger.debug(\n `Generated ${patch.length} patch operations for ${logicalId}: ${JSON.stringify(patch)}`\n );\n\n // Start resource update\n const updateResponse = await this.cloudControlClient.send(\n new UpdateResourceCommand({\n TypeName: resourceType,\n Identifier: physicalId,\n PatchDocument: JSON.stringify(patch),\n })\n );\n\n if (!updateResponse.ProgressEvent?.RequestToken) {\n throw new ProvisioningError(\n `Failed to update resource ${logicalId}: No request token received`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n this.logger.debug(\n `Update request submitted for ${logicalId}, token: ${updateResponse.ProgressEvent.RequestToken}`\n );\n\n // Wait for update to complete\n const progressEvent = await this.waitForOperation(\n updateResponse.ProgressEvent.RequestToken,\n logicalId,\n 'UPDATE'\n );\n\n this.logger.debug(`Updated resource ${logicalId}`);\n\n // Parse resource properties to extract attributes\n // Resource replacement for immutable property changes is detected and handled\n // by DeployEngine (immutable property detection + CREATE\u2192DELETE flow) before\n // reaching this update method, so wasReplaced is always false here.\n const result: ResourceUpdateResult = {\n physicalId,\n wasReplaced: false,\n };\n\n if (progressEvent.ResourceModel) {\n result.attributes = this.parseResourceModel(progressEvent.ResourceModel);\n }\n\n // Enrich attributes with computed values for specific resource types\n result.attributes = await this.enrichResourceAttributes(\n resourceType,\n physicalId,\n result.attributes || {}\n );\n\n return result;\n } catch (error) {\n this.handleError(error, 'UPDATE', resourceType, logicalId, physicalId);\n }\n }\n\n /**\n * Delete a resource using Cloud Control API\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(\n `Deleting resource ${logicalId} (${resourceType}), physical ID: ${physicalId}`\n );\n\n try {\n // Start resource deletion\n const deleteResponse = await this.cloudControlClient.send(\n new DeleteResourceCommand({\n TypeName: resourceType,\n Identifier: physicalId,\n })\n );\n\n if (!deleteResponse.ProgressEvent?.RequestToken) {\n throw new ProvisioningError(\n `Failed to delete resource ${logicalId}: No request token received`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n this.logger.debug(\n `Delete request submitted for ${logicalId}, token: ${deleteResponse.ProgressEvent.RequestToken}`\n );\n\n // Wait for deletion to complete\n await this.waitForOperation(deleteResponse.ProgressEvent.RequestToken, logicalId, 'DELETE');\n\n this.logger.debug(`Deleted resource ${logicalId}`);\n } catch (error) {\n // Treat \"not found\" / \"does not exist\" as idempotent success for DELETE\n const err = error as { name?: string; message?: string };\n if (\n err.name === 'ResourceNotFoundException' ||\n err.message?.includes('does not exist') ||\n err.message?.includes('not found') ||\n err.message?.includes('NotFound')\n ) {\n this.logger.debug(`Resource ${logicalId} already deleted (not found), treating as success`);\n return;\n }\n this.handleError(error, 'DELETE', resourceType, logicalId, physicalId);\n }\n }\n\n /**\n * Get current state of a resource\n */\n async getResourceState(\n resourceType: string,\n physicalId: string\n ): Promise<Record<string, unknown> | null> {\n try {\n const response = await this.cloudControlClient.send(\n new GetResourceCommand({\n TypeName: resourceType,\n Identifier: physicalId,\n })\n );\n\n if (!response.ResourceDescription?.Properties) {\n return null;\n }\n\n return this.parseResourceModel(response.ResourceDescription.Properties);\n } catch (error) {\n const err = error as { name?: string };\n if (err.name === 'ResourceNotFoundException') {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Wait for an asynchronous operation to complete\n */\n private async waitForOperation(\n requestToken: string,\n logicalId: string,\n operation: 'CREATE' | 'UPDATE' | 'DELETE'\n ): Promise<ProgressEvent> {\n const startTime = Date.now();\n let attempts = 0;\n let pollInterval = this.INITIAL_POLL_INTERVAL_MS;\n\n while (Date.now() - startTime < this.MAX_WAIT_TIME_MS) {\n attempts++;\n\n const statusResponse = await this.cloudControlClient.send(\n new GetResourceRequestStatusCommand({\n RequestToken: requestToken,\n })\n );\n\n const progressEvent = statusResponse.ProgressEvent;\n\n if (!progressEvent) {\n throw new ProvisioningError(\n `Failed to get status for ${logicalId}: No progress event`,\n 'Unknown',\n logicalId\n );\n }\n\n this.logger.debug(\n `${operation} ${logicalId}: ${progressEvent.OperationStatus} (attempt ${attempts}, next poll ${pollInterval}ms)`\n );\n\n switch (progressEvent.OperationStatus) {\n case 'SUCCESS':\n return progressEvent;\n\n case 'FAILED':\n throw new ProvisioningError(\n `${operation} failed for ${logicalId}: ${progressEvent.StatusMessage || 'Unknown error'}`,\n progressEvent.TypeName || 'Unknown',\n logicalId,\n progressEvent.Identifier\n );\n\n case 'CANCEL_COMPLETE':\n throw new ProvisioningError(\n `${operation} cancelled for ${logicalId}`,\n progressEvent.TypeName || 'Unknown',\n logicalId,\n progressEvent.Identifier\n );\n\n case 'IN_PROGRESS':\n case 'PENDING':\n // Exponential backoff with 1.5x multiplier for flatter curve:\n // 1s \u2192 1.5s \u2192 2.25s \u2192 3.4s \u2192 5s \u2192 7.5s \u2192 10s (capped)\n // Most CC API operations complete in 1-5s, so slower ramp-up\n // polls more frequently during the common case.\n await this.sleep(pollInterval);\n pollInterval = Math.min(Math.ceil(pollInterval * 1.5), this.MAX_POLL_INTERVAL_MS);\n break;\n\n default:\n this.logger.warn(\n `Unknown operation status for ${logicalId}: ${progressEvent.OperationStatus}`\n );\n await this.sleep(pollInterval);\n pollInterval = Math.min(Math.ceil(pollInterval * 1.5), this.MAX_POLL_INTERVAL_MS);\n }\n }\n\n throw new ProvisioningError(\n `${operation} timeout for ${logicalId} after ${this.MAX_WAIT_TIME_MS / 1000}s`,\n 'Unknown',\n logicalId\n );\n }\n\n /**\n * Parse resource model JSON string\n */\n private parseResourceModel(resourceModel: string): Record<string, unknown> {\n try {\n return JSON.parse(resourceModel) as Record<string, unknown>;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.logger.warn(\n `Failed to parse resource model: ${errorMessage}\\n` +\n `Raw model: ${resourceModel.substring(0, 500)}${resourceModel.length > 500 ? '...' : ''}`\n );\n return {};\n }\n }\n\n /**\n * Enrich resource attributes with computed values\n *\n * CC API GetResource returns property names that match CloudFormation\n * Fn::GetAtt attribute names, so all properties are passed through as-is.\n * This method adds fallback attributes for edge cases where CC API\n * may not return certain values.\n */\n private async enrichResourceAttributes(\n resourceType: string,\n physicalId: string,\n attributes: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n const enriched: Record<string, unknown> = { ...attributes };\n\n // Fallback: compute attributes that CC API may not return\n switch (resourceType) {\n case 'AWS::S3::Bucket':\n // S3 bucket ARN: arn:aws:s3:::bucket-name\n if (!enriched['Arn']) {\n enriched['Arn'] = `arn:aws:s3:::${physicalId}`;\n }\n break;\n\n case 'AWS::DynamoDB::Table':\n // Fallback: CC API GetResource may not include StreamArn when streams are enabled.\n // Call DescribeTable to retrieve LatestStreamArn if not already present.\n if (!enriched['StreamArn']) {\n try {\n const dynamoDBClient = getAwsClients().dynamoDB;\n const describeResponse = await dynamoDBClient.send(\n new DescribeTableCommand({ TableName: physicalId })\n );\n const latestStreamArn = describeResponse.Table?.LatestStreamArn;\n if (latestStreamArn) {\n enriched['StreamArn'] = latestStreamArn;\n this.logger.debug(\n `Enriched DynamoDB StreamArn for ${physicalId}: ${latestStreamArn}`\n );\n }\n } catch (error) {\n // Best-effort: don't fail the operation if DescribeTable fails\n this.logger.debug(\n `Failed to get DynamoDB StreamArn for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n break;\n\n case 'AWS::ApiGateway::RestApi':\n // Fallback: ensure RootResourceId is present.\n // CC API GetResource typically returns it, but retrieve via SDK if missing.\n if (!enriched['RootResourceId']) {\n try {\n const apiGatewayClient = getAwsClients().apiGateway;\n const getRestApiResponse = await apiGatewayClient.send(\n new GetRestApiCommand({ restApiId: physicalId })\n );\n if (getRestApiResponse.rootResourceId) {\n enriched['RootResourceId'] = getRestApiResponse.rootResourceId;\n this.logger.debug(\n `Enriched RestApi RootResourceId for ${physicalId}: ${getRestApiResponse.rootResourceId}`\n );\n }\n } catch (error) {\n // Best-effort: don't fail the operation if GetRestApi fails\n this.logger.debug(\n `Failed to get RestApi RootResourceId for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n // Ensure RestApiId is set (physical ID is the rest-api-id)\n if (!enriched['RestApiId']) {\n enriched['RestApiId'] = physicalId;\n }\n break;\n\n case 'AWS::CloudFront::CloudFrontOriginAccessIdentity':\n // Fallback: ensure S3CanonicalUserId is present.\n // CC API GetResource typically returns it, but retrieve via SDK if missing.\n if (!enriched['S3CanonicalUserId']) {\n try {\n const cloudFrontClient = getAwsClients().cloudFront;\n const oaiResponse = await cloudFrontClient.send(\n new GetCloudFrontOriginAccessIdentityCommand({ Id: physicalId })\n );\n const s3CanonicalUserId = oaiResponse.CloudFrontOriginAccessIdentity?.S3CanonicalUserId;\n if (s3CanonicalUserId) {\n enriched['S3CanonicalUserId'] = s3CanonicalUserId;\n this.logger.debug(\n `Enriched CloudFront OAI S3CanonicalUserId for ${physicalId}: ${s3CanonicalUserId}`\n );\n }\n } catch (error) {\n // Best-effort: don't fail the operation\n this.logger.debug(\n `Failed to get CloudFront OAI S3CanonicalUserId for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n break;\n\n case 'AWS::KMS::Key':\n // CC API may not return Arn in ResourceModel.\n // Physical ID is the KeyId (UUID), so construct the ARN.\n if (!enriched['Arn']) {\n try {\n const kmsAccountInfo = await getAccountInfo();\n enriched['Arn'] =\n `arn:${kmsAccountInfo.partition}:kms:${kmsAccountInfo.region}:${kmsAccountInfo.accountId}:key/${physicalId}`;\n this.logger.debug(`Enriched KMS Key Arn for ${physicalId}: ${String(enriched['Arn'])}`);\n } catch (error) {\n this.logger.debug(\n `Failed to construct KMS Key Arn for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n if (!enriched['KeyId']) {\n enriched['KeyId'] = physicalId;\n }\n break;\n\n case 'AWS::CloudFront::OriginAccessControl':\n // CC API physicalId is the OAC ID\n if (!enriched['Id']) enriched['Id'] = physicalId;\n break;\n\n case 'AWS::Route53::HealthCheck':\n // CC API physicalId is the HealthCheck ID\n if (!enriched['HealthCheckId']) enriched['HealthCheckId'] = physicalId;\n break;\n\n case 'AWS::ECR::Repository':\n // CC API physicalId is the repository name, construct ARN\n if (!enriched['Arn']) {\n try {\n const ecrAccountInfo = await getAccountInfo();\n enriched['Arn'] =\n `arn:${ecrAccountInfo.partition}:ecr:${ecrAccountInfo.region}:${ecrAccountInfo.accountId}:repository/${physicalId}`;\n this.logger.debug(\n `Enriched ECR Repository Arn for ${physicalId}: ${String(enriched['Arn'])}`\n );\n } catch (error) {\n this.logger.debug(\n `Failed to construct ECR Repository Arn: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n if (!enriched['RepositoryUri']) {\n try {\n const ecrAccountInfo = await getAccountInfo();\n enriched['RepositoryUri'] =\n `${ecrAccountInfo.accountId}.dkr.ecr.${ecrAccountInfo.region}.amazonaws.com/${physicalId}`;\n } catch {\n /* best effort */\n }\n }\n break;\n\n case 'AWS::EC2::EIP':\n // CC API returns composite physicalId: \"PublicIp|AllocationId\"\n // Extract individual attributes for Fn::GetAtt resolution\n if (physicalId.includes('|')) {\n const [publicIp, allocationId] = physicalId.split('|');\n if (!enriched['AllocationId']) enriched['AllocationId'] = allocationId;\n if (!enriched['PublicIp']) enriched['PublicIp'] = publicIp;\n this.logger.debug(\n `Enriched EIP attributes: AllocationId=${allocationId}, PublicIp=${publicIp}`\n );\n }\n break;\n\n case 'AWS::Lambda::Version':\n // CC API physicalId for Lambda Version is the full version ARN\n // (e.g., arn:aws:lambda:us-east-1:123456:function:MyFunc:1).\n // Lambda::Alias FunctionVersion property needs just the version number.\n if (!enriched['Version']) {\n const versionSegments = physicalId.split(':');\n const versionNumber = versionSegments[versionSegments.length - 1];\n enriched['Version'] = versionNumber;\n this.logger.debug(`Enriched Lambda Version for ${physicalId}: ${versionNumber}`);\n }\n break;\n\n case 'AWS::Kinesis::Stream':\n // CC API physicalId for Kinesis Stream is the stream name, not the ARN.\n // Fn::GetAtt [Stream, Arn] needs the full ARN.\n if (!enriched['Arn']) {\n try {\n const kinesisAccountInfo = await getAccountInfo();\n enriched['Arn'] =\n `arn:${kinesisAccountInfo.partition}:kinesis:${kinesisAccountInfo.region}:${kinesisAccountInfo.accountId}:stream/${physicalId}`;\n this.logger.debug(\n `Enriched Kinesis Stream Arn for ${physicalId}: ${String(enriched['Arn'])}`\n );\n } catch (error) {\n this.logger.debug(\n `Failed to construct Kinesis Stream Arn for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n break;\n\n case 'AWS::Lambda::Url':\n // CC API CREATE response may not include FunctionUrl in ResourceModel.\n // Use Lambda SDK to retrieve it for Fn::GetAtt resolution.\n if (!enriched['FunctionUrl']) {\n try {\n const lambdaClient = getAwsClients().lambda;\n // physicalId is the FunctionArn for Lambda URL\n const urlConfig = await lambdaClient.send(\n new GetFunctionUrlConfigCommand({ FunctionName: physicalId })\n );\n if (urlConfig.FunctionUrl) {\n enriched['FunctionUrl'] = urlConfig.FunctionUrl;\n this.logger.debug(\n `Enriched Lambda URL FunctionUrl for ${physicalId}: ${urlConfig.FunctionUrl}`\n );\n }\n if (urlConfig.FunctionArn) {\n enriched['FunctionArn'] = urlConfig.FunctionArn;\n }\n } catch (error) {\n this.logger.debug(\n `Failed to get Lambda URL config for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n break;\n\n default:\n break;\n }\n\n return enriched;\n }\n\n /**\n * Handle errors and throw ProvisioningError\n */\n private handleError(\n error: unknown,\n operation: string,\n resourceType: string,\n logicalId: string,\n physicalId?: string\n ): never {\n const err = error as { name?: string; message?: string };\n\n // Check if resource type is not supported\n if (err.name === 'UnsupportedActionException' || err.name === 'TypeNotFoundException') {\n throw new ProvisioningError(\n `Resource type ${resourceType} is not supported by Cloud Control API and no SDK provider is registered.\\n` +\n `Please report this issue at https://github.com/go-to-k/cdkd/issues so we can add SDK provider support.\\n` +\n `Error: ${err.message || 'Unknown error'}`,\n resourceType,\n logicalId,\n physicalId,\n error instanceof Error ? error : undefined\n );\n }\n\n // Re-throw if already a ProvisioningError\n if (error instanceof ProvisioningError) {\n throw error;\n }\n\n // Wrap other errors\n throw new ProvisioningError(\n `${operation} failed for ${logicalId}: ${err.message || 'Unknown error'}`,\n resourceType,\n logicalId,\n physicalId,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Check if a resource type is supported by Cloud Control API\n *\n * This is a best-effort check. Some resource types may still fail\n * even if they appear to be supported.\n */\n static isSupportedResourceType(resourceType: string): boolean {\n // Common resource types that are NOT supported by Cloud Control API\n const unsupportedTypes = new Set([\n // IAM (most types not supported)\n 'AWS::IAM::Role',\n 'AWS::IAM::Policy',\n 'AWS::IAM::ManagedPolicy',\n 'AWS::IAM::User',\n 'AWS::IAM::Group',\n 'AWS::IAM::InstanceProfile',\n\n // Lambda layers\n 'AWS::Lambda::LayerVersion',\n\n // S3 bucket policies (use SDK instead)\n 'AWS::S3::BucketPolicy',\n\n // CloudFormation-specific resources\n 'AWS::CloudFormation::Stack',\n 'AWS::CloudFormation::WaitCondition',\n 'AWS::CloudFormation::WaitConditionHandle',\n 'AWS::CloudFormation::CustomResource',\n\n // CDK-specific resources\n 'AWS::CDK::Metadata',\n 'Custom::CDKBucketDeployment',\n 'Custom::S3AutoDeleteObjects',\n\n // Route53 hosted zones (complex)\n 'AWS::Route53::HostedZone',\n\n // ACM certificates (validation complexity)\n 'AWS::CertificateManager::Certificate',\n ]);\n\n if (unsupportedTypes.has(resourceType)) {\n return false;\n }\n\n // Custom resources are never supported by Cloud Control\n if (\n resourceType.startsWith('Custom::') ||\n resourceType.startsWith('AWS::CloudFormation::CustomResource')\n ) {\n return false;\n }\n\n // Most other AWS:: resources should be supported\n // (This is optimistic; some may still fail)\n return resourceType.startsWith('AWS::');\n }\n}\n", "import { GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { DescribeAvailabilityZonesCommand } from '@aws-sdk/client-ec2';\nimport { GetSecretValueCommand } from '@aws-sdk/client-secrets-manager';\nimport { GetParameterCommand } from '@aws-sdk/client-ssm';\nimport { getLogger } from '../utils/logger.js';\nimport { getAwsClients } from '../utils/aws-clients.js';\nimport type { CloudFormationTemplate } from '../types/resource.js';\nimport type { ResourceState } from '../types/state.js';\nimport type { S3StateBackend } from '../state/s3-state-backend.js';\n\n/**\n * Special symbol to represent AWS::NoValue\n *\n * When a property resolves to this symbol, it should be removed from the object.\n * This is used for conditional property omission in CloudFormation templates.\n */\nexport const AWS_NO_VALUE = Symbol('AWS::NoValue');\n\n/**\n * Resolver context for intrinsic functions\n */\nexport interface ResolverContext {\n /** Template being processed */\n template: CloudFormationTemplate;\n /** Current resource states (for Ref/GetAtt) */\n resources: Record<string, ResourceState>;\n /** Parameter values (for Ref to parameters) */\n parameters?: Record<string, unknown>;\n /** Evaluated condition values (for Fn::If) */\n conditions?: Record<string, boolean>;\n /** State backend for cross-stack references (Fn::ImportValue) */\n stateBackend?: S3StateBackend;\n /** Current stack name (for Fn::ImportValue to avoid self-reference) */\n stackName?: string;\n}\n\n/**\n * CloudFormation Intrinsic Function Resolver\n *\n * Resolves CloudFormation intrinsic functions in template values before\n * sending them to Cloud Control API or SDK providers.\n *\n * Supported functions:\n * - Ref (resources and parameters)\n * - Fn::GetAtt\n * - Fn::Join\n * - Fn::Sub\n * - Fn::Select\n * - Fn::Split\n * - Fn::If (Conditions)\n * - Fn::Equals\n * - Fn::And (logical AND)\n * - Fn::Or (logical OR)\n * - Fn::Not (logical NOT)\n * - Fn::ImportValue (cross-stack references)\n * - Fn::FindInMap (mapping lookups)\n * - Fn::Base64 (base64 encoding)\n * - Fn::GetAZs (availability zone listing)\n * - Fn::Cidr (CIDR address block calculation)\n */\n/**\n * AWS Account information cache\n */\ninterface AwsAccountInfo {\n accountId: string;\n region: string;\n partition: string;\n}\n\nlet cachedAccountInfo: AwsAccountInfo | null = null;\n\n/**\n * Cache for availability zones per region\n */\nconst cachedAvailabilityZones: Record<string, string[]> = {};\n\n/**\n * Cache for resolved dynamic references (secretsmanager, ssm)\n */\nconst cachedDynamicReferences: Record<string, string> = {};\n\n/**\n * Get AWS account information from STS\n */\nexport async function getAccountInfo(overrideRegion?: string): Promise<AwsAccountInfo> {\n if (cachedAccountInfo) {\n // If an override region is provided, return with that region\n if (overrideRegion && overrideRegion !== cachedAccountInfo.region) {\n return { ...cachedAccountInfo, region: overrideRegion };\n }\n return cachedAccountInfo;\n }\n\n const logger = getLogger().child('IntrinsicFunctionResolver');\n const awsClients = getAwsClients();\n const stsClient = awsClients.sts;\n\n try {\n const response = await stsClient.send(new GetCallerIdentityCommand({}));\n const accountId = response.Account || '123456789012';\n const region = overrideRegion || process.env['AWS_REGION'] || 'us-east-1';\n const partition = 'aws'; // Could be aws-cn, aws-us-gov, etc.\n\n cachedAccountInfo = { accountId, region, partition };\n logger.debug(`Retrieved AWS account info: ${accountId}, ${region}, ${partition}`);\n // Return with override if different from cached\n if (overrideRegion && overrideRegion !== region) {\n return { ...cachedAccountInfo, region: overrideRegion };\n }\n return cachedAccountInfo;\n } catch (error) {\n logger.warn(\n `Failed to get AWS account info from STS: ${error instanceof Error ? error.message : String(error)}, using defaults`\n );\n // Fallback to environment variables or defaults\n cachedAccountInfo = {\n accountId: process.env['AWS_ACCOUNT_ID'] || '123456789012',\n region: overrideRegion || process.env['AWS_REGION'] || 'us-east-1',\n partition: 'aws',\n };\n return cachedAccountInfo;\n }\n}\n\n/**\n * Reset cached account info (useful for testing)\n */\nexport function resetAccountInfoCache(): void {\n cachedAccountInfo = null;\n // Also reset AZ cache\n for (const key of Object.keys(cachedAvailabilityZones)) {\n delete cachedAvailabilityZones[key];\n }\n // Also reset dynamic reference cache\n for (const key of Object.keys(cachedDynamicReferences)) {\n delete cachedDynamicReferences[key];\n }\n}\n\n/**\n * CloudFormation Parameter definition\n */\nexport interface ParameterDefinition {\n Type: string;\n Default?: unknown;\n AllowedValues?: unknown[];\n AllowedPattern?: string;\n MinLength?: number;\n MaxLength?: number;\n MinValue?: number;\n MaxValue?: number;\n Description?: string;\n ConstraintDescription?: string;\n NoEcho?: boolean;\n}\n\nexport class IntrinsicFunctionResolver {\n private logger = getLogger().child('IntrinsicFunctionResolver');\n private readonly resolverRegion: string;\n\n constructor(region?: string) {\n this.resolverRegion = region || process.env['AWS_REGION'] || 'us-east-1';\n }\n\n /**\n * Resolve parameter values from template Parameters section\n *\n * Merges default values from template with user-provided parameter values.\n * User-provided values take precedence over defaults.\n *\n * @param template CloudFormation template containing Parameters section\n * @param userParameters User-provided parameter values (e.g., from CLI)\n * @returns Record of parameter names to resolved values\n */\n async resolveParameters(\n template: CloudFormationTemplate,\n userParameters?: Record<string, string>\n ): Promise<Record<string, unknown>> {\n const parameters: Record<string, unknown> = {};\n const templateParameters = template.Parameters;\n\n if (!templateParameters || typeof templateParameters !== 'object') {\n return parameters;\n }\n\n for (const [name, definition] of Object.entries(templateParameters)) {\n const paramDef = definition as ParameterDefinition;\n\n // User-provided value takes precedence\n if (userParameters && name in userParameters) {\n const userValue = userParameters[name];\n if (userValue !== undefined) {\n parameters[name] = this.coerceParameterValue(userValue, paramDef.Type);\n this.logger.debug(`Parameter ${name}: using user-provided value ${userValue}`);\n continue;\n }\n }\n\n // Use default value if available\n if ('Default' in paramDef) {\n // SSM Parameter type: resolve the default value (SSM parameter path) via SSM API\n if (paramDef.Type.startsWith('AWS::SSM::Parameter::Value')) {\n const ssmPath = String(paramDef.Default);\n this.logger.debug(`Parameter ${name}: resolving SSM parameter path ${ssmPath}`);\n const resolved = await this.resolveSSMParameter(ssmPath);\n parameters[name] = resolved;\n this.logger.debug(`Parameter ${name}: resolved SSM value ${resolved}`);\n continue;\n }\n\n parameters[name] = paramDef.Default;\n this.logger.debug(\n `Parameter ${name}: using default value ${typeof paramDef.Default === 'object' ? JSON.stringify(paramDef.Default) : String(paramDef.Default)}`\n );\n continue;\n }\n\n // No value provided and no default - this is an error\n throw new Error(\n `Parameter ${name} is required but no value was provided and no default exists`\n );\n }\n\n return parameters;\n }\n\n /**\n * Resolve an SSM Parameter Store path to its actual value.\n * Used for parameters with type AWS::SSM::Parameter::Value<...>.\n */\n private async resolveSSMParameter(parameterName: string): Promise<string> {\n const client = getAwsClients().ssm;\n const response = await client.send(new GetParameterCommand({ Name: parameterName }));\n return response.Parameter?.Value ?? '';\n }\n\n /**\n * Coerce parameter value to the correct type based on parameter definition\n */\n private coerceParameterValue(value: string, type: string): unknown {\n switch (type) {\n case 'Number':\n return Number(value);\n case 'List<Number>':\n return value.split(',').map((v) => Number(v.trim()));\n case 'CommaDelimitedList':\n return value.split(',').map((v) => v.trim());\n case 'String':\n default:\n return value;\n }\n }\n\n /**\n * Resolve all intrinsic functions in a value\n */\n async resolve(value: unknown, context: ResolverContext): Promise<unknown> {\n return await this.resolveValue(value, context);\n }\n\n /**\n * Evaluate all conditions in the template\n *\n * Conditions are defined in the Conditions section of the CloudFormation template\n * and can reference parameters and pseudo parameters\n */\n async evaluateConditions(context: ResolverContext): Promise<Record<string, boolean>> {\n const conditions: Record<string, boolean> = {};\n const templateConditions = context.template.Conditions;\n\n if (!templateConditions || typeof templateConditions !== 'object') {\n return conditions;\n }\n\n // Evaluate each condition\n for (const [name, definition] of Object.entries(templateConditions)) {\n try {\n const result = await this.resolveValue(definition, context);\n conditions[name] = Boolean(result);\n this.logger.debug(`Evaluated condition ${name} = ${conditions[name]}`);\n } catch (error) {\n this.logger.warn(\n `Failed to evaluate condition ${name}: ${error instanceof Error ? error.message : String(error)}, assuming false`\n );\n conditions[name] = false;\n }\n }\n\n return conditions;\n }\n\n /**\n * Recursively resolve a value\n */\n private async resolveValue(value: unknown, context: ResolverContext): Promise<unknown> {\n // Primitives: return as-is (but check strings for dynamic references)\n if (typeof value !== 'object' || value === null) {\n if (typeof value === 'string' && value.includes('{{resolve:')) {\n return await this.resolveDynamicReferences(value);\n }\n return value;\n }\n\n // Arrays: resolve each element, filtering out AWS::NoValue\n if (Array.isArray(value)) {\n const resolved = await Promise.all(value.map((v) => this.resolveValue(v, context)));\n return resolved.filter((v) => v !== AWS_NO_VALUE);\n }\n\n const obj = value as Record<string, unknown>;\n\n // Check for intrinsic functions\n if ('Ref' in obj) {\n return await this.resolveRef(obj['Ref'] as string, context);\n }\n\n if ('Fn::GetAtt' in obj) {\n return await this.resolveGetAtt(obj['Fn::GetAtt'] as [string, string] | string, context);\n }\n\n if ('Fn::Join' in obj) {\n return await this.resolveJoin(obj['Fn::Join'] as [string, unknown[]], context);\n }\n\n if ('Fn::Sub' in obj) {\n return await this.resolveSub(\n obj['Fn::Sub'] as string | [string, Record<string, unknown>],\n context\n );\n }\n\n if ('Fn::Select' in obj) {\n return await this.resolveSelect(obj['Fn::Select'] as [number, unknown[]], context);\n }\n\n if ('Fn::Split' in obj) {\n return await this.resolveSplit(obj['Fn::Split'] as [string, unknown], context);\n }\n\n if ('Fn::If' in obj) {\n return await this.resolveIf(obj['Fn::If'] as [string, unknown, unknown], context);\n }\n\n if ('Fn::Equals' in obj) {\n return await this.resolveEquals(obj['Fn::Equals'] as [unknown, unknown], context);\n }\n\n if ('Fn::And' in obj) {\n return await this.resolveAnd(obj['Fn::And'] as unknown[], context);\n }\n\n if ('Fn::Or' in obj) {\n return await this.resolveOr(obj['Fn::Or'] as unknown[], context);\n }\n\n if ('Fn::Not' in obj) {\n return await this.resolveNot(obj['Fn::Not'] as [unknown], context);\n }\n\n if ('Fn::ImportValue' in obj) {\n return await this.resolveImportValue(obj['Fn::ImportValue'], context);\n }\n\n if ('Fn::FindInMap' in obj) {\n return await this.resolveFindInMap(\n obj['Fn::FindInMap'] as [unknown, unknown, unknown],\n context\n );\n }\n\n if ('Fn::Base64' in obj) {\n return await this.resolveBase64(obj['Fn::Base64'], context);\n }\n\n if ('Fn::GetAZs' in obj) {\n return await this.resolveGetAZs(obj['Fn::GetAZs'], context);\n }\n\n if ('Fn::Cidr' in obj) {\n return await this.resolveCidr(obj['Fn::Cidr'] as [unknown, unknown, unknown], context);\n }\n\n // Not an intrinsic function: recursively resolve object properties\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n const resolvedVal = await this.resolveValue(val, context);\n // Skip properties that resolve to AWS::NoValue\n if (resolvedVal !== AWS_NO_VALUE) {\n resolved[key] = resolvedVal;\n } else {\n this.logger.debug(`Property ${key} resolved to AWS::NoValue, omitting from object`);\n }\n }\n return resolved;\n }\n\n /**\n * Resolve Ref intrinsic function\n *\n * Ref can reference:\n * 1. Resources (returns physical ID)\n * 2. Parameters (returns parameter value)\n * 3. Pseudo parameters (AWS::Region, AWS::AccountId, etc.)\n */\n private async resolveRef(logicalId: string, context: ResolverContext): Promise<unknown> {\n // Check if it's a resource\n const resource = context.resources[logicalId];\n if (resource) {\n this.logger.debug(`Resolved Ref to resource: ${logicalId} -> ${resource.physicalId}`);\n return resource.physicalId;\n }\n\n // Check if it's a parameter\n if (context.parameters && logicalId in context.parameters) {\n const value = context.parameters[logicalId];\n this.logger.debug(\n `Resolved Ref to parameter: ${logicalId} -> ${typeof value === 'object' ? JSON.stringify(value) : String(value)}`\n );\n return value;\n }\n\n // Check if it's a pseudo parameter\n const pseudoValue = await this.resolvePseudoParameter(logicalId, context);\n if (pseudoValue !== undefined) {\n const valueStr =\n typeof pseudoValue === 'symbol' ? pseudoValue.toString() : String(pseudoValue);\n this.logger.debug(`Resolved Ref to pseudo parameter: ${logicalId} -> ${valueStr}`);\n return pseudoValue;\n }\n\n // Not found\n this.logger.warn(`Ref ${logicalId} not found (not a resource, parameter, or pseudo parameter)`);\n throw new Error(`Ref ${logicalId} not found`);\n }\n\n /**\n * Resolve Fn::GetAtt intrinsic function\n */\n private async resolveGetAtt(\n getAtt: [string, string] | string,\n context: ResolverContext\n ): Promise<unknown> {\n // Fn::GetAtt can be either [LogicalId, AttributeName] or \"LogicalId.AttributeName\"\n let logicalId: string;\n let attributeName: string;\n\n if (Array.isArray(getAtt)) {\n [logicalId, attributeName] = getAtt;\n } else {\n const parts = getAtt.split('.');\n if (parts.length !== 2) {\n throw new Error(`Invalid Fn::GetAtt format: ${getAtt}`);\n }\n [logicalId, attributeName] = parts as [string, string];\n }\n\n const resource = context.resources[logicalId];\n if (!resource) {\n throw new Error(`Resource ${logicalId} not found for Fn::GetAtt`);\n }\n\n // Check if attribute exists in resource.attributes\n // For VPC Ipv6CidrBlocks, always use constructAttribute (dynamic fetch with retry)\n // because the stored value may be stale (empty array from before VPCCidrBlock association)\n const skipCachedAttribute =\n resource.resourceType === 'AWS::EC2::VPC' && attributeName === 'Ipv6CidrBlocks';\n\n if (!skipCachedAttribute && resource.attributes?.[attributeName] !== undefined) {\n const value = resource.attributes[attributeName];\n this.logger.debug(\n `Resolved Fn::GetAtt from attributes: ${logicalId}.${attributeName} -> ${typeof value === 'object' ? JSON.stringify(value) : String(value)}`\n );\n return value;\n }\n\n // Construct attribute value based on resource type\n const value = await this.constructAttribute(resource, attributeName, context);\n this.logger.debug(\n `Resolved Fn::GetAtt: ${logicalId}.${attributeName} -> ${typeof value === 'object' ? JSON.stringify(value) : String(value)}`\n );\n return value;\n }\n\n /**\n * Construct resource attribute value based on resource type\n *\n * Many CloudFormation attributes are not returned by Cloud Control API,\n * so we need to construct them manually.\n */\n private async constructAttribute(\n resource: ResourceState,\n attributeName: string,\n _context: ResolverContext\n ): Promise<unknown> {\n const { resourceType, physicalId } = resource;\n const accountInfo = await getAccountInfo(this.resolverRegion);\n const { region, accountId, partition } = accountInfo;\n\n // DynamoDB Table\n if (resourceType === 'AWS::DynamoDB::Table') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:dynamodb:${region}:${accountId}:table/${physicalId}`;\n case 'StreamArn':\n // Stream ARN would need to be fetched from API\n return undefined;\n default:\n return physicalId;\n }\n }\n\n // S3 Bucket\n if (resourceType === 'AWS::S3::Bucket') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:s3:::${physicalId}`;\n case 'DomainName':\n return `${physicalId}.s3.amazonaws.com`;\n case 'RegionalDomainName':\n return `${physicalId}.s3.${region}.amazonaws.com`;\n case 'WebsiteURL':\n return `http://${physicalId}.s3-website-${region}.amazonaws.com`;\n default:\n return physicalId;\n }\n }\n\n // IAM Role\n if (resourceType === 'AWS::IAM::Role') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:iam::${accountId}:role/${physicalId}`;\n case 'RoleId':\n // Role ID would need to be fetched from API\n return undefined;\n default:\n return physicalId;\n }\n }\n\n // EC2 VPC - dynamic attributes (IPv6 CIDR requires DescribeVpcs after VPCCidrBlock association)\n if (resourceType === 'AWS::EC2::VPC') {\n switch (attributeName) {\n case 'VpcId':\n return physicalId;\n case 'CidrBlock':\n return resource.attributes?.['CidrBlock'] || resource.properties?.['CidrBlock'];\n case 'Ipv6CidrBlocks': {\n // Must fetch dynamically - IPv6 CIDR is added by VPCCidrBlock resource after VPC creation.\n // After CC API reports VPCCidrBlock CREATE success, the CIDR may still be in\n // 'associating' state. Retry up to 30s waiting for 'associated'.\n try {\n const { EC2Client, DescribeVpcsCommand } = await import('@aws-sdk/client-ec2');\n const ec2 = new EC2Client({ region: this.resolverRegion });\n const maxAttempts = 15;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const resp = await ec2.send(new DescribeVpcsCommand({ VpcIds: [physicalId] }));\n const associations = resp.Vpcs?.[0]?.Ipv6CidrBlockAssociationSet || [];\n const blocks = associations\n .filter((a) => a.Ipv6CidrBlockState?.State === 'associated')\n .map((a) => a.Ipv6CidrBlock);\n if (blocks.length > 0) {\n this.logger.debug(\n `Resolved VPC Ipv6CidrBlocks for ${physicalId}: ${JSON.stringify(blocks)}`\n );\n return blocks;\n }\n // Check if there are any associating CIDRs \u2014 if so, wait and retry\n const associating = associations.filter(\n (a) => a.Ipv6CidrBlockState?.State === 'associating'\n );\n if (associating.length === 0) {\n // No IPv6 CIDRs at all\n this.logger.debug(`No IPv6 CIDR associations found for VPC ${physicalId}`);\n return [];\n }\n this.logger.debug(\n `VPC ${physicalId} IPv6 CIDR still associating (attempt ${attempt}/${maxAttempts}), waiting...`\n );\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n this.logger.warn(\n `VPC ${physicalId} IPv6 CIDR did not reach 'associated' state after ${maxAttempts} attempts`\n );\n return [];\n } catch (error) {\n this.logger.warn(\n `Failed to fetch VPC Ipv6CidrBlocks for ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n }\n case 'DefaultSecurityGroup':\n return resource.attributes?.['DefaultSecurityGroup'] || physicalId;\n default:\n return physicalId;\n }\n }\n\n // IAM Policy\n if (resourceType === 'AWS::IAM::Policy') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:iam::${accountId}:policy/${physicalId}`;\n case 'PolicyId':\n // Policy ID would need to be fetched from API\n return undefined;\n default:\n return physicalId;\n }\n }\n\n // Lambda Function\n if (resourceType === 'AWS::Lambda::Function') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:lambda:${region}:${accountId}:function:${physicalId}`;\n default:\n return physicalId;\n }\n }\n\n // SQS Queue\n if (resourceType === 'AWS::SQS::Queue') {\n // Physical ID for SQS Queue is the queue URL\n // Extract queue name from URL: https://sqs.region.amazonaws.com/accountId/queueName\n let queueName = physicalId;\n if (physicalId.startsWith('https://')) {\n const parts = physicalId.split('/');\n queueName = parts[parts.length - 1] || physicalId;\n }\n\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:sqs:${region}:${accountId}:${queueName}`;\n case 'QueueUrl':\n return physicalId; // Physical ID is already the queue URL\n case 'QueueName':\n return queueName;\n default:\n return physicalId;\n }\n }\n\n // SNS Topic\n if (resourceType === 'AWS::SNS::Topic') {\n switch (attributeName) {\n case 'TopicArn':\n return `arn:${partition}:sns:${region}:${accountId}:${physicalId}`;\n default:\n return physicalId;\n }\n }\n\n // CloudWatch Logs Log Group\n if (resourceType === 'AWS::Logs::LogGroup') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:logs:${region}:${accountId}:log-group:${physicalId}:*`;\n default:\n return physicalId;\n }\n }\n\n // ECS Cluster\n if (resourceType === 'AWS::ECS::Cluster') {\n switch (attributeName) {\n case 'Arn':\n return `arn:${partition}:ecs:${region}:${accountId}:cluster/${physicalId}`;\n default:\n return physicalId;\n }\n }\n\n // EC2 Security Group\n if (resourceType === 'AWS::EC2::SecurityGroup') {\n switch (attributeName) {\n case 'GroupId':\n return physicalId; // Physical ID is already the group ID (sg-xxx)\n case 'VpcId':\n return undefined; // Would need API call\n default:\n return physicalId;\n }\n }\n\n // EC2 VPC\n if (resourceType === 'AWS::EC2::VPC') {\n switch (attributeName) {\n case 'VpcId':\n return physicalId;\n default:\n return physicalId;\n }\n }\n\n // EC2 Subnet\n if (resourceType === 'AWS::EC2::Subnet') {\n switch (attributeName) {\n case 'SubnetId':\n return physicalId;\n default:\n return physicalId;\n }\n }\n\n // Default: return physical ID\n this.logger.warn(\n `Unknown attribute ${attributeName} for resource type ${resourceType}, returning physical ID`\n );\n return physicalId;\n }\n\n /**\n * Resolve Fn::Join intrinsic function\n *\n * Fn::Join: [delimiter, [value1, value2, ...]]\n */\n private async resolveJoin(\n joinArgs: [string, unknown[]],\n context: ResolverContext\n ): Promise<string> {\n const [delimiter, values] = joinArgs;\n\n // Resolve each value first\n const resolvedValues = await Promise.all(\n values.map(async (v) => {\n const resolved = await this.resolveValue(v, context);\n return String(resolved);\n })\n );\n\n let result = resolvedValues.join(delimiter);\n // Resolve any dynamic references in the joined result\n if (result.includes('{{resolve:')) {\n result = await this.resolveDynamicReferences(result);\n }\n this.logger.debug(`Resolved Fn::Join: ${result}`);\n return result;\n }\n\n /**\n * Resolve Fn::Sub intrinsic function\n *\n * Fn::Sub supports two forms:\n * 1. String with ${VarName} placeholders\n * 2. [String, {VarName: value, ...}] with explicit variable mapping\n *\n * Note: This is a simplified implementation that doesn't handle async properly\n * inside replace(). For full async support, we'd need to collect all replacements\n * first, then do them synchronously.\n */\n private async resolveSub(\n subArgs: string | [string, Record<string, unknown>],\n context: ResolverContext\n ): Promise<string> {\n let template: string;\n let variables: Record<string, unknown> = {};\n\n if (Array.isArray(subArgs)) {\n [template, variables] = subArgs;\n // Resolve variable values\n for (const [key, val] of Object.entries(variables)) {\n variables[key] = await this.resolveValue(val, context);\n }\n } else {\n template = subArgs;\n }\n\n // Collect all replacements\n const replacements: Array<{ match: string; replacement: string }> = [];\n const matches = template.matchAll(/\\$\\{([^}]+)\\}/g);\n\n for (const match of matches) {\n const varNameStr = match[1];\n if (!varNameStr) {\n continue; // Skip if no capture group\n }\n\n let replacement: string;\n\n // Check explicit variables first\n if (varNameStr in variables) {\n replacement = String(variables[varNameStr]);\n } else {\n // Check if it's a pseudo parameter\n const pseudoValue = await this.resolvePseudoParameter(varNameStr, context);\n if (pseudoValue !== undefined) {\n replacement = String(pseudoValue);\n } else {\n // Try to resolve as Ref\n try {\n const value = await this.resolveRef(varNameStr, context);\n replacement = String(value);\n } catch {\n // If not found, try to resolve as GetAtt (e.g., \"Resource.Attribute\")\n if (varNameStr.includes('.')) {\n try {\n const value = await this.resolveGetAtt(varNameStr, context);\n replacement = String(value);\n } catch {\n this.logger.warn(`Fn::Sub variable ${varNameStr} not found, keeping placeholder`);\n replacement = match[0]; // Keep original placeholder\n }\n } else {\n this.logger.warn(`Fn::Sub variable ${varNameStr} not found, keeping placeholder`);\n replacement = match[0]; // Keep original placeholder\n }\n }\n }\n }\n\n replacements.push({ match: match[0], replacement });\n }\n\n // Apply all replacements\n let result = template;\n for (const { match, replacement } of replacements) {\n result = result.replace(match, replacement);\n }\n\n // Resolve any dynamic references in the substituted result\n if (result.includes('{{resolve:')) {\n result = await this.resolveDynamicReferences(result);\n }\n this.logger.debug(`Resolved Fn::Sub: ${result}`);\n return result;\n }\n\n /**\n * Resolve Fn::Select intrinsic function\n *\n * Fn::Select: [index, [value1, value2, ...]]\n * Returns the value at the specified index in the list\n */\n private async resolveSelect(\n selectArgs: [number, unknown[]],\n context: ResolverContext\n ): Promise<unknown> {\n const [index, list] = selectArgs;\n\n // Resolve the list first\n const resolvedList = await this.resolveValue(list, context);\n\n if (!Array.isArray(resolvedList)) {\n throw new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`);\n }\n\n if (index < 0 || index >= resolvedList.length) {\n this.logger.warn(\n `Fn::Select: index ${index} out of bounds (array length: ${resolvedList.length})`\n );\n return `{{Fn::Select:${index}:OutOfBounds}}`;\n }\n\n const result: unknown = resolvedList[index];\n this.logger.debug(`Resolved Fn::Select: index ${index} -> ${JSON.stringify(result)}`);\n return result;\n }\n\n /**\n * Resolve Fn::Split intrinsic function\n *\n * Fn::Split: [delimiter, string]\n * Splits a string into a list of strings using the specified delimiter\n */\n private async resolveSplit(\n splitArgs: [string, unknown],\n context: ResolverContext\n ): Promise<string[]> {\n const [delimiter, value] = splitArgs;\n\n // Resolve the value first\n const resolvedValue = await this.resolveValue(value, context);\n\n if (typeof resolvedValue !== 'string') {\n throw new Error(`Fn::Split: value must be a string, got ${typeof resolvedValue}`);\n }\n\n const result = resolvedValue.split(delimiter);\n this.logger.debug(`Resolved Fn::Split: split by \"${delimiter}\" -> ${JSON.stringify(result)}`);\n return result;\n }\n\n /**\n * Resolve Fn::If intrinsic function\n *\n * Fn::If: [conditionName, valueIfTrue, valueIfFalse]\n * Returns valueIfTrue if condition evaluates to true, otherwise valueIfFalse\n */\n private async resolveIf(\n ifArgs: [string, unknown, unknown],\n context: ResolverContext\n ): Promise<unknown> {\n const [conditionName, valueIfTrue, valueIfFalse] = ifArgs;\n\n // Check if condition is evaluated in context\n if (!context.conditions || !(conditionName in context.conditions)) {\n this.logger.warn(`Condition ${conditionName} not found in context, assuming false`);\n return await this.resolveValue(valueIfFalse, context);\n }\n\n const conditionValue = context.conditions[conditionName];\n const selectedValue = conditionValue ? valueIfTrue : valueIfFalse;\n\n this.logger.debug(\n `Resolved Fn::If: condition ${conditionName} = ${conditionValue}, selected ${conditionValue ? 'true' : 'false'} branch`\n );\n\n return await this.resolveValue(selectedValue, context);\n }\n\n /**\n * Resolve Fn::Equals intrinsic function\n *\n * Fn::Equals: [value1, value2]\n * Returns true if both values are equal after resolution\n */\n private async resolveEquals(\n equalsArgs: [unknown, unknown],\n context: ResolverContext\n ): Promise<boolean> {\n const [value1, value2] = equalsArgs;\n\n // Resolve both values\n const resolved1 = await this.resolveValue(value1, context);\n const resolved2 = await this.resolveValue(value2, context);\n\n // Deep equality check\n const result = JSON.stringify(resolved1) === JSON.stringify(resolved2);\n\n this.logger.debug(\n `Resolved Fn::Equals: ${JSON.stringify(resolved1)} === ${JSON.stringify(resolved2)} -> ${result}`\n );\n\n return result;\n }\n\n /**\n * Resolve Fn::And intrinsic function\n *\n * Returns true if all conditions evaluate to true\n * Syntax: { \"Fn::And\": [ condition1, condition2, ... ] }\n */\n private async resolveAnd(conditions: unknown[], context: ResolverContext): Promise<boolean> {\n if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) {\n throw new Error(`Fn::And requires between 2 and 10 conditions, got ${conditions.length}`);\n }\n\n // Resolve all conditions\n const results: boolean[] = [];\n for (const condition of conditions) {\n const resolved = await this.resolveValue(condition, context);\n results.push(Boolean(resolved));\n }\n\n // Return true if all are true\n const result = results.every((r) => r === true);\n\n this.logger.debug(`Resolved Fn::And: [${results.join(', ')}] -> ${result}`);\n\n return result;\n }\n\n /**\n * Resolve Fn::Or intrinsic function\n *\n * Returns true if at least one condition evaluates to true\n * Syntax: { \"Fn::Or\": [ condition1, condition2, ... ] }\n */\n private async resolveOr(conditions: unknown[], context: ResolverContext): Promise<boolean> {\n if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) {\n throw new Error(`Fn::Or requires between 2 and 10 conditions, got ${conditions.length}`);\n }\n\n // Resolve all conditions\n const results: boolean[] = [];\n for (const condition of conditions) {\n const resolved = await this.resolveValue(condition, context);\n results.push(Boolean(resolved));\n }\n\n // Return true if at least one is true\n const result = results.some((r) => r === true);\n\n this.logger.debug(`Resolved Fn::Or: [${results.join(', ')}] -> ${result}`);\n\n return result;\n }\n\n /**\n * Resolve Fn::Not intrinsic function\n *\n * Returns the inverse of the condition\n * Syntax: { \"Fn::Not\": [ condition ] }\n */\n private async resolveNot(notArgs: [unknown], context: ResolverContext): Promise<boolean> {\n if (!Array.isArray(notArgs) || notArgs.length !== 1) {\n throw new Error(\n `Fn::Not requires exactly one condition, got ${Array.isArray(notArgs) ? notArgs.length : 0}`\n );\n }\n\n const [condition] = notArgs;\n\n // Resolve the condition\n const resolved = await this.resolveValue(condition, context);\n const result = !resolved;\n\n this.logger.debug(`Resolved Fn::Not: ${Boolean(resolved)} -> ${result}`);\n\n return result;\n }\n\n /**\n * Resolve Fn::ImportValue (cross-stack references)\n *\n * Searches all other stacks for an exported output with the given name.\n */\n private async resolveImportValue(\n importValueArg: unknown,\n context: ResolverContext\n ): Promise<unknown> {\n // First, resolve the export name (it might contain intrinsic functions)\n const exportName = await this.resolveValue(importValueArg, context);\n\n if (typeof exportName !== 'string') {\n throw new Error(\n `Fn::ImportValue: export name must resolve to a string, got ${typeof exportName}`\n );\n }\n\n // Check if we have a state backend\n if (!context.stateBackend) {\n throw new Error('Fn::ImportValue: state backend is required for cross-stack references');\n }\n\n this.logger.debug(`Resolving Fn::ImportValue: ${exportName}`);\n\n // List all stacks\n const allStacks = await context.stateBackend.listStacks();\n this.logger.debug(`Found ${allStacks.length} stacks to search for export: ${exportName}`);\n\n // Search through all stacks for the export\n for (const stackName of allStacks) {\n // Skip the current stack (avoid self-reference)\n if (context.stackName && stackName === context.stackName) {\n this.logger.debug(`Skipping current stack: ${stackName}`);\n continue;\n }\n\n try {\n const stateData = await context.stateBackend.getState(stackName);\n if (!stateData) {\n this.logger.debug(`No state found for stack: ${stackName}`);\n continue;\n }\n\n const { state } = stateData;\n\n // Check if this stack has the export in its outputs\n if (state.outputs && exportName in state.outputs) {\n const value = state.outputs[exportName];\n this.logger.info(\n `Resolved Fn::ImportValue: ${exportName} = ${JSON.stringify(value)} (from stack: ${stackName})`\n );\n return value;\n }\n } catch (error) {\n this.logger.warn(\n `Failed to read state for stack ${stackName}: ${error instanceof Error ? error.message : String(error)}`\n );\n continue;\n }\n }\n\n // Export not found in any stack\n throw new Error(\n `Fn::ImportValue: export '${exportName}' not found in any stack. ` +\n `Searched ${allStacks.length} stacks. ` +\n `Make sure the exporting stack has been deployed and the Output has an Export.Name property.`\n );\n }\n\n /**\n * Resolve Fn::FindInMap intrinsic function\n *\n * Fn::FindInMap: [MapName, TopLevelKey, SecondLevelKey]\n * Looks up a value in the Mappings section of the template\n */\n private async resolveFindInMap(\n findInMapArgs: [unknown, unknown, unknown],\n context: ResolverContext\n ): Promise<unknown> {\n const [rawMapName, rawTopLevelKey, rawSecondLevelKey] = findInMapArgs;\n\n // Recursively resolve each argument (they could be Refs or other intrinsic functions)\n const mapName = String(await this.resolveValue(rawMapName, context));\n const topLevelKey = String(await this.resolveValue(rawTopLevelKey, context));\n const secondLevelKey = String(await this.resolveValue(rawSecondLevelKey, context));\n\n // Access the Mappings section of the template\n const mappings = context.template.Mappings;\n if (!mappings) {\n throw new Error(`Fn::FindInMap: no Mappings section found in template`);\n }\n\n const map = mappings[mapName] as Record<string, Record<string, unknown>> | undefined;\n if (!map) {\n throw new Error(`Fn::FindInMap: mapping '${mapName}' not found in Mappings section`);\n }\n\n const topLevel = map[topLevelKey];\n if (!topLevel || typeof topLevel !== 'object') {\n throw new Error(\n `Fn::FindInMap: top-level key '${topLevelKey}' not found in mapping '${mapName}'`\n );\n }\n\n if (!(secondLevelKey in topLevel)) {\n throw new Error(\n `Fn::FindInMap: second-level key '${secondLevelKey}' not found in mapping '${mapName}' -> '${topLevelKey}'`\n );\n }\n\n const result = topLevel[secondLevelKey];\n this.logger.debug(\n `Resolved Fn::FindInMap: ${mapName}.${topLevelKey}.${secondLevelKey} -> ${JSON.stringify(result)}`\n );\n return result;\n }\n\n /**\n * Resolve Fn::Base64 intrinsic function\n *\n * Fn::Base64: valueToEncode\n * Returns the Base64 representation of the input string\n */\n private async resolveBase64(value: unknown, context: ResolverContext): Promise<string> {\n // Recursively resolve the value first (it could be another intrinsic function)\n const resolvedValue = await this.resolveValue(value, context);\n\n if (typeof resolvedValue !== 'string') {\n throw new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`);\n }\n\n const result = Buffer.from(resolvedValue).toString('base64');\n this.logger.debug(`Resolved Fn::Base64: ${resolvedValue} -> ${result}`);\n return result;\n }\n\n /**\n * Resolve Fn::GetAZs intrinsic function\n *\n * Fn::GetAZs: region\n * Returns a list of availability zones for the specified region.\n * If region is empty string or {\"Ref\": \"AWS::Region\"}, uses the current region.\n * Results are cached per region to avoid repeated API calls.\n */\n private async resolveGetAZs(value: unknown, context: ResolverContext): Promise<string[]> {\n // Recursively resolve the value first (it could be a Ref or other intrinsic function)\n const resolvedValue = await this.resolveValue(value, context);\n\n let region: string;\n if (typeof resolvedValue === 'string' && resolvedValue !== '') {\n region = resolvedValue;\n } else {\n // Empty string or non-string: use current region\n const accountInfo = await getAccountInfo(this.resolverRegion);\n region = accountInfo.region;\n }\n\n // Check cache\n const cached = cachedAvailabilityZones[region];\n if (cached) {\n this.logger.debug(`Resolved Fn::GetAZs from cache: ${region} -> ${JSON.stringify(cached)}`);\n return cached;\n }\n\n // Call EC2 DescribeAvailabilityZones\n const awsClients = getAwsClients();\n const ec2Client = awsClients.ec2;\n\n try {\n const response = await ec2Client.send(\n new DescribeAvailabilityZonesCommand({\n Filters: [\n {\n Name: 'region-name',\n Values: [region],\n },\n {\n Name: 'state',\n Values: ['available'],\n },\n ],\n })\n );\n\n const azNames = (response.AvailabilityZones || [])\n .map((az) => az.ZoneName)\n .filter((name): name is string => name !== undefined)\n .sort();\n\n cachedAvailabilityZones[region] = azNames;\n this.logger.debug(`Resolved Fn::GetAZs: ${region} -> ${JSON.stringify(azNames)}`);\n return azNames;\n } catch (error) {\n throw new Error(\n `Fn::GetAZs: failed to describe availability zones for region '${region}': ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Resolve pseudo parameters\n *\n * Pseudo parameters are built-in CloudFormation references like AWS::Region\n */\n private async resolvePseudoParameter(\n name: string,\n context?: ResolverContext\n ): Promise<string | symbol | undefined> {\n switch (name) {\n case 'AWS::Region': {\n const accountInfo = await getAccountInfo(this.resolverRegion);\n return accountInfo.region;\n }\n\n case 'AWS::AccountId': {\n const accountInfo = await getAccountInfo(this.resolverRegion);\n return accountInfo.accountId;\n }\n\n case 'AWS::Partition': {\n const accountInfo = await getAccountInfo(this.resolverRegion);\n return accountInfo.partition;\n }\n\n case 'AWS::StackName':\n return context?.stackName ?? 'UnknownStack';\n\n case 'AWS::StackId': {\n // cdkd doesn't use CloudFormation stacks, generate a synthetic ID\n const info = await getAccountInfo(this.resolverRegion);\n return `arn:aws:cloudformation:${info.region}:${info.accountId}:stack/${context?.stackName ?? 'UnknownStack'}/cdkd`;\n }\n\n case 'AWS::URLSuffix':\n return 'amazonaws.com';\n\n case 'AWS::NotificationARNs':\n return undefined;\n\n case 'AWS::NoValue':\n // Return special symbol to indicate property should be omitted\n return AWS_NO_VALUE;\n\n default:\n return undefined;\n }\n }\n\n /**\n * Resolve CloudFormation Dynamic References in a string value\n *\n * Supports:\n * - {{resolve:secretsmanager:SECRET_ID:SecretString:JSON_KEY:VERSION_STAGE:VERSION_ID}}\n * - {{resolve:ssm:PARAMETER_NAME}}\n *\n * Results are cached to avoid repeated API calls.\n */\n async resolveDynamicReferences(value: string): Promise<string> {\n // Match all {{resolve:...}} patterns\n const pattern = /\\{\\{resolve:([^}]+)\\}\\}/g;\n let result = value;\n let match: RegExpExecArray | null;\n\n // Collect all matches first (to avoid issues with modifying string during iteration)\n const matches: Array<{ fullMatch: string; inner: string }> = [];\n while ((match = pattern.exec(value)) !== null) {\n matches.push({ fullMatch: match[0], inner: match[1]! });\n }\n\n for (const { fullMatch, inner } of matches) {\n // Check cache first\n if (fullMatch in cachedDynamicReferences) {\n result = result.replace(fullMatch, cachedDynamicReferences[fullMatch]!);\n continue;\n }\n\n const parts = inner.split(':');\n const service = parts[0];\n\n let resolved: string;\n\n if (service === 'secretsmanager') {\n resolved = await this.resolveSecretsManagerReference(inner);\n } else if (service === 'ssm') {\n resolved = await this.resolveSSMReference(parts);\n } else {\n this.logger.warn(`Unsupported dynamic reference service: ${service}`);\n continue;\n }\n\n cachedDynamicReferences[fullMatch] = resolved;\n result = result.replace(fullMatch, resolved);\n }\n\n return result;\n }\n\n /**\n * Resolve a Secrets Manager dynamic reference\n *\n * Format: secretsmanager:SECRET_ID:SecretString:JSON_KEY:VERSION_STAGE:VERSION_ID\n * SECRET_ID can be a simple name or an ARN (arn:aws:secretsmanager:REGION:ACCOUNT:secret:NAME)\n * which contains colons, so we cannot simply split on ':'.\n * Instead, we find ':SecretString:' or ':SecretBinary:' as the delimiter.\n */\n private async resolveSecretsManagerReference(inner: string): Promise<string> {\n // inner = \"secretsmanager:SECRET_ID:SecretString:JSON_KEY:VERSION_STAGE:VERSION_ID\"\n // Remove the \"secretsmanager:\" prefix\n const afterService = inner.substring('secretsmanager:'.length);\n\n // Find :SecretString: or :SecretBinary: as the delimiter between SECRET_ID and the rest\n let secretId: string;\n let jsonKey = '';\n let versionStage = '';\n let versionId = '';\n\n const secretStringIdx = afterService.indexOf(':SecretString:');\n const secretBinaryIdx = afterService.indexOf(':SecretBinary:');\n const delimiterIdx =\n secretStringIdx >= 0 && secretBinaryIdx >= 0\n ? Math.min(secretStringIdx, secretBinaryIdx)\n : secretStringIdx >= 0\n ? secretStringIdx\n : secretBinaryIdx;\n const delimiterLen =\n delimiterIdx >= 0 && delimiterIdx === secretBinaryIdx\n ? ':SecretBinary:'.length\n : ':SecretString:'.length;\n\n if (delimiterIdx >= 0) {\n secretId = afterService.substring(0, delimiterIdx);\n // remaining = \"JSON_KEY:VERSION_STAGE:VERSION_ID\"\n const remaining = afterService.substring(delimiterIdx + delimiterLen);\n const remainingParts = remaining.split(':');\n jsonKey = remainingParts[0] || '';\n versionStage = remainingParts[1] || '';\n versionId = remainingParts[2] || '';\n } else {\n // No :SecretString: or :SecretBinary: found, treat entire afterService as SECRET_ID\n secretId = afterService;\n }\n\n // Empty strings should be treated as undefined (handles trailing :: in references)\n if (!versionStage) {\n versionStage = 'AWSCURRENT';\n }\n\n if (!secretId) {\n throw new Error('Dynamic reference: secretsmanager SECRET_ID is required');\n }\n\n this.logger.debug(\n `Resolving dynamic reference: secretsmanager:${secretId}:SecretString:${jsonKey}:${versionStage}:${versionId}`\n );\n\n const awsClients = getAwsClients();\n const client = awsClients.secretsManager;\n\n const command = new GetSecretValueCommand({\n SecretId: secretId,\n ...(versionStage && versionStage !== '' && { VersionStage: versionStage }),\n ...(versionId && versionId !== '' && { VersionId: versionId }),\n });\n\n const response = await client.send(command);\n const secretString = response.SecretString;\n\n if (!secretString) {\n throw new Error(\n `Dynamic reference: secret '${secretId}' does not contain a SecretString value`\n );\n }\n\n // If JSON_KEY is specified, parse JSON and extract the key\n if (jsonKey) {\n try {\n const parsed = JSON.parse(secretString) as Record<string, unknown>;\n const keyValue = parsed[jsonKey];\n if (keyValue === undefined) {\n throw new Error(`Dynamic reference: key '${jsonKey}' not found in secret '${secretId}'`);\n }\n return String(keyValue);\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `Dynamic reference: secret '${secretId}' is not valid JSON but JSON_KEY '${jsonKey}' was specified`\n );\n }\n throw error;\n }\n }\n\n // No JSON_KEY: return full secret string\n return secretString;\n }\n\n /**\n * Resolve an SSM Parameter Store dynamic reference\n *\n * Format: ssm:PARAMETER_NAME\n * Parts[0] = 'ssm'\n * Parts[1] = PARAMETER_NAME\n */\n /**\n * Resolve Fn::Cidr intrinsic function\n *\n * Fn::Cidr returns an array of CIDR address blocks.\n * Syntax: { \"Fn::Cidr\": [ ipBlock, count, cidrBits ] }\n * - ipBlock: The user-specified CIDR address block to be split\n * - count: The number of CIDRs to generate\n * - cidrBits: The number of subnet bits for the CIDR (e.g., \"64\" for /64 in IPv6)\n */\n private async resolveCidr(\n args: [unknown, unknown, unknown],\n context: ResolverContext\n ): Promise<string[]> {\n const [rawIpBlock, rawCount, rawCidrBits] = args;\n const ipBlock = (await this.resolveValue(rawIpBlock, context)) as string;\n const count = Number(await this.resolveValue(rawCount, context));\n const cidrBits = Number(await this.resolveValue(rawCidrBits, context));\n\n if (!ipBlock || typeof ipBlock !== 'string') {\n throw new Error(\n `Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(ipBlock)}`\n );\n }\n\n this.logger.debug(\n `Resolving Fn::Cidr: ipBlock=${ipBlock}, count=${count}, cidrBits=${cidrBits}`\n );\n\n const isIpv6 = ipBlock.includes(':');\n const results: string[] = [];\n\n if (isIpv6) {\n // IPv6 CIDR calculation\n // Parse the base IPv6 address and prefix\n const [baseAddr, prefixStr] = ipBlock.split('/');\n const basePrefix = parseInt(prefixStr!, 10);\n const subnetPrefix = 128 - cidrBits; // cidrBits = host bits, so subnet prefix = 128 - cidrBits\n\n // Expand IPv6 address to full form\n const expanded = this.expandIPv6(baseAddr!);\n const addrBigInt = this.ipv6ToBigInt(expanded);\n\n // Calculate subnet size\n const subnetSize = BigInt(1) << BigInt(128 - subnetPrefix);\n\n // Mask the base address to the network prefix\n const prefixMask =\n (BigInt(1) << BigInt(128)) -\n BigInt(1) -\n ((BigInt(1) << BigInt(128 - basePrefix)) - BigInt(1));\n const networkBase = addrBigInt & prefixMask;\n\n for (let i = 0; i < count; i++) {\n const subnetAddr = networkBase + subnetSize * BigInt(i);\n results.push(`${this.bigIntToIPv6(subnetAddr)}/${subnetPrefix}`);\n }\n } else {\n // IPv4 CIDR calculation\n const [baseAddr, prefixStr] = ipBlock.split('/');\n const basePrefix = parseInt(prefixStr!, 10);\n const subnetPrefix = 32 - cidrBits;\n\n const parts = baseAddr!.split('.').map(Number);\n const baseInt = ((parts[0]! << 24) | (parts[1]! << 16) | (parts[2]! << 8) | parts[3]!) >>> 0;\n const subnetSize = 1 << (32 - subnetPrefix);\n const prefixMask = (0xffffffff << (32 - basePrefix)) >>> 0;\n const networkBase = (baseInt & prefixMask) >>> 0;\n\n for (let i = 0; i < count; i++) {\n const subnetAddr = (networkBase + subnetSize * i) >>> 0;\n const a = (subnetAddr >>> 24) & 0xff;\n const b = (subnetAddr >>> 16) & 0xff;\n const c = (subnetAddr >>> 8) & 0xff;\n const d = subnetAddr & 0xff;\n results.push(`${a}.${b}.${c}.${d}/${subnetPrefix}`);\n }\n }\n\n this.logger.debug(`Fn::Cidr result: ${JSON.stringify(results)}`);\n return results;\n }\n\n /** Expand IPv6 address to full 8-group form */\n private expandIPv6(addr: string): string {\n // Handle :: expansion\n if (addr.includes('::')) {\n const [left, right] = addr.split('::');\n const leftParts = left ? left.split(':') : [];\n const rightParts = right ? right.split(':') : [];\n const missing = 8 - leftParts.length - rightParts.length;\n const middle = Array.from({ length: missing }, () => '0000');\n const all = [...leftParts, ...middle, ...rightParts];\n return all.map((p: string) => p.padStart(4, '0')).join(':');\n }\n return addr\n .split(':')\n .map((p) => p.padStart(4, '0'))\n .join(':');\n }\n\n /** Convert expanded IPv6 string to BigInt */\n private ipv6ToBigInt(expanded: string): bigint {\n const parts = expanded.split(':');\n let result = BigInt(0);\n for (const part of parts) {\n result = (result << BigInt(16)) | BigInt(parseInt(part, 16));\n }\n return result;\n }\n\n /** Convert BigInt to compressed IPv6 string */\n private bigIntToIPv6(n: bigint): string {\n const parts: string[] = [];\n for (let i = 7; i >= 0; i--) {\n parts.push(((n >> BigInt(i * 16)) & BigInt(0xffff)).toString(16));\n }\n // Simple format \u2014 don't compress with :: for clarity\n return parts.join(':');\n }\n\n private async resolveSSMReference(parts: string[]): Promise<string> {\n const parameterName = parts.slice(1).join(':');\n\n if (!parameterName) {\n throw new Error('Dynamic reference: ssm PARAMETER_NAME is required');\n }\n\n this.logger.debug(`Resolving dynamic reference: ssm:${parameterName}`);\n\n const awsClients = getAwsClients();\n const client = awsClients.ssm;\n\n const command = new GetParameterCommand({\n Name: parameterName,\n WithDecryption: true,\n });\n\n const response = await client.send(command);\n const paramValue = response.Parameter?.Value;\n\n if (paramValue === undefined || paramValue === null) {\n throw new Error(\n `Dynamic reference: SSM parameter '${parameterName}' not found or has no value`\n );\n }\n\n return paramValue;\n }\n}\n", "/**\n * JSON Patch Generator for Cloud Control API\n *\n * Generates RFC 6902 compliant JSON Patch documents by comparing\n * previous and desired resource properties.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc6902\n */\n\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * JSON Patch operation types\n */\nexport type PatchOperation = 'add' | 'remove' | 'replace' | 'test';\n\n/**\n * JSON Patch operation\n */\nexport interface JsonPatchOp {\n op: PatchOperation;\n path: string;\n value?: unknown;\n}\n\n/**\n * JSON Patch Generator\n *\n * Creates minimal patch documents for Cloud Control API updates.\n */\nexport class JsonPatchGenerator {\n private logger = getLogger().child('JsonPatchGenerator');\n\n /**\n * Generate JSON Patch from property differences\n *\n * @param previousProperties - Previous resource properties\n * @param desiredProperties - Desired resource properties\n * @returns Array of JSON Patch operations\n */\n generatePatch(\n previousProperties: Record<string, unknown>,\n desiredProperties: Record<string, unknown>\n ): JsonPatchOp[] {\n const patches: JsonPatchOp[] = [];\n\n // Find added or changed properties\n for (const [key, value] of Object.entries(desiredProperties)) {\n const previousValue = previousProperties[key];\n\n if (previousValue === undefined) {\n // Property added\n patches.push({\n op: 'add',\n path: `/${this.escapeJsonPointer(key)}`,\n value,\n });\n } else if (!this.deepEqual(previousValue, value)) {\n // Property changed\n patches.push({\n op: 'replace',\n path: `/${this.escapeJsonPointer(key)}`,\n value,\n });\n }\n // else: no change, skip\n }\n\n // Find removed properties\n for (const key of Object.keys(previousProperties)) {\n if (!(key in desiredProperties)) {\n patches.push({\n op: 'remove',\n path: `/${this.escapeJsonPointer(key)}`,\n });\n }\n }\n\n this.logger.debug(`Generated ${patches.length} patch operations`);\n\n return patches;\n }\n\n /**\n * Generate a full replacement patch\n *\n * This is used as a fallback when property-level patching is not feasible.\n *\n * @param properties - Desired resource properties\n * @returns Single replace operation at root\n */\n generateFullReplacementPatch(properties: Record<string, unknown>): JsonPatchOp[] {\n return [\n {\n op: 'replace',\n path: '/',\n value: properties,\n },\n ];\n }\n\n /**\n * Escape JSON Pointer special characters\n *\n * Per RFC 6901, '~' and '/' must be escaped in JSON Pointer paths.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc6901\n */\n private escapeJsonPointer(str: string): string {\n return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n }\n\n /**\n * Deep equality check for values\n *\n * Handles objects, arrays, primitives, null, and undefined.\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n // Same reference or both null/undefined\n if (a === b) return true;\n\n // Different types\n if (typeof a !== typeof b) return false;\n\n // null comparison\n if (a === null || b === null) return false;\n\n // Array comparison\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, index) => this.deepEqual(item, b[index]));\n }\n\n // Object comparison\n if (typeof a === 'object' && typeof b === 'object') {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n return aKeys.every((key) => this.deepEqual(aObj[key], bObj[key]));\n }\n\n // Primitive comparison (already handled by a === b above, but for clarity)\n return false;\n }\n}\n", "import { LambdaClient, InvokeCommand, type InvocationResponse } from '@aws-sdk/client-lambda';\nimport { SNSClient, PublishCommand } from '@aws-sdk/client-sns';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * CloudFormation Custom Resource Response format\n * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html\n */\ninterface CfnCustomResourceResponse {\n Status: 'SUCCESS' | 'FAILED';\n Reason?: string;\n PhysicalResourceId?: string;\n StackId?: string;\n RequestId?: string;\n LogicalResourceId?: string;\n NoEcho?: boolean;\n Data?: Record<string, unknown>;\n}\n\n/**\n * Custom Resource Lambda Response Payload (direct return)\n * Some handlers return data directly in the Lambda payload instead of via ResponseURL\n */\ninterface CustomResourceResponsePayload {\n PhysicalResourceId?: string;\n Data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Configuration for Custom Resource Provider\n */\nexport interface CustomResourceProviderConfig {\n /** S3 bucket name for storing custom resource responses */\n responseBucket?: string;\n /** S3 key prefix for response objects */\n responsePrefix?: string;\n /**\n * Max time (ms) to wait for async custom resource responses (e.g., CDK Provider framework\n * with isCompleteHandler that uses Step Functions polling).\n * Default: 1 hour (3600000ms), matching CDK's default totalTimeout.\n */\n asyncResponseTimeoutMs?: number;\n}\n\n/**\n * Type guard to validate Lambda response payload structure\n */\nfunction isCustomResourceResponsePayload(value: unknown): value is CustomResourceResponsePayload {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const payload = value as Record<string, unknown>;\n\n if ('PhysicalResourceId' in payload && typeof payload['PhysicalResourceId'] !== 'string') {\n return false;\n }\n\n if ('Data' in payload) {\n if (typeof payload['Data'] !== 'object' || payload['Data'] === null) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Parse Lambda response payload with type safety\n */\nfunction parseLambdaPayload(payloadBytes: Uint8Array | undefined): CustomResourceResponsePayload {\n if (!payloadBytes) {\n return {};\n }\n\n const payloadString = Buffer.from(payloadBytes).toString();\n\n // Handle empty or null responses\n if (!payloadString || payloadString === 'null' || payloadString === '\"\"') {\n return {};\n }\n\n const parsed: unknown = JSON.parse(payloadString);\n\n if (!isCustomResourceResponsePayload(parsed)) {\n throw new Error(`Invalid Lambda response payload format: ${JSON.stringify(parsed)}`);\n }\n\n return parsed;\n}\n\n/**\n * Custom Resource Provider\n *\n * Implements Lambda-backed custom resources by invoking the Lambda function\n * specified in the ServiceToken property.\n *\n * This provider follows the CloudFormation custom resource protocol:\n * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/custom-resources.html\n *\n * Supports both standard custom resources and CDK's Provider framework:\n *\n * **Standard custom resources:**\n * - ServiceToken Lambda is invoked synchronously\n * - Handler sends cfn-response to ResponseURL (S3 pre-signed URL) or returns directly\n * - Short polling timeout (30 seconds)\n *\n * **CDK Provider framework (with isCompleteHandler):**\n * - ServiceToken points to the framework's onEvent wrapper Lambda\n * - Lambda invokes user's onEventHandler, then starts a Step Functions state machine\n * - Step Functions polls the isCompleteHandler until IsComplete: true\n * - Step Functions sends cfn-response to ResponseURL when done\n * - Lambda returns null/empty payload (async pattern detected automatically)\n * - Long polling timeout with exponential backoff (default: 1 hour)\n *\n * Response handling strategy:\n * 1. Generate a pre-signed S3 PUT URL as the ResponseURL (valid for 2 hours)\n * 2. Invoke Lambda synchronously (RequestResponse)\n * 3. Check Lambda payload for direct response (simple handlers)\n * 4. If no direct response, detect async pattern and poll S3 with appropriate timeout\n */\nexport class CustomResourceProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private snsClient: SNSClient;\n private s3Client: S3Client;\n private logger = getLogger().child('CustomResourceProvider');\n private responseBucket: string | undefined;\n private responsePrefix: string;\n\n /** Max time to wait for synchronous S3 response after Lambda invocation (30 seconds) */\n private readonly SYNC_RESPONSE_TIMEOUT_MS = 30_000;\n /** Max time to wait for async S3 response (CDK Provider framework with isCompleteHandler) */\n private readonly asyncResponseTimeoutMs: number;\n /** Default async response timeout: 1 hour (matches CDK's default totalTimeout) */\n private static readonly DEFAULT_ASYNC_RESPONSE_TIMEOUT_MS = 3_600_000;\n /** Initial poll interval for checking S3 response (2 seconds) */\n private readonly INITIAL_POLL_INTERVAL_MS = 2_000;\n /** Max poll interval for async polling with exponential backoff (30 seconds) */\n private readonly MAX_POLL_INTERVAL_MS = 30_000;\n\n constructor(config?: CustomResourceProviderConfig) {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n this.snsClient = awsClients.sns;\n this.s3Client = awsClients.s3;\n this.responseBucket = config?.responseBucket;\n this.responsePrefix = config?.responsePrefix ?? 'custom-resource-responses';\n this.asyncResponseTimeoutMs =\n config?.asyncResponseTimeoutMs ?? CustomResourceProvider.DEFAULT_ASYNC_RESPONSE_TIMEOUT_MS;\n }\n\n /**\n * Set the S3 bucket for custom resource responses\n * Called by ProviderRegistry when state bucket is configured\n */\n setResponseBucket(bucket: string, bucketRegion?: string): void {\n this.responseBucket = bucket;\n // For cross-region deploy: S3 client for response bucket must use the bucket's region,\n // not the stack's region. The state bucket is always in the base region.\n if (bucketRegion) {\n this.s3Client = new S3Client(bucketRegion ? { region: bucketRegion } : {});\n }\n }\n\n /**\n * Create a custom resource by invoking its Lambda handler\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating custom resource ${logicalId} (${resourceType})`);\n\n const serviceToken = properties['ServiceToken'] as string | undefined;\n\n if (!serviceToken) {\n throw new ProvisioningError(\n `ServiceToken is required for custom resource ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const requestId = `cdkd-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n const responseKey = this.getResponseKey(requestId);\n const responseURL = await this.generateResponseURL(responseKey);\n\n const request = {\n RequestType: 'Create',\n RequestId: requestId,\n ResponseURL: responseURL,\n ResourceType: resourceType,\n LogicalResourceId: logicalId,\n StackId: `arn:aws:cloudformation:us-east-1:000000000000:stack/cdkd-${logicalId}/cdkd`,\n ResourceProperties: this.stringifyProperties(properties),\n };\n\n this.logger.debug(`Sending custom resource create request: ${serviceToken}`);\n\n const cfnResponse = await this.sendRequest(\n serviceToken,\n request,\n responseKey,\n logicalId,\n 'Create'\n );\n\n if (cfnResponse.Status === 'FAILED') {\n throw new Error(\n `Custom resource handler returned FAILED: ${cfnResponse.Reason || 'Unknown reason'}`\n );\n }\n\n const physicalId: string = cfnResponse.PhysicalResourceId || logicalId;\n const attributes: Record<string, unknown> = cfnResponse.Data || {};\n\n this.logger.debug(`Successfully created custom resource ${logicalId}: ${physicalId}`);\n\n return { physicalId, attributes };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create custom resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a custom resource by invoking its Lambda handler\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating custom resource ${logicalId}: ${physicalId} (${resourceType})`);\n\n const serviceToken = properties['ServiceToken'] as string | undefined;\n\n if (!serviceToken) {\n throw new ProvisioningError(\n `ServiceToken is required for custom resource ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n const requestId = `cdkd-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n const responseKey = this.getResponseKey(requestId);\n const responseURL = await this.generateResponseURL(responseKey);\n\n const request = {\n RequestType: 'Update',\n RequestId: requestId,\n ResponseURL: responseURL,\n ResourceType: resourceType,\n LogicalResourceId: logicalId,\n PhysicalResourceId: physicalId,\n StackId: `arn:aws:cloudformation:us-east-1:000000000000:stack/cdkd-${logicalId}/cdkd`,\n ResourceProperties: this.stringifyProperties(properties),\n OldResourceProperties: this.stringifyProperties(previousProperties),\n };\n\n this.logger.debug(`Sending custom resource update request: ${serviceToken}`);\n\n const cfnResponse = await this.sendRequest(\n serviceToken,\n request,\n responseKey,\n logicalId,\n 'Update'\n );\n\n if (cfnResponse.Status === 'FAILED') {\n throw new Error(\n `Custom resource handler returned FAILED: ${cfnResponse.Reason || 'Unknown reason'}`\n );\n }\n\n const newPhysicalId: string = cfnResponse.PhysicalResourceId || physicalId;\n const wasReplaced: boolean = newPhysicalId !== physicalId;\n const attributes: Record<string, unknown> = cfnResponse.Data || {};\n\n this.logger.debug(\n `Successfully updated custom resource ${logicalId}: ${newPhysicalId}${wasReplaced ? ' (replaced)' : ''}`\n );\n\n return { physicalId: newPhysicalId, wasReplaced, attributes };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update custom resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a custom resource by invoking its Lambda handler\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting custom resource ${logicalId}: ${physicalId} (${resourceType})`);\n\n if (!properties) {\n this.logger.warn(\n `No properties available for custom resource ${logicalId}, skipping deletion`\n );\n return;\n }\n\n const serviceToken = properties['ServiceToken'] as string | undefined;\n\n if (!serviceToken) {\n this.logger.warn(`No ServiceToken found for custom resource ${logicalId}, skipping deletion`);\n return;\n }\n\n try {\n const requestId = `cdkd-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n const responseKey = this.getResponseKey(requestId);\n const responseURL = await this.generateResponseURL(responseKey);\n\n const request = {\n RequestType: 'Delete',\n RequestId: requestId,\n ResponseURL: responseURL,\n ResourceType: resourceType,\n LogicalResourceId: logicalId,\n PhysicalResourceId: physicalId,\n StackId: `arn:aws:cloudformation:us-east-1:000000000000:stack/cdkd-${logicalId}/cdkd`,\n ResourceProperties: this.stringifyProperties(properties),\n };\n\n this.logger.debug(`Sending custom resource delete request: ${serviceToken}`);\n\n const cfnResponse = await this.sendRequest(\n serviceToken,\n request,\n responseKey,\n logicalId,\n 'Delete'\n );\n\n if (cfnResponse.Status === 'FAILED') {\n this.logger.warn(\n `Custom resource delete handler returned FAILED for ${logicalId}: ${cfnResponse.Reason || 'Unknown reason'}`\n );\n } else {\n this.logger.debug(`Successfully deleted custom resource ${logicalId}`);\n }\n } catch (error) {\n // For deletion, we should be more lenient with errors\n this.logger.warn(\n `Failed to delete custom resource ${logicalId}, but continuing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Check if a ServiceToken is an SNS topic ARN\n */\n isSnsServiceToken(serviceToken: string): boolean {\n return serviceToken.startsWith('arn:aws:sns:');\n }\n\n /**\n * Send custom resource request via the appropriate service (Lambda or SNS)\n * For Lambda: invokes synchronously and returns the response\n * For SNS: publishes to topic and polls S3 for response\n */\n private async sendRequest(\n serviceToken: string,\n request: Record<string, unknown>,\n responseKey: string,\n logicalId: string,\n operation: string\n ): Promise<CfnCustomResourceResponse> {\n if (this.isSnsServiceToken(serviceToken)) {\n this.logger.debug(`ServiceToken is SNS topic, publishing to: ${serviceToken}`);\n await this.publishToSns(serviceToken, request);\n return await this.pollS3Response(responseKey, logicalId, operation);\n }\n\n const response = await this.invokeLambda(serviceToken, request);\n return await this.getCustomResourceResponse(response, responseKey, logicalId, operation);\n }\n\n /**\n * Publish custom resource request to an SNS topic\n */\n private async publishToSns(topicArn: string, request: Record<string, unknown>): Promise<void> {\n await this.snsClient.send(\n new PublishCommand({\n TopicArn: topicArn,\n Message: JSON.stringify(request),\n })\n );\n }\n\n /**\n * Invoke Lambda function synchronously\n */\n private async invokeLambda(\n serviceToken: string,\n request: Record<string, unknown>\n ): Promise<InvocationResponse> {\n return await this.lambdaClient.send(\n new InvokeCommand({\n FunctionName: serviceToken,\n InvocationType: 'RequestResponse',\n Payload: Buffer.from(JSON.stringify(request)),\n })\n );\n }\n\n /**\n * Get custom resource response from either Lambda payload or S3\n *\n * Strategy:\n * 1. If Lambda returned a direct payload with Status field \u2192 use it (cfn-response inline)\n * 2. If Lambda returned a payload with PhysicalResourceId \u2192 use it (simple handler)\n * 3. Otherwise, poll S3 for the response (cfn-response via ResponseURL)\n */\n private async getCustomResourceResponse(\n lambdaResponse: InvocationResponse,\n responseKey: string,\n logicalId: string,\n operation: string\n ): Promise<CfnCustomResourceResponse> {\n // Check for Lambda execution errors\n if (lambdaResponse.FunctionError) {\n const errorPayload = lambdaResponse.Payload\n ? Buffer.from(lambdaResponse.Payload).toString()\n : 'Unknown';\n throw new Error(`Lambda function error (${lambdaResponse.FunctionError}): ${errorPayload}`);\n }\n\n // Try to parse direct Lambda response\n // Track whether Lambda returned a meaningful payload. If not, this likely indicates\n // an async pattern (e.g., CDK Provider framework with isCompleteHandler that delegates\n // to Step Functions for polling).\n let hasDirectPayload = false;\n try {\n const payload = parseLambdaPayload(lambdaResponse.Payload);\n\n // Check if this is a full cfn-response (has Status field)\n if (\n 'Status' in payload &&\n (payload['Status'] === 'SUCCESS' || payload['Status'] === 'FAILED')\n ) {\n this.logger.debug(`Got direct cfn-response from Lambda for ${logicalId}`);\n await this.cleanupResponseObject(responseKey);\n return payload as unknown as CfnCustomResourceResponse;\n }\n\n // Check if this is a simple handler response (has PhysicalResourceId but no Status)\n if (payload.PhysicalResourceId || payload.Data) {\n this.logger.debug(`Got simple handler response from Lambda for ${logicalId}`);\n await this.cleanupResponseObject(responseKey);\n const result: CfnCustomResourceResponse = {\n Status: 'SUCCESS',\n };\n if (payload.PhysicalResourceId) {\n result.PhysicalResourceId = payload.PhysicalResourceId;\n }\n if (payload.Data) {\n result.Data = payload.Data;\n }\n return result;\n }\n\n // Payload parsed but contained no recognizable fields (e.g., empty object from\n // CDK Provider framework after starting Step Functions). Mark as no direct payload.\n hasDirectPayload = Object.keys(payload).length > 0;\n } catch {\n // Payload parsing failed, try S3\n this.logger.debug(`Lambda payload parse failed for ${logicalId}, checking S3 response`);\n }\n\n // Poll S3 for response (cfn-response module sends to ResponseURL)\n if (!this.responseBucket) {\n this.logger.warn(\n `No response bucket configured for custom resource ${logicalId}. ` +\n `The Lambda handler likely uses cfn-response module which sends to ResponseURL. ` +\n `Configure --state-bucket to enable S3-based response handling.`\n );\n return {\n Status: 'SUCCESS',\n PhysicalResourceId: logicalId,\n };\n }\n\n // Detect async custom resource pattern (CDK Provider framework with isCompleteHandler).\n // When the framework Lambda starts a Step Functions state machine for async polling,\n // it returns no meaningful payload (empty/null). In this case, the Step Functions\n // will eventually PUT the cfn-response to the ResponseURL, which may take up to\n // the configured totalTimeout (default: 1 hour in CDK).\n // We use a longer timeout for this case vs the short timeout for synchronous handlers.\n const isAsyncPattern = !hasDirectPayload;\n if (isAsyncPattern) {\n this.logger.debug(\n `Custom resource ${logicalId} uses async Provider framework. ` +\n `Waiting up to ${Math.round(this.asyncResponseTimeoutMs / 60_000)} minutes.`\n );\n } else {\n this.logger.debug(`Waiting for S3 response from Lambda for ${logicalId} (${operation})`);\n }\n\n const timeoutMs = isAsyncPattern ? this.asyncResponseTimeoutMs : this.SYNC_RESPONSE_TIMEOUT_MS;\n return await this.pollS3Response(responseKey, logicalId, operation, timeoutMs, isAsyncPattern);\n }\n\n /**\n * Generate a pre-signed S3 PUT URL for Lambda to send its response\n */\n private async generateResponseURL(responseKey: string): Promise<string> {\n if (!this.responseBucket) {\n // Fallback: return a dummy URL (legacy behavior)\n return 'https://localhost/cfn-response-not-configured';\n }\n\n // Create an empty placeholder object first (so the key exists for cleanup)\n await this.s3Client.send(\n new PutObjectCommand({\n Bucket: this.responseBucket,\n Key: responseKey,\n Body: '',\n ContentLength: 0,\n ContentType: 'application/json',\n })\n );\n\n // Generate pre-signed PUT URL (valid for 2 hours to accommodate async Provider framework\n // patterns where Step Functions may poll isCompleteHandler for up to 1 hour)\n // Don't specify ContentType so any Content-Type is accepted (cfn-response may send different types)\n const command = new PutObjectCommand({\n Bucket: this.responseBucket,\n Key: responseKey,\n });\n\n const presignedUrl = await getSignedUrl(this.s3Client, command, {\n expiresIn: 7200,\n });\n\n this.logger.debug(\n `Generated pre-signed URL for response: s3://${this.responseBucket}/${responseKey}`\n );\n return presignedUrl;\n }\n\n /**\n * Poll S3 for the custom resource response\n *\n * Uses exponential backoff for polling interval:\n * - Sync mode (standard handlers): starts at 2s, no backoff (short timeout)\n * - Async mode (Provider framework with isCompleteHandler): starts at 2s, backs off to 30s max\n *\n * @param responseKey S3 key where response will be written\n * @param logicalId Logical resource ID for logging\n * @param operation Operation type (Create/Update/Delete) for logging\n * @param timeoutMs Maximum time to wait for response\n * @param useBackoff Whether to use exponential backoff (for async/long-running operations)\n */\n private async pollS3Response(\n responseKey: string,\n logicalId: string,\n operation: string,\n timeoutMs: number = this.SYNC_RESPONSE_TIMEOUT_MS,\n useBackoff: boolean = false\n ): Promise<CfnCustomResourceResponse> {\n const startTime = Date.now();\n let currentInterval = this.INITIAL_POLL_INTERVAL_MS;\n let pollCount = 0;\n\n // Listen for SIGINT to abort polling early\n let interrupted = false;\n const sigintHandler = () => {\n interrupted = true;\n };\n process.on('SIGINT', sigintHandler);\n\n try {\n while (Date.now() - startTime < timeoutMs) {\n if (interrupted) {\n await this.cleanupResponseObject(responseKey);\n process.removeListener('SIGINT', sigintHandler);\n throw new Error(`Custom resource ${logicalId} interrupted by user`);\n }\n\n pollCount++;\n try {\n const response = await this.s3Client.send(\n new GetObjectCommand({\n Bucket: this.responseBucket!,\n Key: responseKey,\n })\n );\n\n const body = await response.Body?.transformToString();\n if (body && body.length > 0) {\n this.logger.debug(`Got S3 response for ${logicalId}: ${body.substring(0, 200)}`);\n\n try {\n const cfnResponse = JSON.parse(body) as CfnCustomResourceResponse;\n\n // Validate response has required fields\n if (cfnResponse.Status === 'SUCCESS' || cfnResponse.Status === 'FAILED') {\n // Cleanup the response object\n await this.cleanupResponseObject(responseKey);\n return cfnResponse;\n }\n } catch {\n // JSON parse failed, response not yet written properly\n this.logger.debug(`S3 response not yet valid JSON for ${logicalId}, retrying...`);\n }\n }\n } catch (error) {\n const err = error as { name?: string };\n if (err.name !== 'NoSuchKey') {\n this.logger.debug(`Error reading S3 response for ${logicalId}: ${err.name}`);\n }\n }\n\n await this.sleep(currentInterval);\n\n // Apply exponential backoff for async patterns (long-running operations)\n if (useBackoff) {\n currentInterval = Math.min(currentInterval * 1.5, this.MAX_POLL_INTERVAL_MS);\n\n // Log progress periodically for long-running operations\n if (pollCount % 10 === 0) {\n const elapsedSec = Math.round((Date.now() - startTime) / 1000);\n this.logger.info(\n `Still waiting for async custom resource ${logicalId} (${operation})... ` +\n `${elapsedSec}s elapsed, polling every ${Math.round(currentInterval / 1000)}s`\n );\n }\n }\n }\n\n // Cleanup on timeout\n await this.cleanupResponseObject(responseKey);\n\n const elapsedMin = Math.round((Date.now() - startTime) / 60_000);\n throw new Error(\n `Timeout waiting for custom resource response for ${logicalId} (${operation}) ` +\n `after ${elapsedMin} minutes. ` +\n (useBackoff\n ? `The async custom resource handler (Provider framework with isCompleteHandler) did not complete within the timeout. ` +\n `Check the Step Functions execution and isCompleteHandler Lambda logs for errors.`\n : `The Lambda handler may not be sending a response to ResponseURL.`)\n );\n } finally {\n process.removeListener('SIGINT', sigintHandler);\n }\n }\n\n /**\n * Get S3 key for response object\n */\n private getResponseKey(requestId: string): string {\n return `${this.responsePrefix}/${requestId}.json`;\n }\n\n /**\n * Cleanup response object from S3\n */\n private async cleanupResponseObject(responseKey: string): Promise<void> {\n if (!this.responseBucket) return;\n\n try {\n await this.s3Client.send(\n new DeleteObjectCommand({\n Bucket: this.responseBucket,\n Key: responseKey,\n })\n );\n } catch {\n // Ignore cleanup errors\n }\n }\n\n /**\n * Convert property values to strings for CloudFormation compatibility\n *\n * CloudFormation converts all ResourceProperties values to strings before\n * passing them to Lambda handlers. Some CDK internal handlers (like\n * BucketNotificationsHandler) depend on this behavior (e.g., calling .lower()\n * on boolean values).\n */\n private stringifyProperties(properties: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'boolean') {\n result[key] = String(value);\n } else if (typeof value === 'number') {\n result[key] = String(value);\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result[key] = this.stringifyProperties(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n", "import type { ResourceProvider } from '../types/resource.js';\nimport { CloudControlProvider } from './cloud-control-provider.js';\nimport { CustomResourceProvider } from './providers/custom-resource-provider.js';\nimport { getLogger } from '../utils/logger.js';\n\n/**\n * Provider registry for managing resource providers\n *\n * Implements a fallback strategy:\n * 1. Try specific SDK provider if registered for this resource type\n * 2. Fall back to Cloud Control API if resource type is supported\n * 3. Throw error if no provider available\n */\nexport class ProviderRegistry {\n private logger = getLogger().child('ProviderRegistry');\n private providers = new Map<string, ResourceProvider>();\n private cloudControlProvider: CloudControlProvider;\n private customResourceProvider: CustomResourceProvider;\n private skipResourceTypes = new Set<string>();\n\n constructor() {\n this.cloudControlProvider = new CloudControlProvider();\n this.customResourceProvider = new CustomResourceProvider();\n }\n\n /**\n * Configure the response bucket for custom resources\n * This allows Lambda handlers using cfn-response to send responses via S3\n */\n setCustomResourceResponseBucket(bucket: string, bucketRegion?: string): void {\n this.customResourceProvider.setResponseBucket(bucket, bucketRegion);\n this.logger.debug(`Custom resource response bucket set to: ${bucket}`);\n }\n\n /**\n * Register a resource type to be skipped during deployment\n *\n * @param resourceType CloudFormation resource type to skip\n */\n skipResourceType(resourceType: string): void {\n this.logger.debug(`Registering ${resourceType} to be skipped`);\n this.skipResourceTypes.add(resourceType);\n }\n\n /**\n * Register a specific provider for a resource type\n *\n * @param resourceType CloudFormation resource type (e.g., \"AWS::S3::Bucket\")\n * @param provider Provider instance\n */\n register(resourceType: string, provider: ResourceProvider): void {\n this.logger.debug(`Registering provider for ${resourceType}`);\n this.providers.set(resourceType, provider);\n }\n\n /**\n * Unregister a provider for a resource type\n */\n unregister(resourceType: string): void {\n this.logger.debug(`Unregistering provider for ${resourceType}`);\n this.providers.delete(resourceType);\n }\n\n /**\n * Get provider for a resource type\n *\n * Selection strategy:\n * 1. If specific SDK provider is registered, use it\n * 2. Otherwise, use Cloud Control API if supported\n * 3. Throw error if no provider available\n *\n * @param resourceType CloudFormation resource type\n * @returns Provider instance\n * @throws Error if no provider available\n */\n getProvider(resourceType: string): ResourceProvider {\n // 1. Check for specific SDK provider\n const specificProvider = this.providers.get(resourceType);\n if (specificProvider) {\n this.logger.debug(`Using specific SDK provider for ${resourceType}`);\n return specificProvider;\n }\n\n // 2. Check if Cloud Control API supports this resource type\n if (CloudControlProvider.isSupportedResourceType(resourceType)) {\n this.logger.debug(`Using Cloud Control API provider for ${resourceType}`);\n return this.cloudControlProvider;\n }\n\n // 3. Check if it's a custom resource (Custom:: prefix or AWS::CloudFormation::CustomResource)\n if (\n resourceType.startsWith('Custom::') ||\n resourceType === 'AWS::CloudFormation::CustomResource'\n ) {\n this.logger.debug(`Using Custom Resource provider for ${resourceType}`);\n return this.customResourceProvider;\n }\n\n // 4. No provider available\n throw new Error(\n `No provider available for resource type: ${resourceType}. ` +\n `This resource type is not supported by Cloud Control API and no SDK provider is registered.`\n );\n }\n\n /**\n * Check if a resource type should be skipped\n */\n shouldSkipResource(resourceType: string): boolean {\n return this.skipResourceTypes.has(resourceType);\n }\n\n /**\n * Check if a provider is available for a resource type\n */\n hasProvider(resourceType: string): boolean {\n // Skipped resources are considered as \"having a provider\" to avoid validation errors\n if (this.shouldSkipResource(resourceType)) {\n return true;\n }\n return (\n this.providers.has(resourceType) ||\n CloudControlProvider.isSupportedResourceType(resourceType) ||\n resourceType.startsWith('Custom::') ||\n resourceType === 'AWS::CloudFormation::CustomResource'\n );\n }\n\n /**\n * Get the Cloud Control provider instance (for resource state lookup)\n */\n getCloudControlProvider(): CloudControlProvider {\n return this.cloudControlProvider;\n }\n\n /**\n * Get all registered resource types (excluding Cloud Control)\n */\n getRegisteredTypes(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get provider type for a resource type\n *\n * @returns 'sdk' | 'cloud-control' | null\n */\n getProviderType(resourceType: string): 'sdk' | 'cloud-control' | null {\n if (this.providers.has(resourceType)) {\n return 'sdk';\n }\n if (CloudControlProvider.isSupportedResourceType(resourceType)) {\n return 'cloud-control';\n }\n return null;\n }\n\n /**\n * Validate that all resource types have available providers\n *\n * This should be called before deployment starts to ensure all resources can be provisioned.\n *\n * @param resourceTypes Set of resource types to validate\n * @throws Error if any resource type doesn't have a provider\n */\n validateResourceTypes(resourceTypes: Set<string>): void {\n const unsupportedTypes: string[] = [];\n\n for (const resourceType of resourceTypes) {\n if (!this.hasProvider(resourceType)) {\n unsupportedTypes.push(resourceType);\n }\n }\n\n if (unsupportedTypes.length > 0) {\n throw new Error(\n `The following resource types are not supported:\\n` +\n unsupportedTypes.map((type) => ` - ${type}`).join('\\n') +\n `\\n\\nThese resource types are not supported by Cloud Control API and no SDK provider is registered.\\n` +\n `Please report this issue at https://github.com/go-to-k/cdkd/issues so we can add SDK provider support.`\n );\n }\n\n this.logger.debug(\n `Validated ${resourceTypes.size} resource types: all have available providers`\n );\n }\n}\n", "import {\n IAMClient,\n CreateRoleCommand,\n UpdateRoleCommand,\n UpdateAssumeRolePolicyCommand,\n DeleteRoleCommand,\n GetRoleCommand,\n PutRolePolicyCommand,\n DeleteRolePolicyCommand,\n ListRolePoliciesCommand,\n AttachRolePolicyCommand,\n DetachRolePolicyCommand,\n ListAttachedRolePoliciesCommand,\n ListInstanceProfilesForRoleCommand,\n RemoveRoleFromInstanceProfileCommand,\n TagRoleCommand,\n UntagRoleCommand,\n PutRolePermissionsBoundaryCommand,\n DeleteRolePermissionsBoundaryCommand,\n NoSuchEntityException,\n} from '@aws-sdk/client-iam';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS IAM Role Provider\n *\n * Implements resource provisioning for AWS::IAM::Role using the IAM SDK.\n * This is required because IAM Role is not supported by Cloud Control API.\n */\nexport class IAMRoleProvider implements ResourceProvider {\n private iamClient: IAMClient;\n private logger = getLogger().child('IAMRoleProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::IAM::Role',\n new Set([\n 'RoleName',\n 'AssumeRolePolicyDocument',\n 'Description',\n 'MaxSessionDuration',\n 'Path',\n 'PermissionsBoundary',\n 'ManagedPolicyArns',\n 'Policies',\n 'Tags',\n ]),\n ],\n ]);\n\n constructor() {\n // Use global AWS clients manager for better resource management\n const awsClients = getAwsClients();\n this.iamClient = awsClients.iam;\n }\n\n /**\n * Create an IAM role\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM role ${logicalId}`);\n\n const roleName = generateResourceName(\n (properties['RoleName'] as string | undefined) || logicalId,\n { maxLength: 64 }\n );\n const assumeRolePolicyDocument = properties['AssumeRolePolicyDocument'];\n\n if (!assumeRolePolicyDocument) {\n throw new ProvisioningError(\n `AssumeRolePolicyDocument is required for IAM role ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDocument =\n typeof assumeRolePolicyDocument === 'string'\n ? assumeRolePolicyDocument\n : JSON.stringify(assumeRolePolicyDocument);\n\n // Create role\n const createParams: {\n RoleName: string;\n AssumeRolePolicyDocument: string;\n Description?: string;\n MaxSessionDuration?: number;\n Path?: string;\n PermissionsBoundary?: string;\n } = {\n RoleName: roleName,\n AssumeRolePolicyDocument: policyDocument,\n };\n\n if (properties['Description']) {\n createParams.Description = properties['Description'] as string;\n }\n if (properties['MaxSessionDuration']) {\n createParams.MaxSessionDuration = properties['MaxSessionDuration'] as number;\n }\n if (properties['Path']) {\n createParams.Path = properties['Path'] as string;\n }\n if (properties['PermissionsBoundary']) {\n createParams.PermissionsBoundary = properties['PermissionsBoundary'] as string;\n }\n\n const response = await this.iamClient.send(new CreateRoleCommand(createParams));\n\n this.logger.debug(`Created IAM role: ${roleName}`);\n\n // Attach managed policies if specified\n const managedPolicyArns = properties['ManagedPolicyArns'] as string[] | undefined;\n if (managedPolicyArns && Array.isArray(managedPolicyArns)) {\n for (const policyArn of managedPolicyArns) {\n await this.iamClient.send(\n new AttachRolePolicyCommand({\n RoleName: roleName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn} to role ${roleName}`);\n }\n }\n\n // Add inline policies if specified\n const policies = properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined;\n if (policies && Array.isArray(policies)) {\n for (const policy of policies) {\n const policyDoc =\n typeof policy.PolicyDocument === 'string'\n ? policy.PolicyDocument\n : JSON.stringify(policy.PolicyDocument);\n\n await this.iamClient.send(\n new PutRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policy.PolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Added inline policy ${policy.PolicyName} to role ${roleName}`);\n }\n }\n\n // Add tags if specified\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && Array.isArray(tags)) {\n await this.iamClient.send(\n new TagRoleCommand({\n RoleName: roleName,\n Tags: tags,\n })\n );\n this.logger.debug(`Tagged role ${roleName}`);\n }\n\n this.logger.debug(`Successfully created IAM role ${logicalId}: ${roleName}`);\n\n const attributes = {\n Arn: response.Role?.Arn,\n RoleId: response.Role?.RoleId,\n };\n\n return {\n physicalId: roleName,\n attributes,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM role ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n roleName,\n cause\n );\n }\n }\n\n /**\n * Update an IAM role\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM role ${logicalId}: ${physicalId}`);\n\n const newRoleName = generateResourceName(\n (properties['RoleName'] as string | undefined) || logicalId,\n { maxLength: 64 }\n );\n\n // Check if immutable properties changed (requires replacement)\n // RoleName and Path are immutable - cannot be changed after creation\n const newPath = (properties['Path'] as string | undefined) || '/';\n const oldPath = (previousProperties['Path'] as string | undefined) || '/';\n const needsReplacement = newRoleName !== physicalId || newPath !== oldPath;\n\n if (needsReplacement) {\n const reason = newRoleName !== physicalId ? 'RoleName' : 'Path';\n this.logger.debug(\n `${reason} changed, replacing role: ${physicalId} (${reason}: ${reason === 'RoleName' ? `${physicalId} -> ${newRoleName}` : `${oldPath} -> ${newPath}`})`\n );\n\n // Create new role\n const createResult = await this.create(logicalId, resourceType, properties);\n\n // Delete old role with full cleanup (managed policies, inline policies, instance profiles)\n try {\n await this.delete(logicalId, physicalId, resourceType);\n } catch (error) {\n this.logger.warn(\n `Failed to delete old role ${physicalId} during replacement: ${String(error)}. ` +\n `The old role may be orphaned and require manual cleanup.`\n );\n }\n\n const result: ResourceUpdateResult = {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n };\n\n if (createResult.attributes) {\n result.attributes = createResult.attributes;\n }\n\n return result;\n }\n\n try {\n // Update role properties (Description, MaxSessionDuration)\n const updateParams: {\n RoleName: string;\n Description?: string;\n MaxSessionDuration?: number;\n } = {\n RoleName: physicalId,\n };\n\n if (properties['Description']) {\n updateParams.Description = properties['Description'] as string;\n }\n if (properties['MaxSessionDuration']) {\n updateParams.MaxSessionDuration = properties['MaxSessionDuration'] as number;\n }\n\n await this.iamClient.send(new UpdateRoleCommand(updateParams));\n\n // Update AssumeRolePolicyDocument if changed\n const newAssumePolicy = properties['AssumeRolePolicyDocument'];\n const oldAssumePolicy = previousProperties['AssumeRolePolicyDocument'];\n if (newAssumePolicy) {\n const newPolicyStr =\n typeof newAssumePolicy === 'string' ? newAssumePolicy : JSON.stringify(newAssumePolicy);\n const oldPolicyStr = oldAssumePolicy\n ? typeof oldAssumePolicy === 'string'\n ? oldAssumePolicy\n : JSON.stringify(oldAssumePolicy)\n : '';\n\n if (newPolicyStr !== oldPolicyStr) {\n await this.iamClient.send(\n new UpdateAssumeRolePolicyCommand({\n RoleName: physicalId,\n PolicyDocument: newPolicyStr,\n })\n );\n this.logger.debug(`Updated assume role policy for ${physicalId}`);\n }\n }\n\n // Update PermissionsBoundary\n const newBoundary = properties['PermissionsBoundary'] as string | undefined;\n const oldBoundary = previousProperties['PermissionsBoundary'] as string | undefined;\n if (newBoundary !== oldBoundary) {\n if (newBoundary) {\n await this.iamClient.send(\n new PutRolePermissionsBoundaryCommand({\n RoleName: physicalId,\n PermissionsBoundary: newBoundary,\n })\n );\n this.logger.debug(`Set permissions boundary for ${physicalId}: ${newBoundary}`);\n } else if (oldBoundary) {\n await this.iamClient.send(\n new DeleteRolePermissionsBoundaryCommand({\n RoleName: physicalId,\n })\n );\n this.logger.debug(`Removed permissions boundary from ${physicalId}`);\n }\n }\n\n // Update managed policies\n await this.updateManagedPolicies(\n physicalId,\n properties['ManagedPolicyArns'] as string[] | undefined,\n previousProperties['ManagedPolicyArns'] as string[] | undefined\n );\n\n // Update inline policies\n await this.updateInlinePolicies(\n physicalId,\n properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined,\n previousProperties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined\n );\n\n // Update tags\n await this.updateTags(\n physicalId,\n properties['Tags'] as Array<{ Key: string; Value: string }> | undefined,\n previousProperties['Tags'] as Array<{ Key: string; Value: string }> | undefined\n );\n\n this.logger.debug(`Successfully updated IAM role ${logicalId}`);\n\n // Get updated role info\n const getRoleResponse = await this.iamClient.send(\n new GetRoleCommand({ RoleName: physicalId })\n );\n\n const attributes = {\n Arn: getRoleResponse.Role?.Arn,\n RoleId: getRoleResponse.Role?.RoleId,\n };\n\n return {\n physicalId,\n wasReplaced: false,\n attributes,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM role ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an IAM role\n *\n * Before deleting, performs full cleanup:\n * 1. Detach all managed policies\n * 2. Delete all inline policies\n * 3. Remove role from all instance profiles\n * 4. Delete the role itself\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting IAM role ${logicalId}: ${physicalId}`);\n\n try {\n // Check if role exists\n try {\n await this.iamClient.send(new GetRoleCommand({ RoleName: physicalId }));\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Role ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Step 1: Detach all managed policies\n await this.detachAllManagedPolicies(physicalId);\n\n // Step 2: Delete all inline policies\n await this.deleteAllInlinePolicies(physicalId);\n\n // Step 3: Remove role from all instance profiles\n await this.removeFromAllInstanceProfiles(physicalId);\n\n // Step 4: Delete the role\n await this.iamClient.send(new DeleteRoleCommand({ RoleName: physicalId }));\n\n this.logger.debug(`Successfully deleted IAM role ${logicalId}`);\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM role ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Detach all managed policies from the role\n */\n private async detachAllManagedPolicies(roleName: string): Promise<void> {\n this.logger.debug(`Detaching all managed policies from role ${roleName}`);\n\n try {\n const attachedPolicies = await this.iamClient.send(\n new ListAttachedRolePoliciesCommand({ RoleName: roleName })\n );\n\n const policies = attachedPolicies.AttachedPolicies || [];\n if (policies.length === 0) {\n this.logger.debug(`No managed policies attached to role ${roleName}`);\n return;\n }\n\n for (const policy of policies) {\n if (policy.PolicyArn) {\n try {\n await this.iamClient.send(\n new DetachRolePolicyCommand({\n RoleName: roleName,\n PolicyArn: policy.PolicyArn,\n })\n );\n this.logger.debug(`Detached managed policy ${policy.PolicyArn} from role ${roleName}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(\n `Managed policy ${policy.PolicyArn} already detached from role ${roleName}`\n );\n } else {\n throw error;\n }\n }\n }\n }\n\n this.logger.debug(`Detached ${policies.length} managed policies from role ${roleName}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Role ${roleName} not found when detaching managed policies`);\n return;\n }\n throw error;\n }\n }\n\n /**\n * Delete all inline policies from the role\n */\n private async deleteAllInlinePolicies(roleName: string): Promise<void> {\n this.logger.debug(`Deleting all inline policies from role ${roleName}`);\n\n try {\n const inlinePolicies = await this.iamClient.send(\n new ListRolePoliciesCommand({ RoleName: roleName })\n );\n\n const policyNames = inlinePolicies.PolicyNames || [];\n if (policyNames.length === 0) {\n this.logger.debug(`No inline policies on role ${roleName}`);\n return;\n }\n\n for (const policyName of policyNames) {\n try {\n await this.iamClient.send(\n new DeleteRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from role ${roleName}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Inline policy ${policyName} already deleted from role ${roleName}`);\n } else {\n throw error;\n }\n }\n }\n\n this.logger.debug(`Deleted ${policyNames.length} inline policies from role ${roleName}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Role ${roleName} not found when deleting inline policies`);\n return;\n }\n throw error;\n }\n }\n\n /**\n * Remove the role from all instance profiles\n */\n private async removeFromAllInstanceProfiles(roleName: string): Promise<void> {\n this.logger.debug(`Removing role ${roleName} from all instance profiles`);\n\n try {\n const instanceProfiles = await this.iamClient.send(\n new ListInstanceProfilesForRoleCommand({ RoleName: roleName })\n );\n\n const profiles = instanceProfiles.InstanceProfiles || [];\n if (profiles.length === 0) {\n this.logger.debug(`No instance profiles associated with role ${roleName}`);\n return;\n }\n\n for (const profile of profiles) {\n if (profile.InstanceProfileName) {\n try {\n await this.iamClient.send(\n new RemoveRoleFromInstanceProfileCommand({\n RoleName: roleName,\n InstanceProfileName: profile.InstanceProfileName,\n })\n );\n this.logger.debug(\n `Removed role ${roleName} from instance profile ${profile.InstanceProfileName}`\n );\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(\n `Role ${roleName} already removed from instance profile ${profile.InstanceProfileName}`\n );\n } else {\n throw error;\n }\n }\n }\n }\n\n this.logger.debug(`Removed role ${roleName} from ${profiles.length} instance profiles`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Role ${roleName} not found when removing from instance profiles`);\n return;\n }\n throw error;\n }\n }\n\n /**\n * Update managed policies attached to role\n */\n private async updateManagedPolicies(\n roleName: string,\n newPolicies: string[] | undefined,\n oldPolicies: string[] | undefined\n ): Promise<void> {\n const newSet = new Set(newPolicies || []);\n const oldSet = new Set(oldPolicies || []);\n\n // Attach new policies\n for (const policyArn of newSet) {\n if (!oldSet.has(policyArn)) {\n await this.iamClient.send(\n new AttachRolePolicyCommand({\n RoleName: roleName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn}`);\n }\n }\n\n // Detach removed policies\n for (const policyArn of oldSet) {\n if (!newSet.has(policyArn)) {\n await this.iamClient.send(\n new DetachRolePolicyCommand({\n RoleName: roleName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Detached managed policy ${policyArn}`);\n }\n }\n }\n\n /**\n * Update inline policies\n */\n private async updateInlinePolicies(\n roleName: string,\n newPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined,\n oldPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined\n ): Promise<void> {\n const newMap = new Map((newPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n const oldMap = new Map((oldPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n\n // Add or update policies\n for (const [policyName, policyDoc] of newMap) {\n const policyDocument = typeof policyDoc === 'string' ? policyDoc : JSON.stringify(policyDoc);\n\n await this.iamClient.send(\n new PutRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policyName,\n PolicyDocument: policyDocument,\n })\n );\n this.logger.debug(`Updated inline policy ${policyName}`);\n }\n\n // Delete removed policies\n for (const policyName of oldMap.keys()) {\n if (!newMap.has(policyName)) {\n await this.iamClient.send(\n new DeleteRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName}`);\n }\n }\n }\n\n /**\n * Update tags on the role\n */\n private async updateTags(\n roleName: string,\n newTags: Array<{ Key: string; Value: string }> | undefined,\n oldTags: Array<{ Key: string; Value: string }> | undefined\n ): Promise<void> {\n const newTagMap = new Map((newTags || []).map((t) => [t.Key, t.Value]));\n const oldTagMap = new Map((oldTags || []).map((t) => [t.Key, t.Value]));\n\n // Find tags to remove (present in old but not in new)\n const tagsToRemove: string[] = [];\n for (const key of oldTagMap.keys()) {\n if (!newTagMap.has(key)) {\n tagsToRemove.push(key);\n }\n }\n\n // Find tags to add/update (new or changed value)\n const tagsToAdd: Array<{ Key: string; Value: string }> = [];\n for (const [key, value] of newTagMap) {\n if (oldTagMap.get(key) !== value) {\n tagsToAdd.push({ Key: key, Value: value });\n }\n }\n\n if (tagsToRemove.length > 0) {\n await this.iamClient.send(\n new UntagRoleCommand({\n RoleName: roleName,\n TagKeys: tagsToRemove,\n })\n );\n this.logger.debug(`Removed ${tagsToRemove.length} tags from role ${roleName}`);\n }\n\n if (tagsToAdd.length > 0) {\n await this.iamClient.send(\n new TagRoleCommand({\n RoleName: roleName,\n Tags: tagsToAdd,\n })\n );\n this.logger.debug(`Added/updated ${tagsToAdd.length} tags on role ${roleName}`);\n }\n }\n}\n", "import { createHash } from 'node:crypto';\n\n/**\n * Current stack name for resource name generation.\n * Set by deploy-engine before provisioning resources.\n */\nlet currentStackName: string | undefined;\n\n/**\n * Set the current stack name for resource name generation.\n */\nexport function setCurrentStackName(stackName: string): void {\n currentStackName = stackName;\n}\n\n/**\n * Options for generating a resource name.\n */\nexport interface ResourceNameOptions {\n /** Maximum length for the name (e.g., 32 for ALB/TG, 64 for IAM, 63 for S3) */\n maxLength: number;\n /** Whether to force lowercase (e.g., S3 buckets) */\n lowercase?: boolean;\n /** Allowed character regex pattern. Characters not matching will be removed.\n * Default: /[^a-zA-Z0-9-]/ (alphanumeric + hyphen) */\n allowedPattern?: RegExp;\n}\n\n/**\n * Generate a unique resource name from the logical ID.\n *\n * Generates names in CloudFormation-compatible format:\n * `{StackName}-{LogicalId}-{Hash}` (truncated to maxLength).\n *\n * @param name The raw name (from properties or logicalId fallback)\n * @param options Length and character constraints\n * @returns A sanitized, truncated name that fits the constraints\n */\nexport function generateResourceName(name: string, options: ResourceNameOptions): string {\n const { maxLength, lowercase = false, allowedPattern = /[^a-zA-Z0-9-]/g } = options;\n\n // Include stack name for uniqueness (like CloudFormation does)\n const fullName = currentStackName ? `${currentStackName}-${name}` : name;\n\n // Apply lowercase BEFORE pattern matching (so A-Z aren't removed by /[^a-z0-9.-]/)\n let sanitized = lowercase ? fullName.toLowerCase() : fullName;\n sanitized = sanitized.replace(allowedPattern, '-');\n\n // Collapse consecutive hyphens and remove leading/trailing\n sanitized = sanitized.replace(/-{2,}/g, '-').replace(/^-+|-+$/g, '');\n\n if (sanitized.length <= maxLength) {\n return sanitized;\n }\n\n // Truncate with hash suffix for uniqueness\n const hash = createHash('sha256').update(fullName).digest('hex').substring(0, 8);\n const maxPrefixLength = maxLength - hash.length - 1; // -1 for separator\n const prefix = sanitized.substring(0, maxPrefixLength).replace(/-+$/, '');\n\n return `${prefix}-${hash}`;\n}\n\n/**\n * Default name generation rules for CC API fallback.\n *\n * When an SDK provider falls back to CC API, the resource may need a\n * default name that the SDK provider would have generated. This map\n * defines the name property and generation options for each resource type.\n *\n * Format: resourceType \u2192 { nameProperty, options, postProcess? }\n */\nconst FALLBACK_NAME_RULES: Record<\n string,\n {\n nameProperty: string;\n options: ResourceNameOptions;\n }\n> = {\n 'AWS::S3::Bucket': { nameProperty: 'BucketName', options: { maxLength: 63, lowercase: true } },\n 'AWS::SQS::Queue': { nameProperty: 'QueueName', options: { maxLength: 80 } },\n 'AWS::SNS::Topic': { nameProperty: 'TopicName', options: { maxLength: 256 } },\n 'AWS::Lambda::Function': { nameProperty: 'FunctionName', options: { maxLength: 64 } },\n 'AWS::Lambda::LayerVersion': { nameProperty: 'LayerName', options: { maxLength: 64 } },\n 'AWS::IAM::Role': { nameProperty: 'RoleName', options: { maxLength: 64 } },\n 'AWS::IAM::Policy': { nameProperty: 'PolicyName', options: { maxLength: 64 } },\n 'AWS::IAM::User': { nameProperty: 'UserName', options: { maxLength: 64 } },\n 'AWS::IAM::Group': { nameProperty: 'GroupName', options: { maxLength: 128 } },\n 'AWS::IAM::InstanceProfile': {\n nameProperty: 'InstanceProfileName',\n options: { maxLength: 128 },\n },\n 'AWS::DynamoDB::Table': { nameProperty: 'TableName', options: { maxLength: 255 } },\n 'AWS::ECR::Repository': {\n nameProperty: 'RepositoryName',\n options: { maxLength: 256, lowercase: true },\n },\n 'AWS::ECS::Cluster': { nameProperty: 'ClusterName', options: { maxLength: 255 } },\n 'AWS::ECS::Service': { nameProperty: 'ServiceName', options: { maxLength: 255 } },\n 'AWS::Logs::LogGroup': { nameProperty: 'LogGroupName', options: { maxLength: 512 } },\n 'AWS::CloudWatch::Alarm': { nameProperty: 'AlarmName', options: { maxLength: 256 } },\n 'AWS::Events::Rule': { nameProperty: 'Name', options: { maxLength: 64 } },\n 'AWS::Events::EventBus': { nameProperty: 'Name', options: { maxLength: 256 } },\n 'AWS::Kinesis::Stream': { nameProperty: 'Name', options: { maxLength: 128 } },\n 'AWS::StepFunctions::StateMachine': {\n nameProperty: 'StateMachineName',\n options: { maxLength: 80 },\n },\n 'AWS::SecretsManager::Secret': {\n nameProperty: 'Name',\n options: { maxLength: 512, allowedPattern: /[^a-zA-Z0-9-/_]/g },\n },\n 'AWS::SSM::Parameter': { nameProperty: 'Name', options: { maxLength: 2048 } },\n 'AWS::Cognito::UserPool': { nameProperty: 'UserPoolName', options: { maxLength: 128 } },\n 'AWS::ElastiCache::SubnetGroup': {\n nameProperty: 'CacheSubnetGroupName',\n options: { maxLength: 255, lowercase: true },\n },\n 'AWS::ElastiCache::CacheCluster': {\n nameProperty: 'ClusterName',\n options: { maxLength: 40, lowercase: true },\n },\n 'AWS::RDS::DBSubnetGroup': {\n nameProperty: 'DBSubnetGroupName',\n options: { maxLength: 255, lowercase: true },\n },\n 'AWS::RDS::DBCluster': {\n nameProperty: 'DBClusterIdentifier',\n options: { maxLength: 63, lowercase: true },\n },\n 'AWS::RDS::DBInstance': {\n nameProperty: 'DBInstanceIdentifier',\n options: { maxLength: 63, lowercase: true },\n },\n 'AWS::ElasticLoadBalancingV2::LoadBalancer': {\n nameProperty: 'Name',\n options: { maxLength: 32 },\n },\n 'AWS::ElasticLoadBalancingV2::TargetGroup': {\n nameProperty: 'Name',\n options: { maxLength: 32 },\n },\n 'AWS::WAFv2::WebACL': { nameProperty: 'Name', options: { maxLength: 128 } },\n 'AWS::CodeBuild::Project': { nameProperty: 'Name', options: { maxLength: 255 } },\n 'AWS::S3Express::DirectoryBucket': {\n nameProperty: 'BucketName',\n options: { maxLength: 63, lowercase: true },\n },\n};\n\n/**\n * Apply default name generation for CC API fallback.\n *\n * When a resource doesn't have an explicit name property set,\n * generates the same default name that the SDK provider would have created.\n * This ensures consistent naming regardless of whether SDK or CC API handles the resource.\n *\n * @param logicalId Logical ID from the template\n * @param resourceType CloudFormation resource type\n * @param properties Resource properties (will not be mutated)\n * @returns Properties with default name applied if needed, or original properties if no rule exists\n */\nexport function applyDefaultNameForFallback(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n): Record<string, unknown> {\n const rule = FALLBACK_NAME_RULES[resourceType];\n if (!rule) return properties;\n\n // If the name property is already set, no need to generate\n if (properties[rule.nameProperty]) return properties;\n\n const generatedName = generateResourceName(logicalId, rule.options);\n\n return {\n ...properties,\n [rule.nameProperty]: generatedName,\n };\n}\n", "import {\n IAMClient,\n PutRolePolicyCommand,\n DeleteRolePolicyCommand,\n PutGroupPolicyCommand,\n DeleteGroupPolicyCommand,\n PutUserPolicyCommand,\n DeleteUserPolicyCommand,\n NoSuchEntityException,\n} from '@aws-sdk/client-iam';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS IAM Policy Provider\n *\n * Implements resource provisioning for AWS::IAM::Policy using the IAM SDK.\n * This is required because IAM Policy is not supported by Cloud Control API.\n *\n * Note: AWS::IAM::Policy in CloudFormation is an inline policy attached to roles/users/groups,\n * not a managed policy (AWS::IAM::ManagedPolicy).\n */\nexport class IAMPolicyProvider implements ResourceProvider {\n private iamClient: IAMClient;\n private logger = getLogger().child('IAMPolicyProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::IAM::Policy', new Set(['PolicyName', 'PolicyDocument', 'Roles', 'Groups', 'Users'])],\n ]);\n\n constructor() {\n // Use global AWS clients manager for better resource management\n const awsClients = getAwsClients();\n this.iamClient = awsClients.iam;\n }\n\n /**\n * Create an IAM inline policy\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM policy ${logicalId}`);\n\n const policyName =\n (properties['PolicyName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n const policyDocument = properties['PolicyDocument'];\n const roles = properties['Roles'] as string[] | undefined;\n const groups = properties['Groups'] as string[] | undefined;\n const users = properties['Users'] as string[] | undefined;\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for IAM policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n // At least one of Roles, Groups, or Users must be specified\n const hasTargets =\n (roles && roles.length > 0) || (groups && groups.length > 0) || (users && users.length > 0);\n if (!hasTargets) {\n throw new ProvisioningError(\n `At least one of Roles, Groups, or Users is required for IAM policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n // Attach policy to all roles\n // Note: AWS::IAM::Policy in CloudFormation is actually an inline policy\n if (roles) {\n for (const roleName of roles) {\n await this.iamClient.send(\n new PutRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${policyName} to role ${roleName}`);\n }\n }\n\n // Attach policy to all groups\n if (groups) {\n for (const groupName of groups) {\n await this.iamClient.send(\n new PutGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${policyName} to group ${groupName}`);\n }\n }\n\n // Attach policy to all users\n if (users) {\n for (const userName of users) {\n await this.iamClient.send(\n new PutUserPolicyCommand({\n UserName: userName,\n PolicyName: policyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${policyName} to user ${userName}`);\n }\n }\n\n this.logger.debug(`Successfully created IAM policy ${logicalId}: ${policyName}`);\n\n // For inline policies, physical ID is the policy name\n const physicalId = policyName;\n\n return {\n physicalId,\n attributes: {\n PolicyName: policyName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n policyName,\n cause\n );\n }\n }\n\n /**\n * Update an IAM inline policy\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM policy ${logicalId}: ${physicalId}`);\n\n const newPolicyName =\n (properties['PolicyName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n const newRoles = properties['Roles'] as string[] | undefined;\n const oldRoles = previousProperties['Roles'] as string[] | undefined;\n const newGroups = properties['Groups'] as string[] | undefined;\n const oldGroups = previousProperties['Groups'] as string[] | undefined;\n const newUsers = properties['Users'] as string[] | undefined;\n const oldUsers = previousProperties['Users'] as string[] | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for IAM policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n // At least one of Roles, Groups, or Users must be specified\n const hasTargets =\n (newRoles && newRoles.length > 0) ||\n (newGroups && newGroups.length > 0) ||\n (newUsers && newUsers.length > 0);\n if (!hasTargets) {\n throw new ProvisioningError(\n `At least one of Roles, Groups, or Users is required for IAM policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n // Derive old policy name from physical ID (may contain ':roleName' suffix from old format)\n const oldPolicyName = physicalId.includes(':') ? physicalId.split(':')[0] : physicalId;\n\n // \u2500\u2500 Roles \u2500\u2500\n const newRoleSet = new Set(newRoles || []);\n const oldRoleSet = new Set(oldRoles || []);\n\n // Attach/update policy on current roles\n for (const roleName of newRoleSet) {\n await this.iamClient.send(\n new PutRolePolicyCommand({\n RoleName: roleName,\n PolicyName: newPolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${newPolicyName} to role ${roleName}`);\n }\n\n // Remove policy from old roles no longer in the list\n for (const roleName of oldRoleSet) {\n if (!newRoleSet.has(roleName)) {\n try {\n await this.iamClient.send(\n new DeleteRolePolicyCommand({\n RoleName: roleName,\n PolicyName: oldPolicyName,\n })\n );\n this.logger.debug(`Removed inline policy ${oldPolicyName} from role ${roleName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n // \u2500\u2500 Groups \u2500\u2500\n const newGroupSet = new Set(newGroups || []);\n const oldGroupSet = new Set(oldGroups || []);\n\n // Attach/update policy on current groups\n for (const groupName of newGroupSet) {\n await this.iamClient.send(\n new PutGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: newPolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${newPolicyName} to group ${groupName}`);\n }\n\n // Remove policy from old groups no longer in the list\n for (const groupName of oldGroupSet) {\n if (!newGroupSet.has(groupName)) {\n try {\n await this.iamClient.send(\n new DeleteGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: oldPolicyName,\n })\n );\n this.logger.debug(`Removed inline policy ${oldPolicyName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n // \u2500\u2500 Users \u2500\u2500\n const newUserSet = new Set(newUsers || []);\n const oldUserSet = new Set(oldUsers || []);\n\n // Attach/update policy on current users\n for (const userName of newUserSet) {\n await this.iamClient.send(\n new PutUserPolicyCommand({\n UserName: userName,\n PolicyName: newPolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Attached inline policy ${newPolicyName} to user ${userName}`);\n }\n\n // Remove policy from old users no longer in the list\n for (const userName of oldUserSet) {\n if (!newUserSet.has(userName)) {\n try {\n await this.iamClient.send(\n new DeleteUserPolicyCommand({\n UserName: userName,\n PolicyName: oldPolicyName,\n })\n );\n this.logger.debug(`Removed inline policy ${oldPolicyName} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n this.logger.debug(`Successfully updated IAM policy ${logicalId}`);\n\n const newPhysicalId = newPolicyName;\n\n return {\n physicalId: newPhysicalId,\n wasReplaced: false,\n attributes: {\n PolicyName: newPolicyName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an IAM inline policy\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting IAM policy ${logicalId}: ${physicalId}`);\n\n // Physical ID is the policy name (new format) or \"policyName:roleName\" (old format)\n const policyName = physicalId.includes(':') ? physicalId.split(':')[0] : physicalId;\n\n if (!policyName) {\n this.logger.warn(`Invalid physical ID format: ${physicalId}, skipping deletion`);\n return;\n }\n\n try {\n // Get target lists from properties (state stores these)\n const roles = properties?.['Roles'] as string[] | undefined;\n const groups = properties?.['Groups'] as string[] | undefined;\n const users = properties?.['Users'] as string[] | undefined;\n\n // If no properties available, try legacy format (physicalId = \"policyName:roleName\")\n if (!roles && !groups && !users && physicalId.includes(':')) {\n const firstRole = physicalId.split(':')[1];\n if (firstRole) {\n try {\n await this.iamClient.send(\n new DeleteRolePolicyCommand({\n RoleName: firstRole,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from role ${firstRole}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n // Delete from all roles\n if (roles) {\n for (const roleName of roles) {\n try {\n await this.iamClient.send(\n new DeleteRolePolicyCommand({\n RoleName: roleName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from role ${roleName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n // Delete from all groups\n if (groups) {\n for (const groupName of groups) {\n try {\n await this.iamClient.send(\n new DeleteGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n // Delete from all users\n if (users) {\n for (const userName of users) {\n try {\n await this.iamClient.send(\n new DeleteUserPolicyCommand({\n UserName: userName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n\n this.logger.debug(`Successfully deleted IAM policy ${logicalId}`);\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n IAMClient,\n CreateInstanceProfileCommand,\n DeleteInstanceProfileCommand,\n GetInstanceProfileCommand,\n AddRoleToInstanceProfileCommand,\n RemoveRoleFromInstanceProfileCommand,\n NoSuchEntityException,\n} from '@aws-sdk/client-iam';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS IAM InstanceProfile Provider\n *\n * Implements resource provisioning for AWS::IAM::InstanceProfile using the IAM SDK.\n * This is required because IAM InstanceProfile is not supported by Cloud Control API.\n */\nexport class IAMInstanceProfileProvider implements ResourceProvider {\n private iamClient: IAMClient;\n private logger = getLogger().child('IAMInstanceProfileProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::IAM::InstanceProfile', new Set(['InstanceProfileName', 'Path', 'Roles'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.iamClient = awsClients.iam;\n }\n\n /**\n * Create an IAM instance profile\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM instance profile ${logicalId}`);\n\n const instanceProfileName = generateResourceName(\n (properties['InstanceProfileName'] as string | undefined) || logicalId,\n { maxLength: 128 }\n );\n const path = (properties['Path'] as string | undefined) || '/';\n const roles = properties['Roles'] as string[] | undefined;\n\n try {\n // Create instance profile\n const response = await this.iamClient.send(\n new CreateInstanceProfileCommand({\n InstanceProfileName: instanceProfileName,\n Path: path,\n })\n );\n\n this.logger.debug(`Created IAM instance profile: ${instanceProfileName}`);\n\n // Add roles to instance profile\n if (roles && Array.isArray(roles)) {\n for (const roleName of roles) {\n await this.iamClient.send(\n new AddRoleToInstanceProfileCommand({\n InstanceProfileName: instanceProfileName,\n RoleName: roleName,\n })\n );\n this.logger.debug(`Added role ${roleName} to instance profile ${instanceProfileName}`);\n }\n }\n\n this.logger.debug(\n `Successfully created IAM instance profile ${logicalId}: ${instanceProfileName}`\n );\n\n return {\n physicalId: instanceProfileName,\n attributes: {\n Arn: response.InstanceProfile?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM instance profile ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n instanceProfileName,\n cause\n );\n }\n }\n\n /**\n * Update an IAM instance profile\n *\n * Instance profile name and path are immutable. Only role membership can be updated.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM instance profile ${logicalId}: ${physicalId}`);\n\n const newRoles = (properties['Roles'] as string[] | undefined) || [];\n const oldRoles = (previousProperties['Roles'] as string[] | undefined) || [];\n\n try {\n // Remove old roles that are no longer in the list\n for (const roleName of oldRoles) {\n if (!newRoles.includes(roleName)) {\n try {\n await this.iamClient.send(\n new RemoveRoleFromInstanceProfileCommand({\n InstanceProfileName: physicalId,\n RoleName: roleName,\n })\n );\n this.logger.debug(`Removed role ${roleName} from instance profile ${physicalId}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n this.logger.debug(\n `Role ${roleName} already removed from instance profile ${physicalId}`\n );\n }\n }\n }\n\n // Add new roles that were not previously attached\n for (const roleName of newRoles) {\n if (!oldRoles.includes(roleName)) {\n await this.iamClient.send(\n new AddRoleToInstanceProfileCommand({\n InstanceProfileName: physicalId,\n RoleName: roleName,\n })\n );\n this.logger.debug(`Added role ${roleName} to instance profile ${physicalId}`);\n }\n }\n\n this.logger.debug(`Successfully updated IAM instance profile ${logicalId}`);\n\n // Get updated instance profile info for attributes\n const getResponse = await this.iamClient.send(\n new GetInstanceProfileCommand({ InstanceProfileName: physicalId })\n );\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: getResponse.InstanceProfile?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM instance profile ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an IAM instance profile\n *\n * Before deleting, removes all roles from the instance profile.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting IAM instance profile ${logicalId}: ${physicalId}`);\n\n try {\n // Get current instance profile to find attached roles\n let roles: string[] = [];\n try {\n const response = await this.iamClient.send(\n new GetInstanceProfileCommand({ InstanceProfileName: physicalId })\n );\n roles =\n response.InstanceProfile?.Roles?.map((r) => r.RoleName).filter(\n (name): name is string => !!name\n ) || [];\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Instance profile ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Remove all roles from instance profile\n for (const roleName of roles) {\n try {\n await this.iamClient.send(\n new RemoveRoleFromInstanceProfileCommand({\n InstanceProfileName: physicalId,\n RoleName: roleName,\n })\n );\n this.logger.debug(`Removed role ${roleName} from instance profile ${physicalId}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n\n // Delete instance profile\n await this.iamClient.send(\n new DeleteInstanceProfileCommand({ InstanceProfileName: physicalId })\n );\n\n this.logger.debug(`Successfully deleted IAM instance profile ${logicalId}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Instance profile ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM instance profile ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n IAMClient,\n CreateUserCommand,\n DeleteUserCommand,\n GetUserCommand,\n CreateGroupCommand,\n DeleteGroupCommand,\n GetGroupCommand,\n AttachGroupPolicyCommand,\n DetachGroupPolicyCommand,\n ListAttachedGroupPoliciesCommand,\n AttachUserPolicyCommand,\n DetachUserPolicyCommand,\n ListAttachedUserPoliciesCommand,\n PutUserPolicyCommand,\n DeleteUserPolicyCommand,\n ListUserPoliciesCommand,\n PutGroupPolicyCommand,\n DeleteGroupPolicyCommand,\n ListGroupPoliciesCommand,\n CreateLoginProfileCommand,\n UpdateLoginProfileCommand,\n AddUserToGroupCommand,\n RemoveUserFromGroupCommand,\n ListGroupsForUserCommand,\n DeleteLoginProfileCommand,\n ListAccessKeysCommand,\n DeleteAccessKeyCommand,\n NoSuchEntityException,\n TagUserCommand,\n PutUserPermissionsBoundaryCommand,\n DeleteUserPermissionsBoundaryCommand,\n} from '@aws-sdk/client-iam';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS IAM User / Group / UserToGroupAddition Provider\n *\n * Implements resource provisioning for:\n * - AWS::IAM::User\n * - AWS::IAM::Group\n * - AWS::IAM::UserToGroupAddition\n *\n * Uses multi-resource-type dispatch pattern.\n */\nexport class IAMUserGroupProvider implements ResourceProvider {\n private iamClient: IAMClient;\n private logger = getLogger().child('IAMUserGroupProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::IAM::User',\n new Set([\n 'UserName',\n 'Path',\n 'Tags',\n 'LoginProfile',\n 'ManagedPolicyArns',\n 'Groups',\n 'Policies',\n 'PermissionsBoundary',\n ]),\n ],\n ['AWS::IAM::Group', new Set(['GroupName', 'Path', 'ManagedPolicyArns', 'Policies'])],\n ['AWS::IAM::UserToGroupAddition', new Set(['GroupName', 'Users'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.iamClient = awsClients.iam;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::IAM::User':\n return this.createUser(logicalId, resourceType, properties);\n case 'AWS::IAM::Group':\n return this.createGroup(logicalId, resourceType, properties);\n case 'AWS::IAM::UserToGroupAddition':\n return this.createUserToGroupAddition(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::IAM::User':\n return this.updateUser(logicalId, physicalId, resourceType, properties, previousProperties);\n case 'AWS::IAM::Group':\n return this.updateGroup(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n case 'AWS::IAM::UserToGroupAddition':\n return this.updateUserToGroupAddition(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::IAM::User':\n return this.deleteUser(logicalId, physicalId, resourceType);\n case 'AWS::IAM::Group':\n return this.deleteGroup(logicalId, physicalId, resourceType);\n case 'AWS::IAM::UserToGroupAddition':\n return this.deleteUserToGroupAddition(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::IAM::User \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createUser(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM user ${logicalId}`);\n\n const userName = generateResourceName(\n (properties['UserName'] as string | undefined) || logicalId,\n { maxLength: 64 }\n );\n\n try {\n const createParams: {\n UserName: string;\n Path?: string;\n Tags?: Array<{ Key: string; Value: string }>;\n } = {\n UserName: userName,\n };\n\n if (properties['Path']) {\n createParams.Path = properties['Path'] as string;\n }\n\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && Array.isArray(tags)) {\n createParams.Tags = tags;\n }\n\n const response = await this.iamClient.send(new CreateUserCommand(createParams));\n\n // Set permissions boundary if specified\n const permissionsBoundary = properties['PermissionsBoundary'] as string | undefined;\n if (permissionsBoundary) {\n await this.iamClient.send(\n new PutUserPermissionsBoundaryCommand({\n UserName: userName,\n PermissionsBoundary: permissionsBoundary,\n })\n );\n this.logger.debug(`Set permissions boundary on user ${userName}`);\n }\n\n // Create login profile if specified\n const loginProfile = properties['LoginProfile'] as\n | { Password: string; PasswordResetRequired?: boolean }\n | undefined;\n if (loginProfile) {\n await this.iamClient.send(\n new CreateLoginProfileCommand({\n UserName: userName,\n Password: loginProfile.Password,\n PasswordResetRequired: loginProfile.PasswordResetRequired ?? false,\n })\n );\n this.logger.debug(`Created login profile for user ${userName}`);\n }\n\n // Attach managed policies if specified\n const managedPolicyArns = properties['ManagedPolicyArns'] as string[] | undefined;\n if (managedPolicyArns && Array.isArray(managedPolicyArns)) {\n for (const policyArn of managedPolicyArns) {\n await this.iamClient.send(\n new AttachUserPolicyCommand({\n UserName: userName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn} to user ${userName}`);\n }\n }\n\n // Add user to groups if specified\n const userGroups = properties['Groups'] as string[] | undefined;\n if (userGroups && Array.isArray(userGroups)) {\n for (const groupName of userGroups) {\n await this.iamClient.send(\n new AddUserToGroupCommand({\n UserName: userName,\n GroupName: groupName,\n })\n );\n this.logger.debug(`Added user ${userName} to group ${groupName}`);\n }\n }\n\n // Add inline policies if specified\n const policies = properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined;\n if (policies && Array.isArray(policies)) {\n for (const policy of policies) {\n const policyDoc =\n typeof policy.PolicyDocument === 'string'\n ? policy.PolicyDocument\n : JSON.stringify(policy.PolicyDocument);\n await this.iamClient.send(\n new PutUserPolicyCommand({\n UserName: userName,\n PolicyName: policy.PolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Added inline policy ${policy.PolicyName} to user ${userName}`);\n }\n }\n\n this.logger.debug(`Successfully created IAM user ${logicalId}: ${userName}`);\n\n return {\n physicalId: userName,\n attributes: {\n Arn: response.User?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM user ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n userName,\n cause\n );\n }\n }\n\n private async updateUser(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM user ${logicalId}: ${physicalId}`);\n\n try {\n // Update tags if specified\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && Array.isArray(tags)) {\n await this.iamClient.send(\n new TagUserCommand({\n UserName: physicalId,\n Tags: tags,\n })\n );\n this.logger.debug(`Tagged user ${physicalId}`);\n }\n\n // Update permissions boundary\n const newPermBoundary = properties['PermissionsBoundary'] as string | undefined;\n const oldPermBoundary = previousProperties['PermissionsBoundary'] as string | undefined;\n if (newPermBoundary !== oldPermBoundary) {\n if (newPermBoundary) {\n await this.iamClient.send(\n new PutUserPermissionsBoundaryCommand({\n UserName: physicalId,\n PermissionsBoundary: newPermBoundary,\n })\n );\n this.logger.debug(`Updated permissions boundary on user ${physicalId}`);\n } else if (oldPermBoundary) {\n await this.iamClient.send(\n new DeleteUserPermissionsBoundaryCommand({ UserName: physicalId })\n );\n this.logger.debug(`Removed permissions boundary from user ${physicalId}`);\n }\n }\n\n // Update login profile\n const newLoginProfile = properties['LoginProfile'] as\n | { Password: string; PasswordResetRequired?: boolean }\n | undefined;\n const oldLoginProfile = previousProperties['LoginProfile'] as\n | { Password: string; PasswordResetRequired?: boolean }\n | undefined;\n if (newLoginProfile && !oldLoginProfile) {\n await this.iamClient.send(\n new CreateLoginProfileCommand({\n UserName: physicalId,\n Password: newLoginProfile.Password,\n PasswordResetRequired: newLoginProfile.PasswordResetRequired ?? false,\n })\n );\n this.logger.debug(`Created login profile for user ${physicalId}`);\n } else if (newLoginProfile && oldLoginProfile) {\n await this.iamClient.send(\n new UpdateLoginProfileCommand({\n UserName: physicalId,\n Password: newLoginProfile.Password,\n PasswordResetRequired: newLoginProfile.PasswordResetRequired ?? false,\n })\n );\n this.logger.debug(`Updated login profile for user ${physicalId}`);\n } else if (!newLoginProfile && oldLoginProfile) {\n try {\n await this.iamClient.send(new DeleteLoginProfileCommand({ UserName: physicalId }));\n this.logger.debug(`Deleted login profile for user ${physicalId}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n\n // Update managed policies\n await this.updateUserManagedPolicies(\n physicalId,\n properties['ManagedPolicyArns'] as string[] | undefined,\n previousProperties['ManagedPolicyArns'] as string[] | undefined\n );\n\n // Update groups\n await this.updateUserGroups(\n physicalId,\n properties['Groups'] as string[] | undefined,\n previousProperties['Groups'] as string[] | undefined\n );\n\n // Update inline policies\n await this.updateUserInlinePolicies(\n physicalId,\n properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined,\n previousProperties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined\n );\n\n // Get updated user info\n const getUserResponse = await this.iamClient.send(\n new GetUserCommand({ UserName: physicalId })\n );\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: getUserResponse.User?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM user ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteUser(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting IAM user ${logicalId}: ${physicalId}`);\n\n try {\n // Check if user exists\n try {\n await this.iamClient.send(new GetUserCommand({ UserName: physicalId }));\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`User ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Step 1: Remove from all groups\n await this.removeUserFromAllGroups(physicalId);\n\n // Step 2: Detach all managed policies\n await this.detachAllUserPolicies(physicalId);\n\n // Step 3: Delete all inline policies\n await this.deleteAllUserInlinePolicies(physicalId);\n\n // Step 4: Delete login profile if exists\n try {\n await this.iamClient.send(new DeleteLoginProfileCommand({ UserName: physicalId }));\n this.logger.debug(`Deleted login profile for user ${physicalId}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n\n // Step 5: Delete all access keys\n await this.deleteAllAccessKeys(physicalId);\n\n // Step 6: Delete permissions boundary if exists\n try {\n await this.iamClient.send(\n new DeleteUserPermissionsBoundaryCommand({ UserName: physicalId })\n );\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n\n // Step 7: Delete the user\n await this.iamClient.send(new DeleteUserCommand({ UserName: physicalId }));\n\n this.logger.debug(`Successfully deleted IAM user ${logicalId}`);\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM user ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async removeUserFromAllGroups(userName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(\n new ListGroupsForUserCommand({ UserName: userName })\n );\n\n const groups = response.Groups || [];\n for (const group of groups) {\n if (group.GroupName) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n UserName: userName,\n GroupName: group.GroupName,\n })\n );\n this.logger.debug(`Removed user ${userName} from group ${group.GroupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async deleteAllAccessKeys(userName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(new ListAccessKeysCommand({ UserName: userName }));\n\n const keys = response.AccessKeyMetadata || [];\n for (const key of keys) {\n if (key.AccessKeyId) {\n await this.iamClient.send(\n new DeleteAccessKeyCommand({\n UserName: userName,\n AccessKeyId: key.AccessKeyId,\n })\n );\n this.logger.debug(`Deleted access key ${key.AccessKeyId} for user ${userName}`);\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async detachAllUserPolicies(userName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(\n new ListAttachedUserPoliciesCommand({ UserName: userName })\n );\n\n const policies = response.AttachedPolicies || [];\n for (const policy of policies) {\n if (policy.PolicyArn) {\n try {\n await this.iamClient.send(\n new DetachUserPolicyCommand({\n UserName: userName,\n PolicyArn: policy.PolicyArn,\n })\n );\n this.logger.debug(`Detached managed policy ${policy.PolicyArn} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async deleteAllUserInlinePolicies(userName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(\n new ListUserPoliciesCommand({ UserName: userName })\n );\n\n const policyNames = response.PolicyNames || [];\n for (const policyName of policyNames) {\n try {\n await this.iamClient.send(\n new DeleteUserPolicyCommand({\n UserName: userName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async updateUserManagedPolicies(\n userName: string,\n newPolicies: string[] | undefined,\n oldPolicies: string[] | undefined\n ): Promise<void> {\n const newSet = new Set(newPolicies || []);\n const oldSet = new Set(oldPolicies || []);\n\n // Attach new policies\n for (const policyArn of newSet) {\n if (!oldSet.has(policyArn)) {\n await this.iamClient.send(\n new AttachUserPolicyCommand({\n UserName: userName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn} to user ${userName}`);\n }\n }\n\n // Detach removed policies\n for (const policyArn of oldSet) {\n if (!newSet.has(policyArn)) {\n try {\n await this.iamClient.send(\n new DetachUserPolicyCommand({\n UserName: userName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Detached managed policy ${policyArn} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n }\n\n private async updateUserGroups(\n userName: string,\n newGroups: string[] | undefined,\n oldGroups: string[] | undefined\n ): Promise<void> {\n const newSet = new Set(newGroups || []);\n const oldSet = new Set(oldGroups || []);\n\n // Add to new groups\n for (const groupName of newSet) {\n if (!oldSet.has(groupName)) {\n await this.iamClient.send(\n new AddUserToGroupCommand({\n UserName: userName,\n GroupName: groupName,\n })\n );\n this.logger.debug(`Added user ${userName} to group ${groupName}`);\n }\n }\n\n // Remove from old groups\n for (const groupName of oldSet) {\n if (!newSet.has(groupName)) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n UserName: userName,\n GroupName: groupName,\n })\n );\n this.logger.debug(`Removed user ${userName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n }\n\n private async updateUserInlinePolicies(\n userName: string,\n newPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined,\n oldPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined\n ): Promise<void> {\n const newMap = new Map((newPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n const oldMap = new Map((oldPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n\n // Add or update policies\n for (const [policyName, policyDoc] of newMap) {\n const policyDocument = typeof policyDoc === 'string' ? policyDoc : JSON.stringify(policyDoc);\n await this.iamClient.send(\n new PutUserPolicyCommand({\n UserName: userName,\n PolicyName: policyName,\n PolicyDocument: policyDocument,\n })\n );\n this.logger.debug(`Updated inline policy ${policyName} on user ${userName}`);\n }\n\n // Delete removed policies\n for (const policyName of oldMap.keys()) {\n if (!newMap.has(policyName)) {\n try {\n await this.iamClient.send(\n new DeleteUserPolicyCommand({\n UserName: userName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from user ${userName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n }\n\n // \u2500\u2500\u2500 AWS::IAM::Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createGroup(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM group ${logicalId}`);\n\n const groupName = generateResourceName(\n (properties['GroupName'] as string | undefined) || logicalId,\n { maxLength: 128 }\n );\n\n try {\n const createParams: {\n GroupName: string;\n Path?: string;\n } = {\n GroupName: groupName,\n };\n\n if (properties['Path']) {\n createParams.Path = properties['Path'] as string;\n }\n\n const response = await this.iamClient.send(new CreateGroupCommand(createParams));\n\n // Attach managed policies if specified\n const managedPolicyArns = properties['ManagedPolicyArns'] as string[] | undefined;\n if (managedPolicyArns && Array.isArray(managedPolicyArns)) {\n for (const policyArn of managedPolicyArns) {\n await this.iamClient.send(\n new AttachGroupPolicyCommand({\n GroupName: groupName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn} to group ${groupName}`);\n }\n }\n\n // Add inline policies if specified\n const policies = properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined;\n if (policies && Array.isArray(policies)) {\n for (const policy of policies) {\n const policyDoc =\n typeof policy.PolicyDocument === 'string'\n ? policy.PolicyDocument\n : JSON.stringify(policy.PolicyDocument);\n await this.iamClient.send(\n new PutGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policy.PolicyName,\n PolicyDocument: policyDoc,\n })\n );\n this.logger.debug(`Added inline policy ${policy.PolicyName} to group ${groupName}`);\n }\n }\n\n this.logger.debug(`Successfully created IAM group ${logicalId}: ${groupName}`);\n\n return {\n physicalId: groupName,\n attributes: {\n Arn: response.Group?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n groupName,\n cause\n );\n }\n }\n\n private async updateGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM group ${logicalId}: ${physicalId}`);\n\n try {\n // Update managed policies\n await this.updateGroupManagedPolicies(\n physicalId,\n properties['ManagedPolicyArns'] as string[] | undefined,\n previousProperties['ManagedPolicyArns'] as string[] | undefined\n );\n\n // Update inline policies\n await this.updateGroupInlinePolicies(\n physicalId,\n properties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined,\n previousProperties['Policies'] as\n | Array<{ PolicyName: string; PolicyDocument: unknown }>\n | undefined\n );\n\n // Get updated group info\n const getGroupResponse = await this.iamClient.send(\n new GetGroupCommand({ GroupName: physicalId })\n );\n\n this.logger.debug(`Successfully updated IAM group ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: getGroupResponse.Group?.Arn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting IAM group ${logicalId}: ${physicalId}`);\n\n try {\n // Step 1: Detach all managed policies\n await this.detachAllGroupPolicies(physicalId);\n\n // Step 2: Delete all inline policies\n await this.deleteAllGroupInlinePolicies(physicalId);\n\n // Step 3: Remove all users from group\n await this.removeAllUsersFromGroup(physicalId);\n\n // Step 4: Delete the group\n await this.iamClient.send(new DeleteGroupCommand({ GroupName: physicalId }));\n\n this.logger.debug(`Successfully deleted IAM group ${logicalId}`);\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n this.logger.debug(`Group ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async detachAllGroupPolicies(groupName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(\n new ListAttachedGroupPoliciesCommand({ GroupName: groupName })\n );\n\n const policies = response.AttachedPolicies || [];\n for (const policy of policies) {\n if (policy.PolicyArn) {\n try {\n await this.iamClient.send(\n new DetachGroupPolicyCommand({\n GroupName: groupName,\n PolicyArn: policy.PolicyArn,\n })\n );\n this.logger.debug(\n `Detached managed policy ${policy.PolicyArn} from group ${groupName}`\n );\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async removeAllUsersFromGroup(groupName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(new GetGroupCommand({ GroupName: groupName }));\n\n const users = response.Users || [];\n for (const user of users) {\n if (user.UserName) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n GroupName: groupName,\n UserName: user.UserName,\n })\n );\n this.logger.debug(`Removed user ${user.UserName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async updateGroupManagedPolicies(\n groupName: string,\n newPolicies: string[] | undefined,\n oldPolicies: string[] | undefined\n ): Promise<void> {\n const newSet = new Set(newPolicies || []);\n const oldSet = new Set(oldPolicies || []);\n\n // Attach new policies\n for (const policyArn of newSet) {\n if (!oldSet.has(policyArn)) {\n await this.iamClient.send(\n new AttachGroupPolicyCommand({\n GroupName: groupName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Attached managed policy ${policyArn} to group ${groupName}`);\n }\n }\n\n // Detach removed policies\n for (const policyArn of oldSet) {\n if (!newSet.has(policyArn)) {\n await this.iamClient.send(\n new DetachGroupPolicyCommand({\n GroupName: groupName,\n PolicyArn: policyArn,\n })\n );\n this.logger.debug(`Detached managed policy ${policyArn} from group ${groupName}`);\n }\n }\n }\n\n private async deleteAllGroupInlinePolicies(groupName: string): Promise<void> {\n try {\n const response = await this.iamClient.send(\n new ListGroupPoliciesCommand({ GroupName: groupName })\n );\n\n const policyNames = response.PolicyNames || [];\n for (const policyName of policyNames) {\n try {\n await this.iamClient.send(\n new DeleteGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n } catch (error) {\n if (error instanceof NoSuchEntityException) {\n return;\n }\n throw error;\n }\n }\n\n private async updateGroupInlinePolicies(\n groupName: string,\n newPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined,\n oldPolicies: Array<{ PolicyName: string; PolicyDocument: unknown }> | undefined\n ): Promise<void> {\n const newMap = new Map((newPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n const oldMap = new Map((oldPolicies || []).map((p) => [p.PolicyName, p.PolicyDocument]));\n\n // Add or update policies\n for (const [policyName, policyDoc] of newMap) {\n const policyDocument = typeof policyDoc === 'string' ? policyDoc : JSON.stringify(policyDoc);\n await this.iamClient.send(\n new PutGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policyName,\n PolicyDocument: policyDocument,\n })\n );\n this.logger.debug(`Updated inline policy ${policyName} on group ${groupName}`);\n }\n\n // Delete removed policies\n for (const policyName of oldMap.keys()) {\n if (!newMap.has(policyName)) {\n try {\n await this.iamClient.send(\n new DeleteGroupPolicyCommand({\n GroupName: groupName,\n PolicyName: policyName,\n })\n );\n this.logger.debug(`Deleted inline policy ${policyName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n }\n\n // \u2500\u2500\u2500 AWS::IAM::UserToGroupAddition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createUserToGroupAddition(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating IAM UserToGroupAddition ${logicalId}`);\n\n const groupName = properties['GroupName'] as string;\n const users = properties['Users'] as string[];\n\n if (!groupName) {\n throw new ProvisioningError(\n `GroupName is required for ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n if (!users || !Array.isArray(users) || users.length === 0) {\n throw new ProvisioningError(`Users is required for ${logicalId}`, resourceType, logicalId);\n }\n\n try {\n for (const userName of users) {\n await this.iamClient.send(\n new AddUserToGroupCommand({\n GroupName: groupName,\n UserName: userName,\n })\n );\n this.logger.debug(`Added user ${userName} to group ${groupName}`);\n }\n\n this.logger.debug(`Successfully created IAM UserToGroupAddition ${logicalId}`);\n\n // Physical ID is the logical ID (no AWS-generated ID for this resource)\n return {\n physicalId: logicalId,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create IAM UserToGroupAddition ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateUserToGroupAddition(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating IAM UserToGroupAddition ${logicalId}`);\n\n const groupName = properties['GroupName'] as string;\n const newUsers = new Set((properties['Users'] as string[]) || []);\n const oldGroupName = previousProperties['GroupName'] as string;\n const oldUsers = new Set((previousProperties['Users'] as string[]) || []);\n\n try {\n // If group changed, remove from old group and add to new group\n if (oldGroupName && oldGroupName !== groupName) {\n for (const userName of oldUsers) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n GroupName: oldGroupName,\n UserName: userName,\n })\n );\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n for (const userName of newUsers) {\n await this.iamClient.send(\n new AddUserToGroupCommand({\n GroupName: groupName,\n UserName: userName,\n })\n );\n }\n } else {\n // Same group: add new users, remove old users\n for (const userName of newUsers) {\n if (!oldUsers.has(userName)) {\n await this.iamClient.send(\n new AddUserToGroupCommand({\n GroupName: groupName,\n UserName: userName,\n })\n );\n this.logger.debug(`Added user ${userName} to group ${groupName}`);\n }\n }\n for (const userName of oldUsers) {\n if (!newUsers.has(userName)) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n GroupName: groupName,\n UserName: userName,\n })\n );\n this.logger.debug(`Removed user ${userName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n }\n }\n\n return {\n physicalId,\n wasReplaced: false,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update IAM UserToGroupAddition ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteUserToGroupAddition(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting IAM UserToGroupAddition ${logicalId}`);\n\n if (!properties) {\n this.logger.debug(`No properties for UserToGroupAddition ${logicalId}, skipping deletion`);\n return;\n }\n\n const groupName = properties['GroupName'] as string;\n const users = properties['Users'] as string[];\n\n if (!groupName || !users) {\n this.logger.debug(`Missing GroupName or Users for ${logicalId}, skipping deletion`);\n return;\n }\n\n try {\n for (const userName of users) {\n try {\n await this.iamClient.send(\n new RemoveUserFromGroupCommand({\n GroupName: groupName,\n UserName: userName,\n })\n );\n this.logger.debug(`Removed user ${userName} from group ${groupName}`);\n } catch (error) {\n if (!(error instanceof NoSuchEntityException)) {\n throw error;\n }\n }\n }\n\n this.logger.debug(`Successfully deleted IAM UserToGroupAddition ${logicalId}`);\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete IAM UserToGroupAddition ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return */\nimport {\n S3Client,\n CreateBucketCommand,\n DeleteBucketCommand,\n PutBucketVersioningCommand,\n PutBucketTaggingCommand,\n PutBucketOwnershipControlsCommand,\n PutBucketNotificationConfigurationCommand,\n PutBucketCorsCommand,\n PutBucketLifecycleConfigurationCommand,\n PutPublicAccessBlockCommand,\n PutBucketEncryptionCommand,\n PutBucketLoggingCommand,\n PutBucketWebsiteCommand,\n PutBucketAccelerateConfigurationCommand,\n PutBucketMetricsConfigurationCommand,\n PutBucketAnalyticsConfigurationCommand,\n PutBucketIntelligentTieringConfigurationCommand,\n PutBucketInventoryConfigurationCommand,\n PutBucketReplicationCommand,\n PutObjectLockConfigurationCommand,\n NoSuchBucket,\n ListObjectVersionsCommand,\n DeleteObjectsCommand,\n type BucketLocationConstraint,\n type ObjectOwnership,\n type CORSRule,\n} from '@aws-sdk/client-s3';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS::S3::Bucket\n *\n * Uses S3 SDK directly instead of CC API for synchronous bucket creation.\n * S3's CreateBucket is synchronous - no polling needed, unlike CC API which\n * requires async polling (1s\u21921.5s\u21922.25s...) adding seconds per resource.\n */\nexport class S3BucketProvider implements ResourceProvider {\n private s3Client: S3Client;\n private logger = getLogger().child('S3BucketProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::S3::Bucket',\n new Set([\n 'BucketName',\n 'VersioningConfiguration',\n 'Tags',\n 'OwnershipControls',\n 'NotificationConfiguration',\n 'CorsConfiguration',\n 'LifecycleConfiguration',\n 'PublicAccessBlockConfiguration',\n 'BucketEncryption',\n 'LoggingConfiguration',\n 'WebsiteConfiguration',\n 'AccelerateConfiguration',\n 'MetricsConfigurations',\n 'AnalyticsConfigurations',\n 'IntelligentTieringConfigurations',\n 'InventoryConfigurations',\n 'ReplicationConfiguration',\n 'ObjectLockConfiguration',\n 'ObjectLockEnabled',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.s3Client = awsClients.s3;\n }\n\n /**\n * Get the region from the S3 client config\n */\n private async getRegion(): Promise<string> {\n const region = await this.s3Client.config.region();\n return region || 'us-east-1';\n }\n\n /**\n * Build attributes for an S3 bucket\n */\n private async buildAttributes(bucketName: string): Promise<Record<string, unknown>> {\n const region = await this.getRegion();\n return {\n Arn: `arn:aws:s3:::${bucketName}`,\n DomainName: `${bucketName}.s3.amazonaws.com`,\n RegionalDomainName: `${bucketName}.s3.${region}.amazonaws.com`,\n WebsiteURL: `http://${bucketName}.s3-website-${region}.amazonaws.com`,\n };\n }\n\n /**\n * Apply versioning configuration if specified\n */\n private async applyVersioning(\n bucketName: string,\n versioningConfig: Record<string, unknown>\n ): Promise<void> {\n const status = (versioningConfig['Status'] as string) || 'Suspended';\n await this.s3Client.send(\n new PutBucketVersioningCommand({\n Bucket: bucketName,\n VersioningConfiguration: {\n Status: status as 'Enabled' | 'Suspended',\n },\n })\n );\n this.logger.debug(`Applied versioning (${status}) to bucket ${bucketName}`);\n }\n\n /**\n * Apply tags if specified\n */\n private async applyTags(\n bucketName: string,\n tags: Array<{ Key: string; Value: string }>\n ): Promise<void> {\n await this.s3Client.send(\n new PutBucketTaggingCommand({\n Bucket: bucketName,\n Tagging: {\n TagSet: tags,\n },\n })\n );\n this.logger.debug(`Applied ${tags.length} tags to bucket ${bucketName}`);\n }\n\n /**\n * Apply CORS configuration\n *\n * CFn property: CorsConfiguration.CorsRules[]\n * SDK: PutBucketCors with CORSConfiguration.CORSRules[]\n *\n * CFn CorsRule fields map to SDK CORSRule fields:\n * - AllowedHeaders, AllowedMethods, AllowedOrigins, ExposedHeaders, MaxAge\n * SDK uses the same names except ExposedHeaders -> ExposeHeaders, MaxAge -> MaxAgeSeconds\n */\n private async applyCorsConfiguration(\n bucketName: string,\n corsConfig: { CorsRules: Array<Record<string, unknown>> }\n ): Promise<void> {\n const corsRules: CORSRule[] = corsConfig.CorsRules.map((rule) => ({\n ID: rule['Id'] as string | undefined,\n AllowedHeaders: rule['AllowedHeaders'] as string[] | undefined,\n AllowedMethods: rule['AllowedMethods'] as string[],\n AllowedOrigins: rule['AllowedOrigins'] as string[],\n ExposeHeaders: rule['ExposedHeaders'] as string[] | undefined,\n MaxAgeSeconds: rule['MaxAge'] as number | undefined,\n }));\n await this.s3Client.send(\n new PutBucketCorsCommand({\n Bucket: bucketName,\n CORSConfiguration: {\n CORSRules: corsRules,\n },\n })\n );\n this.logger.debug(`Applied CORS configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply lifecycle configuration\n *\n * CFn property: LifecycleConfiguration.Rules[]\n * SDK: PutBucketLifecycleConfiguration with LifecycleConfiguration.Rules[]\n *\n * CFn and SDK use the same structure with minor differences:\n * - CFn uses TagFilters, SDK uses Tag/Tags in Filter\n * - CFn Transition.TransitionInDays -> SDK Transition.Days\n * - CFn Transition.TransitionDate -> SDK Transition.Date\n */\n private async applyLifecycleConfiguration(\n bucketName: string,\n lifecycleConfig: { Rules: Array<Record<string, unknown>> }\n ): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rules = lifecycleConfig.Rules.map((rule): any => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sdkRule: any = {\n ID: rule['Id'] as string | undefined,\n Status: (rule['Status'] as string) || 'Enabled',\n Prefix: rule['Prefix'] as string | undefined,\n };\n\n // Expiration\n const expiration = rule['ExpirationInDays'] || rule['ExpirationDate'] || rule['Expiration'];\n if (typeof expiration === 'number') {\n sdkRule.Expiration = { Days: expiration };\n } else if (typeof expiration === 'string') {\n sdkRule.Expiration = { Date: new Date(expiration) };\n } else if (expiration && typeof expiration === 'object') {\n const exp = expiration as Record<string, unknown>;\n sdkRule.Expiration = {\n Days: exp['Days'] as number | undefined,\n Date: exp['Date'] ? new Date(exp['Date'] as string) : undefined,\n ExpiredObjectDeleteMarker: exp['ExpiredObjectDeleteMarker'] as boolean | undefined,\n };\n }\n\n // NoncurrentVersionExpiration\n const nve = rule['NoncurrentVersionExpiration'] as Record<string, unknown> | undefined;\n if (nve) {\n sdkRule.NoncurrentVersionExpiration = {\n NoncurrentDays: nve['NoncurrentDays'] as number | undefined,\n NewerNoncurrentVersions: nve['NewerNoncurrentVersions'] as number | undefined,\n };\n }\n\n // NoncurrentVersionTransitions\n const nvts = rule['NoncurrentVersionTransitions'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (nvts && Array.isArray(nvts)) {\n sdkRule.NoncurrentVersionTransitions = nvts.map((nvt: Record<string, unknown>) => ({\n NoncurrentDays: nvt['NoncurrentDays'] as number | undefined,\n StorageClass: nvt['StorageClass'] as string | undefined,\n NewerNoncurrentVersions: nvt['NewerNoncurrentVersions'] as number | undefined,\n }));\n }\n\n // Transitions\n const transitions = rule['Transitions'] as Array<Record<string, unknown>> | undefined;\n if (transitions && Array.isArray(transitions)) {\n sdkRule.Transitions = transitions.map((t: Record<string, unknown>) => ({\n Days: (t['TransitionInDays'] ?? t['Days']) as number | undefined,\n Date:\n (t['TransitionDate'] ?? t['Date'])\n ? new Date((t['TransitionDate'] ?? t['Date']) as string)\n : undefined,\n StorageClass: t['StorageClass'] as string | undefined,\n }));\n }\n\n // AbortIncompleteMultipartUpload\n const abort = rule['AbortIncompleteMultipartUpload'] as Record<string, unknown> | undefined;\n if (abort) {\n sdkRule.AbortIncompleteMultipartUpload = {\n DaysAfterInitiation: abort['DaysAfterInitiation'] as number | undefined,\n };\n }\n\n // S3 requires either Filter or Prefix on each rule.\n // If neither is specified in CFn, we must provide an empty Filter.\n // Filter (CFn uses TagFilters, ObjectSizeGreaterThan, ObjectSizeLessThan, Prefix)\n const filter = rule['Filter'] as Record<string, unknown> | undefined;\n if (filter) {\n const tagFilters = filter['TagFilters'] as\n | Array<{ Key: string; Value: string }>\n | undefined;\n const prefix = filter['Prefix'] as string | undefined;\n const sizeGt = filter['ObjectSizeGreaterThan'] as number | undefined;\n const sizeLt = filter['ObjectSizeLessThan'] as number | undefined;\n\n // If multiple conditions, use And\n const hasMultiple =\n (tagFilters && tagFilters.length > 0 ? 1 : 0) +\n (prefix !== undefined ? 1 : 0) +\n (sizeGt !== undefined ? 1 : 0) +\n (sizeLt !== undefined ? 1 : 0) >\n 1;\n\n if (hasMultiple) {\n sdkRule.Filter = {\n And: {\n Prefix: prefix,\n Tags: tagFilters,\n ObjectSizeGreaterThan: sizeGt,\n ObjectSizeLessThan: sizeLt,\n },\n };\n } else if (tagFilters && tagFilters.length > 0) {\n sdkRule.Filter = { Tag: tagFilters[0] };\n } else if (prefix !== undefined) {\n sdkRule.Filter = { Prefix: prefix };\n } else if (sizeGt !== undefined) {\n sdkRule.Filter = { ObjectSizeGreaterThan: sizeGt };\n } else if (sizeLt !== undefined) {\n sdkRule.Filter = { ObjectSizeLessThan: sizeLt };\n }\n } else if (sdkRule.Prefix === undefined) {\n // S3 requires either Filter or Prefix on each lifecycle rule.\n // When neither is specified in CFn template, provide an empty Filter.\n sdkRule.Filter = { Prefix: '' };\n }\n\n return sdkRule;\n });\n\n await this.s3Client.send(\n new PutBucketLifecycleConfigurationCommand({\n Bucket: bucketName,\n LifecycleConfiguration: { Rules: rules },\n })\n );\n this.logger.debug(`Applied lifecycle configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply public access block configuration\n *\n * CFn property: PublicAccessBlockConfiguration\n * SDK: PutPublicAccessBlock with PublicAccessBlockConfiguration\n * Field names are identical between CFn and SDK.\n */\n private async applyPublicAccessBlockConfiguration(\n bucketName: string,\n config: Record<string, unknown>\n ): Promise<void> {\n await this.s3Client.send(\n new PutPublicAccessBlockCommand({\n Bucket: bucketName,\n PublicAccessBlockConfiguration: {\n BlockPublicAcls: config['BlockPublicAcls'] as boolean | undefined,\n BlockPublicPolicy: config['BlockPublicPolicy'] as boolean | undefined,\n IgnorePublicAcls: config['IgnorePublicAcls'] as boolean | undefined,\n RestrictPublicBuckets: config['RestrictPublicBuckets'] as boolean | undefined,\n },\n })\n );\n this.logger.debug(`Applied public access block configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply bucket encryption configuration\n *\n * CFn property: BucketEncryption.ServerSideEncryptionConfiguration[]\n * SDK: PutBucketEncryption with ServerSideEncryptionConfiguration.Rules[]\n *\n * CFn ServerSideEncryptionRule fields:\n * - ServerSideEncryptionByDefault.SSEAlgorithm, KMSMasterKeyID\n * - BucketKeyEnabled\n */\n private async applyBucketEncryption(\n bucketName: string,\n encryptionConfig: { ServerSideEncryptionConfiguration: Array<Record<string, unknown>> }\n ): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rules = encryptionConfig.ServerSideEncryptionConfiguration.map((rule): any => {\n const byDefault = rule['ServerSideEncryptionByDefault'] as\n | Record<string, unknown>\n | undefined;\n return {\n ApplyServerSideEncryptionByDefault: byDefault\n ? {\n SSEAlgorithm: byDefault['SSEAlgorithm'] as string,\n KMSMasterKeyID: byDefault['KMSMasterKeyID'] as string | undefined,\n }\n : undefined,\n BucketKeyEnabled: rule['BucketKeyEnabled'] as boolean | undefined,\n };\n });\n await this.s3Client.send(\n new PutBucketEncryptionCommand({\n Bucket: bucketName,\n ServerSideEncryptionConfiguration: { Rules: rules },\n })\n );\n this.logger.debug(`Applied encryption configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply logging configuration\n *\n * CFn property: LoggingConfiguration\n * - DestinationBucketName -> SDK TargetBucket\n * - LogFilePrefix -> SDK TargetPrefix\n * SDK: PutBucketLogging with BucketLoggingStatus.LoggingEnabled\n */\n private async applyLoggingConfiguration(\n bucketName: string,\n loggingConfig: Record<string, unknown>\n ): Promise<void> {\n await this.s3Client.send(\n new PutBucketLoggingCommand({\n Bucket: bucketName,\n BucketLoggingStatus: {\n LoggingEnabled: {\n TargetBucket: loggingConfig['DestinationBucketName'] as string,\n TargetPrefix: (loggingConfig['LogFilePrefix'] as string) || '',\n },\n },\n })\n );\n this.logger.debug(`Applied logging configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply website configuration\n *\n * CFn property: WebsiteConfiguration\n * - IndexDocument -> SDK IndexDocument.Suffix\n * - ErrorDocument -> SDK ErrorDocument.Key\n * - RoutingRules -> SDK RoutingRules[]\n * - RedirectAllRequestsTo -> SDK RedirectAllRequestsTo\n * SDK: PutBucketWebsite with WebsiteConfiguration\n */\n private async applyWebsiteConfiguration(\n bucketName: string,\n websiteConfig: Record<string, unknown>\n ): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sdkConfig: any = {};\n\n const indexDoc = websiteConfig['IndexDocument'] as string | undefined;\n if (indexDoc) {\n sdkConfig['IndexDocument'] = { Suffix: indexDoc };\n }\n\n const errorDoc = websiteConfig['ErrorDocument'] as string | undefined;\n if (errorDoc) {\n sdkConfig['ErrorDocument'] = { Key: errorDoc };\n }\n\n const redirectAll = websiteConfig['RedirectAllRequestsTo'] as\n | Record<string, unknown>\n | undefined;\n if (redirectAll) {\n sdkConfig['RedirectAllRequestsTo'] = {\n HostName: redirectAll['HostName'] as string,\n Protocol: redirectAll['Protocol'] as string | undefined,\n };\n }\n\n const routingRules = websiteConfig['RoutingRules'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (routingRules && Array.isArray(routingRules)) {\n sdkConfig['RoutingRules'] = routingRules.map((rule) => {\n const condition = rule['RoutingRuleCondition'] as Record<string, unknown> | undefined;\n const redirect = rule['RedirectRule'] as Record<string, unknown> | undefined;\n return {\n Condition: condition\n ? {\n HttpErrorCodeReturnedEquals: condition['HttpErrorCodeReturnedEquals'] as\n | string\n | undefined,\n KeyPrefixEquals: condition['KeyPrefixEquals'] as string | undefined,\n }\n : undefined,\n Redirect: redirect\n ? {\n HostName: redirect['HostName'] as string | undefined,\n HttpRedirectCode: redirect['HttpRedirectCode'] as string | undefined,\n Protocol: redirect['Protocol'] as string | undefined,\n ReplaceKeyPrefixWith: redirect['ReplaceKeyPrefixWith'] as string | undefined,\n ReplaceKeyWith: redirect['ReplaceKeyWith'] as string | undefined,\n }\n : undefined,\n };\n });\n }\n\n await this.s3Client.send(\n new PutBucketWebsiteCommand({\n Bucket: bucketName,\n WebsiteConfiguration: sdkConfig,\n })\n );\n this.logger.debug(`Applied website configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply accelerate configuration\n *\n * CFn property: AccelerateConfiguration.AccelerationStatus\n * SDK: PutBucketAccelerateConfiguration with AccelerateConfiguration.Status\n */\n private async applyAccelerateConfiguration(\n bucketName: string,\n config: Record<string, unknown>\n ): Promise<void> {\n await this.s3Client.send(\n new PutBucketAccelerateConfigurationCommand({\n Bucket: bucketName,\n AccelerateConfiguration: {\n Status: config['AccelerationStatus'] as 'Enabled' | 'Suspended',\n },\n })\n );\n this.logger.debug(`Applied accelerate configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply metrics configurations\n *\n * CFn property: MetricsConfigurations[] (array of configurations)\n * SDK: PutBucketMetricsConfiguration (one per configuration, keyed by Id)\n */\n private async applyMetricsConfigurations(\n bucketName: string,\n configs: Array<Record<string, unknown>>\n ): Promise<void> {\n for (const config of configs) {\n const id = config['Id'] as string;\n const filter = config['TagFilters'] || config['Prefix'] || config['AccessPointArn'];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const metricsConfig: any = {\n Id: id,\n };\n if (config['Prefix']) {\n metricsConfig.Filter = { Prefix: config['Prefix'] as string };\n } else if (config['TagFilters']) {\n const tagFilters = config['TagFilters'] as Array<{ Key: string; Value: string }>;\n if (tagFilters.length === 1 && !config['Prefix'] && !config['AccessPointArn']) {\n metricsConfig.Filter = { Tag: tagFilters[0] };\n } else {\n metricsConfig.Filter = {\n And: {\n Prefix: config['Prefix'] as string | undefined,\n Tags: tagFilters,\n AccessPointArn: config['AccessPointArn'] as string | undefined,\n },\n };\n }\n } else if (config['AccessPointArn']) {\n metricsConfig.Filter = { AccessPointArn: config['AccessPointArn'] as string };\n } else if (filter === undefined) {\n // No filter - applies to all objects\n }\n await this.s3Client.send(\n new PutBucketMetricsConfigurationCommand({\n Bucket: bucketName,\n Id: id,\n MetricsConfiguration: metricsConfig,\n })\n );\n }\n this.logger.debug(`Applied ${configs.length} metrics configuration(s) to bucket ${bucketName}`);\n }\n\n /**\n * Apply analytics configurations\n *\n * CFn property: AnalyticsConfigurations[] (array of configurations)\n * SDK: PutBucketAnalyticsConfiguration (one per configuration, keyed by Id)\n */\n private async applyAnalyticsConfigurations(\n bucketName: string,\n configs: Array<Record<string, unknown>>\n ): Promise<void> {\n for (const config of configs) {\n const id = config['Id'] as string;\n const storageClassAnalysis = config['StorageClassAnalysis'] as\n | Record<string, unknown>\n | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const analyticsConfig: any = {\n Id: id,\n StorageClassAnalysis: {},\n };\n\n // Filter\n const prefix = config['Prefix'] as string | undefined;\n const tagFilters = config['TagFilters'] as Array<{ Key: string; Value: string }> | undefined;\n if (prefix || (tagFilters && tagFilters.length > 0)) {\n const hasMultiple = (prefix ? 1 : 0) + (tagFilters && tagFilters.length > 0 ? 1 : 0) > 1;\n if (hasMultiple) {\n analyticsConfig.Filter = { And: { Prefix: prefix, Tags: tagFilters } };\n } else if (prefix) {\n analyticsConfig.Filter = { Prefix: prefix };\n } else if (tagFilters && tagFilters.length > 0) {\n analyticsConfig.Filter = { Tag: tagFilters[0] };\n }\n }\n\n // StorageClassAnalysis.DataExport\n if (storageClassAnalysis?.['DataExport']) {\n const dataExport = storageClassAnalysis['DataExport'] as Record<string, unknown>;\n const dest = dataExport['Destination'] as Record<string, unknown> | undefined;\n const s3Dest =\n dest?.['BucketAccountId'] || dest?.['BucketArn'] || dest?.['Format']\n ? dest\n : (dest?.['S3BucketDestination'] as Record<string, unknown> | undefined);\n analyticsConfig.StorageClassAnalysis = {\n DataExport: {\n OutputSchemaVersion: (dataExport['OutputSchemaVersion'] as string) || 'V_1',\n Destination: s3Dest\n ? {\n S3BucketDestination: {\n Bucket: (s3Dest['BucketArn'] ?? s3Dest['Bucket']) as string,\n BucketAccountId: s3Dest['BucketAccountId'] as string | undefined,\n Format: (s3Dest['Format'] as string) || 'CSV',\n Prefix: s3Dest['Prefix'] as string | undefined,\n },\n }\n : undefined,\n },\n };\n }\n\n await this.s3Client.send(\n new PutBucketAnalyticsConfigurationCommand({\n Bucket: bucketName,\n Id: id,\n AnalyticsConfiguration: analyticsConfig,\n })\n );\n }\n this.logger.debug(\n `Applied ${configs.length} analytics configuration(s) to bucket ${bucketName}`\n );\n }\n\n /**\n * Apply intelligent tiering configurations\n *\n * CFn property: IntelligentTieringConfigurations[]\n * SDK: PutBucketIntelligentTieringConfiguration (one per configuration, keyed by Id)\n */\n private async applyIntelligentTieringConfigurations(\n bucketName: string,\n configs: Array<Record<string, unknown>>\n ): Promise<void> {\n for (const config of configs) {\n const id = config['Id'] as string;\n const tierings = config['Tierings'] as Array<Record<string, unknown>> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const itConfig: any = {\n Id: id,\n Status: (config['Status'] as string) || 'Enabled',\n Tierings: (tierings || []).map((t: Record<string, unknown>) => ({\n AccessTier: t['AccessTier'] as string,\n Days: t['Days'] as number,\n })),\n };\n\n // Filter\n const prefix = config['Prefix'] as string | undefined;\n const tagFilters = config['TagFilters'] as Array<{ Key: string; Value: string }> | undefined;\n if (prefix || (tagFilters && tagFilters.length > 0)) {\n const hasMultiple = (prefix ? 1 : 0) + (tagFilters && tagFilters.length > 0 ? 1 : 0) > 1;\n if (hasMultiple) {\n itConfig.Filter = { And: { Prefix: prefix, Tags: tagFilters } };\n } else if (prefix) {\n itConfig.Filter = { Prefix: prefix };\n } else if (tagFilters && tagFilters.length > 0) {\n itConfig.Filter = { Tag: tagFilters[0] };\n }\n }\n\n await this.s3Client.send(\n new PutBucketIntelligentTieringConfigurationCommand({\n Bucket: bucketName,\n Id: id,\n IntelligentTieringConfiguration: itConfig,\n })\n );\n }\n this.logger.debug(\n `Applied ${configs.length} intelligent tiering configuration(s) to bucket ${bucketName}`\n );\n }\n\n /**\n * Apply inventory configurations\n *\n * CFn property: InventoryConfigurations[]\n * SDK: PutBucketInventoryConfiguration (one per configuration, keyed by Id)\n */\n private async applyInventoryConfigurations(\n bucketName: string,\n configs: Array<Record<string, unknown>>\n ): Promise<void> {\n for (const config of configs) {\n const id = config['Id'] as string;\n const dest = config['Destination'] as Record<string, unknown> | undefined;\n const s3Dest =\n dest?.['BucketArn'] || dest?.['Format']\n ? dest\n : (dest?.['S3BucketDestination'] as Record<string, unknown> | undefined);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inventoryConfig: any = {\n Id: id,\n IsEnabled: (config['Enabled'] as boolean) ?? true,\n IncludedObjectVersions: (config['IncludedObjectVersions'] as string) || 'All',\n Schedule: {\n Frequency: (config['ScheduleFrequency'] ??\n (config['Schedule'] as Record<string, unknown> | undefined)?.['Frequency'] ??\n 'Weekly') as string,\n },\n Destination: {\n S3BucketDestination: s3Dest\n ? {\n Bucket: (s3Dest['BucketArn'] ?? s3Dest['Bucket']) as string,\n AccountId: s3Dest['BucketAccountId'] as string | undefined,\n Format: (s3Dest['Format'] as string) || 'CSV',\n Prefix: s3Dest['Prefix'] as string | undefined,\n }\n : undefined,\n },\n OptionalFields: config['OptionalFields'] as string[] | undefined,\n Filter: config['Prefix'] ? { Prefix: config['Prefix'] as string } : undefined,\n };\n\n await this.s3Client.send(\n new PutBucketInventoryConfigurationCommand({\n Bucket: bucketName,\n Id: id,\n InventoryConfiguration: inventoryConfig,\n })\n );\n }\n this.logger.debug(\n `Applied ${configs.length} inventory configuration(s) to bucket ${bucketName}`\n );\n }\n\n /**\n * Apply replication configuration\n *\n * CFn property: ReplicationConfiguration\n * - Role (IAM role ARN)\n * - Rules[] (replication rules)\n * SDK: PutBucketReplication with ReplicationConfiguration\n */\n private async applyReplicationConfiguration(\n bucketName: string,\n replConfig: Record<string, unknown>\n ): Promise<void> {\n const rules = replConfig['Rules'] as Array<Record<string, unknown>> | undefined;\n await this.s3Client.send(\n new PutBucketReplicationCommand({\n Bucket: bucketName,\n ReplicationConfiguration: {\n Role: replConfig['Role'] as string,\n Rules: (rules || []).map((rule) => {\n const dest = rule['Destination'] as Record<string, unknown>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sdkRule: any = {\n ID: rule['Id'] as string | undefined,\n Status: (rule['Status'] as string) || 'Enabled',\n Priority: rule['Priority'] as number | undefined,\n Destination: {\n Bucket: dest['Bucket'] as string,\n Account: dest['Account'] as string | undefined,\n StorageClass: dest['StorageClass'] as string | undefined,\n },\n };\n\n // Filter\n const filter = rule['Filter'] as Record<string, unknown> | undefined;\n if (filter) {\n const prefix = filter['Prefix'] as string | undefined;\n const tagFilter = filter['TagFilter'] as { Key: string; Value: string } | undefined;\n if (prefix && tagFilter) {\n sdkRule['Filter'] = { And: { Prefix: prefix, Tags: [tagFilter] } };\n } else if (prefix) {\n sdkRule['Filter'] = { Prefix: prefix };\n } else if (tagFilter) {\n sdkRule['Filter'] = { Tag: tagFilter };\n }\n } else if (rule['Prefix'] !== undefined) {\n sdkRule['Prefix'] = rule['Prefix'] as string;\n }\n\n // DeleteMarkerReplication\n if (rule['DeleteMarkerReplication']) {\n const dmr = rule['DeleteMarkerReplication'] as Record<string, unknown>;\n sdkRule['DeleteMarkerReplication'] = { Status: dmr['Status'] as string };\n }\n\n return sdkRule;\n }),\n },\n })\n );\n this.logger.debug(`Applied replication configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply object lock configuration\n *\n * CFn property: ObjectLockConfiguration\n * - ObjectLockEnabled: 'Enabled'\n * - Rule.DefaultRetention (Mode, Days, Years)\n * SDK: PutObjectLockConfiguration with ObjectLockConfiguration\n *\n * Note: ObjectLockEnabled at bucket level must be set at creation time.\n * This method only applies the rule/default retention config post-creation.\n */\n private async applyObjectLockConfiguration(\n bucketName: string,\n config: Record<string, unknown>\n ): Promise<void> {\n const rule = config['Rule'] as Record<string, unknown> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectLockConfig: any = {\n ObjectLockEnabled: 'Enabled',\n };\n if (rule) {\n const retention = rule['DefaultRetention'] as Record<string, unknown> | undefined;\n if (retention) {\n objectLockConfig.Rule = {\n DefaultRetention: {\n Mode: retention['Mode'] as string | undefined,\n Days: retention['Days'] as number | undefined,\n Years: retention['Years'] as number | undefined,\n },\n };\n }\n }\n await this.s3Client.send(\n new PutObjectLockConfigurationCommand({\n Bucket: bucketName,\n ObjectLockConfiguration: objectLockConfig,\n })\n );\n this.logger.debug(`Applied object lock configuration to bucket ${bucketName}`);\n }\n\n /**\n * Apply additional bucket configuration after creation\n */\n private async applyConfiguration(\n bucketName: string,\n properties: Record<string, unknown>\n ): Promise<void> {\n // Versioning\n const versioningConfig = properties['VersioningConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (versioningConfig) {\n await this.applyVersioning(bucketName, versioningConfig);\n }\n\n // Tags\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && Array.isArray(tags) && tags.length > 0) {\n await this.applyTags(bucketName, tags);\n }\n\n // Ownership Controls (e.g., BucketOwnerPreferred for CloudFront logs)\n const ownershipControls = properties['OwnershipControls'] as\n | { Rules: Array<{ ObjectOwnership: string }> }\n | undefined;\n if (ownershipControls?.Rules) {\n await this.s3Client.send(\n new PutBucketOwnershipControlsCommand({\n Bucket: bucketName,\n OwnershipControls: {\n Rules: ownershipControls.Rules.map((r) => ({\n ObjectOwnership: r.ObjectOwnership as ObjectOwnership,\n })),\n },\n })\n );\n this.logger.debug(`Applied ownership controls to bucket ${bucketName}`);\n }\n\n // Notification Configuration (EventBridge)\n const notifConfig = properties['NotificationConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (notifConfig?.['EventBridgeConfiguration']) {\n const ebConfig = notifConfig['EventBridgeConfiguration'] as { EventBridgeEnabled?: boolean };\n await this.s3Client.send(\n new PutBucketNotificationConfigurationCommand({\n Bucket: bucketName,\n NotificationConfiguration: {\n EventBridgeConfiguration: {\n EventBridgeEnabled: ebConfig.EventBridgeEnabled ?? true,\n },\n },\n })\n );\n this.logger.debug(`Applied EventBridge notification to bucket ${bucketName}`);\n }\n\n // CORS Configuration\n const corsConfig = properties['CorsConfiguration'] as\n | { CorsRules: Array<Record<string, unknown>> }\n | undefined;\n if (corsConfig?.CorsRules) {\n await this.applyCorsConfiguration(bucketName, corsConfig);\n }\n\n // Lifecycle Configuration\n const lifecycleConfig = properties['LifecycleConfiguration'] as\n | { Rules: Array<Record<string, unknown>> }\n | undefined;\n if (lifecycleConfig?.Rules) {\n await this.applyLifecycleConfiguration(bucketName, lifecycleConfig);\n }\n\n // Public Access Block Configuration\n const publicAccessBlock = properties['PublicAccessBlockConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (publicAccessBlock) {\n await this.applyPublicAccessBlockConfiguration(bucketName, publicAccessBlock);\n }\n\n // Bucket Encryption\n const bucketEncryption = properties['BucketEncryption'] as\n | { ServerSideEncryptionConfiguration: Array<Record<string, unknown>> }\n | undefined;\n if (bucketEncryption?.ServerSideEncryptionConfiguration) {\n await this.applyBucketEncryption(bucketName, bucketEncryption);\n }\n\n // Logging Configuration\n const loggingConfig = properties['LoggingConfiguration'] as Record<string, unknown> | undefined;\n if (loggingConfig) {\n await this.applyLoggingConfiguration(bucketName, loggingConfig);\n }\n\n // Website Configuration\n const websiteConfig = properties['WebsiteConfiguration'] as Record<string, unknown> | undefined;\n if (websiteConfig) {\n await this.applyWebsiteConfiguration(bucketName, websiteConfig);\n }\n\n // Accelerate Configuration\n const accelerateConfig = properties['AccelerateConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (accelerateConfig) {\n await this.applyAccelerateConfiguration(bucketName, accelerateConfig);\n }\n\n // Metrics Configurations\n const metricsConfigs = properties['MetricsConfigurations'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (metricsConfigs && Array.isArray(metricsConfigs) && metricsConfigs.length > 0) {\n await this.applyMetricsConfigurations(bucketName, metricsConfigs);\n }\n\n // Analytics Configurations\n const analyticsConfigs = properties['AnalyticsConfigurations'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (analyticsConfigs && Array.isArray(analyticsConfigs) && analyticsConfigs.length > 0) {\n await this.applyAnalyticsConfigurations(bucketName, analyticsConfigs);\n }\n\n // Intelligent Tiering Configurations\n const itConfigs = properties['IntelligentTieringConfigurations'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (itConfigs && Array.isArray(itConfigs) && itConfigs.length > 0) {\n await this.applyIntelligentTieringConfigurations(bucketName, itConfigs);\n }\n\n // Inventory Configurations\n const inventoryConfigs = properties['InventoryConfigurations'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (inventoryConfigs && Array.isArray(inventoryConfigs) && inventoryConfigs.length > 0) {\n await this.applyInventoryConfigurations(bucketName, inventoryConfigs);\n }\n\n // Replication Configuration\n const replConfig = properties['ReplicationConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (replConfig) {\n await this.applyReplicationConfiguration(bucketName, replConfig);\n }\n\n // Object Lock Configuration (rule/retention, not the ObjectLockEnabled flag)\n const objectLockConfig = properties['ObjectLockConfiguration'] as\n | Record<string, unknown>\n | undefined;\n if (objectLockConfig) {\n await this.applyObjectLockConfiguration(bucketName, objectLockConfig);\n }\n }\n\n /**\n * Create an S3 bucket\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 bucket ${logicalId}`);\n\n const bucketName =\n (properties['BucketName'] as string | undefined) ||\n generateResourceName(logicalId, {\n maxLength: 63,\n lowercase: true,\n allowedPattern: /[^a-z0-9.-]/g,\n });\n\n try {\n // CreateBucket params\n const createParams: {\n Bucket: string;\n CreateBucketConfiguration?: { LocationConstraint: BucketLocationConstraint };\n ObjectLockEnabledForBucket?: boolean;\n } = {\n Bucket: bucketName,\n };\n\n // Add LocationConstraint for non-us-east-1 regions\n const region = await this.getRegion();\n if (region !== 'us-east-1') {\n createParams.CreateBucketConfiguration = {\n LocationConstraint: region as BucketLocationConstraint,\n };\n }\n\n // ObjectLockEnabled must be set at bucket creation time\n if (properties['ObjectLockEnabled'] === true || properties['ObjectLockEnabled'] === 'true') {\n createParams.ObjectLockEnabledForBucket = true;\n }\n\n try {\n await this.s3Client.send(new CreateBucketCommand(createParams));\n this.logger.debug(`Created S3 bucket: ${bucketName}`);\n } catch (createError) {\n // \"BucketAlreadyOwnedByYou\" is success (idempotent create)\n if (\n createError instanceof Error &&\n (createError.name === 'BucketAlreadyOwnedByYou' ||\n createError.message.includes('you already own it'))\n ) {\n this.logger.debug(`S3 bucket ${bucketName} already exists and is owned by you`);\n } else {\n throw createError;\n }\n }\n\n // Apply additional configuration\n await this.applyConfiguration(bucketName, properties);\n\n const attributes = await this.buildAttributes(bucketName);\n\n this.logger.debug(`Successfully created S3 bucket ${logicalId}: ${bucketName}`);\n\n return {\n physicalId: bucketName,\n attributes,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n bucketName,\n cause\n );\n }\n }\n\n /**\n * Update an S3 bucket\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating S3 bucket ${logicalId}: ${physicalId}`);\n\n const newBucketName = properties['BucketName'] as string | undefined;\n\n // Bucket name is immutable - if changed, requires replacement\n if (newBucketName && newBucketName !== physicalId) {\n this.logger.debug(\n `Bucket name changed (${physicalId} -> ${newBucketName}), replacement required`\n );\n return {\n physicalId,\n wasReplaced: true,\n };\n }\n\n try {\n // Apply configuration changes\n await this.applyConfiguration(physicalId, properties);\n\n const attributes = await this.buildAttributes(physicalId);\n\n this.logger.debug(`Successfully updated S3 bucket ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update S3 bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an S3 bucket\n *\n * Note: The bucket must be empty before deletion.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting S3 bucket ${logicalId}: ${physicalId}`);\n\n try {\n await this.deleteBucketWithEmptyRetry(logicalId, physicalId);\n } catch (error) {\n if (error instanceof NoSuchBucket) {\n this.logger.debug(`Bucket ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a bucket, emptying it first if not empty.\n * Handles the race condition where objects (e.g., ALB logs) are written\n * after CustomResource cleanup but before bucket deletion.\n */\n private async deleteBucketWithEmptyRetry(logicalId: string, bucketName: string): Promise<void> {\n const maxAttempts = 3;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }));\n this.logger.debug(`Successfully deleted S3 bucket ${logicalId}`);\n return;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('not empty') || msg.includes('BucketNotEmpty')) {\n this.logger.debug(\n `Bucket ${bucketName} not empty (attempt ${attempt}/${maxAttempts}), emptying...`\n );\n await this.emptyBucket(bucketName);\n continue;\n }\n throw error;\n }\n }\n // Final attempt after emptying\n await this.s3Client.send(new DeleteBucketCommand({ Bucket: bucketName }));\n this.logger.debug(`Successfully deleted S3 bucket ${logicalId}`);\n }\n\n /**\n * Empty a bucket by deleting all object versions and delete markers.\n */\n private async emptyBucket(bucketName: string): Promise<void> {\n let keyMarker: string | undefined;\n let versionIdMarker: string | undefined;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const listResp = await this.s3Client.send(\n new ListObjectVersionsCommand({\n Bucket: bucketName,\n MaxKeys: 1000,\n ...(keyMarker && { KeyMarker: keyMarker }),\n ...(versionIdMarker && { VersionIdMarker: versionIdMarker }),\n })\n );\n\n const objects: Array<{ Key: string; VersionId: string }> = [];\n for (const v of listResp.Versions || []) {\n if (v.Key && v.VersionId) objects.push({ Key: v.Key, VersionId: v.VersionId });\n }\n for (const d of listResp.DeleteMarkers || []) {\n if (d.Key && d.VersionId) objects.push({ Key: d.Key, VersionId: d.VersionId });\n }\n\n if (objects.length > 0) {\n await this.s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: { Objects: objects, Quiet: true },\n })\n );\n this.logger.debug(`Emptied ${objects.length} objects from ${bucketName}`);\n }\n\n if (!listResp.IsTruncated) break;\n keyMarker = listResp.NextKeyMarker;\n versionIdMarker = listResp.NextVersionIdMarker;\n }\n }\n}\n", "import {\n S3Client,\n PutBucketPolicyCommand,\n DeleteBucketPolicyCommand,\n NoSuchBucket,\n} from '@aws-sdk/client-s3';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS S3 Bucket Policy Provider\n *\n * Implements resource provisioning for AWS::S3::BucketPolicy using the S3 SDK.\n * This is required because S3 Bucket Policy is not supported by Cloud Control API.\n */\nexport class S3BucketPolicyProvider implements ResourceProvider {\n private s3Client: S3Client;\n private logger = getLogger().child('S3BucketPolicyProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::S3::BucketPolicy', new Set(['Bucket', 'PolicyDocument'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.s3Client = awsClients.s3;\n }\n\n /**\n * Create an S3 bucket policy\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 bucket policy ${logicalId}`);\n\n const bucketName = properties['Bucket'] as string | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!bucketName) {\n throw new ProvisioningError(\n `Bucket is required for S3 bucket policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for S3 bucket policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n await this.s3Client.send(\n new PutBucketPolicyCommand({\n Bucket: bucketName,\n Policy: policyDoc,\n })\n );\n\n this.logger.debug(`Successfully created S3 bucket policy ${logicalId}`);\n\n // Physical ID is the bucket name\n return {\n physicalId: bucketName,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 bucket policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n bucketName,\n cause\n );\n }\n }\n\n /**\n * Update an S3 bucket policy\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating S3 bucket policy ${logicalId}: ${physicalId}`);\n\n const bucketName = properties['Bucket'] as string | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!bucketName) {\n throw new ProvisioningError(\n `Bucket is required for S3 bucket policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for S3 bucket policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n await this.s3Client.send(\n new PutBucketPolicyCommand({\n Bucket: bucketName,\n Policy: policyDoc,\n })\n );\n\n this.logger.debug(`Successfully updated S3 bucket policy ${logicalId}`);\n\n return {\n physicalId: bucketName,\n wasReplaced: false,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update S3 bucket policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an S3 bucket policy\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting S3 bucket policy ${logicalId}: ${physicalId}`);\n\n try {\n try {\n await this.s3Client.send(\n new DeleteBucketPolicyCommand({\n Bucket: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted S3 bucket policy ${logicalId}`);\n } catch (error) {\n if (error instanceof NoSuchBucket) {\n this.logger.debug(`Bucket ${physicalId} does not exist, skipping policy deletion`);\n return;\n }\n // If the policy doesn't exist, that's OK too\n if (\n error instanceof Error &&\n (error.name === 'NoSuchBucketPolicy' || error.message.includes('does not have'))\n ) {\n this.logger.debug(`Bucket policy for ${physicalId} does not exist, skipping`);\n return;\n }\n throw error;\n }\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 bucket policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n SQSClient,\n CreateQueueCommand,\n DeleteQueueCommand,\n GetQueueAttributesCommand,\n SetQueueAttributesCommand,\n QueueDoesNotExist,\n} from '@aws-sdk/client-sqs';\nimport { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * CDK property name to SQS attribute name mapping\n */\nconst CDK_TO_SQS_ATTRIBUTES: Record<string, string> = {\n VisibilityTimeout: 'VisibilityTimeout',\n MaximumMessageSize: 'MaximumMessageSize',\n MessageRetentionPeriod: 'MessageRetentionPeriod',\n DelaySeconds: 'DelaySeconds',\n ReceiveMessageWaitTimeSeconds: 'ReceiveMessageWaitTimeSeconds',\n RedrivePolicy: 'RedrivePolicy',\n FifoQueue: 'FifoQueue',\n ContentBasedDeduplication: 'ContentBasedDeduplication',\n KmsMasterKeyId: 'KmsMasterKeyId',\n KmsDataKeyReusePeriodSeconds: 'KmsDataKeyReusePeriodSeconds',\n SqsManagedSseEnabled: 'SqsManagedSseEnabled',\n DeduplicationScope: 'DeduplicationScope',\n FifoThroughputLimit: 'FifoThroughputLimit',\n};\n\n/**\n * AWS SQS Queue Provider\n *\n * Implements resource provisioning for AWS::SQS::Queue using the SQS SDK.\n * WHY: SQS CreateQueue is synchronous - the CC API adds unnecessary polling\n * overhead (1s->2s->4s->8s) for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class SQSQueueProvider implements ResourceProvider {\n private sqsClient: SQSClient;\n private stsClient: STSClient;\n private logger = getLogger().child('SQSQueueProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::SQS::Queue',\n new Set([\n 'QueueName',\n 'VisibilityTimeout',\n 'MaximumMessageSize',\n 'MessageRetentionPeriod',\n 'DelaySeconds',\n 'ReceiveMessageWaitTimeSeconds',\n 'RedrivePolicy',\n 'FifoQueue',\n 'ContentBasedDeduplication',\n 'KmsMasterKeyId',\n 'KmsDataKeyReusePeriodSeconds',\n 'SqsManagedSseEnabled',\n 'DeduplicationScope',\n 'FifoThroughputLimit',\n 'Tags',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.sqsClient = awsClients.sqs;\n this.stsClient = awsClients.sts;\n }\n\n /**\n * Create an SQS queue\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SQS queue ${logicalId}`);\n\n const queueName =\n (properties['QueueName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 80 });\n\n try {\n // Convert CDK properties to SQS attributes\n const attributes: Record<string, string> = {};\n for (const [cdkKey, sqsKey] of Object.entries(CDK_TO_SQS_ATTRIBUTES)) {\n if (properties[cdkKey] !== undefined) {\n const value = properties[cdkKey];\n // RedrivePolicy needs to be JSON string\n if (cdkKey === 'RedrivePolicy' && typeof value === 'object') {\n attributes[sqsKey] = JSON.stringify(value);\n } else {\n attributes[sqsKey] = String(value);\n }\n }\n }\n\n const tags: Record<string, string> = {};\n if (properties['Tags']) {\n const tagList = properties['Tags'] as Array<{ Key: string; Value: string }>;\n for (const tag of tagList) {\n tags[tag.Key] = tag.Value;\n }\n }\n\n const response = await this.sqsClient.send(\n new CreateQueueCommand({\n QueueName: queueName,\n ...(Object.keys(attributes).length > 0 && { Attributes: attributes }),\n ...(Object.keys(tags).length > 0 && { tags }),\n })\n );\n\n const queueUrl = response.QueueUrl;\n if (!queueUrl) {\n throw new Error('CreateQueue did not return QueueUrl');\n }\n\n this.logger.debug(`Successfully created SQS queue ${logicalId}: ${queueUrl}`);\n\n // Construct ARN from account/region/queueName\n const arn = await this.constructArn(queueName);\n\n return {\n physicalId: queueUrl,\n attributes: {\n Arn: arn,\n QueueUrl: queueUrl,\n QueueName: queueName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SQS queue ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n queueName,\n cause\n );\n }\n }\n\n /**\n * Update an SQS queue\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SQS queue ${logicalId}: ${physicalId}`);\n\n try {\n // Convert CDK properties to SQS attributes\n const attributes: Record<string, string> = {};\n for (const [cdkKey, sqsKey] of Object.entries(CDK_TO_SQS_ATTRIBUTES)) {\n // Skip immutable attributes (FifoQueue cannot be changed after creation)\n if (cdkKey === 'FifoQueue') continue;\n\n if (properties[cdkKey] !== undefined) {\n const value = properties[cdkKey];\n if (cdkKey === 'RedrivePolicy' && typeof value === 'object') {\n attributes[sqsKey] = JSON.stringify(value);\n } else {\n attributes[sqsKey] = String(value);\n }\n }\n }\n\n if (Object.keys(attributes).length > 0) {\n await this.sqsClient.send(\n new SetQueueAttributesCommand({\n QueueUrl: physicalId,\n Attributes: attributes,\n })\n );\n this.logger.debug(`Updated attributes for SQS queue ${physicalId}`);\n }\n\n // Get queue attributes for Arn\n const getResponse = await this.sqsClient.send(\n new GetQueueAttributesCommand({\n QueueUrl: physicalId,\n AttributeNames: ['QueueArn'],\n })\n );\n\n const queueName =\n (properties['QueueName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 80 });\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: getResponse.Attributes?.QueueArn,\n QueueUrl: physicalId,\n QueueName: queueName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SQS queue ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an SQS queue\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SQS queue ${logicalId}: ${physicalId}`);\n\n try {\n await this.sqsClient.send(new DeleteQueueCommand({ QueueUrl: physicalId }));\n this.logger.debug(`Successfully deleted SQS queue ${logicalId}`);\n } catch (error) {\n if (error instanceof QueueDoesNotExist) {\n this.logger.debug(`SQS queue ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SQS queue ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Construct SQS queue ARN from account/region/queue name\n */\n private async constructArn(queueName: string): Promise<string> {\n try {\n const identity = await this.stsClient.send(new GetCallerIdentityCommand({}));\n const accountId = identity.Account;\n // Get region from SQS client config\n const region = await this.sqsClient.config.region();\n return `arn:aws:sqs:${region}:${accountId}:${queueName}`;\n } catch {\n this.logger.warn('Failed to construct SQS ARN from STS, using placeholder');\n return `arn:aws:sqs:unknown:unknown:${queueName}`;\n }\n }\n}\n", "import { SQSClient, SetQueueAttributesCommand } from '@aws-sdk/client-sqs';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS SQS Queue Policy Provider\n *\n * Implements resource provisioning for AWS::SQS::QueuePolicy using the SQS SDK.\n * This is required because SQS Queue Policy is not supported by Cloud Control API.\n */\nexport class SQSQueuePolicyProvider implements ResourceProvider {\n private sqsClient: SQSClient;\n private logger = getLogger().child('SQSQueuePolicyProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::SQS::QueuePolicy', new Set(['Queues', 'PolicyDocument'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.sqsClient = awsClients.sqs;\n }\n\n /**\n * Create an SQS queue policy\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SQS queue policy ${logicalId}`);\n\n const queues = properties['Queues'] as string[] | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!queues || queues.length === 0) {\n throw new ProvisioningError(\n `Queues is required for SQS queue policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for SQS queue policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n // Apply policy to all queues\n for (const queueUrl of queues) {\n this.logger.debug(`Setting policy for queue: ${queueUrl}`);\n await this.sqsClient.send(\n new SetQueueAttributesCommand({\n QueueUrl: queueUrl,\n Attributes: {\n Policy: policyDoc,\n },\n })\n );\n }\n\n this.logger.debug(`Successfully created SQS queue policy ${logicalId}`);\n\n // Physical ID is the first queue URL\n return {\n physicalId: queues[0]!,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SQS queue policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n queues[0],\n cause\n );\n }\n }\n\n /**\n * Update an SQS queue policy\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SQS queue policy ${logicalId}: ${physicalId}`);\n\n const queues = properties['Queues'] as string[] | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!queues || queues.length === 0) {\n throw new ProvisioningError(\n `Queues is required for SQS queue policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for SQS queue policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n // Serialize policy document\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n // Apply policy to all queues\n for (const queueUrl of queues) {\n this.logger.debug(`Updating policy for queue: ${queueUrl}`);\n await this.sqsClient.send(\n new SetQueueAttributesCommand({\n QueueUrl: queueUrl,\n Attributes: {\n Policy: policyDoc,\n },\n })\n );\n }\n\n this.logger.debug(`Successfully updated SQS queue policy ${logicalId}`);\n\n return {\n physicalId: queues[0]!,\n wasReplaced: false,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SQS queue policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an SQS queue policy\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SQS queue policy ${logicalId}: ${physicalId}`);\n\n try {\n // Remove the policy by setting it to empty\n await this.sqsClient.send(\n new SetQueueAttributesCommand({\n QueueUrl: physicalId,\n Attributes: {\n Policy: '',\n },\n })\n );\n\n this.logger.debug(`Successfully deleted SQS queue policy ${logicalId}`);\n } catch (error) {\n // Check if queue doesn't exist\n if (\n error instanceof Error &&\n (error.name === 'QueueDoesNotExist' || error.message.includes('does not exist'))\n ) {\n this.logger.debug(`Queue ${physicalId} does not exist, skipping policy deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SQS queue policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n SNSClient,\n CreateTopicCommand,\n DeleteTopicCommand,\n SetTopicAttributesCommand,\n TagResourceCommand,\n UntagResourceCommand,\n NotFoundException,\n type CreateTopicCommandInput,\n type Tag,\n} from '@aws-sdk/client-sns';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS SNS Topic Provider\n *\n * Implements resource provisioning for AWS::SNS::Topic using the SNS SDK.\n * WHY: SNS CreateTopic is synchronous and idempotent - the CC API adds unnecessary\n * polling overhead (1s->2s->4s->8s) for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class SNSTopicProvider implements ResourceProvider {\n private snsClient: SNSClient;\n private logger = getLogger().child('SNSTopicProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::SNS::Topic',\n new Set([\n 'TopicName',\n 'FifoTopic',\n 'ContentBasedDeduplication',\n 'DisplayName',\n 'KmsMasterKeyId',\n 'Tags',\n 'TracingConfig',\n 'SignatureVersion',\n 'ArchivePolicy',\n 'DataProtectionPolicy',\n 'DeliveryStatusLogging',\n 'Subscription',\n 'FifoThroughputScope',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.snsClient = awsClients.sns;\n }\n\n /**\n * Create an SNS topic\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SNS topic ${logicalId}`);\n\n const topicName =\n (properties['TopicName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 256 });\n\n try {\n // Build attributes map for topic configuration\n const topicAttributes: Record<string, string> = {};\n\n if (properties['FifoTopic']) {\n topicAttributes['FifoTopic'] = String(properties['FifoTopic']);\n }\n if (properties['ContentBasedDeduplication']) {\n topicAttributes['ContentBasedDeduplication'] = String(\n properties['ContentBasedDeduplication']\n );\n }\n if (properties['DisplayName']) {\n topicAttributes['DisplayName'] = properties['DisplayName'] as string;\n }\n if (properties['KmsMasterKeyId']) {\n topicAttributes['KmsMasterKeyId'] = properties['KmsMasterKeyId'] as string;\n }\n if (properties['TracingConfig']) {\n topicAttributes['TracingConfig'] = properties['TracingConfig'] as string;\n }\n if (properties['SignatureVersion']) {\n topicAttributes['SignatureVersion'] = String(properties['SignatureVersion']);\n }\n if (properties['FifoThroughputScope']) {\n topicAttributes['FifoThroughputScope'] = properties['FifoThroughputScope'] as string;\n }\n\n // Build tags\n let tags: Tag[] | undefined;\n if (properties['Tags']) {\n tags = properties['Tags'] as Tag[];\n }\n\n const createParams: CreateTopicCommandInput = {\n Name: topicName,\n ...(Object.keys(topicAttributes).length > 0 && { Attributes: topicAttributes }),\n ...(tags && { Tags: tags }),\n };\n\n const response = await this.snsClient.send(new CreateTopicCommand(createParams));\n\n const topicArn = response.TopicArn;\n if (!topicArn) {\n throw new Error('CreateTopic did not return TopicArn');\n }\n\n // Apply ArchivePolicy (FIFO topics only, must be set after creation)\n if (properties['ArchivePolicy']) {\n const archivePolicy =\n typeof properties['ArchivePolicy'] === 'string'\n ? properties['ArchivePolicy']\n : JSON.stringify(properties['ArchivePolicy']);\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: 'ArchivePolicy',\n AttributeValue: archivePolicy,\n })\n );\n }\n\n // Apply DataProtectionPolicy\n if (properties['DataProtectionPolicy']) {\n const dataProtectionPolicy =\n typeof properties['DataProtectionPolicy'] === 'string'\n ? properties['DataProtectionPolicy']\n : JSON.stringify(properties['DataProtectionPolicy']);\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: 'DataProtectionPolicy',\n AttributeValue: dataProtectionPolicy,\n })\n );\n }\n\n // Apply DeliveryStatusLogging\n if (properties['DeliveryStatusLogging']) {\n const loggingConfigs = properties['DeliveryStatusLogging'] as Array<\n Record<string, unknown>\n >;\n for (const config of loggingConfigs) {\n const protocol = config['Protocol'] as string;\n if (config['SuccessFeedbackRoleArn']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: `${protocol}SuccessFeedbackRoleArn`,\n AttributeValue: config['SuccessFeedbackRoleArn'] as string,\n })\n );\n }\n if (config['SuccessFeedbackSampleRate']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: `${protocol}SuccessFeedbackSampleRate`,\n AttributeValue: String(config['SuccessFeedbackSampleRate']),\n })\n );\n }\n if (config['FailureFeedbackRoleArn']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: `${protocol}FailureFeedbackRoleArn`,\n AttributeValue: config['FailureFeedbackRoleArn'] as string,\n })\n );\n }\n }\n }\n\n // Note: Subscription property is handled by CloudFormation as separate resources\n // in CDK, so we don't need to create subscriptions here. The Subscription property\n // is declared in handledProperties to prevent CC API fallback.\n\n this.logger.debug(`Successfully created SNS topic ${logicalId}: ${topicArn}`);\n\n // Extract topic name from ARN (last segment after :)\n const extractedName = topicArn.split(':').pop() || topicName;\n\n return {\n physicalId: topicArn,\n attributes: {\n TopicArn: topicArn,\n TopicName: extractedName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SNS topic ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n topicName,\n cause\n );\n }\n }\n\n /**\n * Update an SNS topic\n *\n * SNS topics have limited mutable properties (DisplayName, KmsMasterKeyId, etc.).\n * TopicName is immutable and requires replacement (handled by deployment layer).\n */\n async update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SNS topic ${logicalId}: ${physicalId}`);\n\n // Update mutable topic attributes via SetTopicAttributes\n const mutableAttributes: Array<{ name: string; prop: string; serialize?: boolean }> = [\n { name: 'DisplayName', prop: 'DisplayName' },\n { name: 'KmsMasterKeyId', prop: 'KmsMasterKeyId' },\n { name: 'ContentBasedDeduplication', prop: 'ContentBasedDeduplication' },\n { name: 'TracingConfig', prop: 'TracingConfig' },\n { name: 'SignatureVersion', prop: 'SignatureVersion' },\n { name: 'FifoThroughputScope', prop: 'FifoThroughputScope' },\n { name: 'ArchivePolicy', prop: 'ArchivePolicy', serialize: true },\n { name: 'DataProtectionPolicy', prop: 'DataProtectionPolicy', serialize: true },\n ];\n\n for (const attr of mutableAttributes) {\n const newVal = properties[attr.prop];\n const oldVal = previousProperties[attr.prop];\n if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\n let value: string;\n if (newVal === undefined || newVal === null) {\n value = '';\n } else if (attr.serialize && typeof newVal !== 'string') {\n value = JSON.stringify(newVal);\n } else {\n value = String(newVal);\n }\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: physicalId,\n AttributeName: attr.name,\n AttributeValue: value,\n })\n );\n this.logger.debug(`Updated ${attr.name} for topic ${physicalId}`);\n }\n }\n\n // Update DeliveryStatusLogging if changed\n if (\n JSON.stringify(properties['DeliveryStatusLogging']) !==\n JSON.stringify(previousProperties['DeliveryStatusLogging'])\n ) {\n const loggingConfigs =\n (properties['DeliveryStatusLogging'] as Array<Record<string, unknown>>) || [];\n for (const config of loggingConfigs) {\n const protocol = config['Protocol'] as string;\n if (config['SuccessFeedbackRoleArn']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: physicalId,\n AttributeName: `${protocol}SuccessFeedbackRoleArn`,\n AttributeValue: config['SuccessFeedbackRoleArn'] as string,\n })\n );\n }\n if (config['SuccessFeedbackSampleRate']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: physicalId,\n AttributeName: `${protocol}SuccessFeedbackSampleRate`,\n AttributeValue: String(config['SuccessFeedbackSampleRate']),\n })\n );\n }\n if (config['FailureFeedbackRoleArn']) {\n await this.snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: physicalId,\n AttributeName: `${protocol}FailureFeedbackRoleArn`,\n AttributeValue: config['FailureFeedbackRoleArn'] as string,\n })\n );\n }\n }\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Tag[] | undefined;\n const oldTags = previousProperties['Tags'] as Tag[] | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n const oldTagKeys = oldTags.map((t) => t.Key).filter((k): k is string => !!k);\n if (oldTagKeys.length > 0) {\n await this.snsClient.send(\n new UntagResourceCommand({\n ResourceArn: physicalId,\n TagKeys: oldTagKeys,\n })\n );\n }\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n await this.snsClient.send(\n new TagResourceCommand({\n ResourceArn: physicalId,\n Tags: newTags,\n })\n );\n }\n this.logger.debug(`Updated tags for topic ${physicalId}`);\n }\n\n const topicName = physicalId.split(':').pop() || logicalId;\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n TopicArn: physicalId,\n TopicName: topicName,\n },\n };\n }\n\n /**\n * Delete an SNS topic\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SNS topic ${logicalId}: ${physicalId}`);\n\n try {\n await this.snsClient.send(new DeleteTopicCommand({ TopicArn: physicalId }));\n this.logger.debug(`Successfully deleted SNS topic ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`SNS topic ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SNS topic ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n SNSClient,\n SubscribeCommand,\n UnsubscribeCommand,\n NotFoundException,\n} from '@aws-sdk/client-sns';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS SNS Subscription Provider\n *\n * Implements resource provisioning for AWS::SNS::Subscription using the SNS SDK.\n * This is required because SNS Subscription is not supported by Cloud Control API.\n */\nexport class SNSSubscriptionProvider implements ResourceProvider {\n private snsClient: SNSClient;\n private logger = getLogger().child('SNSSubscriptionProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::SNS::Subscription', new Set(['TopicArn', 'Protocol', 'Endpoint', 'FilterPolicy'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.snsClient = awsClients.sns;\n }\n\n /**\n * Create an SNS subscription\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SNS subscription ${logicalId}`);\n\n const topicArn = properties['TopicArn'] as string | undefined;\n const protocol = properties['Protocol'] as string | undefined;\n const endpoint = properties['Endpoint'] as string | undefined;\n\n if (!topicArn) {\n throw new ProvisioningError(\n `TopicArn is required for SNS subscription ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!protocol) {\n throw new ProvisioningError(\n `Protocol is required for SNS subscription ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!endpoint) {\n throw new ProvisioningError(\n `Endpoint is required for SNS subscription ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const attributes: Record<string, string> = {};\n\n // Set FilterPolicy if provided\n const filterPolicy = properties['FilterPolicy'];\n if (filterPolicy) {\n attributes['FilterPolicy'] =\n typeof filterPolicy === 'string' ? filterPolicy : JSON.stringify(filterPolicy);\n }\n\n const response = await this.snsClient.send(\n new SubscribeCommand({\n TopicArn: topicArn,\n Protocol: protocol,\n Endpoint: endpoint,\n ReturnSubscriptionArn: true,\n ...(Object.keys(attributes).length > 0 && { Attributes: attributes }),\n })\n );\n\n const subscriptionArn = response.SubscriptionArn || `${topicArn}:${logicalId}`;\n\n this.logger.debug(`Successfully created SNS subscription ${logicalId}: ${subscriptionArn}`);\n\n return {\n physicalId: subscriptionArn,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SNS subscription ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an SNS subscription\n *\n * SNS subscriptions are immutable for TopicArn/Protocol/Endpoint changes.\n * For simplicity, we replace the subscription on any update.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SNS subscription ${logicalId}: ${physicalId}`);\n\n // Delete old subscription\n try {\n await this.delete(logicalId, physicalId, resourceType);\n } catch (error) {\n this.logger.warn(\n `Failed to delete old subscription ${physicalId} during update: ${String(error)}`\n );\n }\n\n // Create new subscription\n const createResult = await this.create(logicalId, resourceType, properties);\n\n return {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n attributes: createResult.attributes ?? {},\n };\n }\n\n /**\n * Delete an SNS subscription\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SNS subscription ${logicalId}: ${physicalId}`);\n\n try {\n await this.snsClient.send(\n new UnsubscribeCommand({\n SubscriptionArn: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted SNS subscription ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`Subscription ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SNS subscription ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import { SetTopicAttributesCommand } from '@aws-sdk/client-sns';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS SNS Topic Policy Provider\n *\n * Implements resource provisioning for AWS::SNS::TopicPolicy using the SNS SDK.\n * This is required because SNS TopicPolicy is not supported by Cloud Control API.\n *\n * SNS TopicPolicy applies a policy document to one or more SNS topics via\n * SetTopicAttributes with AttributeName='Policy'.\n */\nexport class SNSTopicPolicyProvider implements ResourceProvider {\n private logger = getLogger().child('SNSTopicPolicyProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::SNS::TopicPolicy', new Set(['Topics', 'PolicyDocument'])],\n ]);\n\n /**\n * Create an SNS topic policy\n *\n * Applies the PolicyDocument to each topic in the Topics array.\n * Physical ID is a comma-separated list of topic ARNs.\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SNS topic policy ${logicalId}`);\n\n const topics = properties['Topics'] as string[] | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!topics || topics.length === 0) {\n throw new ProvisioningError(\n `Topics is required for SNS topic policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for SNS topic policy ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n try {\n for (const topicArn of topics) {\n await this.setTopicPolicy(topicArn, policyDoc);\n }\n\n this.logger.debug(`Successfully created SNS topic policy ${logicalId}`);\n\n // Physical ID is the comma-separated list of topic ARNs\n const physicalId = topics.join(',');\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SNS topic policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an SNS topic policy\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SNS topic policy ${logicalId}: ${physicalId}`);\n\n const topics = properties['Topics'] as string[] | undefined;\n const policyDocument = properties['PolicyDocument'];\n\n if (!topics || topics.length === 0) {\n throw new ProvisioningError(\n `Topics is required for SNS topic policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n if (!policyDocument) {\n throw new ProvisioningError(\n `PolicyDocument is required for SNS topic policy ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const policyDoc =\n typeof policyDocument === 'string' ? policyDocument : JSON.stringify(policyDocument);\n\n try {\n for (const topicArn of topics) {\n await this.setTopicPolicy(topicArn, policyDoc);\n }\n\n this.logger.debug(`Successfully updated SNS topic policy ${logicalId}`);\n\n const newPhysicalId = topics.join(',');\n\n return {\n physicalId: newPhysicalId,\n wasReplaced: false,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SNS topic policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an SNS topic policy\n *\n * Removes the policy from each topic by setting an empty policy.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SNS topic policy ${logicalId}: ${physicalId}`);\n\n const topicArns = physicalId.split(',');\n\n for (const topicArn of topicArns) {\n try {\n await this.setTopicPolicy(topicArn, '');\n this.logger.debug(`Removed policy from topic ${topicArn}`);\n } catch (error) {\n // If the topic doesn't exist or policy is already empty, skip it\n if (\n error instanceof Error &&\n (error.name === 'NotFoundException' ||\n error.name === 'NotFound' ||\n error.message.includes('not found') ||\n error.message.includes('does not exist') ||\n error.message.includes('Invalid parameter'))\n ) {\n this.logger.debug(`Topic ${topicArn} not found or policy already removed, skipping`);\n continue;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SNS topic policy ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n this.logger.debug(`Successfully deleted SNS topic policy ${logicalId}`);\n }\n\n /**\n * Set the policy on a single SNS topic\n */\n private async setTopicPolicy(topicArn: string, policyDoc: string): Promise<void> {\n const snsClient = getAwsClients().sns;\n await snsClient.send(\n new SetTopicAttributesCommand({\n TopicArn: topicArn,\n AttributeName: 'Policy',\n AttributeValue: policyDoc,\n })\n );\n }\n}\n", "import * as zlib from 'node:zlib';\nimport {\n LambdaClient,\n CreateFunctionCommand,\n UpdateFunctionConfigurationCommand,\n UpdateFunctionCodeCommand,\n DeleteFunctionCommand,\n GetFunctionCommand,\n ResourceNotFoundException,\n type FunctionCode,\n type CreateFunctionCommandInput,\n type UpdateFunctionConfigurationCommandInput,\n type UpdateFunctionCodeCommandInput,\n type Runtime,\n type Architecture,\n type TracingConfig,\n type EphemeralStorage,\n} from '@aws-sdk/client-lambda';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Lambda Function Provider\n *\n * Implements resource provisioning for AWS::Lambda::Function using the Lambda SDK.\n * WHY: Lambda CreateFunction is synchronous - the CC API adds unnecessary polling\n * overhead (1s->2s->4s->8s) for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class LambdaFunctionProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private logger = getLogger().child('LambdaFunctionProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Lambda::Function',\n new Set([\n 'FunctionName',\n 'Code',\n 'Role',\n 'Tags',\n 'Handler',\n 'Runtime',\n 'Timeout',\n 'MemorySize',\n 'Description',\n 'Environment',\n 'Layers',\n 'Architectures',\n 'PackageType',\n 'TracingConfig',\n 'EphemeralStorage',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n }\n\n /**\n * Create a Lambda function\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Lambda function ${logicalId}`);\n\n const functionName =\n (properties['FunctionName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n const code = properties['Code'] as Record<string, unknown> | undefined;\n const role = properties['Role'] as string | undefined;\n\n if (!code) {\n throw new ProvisioningError(\n `Code is required for Lambda function ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!role) {\n throw new ProvisioningError(\n `Role is required for Lambda function ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Build tags map from CDK tag format [{Key, Value}]\n let tags: Record<string, string> | undefined;\n if (properties['Tags']) {\n const tagList = properties['Tags'] as Array<{ Key: string; Value: string }>;\n tags = {};\n for (const tag of tagList) {\n tags[tag.Key] = tag.Value;\n }\n }\n\n const createParams: CreateFunctionCommandInput = {\n FunctionName: functionName,\n Role: role,\n Code: this.buildCode(code),\n Handler: properties['Handler'] as string | undefined,\n Runtime: properties['Runtime'] as Runtime | undefined,\n Timeout: properties['Timeout'] as number | undefined,\n MemorySize: properties['MemorySize'] as number | undefined,\n Description: properties['Description'] as string | undefined,\n Environment: properties['Environment'] as\n | { Variables?: Record<string, string> }\n | undefined,\n Layers: properties['Layers'] as string[] | undefined,\n Architectures: properties['Architectures'] as Architecture[] | undefined,\n PackageType: properties['PackageType'] as 'Zip' | 'Image' | undefined,\n TracingConfig: properties['TracingConfig'] as TracingConfig | undefined,\n EphemeralStorage: properties['EphemeralStorage'] as EphemeralStorage | undefined,\n Tags: tags,\n };\n\n const response = await this.lambdaClient.send(new CreateFunctionCommand(createParams));\n\n this.logger.debug(`Successfully created Lambda function ${logicalId}: ${functionName}`);\n\n return {\n physicalId: response.FunctionName || functionName,\n attributes: {\n Arn: response.FunctionArn,\n FunctionName: response.FunctionName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Lambda function ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n functionName,\n cause\n );\n }\n }\n\n /**\n * Update a Lambda function\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Lambda function ${logicalId}: ${physicalId}`);\n\n try {\n // Check for configuration changes\n const configFields = [\n 'Role',\n 'Handler',\n 'Runtime',\n 'Timeout',\n 'MemorySize',\n 'Description',\n 'Environment',\n 'Layers',\n 'TracingConfig',\n 'EphemeralStorage',\n ];\n\n let hasConfigChanges = false;\n for (const field of configFields) {\n if (JSON.stringify(properties[field]) !== JSON.stringify(previousProperties[field])) {\n hasConfigChanges = true;\n break;\n }\n }\n\n if (hasConfigChanges) {\n const configParams: UpdateFunctionConfigurationCommandInput = {\n FunctionName: physicalId,\n Role: properties['Role'] as string | undefined,\n Handler: properties['Handler'] as string | undefined,\n Runtime: properties['Runtime'] as Runtime | undefined,\n Timeout: properties['Timeout'] as number | undefined,\n MemorySize: properties['MemorySize'] as number | undefined,\n Description: properties['Description'] as string | undefined,\n Environment: properties['Environment'] as\n | { Variables?: Record<string, string> }\n | undefined,\n Layers: properties['Layers'] as string[] | undefined,\n TracingConfig: properties['TracingConfig'] as TracingConfig | undefined,\n EphemeralStorage: properties['EphemeralStorage'] as EphemeralStorage | undefined,\n };\n\n await this.lambdaClient.send(new UpdateFunctionConfigurationCommand(configParams));\n this.logger.debug(`Updated configuration for Lambda function ${physicalId}`);\n }\n\n // Update function code if changed\n const newCode = properties['Code'] as Record<string, unknown> | undefined;\n const oldCode = previousProperties['Code'] as Record<string, unknown> | undefined;\n\n if (newCode && JSON.stringify(newCode) !== JSON.stringify(oldCode)) {\n const builtCode = this.buildCode(newCode);\n const codeParams: UpdateFunctionCodeCommandInput = {\n FunctionName: physicalId,\n S3Bucket: builtCode.S3Bucket,\n S3Key: builtCode.S3Key,\n S3ObjectVersion: builtCode.S3ObjectVersion,\n ZipFile: builtCode.ZipFile,\n ImageUri: builtCode.ImageUri,\n };\n\n await this.lambdaClient.send(new UpdateFunctionCodeCommand(codeParams));\n this.logger.debug(`Updated code for Lambda function ${physicalId}`);\n }\n\n // Get updated function info for attributes\n const getResponse = await this.lambdaClient.send(\n new GetFunctionCommand({ FunctionName: physicalId })\n );\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: getResponse.Configuration?.FunctionArn,\n FunctionName: getResponse.Configuration?.FunctionName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Lambda function ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Lambda function\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Lambda function ${logicalId}: ${physicalId}`);\n\n try {\n await this.lambdaClient.send(new DeleteFunctionCommand({ FunctionName: physicalId }));\n this.logger.debug(`Successfully deleted Lambda function ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Lambda function ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Lambda function ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Build Lambda Code parameter from CDK properties\n */\n private buildCode(code: Record<string, unknown>): FunctionCode {\n const result: FunctionCode = {};\n\n if (code['S3Bucket']) {\n result.S3Bucket = code['S3Bucket'] as string;\n }\n if (code['S3Key']) {\n result.S3Key = code['S3Key'] as string;\n }\n if (code['S3ObjectVersion']) {\n result.S3ObjectVersion = code['S3ObjectVersion'] as string;\n }\n if (code['ZipFile']) {\n // Lambda SDK expects a zip binary, not raw text.\n // CloudFormation's ZipFile property auto-zips inline code, but SDK does not.\n // Create a minimal zip with the code as index.* file.\n result.ZipFile = this.createZipFromInlineCode(code['ZipFile'] as string);\n }\n if (code['ImageUri']) {\n result.ImageUri = code['ImageUri'] as string;\n }\n\n return result;\n }\n\n /**\n * Create a zip file from inline code text.\n *\n * CloudFormation's ZipFile property automatically wraps inline code in a zip,\n * but the Lambda SDK expects actual zip binary. This creates a minimal zip\n * containing the code as index.* (matching the Handler).\n */\n private createZipFromInlineCode(code: string): Uint8Array {\n const fileData = Buffer.from(code, 'utf-8');\n const crc32 = this.crc32(fileData);\n const compressedData = zlib.deflateRawSync(fileData);\n\n // Determine filename from handler or default to index.py\n const fileName = Buffer.from('index.py');\n const now = new Date();\n const modTime =\n ((now.getHours() << 11) | (now.getMinutes() << 5) | (now.getSeconds() >> 1)) & 0xffff;\n const modDate =\n (((now.getFullYear() - 1980) << 9) | ((now.getMonth() + 1) << 5) | now.getDate()) & 0xffff;\n\n // Local file header\n const localHeader = Buffer.alloc(30 + fileName.length);\n localHeader.writeUInt32LE(0x04034b50, 0); // signature\n localHeader.writeUInt16LE(20, 4); // version needed\n localHeader.writeUInt16LE(0, 6); // flags\n localHeader.writeUInt16LE(8, 8); // compression: deflate\n localHeader.writeUInt16LE(modTime, 10);\n localHeader.writeUInt16LE(modDate, 12);\n localHeader.writeUInt32LE(crc32, 14);\n localHeader.writeUInt32LE(compressedData.length, 18);\n localHeader.writeUInt32LE(fileData.length, 22);\n localHeader.writeUInt16LE(fileName.length, 26);\n localHeader.writeUInt16LE(0, 28); // extra field length\n fileName.copy(localHeader, 30);\n\n // Central directory\n const centralDir = Buffer.alloc(46 + fileName.length);\n centralDir.writeUInt32LE(0x02014b50, 0);\n centralDir.writeUInt16LE(20, 4);\n centralDir.writeUInt16LE(20, 6);\n centralDir.writeUInt16LE(0, 8);\n centralDir.writeUInt16LE(8, 10);\n centralDir.writeUInt16LE(modTime, 12);\n centralDir.writeUInt16LE(modDate, 14);\n centralDir.writeUInt32LE(crc32, 16);\n centralDir.writeUInt32LE(compressedData.length, 20);\n centralDir.writeUInt32LE(fileData.length, 24);\n centralDir.writeUInt16LE(fileName.length, 28);\n centralDir.writeUInt32LE(0, 42); // offset to local header\n fileName.copy(centralDir, 46);\n\n // End of central directory\n const endRecord = Buffer.alloc(22);\n const cdOffset = localHeader.length + compressedData.length;\n const cdSize = centralDir.length;\n endRecord.writeUInt32LE(0x06054b50, 0);\n endRecord.writeUInt16LE(1, 8); // entries on disk\n endRecord.writeUInt16LE(1, 10); // total entries\n endRecord.writeUInt32LE(cdSize, 12);\n endRecord.writeUInt32LE(cdOffset, 16);\n\n return Buffer.concat([localHeader, compressedData, centralDir, endRecord]);\n }\n\n private crc32(data: Buffer): number {\n let crc = 0xffffffff;\n for (const byte of data) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);\n }\n }\n return (crc ^ 0xffffffff) >>> 0;\n }\n}\n", "import {\n LambdaClient,\n AddPermissionCommand,\n RemovePermissionCommand,\n ResourceNotFoundException,\n type FunctionUrlAuthType,\n} from '@aws-sdk/client-lambda';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Lambda Permission Provider\n *\n * Implements resource provisioning for AWS::Lambda::Permission using the Lambda SDK.\n * WHY: AddPermission is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n */\nexport class LambdaPermissionProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private logger = getLogger().child('LambdaPermissionProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Lambda::Permission',\n new Set([\n 'FunctionName',\n 'Action',\n 'Principal',\n 'SourceArn',\n 'SourceAccount',\n 'PrincipalOrgID',\n 'EventSourceToken',\n 'FunctionUrlAuthType',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n }\n\n /**\n * Create a Lambda permission\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Lambda permission ${logicalId}`);\n\n const functionName = properties['FunctionName'] as string;\n if (!functionName) {\n throw new ProvisioningError(\n `FunctionName is required for Lambda permission ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const action = properties['Action'] as string;\n if (!action) {\n throw new ProvisioningError(\n `Action is required for Lambda permission ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const principal = properties['Principal'] as string;\n if (!principal) {\n throw new ProvisioningError(\n `Principal is required for Lambda permission ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n // Generate a unique StatementId from the logicalId (max 100 chars)\n let statementId = logicalId.replace(/[^a-zA-Z0-9_-]/g, '');\n if (statementId.length > 100) {\n // Simple hash: sum char codes and convert to hex\n let hashNum = 0;\n for (let i = 0; i < logicalId.length; i++) {\n hashNum = ((hashNum << 5) - hashNum + logicalId.charCodeAt(i)) | 0;\n }\n const hash = Math.abs(hashNum).toString(16).padStart(8, '0').substring(0, 8);\n statementId = `${statementId.substring(0, 91)}-${hash}`;\n }\n\n try {\n const addParams: import('@aws-sdk/client-lambda').AddPermissionCommandInput = {\n FunctionName: functionName,\n StatementId: statementId,\n Action: action,\n Principal: principal,\n };\n if (properties['SourceArn']) addParams.SourceArn = properties['SourceArn'] as string;\n if (properties['SourceAccount'])\n addParams.SourceAccount = properties['SourceAccount'] as string;\n if (properties['PrincipalOrgID'])\n addParams.PrincipalOrgID = properties['PrincipalOrgID'] as string;\n if (properties['EventSourceToken'])\n addParams.EventSourceToken = properties['EventSourceToken'] as string;\n if (properties['FunctionUrlAuthType'])\n addParams.FunctionUrlAuthType = properties['FunctionUrlAuthType'] as FunctionUrlAuthType;\n\n await this.lambdaClient.send(new AddPermissionCommand(addParams));\n\n this.logger.debug(`Successfully created Lambda permission ${logicalId}: ${statementId}`);\n\n return {\n physicalId: statementId,\n attributes: {\n Id: statementId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Lambda permission ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n statementId,\n cause\n );\n }\n }\n\n /**\n * Update a Lambda permission\n *\n * Lambda permissions cannot be updated in-place. Remove old and add new.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Lambda permission ${logicalId}: ${physicalId}`);\n\n try {\n // Remove old permission\n const oldFunctionName =\n (previousProperties['FunctionName'] as string) || (properties['FunctionName'] as string);\n\n // physicalId may be in \"functionArn|statementId\" format (from CC API)\n const oldStatementId = physicalId.includes('|') ? physicalId.split('|').pop()! : physicalId;\n\n try {\n await this.lambdaClient.send(\n new RemovePermissionCommand({\n FunctionName: oldFunctionName,\n StatementId: oldStatementId,\n })\n );\n } catch (error) {\n if (!(error instanceof ResourceNotFoundException)) {\n throw error;\n }\n this.logger.debug(`Old permission ${oldStatementId} not found, continuing with add`);\n }\n\n // Add new permission\n const createResult = await this.create(logicalId, resourceType, properties);\n\n return {\n physicalId: createResult.physicalId,\n wasReplaced: false,\n attributes: createResult.attributes ?? {},\n };\n } catch (error) {\n if (error instanceof ProvisioningError) {\n throw error;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Lambda permission ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Lambda permission\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Lambda permission ${logicalId}: ${physicalId}`);\n\n const functionName = properties?.['FunctionName'] as string | undefined;\n if (!functionName) {\n this.logger.warn(\n `FunctionName not available for Lambda permission ${logicalId}, skipping deletion`\n );\n return;\n }\n\n // physicalId may be in \"functionArn|statementId\" format (from CC API)\n // Extract just the statementId part\n let statementId = physicalId;\n if (physicalId.includes('|')) {\n statementId = physicalId.split('|').pop()!;\n }\n\n try {\n await this.lambdaClient.send(\n new RemovePermissionCommand({\n FunctionName: functionName,\n StatementId: statementId,\n })\n );\n this.logger.debug(`Successfully deleted Lambda permission ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Lambda permission ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Lambda permission ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n LambdaClient,\n CreateFunctionUrlConfigCommand,\n DeleteFunctionUrlConfigCommand,\n UpdateFunctionUrlConfigCommand,\n ResourceNotFoundException,\n type FunctionUrlAuthType,\n type InvokeMode,\n} from '@aws-sdk/client-lambda';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Lambda Function URL Provider\n *\n * Implements resource provisioning for AWS::Lambda::Url using the Lambda SDK.\n * WHY: CreateFunctionUrlConfig is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n */\nexport class LambdaUrlProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private logger = getLogger().child('LambdaUrlProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Lambda::Url',\n new Set(['TargetFunctionArn', 'AuthType', 'Qualifier', 'InvokeMode', 'Cors']),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n }\n\n /**\n * Create a Lambda Function URL\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Lambda URL ${logicalId}`);\n\n const targetFunctionArn = properties['TargetFunctionArn'] as string;\n if (!targetFunctionArn) {\n throw new ProvisioningError(\n `TargetFunctionArn is required for Lambda URL ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const authType = (properties['AuthType'] as FunctionUrlAuthType) || 'NONE';\n\n try {\n const cors = properties['Cors'] as Record<string, unknown> | undefined;\n\n const createParams: import('@aws-sdk/client-lambda').CreateFunctionUrlConfigCommandInput = {\n FunctionName: targetFunctionArn,\n AuthType: authType,\n };\n if (properties['Qualifier']) createParams.Qualifier = properties['Qualifier'] as string;\n if (properties['InvokeMode'])\n createParams.InvokeMode = properties['InvokeMode'] as InvokeMode;\n if (cors) {\n createParams.Cors = this.buildCorsConfig(cors);\n }\n\n const response = await this.lambdaClient.send(\n new CreateFunctionUrlConfigCommand(createParams)\n );\n\n const functionUrl = response.FunctionUrl;\n const functionArn = response.FunctionArn;\n\n this.logger.debug(`Successfully created Lambda URL ${logicalId}: ${functionUrl}`);\n\n return {\n physicalId: functionArn || targetFunctionArn,\n attributes: {\n FunctionUrl: functionUrl,\n FunctionArn: functionArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Lambda URL ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n targetFunctionArn,\n cause\n );\n }\n }\n\n /**\n * Update a Lambda Function URL\n */\n async update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Lambda URL ${logicalId}: ${physicalId}`);\n\n const authType = (properties['AuthType'] as FunctionUrlAuthType) || 'NONE';\n const cors = properties['Cors'] as Record<string, unknown> | undefined;\n\n const updateParams: import('@aws-sdk/client-lambda').UpdateFunctionUrlConfigCommandInput = {\n FunctionName: physicalId,\n AuthType: authType,\n };\n if (properties['InvokeMode']) updateParams.InvokeMode = properties['InvokeMode'] as InvokeMode;\n if (cors) {\n updateParams.Cors = this.buildCorsConfig(cors);\n }\n\n const response = await this.lambdaClient.send(new UpdateFunctionUrlConfigCommand(updateParams));\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n FunctionUrl: response.FunctionUrl,\n FunctionArn: response.FunctionArn,\n },\n };\n }\n\n /**\n * Delete a Lambda Function URL\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Lambda URL ${logicalId}: ${physicalId}`);\n\n try {\n await this.lambdaClient.send(\n new DeleteFunctionUrlConfigCommand({ FunctionName: physicalId })\n );\n this.logger.debug(`Successfully deleted Lambda URL ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Lambda URL ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Lambda URL ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Build CORS configuration from CDK properties\n */\n private buildCorsConfig(cors: Record<string, unknown>): import('@aws-sdk/client-lambda').Cors {\n const config: import('@aws-sdk/client-lambda').Cors = {};\n if (cors['AllowOrigins']) config.AllowOrigins = cors['AllowOrigins'] as string[];\n if (cors['AllowMethods']) config.AllowMethods = cors['AllowMethods'] as string[];\n if (cors['AllowHeaders']) config.AllowHeaders = cors['AllowHeaders'] as string[];\n if (cors['ExposeHeaders']) config.ExposeHeaders = cors['ExposeHeaders'] as string[];\n if (cors['MaxAge']) config.MaxAge = cors['MaxAge'] as number;\n if (cors['AllowCredentials'] !== undefined)\n config.AllowCredentials = cors['AllowCredentials'] as boolean;\n return config;\n }\n}\n", "import {\n LambdaClient,\n CreateEventSourceMappingCommand,\n DeleteEventSourceMappingCommand,\n UpdateEventSourceMappingCommand,\n GetEventSourceMappingCommand,\n ResourceNotFoundException,\n type EventSourcePosition,\n} from '@aws-sdk/client-lambda';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Lambda Event Source Mapping Provider\n *\n * Implements resource provisioning for AWS::Lambda::EventSourceMapping using the Lambda SDK.\n * WHY: CreateEventSourceMapping is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n */\nexport class LambdaEventSourceMappingProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private logger = getLogger().child('LambdaEventSourceMappingProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Lambda::EventSourceMapping',\n new Set([\n 'FunctionName',\n 'EventSourceArn',\n 'BatchSize',\n 'StartingPosition',\n 'Enabled',\n 'MaximumBatchingWindowInSeconds',\n 'MaximumRetryAttempts',\n 'BisectBatchOnFunctionError',\n 'MaximumRecordAgeInSeconds',\n 'ParallelizationFactor',\n 'FilterCriteria',\n 'DestinationConfig',\n 'TumblingWindowInSeconds',\n 'FunctionResponseTypes',\n 'SourceAccessConfigurations',\n 'SelfManagedEventSource',\n 'SelfManagedKafkaEventSourceConfig',\n 'AmazonManagedKafkaEventSourceConfig',\n 'DocumentDBEventSourceConfig',\n 'ScalingConfig',\n 'Tags',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n }\n\n /**\n * Create a Lambda Event Source Mapping\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating event source mapping ${logicalId}`);\n\n const functionName = properties['FunctionName'] as string;\n if (!functionName) {\n throw new ProvisioningError(\n `FunctionName is required for event source mapping ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const params: import('@aws-sdk/client-lambda').CreateEventSourceMappingCommandInput = {\n FunctionName: functionName,\n };\n if (properties['EventSourceArn'])\n params.EventSourceArn = properties['EventSourceArn'] as string;\n if (properties['BatchSize']) params.BatchSize = properties['BatchSize'] as number;\n if (properties['StartingPosition'])\n params.StartingPosition = properties['StartingPosition'] as EventSourcePosition;\n if (properties['Enabled'] !== undefined) params.Enabled = properties['Enabled'] as boolean;\n if (properties['MaximumBatchingWindowInSeconds'])\n params.MaximumBatchingWindowInSeconds = properties[\n 'MaximumBatchingWindowInSeconds'\n ] as number;\n if (properties['MaximumRetryAttempts'] !== undefined)\n params.MaximumRetryAttempts = properties['MaximumRetryAttempts'] as number;\n if (properties['BisectBatchOnFunctionError'] !== undefined)\n params.BisectBatchOnFunctionError = properties['BisectBatchOnFunctionError'] as boolean;\n if (properties['MaximumRecordAgeInSeconds'])\n params.MaximumRecordAgeInSeconds = properties['MaximumRecordAgeInSeconds'] as number;\n if (properties['ParallelizationFactor'])\n params.ParallelizationFactor = properties['ParallelizationFactor'] as number;\n if (properties['FilterCriteria'])\n params.FilterCriteria = properties['FilterCriteria'] as {\n Filters?: Array<{ Pattern?: string }>;\n };\n if (properties['DestinationConfig'])\n params.DestinationConfig = properties[\n 'DestinationConfig'\n ] as import('@aws-sdk/client-lambda').DestinationConfig;\n if (properties['TumblingWindowInSeconds'])\n params.TumblingWindowInSeconds = properties['TumblingWindowInSeconds'] as number;\n if (properties['FunctionResponseTypes'])\n params.FunctionResponseTypes = properties[\n 'FunctionResponseTypes'\n ] as import('@aws-sdk/client-lambda').FunctionResponseType[];\n if (properties['SourceAccessConfigurations'])\n params.SourceAccessConfigurations = properties[\n 'SourceAccessConfigurations'\n ] as import('@aws-sdk/client-lambda').SourceAccessConfiguration[];\n if (properties['SelfManagedEventSource'])\n params.SelfManagedEventSource = properties[\n 'SelfManagedEventSource'\n ] as import('@aws-sdk/client-lambda').SelfManagedEventSource;\n if (properties['SelfManagedKafkaEventSourceConfig'])\n params.SelfManagedKafkaEventSourceConfig = properties[\n 'SelfManagedKafkaEventSourceConfig'\n ] as import('@aws-sdk/client-lambda').SelfManagedKafkaEventSourceConfig;\n if (properties['AmazonManagedKafkaEventSourceConfig'])\n params.AmazonManagedKafkaEventSourceConfig = properties[\n 'AmazonManagedKafkaEventSourceConfig'\n ] as import('@aws-sdk/client-lambda').AmazonManagedKafkaEventSourceConfig;\n if (properties['DocumentDBEventSourceConfig'])\n params.DocumentDBEventSourceConfig = properties[\n 'DocumentDBEventSourceConfig'\n ] as import('@aws-sdk/client-lambda').DocumentDBEventSourceConfig;\n if (properties['ScalingConfig'])\n params.ScalingConfig = properties[\n 'ScalingConfig'\n ] as import('@aws-sdk/client-lambda').ScalingConfig;\n if (properties['Tags']) {\n const cfnTags = properties['Tags'] as Array<{ Key: string; Value: string }>;\n params.Tags = Object.fromEntries(cfnTags.map((t) => [t.Key, t.Value]));\n }\n\n const response = await this.lambdaClient.send(new CreateEventSourceMappingCommand(params));\n\n const uuid = response.UUID;\n if (!uuid) {\n throw new Error('CreateEventSourceMapping did not return UUID');\n }\n\n this.logger.debug(`Successfully created event source mapping ${logicalId}: ${uuid}`);\n\n return {\n physicalId: uuid,\n attributes: {\n Id: uuid,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create event source mapping ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a Lambda Event Source Mapping\n */\n async update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating event source mapping ${logicalId}: ${physicalId}`);\n\n const updateParams: import('@aws-sdk/client-lambda').UpdateEventSourceMappingCommandInput = {\n UUID: physicalId,\n FunctionName: properties['FunctionName'] as string,\n };\n if (properties['BatchSize']) updateParams.BatchSize = properties['BatchSize'] as number;\n if (properties['Enabled'] !== undefined)\n updateParams.Enabled = properties['Enabled'] as boolean;\n if (properties['MaximumBatchingWindowInSeconds'])\n updateParams.MaximumBatchingWindowInSeconds = properties[\n 'MaximumBatchingWindowInSeconds'\n ] as number;\n if (properties['MaximumRetryAttempts'] !== undefined)\n updateParams.MaximumRetryAttempts = properties['MaximumRetryAttempts'] as number;\n if (properties['BisectBatchOnFunctionError'] !== undefined)\n updateParams.BisectBatchOnFunctionError = properties['BisectBatchOnFunctionError'] as boolean;\n if (properties['MaximumRecordAgeInSeconds'])\n updateParams.MaximumRecordAgeInSeconds = properties['MaximumRecordAgeInSeconds'] as number;\n if (properties['ParallelizationFactor'])\n updateParams.ParallelizationFactor = properties['ParallelizationFactor'] as number;\n if (properties['FilterCriteria'])\n updateParams.FilterCriteria = properties['FilterCriteria'] as {\n Filters?: Array<{ Pattern?: string }>;\n };\n if (properties['DestinationConfig'])\n updateParams.DestinationConfig = properties[\n 'DestinationConfig'\n ] as import('@aws-sdk/client-lambda').DestinationConfig;\n if (properties['TumblingWindowInSeconds'])\n updateParams.TumblingWindowInSeconds = properties['TumblingWindowInSeconds'] as number;\n if (properties['FunctionResponseTypes'])\n updateParams.FunctionResponseTypes = properties[\n 'FunctionResponseTypes'\n ] as import('@aws-sdk/client-lambda').FunctionResponseType[];\n if (properties['SourceAccessConfigurations'])\n updateParams.SourceAccessConfigurations = properties[\n 'SourceAccessConfigurations'\n ] as import('@aws-sdk/client-lambda').SourceAccessConfiguration[];\n if (properties['ScalingConfig'])\n updateParams.ScalingConfig = properties[\n 'ScalingConfig'\n ] as import('@aws-sdk/client-lambda').ScalingConfig;\n if (properties['DocumentDBEventSourceConfig'])\n updateParams.DocumentDBEventSourceConfig = properties[\n 'DocumentDBEventSourceConfig'\n ] as import('@aws-sdk/client-lambda').DocumentDBEventSourceConfig;\n\n await this.lambdaClient.send(new UpdateEventSourceMappingCommand(updateParams));\n\n this.logger.debug(`Successfully updated event source mapping ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n },\n };\n }\n\n /**\n * Delete a Lambda Event Source Mapping\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting event source mapping ${logicalId}: ${physicalId}`);\n\n try {\n // Check if mapping still exists\n try {\n await this.lambdaClient.send(new GetEventSourceMappingCommand({ UUID: physicalId }));\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Event source mapping ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n await this.lambdaClient.send(new DeleteEventSourceMappingCommand({ UUID: physicalId }));\n this.logger.debug(`Successfully deleted event source mapping ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Event source mapping ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete event source mapping ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n LambdaClient,\n PublishLayerVersionCommand,\n DeleteLayerVersionCommand,\n ResourceNotFoundException,\n type LayerVersionContentInput,\n type Runtime,\n type Architecture,\n} from '@aws-sdk/client-lambda';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Lambda LayerVersion Provider\n *\n * Implements resource provisioning for AWS::Lambda::LayerVersion using the Lambda SDK.\n * WHY: PublishLayerVersion is synchronous - the CC API does not support this resource type.\n *\n * Note: Lambda LayerVersions are immutable. Updates publish a new version (new ARN).\n * Deletes target the specific version extracted from the ARN.\n */\nexport class LambdaLayerVersionProvider implements ResourceProvider {\n private lambdaClient: LambdaClient;\n private logger = getLogger().child('LambdaLayerVersionProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Lambda::LayerVersion',\n new Set([\n 'LayerName',\n 'Content',\n 'CompatibleRuntimes',\n 'CompatibleArchitectures',\n 'Description',\n 'LicenseInfo',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.lambdaClient = awsClients.lambda;\n }\n\n /**\n * Create a Lambda layer version\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Lambda layer version ${logicalId}`);\n\n const layerName =\n (properties['LayerName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n\n const content = properties['Content'] as Record<string, unknown> | undefined;\n if (!content) {\n throw new ProvisioningError(\n `Content is required for Lambda layer version ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const contentInput: LayerVersionContentInput = {};\n if (content['S3Bucket']) contentInput.S3Bucket = content['S3Bucket'] as string;\n if (content['S3Key']) contentInput.S3Key = content['S3Key'] as string;\n if (content['S3ObjectVersion'])\n contentInput.S3ObjectVersion = content['S3ObjectVersion'] as string;\n\n const response = await this.lambdaClient.send(\n new PublishLayerVersionCommand({\n LayerName: layerName,\n Content: contentInput,\n CompatibleRuntimes: properties['CompatibleRuntimes'] as Runtime[] | undefined,\n CompatibleArchitectures: properties['CompatibleArchitectures'] as\n | Architecture[]\n | undefined,\n Description: properties['Description'] as string | undefined,\n LicenseInfo: properties['LicenseInfo'] as string | undefined,\n })\n );\n\n const layerVersionArn = response.LayerVersionArn!;\n this.logger.debug(\n `Successfully created Lambda layer version ${logicalId}: ${layerVersionArn}`\n );\n\n return {\n physicalId: layerVersionArn,\n attributes: {\n LayerVersionArn: layerVersionArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Lambda layer version ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a Lambda layer version\n *\n * Lambda layer versions are immutable. An update publishes a new version.\n * The new LayerVersionArn becomes the physical ID.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Lambda layer version ${logicalId}: ${physicalId}`);\n\n // Layer versions are immutable - publish a new version\n const createResult = await this.create(logicalId, resourceType, properties);\n\n return {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n attributes: createResult.attributes ?? {},\n };\n }\n\n /**\n * Delete a Lambda layer version\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Lambda layer version ${logicalId}: ${physicalId}`);\n\n // Extract layer name and version number from the ARN\n // ARN format: arn:aws:lambda:region:account:layer:name:version\n const arnParts = physicalId.split(':');\n if (arnParts.length < 8) {\n this.logger.warn(`Invalid LayerVersionArn format: ${physicalId}, skipping deletion`);\n return;\n }\n const layerName = arnParts[6]!;\n const versionNumber = parseInt(arnParts[7]!, 10);\n\n if (isNaN(versionNumber)) {\n this.logger.warn(`Could not parse version number from ARN: ${physicalId}, skipping deletion`);\n return;\n }\n\n try {\n await this.lambdaClient.send(\n new DeleteLayerVersionCommand({\n LayerName: layerName,\n VersionNumber: versionNumber,\n })\n );\n this.logger.debug(`Successfully deleted Lambda layer version ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Lambda layer version ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Lambda layer version ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n DynamoDBClient,\n CreateTableCommand,\n DeleteTableCommand,\n DescribeTableCommand,\n ResourceNotFoundException,\n type CreateTableCommandInput,\n type KeySchemaElement,\n type AttributeDefinition,\n type GlobalSecondaryIndex,\n type LocalSecondaryIndex,\n type StreamSpecification,\n type Tag,\n} from '@aws-sdk/client-dynamodb';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS DynamoDB Table Provider\n *\n * Implements resource provisioning for AWS::DynamoDB::Table using the DynamoDB SDK.\n * WHY: The CC API polls for DynamoDB table creation with exponential backoff\n * (1s->2s->4s->8s->10s), but we can poll DescribeTable directly with shorter\n * intervals, eliminating the CC API intermediary overhead and reducing total\n * wait time.\n */\nexport class DynamoDBTableProvider implements ResourceProvider {\n private dynamoDBClient: DynamoDBClient;\n private logger = getLogger().child('DynamoDBTableProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::DynamoDB::Table',\n new Set([\n 'TableName',\n 'KeySchema',\n 'AttributeDefinitions',\n 'BillingMode',\n 'ProvisionedThroughput',\n 'StreamSpecification',\n 'GlobalSecondaryIndexes',\n 'LocalSecondaryIndexes',\n 'SSESpecification',\n 'Tags',\n 'DeletionProtectionEnabled',\n 'TableClass',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.dynamoDBClient = awsClients.dynamoDB;\n }\n\n /**\n * Create a DynamoDB table\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating DynamoDB table ${logicalId}`);\n\n const tableName =\n (properties['TableName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255 });\n const keySchema = properties['KeySchema'] as KeySchemaElement[] | undefined;\n const attributeDefinitions = properties['AttributeDefinitions'] as\n | AttributeDefinition[]\n | undefined;\n\n if (!keySchema) {\n throw new ProvisioningError(\n `KeySchema is required for DynamoDB table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n if (!attributeDefinitions) {\n throw new ProvisioningError(\n `AttributeDefinitions is required for DynamoDB table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // BillingMode (default: PROVISIONED)\n const billingMode = (properties['BillingMode'] as string | undefined) || 'PROVISIONED';\n\n const createParams: CreateTableCommandInput = {\n TableName: tableName,\n KeySchema: keySchema,\n AttributeDefinitions: attributeDefinitions,\n BillingMode: billingMode as 'PROVISIONED' | 'PAY_PER_REQUEST',\n };\n\n // Provisioned throughput (required when BillingMode is PROVISIONED)\n if (billingMode === 'PROVISIONED') {\n const pt = properties['ProvisionedThroughput'] as Record<string, unknown> | undefined;\n createParams.ProvisionedThroughput = {\n ReadCapacityUnits: Number(pt?.['ReadCapacityUnits'] ?? 5),\n WriteCapacityUnits: Number(pt?.['WriteCapacityUnits'] ?? 5),\n };\n }\n\n // Stream specification - CDK omits StreamEnabled, SDK requires it\n if (properties['StreamSpecification']) {\n const streamSpec = properties['StreamSpecification'] as Record<string, unknown>;\n createParams.StreamSpecification = {\n StreamEnabled: true,\n StreamViewType: streamSpec['StreamViewType'] as string,\n } as StreamSpecification;\n }\n\n // Global secondary indexes\n if (properties['GlobalSecondaryIndexes']) {\n createParams.GlobalSecondaryIndexes = properties[\n 'GlobalSecondaryIndexes'\n ] as GlobalSecondaryIndex[];\n }\n\n // Local secondary indexes\n if (properties['LocalSecondaryIndexes']) {\n createParams.LocalSecondaryIndexes = properties[\n 'LocalSecondaryIndexes'\n ] as LocalSecondaryIndex[];\n }\n\n // SSE specification\n if (properties['SSESpecification']) {\n createParams.SSESpecification = properties[\n 'SSESpecification'\n ] as CreateTableCommandInput['SSESpecification'];\n }\n\n // Tags\n if (properties['Tags']) {\n createParams.Tags = properties['Tags'] as Tag[];\n }\n\n // DeletionProtectionEnabled\n if (properties['DeletionProtectionEnabled'] !== undefined) {\n createParams.DeletionProtectionEnabled = properties['DeletionProtectionEnabled'] as boolean;\n }\n\n // Table class\n if (properties['TableClass']) {\n createParams.TableClass = properties['TableClass'] as\n | 'STANDARD'\n | 'STANDARD_INFREQUENT_ACCESS';\n }\n\n await this.dynamoDBClient.send(new CreateTableCommand(createParams));\n\n this.logger.debug(`CreateTable initiated for ${tableName}, waiting for ACTIVE status`);\n\n // Poll until table is ACTIVE\n const tableInfo = await this.waitForTableActive(tableName);\n\n this.logger.debug(`Successfully created DynamoDB table ${logicalId}: ${tableName}`);\n\n return {\n physicalId: tableName,\n attributes: {\n Arn: tableInfo.tableArn,\n TableId: tableInfo.tableId,\n StreamArn: tableInfo.streamArn,\n TableName: tableName,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) {\n throw error;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create DynamoDB table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n tableName,\n cause\n );\n }\n }\n\n /**\n * Update a DynamoDB table\n *\n * DynamoDB tables have limited in-place update capabilities.\n * For immutable property changes (KeySchema, etc.), the deployment layer\n * handles replacement via DELETE + CREATE.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating DynamoDB table ${logicalId}: ${physicalId}`);\n\n try {\n // Get current table description for attributes\n const response = await this.dynamoDBClient.send(\n new DescribeTableCommand({ TableName: physicalId })\n );\n\n const table = response.Table;\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: table?.TableArn,\n TableId: table?.TableId,\n StreamArn: table?.LatestStreamArn,\n TableName: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update DynamoDB table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a DynamoDB table\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting DynamoDB table ${logicalId}: ${physicalId}`);\n\n try {\n await this.dynamoDBClient.send(new DeleteTableCommand({ TableName: physicalId }));\n this.logger.debug(`Successfully deleted DynamoDB table ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`DynamoDB table ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete DynamoDB table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Poll DescribeTable until the table reaches ACTIVE status\n *\n * Uses a tight polling loop (1s intervals) instead of CC API's exponential\n * backoff (1s->2s->4s->8s->10s), reducing total wait time.\n */\n private async waitForTableActive(\n tableName: string,\n maxAttempts = 60\n ): Promise<{\n tableArn: string | undefined;\n tableId: string | undefined;\n streamArn: string | undefined;\n }> {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const response = await this.dynamoDBClient.send(\n new DescribeTableCommand({ TableName: tableName })\n );\n\n const status = response.Table?.TableStatus;\n this.logger.debug(`Table ${tableName} status: ${status} (attempt ${attempt}/${maxAttempts})`);\n\n if (status === 'ACTIVE') {\n return {\n tableArn: response.Table?.TableArn,\n tableId: response.Table?.TableId,\n streamArn: response.Table?.LatestStreamArn,\n };\n }\n\n if (status !== 'CREATING') {\n throw new Error(`Unexpected table status: ${status}`);\n }\n\n // Wait 1 second between polls\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n throw new Error(`Table ${tableName} did not reach ACTIVE status within ${maxAttempts} seconds`);\n }\n}\n", "import {\n CloudWatchLogsClient,\n CreateLogGroupCommand,\n DeleteLogGroupCommand,\n PutRetentionPolicyCommand,\n DeleteRetentionPolicyCommand,\n TagResourceCommand,\n UntagResourceCommand,\n PutDataProtectionPolicyCommand,\n DeleteDataProtectionPolicyCommand,\n ResourceNotFoundException,\n ResourceAlreadyExistsException,\n} from '@aws-sdk/client-cloudwatch-logs';\nimport { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS CloudWatch Logs LogGroup Provider\n *\n * Implements resource provisioning for AWS::Logs::LogGroup using the CloudWatch Logs SDK.\n * WHY: CreateLogGroup is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n */\nexport class LogsLogGroupProvider implements ResourceProvider {\n private logsClient: CloudWatchLogsClient;\n private stsClient: STSClient;\n private logger = getLogger().child('LogsLogGroupProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Logs::LogGroup',\n new Set([\n 'LogGroupName',\n 'KmsKeyId',\n 'RetentionInDays',\n 'Tags',\n 'DataProtectionPolicy',\n 'LogGroupClass',\n 'FieldIndexPolicies',\n 'ResourcePolicyDocument',\n 'DeletionProtectionEnabled',\n 'BearerTokenAuthenticationEnabled',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.logsClient = awsClients.cloudWatchLogs;\n this.stsClient = awsClients.sts;\n }\n\n /**\n * Create a CloudWatch Logs log group\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating log group ${logicalId}`);\n\n const logGroupName =\n (properties['LogGroupName'] as string | undefined) ||\n `/cdkd/${generateResourceName(logicalId, { maxLength: 506, allowedPattern: /[^a-zA-Z0-9-/_]/g })}`;\n\n try {\n const createParams: import('@aws-sdk/client-cloudwatch-logs').CreateLogGroupCommandInput = {\n logGroupName,\n };\n if (properties['KmsKeyId']) createParams.kmsKeyId = properties['KmsKeyId'] as string;\n if (properties['LogGroupClass']) {\n createParams.logGroupClass = properties[\n 'LogGroupClass'\n ] as import('@aws-sdk/client-cloudwatch-logs').LogGroupClass;\n }\n if (properties['Tags']) {\n const cfnTags = properties['Tags'] as Array<{ Key: string; Value: string }>;\n createParams.tags = Object.fromEntries(cfnTags.map((t) => [t.Key, t.Value]));\n }\n\n await this.logsClient.send(new CreateLogGroupCommand(createParams));\n\n // Apply retention policy if specified\n const retentionInDays = properties['RetentionInDays'] as number | undefined;\n if (retentionInDays) {\n await this.logsClient.send(\n new PutRetentionPolicyCommand({\n logGroupName,\n retentionInDays,\n })\n );\n }\n\n // Apply DataProtectionPolicy if specified\n if (properties['DataProtectionPolicy']) {\n const policyDocument =\n typeof properties['DataProtectionPolicy'] === 'string'\n ? properties['DataProtectionPolicy']\n : JSON.stringify(properties['DataProtectionPolicy']);\n await this.logsClient.send(\n new PutDataProtectionPolicyCommand({\n logGroupIdentifier: logGroupName,\n policyDocument,\n })\n );\n }\n\n // Note: FieldIndexPolicies, ResourcePolicyDocument, DeletionProtectionEnabled,\n // and BearerTokenAuthenticationEnabled are declared in handledProperties\n // to prevent CC API fallback. These are less common properties that the\n // CC API can handle if needed via the deployment layer.\n\n this.logger.debug(`Successfully created log group ${logicalId}: ${logGroupName}`);\n\n // Construct ARN from region/account\n const arn = await this.buildArn(logGroupName);\n\n return {\n physicalId: logGroupName,\n attributes: {\n Arn: arn,\n },\n };\n } catch (error) {\n if (error instanceof ResourceAlreadyExistsException) {\n this.logger.debug(`Log group ${logGroupName} already exists, using existing`);\n const arn = await this.buildArn(logGroupName);\n return {\n physicalId: logGroupName,\n attributes: {\n Arn: arn,\n },\n };\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create log group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n logGroupName,\n cause\n );\n }\n }\n\n /**\n * Update a CloudWatch Logs log group\n *\n * Only RetentionInDays can be updated. LogGroupName is immutable (requires replacement).\n */\n async update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating log group ${logicalId}: ${physicalId}`);\n\n // Update retention policy if changed\n const retentionInDays = properties['RetentionInDays'] as number | undefined;\n const oldRetentionInDays = previousProperties['RetentionInDays'] as number | undefined;\n if (retentionInDays !== oldRetentionInDays) {\n if (retentionInDays) {\n await this.logsClient.send(\n new PutRetentionPolicyCommand({\n logGroupName: physicalId,\n retentionInDays,\n })\n );\n } else {\n // Remove retention policy (never expire)\n await this.logsClient.send(\n new DeleteRetentionPolicyCommand({\n logGroupName: physicalId,\n })\n );\n }\n }\n\n // Update DataProtectionPolicy if changed\n if (\n JSON.stringify(properties['DataProtectionPolicy']) !==\n JSON.stringify(previousProperties['DataProtectionPolicy'])\n ) {\n if (properties['DataProtectionPolicy']) {\n const policyDocument =\n typeof properties['DataProtectionPolicy'] === 'string'\n ? properties['DataProtectionPolicy']\n : JSON.stringify(properties['DataProtectionPolicy']);\n await this.logsClient.send(\n new PutDataProtectionPolicyCommand({\n logGroupIdentifier: physicalId,\n policyDocument,\n })\n );\n } else {\n await this.logsClient.send(\n new DeleteDataProtectionPolicyCommand({\n logGroupIdentifier: physicalId,\n })\n );\n }\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n const oldTags = previousProperties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n const arn = await this.buildArn(physicalId);\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n const oldTagKeys = oldTags.map((t) => t.Key);\n await this.logsClient.send(\n new UntagResourceCommand({\n resourceArn: arn,\n tagKeys: oldTagKeys,\n })\n );\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n const tagsMap = Object.fromEntries(newTags.map((t) => [t.Key, t.Value]));\n await this.logsClient.send(\n new TagResourceCommand({\n resourceArn: arn,\n tags: tagsMap,\n })\n );\n }\n this.logger.debug(`Updated tags for log group ${physicalId}`);\n }\n\n const arn = await this.buildArn(physicalId);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: arn,\n },\n };\n }\n\n /**\n * Delete a CloudWatch Logs log group\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting log group ${logicalId}: ${physicalId}`);\n\n try {\n await this.logsClient.send(new DeleteLogGroupCommand({ logGroupName: physicalId }));\n this.logger.debug(`Successfully deleted log group ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Log group ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete log group ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Build log group ARN from name\n */\n private async buildArn(logGroupName: string): Promise<string> {\n try {\n const identity = await this.stsClient.send(new GetCallerIdentityCommand({}));\n const accountId = identity.Account;\n // Region comes from the client config\n const region =\n (await this.logsClient.config.region()) || process.env['AWS_REGION'] || 'us-east-1';\n return `arn:aws:logs:${region}:${accountId}:log-group:${logGroupName}:*`;\n } catch {\n // Fallback: return a placeholder ARN\n return `arn:aws:logs:unknown:unknown:log-group:${logGroupName}:*`;\n }\n }\n}\n", "import {\n CloudWatchClient,\n PutMetricAlarmCommand,\n DeleteAlarmsCommand,\n DescribeAlarmsCommand,\n type Statistic,\n type ComparisonOperator,\n type StandardUnit,\n type PutMetricAlarmCommandInput,\n} from '@aws-sdk/client-cloudwatch';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS CloudWatch Alarm Provider\n *\n * Implements resource provisioning for AWS::CloudWatch::Alarm using the CloudWatch SDK.\n * This is required because CloudWatch Alarm is not supported by Cloud Control API.\n */\nexport class CloudWatchAlarmProvider implements ResourceProvider {\n private cloudWatchClient: CloudWatchClient;\n private logger = getLogger().child('CloudWatchAlarmProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::CloudWatch::Alarm',\n new Set([\n 'AlarmName',\n 'ComparisonOperator',\n 'EvaluationPeriods',\n 'Threshold',\n 'ActionsEnabled',\n 'AlarmActions',\n 'AlarmDescription',\n 'DatapointsToAlarm',\n 'InsufficientDataActions',\n 'OKActions',\n 'TreatMissingData',\n 'Unit',\n 'Metrics',\n 'MetricName',\n 'Namespace',\n 'Period',\n 'Statistic',\n 'Dimensions',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.cloudWatchClient = awsClients.cloudWatch;\n }\n\n /**\n * Create a CloudWatch alarm\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CloudWatch alarm ${logicalId}`);\n\n const alarmName =\n (properties['AlarmName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 256 });\n\n try {\n await this.cloudWatchClient.send(\n new PutMetricAlarmCommand(this.buildAlarmParams(alarmName, properties))\n );\n\n this.logger.debug(`Successfully created CloudWatch alarm ${logicalId}: ${alarmName}`);\n\n // Fetch the actual ARN from AWS (includes correct region and account)\n const alarmArn = await this.getAlarmArn(alarmName);\n\n return {\n physicalId: alarmName,\n attributes: {\n Arn: alarmArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CloudWatch alarm ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a CloudWatch alarm\n *\n * PutMetricAlarm is idempotent - calling it with the same alarm name updates the alarm.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CloudWatch alarm ${logicalId}: ${physicalId}`);\n\n try {\n await this.cloudWatchClient.send(\n new PutMetricAlarmCommand(this.buildAlarmParams(physicalId, properties))\n );\n\n this.logger.debug(`Successfully updated CloudWatch alarm ${logicalId}`);\n\n // Fetch the actual ARN from AWS (includes correct region and account)\n const alarmArn = await this.getAlarmArn(physicalId);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: alarmArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CloudWatch alarm ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a CloudWatch alarm\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting CloudWatch alarm ${logicalId}: ${physicalId}`);\n\n try {\n await this.cloudWatchClient.send(\n new DeleteAlarmsCommand({\n AlarmNames: [physicalId],\n })\n );\n\n this.logger.debug(`Successfully deleted CloudWatch alarm ${logicalId}`);\n } catch (error) {\n if (error instanceof Error && error.name === 'ResourceNotFound') {\n this.logger.debug(`Alarm ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CloudWatch alarm ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get the actual alarm ARN from AWS via DescribeAlarms.\n * Falls back to constructing an ARN from client config if the describe call fails.\n */\n private async getAlarmArn(alarmName: string): Promise<string> {\n try {\n const response = await this.cloudWatchClient.send(\n new DescribeAlarmsCommand({\n AlarmNames: [alarmName],\n })\n );\n const arn = response.MetricAlarms?.[0]?.AlarmArn;\n if (arn) {\n return arn;\n }\n // Also check CompositeAlarms\n const compositeArn = response.CompositeAlarms?.[0]?.AlarmArn;\n if (compositeArn) {\n return compositeArn;\n }\n } catch (error) {\n this.logger.debug(\n `Failed to describe alarm ${alarmName}, constructing ARN from config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n // Fallback: construct ARN from client config\n try {\n const region =\n (await this.cloudWatchClient.config.region()) || process.env['AWS_REGION'] || 'us-east-1';\n return `arn:aws:cloudwatch:${region}:*:alarm:${alarmName}`;\n } catch {\n return `arn:aws:cloudwatch:*:*:alarm:${alarmName}`;\n }\n }\n\n /**\n * Build PutMetricAlarm parameters from CDK properties\n */\n private buildAlarmParams(\n alarmName: string,\n properties: Record<string, unknown>\n ): PutMetricAlarmCommandInput {\n const params: Record<string, unknown> = {\n AlarmName: alarmName,\n ComparisonOperator: properties['ComparisonOperator'] as ComparisonOperator | undefined,\n EvaluationPeriods: properties['EvaluationPeriods'] as number,\n Threshold: properties['Threshold'] as number | undefined,\n ActionsEnabled: properties['ActionsEnabled'] as boolean | undefined,\n AlarmActions: properties['AlarmActions'] as string[] | undefined,\n AlarmDescription: properties['AlarmDescription'] as string | undefined,\n DatapointsToAlarm: properties['DatapointsToAlarm'] as number | undefined,\n InsufficientDataActions: properties['InsufficientDataActions'] as string[] | undefined,\n OKActions: properties['OKActions'] as string[] | undefined,\n TreatMissingData: properties['TreatMissingData'] as string | undefined,\n Unit: properties['Unit'] as StandardUnit | undefined,\n };\n\n // Metrics array (math expressions / composite metrics)\n if (properties['Metrics']) {\n const metrics = properties['Metrics'] as Array<Record<string, unknown>>;\n params['Metrics'] = metrics.map((m) => {\n const entry: Record<string, unknown> = {\n Id: m['Id'] as string,\n };\n if (m['Expression'] !== undefined) entry['Expression'] = m['Expression'];\n if (m['Label'] !== undefined) entry['Label'] = m['Label'];\n if (m['ReturnData'] !== undefined) entry['ReturnData'] = m['ReturnData'];\n if (m['Period'] !== undefined) entry['Period'] = m['Period'];\n if (m['MetricStat'] !== undefined) {\n const stat = m['MetricStat'] as Record<string, unknown>;\n const metric = stat['Metric'] as Record<string, unknown>;\n entry['MetricStat'] = {\n Metric: {\n MetricName: metric['MetricName'],\n Namespace: metric['Namespace'],\n Dimensions: metric['Dimensions'],\n },\n Period: stat['Period'],\n Stat: stat['Stat'],\n Unit: stat['Unit'],\n };\n }\n return entry;\n });\n } else {\n // Simple metric alarm (MetricName / Namespace / Dimensions)\n params['MetricName'] = properties['MetricName'] as string | undefined;\n params['Namespace'] = properties['Namespace'] as string | undefined;\n params['Period'] = properties['Period'] as number | undefined;\n params['Statistic'] = properties['Statistic'] as Statistic | undefined;\n params['Dimensions'] = properties['Dimensions'] as\n | Array<{ Name: string; Value: string }>\n | undefined;\n }\n\n return params as unknown as PutMetricAlarmCommandInput;\n }\n}\n", "import {\n SecretsManagerClient,\n CreateSecretCommand,\n DeleteSecretCommand,\n UpdateSecretCommand,\n TagResourceCommand,\n UntagResourceCommand,\n ReplicateSecretToRegionsCommand,\n RemoveRegionsFromReplicationCommand,\n ResourceNotFoundException,\n type Tag,\n} from '@aws-sdk/client-secrets-manager';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Secrets Manager Secret Provider\n *\n * Implements resource provisioning for AWS::SecretsManager::Secret using the Secrets Manager SDK.\n * WHY: CreateSecret is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n */\nexport class SecretsManagerSecretProvider implements ResourceProvider {\n private smClient: SecretsManagerClient;\n private logger = getLogger().child('SecretsManagerSecretProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::SecretsManager::Secret',\n new Set([\n 'Name',\n 'GenerateSecretString',\n 'SecretString',\n 'Description',\n 'KmsKeyId',\n 'Tags',\n 'ReplicaRegions',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.smClient = awsClients.secretsManager;\n }\n\n /**\n * Create a Secrets Manager secret\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating secret ${logicalId}`);\n\n const name =\n (properties['Name'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 512, allowedPattern: /[^a-zA-Z0-9-/_]/g });\n\n try {\n // Build the secret value from GenerateSecretString or SecretString\n let secretString: string | undefined;\n const generateConfig = properties['GenerateSecretString'] as\n | Record<string, unknown>\n | undefined;\n\n if (generateConfig) {\n secretString = this.generateSecretString(generateConfig);\n } else if (properties['SecretString']) {\n secretString = properties['SecretString'] as string;\n }\n\n const createParams: import('@aws-sdk/client-secrets-manager').CreateSecretCommandInput = {\n Name: name,\n };\n if (secretString) createParams.SecretString = secretString;\n if (properties['Description']) createParams.Description = properties['Description'] as string;\n if (properties['KmsKeyId']) createParams.KmsKeyId = properties['KmsKeyId'] as string;\n if (properties['Tags']) {\n createParams.Tags = properties['Tags'] as Tag[];\n }\n if (properties['ReplicaRegions']) {\n const replicaRegions = properties['ReplicaRegions'] as Array<Record<string, unknown>>;\n createParams.AddReplicaRegions = replicaRegions.map((r) => ({\n Region: r['Region'] as string,\n KmsKeyId: r['KmsKeyId'] as string | undefined,\n }));\n }\n\n const response = await this.smClient.send(new CreateSecretCommand(createParams));\n\n const secretArn = response.ARN;\n if (!secretArn) {\n throw new Error('CreateSecret did not return ARN');\n }\n\n this.logger.debug(`Successfully created secret ${logicalId}: ${secretArn}`);\n\n return {\n physicalId: secretArn,\n attributes: {\n Id: secretArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create secret ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n name,\n cause\n );\n }\n }\n\n /**\n * Update a Secrets Manager secret\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating secret ${logicalId}: ${physicalId}`);\n\n try {\n let secretString: string | undefined;\n const generateConfig = properties['GenerateSecretString'] as\n | Record<string, unknown>\n | undefined;\n\n if (generateConfig) {\n secretString = this.generateSecretString(generateConfig);\n } else if (properties['SecretString']) {\n secretString = properties['SecretString'] as string;\n }\n\n const updateParams: import('@aws-sdk/client-secrets-manager').UpdateSecretCommandInput = {\n SecretId: physicalId,\n };\n if (secretString) updateParams.SecretString = secretString;\n if (properties['Description']) updateParams.Description = properties['Description'] as string;\n if (properties['KmsKeyId']) updateParams.KmsKeyId = properties['KmsKeyId'] as string;\n\n await this.smClient.send(new UpdateSecretCommand(updateParams));\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Tag[] | undefined;\n const oldTags = previousProperties['Tags'] as Tag[] | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n const oldTagKeys = oldTags.map((t) => t.Key).filter((k): k is string => !!k);\n if (oldTagKeys.length > 0) {\n await this.smClient.send(\n new UntagResourceCommand({\n SecretId: physicalId,\n TagKeys: oldTagKeys,\n })\n );\n }\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n await this.smClient.send(\n new TagResourceCommand({\n SecretId: physicalId,\n Tags: newTags,\n })\n );\n }\n this.logger.debug(`Updated tags for secret ${physicalId}`);\n }\n\n // Update ReplicaRegions if changed\n const newReplicas = properties['ReplicaRegions'] as\n | Array<Record<string, unknown>>\n | undefined;\n const oldReplicas = previousProperties['ReplicaRegions'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (JSON.stringify(newReplicas) !== JSON.stringify(oldReplicas)) {\n // Remove old replica regions that are no longer present\n if (oldReplicas && oldReplicas.length > 0) {\n const newRegionSet = new Set((newReplicas || []).map((r) => r['Region'] as string));\n const regionsToRemove = oldReplicas\n .map((r) => r['Region'] as string)\n .filter((region) => !newRegionSet.has(region));\n if (regionsToRemove.length > 0) {\n await this.smClient.send(\n new RemoveRegionsFromReplicationCommand({\n SecretId: physicalId,\n RemoveReplicaRegions: regionsToRemove,\n })\n );\n }\n }\n // Add new replica regions\n if (newReplicas && newReplicas.length > 0) {\n const oldRegionSet = new Set((oldReplicas || []).map((r) => r['Region'] as string));\n const regionsToAdd = newReplicas.filter((r) => !oldRegionSet.has(r['Region'] as string));\n if (regionsToAdd.length > 0) {\n await this.smClient.send(\n new ReplicateSecretToRegionsCommand({\n SecretId: physicalId,\n AddReplicaRegions: regionsToAdd.map((r) => ({\n Region: r['Region'] as string,\n KmsKeyId: r['KmsKeyId'] as string | undefined,\n })),\n })\n );\n }\n }\n this.logger.debug(`Updated replica regions for secret ${physicalId}`);\n }\n\n this.logger.debug(`Successfully updated secret ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update secret ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Secrets Manager secret\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting secret ${logicalId}: ${physicalId}`);\n\n try {\n await this.smClient.send(\n new DeleteSecretCommand({\n SecretId: physicalId,\n ForceDeleteWithoutRecovery: true,\n })\n );\n this.logger.debug(`Successfully deleted secret ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Secret ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete secret ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Generate a secret string from GenerateSecretString configuration\n *\n * Simple implementation that generates a random string based on the config.\n */\n private generateSecretString(config: Record<string, unknown>): string {\n const length = (config['PasswordLength'] as number) || 32;\n const excludeUppercase = config['ExcludeUppercase'] as boolean;\n const excludeLowercase = config['ExcludeLowercase'] as boolean;\n const excludeNumbers = config['ExcludeNumbers'] as boolean;\n const excludePunctuation = config['ExcludePunctuation'] as boolean;\n const excludeCharacters = (config['ExcludeCharacters'] as string) || '';\n\n let chars = '';\n if (!excludeUppercase) chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n if (!excludeLowercase) chars += 'abcdefghijklmnopqrstuvwxyz';\n if (!excludeNumbers) chars += '0123456789';\n if (!excludePunctuation) chars += '!@#$%^&*()_+-=[]{}|;:,.<>?';\n\n // Remove excluded characters\n if (excludeCharacters) {\n for (const c of excludeCharacters) {\n chars = chars.replaceAll(c, '');\n }\n }\n\n if (chars.length === 0) {\n chars = 'abcdefghijklmnopqrstuvwxyz';\n }\n\n // Generate random password\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n let password = '';\n for (let i = 0; i < length; i++) {\n password += chars[bytes[i]! % chars.length];\n }\n\n // If GenerateStringKey is specified, wrap in JSON\n const generateStringKey = config['GenerateStringKey'] as string | undefined;\n const secretStringTemplate = config['SecretStringTemplate'] as string | undefined;\n\n if (generateStringKey && secretStringTemplate) {\n try {\n const template = JSON.parse(secretStringTemplate) as Record<string, unknown>;\n template[generateStringKey] = password;\n return JSON.stringify(template);\n } catch {\n return password;\n }\n }\n\n return password;\n }\n}\n", "import {\n SSMClient,\n PutParameterCommand,\n DeleteParameterCommand,\n AddTagsToResourceCommand,\n RemoveTagsFromResourceCommand,\n ParameterNotFound,\n type ParameterType,\n type Tag,\n} from '@aws-sdk/client-ssm';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS SSM Parameter Provider\n *\n * Implements resource provisioning for AWS::SSM::Parameter using the SSM SDK.\n * This is required because SSM Parameter is not supported by Cloud Control API.\n */\nexport class SSMParameterProvider implements ResourceProvider {\n private ssmClient: SSMClient;\n private logger = getLogger().child('SSMParameterProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::SSM::Parameter',\n new Set([\n 'Name',\n 'Type',\n 'Value',\n 'Description',\n 'Tags',\n 'AllowedPattern',\n 'Tier',\n 'Policies',\n 'DataType',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.ssmClient = awsClients.ssm;\n }\n\n /**\n * Create an SSM parameter\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SSM parameter ${logicalId}`);\n\n const name =\n (properties['Name'] as string | undefined) ||\n `/${generateResourceName(logicalId, { maxLength: 1023, allowedPattern: /[^a-zA-Z0-9-/_]/g })}`;\n const type = (properties['Type'] as string | undefined) || 'String';\n const value = properties['Value'] as string | undefined;\n\n if (!value) {\n throw new ProvisioningError(\n `Value is required for SSM parameter ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const putParams: import('@aws-sdk/client-ssm').PutParameterCommandInput = {\n Name: name,\n Type: type as ParameterType,\n Value: value,\n Description: properties['Description'] as string | undefined,\n Overwrite: false,\n };\n if (properties['AllowedPattern']) {\n putParams.AllowedPattern = properties['AllowedPattern'] as string;\n }\n if (properties['Tier']) {\n putParams.Tier = properties['Tier'] as import('@aws-sdk/client-ssm').ParameterTier;\n }\n if (properties['Policies']) {\n putParams.Policies = properties['Policies'] as string;\n }\n if (properties['DataType']) {\n putParams.DataType = properties['DataType'] as string;\n }\n\n await this.ssmClient.send(new PutParameterCommand(putParams));\n\n // Apply tags if specified\n if (properties['Tags']) {\n const cfnTags = properties['Tags'] as Array<{ Key: string; Value: string }>;\n const ssmTags: Tag[] = cfnTags.map((t) => ({ Key: t.Key, Value: t.Value }));\n await this.ssmClient.send(\n new AddTagsToResourceCommand({\n ResourceType: 'Parameter',\n ResourceId: name,\n Tags: ssmTags,\n })\n );\n }\n\n this.logger.debug(`Successfully created SSM parameter ${logicalId}: ${name}`);\n\n return {\n physicalId: name,\n attributes: {\n Type: type as ParameterType,\n Value: value,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SSM parameter ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an SSM parameter\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SSM parameter ${logicalId}: ${physicalId}`);\n\n const type = (properties['Type'] as string | undefined) || 'String';\n const value = properties['Value'] as string | undefined;\n\n if (!value) {\n throw new ProvisioningError(\n `Value is required for SSM parameter ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n const putParams: import('@aws-sdk/client-ssm').PutParameterCommandInput = {\n Name: physicalId,\n Type: type as ParameterType,\n Value: value,\n Description: properties['Description'] as string | undefined,\n Overwrite: true,\n };\n if (properties['AllowedPattern']) {\n putParams.AllowedPattern = properties['AllowedPattern'] as string;\n }\n if (properties['Tier']) {\n putParams.Tier = properties['Tier'] as import('@aws-sdk/client-ssm').ParameterTier;\n }\n if (properties['Policies']) {\n putParams.Policies = properties['Policies'] as string;\n }\n if (properties['DataType']) {\n putParams.DataType = properties['DataType'] as string;\n }\n\n await this.ssmClient.send(new PutParameterCommand(putParams));\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n const oldTags = previousProperties['Tags'] as\n | Array<{ Key: string; Value: string }>\n | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n await this.ssmClient.send(\n new RemoveTagsFromResourceCommand({\n ResourceType: 'Parameter',\n ResourceId: physicalId,\n TagKeys: oldTags.map((t) => t.Key),\n })\n );\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n const ssmTags: Tag[] = newTags.map((t) => ({ Key: t.Key, Value: t.Value }));\n await this.ssmClient.send(\n new AddTagsToResourceCommand({\n ResourceType: 'Parameter',\n ResourceId: physicalId,\n Tags: ssmTags,\n })\n );\n }\n this.logger.debug(`Updated tags for SSM parameter ${physicalId}`);\n }\n\n this.logger.debug(`Successfully updated SSM parameter ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Type: type as ParameterType,\n Value: value,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SSM parameter ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an SSM parameter\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SSM parameter ${logicalId}: ${physicalId}`);\n\n try {\n await this.ssmClient.send(\n new DeleteParameterCommand({\n Name: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted SSM parameter ${logicalId}`);\n } catch (error) {\n if (error instanceof ParameterNotFound) {\n this.logger.debug(`Parameter ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SSM parameter ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n EventBridgeClient,\n PutRuleCommand,\n PutTargetsCommand,\n RemoveTargetsCommand,\n DeleteRuleCommand,\n DescribeRuleCommand,\n ListTargetsByRuleCommand,\n TagResourceCommand,\n UntagResourceCommand,\n ResourceNotFoundException,\n type Tag,\n} from '@aws-sdk/client-eventbridge';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * Target definition from CloudFormation AWS::Events::Rule\n */\ninterface RuleTarget {\n Id: string;\n Arn: string;\n Input?: string;\n InputPath?: string;\n InputTransformer?: {\n InputPathsMap?: Record<string, string>;\n InputTemplate: string;\n };\n RoleArn?: string;\n [key: string]: unknown;\n}\n\n/**\n * AWS EventBridge Rule Provider\n *\n * Implements resource provisioning for AWS::Events::Rule using the EventBridge SDK.\n * This is required because Cloud Control API has a bug where creating a Rule with\n * Targets causes a Java NullPointerException.\n */\nexport class EventBridgeRuleProvider implements ResourceProvider {\n private eventBridgeClient: EventBridgeClient;\n private logger = getLogger().child('EventBridgeRuleProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Events::Rule',\n new Set([\n 'Name',\n 'Description',\n 'EventBusName',\n 'EventPattern',\n 'State',\n 'ScheduleExpression',\n 'RoleArn',\n 'Targets',\n 'Tags',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.eventBridgeClient = awsClients.eventBridge;\n }\n\n /**\n * Create an EventBridge rule\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating EventBridge rule ${logicalId}`);\n\n const ruleName =\n (properties['Name'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n const targets = properties['Targets'] as RuleTarget[] | undefined;\n\n try {\n // Build PutRule params (without Targets, which must be added separately)\n const putRuleParams: Record<string, unknown> = {\n Name: ruleName,\n };\n\n if (properties['Description'] !== undefined) {\n putRuleParams['Description'] = properties['Description'];\n }\n if (properties['EventBusName'] !== undefined) {\n putRuleParams['EventBusName'] = properties['EventBusName'];\n }\n if (properties['EventPattern'] !== undefined) {\n // EventPattern must be a JSON string for the SDK\n putRuleParams['EventPattern'] =\n typeof properties['EventPattern'] === 'string'\n ? properties['EventPattern']\n : JSON.stringify(properties['EventPattern']);\n }\n if (properties['State'] !== undefined) {\n putRuleParams['State'] = properties['State'];\n }\n if (properties['ScheduleExpression'] !== undefined) {\n putRuleParams['ScheduleExpression'] = properties['ScheduleExpression'];\n }\n if (properties['RoleArn'] !== undefined) {\n putRuleParams['RoleArn'] = properties['RoleArn'];\n }\n\n // Add tags to PutRule if specified\n if (properties['Tags']) {\n putRuleParams['Tags'] = properties['Tags'];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n const response = await this.eventBridgeClient.send(new PutRuleCommand(putRuleParams as any));\n\n const ruleArn = response.RuleArn!;\n this.logger.debug(`Created EventBridge rule: ${ruleName} (${ruleArn})`);\n\n // Add targets if specified\n if (targets && targets.length > 0) {\n await this.eventBridgeClient.send(\n new PutTargetsCommand({\n Rule: ruleName,\n EventBusName: properties['EventBusName'] as string | undefined,\n Targets: targets,\n })\n );\n this.logger.debug(`Added ${targets.length} targets to rule ${ruleName}`);\n }\n\n return {\n physicalId: ruleArn,\n attributes: {\n Arn: ruleArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EventBridge rule ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n ruleName,\n cause\n );\n }\n }\n\n /**\n * Update an EventBridge rule\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating EventBridge rule ${logicalId}: ${physicalId}`);\n\n const ruleName =\n (properties['Name'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 64 });\n const newTargets = properties['Targets'] as RuleTarget[] | undefined;\n const oldTargets = previousProperties['Targets'] as RuleTarget[] | undefined;\n\n try {\n // Update rule properties\n const putRuleParams: Record<string, unknown> = {\n Name: ruleName,\n };\n\n if (properties['Description'] !== undefined) {\n putRuleParams['Description'] = properties['Description'];\n }\n if (properties['EventBusName'] !== undefined) {\n putRuleParams['EventBusName'] = properties['EventBusName'];\n }\n if (properties['EventPattern'] !== undefined) {\n putRuleParams['EventPattern'] =\n typeof properties['EventPattern'] === 'string'\n ? properties['EventPattern']\n : JSON.stringify(properties['EventPattern']);\n }\n if (properties['State'] !== undefined) {\n putRuleParams['State'] = properties['State'];\n }\n if (properties['ScheduleExpression'] !== undefined) {\n putRuleParams['ScheduleExpression'] = properties['ScheduleExpression'];\n }\n if (properties['RoleArn'] !== undefined) {\n putRuleParams['RoleArn'] = properties['RoleArn'];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n const response = await this.eventBridgeClient.send(new PutRuleCommand(putRuleParams as any));\n\n const ruleArn = response.RuleArn!;\n\n // Update targets if changed\n const eventBusName = properties['EventBusName'] as string | undefined;\n\n // Remove old targets that are no longer present\n if (oldTargets && oldTargets.length > 0) {\n const newTargetIds = new Set((newTargets || []).map((t) => t.Id));\n const targetsToRemove = oldTargets.filter((t) => !newTargetIds.has(t.Id)).map((t) => t.Id);\n\n if (targetsToRemove.length > 0) {\n await this.eventBridgeClient.send(\n new RemoveTargetsCommand({\n Rule: ruleName,\n EventBusName: eventBusName,\n Ids: targetsToRemove,\n })\n );\n this.logger.debug(`Removed ${targetsToRemove.length} targets from rule ${ruleName}`);\n }\n }\n\n // Add/update new targets\n if (newTargets && newTargets.length > 0) {\n await this.eventBridgeClient.send(\n new PutTargetsCommand({\n Rule: ruleName,\n EventBusName: eventBusName,\n Targets: newTargets,\n })\n );\n this.logger.debug(`Updated ${newTargets.length} targets on rule ${ruleName}`);\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Tag[] | undefined;\n const oldTags = previousProperties['Tags'] as Tag[] | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n const oldTagKeys = oldTags.map((t) => t.Key).filter((k): k is string => !!k);\n if (oldTagKeys.length > 0) {\n await this.eventBridgeClient.send(\n new UntagResourceCommand({\n ResourceARN: ruleArn,\n TagKeys: oldTagKeys,\n })\n );\n }\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n await this.eventBridgeClient.send(\n new TagResourceCommand({\n ResourceARN: ruleArn,\n Tags: newTags,\n })\n );\n }\n this.logger.debug(`Updated tags for rule ${ruleName}`);\n }\n\n this.logger.debug(`Successfully updated EventBridge rule ${logicalId}`);\n\n return {\n physicalId: ruleArn,\n wasReplaced: false,\n attributes: {\n Arn: ruleArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update EventBridge rule ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an EventBridge rule\n *\n * Before deleting, removes all targets (required by EventBridge API).\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting EventBridge rule ${logicalId}: ${physicalId}`);\n\n // Extract rule name from ARN (format: arn:aws:events:region:account:rule/rule-name or rule/bus-name/rule-name)\n const ruleName = this.extractRuleNameFromArn(physicalId);\n\n try {\n // List all targets for this rule\n let targetIds: string[] = [];\n try {\n const targetsResponse = await this.eventBridgeClient.send(\n new ListTargetsByRuleCommand({ Rule: ruleName })\n );\n targetIds = (targetsResponse.Targets || [])\n .map((t) => t.Id)\n .filter((id): id is string => id !== undefined);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Rule ${ruleName} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Remove all targets before deleting the rule\n if (targetIds.length > 0) {\n await this.eventBridgeClient.send(\n new RemoveTargetsCommand({\n Rule: ruleName,\n Ids: targetIds,\n })\n );\n this.logger.debug(`Removed ${targetIds.length} targets from rule ${ruleName}`);\n }\n\n // Delete the rule\n await this.eventBridgeClient.send(new DeleteRuleCommand({ Name: ruleName }));\n\n this.logger.debug(`Successfully deleted EventBridge rule ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Rule ${ruleName} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete EventBridge rule ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get resource attribute (for Fn::GetAtt resolution)\n */\n async getAttribute(\n physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n const ruleName = this.extractRuleNameFromArn(physicalId);\n\n if (attributeName === 'Arn') {\n const response = await this.eventBridgeClient.send(\n new DescribeRuleCommand({ Name: ruleName })\n );\n return response.Arn;\n }\n\n throw new Error(`Unsupported attribute: ${attributeName} for AWS::Events::Rule`);\n }\n\n /**\n * Extract rule name from an ARN\n *\n * ARN format: arn:aws:events:region:account:rule/rule-name\n * or: arn:aws:events:region:account:rule/bus-name/rule-name\n */\n private extractRuleNameFromArn(arn: string): string {\n // If it's not an ARN, assume it's already a rule name\n if (!arn.startsWith('arn:')) {\n return arn;\n }\n\n const parts = arn.split('/');\n // Last segment is always the rule name\n return parts[parts.length - 1] ?? arn;\n }\n}\n", "import {\n EventBridgeClient,\n CreateEventBusCommand,\n DeleteEventBusCommand,\n UpdateEventBusCommand,\n DescribeEventBusCommand,\n ListRulesCommand,\n RemoveTargetsCommand,\n DeleteRuleCommand,\n ListTargetsByRuleCommand,\n TagResourceCommand,\n UntagResourceCommand,\n ResourceNotFoundException,\n type Tag,\n} from '@aws-sdk/client-eventbridge';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS::Events::EventBus\n *\n * Uses direct SDK calls instead of Cloud Control API because:\n * - CC API deletes EventBus in parallel with Rules on the same bus\n * - EventBridge rejects EventBus deletion while Rules still exist\n * - SDK Provider ensures all Rules+Targets are cleaned up before bus deletion\n */\nexport class EventBridgeBusProvider implements ResourceProvider {\n private eventBridgeClient: EventBridgeClient;\n private logger = getLogger().child('EventBridgeBusProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Events::EventBus',\n new Set([\n 'Name',\n 'Tags',\n 'EventSourceName',\n 'Description',\n 'KmsKeyIdentifier',\n 'Policy',\n 'DeadLetterConfig',\n ]),\n ],\n ]);\n\n constructor() {\n this.eventBridgeClient = getAwsClients().eventBridge;\n }\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n const name = properties['Name'] as string;\n if (!name) {\n throw new ProvisioningError(\n `Name is required for EventBus ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n this.logger.debug(`Creating EventBus ${logicalId}: ${name}`);\n\n try {\n const createParams: import('@aws-sdk/client-eventbridge').CreateEventBusCommandInput = {\n Name: name,\n };\n if (properties['EventSourceName']) {\n createParams.EventSourceName = properties['EventSourceName'] as string;\n }\n if (properties['Description']) {\n createParams.Description = properties['Description'] as string;\n }\n if (properties['KmsKeyIdentifier']) {\n createParams.KmsKeyIdentifier = properties['KmsKeyIdentifier'] as string;\n }\n if (properties['Tags']) {\n createParams.Tags = properties['Tags'] as Tag[];\n }\n if (properties['DeadLetterConfig']) {\n const dlcConfig = properties['DeadLetterConfig'] as Record<string, unknown>;\n createParams.DeadLetterConfig = {\n Arn: dlcConfig['Arn'] as string | undefined,\n };\n }\n\n const response = await this.eventBridgeClient.send(new CreateEventBusCommand(createParams));\n\n const eventBusArn = response.EventBusArn ?? '';\n\n // Apply Policy if specified (must be done after creation)\n if (properties['Policy']) {\n // EventBridge uses PutPermission for policies, but for simplicity\n // we note it in handledProperties. The CC API fallback handles complex policies.\n }\n\n return {\n physicalId: name,\n attributes: {\n Arn: eventBusArn,\n Name: name,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EventBus ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n async update(\n _logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating EventBus ${_logicalId}: ${physicalId}`);\n\n // Update mutable properties (Description, KmsKeyIdentifier, DeadLetterConfig)\n const descChanged = properties['Description'] !== previousProperties['Description'];\n const kmsChanged = properties['KmsKeyIdentifier'] !== previousProperties['KmsKeyIdentifier'];\n const dlcChanged =\n JSON.stringify(properties['DeadLetterConfig']) !==\n JSON.stringify(previousProperties['DeadLetterConfig']);\n\n if (descChanged || kmsChanged || dlcChanged) {\n const updateParams: import('@aws-sdk/client-eventbridge').UpdateEventBusCommandInput = {\n Name: physicalId,\n };\n if (properties['Description'] !== undefined) {\n updateParams.Description = properties['Description'] as string;\n }\n if (properties['KmsKeyIdentifier'] !== undefined) {\n updateParams.KmsKeyIdentifier = properties['KmsKeyIdentifier'] as string;\n }\n if (properties['DeadLetterConfig']) {\n const dlcConfig = properties['DeadLetterConfig'] as Record<string, unknown>;\n updateParams.DeadLetterConfig = {\n Arn: dlcConfig['Arn'] as string | undefined,\n };\n }\n await this.eventBridgeClient.send(new UpdateEventBusCommand(updateParams));\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Tag[] | undefined;\n const oldTags = previousProperties['Tags'] as Tag[] | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Get ARN for tagging\n const describeResponse = await this.eventBridgeClient.send(\n new DescribeEventBusCommand({ Name: physicalId })\n );\n const busArn = describeResponse.Arn;\n if (busArn) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n const oldTagKeys = oldTags.map((t) => t.Key).filter((k): k is string => !!k);\n if (oldTagKeys.length > 0) {\n await this.eventBridgeClient.send(\n new UntagResourceCommand({\n ResourceARN: busArn,\n TagKeys: oldTagKeys,\n })\n );\n }\n }\n // Apply new tags\n if (newTags && newTags.length > 0) {\n await this.eventBridgeClient.send(\n new TagResourceCommand({\n ResourceARN: busArn,\n Tags: newTags,\n })\n );\n }\n this.logger.debug(`Updated tags for EventBus ${physicalId}`);\n }\n }\n\n return { physicalId, wasReplaced: false, attributes: {} };\n }\n\n async delete(logicalId: string, physicalId: string, resourceType: string): Promise<void> {\n this.logger.debug(`Deleting EventBus ${logicalId}: ${physicalId}`);\n\n try {\n // First, clean up all rules on this bus (they block deletion)\n await this.cleanupRulesOnBus(physicalId);\n\n // Then delete the bus\n await this.eventBridgeClient.send(new DeleteEventBusCommand({ Name: physicalId }));\n this.logger.debug(`Successfully deleted EventBus ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`EventBus ${physicalId} does not exist, skipping`);\n return;\n }\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('does not exist')) {\n this.logger.debug(`EventBus ${physicalId} does not exist, skipping`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete EventBus ${logicalId}: ${msg}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n getAttribute(physicalId: string, _resourceType: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'Arn') {\n // Can't construct ARN without region/account, return physicalId\n return Promise.resolve(undefined);\n }\n if (attributeName === 'Name') {\n return Promise.resolve(physicalId);\n }\n return Promise.resolve(undefined);\n }\n\n /**\n * Remove all rules and their targets from an event bus before deletion.\n */\n private async cleanupRulesOnBus(busName: string): Promise<void> {\n try {\n const rulesResponse = await this.eventBridgeClient.send(\n new ListRulesCommand({ EventBusName: busName })\n );\n\n const rules = rulesResponse.Rules ?? [];\n if (rules.length === 0) return;\n\n this.logger.debug(`Cleaning up ${rules.length} rule(s) on bus ${busName}`);\n\n for (const rule of rules) {\n if (!rule.Name) continue;\n\n // Remove targets first\n try {\n const targetsResponse = await this.eventBridgeClient.send(\n new ListTargetsByRuleCommand({\n Rule: rule.Name,\n EventBusName: busName,\n })\n );\n\n const targetIds = (targetsResponse.Targets ?? [])\n .map((t) => t.Id)\n .filter((id): id is string => !!id);\n\n if (targetIds.length > 0) {\n await this.eventBridgeClient.send(\n new RemoveTargetsCommand({\n Rule: rule.Name,\n EventBusName: busName,\n Ids: targetIds,\n })\n );\n }\n } catch {\n // Best-effort target removal\n }\n\n // Delete the rule\n try {\n await this.eventBridgeClient.send(\n new DeleteRuleCommand({\n Name: rule.Name,\n EventBusName: busName,\n })\n );\n } catch {\n // Best-effort rule removal\n }\n }\n } catch (error) {\n if (error instanceof ResourceNotFoundException) return;\n this.logger.debug(\n `Failed to list rules on bus ${busName}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n}\n", "import {\n EC2Client,\n CreateVpcCommand,\n DeleteVpcCommand,\n ModifyVpcAttributeCommand,\n DescribeVpcsCommand,\n CreateSubnetCommand,\n DeleteSubnetCommand,\n CreateInternetGatewayCommand,\n DeleteInternetGatewayCommand,\n AttachInternetGatewayCommand,\n DetachInternetGatewayCommand,\n CreateRouteTableCommand,\n DeleteRouteTableCommand,\n CreateRouteCommand,\n DeleteRouteCommand,\n AssociateRouteTableCommand,\n DisassociateRouteTableCommand,\n CreateSecurityGroupCommand,\n DeleteSecurityGroupCommand,\n AuthorizeSecurityGroupIngressCommand,\n RevokeSecurityGroupIngressCommand,\n CreateTagsCommand,\n DescribeSubnetsCommand,\n DescribeSecurityGroupsCommand,\n RunInstancesCommand,\n TerminateInstancesCommand,\n DescribeInstancesCommand,\n waitUntilInstanceRunning,\n waitUntilInstanceTerminated,\n ModifySubnetAttributeCommand,\n CreateNetworkAclCommand,\n DeleteNetworkAclCommand,\n CreateNetworkAclEntryCommand,\n DeleteNetworkAclEntryCommand,\n ReplaceNetworkAclAssociationCommand,\n DescribeNetworkAclsCommand,\n type Tenancy,\n type _InstanceType,\n type VolumeType,\n type BlockDeviceMapping,\n} from '@aws-sdk/client-ec2';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS EC2 Networking Provider\n *\n * Implements resource provisioning for EC2 networking resources:\n * - AWS::EC2::VPC\n * - AWS::EC2::Subnet\n * - AWS::EC2::InternetGateway\n * - AWS::EC2::VPCGatewayAttachment\n * - AWS::EC2::RouteTable\n * - AWS::EC2::Route\n * - AWS::EC2::SubnetRouteTableAssociation\n * - AWS::EC2::SecurityGroup\n * - AWS::EC2::SecurityGroupIngress\n * - AWS::EC2::Instance\n */\nexport class EC2Provider implements ResourceProvider {\n private ec2Client: EC2Client;\n private logger = getLogger().child('EC2Provider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::EC2::VPC',\n new Set(['CidrBlock', 'InstanceTenancy', 'EnableDnsHostnames', 'EnableDnsSupport', 'Tags']),\n ],\n [\n 'AWS::EC2::Subnet',\n new Set(['VpcId', 'CidrBlock', 'AvailabilityZone', 'MapPublicIpOnLaunch', 'Tags']),\n ],\n ['AWS::EC2::InternetGateway', new Set(['Tags'])],\n ['AWS::EC2::VPCGatewayAttachment', new Set(['VpcId', 'InternetGatewayId'])],\n ['AWS::EC2::RouteTable', new Set(['VpcId', 'Tags'])],\n [\n 'AWS::EC2::Route',\n new Set([\n 'RouteTableId',\n 'DestinationCidrBlock',\n 'DestinationIpv6CidrBlock',\n 'GatewayId',\n 'NatGatewayId',\n 'EgressOnlyInternetGatewayId',\n 'InstanceId',\n 'NetworkInterfaceId',\n 'VpcPeeringConnectionId',\n ]),\n ],\n ['AWS::EC2::SubnetRouteTableAssociation', new Set(['SubnetId', 'RouteTableId'])],\n [\n 'AWS::EC2::SecurityGroup',\n new Set(['GroupDescription', 'GroupName', 'VpcId', 'SecurityGroupIngress', 'Tags']),\n ],\n [\n 'AWS::EC2::SecurityGroupIngress',\n new Set([\n 'GroupId',\n 'IpProtocol',\n 'FromPort',\n 'ToPort',\n 'CidrIp',\n 'Description',\n 'SourceSecurityGroupId',\n ]),\n ],\n [\n 'AWS::EC2::Instance',\n new Set([\n 'ImageId',\n 'InstanceType',\n 'KeyName',\n 'SecurityGroupIds',\n 'SecurityGroups',\n 'SubnetId',\n 'IamInstanceProfile',\n 'UserData',\n 'BlockDeviceMappings',\n 'Tags',\n ]),\n ],\n ['AWS::EC2::NetworkAcl', new Set(['VpcId', 'Tags'])],\n [\n 'AWS::EC2::NetworkAclEntry',\n new Set([\n 'NetworkAclId',\n 'RuleNumber',\n 'Protocol',\n 'RuleAction',\n 'Egress',\n 'CidrBlock',\n 'Ipv6CidrBlock',\n 'PortRange',\n 'IcmpTypeCode',\n ]),\n ],\n ['AWS::EC2::SubnetNetworkAclAssociation', new Set(['SubnetId', 'NetworkAclId'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.ec2Client = awsClients.ec2;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::EC2::VPC':\n return this.createVpc(logicalId, resourceType, properties);\n case 'AWS::EC2::Subnet':\n return this.createSubnet(logicalId, resourceType, properties);\n case 'AWS::EC2::InternetGateway':\n return this.createInternetGateway(logicalId, resourceType, properties);\n case 'AWS::EC2::VPCGatewayAttachment':\n return this.createVpcGatewayAttachment(logicalId, resourceType, properties);\n case 'AWS::EC2::RouteTable':\n return this.createRouteTable(logicalId, resourceType, properties);\n case 'AWS::EC2::Route':\n return this.createRoute(logicalId, resourceType, properties);\n case 'AWS::EC2::SubnetRouteTableAssociation':\n return this.createSubnetRouteTableAssociation(logicalId, resourceType, properties);\n case 'AWS::EC2::SecurityGroup':\n return this.createSecurityGroup(logicalId, resourceType, properties);\n case 'AWS::EC2::SecurityGroupIngress':\n return this.createSecurityGroupIngress(logicalId, resourceType, properties);\n case 'AWS::EC2::Instance':\n return this.createInstance(logicalId, resourceType, properties);\n case 'AWS::EC2::NetworkAcl':\n return this.createNetworkAcl(logicalId, resourceType, properties);\n case 'AWS::EC2::NetworkAclEntry':\n return this.createNetworkAclEntry(logicalId, resourceType, properties);\n case 'AWS::EC2::SubnetNetworkAclAssociation':\n return this.createSubnetNetworkAclAssociation(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::EC2::VPC':\n return this.updateVpc(logicalId, physicalId, resourceType, properties);\n case 'AWS::EC2::Subnet':\n return this.updateSubnet(logicalId, physicalId);\n case 'AWS::EC2::InternetGateway':\n return this.updateInternetGateway(logicalId, physicalId);\n case 'AWS::EC2::VPCGatewayAttachment':\n return this.updateVpcGatewayAttachment(logicalId, physicalId);\n case 'AWS::EC2::RouteTable':\n return this.updateRouteTable(logicalId, physicalId);\n case 'AWS::EC2::Route':\n return this.updateRoute(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n case 'AWS::EC2::SubnetRouteTableAssociation':\n return this.updateSubnetRouteTableAssociation(logicalId, physicalId);\n case 'AWS::EC2::SecurityGroup':\n return this.updateSecurityGroup(logicalId, physicalId, resourceType, properties);\n case 'AWS::EC2::SecurityGroupIngress':\n return this.updateSecurityGroupIngress(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n case 'AWS::EC2::Instance':\n return this.updateInstance(logicalId, physicalId, resourceType, properties);\n case 'AWS::EC2::NetworkAcl':\n case 'AWS::EC2::NetworkAclEntry':\n case 'AWS::EC2::SubnetNetworkAclAssociation':\n return { physicalId, wasReplaced: false };\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::EC2::VPC':\n return this.deleteVpc(logicalId, physicalId, resourceType);\n case 'AWS::EC2::Subnet':\n return this.deleteSubnet(logicalId, physicalId, resourceType);\n case 'AWS::EC2::InternetGateway':\n return this.deleteInternetGateway(logicalId, physicalId, resourceType);\n case 'AWS::EC2::VPCGatewayAttachment':\n return this.deleteVpcGatewayAttachment(logicalId, physicalId, resourceType);\n case 'AWS::EC2::RouteTable':\n return this.deleteRouteTable(logicalId, physicalId, resourceType);\n case 'AWS::EC2::Route':\n return this.deleteRoute(logicalId, physicalId, resourceType);\n case 'AWS::EC2::SubnetRouteTableAssociation':\n return this.deleteSubnetRouteTableAssociation(logicalId, physicalId, resourceType);\n case 'AWS::EC2::SecurityGroup':\n return this.deleteSecurityGroup(logicalId, physicalId, resourceType);\n case 'AWS::EC2::SecurityGroupIngress':\n return this.deleteSecurityGroupIngress(logicalId, physicalId, resourceType, properties);\n case 'AWS::EC2::Instance':\n return this.deleteInstance(logicalId, physicalId, resourceType);\n case 'AWS::EC2::NetworkAcl':\n return this.deleteNetworkAcl(logicalId, physicalId, resourceType);\n case 'AWS::EC2::NetworkAclEntry':\n return this.deleteNetworkAclEntry(logicalId, physicalId, resourceType);\n case 'AWS::EC2::SubnetNetworkAclAssociation':\n // Association replacement is atomic; no explicit delete needed\n this.logger.debug(`SubnetNetworkAclAssociation ${logicalId} delete is a no-op`);\n return;\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async getAttribute(\n physicalId: string,\n resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n switch (resourceType) {\n case 'AWS::EC2::VPC':\n return this.getVpcAttribute(physicalId, attributeName);\n case 'AWS::EC2::Subnet':\n return this.getSubnetAttribute(physicalId, attributeName);\n case 'AWS::EC2::SecurityGroup':\n return this.getSecurityGroupAttribute(physicalId, attributeName);\n case 'AWS::EC2::Instance':\n return this.getInstanceAttribute(physicalId, attributeName);\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::VPC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createVpc(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating VPC ${logicalId}`);\n\n const cidrBlock = properties['CidrBlock'] as string;\n if (!cidrBlock) {\n throw new ProvisioningError(\n `CidrBlock is required for VPC ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(\n new CreateVpcCommand({\n CidrBlock: cidrBlock,\n InstanceTenancy: (properties['InstanceTenancy'] as Tenancy) ?? undefined,\n })\n );\n\n const vpcId = response.Vpc!.VpcId!;\n\n // Apply DNS settings\n if (\n properties['EnableDnsHostnames'] === true ||\n properties['EnableDnsHostnames'] === 'true'\n ) {\n await this.ec2Client.send(\n new ModifyVpcAttributeCommand({\n VpcId: vpcId,\n EnableDnsHostnames: { Value: true },\n })\n );\n }\n\n if (properties['EnableDnsSupport'] === false || properties['EnableDnsSupport'] === 'false') {\n await this.ec2Client.send(\n new ModifyVpcAttributeCommand({\n VpcId: vpcId,\n EnableDnsSupport: { Value: false },\n })\n );\n }\n\n // Apply tags\n await this.applyTags(vpcId, properties, logicalId);\n\n // Fetch VPC details for attributes\n await this.ec2Client.send(new DescribeVpcsCommand({ VpcIds: [vpcId] }));\n\n // Fetch default security group for the VPC\n let defaultSgId = '';\n try {\n const sgResponse = await this.ec2Client.send(\n new DescribeSecurityGroupsCommand({\n Filters: [\n { Name: 'vpc-id', Values: [vpcId] },\n { Name: 'group-name', Values: ['default'] },\n ],\n })\n );\n defaultSgId = sgResponse.SecurityGroups?.[0]?.GroupId || '';\n } catch {\n this.logger.debug(`Failed to get default SG for VPC ${vpcId}`);\n }\n\n this.logger.debug(`Successfully created VPC ${logicalId}: ${vpcId}`);\n\n return {\n physicalId: vpcId,\n attributes: {\n VpcId: vpcId,\n CidrBlock: cidrBlock,\n DefaultNetworkAcl: '',\n DefaultSecurityGroup: defaultSgId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create VPC ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateVpc(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating VPC ${logicalId}: ${physicalId}`);\n\n try {\n // Update DNS settings\n if (properties['EnableDnsHostnames'] !== undefined) {\n const value =\n properties['EnableDnsHostnames'] === true || properties['EnableDnsHostnames'] === 'true';\n await this.ec2Client.send(\n new ModifyVpcAttributeCommand({\n VpcId: physicalId,\n EnableDnsHostnames: { Value: value },\n })\n );\n }\n\n if (properties['EnableDnsSupport'] !== undefined) {\n const value =\n properties['EnableDnsSupport'] === true || properties['EnableDnsSupport'] === 'true';\n await this.ec2Client.send(\n new ModifyVpcAttributeCommand({\n VpcId: physicalId,\n EnableDnsSupport: { Value: value },\n })\n );\n }\n\n // Update tags\n await this.applyTags(physicalId, properties, logicalId);\n\n this.logger.debug(`Successfully updated VPC ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n VpcId: physicalId,\n CidrBlock: properties['CidrBlock'] as string,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update VPC ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteVpc(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting VPC ${logicalId}: ${physicalId}`);\n\n // Retry with backoff for DependencyViolation (ENI cleanup, SG deletion delay)\n const maxAttempts = 10;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.ec2Client.send(new DeleteVpcCommand({ VpcId: physicalId }));\n this.logger.debug(`Successfully deleted VPC ${logicalId}`);\n return;\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`VPC ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const msg = error instanceof Error ? error.message : String(error);\n if (\n (msg.includes('DependencyViolation') || msg.includes('has dependencies')) &&\n attempt < maxAttempts\n ) {\n this.logger.debug(\n `VPC ${physicalId} has dependencies (attempt ${attempt}/${maxAttempts}), retrying in ${attempt * 5}s...`\n );\n await new Promise((resolve) => setTimeout(resolve, attempt * 5000));\n continue;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete VPC ${logicalId}: ${msg}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n }\n\n private async getVpcAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'VpcId') return physicalId;\n\n try {\n const response = await this.ec2Client.send(new DescribeVpcsCommand({ VpcIds: [physicalId] }));\n const vpc = response.Vpcs?.[0];\n if (!vpc) return undefined;\n\n switch (attributeName) {\n case 'CidrBlock':\n return vpc.CidrBlock;\n case 'Ipv6CidrBlocks':\n // Return array of IPv6 CIDR blocks associated with this VPC\n return (\n vpc.Ipv6CidrBlockAssociationSet?.filter(\n (a) => a.Ipv6CidrBlockState?.State === 'associated'\n ).map((a) => a.Ipv6CidrBlock) || []\n );\n case 'CidrBlockAssociations':\n return vpc.CidrBlockAssociationSet?.map((a) => a.AssociationId) || [];\n case 'DefaultNetworkAcl':\n return vpc.DhcpOptionsId; // Placeholder - need separate API call for NACL\n case 'DefaultSecurityGroup':\n return undefined; // Requires DescribeSecurityGroups filter\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::Subnet \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSubnet(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Subnet ${logicalId}`);\n\n const vpcId = properties['VpcId'] as string;\n const cidrBlock = properties['CidrBlock'] as string;\n\n if (!vpcId || !cidrBlock) {\n throw new ProvisioningError(\n `VpcId and CidrBlock are required for Subnet ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(\n new CreateSubnetCommand({\n VpcId: vpcId,\n CidrBlock: cidrBlock,\n AvailabilityZone: (properties['AvailabilityZone'] as string) ?? undefined,\n })\n );\n\n const subnetId = response.Subnet!.SubnetId!;\n const availabilityZone = response.Subnet!.AvailabilityZone!;\n\n // Apply tags\n await this.applyTags(subnetId, properties, logicalId);\n\n // Set MapPublicIpOnLaunch if specified\n const mapPublicIp = properties['MapPublicIpOnLaunch'];\n if (mapPublicIp === true || mapPublicIp === 'true') {\n await this.ec2Client.send(\n new ModifySubnetAttributeCommand({\n SubnetId: subnetId,\n MapPublicIpOnLaunch: { Value: true },\n })\n );\n }\n\n this.logger.debug(`Successfully created Subnet ${logicalId}: ${subnetId}`);\n\n return {\n physicalId: subnetId,\n attributes: {\n SubnetId: subnetId,\n AvailabilityZone: availabilityZone,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Subnet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateSubnet(logicalId: string, physicalId: string): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Subnet ${logicalId}: ${physicalId} (no-op, immutable properties)`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n private async deleteSubnet(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Subnet ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(new DeleteSubnetCommand({ SubnetId: physicalId }));\n this.logger.debug(`Successfully deleted Subnet ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`Subnet ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Subnet ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getSubnetAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'SubnetId') return physicalId;\n\n try {\n const response = await this.ec2Client.send(\n new DescribeSubnetsCommand({ SubnetIds: [physicalId] })\n );\n const subnet = response.Subnets?.[0];\n if (!subnet) return undefined;\n\n if (attributeName === 'AvailabilityZone') return subnet.AvailabilityZone;\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::InternetGateway \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createInternetGateway(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating InternetGateway ${logicalId}`);\n\n try {\n const response = await this.ec2Client.send(new CreateInternetGatewayCommand({}));\n const igwId = response.InternetGateway!.InternetGatewayId!;\n\n // Apply tags\n await this.applyTags(igwId, properties, logicalId);\n\n this.logger.debug(`Successfully created InternetGateway ${logicalId}: ${igwId}`);\n\n return {\n physicalId: igwId,\n attributes: {\n InternetGatewayId: igwId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create InternetGateway ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateInternetGateway(\n logicalId: string,\n physicalId: string\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating InternetGateway ${logicalId}: ${physicalId} (no-op)`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n private async deleteInternetGateway(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting InternetGateway ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(\n new DeleteInternetGatewayCommand({ InternetGatewayId: physicalId })\n );\n this.logger.debug(`Successfully deleted InternetGateway ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`InternetGateway ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete InternetGateway ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::VPCGatewayAttachment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createVpcGatewayAttachment(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating VPCGatewayAttachment ${logicalId}`);\n\n const vpcId = properties['VpcId'] as string;\n const internetGatewayId = properties['InternetGatewayId'] as string;\n\n if (!vpcId || !internetGatewayId) {\n throw new ProvisioningError(\n `VpcId and InternetGatewayId are required for VPCGatewayAttachment ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.ec2Client.send(\n new AttachInternetGatewayCommand({\n VpcId: vpcId,\n InternetGatewayId: internetGatewayId,\n })\n );\n\n const physicalId = `${internetGatewayId}|${vpcId}`;\n this.logger.debug(`Successfully created VPCGatewayAttachment ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create VPCGatewayAttachment ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateVpcGatewayAttachment(\n logicalId: string,\n physicalId: string\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating VPCGatewayAttachment ${logicalId}: ${physicalId} (no-op)`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n private async deleteVpcGatewayAttachment(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting VPCGatewayAttachment ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length !== 2) {\n throw new ProvisioningError(\n `Invalid physicalId format for VPCGatewayAttachment ${logicalId}: expected \"IGW|VpcId\", got \"${physicalId}\"`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const [internetGatewayId, vpcId] = parts;\n\n try {\n await this.ec2Client.send(\n new DetachInternetGatewayCommand({\n InternetGatewayId: internetGatewayId,\n VpcId: vpcId,\n })\n );\n this.logger.debug(`Successfully deleted VPCGatewayAttachment ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`VPCGatewayAttachment ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete VPCGatewayAttachment ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::RouteTable \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createRouteTable(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating RouteTable ${logicalId}`);\n\n const vpcId = properties['VpcId'] as string;\n if (!vpcId) {\n throw new ProvisioningError(\n `VpcId is required for RouteTable ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(new CreateRouteTableCommand({ VpcId: vpcId }));\n\n const routeTableId = response.RouteTable!.RouteTableId!;\n\n // Apply tags\n await this.applyTags(routeTableId, properties, logicalId);\n\n this.logger.debug(`Successfully created RouteTable ${logicalId}: ${routeTableId}`);\n\n return {\n physicalId: routeTableId,\n attributes: {\n RouteTableId: routeTableId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create RouteTable ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateRouteTable(logicalId: string, physicalId: string): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating RouteTable ${logicalId}: ${physicalId} (no-op)`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n private async deleteRouteTable(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting RouteTable ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(new DeleteRouteTableCommand({ RouteTableId: physicalId }));\n this.logger.debug(`Successfully deleted RouteTable ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`RouteTable ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete RouteTable ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::Route \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createRoute(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Route ${logicalId}`);\n\n const routeTableId = properties['RouteTableId'] as string;\n const destinationCidrBlock = properties['DestinationCidrBlock'] as string | undefined;\n const destinationIpv6CidrBlock = properties['DestinationIpv6CidrBlock'] as string | undefined;\n const cidr = destinationCidrBlock || destinationIpv6CidrBlock;\n\n if (!routeTableId || !cidr) {\n throw new ProvisioningError(\n `RouteTableId and DestinationCidrBlock/DestinationIpv6CidrBlock are required for Route ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const isIpv6 = !destinationCidrBlock && !!destinationIpv6CidrBlock;\n\n try {\n await this.ec2Client.send(\n new CreateRouteCommand({\n RouteTableId: routeTableId,\n ...(isIpv6\n ? { DestinationIpv6CidrBlock: destinationIpv6CidrBlock }\n : { DestinationCidrBlock: destinationCidrBlock }),\n GatewayId: (properties['GatewayId'] as string) ?? undefined,\n NatGatewayId: (properties['NatGatewayId'] as string) ?? undefined,\n EgressOnlyInternetGatewayId:\n (properties['EgressOnlyInternetGatewayId'] as string) ?? undefined,\n InstanceId: (properties['InstanceId'] as string) ?? undefined,\n NetworkInterfaceId: (properties['NetworkInterfaceId'] as string) ?? undefined,\n VpcPeeringConnectionId: (properties['VpcPeeringConnectionId'] as string) ?? undefined,\n })\n );\n\n const physicalId = `${routeTableId}|${cidr}`;\n this.logger.debug(`Successfully created Route ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Route ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateRoute(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Route ${logicalId}: ${physicalId}`);\n\n // Route updates require replacement (DestinationCidrBlock and RouteTableId are immutable)\n // For target changes, we delete and recreate\n try {\n await this.deleteRoute(logicalId, physicalId, resourceType);\n const createResult = await this.createRoute(logicalId, resourceType, properties);\n return {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n ...(createResult.attributes && { attributes: createResult.attributes }),\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Route ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteRoute(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Route ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length !== 2) {\n throw new ProvisioningError(\n `Invalid physicalId format for Route ${logicalId}: expected \"RouteTableId|DestinationCidrBlock\", got \"${physicalId}\"`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const [routeTableId, destinationCidrBlock] = parts;\n\n try {\n // IPv6 CIDRs (containing ':') must use DestinationIpv6CidrBlock\n const isIpv6 = destinationCidrBlock?.includes(':');\n await this.ec2Client.send(\n new DeleteRouteCommand({\n RouteTableId: routeTableId,\n ...(isIpv6\n ? { DestinationIpv6CidrBlock: destinationCidrBlock }\n : { DestinationCidrBlock: destinationCidrBlock }),\n })\n );\n this.logger.debug(`Successfully deleted Route ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`Route ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Route ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::SubnetRouteTableAssociation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSubnetRouteTableAssociation(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SubnetRouteTableAssociation ${logicalId}`);\n\n const subnetId = properties['SubnetId'] as string;\n const routeTableId = properties['RouteTableId'] as string;\n\n if (!subnetId || !routeTableId) {\n throw new ProvisioningError(\n `SubnetId and RouteTableId are required for SubnetRouteTableAssociation ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(\n new AssociateRouteTableCommand({\n SubnetId: subnetId,\n RouteTableId: routeTableId,\n })\n );\n\n const associationId = response.AssociationId!;\n this.logger.debug(\n `Successfully created SubnetRouteTableAssociation ${logicalId}: ${associationId}`\n );\n\n return {\n physicalId: associationId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SubnetRouteTableAssociation ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateSubnetRouteTableAssociation(\n logicalId: string,\n physicalId: string\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(\n `Updating SubnetRouteTableAssociation ${logicalId}: ${physicalId} (no-op, requires replacement)`\n );\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n private async deleteSubnetRouteTableAssociation(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting SubnetRouteTableAssociation ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(new DisassociateRouteTableCommand({ AssociationId: physicalId }));\n this.logger.debug(`Successfully deleted SubnetRouteTableAssociation ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(\n `SubnetRouteTableAssociation ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SubnetRouteTableAssociation ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::SecurityGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSecurityGroup(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SecurityGroup ${logicalId}`);\n\n const groupDescription = properties['GroupDescription'] as string;\n if (!groupDescription) {\n throw new ProvisioningError(\n `GroupDescription is required for SecurityGroup ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(\n new CreateSecurityGroupCommand({\n GroupName: (properties['GroupName'] as string) ?? logicalId,\n Description: groupDescription,\n VpcId: (properties['VpcId'] as string) ?? undefined,\n })\n );\n\n const groupId = response.GroupId!;\n\n // Apply tags\n await this.applyTags(groupId, properties, logicalId);\n\n // Add ingress rules if specified inline\n const ingressRules = properties['SecurityGroupIngress'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (ingressRules && Array.isArray(ingressRules)) {\n for (const rule of ingressRules) {\n await this.ec2Client.send(\n new AuthorizeSecurityGroupIngressCommand({\n GroupId: groupId,\n IpPermissions: [this.buildIpPermission(rule)],\n })\n );\n }\n }\n\n this.logger.debug(`Successfully created SecurityGroup ${logicalId}: ${groupId}`);\n\n return {\n physicalId: groupId,\n attributes: {\n GroupId: groupId,\n VpcId: (properties['VpcId'] as string) ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SecurityGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateSecurityGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SecurityGroup ${logicalId}: ${physicalId}`);\n\n try {\n // Update tags\n await this.applyTags(physicalId, properties, logicalId);\n\n this.logger.debug(`Successfully updated SecurityGroup ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n GroupId: physicalId,\n VpcId: (properties['VpcId'] as string) ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SecurityGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteSecurityGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting SecurityGroup ${logicalId}: ${physicalId}`);\n\n // Retry with backoff for \"dependent object\" errors (e.g., ECS ENI cleanup delay)\n const maxAttempts = 10;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.ec2Client.send(new DeleteSecurityGroupCommand({ GroupId: physicalId }));\n this.logger.debug(`Successfully deleted SecurityGroup ${logicalId}`);\n return;\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`SecurityGroup ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes('dependent object') && attempt < maxAttempts) {\n this.logger.debug(\n `SecurityGroup ${physicalId} has dependent objects (attempt ${attempt}/${maxAttempts}), retrying in ${attempt * 5}s...`\n );\n await new Promise((resolve) => setTimeout(resolve, attempt * 5000));\n continue;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SecurityGroup ${logicalId}: ${msg}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n }\n\n private async getSecurityGroupAttribute(\n physicalId: string,\n attributeName: string\n ): Promise<unknown> {\n if (attributeName === 'GroupId') return physicalId;\n\n try {\n const response = await this.ec2Client.send(\n new DescribeSecurityGroupsCommand({ GroupIds: [physicalId] })\n );\n const sg = response.SecurityGroups?.[0];\n if (!sg) return undefined;\n\n if (attributeName === 'VpcId') return sg.VpcId;\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::SecurityGroupIngress \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSecurityGroupIngress(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SecurityGroupIngress ${logicalId}`);\n\n const groupId = properties['GroupId'] as string;\n if (!groupId) {\n throw new ProvisioningError(\n `GroupId is required for SecurityGroupIngress ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const ipProtocol = (properties['IpProtocol'] as string) ?? '-1';\n const fromPort = properties['FromPort'] as number | undefined;\n const toPort = properties['ToPort'] as number | undefined;\n\n try {\n await this.ec2Client.send(\n new AuthorizeSecurityGroupIngressCommand({\n GroupId: groupId,\n IpPermissions: [this.buildIpPermission(properties)],\n })\n );\n\n const physicalId = `${groupId}|${ipProtocol}|${fromPort ?? '-1'}|${toPort ?? '-1'}`;\n this.logger.debug(`Successfully created SecurityGroupIngress ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n // Treat \"already exists\" as success (idempotent, like CloudFormation)\n if (error instanceof Error && error.message.includes('already exists')) {\n const physicalId = `${groupId}|${ipProtocol}|${fromPort ?? '-1'}|${toPort ?? '-1'}`;\n this.logger.debug(`SecurityGroupIngress ${logicalId} already exists, treating as success`);\n return { physicalId, attributes: {} };\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SecurityGroupIngress ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateSecurityGroupIngress(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating SecurityGroupIngress ${logicalId}: ${physicalId}`);\n\n // SecurityGroupIngress updates require replacement: revoke old, authorize new\n try {\n await this.deleteSecurityGroupIngress(\n logicalId,\n physicalId,\n resourceType,\n previousProperties\n );\n const createResult = await this.createSecurityGroupIngress(\n logicalId,\n resourceType,\n properties\n );\n return {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n ...(createResult.attributes && { attributes: createResult.attributes }),\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update SecurityGroupIngress ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteSecurityGroupIngress(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting SecurityGroupIngress ${logicalId}: ${physicalId}`);\n\n // Parse composite physicalId: GroupId|Protocol|FromPort|ToPort\n const parts = physicalId.split('|');\n if (parts.length !== 4) {\n throw new ProvisioningError(\n `Invalid physicalId format for SecurityGroupIngress ${logicalId}: expected \"GroupId|Protocol|FromPort|ToPort\", got \"${physicalId}\"`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const [groupId, ipProtocol, fromPortStr, toPortStr] = parts;\n\n // Build IpPermission from properties if available, otherwise from physicalId\n const ipPermission = properties\n ? this.buildIpPermission(properties)\n : {\n IpProtocol: ipProtocol,\n FromPort: fromPortStr !== '-1' ? Number(fromPortStr) : undefined,\n ToPort: toPortStr !== '-1' ? Number(toPortStr) : undefined,\n };\n\n try {\n await this.ec2Client.send(\n new RevokeSecurityGroupIngressCommand({\n GroupId: groupId,\n IpPermissions: [ipPermission],\n })\n );\n this.logger.debug(`Successfully deleted SecurityGroupIngress ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`SecurityGroupIngress ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete SecurityGroupIngress ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::Instance \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createInstance(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating EC2 Instance ${logicalId}`);\n\n const imageId = properties['ImageId'] as string;\n if (!imageId) {\n throw new ProvisioningError(\n `ImageId is required for EC2 Instance ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const instanceType = (properties['InstanceType'] as string) ?? 't3.micro';\n\n try {\n const securityGroupIds = properties['SecurityGroupIds'] as string[] | undefined;\n const securityGroups = properties['SecurityGroups'] as string[] | undefined;\n const iamInstanceProfile = properties['IamInstanceProfile'] as\n | Record<string, unknown>\n | undefined;\n\n const response = await this.ec2Client.send(\n new RunInstancesCommand({\n ImageId: imageId,\n InstanceType: instanceType as _InstanceType,\n KeyName: (properties['KeyName'] as string) ?? undefined,\n SecurityGroupIds: securityGroupIds ?? undefined,\n SecurityGroups: securityGroups ?? undefined,\n SubnetId: (properties['SubnetId'] as string) ?? undefined,\n UserData: (properties['UserData'] as string) ?? undefined,\n MinCount: 1,\n MaxCount: 1,\n IamInstanceProfile: iamInstanceProfile\n ? {\n Arn: iamInstanceProfile['Arn'] as string | undefined,\n Name: iamInstanceProfile['Name'] as string | undefined,\n }\n : undefined,\n BlockDeviceMappings: this.buildBlockDeviceMappings(properties),\n })\n );\n\n const instance = response.Instances?.[0];\n if (!instance?.InstanceId) {\n throw new Error('No instance ID returned from RunInstances');\n }\n\n const instanceId = instance.InstanceId;\n\n // Apply tags\n await this.applyTags(instanceId, properties, logicalId);\n\n // Wait for instance to reach running state\n this.logger.debug(`Waiting for instance ${instanceId} to be running...`);\n await waitUntilInstanceRunning(\n { client: this.ec2Client, maxWaitTime: 300 },\n { InstanceIds: [instanceId] }\n );\n\n // Describe instance to get attributes after running\n const describeResponse = await this.ec2Client.send(\n new DescribeInstancesCommand({ InstanceIds: [instanceId] })\n );\n const runningInstance = describeResponse.Reservations?.[0]?.Instances?.[0];\n\n const attributes: Record<string, unknown> = {\n InstanceId: instanceId,\n PrivateIp: runningInstance?.PrivateIpAddress ?? '',\n PublicIp: runningInstance?.PublicIpAddress ?? '',\n PrivateDnsName: runningInstance?.PrivateDnsName ?? '',\n PublicDnsName: runningInstance?.PublicDnsName ?? '',\n AvailabilityZone: runningInstance?.Placement?.AvailabilityZone ?? '',\n };\n\n this.logger.debug(`Successfully created EC2 Instance ${logicalId}: ${instanceId}`);\n\n return { physicalId: instanceId, attributes };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EC2 Instance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateInstance(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n // Most EC2 Instance property changes require replacement.\n // Immutable properties (ImageId, SubnetId, KeyName) are handled by\n // the deployment engine's replacement detection.\n // For simplicity, tags-only updates are supported here.\n this.logger.debug(`Updating EC2 Instance ${logicalId}: ${physicalId}`);\n\n try {\n await this.applyTags(physicalId, _properties, logicalId);\n\n // Refresh attributes\n const describeResponse = await this.ec2Client.send(\n new DescribeInstancesCommand({ InstanceIds: [physicalId] })\n );\n const instance = describeResponse.Reservations?.[0]?.Instances?.[0];\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n InstanceId: physicalId,\n PrivateIp: instance?.PrivateIpAddress ?? '',\n PublicIp: instance?.PublicIpAddress ?? '',\n PrivateDnsName: instance?.PrivateDnsName ?? '',\n PublicDnsName: instance?.PublicDnsName ?? '',\n AvailabilityZone: instance?.Placement?.AvailabilityZone ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update EC2 Instance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteInstance(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Terminating EC2 Instance ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(new TerminateInstancesCommand({ InstanceIds: [physicalId] }));\n this.logger.debug(`Terminate requested for EC2 Instance ${logicalId}, waiting...`);\n\n // Wait for instance to reach terminated state so ENIs are released\n await waitUntilInstanceTerminated(\n { client: this.ec2Client, maxWaitTime: 300 },\n { InstanceIds: [physicalId] }\n );\n\n this.logger.debug(`EC2 Instance ${logicalId} terminated: ${physicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(\n `EC2 Instance ${physicalId} already terminated (not found), treating as success`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to terminate EC2 Instance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getInstanceAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n const response = await this.ec2Client.send(\n new DescribeInstancesCommand({ InstanceIds: [physicalId] })\n );\n const instance = response.Reservations?.[0]?.Instances?.[0];\n if (!instance) return undefined;\n\n switch (attributeName) {\n case 'InstanceId':\n return instance.InstanceId;\n case 'PrivateIp':\n return instance.PrivateIpAddress;\n case 'PublicIp':\n return instance.PublicIpAddress;\n case 'PrivateDnsName':\n return instance.PrivateDnsName;\n case 'PublicDnsName':\n return instance.PublicDnsName;\n case 'AvailabilityZone':\n return instance.Placement?.AvailabilityZone;\n default:\n return undefined;\n }\n }\n\n private buildBlockDeviceMappings(\n properties: Record<string, unknown>\n ): BlockDeviceMapping[] | undefined {\n const mappings = properties['BlockDeviceMappings'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (!mappings || !Array.isArray(mappings)) return undefined;\n\n return mappings.map((m) => {\n const ebs = m['Ebs'] as Record<string, unknown> | undefined;\n const result: BlockDeviceMapping = {\n DeviceName: m['DeviceName'] as string,\n };\n if (ebs) {\n result.Ebs = {\n VolumeSize: ebs['VolumeSize'] as number | undefined,\n VolumeType: ebs['VolumeType'] as VolumeType | undefined,\n DeleteOnTermination: (ebs['DeleteOnTermination'] as boolean) ?? true,\n };\n }\n return result;\n });\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Build an IpPermission object from CloudFormation-style properties\n */\n private buildIpPermission(properties: Record<string, unknown>): {\n IpProtocol: string;\n FromPort?: number;\n ToPort?: number;\n IpRanges?: Array<{ CidrIp: string; Description?: string }>;\n UserIdGroupPairs?: Array<{ GroupId: string; Description?: string }>;\n } {\n const ipProtocol = (properties['IpProtocol'] as string) ?? '-1';\n const fromPort = properties['FromPort'] as number | undefined;\n const toPort = properties['ToPort'] as number | undefined;\n\n const permission: {\n IpProtocol: string;\n FromPort?: number;\n ToPort?: number;\n IpRanges?: Array<{ CidrIp: string; Description?: string }>;\n UserIdGroupPairs?: Array<{ GroupId: string; Description?: string }>;\n } = { IpProtocol: ipProtocol };\n\n if (fromPort !== undefined) permission.FromPort = fromPort;\n if (toPort !== undefined) permission.ToPort = toPort;\n\n const cidrIp = properties['CidrIp'] as string | undefined;\n const description = properties['Description'] as string | undefined;\n if (cidrIp) {\n const ipRange: { CidrIp: string; Description?: string } = { CidrIp: cidrIp };\n if (description) ipRange.Description = description;\n permission.IpRanges = [ipRange];\n }\n\n const sourceSecurityGroupId = properties['SourceSecurityGroupId'] as string | undefined;\n if (sourceSecurityGroupId) {\n const groupPair: { GroupId: string; Description?: string } = {\n GroupId: sourceSecurityGroupId,\n };\n if (description) groupPair.Description = description;\n permission.UserIdGroupPairs = [groupPair];\n }\n\n return permission;\n }\n\n // \u2500\u2500\u2500 AWS::EC2::NetworkAcl \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createNetworkAcl(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating NetworkAcl ${logicalId}`);\n\n const vpcId = properties['VpcId'] as string;\n if (!vpcId) {\n throw new ProvisioningError(\n `VpcId is required for NetworkAcl ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.ec2Client.send(new CreateNetworkAclCommand({ VpcId: vpcId }));\n\n const networkAclId = response.NetworkAcl!.NetworkAclId!;\n\n // Apply tags\n await this.applyTags(networkAclId, properties, logicalId);\n\n this.logger.debug(`Successfully created NetworkAcl ${logicalId}: ${networkAclId}`);\n\n return {\n physicalId: networkAclId,\n attributes: {\n Id: networkAclId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create NetworkAcl ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteNetworkAcl(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting NetworkAcl ${logicalId}: ${physicalId}`);\n\n try {\n await this.ec2Client.send(new DeleteNetworkAclCommand({ NetworkAclId: physicalId }));\n this.logger.debug(`Successfully deleted NetworkAcl ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`NetworkAcl ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete NetworkAcl ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::NetworkAclEntry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createNetworkAclEntry(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating NetworkAclEntry ${logicalId}`);\n\n const networkAclId = properties['NetworkAclId'] as string;\n const ruleNumber = properties['RuleNumber'] as number;\n const protocol = properties['Protocol'] as number;\n const ruleAction = properties['RuleAction'] as string;\n const egress = (properties['Egress'] as boolean) ?? false;\n\n if (!networkAclId || ruleNumber === undefined || protocol === undefined || !ruleAction) {\n throw new ProvisioningError(\n `NetworkAclId, RuleNumber, Protocol, and RuleAction are required for NetworkAclEntry ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const cidrBlock = properties['CidrBlock'] as string | undefined;\n const ipv6CidrBlock = properties['Ipv6CidrBlock'] as string | undefined;\n const portRange = properties['PortRange'] as Record<string, unknown> | undefined;\n const icmpTypeCode = properties['IcmpTypeCode'] as Record<string, unknown> | undefined;\n\n await this.ec2Client.send(\n new CreateNetworkAclEntryCommand({\n NetworkAclId: networkAclId,\n RuleNumber: ruleNumber,\n Protocol: String(protocol),\n RuleAction: ruleAction as 'allow' | 'deny',\n Egress: egress,\n CidrBlock: cidrBlock,\n Ipv6CidrBlock: ipv6CidrBlock,\n PortRange: portRange\n ? {\n From: portRange['From'] as number,\n To: portRange['To'] as number,\n }\n : undefined,\n IcmpTypeCode: icmpTypeCode\n ? {\n Code: icmpTypeCode['Code'] as number,\n Type: icmpTypeCode['Type'] as number,\n }\n : undefined,\n })\n );\n\n const physicalId = `${networkAclId}|${ruleNumber}|${egress}`;\n this.logger.debug(`Successfully created NetworkAclEntry ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create NetworkAclEntry ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteNetworkAclEntry(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting NetworkAclEntry ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length < 3) {\n this.logger.warn(`Invalid NetworkAclEntry physical ID format: ${physicalId}, skipping`);\n return;\n }\n const networkAclId = parts[0]!;\n const ruleNumber = parseInt(parts[1]!, 10);\n const egress = parts[2] === 'true';\n\n try {\n await this.ec2Client.send(\n new DeleteNetworkAclEntryCommand({\n NetworkAclId: networkAclId,\n RuleNumber: ruleNumber,\n Egress: egress,\n })\n );\n this.logger.debug(`Successfully deleted NetworkAclEntry ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`NetworkAclEntry ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete NetworkAclEntry ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EC2::SubnetNetworkAclAssociation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSubnetNetworkAclAssociation(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating SubnetNetworkAclAssociation ${logicalId}`);\n\n const networkAclId = properties['NetworkAclId'] as string;\n const subnetId = properties['SubnetId'] as string;\n\n if (!networkAclId || !subnetId) {\n throw new ProvisioningError(\n `NetworkAclId and SubnetId are required for SubnetNetworkAclAssociation ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Find the current NACL association for the subnet\n const describeResponse = await this.ec2Client.send(\n new DescribeNetworkAclsCommand({\n Filters: [{ Name: 'association.subnet-id', Values: [subnetId] }],\n })\n );\n\n let currentAssociationId: string | undefined;\n for (const nacl of describeResponse.NetworkAcls ?? []) {\n for (const assoc of nacl.Associations ?? []) {\n if (assoc.SubnetId === subnetId) {\n currentAssociationId = assoc.NetworkAclAssociationId;\n break;\n }\n }\n if (currentAssociationId) break;\n }\n\n if (!currentAssociationId) {\n throw new ProvisioningError(\n `No current NACL association found for subnet ${subnetId}`,\n resourceType,\n logicalId\n );\n }\n\n // Replace the association\n const response = await this.ec2Client.send(\n new ReplaceNetworkAclAssociationCommand({\n AssociationId: currentAssociationId,\n NetworkAclId: networkAclId,\n })\n );\n\n const newAssociationId = response.NewAssociationId!;\n this.logger.debug(\n `Successfully created SubnetNetworkAclAssociation ${logicalId}: ${newAssociationId}`\n );\n\n return {\n physicalId: newAssociationId,\n attributes: {\n AssociationId: newAssociationId,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create SubnetNetworkAclAssociation ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Apply tags to an EC2 resource\n */\n private async applyTags(\n resourceId: string,\n properties: Record<string, unknown>,\n logicalId: string\n ): Promise<void> {\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && Array.isArray(tags) && tags.length > 0) {\n try {\n await this.ec2Client.send(\n new CreateTagsCommand({\n Resources: [resourceId],\n Tags: tags.map((t) => ({ Key: t.Key, Value: t.Value })),\n })\n );\n this.logger.debug(`Applied ${tags.length} tag(s) to ${logicalId}`);\n } catch (error) {\n this.logger.warn(\n `Failed to apply tags to ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n /**\n * Check if an error indicates the resource was not found\n */\n private isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n const name = (error as { name?: string }).name ?? '';\n return (\n message.includes('not found') ||\n message.includes('does not exist') ||\n message.includes('invalidparametervalue') ||\n name === 'InvalidVpcID.NotFound' ||\n name === 'InvalidSubnetID.NotFound' ||\n name === 'InvalidInternetGatewayID.NotFound' ||\n name === 'InvalidRouteTableID.NotFound' ||\n name === 'InvalidGroup.NotFound' ||\n name === 'InvalidAssociationID.NotFound' ||\n name === 'InvalidRoute.NotFound' ||\n name === 'InvalidInstanceID.NotFound' ||\n name === 'InvalidNetworkAclID.NotFound' ||\n name === 'InvalidNetworkAclEntry.NotFound'\n );\n }\n}\n", "import {\n APIGatewayClient,\n UpdateAccountCommand,\n CreateResourceCommand,\n DeleteResourceCommand,\n CreateDeploymentCommand,\n DeleteDeploymentCommand,\n CreateStageCommand,\n UpdateStageCommand,\n DeleteStageCommand,\n PutMethodCommand,\n DeleteMethodCommand,\n PutIntegrationCommand,\n PutMethodResponseCommand,\n CreateAuthorizerCommand,\n DeleteAuthorizerCommand,\n NotFoundException,\n} from '@aws-sdk/client-api-gateway';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS API Gateway Provider\n *\n * Implements resource provisioning for:\n * - AWS::ApiGateway::Account (API Gateway account settings)\n * - AWS::ApiGateway::Authorizer (API Gateway authorizer - Cognito, Token, Request)\n * - AWS::ApiGateway::Resource (API Gateway resource / path)\n * - AWS::ApiGateway::Deployment (API Gateway deployment)\n * - AWS::ApiGateway::Stage (API Gateway stage)\n * - AWS::ApiGateway::Method (API Gateway method)\n *\n * These resource types have issues with Cloud Control API:\n * - Account: Needs IAM trust propagation retry logic\n * - Resource: Needs parent ID resolution from properties\n * - Deployment: Needs RestApiId from Ref resolution\n * - Stage: Needs RestApiId, StageName, DeploymentId from properties\n */\nexport class ApiGatewayProvider implements ResourceProvider {\n private apiGatewayClient: APIGatewayClient;\n private logger = getLogger().child('ApiGatewayProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::ApiGateway::Account', new Set(['CloudWatchRoleArn'])],\n [\n 'AWS::ApiGateway::Authorizer',\n new Set([\n 'RestApiId',\n 'Name',\n 'Type',\n 'ProviderARNs',\n 'AuthorizerUri',\n 'AuthorizerCredentials',\n 'IdentitySource',\n 'IdentityValidationExpression',\n 'AuthorizerResultTtlInSeconds',\n ]),\n ],\n ['AWS::ApiGateway::Resource', new Set(['RestApiId', 'ParentId', 'PathPart'])],\n ['AWS::ApiGateway::Deployment', new Set(['RestApiId', 'Description'])],\n [\n 'AWS::ApiGateway::Stage',\n new Set(['RestApiId', 'StageName', 'DeploymentId', 'Description', 'Tags']),\n ],\n [\n 'AWS::ApiGateway::Method',\n new Set([\n 'RestApiId',\n 'ResourceId',\n 'HttpMethod',\n 'AuthorizationType',\n 'AuthorizerId',\n 'Integration',\n 'MethodResponses',\n ]),\n ],\n ]);\n\n /** Maximum number of retries for IAM propagation delays */\n private static readonly MAX_IAM_RETRIES = 3;\n /** Delay between IAM propagation retries (ms) - exponential backoff */\n private static readonly IAM_RETRY_DELAY_MS = 10000;\n\n constructor() {\n const awsClients = getAwsClients();\n this.apiGatewayClient = awsClients.apiGateway;\n }\n\n /**\n * Create a resource\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ApiGateway::Account':\n return this.createAccount(logicalId, resourceType, properties);\n case 'AWS::ApiGateway::Authorizer':\n return this.createAuthorizer(logicalId, resourceType, properties);\n case 'AWS::ApiGateway::Resource':\n return this.createResource(logicalId, resourceType, properties);\n case 'AWS::ApiGateway::Deployment':\n return this.createDeployment(logicalId, resourceType, properties);\n case 'AWS::ApiGateway::Stage':\n return this.createStage(logicalId, resourceType, properties);\n case 'AWS::ApiGateway::Method':\n return this.createMethod(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n /**\n * Update a resource\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::ApiGateway::Account':\n return this.updateAccount(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGateway::Authorizer':\n return this.updateAuthorizer(logicalId, physicalId, resourceType);\n case 'AWS::ApiGateway::Resource':\n return this.updateResource(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n case 'AWS::ApiGateway::Deployment':\n return this.updateDeployment(logicalId, physicalId, resourceType);\n case 'AWS::ApiGateway::Stage':\n return this.updateStage(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n case 'AWS::ApiGateway::Method':\n return this.updateMethod(logicalId, physicalId);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n /**\n * Delete a resource\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ApiGateway::Account':\n return this.deleteAccount(logicalId, physicalId, resourceType);\n case 'AWS::ApiGateway::Authorizer':\n return this.deleteAuthorizer(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGateway::Resource':\n return this.deleteResource(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGateway::Deployment':\n return this.deleteDeployment(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGateway::Stage':\n return this.deleteStage(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGateway::Method':\n return this.deleteMethod(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n /**\n * Get resource attributes (for Fn::GetAtt resolution)\n */\n async getAttribute(\n physicalId: string,\n resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n switch (resourceType) {\n case 'AWS::ApiGateway::Account':\n // Account has no useful GetAtt attributes\n return undefined;\n case 'AWS::ApiGateway::Authorizer':\n return this.getAuthorizerAttribute(physicalId, attributeName);\n case 'AWS::ApiGateway::Resource':\n return this.getResourceAttribute(physicalId, resourceType, attributeName);\n case 'AWS::ApiGateway::Deployment':\n return this.getDeploymentAttribute(physicalId, attributeName);\n case 'AWS::ApiGateway::Stage':\n return this.getStageAttribute(physicalId, attributeName);\n case 'AWS::ApiGateway::Method':\n return this.getMethodAttribute(physicalId, attributeName);\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Account \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create API Gateway Account settings\n *\n * Uses UpdateAccountCommand because API Gateway Account is a singleton.\n * Retries on \"not authorized\" errors due to IAM role trust propagation delays.\n */\n private async createAccount(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Account ${logicalId}`);\n\n const cloudWatchRoleArn = properties['CloudWatchRoleArn'] as string | undefined;\n\n try {\n await this.updateAccountWithRetry(cloudWatchRoleArn, logicalId, resourceType);\n\n this.logger.debug(`Successfully created API Gateway Account ${logicalId}`);\n\n return {\n physicalId: 'ApiGatewayAccount',\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Account ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update API Gateway Account settings\n */\n private async updateAccount(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Account ${logicalId}`);\n\n const cloudWatchRoleArn = properties['CloudWatchRoleArn'] as string | undefined;\n\n try {\n await this.updateAccountWithRetry(cloudWatchRoleArn, logicalId, resourceType);\n\n this.logger.debug(`Successfully updated API Gateway Account ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update API Gateway Account ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete API Gateway Account settings\n *\n * Clears the CloudWatch role ARN by setting it to empty string.\n */\n private async deleteAccount(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Account ${logicalId}`);\n\n try {\n await this.apiGatewayClient.send(\n new UpdateAccountCommand({\n patchOperations: [\n {\n op: 'replace',\n path: '/cloudwatchRoleArn',\n value: '',\n },\n ],\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Account ${logicalId}`);\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Account ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Update Account with retry logic for IAM propagation delays\n *\n * When a new IAM role is created and immediately assigned as the API Gateway\n * CloudWatch role, API Gateway may reject it with \"not authorized\" because\n * the IAM trust relationship hasn't fully propagated yet.\n */\n private async updateAccountWithRetry(\n cloudWatchRoleArn: string | undefined,\n logicalId: string,\n _resourceType: string\n ): Promise<void> {\n const patchOperations = cloudWatchRoleArn\n ? [\n {\n op: 'replace' as const,\n path: '/cloudwatchRoleArn',\n value: cloudWatchRoleArn,\n },\n ]\n : [];\n\n for (let attempt = 1; attempt <= ApiGatewayProvider.MAX_IAM_RETRIES; attempt++) {\n try {\n await this.apiGatewayClient.send(new UpdateAccountCommand({ patchOperations }));\n return;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isIamPropagationError =\n message.toLowerCase().includes('not authorized') ||\n message.toLowerCase().includes('does not have required permissions') ||\n message.toLowerCase().includes('the role arn does not have required trust') ||\n message.toLowerCase().includes('too many requests');\n\n if (isIamPropagationError && attempt < ApiGatewayProvider.MAX_IAM_RETRIES) {\n this.logger.warn(\n `IAM propagation delay for ${logicalId} (attempt ${attempt}/${ApiGatewayProvider.MAX_IAM_RETRIES}), ` +\n `retrying in ${ApiGatewayProvider.IAM_RETRY_DELAY_MS / 1000}s...`\n );\n await this.sleep(ApiGatewayProvider.IAM_RETRY_DELAY_MS);\n continue;\n }\n\n throw error;\n }\n }\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Authorizer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create an API Gateway Authorizer\n *\n * Physical ID is the authorizer ID (not composite), so that Ref resolves\n * to the authorizer ID that API Gateway Methods expect for AuthorizerId.\n */\n private async createAuthorizer(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Authorizer ${logicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n const name = properties['Name'] as string;\n const type = properties['Type'] as string;\n\n if (!restApiId || !name || !type) {\n throw new ProvisioningError(\n `RestApiId, Name, and Type are required for API Gateway Authorizer ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const providerArns = properties['ProviderARNs'] as string[] | undefined;\n\n const response = await this.apiGatewayClient.send(\n new CreateAuthorizerCommand({\n restApiId,\n name,\n type: type as 'TOKEN' | 'REQUEST' | 'COGNITO_USER_POOLS',\n providerARNs: providerArns,\n authorizerUri: properties['AuthorizerUri'] as string | undefined,\n authorizerCredentials: properties['AuthorizerCredentials'] as string | undefined,\n identitySource: properties['IdentitySource'] as string | undefined,\n identityValidationExpression: properties['IdentityValidationExpression'] as\n | string\n | undefined,\n authorizerResultTtlInSeconds: properties['AuthorizerResultTtlInSeconds'] as\n | number\n | undefined,\n })\n );\n\n const authorizerId = response.id!;\n this.logger.debug(\n `Successfully created API Gateway Authorizer ${logicalId}: ${authorizerId}`\n );\n\n return {\n physicalId: authorizerId,\n attributes: {\n AuthorizerId: authorizerId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Authorizer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an API Gateway Authorizer\n *\n * Authorizer updates are not commonly needed. For now, this is a no-op.\n * The deployment engine handles replacement for immutable property changes.\n */\n private updateAuthorizer(\n logicalId: string,\n physicalId: string,\n _resourceType: string\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Authorizer ${logicalId}: ${physicalId} (no-op)`);\n\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {\n AuthorizerId: physicalId,\n },\n });\n }\n\n /**\n * Delete an API Gateway Authorizer\n */\n private async deleteAuthorizer(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Authorizer ${logicalId}: ${physicalId}`);\n\n const restApiId = properties?.['RestApiId'] as string | undefined;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required to delete API Gateway Authorizer ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new DeleteAuthorizerCommand({\n restApiId,\n authorizerId: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Authorizer ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway Authorizer ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Authorizer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get API Gateway Authorizer attribute\n */\n private getAuthorizerAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'AuthorizerId') {\n return Promise.resolve(physicalId);\n }\n\n return Promise.resolve(undefined);\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Resource \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create an API Gateway Resource (path part)\n */\n private async createResource(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Resource ${logicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n const parentId = properties['ParentId'] as string;\n const pathPart = properties['PathPart'] as string;\n\n if (!restApiId || !parentId || !pathPart) {\n throw new ProvisioningError(\n `RestApiId, ParentId, and PathPart are required for API Gateway Resource ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.apiGatewayClient.send(\n new CreateResourceCommand({\n restApiId,\n parentId,\n pathPart,\n })\n );\n\n const resourceId = response.id!;\n this.logger.debug(`Successfully created API Gateway Resource ${logicalId}: ${resourceId}`);\n\n return {\n physicalId: resourceId,\n attributes: {\n ResourceId: resourceId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an API Gateway Resource\n *\n * API Gateway Resources are immutable - if PathPart changes,\n * the resource must be replaced (returns wasReplaced: true).\n */\n private async updateResource(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Resource ${logicalId}: ${physicalId}`);\n\n const newPathPart = properties['PathPart'] as string;\n const oldPathPart = previousProperties['PathPart'] as string;\n\n // PathPart is immutable - if it changed, resource must be replaced\n if (newPathPart !== oldPathPart) {\n this.logger.debug(\n `PathPart changed from \"${oldPathPart}\" to \"${newPathPart}\", replacing resource`\n );\n\n // Create new resource\n const createResult = await this.createResource(logicalId, resourceType, properties);\n\n // Delete old resource\n try {\n await this.deleteResource(logicalId, physicalId, resourceType, previousProperties);\n } catch (error) {\n this.logger.warn(\n `Failed to delete old API Gateway Resource ${physicalId} during replacement: ${String(error)}. ` +\n `The old resource may be orphaned and require manual cleanup.`\n );\n }\n\n return {\n physicalId: createResult.physicalId,\n wasReplaced: true,\n attributes: createResult.attributes ?? {},\n };\n }\n\n // No changes needed (RestApiId and ParentId changes also require replacement,\n // but the deployment engine handles those via immutable property detection)\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n ResourceId: physicalId,\n },\n };\n }\n\n /**\n * Delete an API Gateway Resource\n */\n private async deleteResource(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Resource ${logicalId}: ${physicalId}`);\n\n const restApiId = properties?.['RestApiId'] as string | undefined;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required to delete API Gateway Resource ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new DeleteResourceCommand({\n restApiId,\n resourceId: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Resource ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway Resource ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Resource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get API Gateway Resource attribute\n */\n private getResourceAttribute(\n physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n // ResourceId is the most common attribute\n if (attributeName === 'ResourceId') {\n return Promise.resolve(physicalId);\n }\n\n return Promise.resolve(undefined);\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Deployment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create an API Gateway Deployment\n */\n private async createDeployment(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Deployment ${logicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required for API Gateway Deployment ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.apiGatewayClient.send(\n new CreateDeploymentCommand({\n restApiId,\n description: properties['Description'] as string | undefined,\n })\n );\n\n const deploymentId = response.id!;\n this.logger.debug(\n `Successfully created API Gateway Deployment ${logicalId}: ${deploymentId}`\n );\n\n return {\n physicalId: deploymentId,\n attributes: {\n DeploymentId: deploymentId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Deployment ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an API Gateway Deployment\n *\n * Deployments are immutable - updates are not supported.\n * The deployment engine should handle replacement if needed.\n */\n private updateDeployment(\n logicalId: string,\n physicalId: string,\n _resourceType: string\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Deployment ${logicalId}: ${physicalId} (no-op)`);\n\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {\n DeploymentId: physicalId,\n },\n });\n }\n\n /**\n * Delete an API Gateway Deployment\n */\n private async deleteDeployment(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Deployment ${logicalId}: ${physicalId}`);\n\n const restApiId = properties?.['RestApiId'] as string | undefined;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required to delete API Gateway Deployment ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new DeleteDeploymentCommand({\n restApiId,\n deploymentId: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Deployment ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway Deployment ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Deployment ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get API Gateway Deployment attribute\n */\n private getDeploymentAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'DeploymentId') {\n return Promise.resolve(physicalId);\n }\n\n return Promise.resolve(undefined);\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create an API Gateway Stage\n */\n private async createStage(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Stage ${logicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n const stageName = properties['StageName'] as string;\n const deploymentId = properties['DeploymentId'] as string;\n\n if (!restApiId || !stageName || !deploymentId) {\n throw new ProvisioningError(\n `RestApiId, StageName, and DeploymentId are required for API Gateway Stage ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new CreateStageCommand({\n restApiId,\n stageName,\n deploymentId,\n description: properties['Description'] as string | undefined,\n tags: this.cfnTagsToRecord(properties['Tags']),\n })\n );\n\n this.logger.debug(`Successfully created API Gateway Stage ${logicalId}: ${stageName}`);\n\n return {\n physicalId: stageName,\n attributes: {\n StageName: stageName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Stage ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an API Gateway Stage\n *\n * Uses UpdateStageCommand with patch operations for changed properties.\n */\n private async updateStage(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Stage ${logicalId}: ${physicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required to update API Gateway Stage ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n // Build patch operations for changed properties\n const patchOperations: Array<{ op: 'replace'; path: string; value: string }> = [];\n\n const deploymentId = properties['DeploymentId'] as string | undefined;\n const prevDeploymentId = previousProperties['DeploymentId'] as string | undefined;\n if (deploymentId && deploymentId !== prevDeploymentId) {\n patchOperations.push({ op: 'replace', path: '/deploymentId', value: deploymentId });\n }\n\n const description = properties['Description'] as string | undefined;\n const prevDescription = previousProperties['Description'] as string | undefined;\n if (description !== prevDescription) {\n patchOperations.push({\n op: 'replace',\n path: '/description',\n value: description ?? '',\n });\n }\n\n if (patchOperations.length === 0) {\n this.logger.debug(`No changes detected for API Gateway Stage ${logicalId}`);\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n StageName: physicalId,\n },\n };\n }\n\n try {\n await this.apiGatewayClient.send(\n new UpdateStageCommand({\n restApiId,\n stageName: physicalId,\n patchOperations,\n })\n );\n\n this.logger.debug(`Successfully updated API Gateway Stage ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n StageName: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update API Gateway Stage ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an API Gateway Stage\n */\n private async deleteStage(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Stage ${logicalId}: ${physicalId}`);\n\n const restApiId = properties?.['RestApiId'] as string | undefined;\n\n if (!restApiId) {\n throw new ProvisioningError(\n `RestApiId is required to delete API Gateway Stage ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new DeleteStageCommand({\n restApiId,\n stageName: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Stage ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway Stage ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Stage ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get API Gateway Stage attribute\n */\n private getStageAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n if (attributeName === 'StageName') {\n return Promise.resolve(physicalId);\n }\n\n return Promise.resolve(undefined);\n }\n\n // \u2500\u2500\u2500 AWS::ApiGateway::Method \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Create an API Gateway Method\n *\n * Creates a method on a resource and optionally sets up the integration.\n * PhysicalId format: `{restApiId}|{resourceId}|{httpMethod}`\n */\n private async createMethod(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway Method ${logicalId}`);\n\n const restApiId = properties['RestApiId'] as string;\n const resourceId = properties['ResourceId'] as string;\n const httpMethod = properties['HttpMethod'] as string;\n const authorizationType = (properties['AuthorizationType'] as string) ?? 'NONE';\n const authorizerId = properties['AuthorizerId'] as string | undefined;\n\n if (!restApiId || !resourceId || !httpMethod) {\n throw new ProvisioningError(\n `RestApiId, ResourceId, and HttpMethod are required for API Gateway Method ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.apiGatewayClient.send(\n new PutMethodCommand({\n restApiId,\n resourceId,\n httpMethod,\n authorizationType,\n authorizerId,\n })\n );\n\n // If Integration property exists, set up the integration\n const integration = properties['Integration'] as Record<string, unknown> | undefined;\n if (integration) {\n await this.apiGatewayClient.send(\n new PutIntegrationCommand({\n restApiId,\n resourceId,\n httpMethod,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n type: integration['Type'] as any,\n integrationHttpMethod: integration['IntegrationHttpMethod'] as string | undefined,\n uri: integration['Uri'] as string | undefined,\n })\n );\n }\n\n // If MethodResponses property exists, set up method responses\n const methodResponses = properties['MethodResponses'] as\n | Array<Record<string, unknown>>\n | undefined;\n if (methodResponses) {\n for (const resp of methodResponses) {\n const statusCode = String(resp['StatusCode']);\n await this.apiGatewayClient.send(\n new PutMethodResponseCommand({\n restApiId,\n resourceId,\n httpMethod,\n statusCode,\n responseModels: resp['ResponseModels'] as Record<string, string> | undefined,\n responseParameters: resp['ResponseParameters'] as Record<string, boolean> | undefined,\n })\n );\n }\n }\n\n const physicalId = `${restApiId}|${resourceId}|${httpMethod}`;\n this.logger.debug(`Successfully created API Gateway Method ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway Method ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update an API Gateway Method\n *\n * Methods are typically replaced via new deployment, so this is a no-op.\n */\n private updateMethod(logicalId: string, physicalId: string): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating API Gateway Method ${logicalId}: ${physicalId} (no-op)`);\n\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {},\n });\n }\n\n /**\n * Delete an API Gateway Method\n *\n * Parses the composite physicalId (`restApiId|resourceId|httpMethod`) and\n * calls DeleteMethodCommand. Handles NotFoundException gracefully.\n */\n private async deleteMethod(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway Method ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length !== 3) {\n throw new ProvisioningError(\n `Invalid physicalId format for API Gateway Method ${logicalId}: expected \"restApiId|resourceId|httpMethod\", got \"${physicalId}\"`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const [restApiId, resourceId, httpMethod] = parts;\n\n try {\n await this.apiGatewayClient.send(\n new DeleteMethodCommand({\n restApiId,\n resourceId,\n httpMethod,\n })\n );\n\n this.logger.debug(`Successfully deleted API Gateway Method ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway Method ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway Method ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get API Gateway Method attribute\n */\n private getMethodAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n const parts = physicalId.split('|');\n if (parts.length === 3) {\n if (attributeName === 'RestApiId') return Promise.resolve(parts[0]);\n if (attributeName === 'ResourceId') return Promise.resolve(parts[1]);\n if (attributeName === 'HttpMethod') return Promise.resolve(parts[2]);\n }\n\n return Promise.resolve(undefined);\n }\n\n /**\n * Sleep for specified milliseconds\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Convert CloudFormation Tags (Array<{Key, Value}>) to SDK tags (Record<string, string>).\n */\n private cfnTagsToRecord(tags: unknown): Record<string, string> | undefined {\n if (!tags || !Array.isArray(tags)) return undefined;\n const result: Record<string, string> = {};\n for (const tag of tags as Array<{ Key: string; Value: string }>) {\n result[tag.Key] = tag.Value;\n }\n return result;\n }\n}\n", "import {\n ApiGatewayV2Client,\n CreateApiCommand,\n DeleteApiCommand,\n CreateStageCommand,\n DeleteStageCommand,\n CreateIntegrationCommand,\n DeleteIntegrationCommand,\n CreateRouteCommand,\n DeleteRouteCommand,\n CreateAuthorizerCommand,\n DeleteAuthorizerCommand,\n NotFoundException,\n type ProtocolType,\n type IntegrationType,\n type AuthorizationType,\n type AuthorizerType,\n} from '@aws-sdk/client-apigatewayv2';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS API Gateway V2 (HTTP API) Provider\n *\n * Implements resource provisioning for:\n * - AWS::ApiGatewayV2::Api (HTTP API)\n * - AWS::ApiGatewayV2::Stage (Stage with auto-deploy)\n * - AWS::ApiGatewayV2::Integration (Lambda/HTTP integration)\n * - AWS::ApiGatewayV2::Route (Route with route key)\n *\n * Uses local lazy init for ApiGatewayV2Client since it's not in aws-clients.ts.\n */\nexport class ApiGatewayV2Provider implements ResourceProvider {\n private client: ApiGatewayV2Client | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ApiGatewayV2Provider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::ApiGatewayV2::Api',\n new Set(['Name', 'ProtocolType', 'Description', 'CorsConfiguration', 'Tags']),\n ],\n [\n 'AWS::ApiGatewayV2::Stage',\n new Set(['ApiId', 'StageName', 'AutoDeploy', 'Description', 'Tags']),\n ],\n [\n 'AWS::ApiGatewayV2::Integration',\n new Set([\n 'ApiId',\n 'IntegrationType',\n 'IntegrationUri',\n 'IntegrationMethod',\n 'PayloadFormatVersion',\n ]),\n ],\n [\n 'AWS::ApiGatewayV2::Route',\n new Set(['ApiId', 'RouteKey', 'Target', 'AuthorizationType', 'AuthorizerId']),\n ],\n [\n 'AWS::ApiGatewayV2::Authorizer',\n new Set([\n 'ApiId',\n 'AuthorizerType',\n 'Name',\n 'IdentitySource',\n 'JwtConfiguration',\n 'AuthorizerUri',\n 'AuthorizerPayloadFormatVersion',\n ]),\n ],\n ]);\n\n private getClient(): ApiGatewayV2Client {\n if (!this.client) {\n this.client = new ApiGatewayV2Client(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ApiGatewayV2::Api':\n return this.createApi(logicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Stage':\n return this.createStage(logicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Integration':\n return this.createIntegration(logicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Route':\n return this.createRoute(logicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Authorizer':\n return this.createAuthorizer(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n // HTTP API resources are typically replaced rather than updated in-place.\n // For now, return no-op. The deployment engine handles replacement via\n // immutable property detection when needed.\n this.logger.debug(`Updating ${resourceType} ${logicalId}: ${physicalId} (no-op)`);\n\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {},\n });\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ApiGatewayV2::Api':\n return this.deleteApi(logicalId, physicalId, resourceType);\n case 'AWS::ApiGatewayV2::Stage':\n return this.deleteStage(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Integration':\n return this.deleteIntegration(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Route':\n return this.deleteRoute(logicalId, physicalId, resourceType, properties);\n case 'AWS::ApiGatewayV2::Authorizer':\n return this.deleteAuthorizer(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n getAttribute(physicalId: string, resourceType: string, attributeName: string): Promise<unknown> {\n switch (resourceType) {\n case 'AWS::ApiGatewayV2::Api':\n return Promise.resolve(this.getApiAttribute(physicalId, attributeName));\n case 'AWS::ApiGatewayV2::Stage':\n return Promise.resolve(this.getStageAttribute(physicalId, attributeName));\n case 'AWS::ApiGatewayV2::Integration':\n return Promise.resolve(this.getIntegrationAttribute(physicalId, attributeName));\n case 'AWS::ApiGatewayV2::Route':\n return Promise.resolve(this.getRouteAttribute(physicalId, attributeName));\n case 'AWS::ApiGatewayV2::Authorizer':\n if (attributeName === 'AuthorizerId') return Promise.resolve(physicalId);\n return Promise.resolve(undefined);\n default:\n return Promise.resolve(undefined);\n }\n }\n\n // \u2500\u2500\u2500 AWS::ApiGatewayV2::Api \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createApi(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway V2 Api ${logicalId}`);\n\n const name = properties['Name'] as string;\n const protocolType = properties['ProtocolType'] as string;\n\n if (!name || !protocolType) {\n throw new ProvisioningError(\n `Name and ProtocolType are required for API Gateway V2 Api ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.getClient().send(\n new CreateApiCommand({\n Name: name,\n ProtocolType: protocolType as ProtocolType,\n Description: properties['Description'] as string | undefined,\n CorsConfiguration: properties['CorsConfiguration'] as\n | {\n AllowCredentials?: boolean;\n AllowHeaders?: string[];\n AllowMethods?: string[];\n AllowOrigins?: string[];\n ExposeHeaders?: string[];\n MaxAge?: number;\n }\n | undefined,\n Tags: this.cfnTagsToRecord(properties['Tags']),\n })\n );\n\n const apiId = response.ApiId!;\n const apiEndpoint = response.ApiEndpoint!;\n this.logger.debug(`Successfully created API Gateway V2 Api ${logicalId}: ${apiId}`);\n\n return {\n physicalId: apiId,\n attributes: {\n ApiId: apiId,\n ApiEndpoint: apiEndpoint,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway V2 Api ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteApi(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway V2 Api ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteApiCommand({ ApiId: physicalId }));\n this.logger.debug(`Successfully deleted API Gateway V2 Api ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway V2 Api ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway V2 Api ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private getApiAttribute(physicalId: string, attributeName: string): unknown {\n if (attributeName === 'ApiId') return physicalId;\n // ApiEndpoint is stored in attributes at creation time\n return undefined;\n }\n\n // \u2500\u2500\u2500 AWS::ApiGatewayV2::Stage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createStage(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway V2 Stage ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const stageName = properties['StageName'] as string;\n\n if (!apiId || !stageName) {\n throw new ProvisioningError(\n `ApiId and StageName are required for API Gateway V2 Stage ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.getClient().send(\n new CreateStageCommand({\n ApiId: apiId,\n StageName: stageName,\n AutoDeploy: properties['AutoDeploy'] as boolean | undefined,\n Description: properties['Description'] as string | undefined,\n Tags: this.cfnTagsToRecord(properties['Tags']),\n })\n );\n\n this.logger.debug(`Successfully created API Gateway V2 Stage ${logicalId}: ${stageName}`);\n\n return {\n physicalId: stageName,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway V2 Stage ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteStage(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway V2 Stage ${logicalId}: ${physicalId}`);\n\n const apiId = properties?.['ApiId'] as string | undefined;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required to delete Stage ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(new DeleteStageCommand({ ApiId: apiId, StageName: physicalId }));\n this.logger.debug(`Successfully deleted API Gateway V2 Stage ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway V2 Stage ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway V2 Stage ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private getStageAttribute(physicalId: string, attributeName: string): unknown {\n if (attributeName === 'StageName') return physicalId;\n return undefined;\n }\n\n // \u2500\u2500\u2500 AWS::ApiGatewayV2::Integration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createIntegration(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway V2 Integration ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const integrationType = properties['IntegrationType'] as string;\n\n if (!apiId || !integrationType) {\n throw new ProvisioningError(\n `ApiId and IntegrationType are required for API Gateway V2 Integration ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.getClient().send(\n new CreateIntegrationCommand({\n ApiId: apiId,\n IntegrationType: integrationType as IntegrationType,\n IntegrationUri: properties['IntegrationUri'] as string | undefined,\n IntegrationMethod: properties['IntegrationMethod'] as string | undefined,\n PayloadFormatVersion: properties['PayloadFormatVersion'] as string | undefined,\n })\n );\n\n const integrationId = response.IntegrationId!;\n this.logger.debug(\n `Successfully created API Gateway V2 Integration ${logicalId}: ${integrationId}`\n );\n\n return {\n physicalId: integrationId,\n attributes: {\n IntegrationId: integrationId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway V2 Integration ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteIntegration(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway V2 Integration ${logicalId}: ${physicalId}`);\n\n const apiId = properties?.['ApiId'] as string | undefined;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required to delete Integration ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(\n new DeleteIntegrationCommand({ ApiId: apiId, IntegrationId: physicalId })\n );\n this.logger.debug(`Successfully deleted API Gateway V2 Integration ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(\n `API Gateway V2 Integration ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway V2 Integration ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private getIntegrationAttribute(physicalId: string, attributeName: string): unknown {\n if (attributeName === 'IntegrationId') return physicalId;\n return undefined;\n }\n\n // \u2500\u2500\u2500 AWS::ApiGatewayV2::Route \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createRoute(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway V2 Route ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const routeKey = properties['RouteKey'] as string;\n\n if (!apiId || !routeKey) {\n throw new ProvisioningError(\n `ApiId and RouteKey are required for API Gateway V2 Route ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.getClient().send(\n new CreateRouteCommand({\n ApiId: apiId,\n RouteKey: routeKey,\n Target: properties['Target'] as string | undefined,\n AuthorizationType: properties['AuthorizationType'] as AuthorizationType | undefined,\n AuthorizerId: properties['AuthorizerId'] as string | undefined,\n })\n );\n\n const routeId = response.RouteId!;\n this.logger.debug(`Successfully created API Gateway V2 Route ${logicalId}: ${routeId}`);\n\n return {\n physicalId: routeId,\n attributes: {\n RouteId: routeId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway V2 Route ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteRoute(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway V2 Route ${logicalId}: ${physicalId}`);\n\n const apiId = properties?.['ApiId'] as string | undefined;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required to delete Route ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(new DeleteRouteCommand({ ApiId: apiId, RouteId: physicalId }));\n this.logger.debug(`Successfully deleted API Gateway V2 Route ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`API Gateway V2 Route ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway V2 Route ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private getRouteAttribute(physicalId: string, attributeName: string): unknown {\n if (attributeName === 'RouteId') return physicalId;\n return undefined;\n }\n\n // \u2500\u2500\u2500 AWS::ApiGatewayV2::Authorizer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createAuthorizer(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating API Gateway V2 Authorizer ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const authorizerType = properties['AuthorizerType'] as string;\n const name = (properties['Name'] as string) || logicalId;\n\n if (!apiId || !authorizerType) {\n throw new ProvisioningError(\n `ApiId and AuthorizerType are required for API Gateway V2 Authorizer ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await this.getClient().send(\n new CreateAuthorizerCommand({\n ApiId: apiId,\n AuthorizerType: authorizerType as AuthorizerType,\n Name: name,\n IdentitySource: (properties['IdentitySource'] as string | string[] | undefined)\n ? typeof properties['IdentitySource'] === 'string'\n ? [properties['IdentitySource']]\n : (properties['IdentitySource'] as string[])\n : undefined,\n JwtConfiguration: properties['JwtConfiguration'] as\n | { Audience?: string[]; Issuer?: string }\n | undefined,\n AuthorizerUri: properties['AuthorizerUri'] as string | undefined,\n AuthorizerPayloadFormatVersion: properties['AuthorizerPayloadFormatVersion'] as\n | string\n | undefined,\n })\n );\n\n const authorizerId = response.AuthorizerId!;\n this.logger.debug(\n `Successfully created API Gateway V2 Authorizer ${logicalId}: ${authorizerId}`\n );\n\n return {\n physicalId: authorizerId,\n attributes: {\n AuthorizerId: authorizerId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create API Gateway V2 Authorizer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteAuthorizer(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting API Gateway V2 Authorizer ${logicalId}: ${physicalId}`);\n\n const apiId = properties?.['ApiId'] as string | undefined;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required to delete Authorizer ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(\n new DeleteAuthorizerCommand({ ApiId: apiId, AuthorizerId: physicalId })\n );\n this.logger.debug(`Successfully deleted API Gateway V2 Authorizer ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(\n `API Gateway V2 Authorizer ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete API Gateway V2 Authorizer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Convert CloudFormation Tags (Array<{Key, Value}>) to SDK Tags (Record<string, string>).\n */\n private cfnTagsToRecord(tags: unknown): Record<string, string> | undefined {\n if (!tags || !Array.isArray(tags)) return undefined;\n const result: Record<string, string> = {};\n for (const tag of tags as Array<{ Key: string; Value: string }>) {\n result[tag.Key] = tag.Value;\n }\n return result;\n }\n}\n", "import {\n CloudFrontClient,\n CreateCloudFrontOriginAccessIdentityCommand,\n DeleteCloudFrontOriginAccessIdentityCommand,\n GetCloudFrontOriginAccessIdentityCommand,\n NoSuchCloudFrontOriginAccessIdentity,\n} from '@aws-sdk/client-cloudfront';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS::CloudFront::CloudFrontOriginAccessIdentity\n *\n * CC API DELETE fails with \"Invalid request provided\" for this resource type.\n * Using CloudFront SDK directly for reliable CRUD operations.\n */\nexport class CloudFrontOAIProvider implements ResourceProvider {\n private cloudFrontClient: CloudFrontClient;\n private logger = getLogger().child('CloudFrontOAIProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::CloudFront::CloudFrontOriginAccessIdentity',\n new Set(['CloudFrontOriginAccessIdentityConfig']),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.cloudFrontClient = awsClients.cloudFront;\n }\n\n /**\n * Create a CloudFront Origin Access Identity\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CloudFront OAI ${logicalId}`);\n\n const config = properties['CloudFrontOriginAccessIdentityConfig'] as\n | Record<string, unknown>\n | undefined;\n const comment = (config?.['Comment'] as string | undefined) ?? '';\n\n try {\n const response = await this.cloudFrontClient.send(\n new CreateCloudFrontOriginAccessIdentityCommand({\n CloudFrontOriginAccessIdentityConfig: {\n CallerReference: logicalId,\n Comment: comment,\n },\n })\n );\n\n const oai = response.CloudFrontOriginAccessIdentity!;\n const oaiId = oai.Id!;\n const s3CanonicalUserId = oai.S3CanonicalUserId!;\n\n this.logger.debug(`Created CloudFront OAI: ${oaiId}`);\n\n return {\n physicalId: oaiId,\n attributes: {\n Id: oaiId,\n S3CanonicalUserId: s3CanonicalUserId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CloudFront OAI ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a CloudFront Origin Access Identity\n *\n * OAI config is effectively immutable (only Comment can change, which is cosmetic).\n * No replacement needed for Comment changes.\n */\n update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Update requested for CloudFront OAI ${logicalId}: ${physicalId} (no-op)`);\n\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n });\n }\n\n /**\n * Delete a CloudFront Origin Access Identity\n *\n * Requires fetching the ETag first, then passing it as IfMatch for deletion.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting CloudFront OAI ${logicalId}: ${physicalId}`);\n\n try {\n // Get the current ETag (required for deletion)\n let etag: string;\n try {\n const getResponse = await this.cloudFrontClient.send(\n new GetCloudFrontOriginAccessIdentityCommand({ Id: physicalId })\n );\n etag = getResponse.ETag!;\n } catch (error) {\n if (error instanceof NoSuchCloudFrontOriginAccessIdentity) {\n this.logger.debug(`OAI ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Delete the OAI with the ETag\n await this.cloudFrontClient.send(\n new DeleteCloudFrontOriginAccessIdentityCommand({\n Id: physicalId,\n IfMatch: etag,\n })\n );\n\n this.logger.debug(`Successfully deleted CloudFront OAI ${logicalId}`);\n } catch (error) {\n if (error instanceof NoSuchCloudFrontOriginAccessIdentity) {\n this.logger.debug(`OAI ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CloudFront OAI ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get resource attribute (for Fn::GetAtt resolution)\n */\n async getAttribute(\n physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n if (attributeName === 'Id') {\n return physicalId;\n }\n\n if (attributeName === 'S3CanonicalUserId') {\n const response = await this.cloudFrontClient.send(\n new GetCloudFrontOriginAccessIdentityCommand({ Id: physicalId })\n );\n return response.CloudFrontOriginAccessIdentity?.S3CanonicalUserId;\n }\n\n throw new Error(\n `Unsupported attribute: ${attributeName} for AWS::CloudFront::CloudFrontOriginAccessIdentity`\n );\n }\n}\n", "import {\n CloudFrontClient,\n CreateDistributionCommand,\n UpdateDistributionCommand,\n DeleteDistributionCommand,\n GetDistributionCommand,\n GetDistributionConfigCommand,\n NoSuchDistribution,\n type DistributionConfig,\n} from '@aws-sdk/client-cloudfront';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * Fields in the DistributionConfig that follow the { Quantity, Items } pattern.\n * The CDK template may provide just Items (an array); we wrap it with Quantity.\n */\nconst QUANTITY_ITEM_FIELDS = [\n 'Origins',\n 'CacheBehaviors',\n 'CustomErrorResponses',\n 'Aliases',\n 'OriginGroups',\n];\n\n/**\n * Nested fields inside each CacheBehavior / DefaultCacheBehavior that use\n * the Quantity + Items pattern.\n */\nconst CACHE_BEHAVIOR_QUANTITY_FIELDS = [\n 'AllowedMethods',\n 'CachedMethods',\n 'LambdaFunctionAssociations',\n 'FunctionAssociations',\n 'ForwardedValues.Headers',\n 'ForwardedValues.QueryStringCacheKeys',\n 'ForwardedValues.Cookies.WhitelistedNames',\n 'TrustedSigners',\n 'TrustedKeyGroups',\n];\n\n/**\n * SDK Provider for AWS::CloudFront::Distribution\n *\n * Uses the CloudFront SDK directly for reliable CRUD operations.\n * CloudFront Distribution has a complex nested DistributionConfig structure\n * requiring Quantity + Items pattern conversions for SDK compatibility.\n */\nexport class CloudFrontDistributionProvider implements ResourceProvider {\n private cloudFrontClient: CloudFrontClient;\n private logger = getLogger().child('CloudFrontDistributionProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::CloudFront::Distribution', new Set(['DistributionConfig'])],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.cloudFrontClient = awsClients.cloudFront;\n }\n\n /**\n * Create a CloudFront Distribution\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CloudFront Distribution ${logicalId}`);\n\n try {\n const distributionConfig =\n (properties['DistributionConfig'] as Record<string, unknown>) ?? {};\n const sdkConfig = this.convertToSdkFormat({\n ...distributionConfig,\n CallerReference: `${Date.now()}-${logicalId}-${Math.random().toString(36).slice(2, 8)}`,\n });\n\n const response = await this.cloudFrontClient.send(\n new CreateDistributionCommand({\n DistributionConfig: sdkConfig as unknown as DistributionConfig,\n })\n );\n\n const distribution = response.Distribution!;\n const distributionId = distribution.Id!;\n const domainName = distribution.DomainName!;\n\n this.logger.debug(`Created CloudFront Distribution: ${distributionId} (${domainName})`);\n\n // Wait for distribution to be fully deployed (like CloudFormation does)\n // Skip with --no-wait or CDKD_NO_WAIT=true\n if (process.env['CDKD_NO_WAIT'] !== 'true') {\n this.logger.debug(`Waiting for Distribution ${distributionId} to reach Deployed status...`);\n await this.waitForDistributionDeployed(distributionId);\n }\n\n return {\n physicalId: distributionId,\n attributes: {\n Id: distributionId,\n DistributionId: distributionId,\n DomainName: domainName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CloudFront Distribution ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a CloudFront Distribution\n *\n * Gets the current config via GetDistributionConfigCommand, merges new properties,\n * then calls UpdateDistributionCommand with the required IfMatch ETag.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CloudFront Distribution ${logicalId}: ${physicalId}`);\n\n try {\n // Get current config and ETag\n const getConfigResponse = await this.cloudFrontClient.send(\n new GetDistributionConfigCommand({ Id: physicalId })\n );\n const etag = getConfigResponse.ETag!;\n const currentConfig = getConfigResponse.DistributionConfig!;\n\n // Merge new properties into existing config, preserving CallerReference\n const newDistributionConfig =\n (properties['DistributionConfig'] as Record<string, unknown>) ?? {};\n const sdkConfig = this.convertToSdkFormat({\n ...newDistributionConfig,\n CallerReference: currentConfig.CallerReference,\n });\n\n await this.cloudFrontClient.send(\n new UpdateDistributionCommand({\n Id: physicalId,\n IfMatch: etag,\n DistributionConfig: sdkConfig as unknown as DistributionConfig,\n })\n );\n\n // Get updated distribution for attributes\n const getResponse = await this.cloudFrontClient.send(\n new GetDistributionCommand({ Id: physicalId })\n );\n const domainName = getResponse.Distribution?.DomainName ?? '';\n\n this.logger.debug(`Updated CloudFront Distribution ${physicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n DistributionId: physicalId,\n DomainName: domainName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CloudFront Distribution ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a CloudFront Distribution\n *\n * CloudFront requires distributions to be disabled before deletion.\n * Steps:\n * 1. Get current config + ETag\n * 2. If Enabled, update to Enabled=false and wait\n * 3. Delete with the latest ETag\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting CloudFront Distribution ${logicalId}: ${physicalId}`);\n\n try {\n // Step 1: Get current config\n let etag: string;\n let config;\n try {\n const getConfigResponse = await this.cloudFrontClient.send(\n new GetDistributionConfigCommand({ Id: physicalId })\n );\n etag = getConfigResponse.ETag!;\n config = getConfigResponse.DistributionConfig!;\n } catch (error) {\n if (error instanceof NoSuchDistribution) {\n this.logger.debug(`Distribution ${physicalId} does not exist, skipping deletion`);\n return;\n }\n throw error;\n }\n\n // Step 2: Disable the distribution if it is currently enabled\n if (config.Enabled) {\n this.logger.debug(`Disabling CloudFront Distribution ${physicalId} before deletion`);\n config.Enabled = false;\n\n const updateResponse = await this.cloudFrontClient.send(\n new UpdateDistributionCommand({\n Id: physicalId,\n IfMatch: etag,\n DistributionConfig: config,\n })\n );\n etag = updateResponse.ETag!;\n\n // Wait for the distribution to be fully deployed (Disabled state)\n await this.waitForDistributionDeployed(physicalId);\n\n // Re-fetch ETag after waiting (state may have changed)\n const refreshResponse = await this.cloudFrontClient.send(\n new GetDistributionConfigCommand({ Id: physicalId })\n );\n etag = refreshResponse.ETag!;\n }\n\n // Step 3: Delete the distribution\n await this.cloudFrontClient.send(\n new DeleteDistributionCommand({\n Id: physicalId,\n IfMatch: etag,\n })\n );\n\n this.logger.debug(`Successfully deleted CloudFront Distribution ${logicalId}`);\n } catch (error) {\n if (error instanceof NoSuchDistribution) {\n this.logger.debug(`Distribution ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CloudFront Distribution ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get resource attribute (for Fn::GetAtt resolution)\n */\n async getAttribute(\n physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n if (attributeName === 'Id' || attributeName === 'DistributionId') {\n return physicalId;\n }\n\n if (attributeName === 'DomainName') {\n const response = await this.cloudFrontClient.send(\n new GetDistributionCommand({ Id: physicalId })\n );\n return response.Distribution?.DomainName;\n }\n\n throw new Error(`Unsupported attribute: ${attributeName} for AWS::CloudFront::Distribution`);\n }\n\n /**\n * Wait for a distribution to reach \"Deployed\" status.\n * Uses exponential backoff polling.\n */\n private async waitForDistributionDeployed(distributionId: string): Promise<void> {\n const maxAttempts = 60;\n let delay = 5000; // start at 5s\n const maxDelay = 30000;\n let interrupted = false;\n\n const sigintHandler = () => {\n interrupted = true;\n };\n process.on('SIGINT', sigintHandler);\n\n try {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (interrupted) {\n this.logger.debug(\n `Distribution ${distributionId} wait interrupted by SIGINT, proceeding`\n );\n return;\n }\n\n const response = await this.cloudFrontClient.send(\n new GetDistributionCommand({ Id: distributionId })\n );\n const status = response.Distribution?.Status;\n\n if (status === 'Deployed') {\n this.logger.debug(`Distribution ${distributionId} is now Deployed`);\n return;\n }\n\n this.logger.debug(\n `Distribution ${distributionId} status: ${status} (attempt ${attempt}/${maxAttempts})`\n );\n\n // Interruptible sleep: check SIGINT every second\n const sleepEnd = Date.now() + delay;\n while (Date.now() < sleepEnd && !interrupted) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n delay = Math.min(delay * 1.5, maxDelay);\n }\n\n this.logger.debug(\n `Distribution ${distributionId} did not reach Deployed status within timeout, proceeding with deletion attempt`\n );\n } finally {\n process.removeListener('SIGINT', sigintHandler);\n }\n }\n\n /**\n * Convert CDK/CloudFormation DistributionConfig format to SDK format.\n *\n * The main transformation is adding Quantity fields where the SDK expects\n * the { Quantity: N, Items: [...] } pattern, while CDK templates typically\n * provide just the Items array or an object with only Items.\n */\n private convertToSdkFormat(config: Record<string, unknown>): Record<string, unknown> {\n const result = { ...config };\n\n // Ensure Comment is never null (SDK requires non-null string)\n if (result['Comment'] === null || result['Comment'] === undefined) {\n result['Comment'] = '';\n }\n\n // Ensure Logging has IncludeCookies and Enabled defaults\n if (result['Logging'] && typeof result['Logging'] === 'object') {\n const logging = result['Logging'] as Record<string, unknown>;\n if (logging['IncludeCookies'] === undefined) logging['IncludeCookies'] = false;\n if (logging['Enabled'] === undefined) logging['Enabled'] = true;\n if (logging['Prefix'] === undefined) logging['Prefix'] = '';\n }\n\n // Convert top-level Quantity + Items fields\n for (const field of QUANTITY_ITEM_FIELDS) {\n if (result[field] !== undefined) {\n result[field] = this.wrapWithQuantity(result[field]);\n }\n }\n\n // Convert nested Quantity + Items fields inside DefaultCacheBehavior\n if (result['DefaultCacheBehavior'] && typeof result['DefaultCacheBehavior'] === 'object') {\n result['DefaultCacheBehavior'] = this.convertCacheBehavior(\n result['DefaultCacheBehavior'] as Record<string, unknown>\n );\n }\n\n // Convert nested Quantity + Items fields inside each CacheBehavior\n if (result['CacheBehaviors'] && typeof result['CacheBehaviors'] === 'object') {\n const cacheBehaviors = result['CacheBehaviors'] as Record<string, unknown>;\n if (Array.isArray(cacheBehaviors['Items'])) {\n cacheBehaviors['Items'] = (cacheBehaviors['Items'] as Record<string, unknown>[]).map((cb) =>\n this.convertCacheBehavior(cb)\n );\n }\n }\n\n // Convert Origins items - nested Quantity + Items fields (e.g., CustomHeaders)\n if (result['Origins'] && typeof result['Origins'] === 'object') {\n const origins = result['Origins'] as Record<string, unknown>;\n if (Array.isArray(origins['Items'])) {\n origins['Items'] = (origins['Items'] as Record<string, unknown>[]).map((origin) =>\n this.convertOrigin(origin)\n );\n }\n }\n\n return result;\n }\n\n /**\n * Wrap a value with the Quantity + Items pattern if needed.\n *\n * Handles three cases:\n * - Array: wrap as { Quantity: len, Items: array }\n * - Object with Items but no Quantity: add Quantity\n * - Already has Quantity: leave as-is\n */\n private wrapWithQuantity(value: unknown): unknown {\n if (Array.isArray(value)) {\n return { Quantity: value.length, Items: value };\n }\n\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (Array.isArray(obj['Items']) && obj['Quantity'] === undefined) {\n return { ...obj, Quantity: (obj['Items'] as unknown[]).length };\n }\n }\n\n return value;\n }\n\n /**\n * Convert Quantity + Items fields nested inside a CacheBehavior.\n */\n private convertCacheBehavior(behavior: Record<string, unknown>): Record<string, unknown> {\n const result = { ...behavior };\n\n for (const fieldPath of CACHE_BEHAVIOR_QUANTITY_FIELDS) {\n const parts = fieldPath.split('.');\n this.applyQuantityAtPath(result, parts);\n }\n\n return result;\n }\n\n /**\n * Convert nested Quantity + Items fields inside an Origin.\n * Handles CustomHeaders and S3OriginConfig/CustomOriginConfig nested fields.\n */\n private convertOrigin(origin: Record<string, unknown>): Record<string, unknown> {\n const result = { ...origin };\n\n // CustomHeaders uses the Quantity + Items pattern\n if (result['CustomHeaders'] !== undefined) {\n result['CustomHeaders'] = this.wrapWithQuantity(result['CustomHeaders']);\n }\n\n // S3OriginConfig does not need Quantity wrapping (it's a simple object)\n // CustomOriginConfig.OriginSslProtocols uses Quantity + Items\n if (result['CustomOriginConfig'] && typeof result['CustomOriginConfig'] === 'object') {\n const customOriginConfig = { ...(result['CustomOriginConfig'] as Record<string, unknown>) };\n if (customOriginConfig['OriginSslProtocols'] !== undefined) {\n customOriginConfig['OriginSslProtocols'] = this.wrapWithQuantity(\n customOriginConfig['OriginSslProtocols']\n );\n }\n // Ensure HTTPPort and HTTPSPort have defaults (SDK requires non-null values)\n if (customOriginConfig['HTTPPort'] === null || customOriginConfig['HTTPPort'] === undefined) {\n customOriginConfig['HTTPPort'] = 80;\n }\n if (\n customOriginConfig['HTTPSPort'] === null ||\n customOriginConfig['HTTPSPort'] === undefined\n ) {\n customOriginConfig['HTTPSPort'] = 443;\n }\n result['CustomOriginConfig'] = customOriginConfig;\n }\n\n return result;\n }\n\n /**\n * Apply Quantity wrapping at a nested path (e.g., \"ForwardedValues.Headers\").\n */\n private applyQuantityAtPath(obj: Record<string, unknown>, path: string[]): void {\n if (path.length === 0) return;\n\n if (path.length === 1) {\n const key = path[0]!;\n if (obj[key] !== undefined) {\n obj[key] = this.wrapWithQuantity(obj[key]);\n }\n return;\n }\n\n const [head, ...rest] = path;\n const headKey = head!;\n if (obj[headKey] && typeof obj[headKey] === 'object') {\n // Shallow copy the nested object to avoid mutating the original\n const nested = { ...(obj[headKey] as Record<string, unknown>) };\n obj[headKey] = nested;\n this.applyQuantityAtPath(nested, rest);\n }\n }\n}\n", "/**\n * SDK Provider for AWS::BedrockAgentCore::Runtime\n *\n * Uses direct SDK calls instead of Cloud Control API because:\n * 1. CC API CREATE is async - it returns IN_PROGRESS, then polls for completion\n * 2. IAM role propagation to BedrockAgentCore is very slow (30-60+ seconds)\n * 3. When CC API polling returns FAILED (role validation), cdkd retries CREATE\n * 4. But the first CREATE actually succeeded asynchronously in the background\n * 5. The retry then fails with \"already exists\"\n * 6. CC API ClientToken caches the failure result, making it worse\n *\n * With direct SDK calls, we can:\n * - Call CreateAgentRuntime synchronously\n * - Get immediate error responses for IAM propagation issues\n * - Retry with proper exponential backoff\n * - Avoid the async CREATE + polling + retry conflict\n */\nimport {\n BedrockAgentCoreControlClient,\n CreateAgentRuntimeCommand,\n UpdateAgentRuntimeCommand,\n DeleteAgentRuntimeCommand,\n GetAgentRuntimeCommand,\n ResourceNotFoundException,\n} from '@aws-sdk/client-bedrock-agentcore-control';\nimport { getLogger } from '../../utils/logger.js';\n\n/**\n * Recursively convert PascalCase object keys to camelCase.\n * Only converts keys of plain objects; string values, arrays of strings,\n * and other primitives are left untouched.\n */\nfunction pascalToCamelCaseKeys(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(pascalToCamelCaseKeys);\n }\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n const camelKey = key.charAt(0).toLowerCase() + key.slice(1);\n result[camelKey] = pascalToCamelCaseKeys(val);\n }\n return result;\n }\n return value;\n}\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS BedrockAgentCore Runtime Provider\n *\n * Implements resource provisioning for AWS::BedrockAgentCore::Runtime using the\n * BedrockAgentCoreControl SDK.\n */\nexport class AgentCoreRuntimeProvider implements ResourceProvider {\n private client: BedrockAgentCoreControlClient;\n private logger = getLogger().child('AgentCoreRuntimeProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::BedrockAgentCore::Runtime',\n new Set([\n 'AgentRuntimeName',\n 'RoleArn',\n 'AgentRuntimeArtifact',\n 'NetworkConfiguration',\n 'Description',\n 'AuthorizerConfiguration',\n 'ProtocolConfiguration',\n 'LifecycleConfiguration',\n 'EnvironmentVariables',\n 'ClientToken',\n ]),\n ],\n ]);\n\n constructor() {\n const awsClients = getAwsClients();\n this.client = awsClients.bedrockAgentCoreControl;\n }\n\n /**\n * Create a BedrockAgentCore Runtime\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating BedrockAgentCore Runtime ${logicalId}`);\n\n const agentRuntimeName = properties['AgentRuntimeName'] as string;\n if (!agentRuntimeName) {\n throw new ProvisioningError(\n `AgentRuntimeName is required for ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const roleArn = properties['RoleArn'] as string;\n if (!roleArn) {\n throw new ProvisioningError(`RoleArn is required for ${logicalId}`, resourceType, logicalId);\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const input: Record<string, any> = {\n agentRuntimeName,\n roleArn,\n };\n\n if (properties['AgentRuntimeArtifact'] !== undefined) {\n input['agentRuntimeArtifact'] = pascalToCamelCaseKeys(properties['AgentRuntimeArtifact']);\n }\n if (properties['NetworkConfiguration'] !== undefined) {\n input['networkConfiguration'] = pascalToCamelCaseKeys(properties['NetworkConfiguration']);\n }\n if (properties['Description'] !== undefined) {\n input['description'] = properties['Description'];\n }\n if (properties['AuthorizerConfiguration'] !== undefined) {\n input['authorizerConfiguration'] = pascalToCamelCaseKeys(\n properties['AuthorizerConfiguration']\n );\n }\n if (properties['ProtocolConfiguration'] !== undefined) {\n // CFn template has ProtocolConfiguration as a string (e.g. \"HTTP\"),\n // but the SDK expects an object { serverProtocol: \"HTTP\" }\n const proto = properties['ProtocolConfiguration'];\n if (typeof proto === 'string') {\n input['protocolConfiguration'] = { serverProtocol: proto };\n } else {\n input['protocolConfiguration'] = pascalToCamelCaseKeys(proto);\n }\n }\n // Skip empty LifecycleConfiguration (CFn template may have {} which SDK rejects)\n if (\n properties['LifecycleConfiguration'] !== undefined &&\n typeof properties['LifecycleConfiguration'] === 'object' &&\n properties['LifecycleConfiguration'] !== null &&\n Object.keys(properties['LifecycleConfiguration'] as Record<string, unknown>).length > 0\n ) {\n input['lifecycleConfiguration'] = pascalToCamelCaseKeys(\n properties['LifecycleConfiguration']\n );\n }\n if (properties['EnvironmentVariables'] !== undefined) {\n input['environmentVariables'] = properties['EnvironmentVariables'];\n }\n if (properties['ClientToken'] !== undefined) {\n input['clientToken'] = properties['ClientToken'];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const response = await this.client.send(new CreateAgentRuntimeCommand(input as any));\n\n const agentRuntimeId = response.agentRuntimeId!;\n const agentRuntimeArn = response.agentRuntimeArn!;\n\n this.logger.debug(`Created BedrockAgentCore Runtime: ${agentRuntimeId} (${agentRuntimeArn})`);\n\n return {\n physicalId: agentRuntimeId,\n attributes: {\n Arn: agentRuntimeArn,\n AgentRuntimeId: agentRuntimeId,\n AgentRuntimeName: agentRuntimeName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create BedrockAgentCore Runtime ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a BedrockAgentCore Runtime\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating BedrockAgentCore Runtime ${logicalId}: ${physicalId}`);\n\n const roleArn = properties['RoleArn'] as string;\n if (!roleArn) {\n throw new ProvisioningError(\n `RoleArn is required for ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const input: Record<string, any> = {\n agentRuntimeId: physicalId,\n roleArn,\n };\n\n if (properties['AgentRuntimeArtifact'] !== undefined) {\n input['agentRuntimeArtifact'] = pascalToCamelCaseKeys(properties['AgentRuntimeArtifact']);\n }\n if (properties['NetworkConfiguration'] !== undefined) {\n input['networkConfiguration'] = pascalToCamelCaseKeys(properties['NetworkConfiguration']);\n }\n if (properties['Description'] !== undefined) {\n input['description'] = properties['Description'];\n }\n if (properties['AuthorizerConfiguration'] !== undefined) {\n input['authorizerConfiguration'] = pascalToCamelCaseKeys(\n properties['AuthorizerConfiguration']\n );\n }\n if (properties['ProtocolConfiguration'] !== undefined) {\n const proto = properties['ProtocolConfiguration'];\n if (typeof proto === 'string') {\n input['protocolConfiguration'] = { serverProtocol: proto };\n } else {\n input['protocolConfiguration'] = pascalToCamelCaseKeys(proto);\n }\n }\n if (\n properties['LifecycleConfiguration'] !== undefined &&\n typeof properties['LifecycleConfiguration'] === 'object' &&\n properties['LifecycleConfiguration'] !== null &&\n Object.keys(properties['LifecycleConfiguration'] as Record<string, unknown>).length > 0\n ) {\n input['lifecycleConfiguration'] = pascalToCamelCaseKeys(\n properties['LifecycleConfiguration']\n );\n }\n if (properties['EnvironmentVariables'] !== undefined) {\n input['environmentVariables'] = properties['EnvironmentVariables'];\n }\n if (properties['ClientToken'] !== undefined) {\n input['clientToken'] = properties['ClientToken'];\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any\n const response = await this.client.send(new UpdateAgentRuntimeCommand(input as any));\n\n const agentRuntimeArn = response.agentRuntimeArn!;\n const agentRuntimeId = response.agentRuntimeId!;\n\n this.logger.debug(`Successfully updated BedrockAgentCore Runtime ${logicalId}`);\n\n return {\n physicalId: agentRuntimeId,\n wasReplaced: false,\n attributes: {\n Arn: agentRuntimeArn,\n AgentRuntimeId: agentRuntimeId,\n AgentRuntimeName: properties['AgentRuntimeName'] as string,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update BedrockAgentCore Runtime ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a BedrockAgentCore Runtime\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting BedrockAgentCore Runtime ${logicalId}: ${physicalId}`);\n\n try {\n await this.client.send(\n new DeleteAgentRuntimeCommand({\n agentRuntimeId: physicalId,\n })\n );\n\n this.logger.debug(`Successfully deleted BedrockAgentCore Runtime ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Runtime ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete BedrockAgentCore Runtime ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Get resource attribute (for Fn::GetAtt resolution)\n */\n async getAttribute(\n physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n if (attributeName === 'Arn' || attributeName === 'AgentRuntimeArn') {\n const response = await this.client.send(\n new GetAgentRuntimeCommand({ agentRuntimeId: physicalId })\n );\n return response.agentRuntimeArn;\n }\n\n if (attributeName === 'AgentRuntimeId') {\n return physicalId;\n }\n\n if (attributeName === 'AgentRuntimeName') {\n const response = await this.client.send(\n new GetAgentRuntimeCommand({ agentRuntimeId: physicalId })\n );\n return response.agentRuntimeName;\n }\n\n throw new Error(`Unsupported attribute: ${attributeName} for AWS::BedrockAgentCore::Runtime`);\n }\n}\n", "import {\n SFNClient,\n CreateStateMachineCommand,\n UpdateStateMachineCommand,\n DeleteStateMachineCommand,\n DescribeStateMachineCommand,\n StateMachineDoesNotExist,\n type CreateStateMachineCommandInput,\n type LoggingConfiguration,\n type TracingConfiguration,\n type EncryptionConfiguration,\n type Tag,\n type StateMachineType,\n} from '@aws-sdk/client-sfn';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Step Functions State Machine Provider\n *\n * Implements resource provisioning for AWS::StepFunctions::StateMachine using the SFN SDK.\n * WHY: SFN CreateStateMachine is synchronous - the CC API adds unnecessary polling\n * overhead (1s->2s->4s->8s) for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class StepFunctionsProvider implements ResourceProvider {\n private sfnClient?: SFNClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('StepFunctionsProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::StepFunctions::StateMachine',\n new Set([\n 'StateMachineName',\n 'RoleArn',\n 'StateMachineType',\n 'LoggingConfiguration',\n 'TracingConfiguration',\n 'Tags',\n 'DefinitionString',\n 'Definition',\n 'DefinitionSubstitutions',\n 'EncryptionConfiguration',\n ]),\n ],\n ]);\n\n private getClient(): SFNClient {\n if (!this.sfnClient) {\n this.sfnClient = new SFNClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.sfnClient;\n }\n\n /**\n * Create a Step Functions state machine\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Step Functions state machine ${logicalId}`);\n\n const stateMachineName =\n (properties['StateMachineName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 80 });\n const roleArn = properties['RoleArn'] as string | undefined;\n\n if (!roleArn) {\n throw new ProvisioningError(\n `RoleArn is required for Step Functions state machine ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n // Build definition string - handle both string and object forms\n const definitionString = this.buildDefinitionString(properties);\n\n // Build tags: CDK uses [{Key, Value}], SFN SDK uses [{key, value}]\n let tags: Tag[] | undefined;\n if (properties['Tags']) {\n const tagList = properties['Tags'] as Array<{ Key: string; Value: string }>;\n tags = tagList.map((tag) => ({ key: tag.Key, value: tag.Value }));\n }\n\n // Map EncryptionConfiguration (CFn PascalCase -> SDK camelCase)\n const cfnEncConfig = properties['EncryptionConfiguration'] as\n | Record<string, unknown>\n | undefined;\n let encryptionConfiguration: EncryptionConfiguration | undefined;\n if (cfnEncConfig) {\n encryptionConfiguration = {\n type: cfnEncConfig['Type'] as EncryptionConfiguration['type'],\n kmsKeyId: cfnEncConfig['KmsKeyId'] as string | undefined,\n kmsDataKeyReusePeriodSeconds: cfnEncConfig['KmsDataKeyReusePeriodSeconds'] as\n | number\n | undefined,\n };\n }\n\n const createParams: CreateStateMachineCommandInput = {\n name: stateMachineName,\n definition: definitionString,\n roleArn: roleArn,\n type: properties['StateMachineType'] as StateMachineType | undefined,\n loggingConfiguration: properties['LoggingConfiguration'] as\n | LoggingConfiguration\n | undefined,\n tracingConfiguration: properties['TracingConfiguration'] as\n | TracingConfiguration\n | undefined,\n tags: tags,\n encryptionConfiguration,\n };\n\n const response = await this.getClient().send(new CreateStateMachineCommand(createParams));\n\n const stateMachineArn = response.stateMachineArn;\n if (!stateMachineArn) {\n throw new Error('CreateStateMachine did not return stateMachineArn');\n }\n\n this.logger.debug(\n `Successfully created Step Functions state machine ${logicalId}: ${stateMachineArn}`\n );\n\n // Extract name from ARN (last segment after :)\n const name = stateMachineArn.split(':').pop() || stateMachineName;\n\n return {\n physicalId: stateMachineArn,\n attributes: {\n Arn: stateMachineArn,\n Name: name,\n StateMachineRevisionId: response.stateMachineVersionArn,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Step Functions state machine ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n stateMachineName,\n cause\n );\n }\n }\n\n /**\n * Update a Step Functions state machine\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Step Functions state machine ${logicalId}: ${physicalId}`);\n\n try {\n const definitionString = this.buildDefinitionString(properties);\n\n // Map EncryptionConfiguration for update\n const cfnEncConfig = properties['EncryptionConfiguration'] as\n | Record<string, unknown>\n | undefined;\n let encryptionConfiguration: EncryptionConfiguration | undefined;\n if (cfnEncConfig) {\n encryptionConfiguration = {\n type: cfnEncConfig['Type'] as EncryptionConfiguration['type'],\n kmsKeyId: cfnEncConfig['KmsKeyId'] as string | undefined,\n kmsDataKeyReusePeriodSeconds: cfnEncConfig['KmsDataKeyReusePeriodSeconds'] as\n | number\n | undefined,\n };\n }\n\n await this.getClient().send(\n new UpdateStateMachineCommand({\n stateMachineArn: physicalId,\n definition: definitionString,\n roleArn: properties['RoleArn'] as string | undefined,\n loggingConfiguration: properties['LoggingConfiguration'] as\n | LoggingConfiguration\n | undefined,\n tracingConfiguration: properties['TracingConfiguration'] as\n | TracingConfiguration\n | undefined,\n encryptionConfiguration,\n })\n );\n\n this.logger.debug(`Updated Step Functions state machine ${physicalId}`);\n\n // Describe to get updated attributes\n const describeResponse = await this.getClient().send(\n new DescribeStateMachineCommand({ stateMachineArn: physicalId })\n );\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: physicalId,\n Name: describeResponse.name,\n StateMachineRevisionId: describeResponse.revisionId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Step Functions state machine ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Step Functions state machine\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Step Functions state machine ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteStateMachineCommand({ stateMachineArn: physicalId }));\n this.logger.debug(`Successfully deleted Step Functions state machine ${logicalId}`);\n } catch (error) {\n if (error instanceof StateMachineDoesNotExist) {\n this.logger.debug(\n `Step Functions state machine ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Step Functions state machine ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Build definition string from CDK properties.\n * Handles both DefinitionString (string) and DefinitionString (object) forms.\n */\n private buildDefinitionString(properties: Record<string, unknown>): string {\n const definitionString = properties['DefinitionString'];\n const definition = properties['Definition'];\n\n if (definitionString !== undefined) {\n if (typeof definitionString === 'string') {\n return definitionString;\n }\n // Object form - stringify it\n return JSON.stringify(definitionString);\n }\n\n if (definition !== undefined) {\n if (typeof definition === 'string') {\n return definition;\n }\n return JSON.stringify(definition);\n }\n\n // Empty definition - SFN API will reject this, but let it through\n // for consistent error reporting from the API\n return '{}';\n }\n}\n", "import {\n ECSClient,\n CreateClusterCommand,\n DeleteClusterCommand,\n DescribeClustersCommand,\n PutClusterCapacityProvidersCommand,\n RegisterTaskDefinitionCommand,\n DeregisterTaskDefinitionCommand,\n DescribeTaskDefinitionCommand,\n CreateServiceCommand,\n UpdateServiceCommand,\n DeleteServiceCommand,\n DescribeServicesCommand,\n type Tag,\n type KeyValuePair,\n type PortMapping,\n type MountPoint,\n type VolumeFrom,\n type ContainerDependency,\n type EnvironmentFile,\n type Secret,\n type Ulimit,\n type LogConfiguration,\n type HealthCheck,\n type Volume,\n type ContainerDefinition,\n type NetworkConfiguration,\n type LoadBalancer,\n type DeploymentConfiguration,\n type CapacityProviderStrategyItem,\n type PlacementConstraint,\n type PlacementStrategy,\n type ServiceRegistry,\n type ClusterConfiguration,\n type NetworkMode,\n type Compatibility,\n type TaskDefinitionPlacementConstraint,\n type RuntimePlatform,\n type ProxyConfiguration,\n type PidMode,\n type IpcMode,\n type LaunchType,\n type SchedulingStrategy,\n type PropagateTags,\n type TransportProtocol,\n type ApplicationProtocol,\n type LogDriver,\n type EFSVolumeConfiguration,\n type AssignPublicIp,\n} from '@aws-sdk/client-ecs';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * Convert CFn Tags (Array<{Key, Value}>) to ECS Tags (Array<{key, value}>)\n */\nfunction convertTags(tags?: Array<{ Key: string; Value: string }>): Tag[] | undefined {\n if (!tags || tags.length === 0) return undefined;\n return tags.map((t) => ({ key: t.Key, value: t.Value }));\n}\n\n/**\n * AWS ECS Provider\n *\n * Implements resource provisioning for ECS resources:\n * - AWS::ECS::Cluster\n * - AWS::ECS::TaskDefinition\n * - AWS::ECS::Service\n *\n * WHY: ECS CreateCluster and RegisterTaskDefinition are synchronous.\n * The CC API adds unnecessary polling overhead for operations that\n * complete immediately. This SDK provider eliminates that polling.\n */\nexport class ECSProvider implements ResourceProvider {\n private ecsClient?: ECSClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ECSProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::ECS::Cluster',\n new Set([\n 'ClusterName',\n 'CapacityProviders',\n 'DefaultCapacityProviderStrategy',\n 'Configuration',\n 'ClusterSettings',\n 'Tags',\n ]),\n ],\n [\n 'AWS::ECS::TaskDefinition',\n new Set([\n 'Family',\n 'ContainerDefinitions',\n 'Cpu',\n 'Memory',\n 'NetworkMode',\n 'RequiresCompatibilities',\n 'ExecutionRoleArn',\n 'TaskRoleArn',\n 'Volumes',\n 'PlacementConstraints',\n 'RuntimePlatform',\n 'ProxyConfiguration',\n 'PidMode',\n 'IpcMode',\n 'EphemeralStorage',\n 'Tags',\n ]),\n ],\n [\n 'AWS::ECS::Service',\n new Set([\n 'Cluster',\n 'ServiceName',\n 'TaskDefinition',\n 'DesiredCount',\n 'LaunchType',\n 'NetworkConfiguration',\n 'LoadBalancers',\n 'CapacityProviderStrategy',\n 'DeploymentConfiguration',\n 'PlacementConstraints',\n 'PlacementStrategy',\n 'PlatformVersion',\n 'HealthCheckGracePeriodSeconds',\n 'SchedulingStrategy',\n 'EnableECSManagedTags',\n 'PropagateTags',\n 'EnableExecuteCommand',\n 'ServiceRegistries',\n 'Tags',\n ]),\n ],\n ]);\n\n private getClient(): ECSClient {\n if (!this.ecsClient) {\n this.ecsClient = new ECSClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.ecsClient;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ECS::Cluster':\n return this.createCluster(logicalId, resourceType, properties);\n case 'AWS::ECS::TaskDefinition':\n return this.createTaskDefinition(logicalId, resourceType, properties);\n case 'AWS::ECS::Service':\n return this.createService(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::ECS::Cluster':\n return this.updateCluster(logicalId, physicalId, resourceType, properties);\n case 'AWS::ECS::TaskDefinition':\n return this.updateTaskDefinition(logicalId, physicalId, resourceType, properties);\n case 'AWS::ECS::Service':\n return this.updateService(\n logicalId,\n physicalId,\n resourceType,\n properties,\n previousProperties\n );\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ECS::Cluster':\n return this.deleteCluster(logicalId, physicalId, resourceType);\n case 'AWS::ECS::TaskDefinition':\n return this.deleteTaskDefinition(logicalId, physicalId, resourceType);\n case 'AWS::ECS::Service':\n return this.deleteService(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async getAttribute(\n physicalId: string,\n resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n switch (resourceType) {\n case 'AWS::ECS::Cluster':\n return this.getClusterAttribute(physicalId, attributeName);\n case 'AWS::ECS::TaskDefinition':\n return this.getTaskDefinitionAttribute(physicalId, attributeName);\n case 'AWS::ECS::Service':\n return this.getServiceAttribute(physicalId, attributeName);\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::ECS::Cluster \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createCluster(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating ECS cluster ${logicalId}`);\n const client = this.getClient();\n\n const clusterName =\n (properties['ClusterName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255 });\n\n try {\n const response = await client.send(\n new CreateClusterCommand({\n clusterName,\n capacityProviders: properties['CapacityProviders'] as string[] | undefined,\n defaultCapacityProviderStrategy: properties['DefaultCapacityProviderStrategy'] as\n | CapacityProviderStrategyItem[]\n | undefined,\n configuration: properties['Configuration'] as ClusterConfiguration | undefined,\n settings: properties['ClusterSettings']\n ? (properties['ClusterSettings'] as Array<Record<string, unknown>>).map((s) => ({\n name: (s['Name'] || s['name']) as string as 'containerInsights',\n value: ((s['Value'] || s['value']) as string) ?? undefined,\n }))\n : undefined,\n tags: convertTags(\n properties['Tags'] as Array<{ Key: string; Value: string }> | undefined\n ),\n })\n );\n\n const cluster = response.cluster;\n if (!cluster || !cluster.clusterArn) {\n throw new Error('CreateCluster did not return cluster ARN');\n }\n\n this.logger.debug(`Successfully created ECS cluster ${logicalId}: ${cluster.clusterArn}`);\n\n return {\n physicalId: clusterName,\n attributes: {\n Arn: cluster.clusterArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create ECS cluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n clusterName,\n cause\n );\n }\n }\n\n private async updateCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating ECS cluster ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n try {\n // Update capacity providers if specified\n if (properties['CapacityProviders'] || properties['DefaultCapacityProviderStrategy']) {\n await client.send(\n new PutClusterCapacityProvidersCommand({\n cluster: physicalId,\n capacityProviders: (properties['CapacityProviders'] as string[]) || [],\n defaultCapacityProviderStrategy:\n (properties['DefaultCapacityProviderStrategy'] as CapacityProviderStrategyItem[]) ||\n [],\n })\n );\n this.logger.debug(`Updated capacity providers for ECS cluster ${physicalId}`);\n }\n\n // Describe cluster to get current ARN\n const describeResponse = await client.send(\n new DescribeClustersCommand({ clusters: [physicalId] })\n );\n const cluster = describeResponse.clusters?.[0];\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: cluster?.clusterArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update ECS cluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting ECS cluster ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n try {\n await client.send(new DeleteClusterCommand({ cluster: physicalId }));\n this.logger.debug(`Successfully deleted ECS cluster ${logicalId}`);\n } catch (error) {\n // Handle ClusterNotFoundException for idempotent delete\n if (this.isClusterNotFoundException(error)) {\n this.logger.debug(`ECS cluster ${physicalId} not found, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete ECS cluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getClusterAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n const client = this.getClient();\n const response = await client.send(new DescribeClustersCommand({ clusters: [physicalId] }));\n const cluster = response.clusters?.[0];\n if (!cluster) return undefined;\n\n switch (attributeName) {\n case 'Arn':\n return cluster.clusterArn;\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::ECS::TaskDefinition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createTaskDefinition(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating ECS task definition ${logicalId}`);\n const client = this.getClient();\n\n try {\n const response = await client.send(\n new RegisterTaskDefinitionCommand({\n family:\n (properties['Family'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255 }),\n containerDefinitions: this.convertContainerDefinitions(\n properties['ContainerDefinitions'] as Array<Record<string, unknown>> | undefined\n ),\n cpu: properties['Cpu'] as string | undefined,\n memory: properties['Memory'] as string | undefined,\n networkMode: properties['NetworkMode'] as NetworkMode | undefined,\n requiresCompatibilities: properties['RequiresCompatibilities'] as\n | Compatibility[]\n | undefined,\n executionRoleArn: properties['ExecutionRoleArn'] as string | undefined,\n taskRoleArn: properties['TaskRoleArn'] as string | undefined,\n volumes: this.convertVolumes(\n properties['Volumes'] as Array<Record<string, unknown>> | undefined\n ),\n placementConstraints: properties['PlacementConstraints'] as\n | TaskDefinitionPlacementConstraint[]\n | undefined,\n tags: convertTags(\n properties['Tags'] as Array<{ Key: string; Value: string }> | undefined\n ),\n runtimePlatform: properties['RuntimePlatform'] as RuntimePlatform | undefined,\n proxyConfiguration: properties['ProxyConfiguration'] as ProxyConfiguration | undefined,\n pidMode: properties['PidMode'] as PidMode | undefined,\n ipcMode: properties['IpcMode'] as IpcMode | undefined,\n ephemeralStorage: properties['EphemeralStorage'] as { sizeInGiB: number } | undefined,\n })\n );\n\n const taskDef = response.taskDefinition;\n if (!taskDef || !taskDef.taskDefinitionArn) {\n throw new Error('RegisterTaskDefinition did not return task definition ARN');\n }\n\n this.logger.debug(\n `Successfully created ECS task definition ${logicalId}: ${taskDef.taskDefinitionArn}`\n );\n\n return {\n physicalId: taskDef.taskDefinitionArn,\n attributes: {\n TaskDefinitionArn: taskDef.taskDefinitionArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create ECS task definition ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateTaskDefinition(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating ECS task definition ${logicalId}: ${physicalId}`);\n\n // TaskDefinition updates create a new revision (RegisterTaskDefinition)\n const result = await this.createTaskDefinition(logicalId, resourceType, properties);\n\n // Deregister old revision\n try {\n const client = this.getClient();\n await client.send(new DeregisterTaskDefinitionCommand({ taskDefinition: physicalId }));\n this.logger.debug(`Deregistered old task definition revision: ${physicalId}`);\n } catch (error) {\n this.logger.debug(\n `Failed to deregister old task definition ${physicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n return {\n physicalId: result.physicalId,\n wasReplaced: false,\n attributes: result.attributes ?? {},\n };\n }\n\n private async deleteTaskDefinition(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting ECS task definition ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n try {\n await client.send(new DeregisterTaskDefinitionCommand({ taskDefinition: physicalId }));\n this.logger.debug(`Successfully deregistered ECS task definition ${logicalId}`);\n } catch (error) {\n // Handle not found for idempotent delete\n if (this.isNotFoundException(error)) {\n this.logger.debug(`ECS task definition ${physicalId} not found, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete ECS task definition ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getTaskDefinitionAttribute(\n physicalId: string,\n attributeName: string\n ): Promise<unknown> {\n const client = this.getClient();\n const response = await client.send(\n new DescribeTaskDefinitionCommand({ taskDefinition: physicalId })\n );\n const taskDef = response.taskDefinition;\n if (!taskDef) return undefined;\n\n switch (attributeName) {\n case 'TaskDefinitionArn':\n return taskDef.taskDefinitionArn;\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::ECS::Service \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createService(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating ECS service ${logicalId}`);\n const client = this.getClient();\n\n const serviceName =\n (properties['ServiceName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255 });\n\n try {\n const response = await client.send(\n new CreateServiceCommand({\n cluster: properties['Cluster'] as string | undefined,\n serviceName,\n taskDefinition: properties['TaskDefinition'] as string | undefined,\n desiredCount: properties['DesiredCount'] as number | undefined,\n launchType: properties['LaunchType'] as LaunchType | undefined,\n networkConfiguration: this.convertNetworkConfiguration(\n properties['NetworkConfiguration'] as Record<string, unknown> | undefined\n ),\n loadBalancers: this.convertLoadBalancers(\n properties['LoadBalancers'] as Array<Record<string, unknown>> | undefined\n ),\n capacityProviderStrategy: properties['CapacityProviderStrategy'] as\n | CapacityProviderStrategyItem[]\n | undefined,\n deploymentConfiguration: properties['DeploymentConfiguration'] as\n | DeploymentConfiguration\n | undefined,\n placementConstraints: properties['PlacementConstraints'] as\n | PlacementConstraint[]\n | undefined,\n placementStrategy: properties['PlacementStrategy'] as PlacementStrategy[] | undefined,\n platformVersion: properties['PlatformVersion'] as string | undefined,\n healthCheckGracePeriodSeconds: properties['HealthCheckGracePeriodSeconds'] as\n | number\n | undefined,\n schedulingStrategy: properties['SchedulingStrategy'] as SchedulingStrategy | undefined,\n enableECSManagedTags: properties['EnableECSManagedTags'] as boolean | undefined,\n propagateTags: properties['PropagateTags'] as PropagateTags | undefined,\n enableExecuteCommand: properties['EnableExecuteCommand'] as boolean | undefined,\n serviceRegistries: properties['ServiceRegistries'] as ServiceRegistry[] | undefined,\n tags: convertTags(\n properties['Tags'] as Array<{ Key: string; Value: string }> | undefined\n ),\n })\n );\n\n const service = response.service;\n if (!service || !service.serviceArn) {\n throw new Error('CreateService did not return service ARN');\n }\n\n this.logger.debug(`Successfully created ECS service ${logicalId}: ${service.serviceArn}`);\n\n return {\n physicalId: service.serviceArn,\n attributes: {\n ServiceArn: service.serviceArn,\n Name: service.serviceName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create ECS service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n serviceName,\n cause\n );\n }\n }\n\n private async updateService(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating ECS service ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n // ServiceName is immutable - if changed, requires replacement\n const newServiceName = properties['ServiceName'] as string | undefined;\n const oldServiceName = previousProperties['ServiceName'] as string | undefined;\n if (newServiceName && oldServiceName && newServiceName !== oldServiceName) {\n throw new ProvisioningError(\n `Cannot update ServiceName for ECS service ${logicalId} (immutable property, requires replacement)`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n const response = await client.send(\n new UpdateServiceCommand({\n cluster: properties['Cluster'] as string | undefined,\n service: physicalId,\n taskDefinition: properties['TaskDefinition'] as string | undefined,\n desiredCount: properties['DesiredCount'] as number | undefined,\n networkConfiguration: this.convertNetworkConfiguration(\n properties['NetworkConfiguration'] as Record<string, unknown> | undefined\n ),\n capacityProviderStrategy: properties['CapacityProviderStrategy'] as\n | CapacityProviderStrategyItem[]\n | undefined,\n deploymentConfiguration: properties['DeploymentConfiguration'] as\n | DeploymentConfiguration\n | undefined,\n placementConstraints: properties['PlacementConstraints'] as\n | PlacementConstraint[]\n | undefined,\n placementStrategy: properties['PlacementStrategy'] as PlacementStrategy[] | undefined,\n platformVersion: properties['PlatformVersion'] as string | undefined,\n healthCheckGracePeriodSeconds: properties['HealthCheckGracePeriodSeconds'] as\n | number\n | undefined,\n enableExecuteCommand: properties['EnableExecuteCommand'] as boolean | undefined,\n })\n );\n\n const service = response.service;\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n ServiceArn: service?.serviceArn || physicalId,\n Name: service?.serviceName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update ECS service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteService(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting ECS service ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n const cluster = properties?.['Cluster'] as string | undefined;\n\n try {\n // First scale down to 0\n try {\n await client.send(\n new UpdateServiceCommand({\n cluster,\n service: physicalId,\n desiredCount: 0,\n })\n );\n this.logger.debug(`Scaled down ECS service ${physicalId} to 0`);\n } catch (error) {\n // If service not found during scale down, it's already gone\n if (this.isServiceNotFoundException(error)) {\n this.logger.debug(\n `ECS service ${physicalId} not found during scale down, skipping deletion`\n );\n return;\n }\n throw error;\n }\n\n // Then force delete\n await client.send(\n new DeleteServiceCommand({\n cluster,\n service: physicalId,\n force: true,\n })\n );\n this.logger.debug(`Successfully deleted ECS service ${logicalId}`);\n } catch (error) {\n if (this.isServiceNotFoundException(error)) {\n this.logger.debug(`ECS service ${physicalId} not found, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete ECS service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getServiceAttribute(physicalId: string, attributeName: string): Promise<unknown> {\n const client = this.getClient();\n\n // Extract cluster from service ARN if possible\n const response = await client.send(\n new DescribeServicesCommand({\n services: [physicalId],\n })\n );\n const service = response.services?.[0];\n if (!service) return undefined;\n\n switch (attributeName) {\n case 'ServiceArn':\n return service.serviceArn;\n case 'Name':\n return service.serviceName;\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Convert CFn ContainerDefinitions to ECS SDK format.\n * CFn uses PascalCase, ECS SDK uses camelCase.\n */\n private convertContainerDefinitions(\n defs?: Array<Record<string, unknown>>\n ): ContainerDefinition[] | undefined {\n if (!defs) return undefined;\n\n return defs.map((def) => ({\n name: def['Name'] as string,\n image: def['Image'] as string,\n cpu: def['Cpu'] as number | undefined,\n memory: def['Memory'] as number | undefined,\n memoryReservation: def['MemoryReservation'] as number | undefined,\n essential: def['Essential'] as boolean | undefined,\n command: def['Command'] as string[] | undefined,\n entryPoint: def['EntryPoint'] as string[] | undefined,\n environment: def['Environment'] as KeyValuePair[] | undefined,\n environmentFiles: def['EnvironmentFiles'] as EnvironmentFile[] | undefined,\n secrets: def['Secrets'] as Secret[] | undefined,\n portMappings: this.convertPortMappings(\n def['PortMappings'] as Array<Record<string, unknown>> | undefined\n ),\n mountPoints: def['MountPoints'] as MountPoint[] | undefined,\n volumesFrom: def['VolumesFrom'] as VolumeFrom[] | undefined,\n dependsOn: def['DependsOn'] as ContainerDependency[] | undefined,\n links: def['Links'] as string[] | undefined,\n workingDirectory: def['WorkingDirectory'] as string | undefined,\n disableNetworking: def['DisableNetworking'] as boolean | undefined,\n privileged: def['Privileged'] as boolean | undefined,\n readonlyRootFilesystem: def['ReadonlyRootFilesystem'] as boolean | undefined,\n user: def['User'] as string | undefined,\n ulimits: def['Ulimits'] as Ulimit[] | undefined,\n logConfiguration: this.convertLogConfiguration(\n def['LogConfiguration'] as Record<string, unknown> | undefined\n ),\n healthCheck: this.convertHealthCheck(\n def['HealthCheck'] as Record<string, unknown> | undefined\n ),\n linuxParameters: def['LinuxParameters'] as Record<string, unknown> | undefined,\n dockerLabels: def['DockerLabels'] as Record<string, string> | undefined,\n startTimeout: def['StartTimeout'] as number | undefined,\n stopTimeout: def['StopTimeout'] as number | undefined,\n interactive: def['Interactive'] as boolean | undefined,\n pseudoTerminal: def['PseudoTerminal'] as boolean | undefined,\n }));\n }\n\n /**\n * Convert CFn PortMappings to ECS SDK format\n */\n private convertPortMappings(\n mappings?: Array<Record<string, unknown>>\n ): PortMapping[] | undefined {\n if (!mappings) return undefined;\n\n return mappings.map((m) => ({\n containerPort: m['ContainerPort'] as number | undefined,\n hostPort: m['HostPort'] as number | undefined,\n protocol: m['Protocol'] as TransportProtocol | undefined,\n appProtocol: m['AppProtocol'] as ApplicationProtocol | undefined,\n name: m['Name'] as string | undefined,\n }));\n }\n\n /**\n * Convert CFn LogConfiguration to ECS SDK format\n */\n private convertLogConfiguration(config?: Record<string, unknown>): LogConfiguration | undefined {\n if (!config) return undefined;\n\n return {\n logDriver: config['LogDriver'] as LogDriver,\n options: config['Options'] as Record<string, string> | undefined,\n secretOptions: config['SecretOptions'] as Secret[] | undefined,\n };\n }\n\n /**\n * Convert CFn HealthCheck to ECS SDK format\n */\n private convertHealthCheck(check?: Record<string, unknown>): HealthCheck | undefined {\n if (!check) return undefined;\n\n return {\n command: check['Command'] as string[],\n interval: check['Interval'] as number | undefined,\n timeout: check['Timeout'] as number | undefined,\n retries: check['Retries'] as number | undefined,\n startPeriod: check['StartPeriod'] as number | undefined,\n };\n }\n\n /**\n * Convert CFn Volumes to ECS SDK format\n */\n private convertVolumes(volumes?: Array<Record<string, unknown>>): Volume[] | undefined {\n if (!volumes) return undefined;\n\n return volumes.map((v) => ({\n name: v['Name'] as string,\n host: v['Host'] as { sourcePath?: string } | undefined,\n efsVolumeConfiguration: v['EFSVolumeConfiguration'] as EFSVolumeConfiguration | undefined,\n }));\n }\n\n /**\n * Convert CFn NetworkConfiguration to ECS SDK format\n */\n /**\n * Convert CFn PascalCase LoadBalancers to SDK camelCase\n */\n private convertLoadBalancers(lbs?: Array<Record<string, unknown>>): LoadBalancer[] | undefined {\n if (!lbs) return undefined;\n return lbs.map((lb) => ({\n targetGroupArn: lb['TargetGroupArn'] as string | undefined,\n containerName: lb['ContainerName'] as string | undefined,\n containerPort: lb['ContainerPort'] as number | undefined,\n loadBalancerName: lb['LoadBalancerName'] as string | undefined,\n }));\n }\n\n private convertNetworkConfiguration(\n config?: Record<string, unknown>\n ): NetworkConfiguration | undefined {\n if (!config) return undefined;\n\n const awsvpcConfig = config['AwsvpcConfiguration'] as Record<string, unknown> | undefined;\n if (!awsvpcConfig) return undefined;\n\n return {\n awsvpcConfiguration: {\n subnets: awsvpcConfig['Subnets'] as string[],\n securityGroups: awsvpcConfig['SecurityGroups'] as string[] | undefined,\n assignPublicIp: awsvpcConfig['AssignPublicIp'] as AssignPublicIp | undefined,\n },\n };\n }\n\n /**\n * Check if error is ClusterNotFoundException\n */\n private isClusterNotFoundException(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'ClusterNotFoundException' || error.message.includes('Cluster not found')\n );\n }\n return false;\n }\n\n /**\n * Check if error is a not-found error (for task definitions)\n */\n private isNotFoundException(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'ClientException' ||\n error.name === 'InvalidParameterException' ||\n error.message.includes('not found') ||\n error.message.includes('does not exist')\n );\n }\n return false;\n }\n\n /**\n * Check if error is ServiceNotFoundException\n */\n private isServiceNotFoundException(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'ServiceNotFoundException' ||\n error.name === 'ServiceNotActiveException' ||\n error.message.includes('service not found') ||\n error.message.includes('Service not found')\n );\n }\n return false;\n }\n}\n", "import {\n ElasticLoadBalancingV2Client,\n CreateLoadBalancerCommand,\n DeleteLoadBalancerCommand,\n DescribeLoadBalancersCommand,\n CreateTargetGroupCommand,\n DeleteTargetGroupCommand,\n ModifyTargetGroupCommand,\n DescribeTargetGroupsCommand,\n CreateListenerCommand,\n DeleteListenerCommand,\n ModifyListenerCommand,\n type Tag,\n type Action,\n type Certificate,\n type LoadBalancerSchemeEnum,\n type LoadBalancerTypeEnum,\n type IpAddressType,\n type ProtocolEnum,\n type TargetTypeEnum,\n} from '@aws-sdk/client-elastic-load-balancing-v2';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS ELBv2 Provider\n *\n * Implements resource provisioning for ELBv2 resources:\n * - AWS::ElasticLoadBalancingV2::LoadBalancer\n * - AWS::ElasticLoadBalancingV2::TargetGroup\n * - AWS::ElasticLoadBalancingV2::Listener\n *\n * WHY: ELBv2 Create* APIs are synchronous - the CC API adds unnecessary polling\n * overhead for operations that complete immediately. This SDK provider eliminates\n * that polling and returns instantly.\n */\nexport class ELBv2Provider implements ResourceProvider {\n private elbv2Client?: ElasticLoadBalancingV2Client;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ELBv2Provider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::ElasticLoadBalancingV2::LoadBalancer',\n new Set([\n 'Name',\n 'Subnets',\n 'SubnetMappings',\n 'SecurityGroups',\n 'Scheme',\n 'Type',\n 'IpAddressType',\n 'LoadBalancerAttributes',\n 'Tags',\n ]),\n ],\n [\n 'AWS::ElasticLoadBalancingV2::TargetGroup',\n new Set([\n 'Protocol',\n 'Port',\n 'VpcId',\n 'TargetType',\n 'ProtocolVersion',\n 'HealthCheckProtocol',\n 'HealthCheckPort',\n 'HealthCheckPath',\n 'HealthCheckEnabled',\n 'HealthCheckIntervalSeconds',\n 'HealthCheckTimeoutSeconds',\n 'HealthyThresholdCount',\n 'UnhealthyThresholdCount',\n 'Matcher',\n 'Name',\n 'Tags',\n ]),\n ],\n [\n 'AWS::ElasticLoadBalancingV2::Listener',\n new Set([\n 'LoadBalancerArn',\n 'Certificates',\n 'DefaultActions',\n 'Port',\n 'Protocol',\n 'SslPolicy',\n ]),\n ],\n ]);\n\n private getClient(): ElasticLoadBalancingV2Client {\n if (!this.elbv2Client) {\n this.elbv2Client = new ElasticLoadBalancingV2Client(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.elbv2Client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ElasticLoadBalancingV2::LoadBalancer':\n return this.createLoadBalancer(logicalId, resourceType, properties);\n case 'AWS::ElasticLoadBalancingV2::TargetGroup':\n return this.createTargetGroup(logicalId, resourceType, properties);\n case 'AWS::ElasticLoadBalancingV2::Listener':\n return this.createListener(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::ElasticLoadBalancingV2::LoadBalancer':\n return this.updateLoadBalancer(logicalId, physicalId, resourceType, properties);\n case 'AWS::ElasticLoadBalancingV2::TargetGroup':\n return this.updateTargetGroup(logicalId, physicalId, resourceType, properties);\n case 'AWS::ElasticLoadBalancingV2::Listener':\n return this.updateListener(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ElasticLoadBalancingV2::LoadBalancer':\n return this.deleteLoadBalancer(logicalId, physicalId, resourceType);\n case 'AWS::ElasticLoadBalancingV2::TargetGroup':\n return this.deleteTargetGroup(logicalId, physicalId, resourceType);\n case 'AWS::ElasticLoadBalancingV2::Listener':\n return this.deleteListener(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::ElasticLoadBalancingV2::LoadBalancer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createLoadBalancer(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating LoadBalancer ${logicalId}`);\n\n try {\n const tags = this.extractTags(properties);\n\n const lbName = generateResourceName((properties['Name'] as string | undefined) || logicalId, {\n maxLength: 32,\n });\n\n const response = await this.getClient().send(\n new CreateLoadBalancerCommand({\n Name: lbName,\n Subnets: properties['Subnets'] as string[] | undefined,\n SubnetMappings: properties['SubnetMappings'] as\n | Array<{ SubnetId: string; AllocationId?: string; PrivateIPv4Address?: string }>\n | undefined,\n SecurityGroups: properties['SecurityGroups'] as string[] | undefined,\n Scheme: properties['Scheme'] as LoadBalancerSchemeEnum | undefined,\n Type: properties['Type'] as LoadBalancerTypeEnum | undefined,\n IpAddressType: properties['IpAddressType'] as IpAddressType | undefined,\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n const lb = response.LoadBalancers?.[0];\n if (!lb || !lb.LoadBalancerArn) {\n throw new Error('CreateLoadBalancer did not return LoadBalancer ARN');\n }\n\n this.logger.debug(`Successfully created LoadBalancer ${logicalId}: ${lb.LoadBalancerArn}`);\n\n // Apply LoadBalancerAttributes if specified\n const lbAttributes = properties['LoadBalancerAttributes'] as\n | Array<{ Key: string; Value: string }>\n | undefined;\n if (lbAttributes && lbAttributes.length > 0) {\n const { ModifyLoadBalancerAttributesCommand } =\n await import('@aws-sdk/client-elastic-load-balancing-v2');\n await this.getClient().send(\n new ModifyLoadBalancerAttributesCommand({\n LoadBalancerArn: lb.LoadBalancerArn,\n Attributes: lbAttributes.map((attr) => ({\n Key: attr.Key,\n Value: attr.Value,\n })),\n })\n );\n this.logger.debug(\n `Applied ${lbAttributes.length} LoadBalancer attributes for ${logicalId}`\n );\n }\n\n return {\n physicalId: lb.LoadBalancerArn,\n attributes: {\n DNSName: lb.DNSName,\n CanonicalHostedZoneID: lb.CanonicalHostedZoneId,\n LoadBalancerArn: lb.LoadBalancerArn,\n LoadBalancerFullName: lb.LoadBalancerArn?.split('/').slice(1).join('/'),\n LoadBalancerName: lb.LoadBalancerName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create LoadBalancer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateLoadBalancer(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating LoadBalancer ${logicalId}: ${physicalId}`);\n\n try {\n // LoadBalancer updates are limited; Name is immutable (requires replacement).\n // For simplicity, describe the current state and return attributes.\n const describeResponse = await this.getClient().send(\n new DescribeLoadBalancersCommand({ LoadBalancerArns: [physicalId] })\n );\n\n const lb = describeResponse.LoadBalancers?.[0];\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n DNSName: lb?.DNSName,\n CanonicalHostedZoneID: lb?.CanonicalHostedZoneId,\n LoadBalancerArn: physicalId,\n LoadBalancerFullName: physicalId.split('/').slice(1).join('/'),\n LoadBalancerName: lb?.LoadBalancerName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update LoadBalancer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteLoadBalancer(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting LoadBalancer ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteLoadBalancerCommand({ LoadBalancerArn: physicalId }));\n this.logger.debug(`Successfully deleted LoadBalancer ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`LoadBalancer ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete LoadBalancer ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::ElasticLoadBalancingV2::TargetGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createTargetGroup(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating TargetGroup ${logicalId}`);\n\n try {\n const tags = this.extractTags(properties);\n const matcher = properties['Matcher'] as { HttpCode?: string; GrpcCode?: string } | undefined;\n\n const tgName = generateResourceName((properties['Name'] as string | undefined) || logicalId, {\n maxLength: 32,\n });\n\n const response = await this.getClient().send(\n new CreateTargetGroupCommand({\n Name: tgName,\n Protocol: properties['Protocol'] as ProtocolEnum | undefined,\n Port: properties['Port'] !== undefined ? Number(properties['Port']) : undefined,\n VpcId: properties['VpcId'] as string | undefined,\n TargetType: properties['TargetType'] as TargetTypeEnum | undefined,\n ProtocolVersion: properties['ProtocolVersion'] as string | undefined,\n HealthCheckProtocol: properties['HealthCheckProtocol'] as ProtocolEnum | undefined,\n HealthCheckPort: properties['HealthCheckPort'] as string | undefined,\n HealthCheckPath: properties['HealthCheckPath'] as string | undefined,\n HealthCheckEnabled:\n properties['HealthCheckEnabled'] !== undefined\n ? Boolean(properties['HealthCheckEnabled'])\n : undefined,\n HealthCheckIntervalSeconds:\n properties['HealthCheckIntervalSeconds'] !== undefined\n ? Number(properties['HealthCheckIntervalSeconds'])\n : undefined,\n HealthCheckTimeoutSeconds:\n properties['HealthCheckTimeoutSeconds'] !== undefined\n ? Number(properties['HealthCheckTimeoutSeconds'])\n : undefined,\n HealthyThresholdCount:\n properties['HealthyThresholdCount'] !== undefined\n ? Number(properties['HealthyThresholdCount'])\n : undefined,\n UnhealthyThresholdCount:\n properties['UnhealthyThresholdCount'] !== undefined\n ? Number(properties['UnhealthyThresholdCount'])\n : undefined,\n ...(matcher && { Matcher: matcher }),\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n const tg = response.TargetGroups?.[0];\n if (!tg || !tg.TargetGroupArn) {\n throw new Error('CreateTargetGroup did not return TargetGroup ARN');\n }\n\n this.logger.debug(`Successfully created TargetGroup ${logicalId}: ${tg.TargetGroupArn}`);\n\n return {\n physicalId: tg.TargetGroupArn,\n attributes: {\n TargetGroupArn: tg.TargetGroupArn,\n TargetGroupFullName: tg.TargetGroupArn?.split(':').pop()?.replace('targetgroup/', ''),\n TargetGroupName: tg.TargetGroupName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateTargetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating TargetGroup ${logicalId}: ${physicalId}`);\n\n try {\n const matcher = properties['Matcher'] as { HttpCode?: string; GrpcCode?: string } | undefined;\n\n await this.getClient().send(\n new ModifyTargetGroupCommand({\n TargetGroupArn: physicalId,\n HealthCheckProtocol: properties['HealthCheckProtocol'] as ProtocolEnum | undefined,\n HealthCheckPort: properties['HealthCheckPort'] as string | undefined,\n HealthCheckPath: properties['HealthCheckPath'] as string | undefined,\n HealthCheckEnabled:\n properties['HealthCheckEnabled'] !== undefined\n ? Boolean(properties['HealthCheckEnabled'])\n : undefined,\n HealthCheckIntervalSeconds:\n properties['HealthCheckIntervalSeconds'] !== undefined\n ? Number(properties['HealthCheckIntervalSeconds'])\n : undefined,\n HealthCheckTimeoutSeconds:\n properties['HealthCheckTimeoutSeconds'] !== undefined\n ? Number(properties['HealthCheckTimeoutSeconds'])\n : undefined,\n HealthyThresholdCount:\n properties['HealthyThresholdCount'] !== undefined\n ? Number(properties['HealthyThresholdCount'])\n : undefined,\n UnhealthyThresholdCount:\n properties['UnhealthyThresholdCount'] !== undefined\n ? Number(properties['UnhealthyThresholdCount'])\n : undefined,\n ...(matcher && { Matcher: matcher }),\n })\n );\n\n // Describe to get current attributes\n const describeResponse = await this.getClient().send(\n new DescribeTargetGroupsCommand({ TargetGroupArns: [physicalId] })\n );\n const tg = describeResponse.TargetGroups?.[0];\n\n this.logger.debug(`Successfully updated TargetGroup ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n TargetGroupArn: physicalId,\n TargetGroupFullName: physicalId.split(':').pop()?.replace('targetgroup/', ''),\n TargetGroupName: tg?.TargetGroupName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteTargetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting TargetGroup ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteTargetGroupCommand({ TargetGroupArn: physicalId }));\n this.logger.debug(`Successfully deleted TargetGroup ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`TargetGroup ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete TargetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::ElasticLoadBalancingV2::Listener \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createListener(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Listener ${logicalId}`);\n\n try {\n const tags = this.extractTags(properties);\n const defaultActions = this.convertActions(\n properties['DefaultActions'] as Array<Record<string, unknown>> | undefined\n );\n const certificates = this.convertCertificates(\n properties['Certificates'] as Array<Record<string, unknown>> | undefined\n );\n\n const response = await this.getClient().send(\n new CreateListenerCommand({\n LoadBalancerArn: properties['LoadBalancerArn'] as string,\n Port: properties['Port'] !== undefined ? Number(properties['Port']) : undefined,\n Protocol: properties['Protocol'] as ProtocolEnum | undefined,\n SslPolicy: properties['SslPolicy'] as string | undefined,\n DefaultActions: defaultActions ?? [],\n ...(certificates && { Certificates: certificates }),\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n const listener = response.Listeners?.[0];\n if (!listener || !listener.ListenerArn) {\n throw new Error('CreateListener did not return Listener ARN');\n }\n\n this.logger.debug(`Successfully created Listener ${logicalId}: ${listener.ListenerArn}`);\n\n return {\n physicalId: listener.ListenerArn,\n attributes: {\n ListenerArn: listener.ListenerArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Listener ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateListener(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Listener ${logicalId}: ${physicalId}`);\n\n try {\n const defaultActions = this.convertActions(\n properties['DefaultActions'] as Array<Record<string, unknown>> | undefined\n );\n const certificates = this.convertCertificates(\n properties['Certificates'] as Array<Record<string, unknown>> | undefined\n );\n\n await this.getClient().send(\n new ModifyListenerCommand({\n ListenerArn: physicalId,\n Port: properties['Port'] !== undefined ? Number(properties['Port']) : undefined,\n Protocol: properties['Protocol'] as ProtocolEnum | undefined,\n SslPolicy: properties['SslPolicy'] as string | undefined,\n ...(defaultActions && { DefaultActions: defaultActions }),\n ...(certificates && { Certificates: certificates }),\n })\n );\n\n this.logger.debug(`Successfully updated Listener ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n ListenerArn: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Listener ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteListener(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Listener ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteListenerCommand({ ListenerArn: physicalId }));\n this.logger.debug(`Successfully deleted Listener ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`Listener ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Listener ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Extract Tags from CDK properties\n * CDK format: Array<{Key: string, Value: string}> \u2014 same as ELBv2 API format\n */\n private extractTags(properties: Record<string, unknown>): Tag[] {\n if (!properties['Tags']) return [];\n return properties['Tags'] as Tag[];\n }\n\n /**\n * Convert CDK DefaultActions to ELBv2 API Action format\n * CDK uses PascalCase property names matching the ELBv2 API, so pass through.\n */\n private convertActions(\n actions: Array<Record<string, unknown>> | undefined\n ): Action[] | undefined {\n if (!actions || actions.length === 0) return undefined;\n return actions as unknown as Action[];\n }\n\n /**\n * Convert CDK Certificates to ELBv2 API Certificate format\n */\n private convertCertificates(\n certificates: Array<Record<string, unknown>> | undefined\n ): Certificate[] | undefined {\n if (!certificates || certificates.length === 0) return undefined;\n return certificates as unknown as Certificate[];\n }\n\n /**\n * Check if an error indicates the resource was not found\n */\n private isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = (error.message || '').toLowerCase();\n const name = (error as { name?: string }).name ?? '';\n return (\n message.includes('not found') ||\n message.includes('does not exist') ||\n name === 'LoadBalancerNotFoundException' ||\n name === 'TargetGroupNotFoundException' ||\n name === 'ListenerNotFoundException'\n );\n }\n}\n", "import {\n RDSClient,\n CreateDBClusterCommand,\n DeleteDBClusterCommand,\n ModifyDBClusterCommand,\n DescribeDBClustersCommand,\n CreateDBInstanceCommand,\n DeleteDBInstanceCommand,\n ModifyDBInstanceCommand,\n DescribeDBInstancesCommand,\n CreateDBSubnetGroupCommand,\n DeleteDBSubnetGroupCommand,\n ModifyDBSubnetGroupCommand,\n} from '@aws-sdk/client-rds';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS RDS Provider\n *\n * Implements resource provisioning for RDS resources:\n * - AWS::RDS::DBSubnetGroup\n * - AWS::RDS::DBCluster\n * - AWS::RDS::DBInstance\n *\n * WHY: RDS SDK calls are direct and avoid CC API polling overhead.\n * However, DBCluster and DBInstance creation can take time, so we\n * poll with DescribeDB* until available.\n */\nexport class RDSProvider implements ResourceProvider {\n private rdsClient?: RDSClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('RDSProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::RDS::DBSubnetGroup',\n new Set(['DBSubnetGroupName', 'DBSubnetGroupDescription', 'SubnetIds', 'Tags']),\n ],\n [\n 'AWS::RDS::DBCluster',\n new Set([\n 'DBClusterIdentifier',\n 'Engine',\n 'EngineVersion',\n 'MasterUsername',\n 'MasterUserPassword',\n 'DatabaseName',\n 'Port',\n 'VpcSecurityGroupIds',\n 'DBSubnetGroupName',\n 'StorageEncrypted',\n 'KmsKeyId',\n 'BackupRetentionPeriod',\n 'DeletionProtection',\n 'ServerlessV2ScalingConfiguration',\n 'Tags',\n ]),\n ],\n [\n 'AWS::RDS::DBInstance',\n new Set([\n 'DBInstanceIdentifier',\n 'DBInstanceClass',\n 'Engine',\n 'DBClusterIdentifier',\n 'DBSubnetGroupName',\n 'PubliclyAccessible',\n 'Tags',\n ]),\n ],\n ]);\n\n private getClient(): RDSClient {\n if (!this.rdsClient) {\n this.rdsClient = new RDSClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.rdsClient;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::RDS::DBSubnetGroup':\n return this.createDBSubnetGroup(logicalId, resourceType, properties);\n case 'AWS::RDS::DBCluster':\n return this.createDBCluster(logicalId, resourceType, properties);\n case 'AWS::RDS::DBInstance':\n return this.createDBInstance(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::RDS::DBSubnetGroup':\n return this.updateDBSubnetGroup(logicalId, physicalId, resourceType, properties);\n case 'AWS::RDS::DBCluster':\n return this.updateDBCluster(logicalId, physicalId, resourceType, properties);\n case 'AWS::RDS::DBInstance':\n return this.updateDBInstance(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::RDS::DBSubnetGroup':\n return this.deleteDBSubnetGroup(logicalId, physicalId, resourceType);\n case 'AWS::RDS::DBCluster':\n return this.deleteDBCluster(logicalId, physicalId, resourceType);\n case 'AWS::RDS::DBInstance':\n return this.deleteDBInstance(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 DBSubnetGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createDBSubnetGroup(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating DBSubnetGroup ${logicalId}`);\n\n const dbSubnetGroupName =\n (properties['DBSubnetGroupName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255, lowercase: true });\n\n try {\n const tags = this.buildTags(properties);\n\n await this.getClient().send(\n new CreateDBSubnetGroupCommand({\n DBSubnetGroupName: dbSubnetGroupName,\n DBSubnetGroupDescription:\n (properties['DBSubnetGroupDescription'] as string) || `Subnet group for ${logicalId}`,\n SubnetIds: properties['SubnetIds'] as string[],\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n this.logger.debug(`Successfully created DBSubnetGroup ${logicalId}: ${dbSubnetGroupName}`);\n\n return {\n physicalId: dbSubnetGroupName,\n attributes: {\n DBSubnetGroupName: dbSubnetGroupName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create DBSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n dbSubnetGroupName,\n cause\n );\n }\n }\n\n private async updateDBSubnetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating DBSubnetGroup ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new ModifyDBSubnetGroupCommand({\n DBSubnetGroupName: physicalId,\n DBSubnetGroupDescription: properties['DBSubnetGroupDescription'] as string | undefined,\n SubnetIds: properties['SubnetIds'] as string[],\n })\n );\n\n this.logger.debug(`Successfully updated DBSubnetGroup ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n DBSubnetGroupName: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update DBSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteDBSubnetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting DBSubnetGroup ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteDBSubnetGroupCommand({\n DBSubnetGroupName: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted DBSubnetGroup ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error, 'DBSubnetGroupNotFoundFault')) {\n this.logger.debug(`DBSubnetGroup ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete DBSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 DBCluster \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createDBCluster(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating DBCluster ${logicalId}`);\n\n const dbClusterIdentifier =\n (properties['DBClusterIdentifier'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 63, lowercase: true });\n\n try {\n const tags = this.buildTags(properties);\n\n const serverlessV2Config = properties['ServerlessV2ScalingConfiguration'] as\n | { MinCapacity?: number; MaxCapacity?: number }\n | undefined;\n\n const response = await this.getClient().send(\n new CreateDBClusterCommand({\n DBClusterIdentifier: dbClusterIdentifier,\n Engine: properties['Engine'] as string,\n EngineVersion: properties['EngineVersion'] as string | undefined,\n MasterUsername: properties['MasterUsername'] as string | undefined,\n MasterUserPassword: properties['MasterUserPassword'] as string | undefined,\n DatabaseName: properties['DatabaseName'] as string | undefined,\n Port: properties['Port'] != null ? Number(properties['Port']) : undefined,\n VpcSecurityGroupIds: properties['VpcSecurityGroupIds'] as string[] | undefined,\n DBSubnetGroupName: properties['DBSubnetGroupName'] as string | undefined,\n StorageEncrypted: properties['StorageEncrypted'] as boolean | undefined,\n KmsKeyId: properties['KmsKeyId'] as string | undefined,\n BackupRetentionPeriod:\n properties['BackupRetentionPeriod'] != null\n ? Number(properties['BackupRetentionPeriod'])\n : undefined,\n DeletionProtection: properties['DeletionProtection'] as boolean | undefined,\n ...(serverlessV2Config && {\n ServerlessV2ScalingConfiguration: {\n MinCapacity: serverlessV2Config.MinCapacity,\n MaxCapacity: serverlessV2Config.MaxCapacity,\n },\n }),\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n const cluster = response.DBCluster;\n if (!cluster) {\n throw new Error('CreateDBCluster did not return DBCluster');\n }\n\n this.logger.debug(`Successfully created DBCluster ${logicalId}: ${dbClusterIdentifier}`);\n\n // Wait for cluster to become available (skip with --no-wait)\n if (process.env['CDKD_NO_WAIT'] !== 'true') {\n await this.waitForClusterAvailable(dbClusterIdentifier);\n }\n\n // Describe to get final attributes\n const described = await this.describeDBCluster(dbClusterIdentifier);\n\n return {\n physicalId: dbClusterIdentifier,\n attributes: {\n 'Endpoint.Address': described?.Endpoint ?? '',\n 'Endpoint.Port': String(described?.Port ?? ''),\n 'ReadEndpoint.Address': described?.ReaderEndpoint ?? '',\n Arn: described?.DBClusterArn ?? '',\n DBClusterResourceId: described?.DbClusterResourceId ?? '',\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create DBCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n dbClusterIdentifier,\n cause\n );\n }\n }\n\n private async updateDBCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating DBCluster ${logicalId}: ${physicalId}`);\n\n try {\n const serverlessV2Config = properties['ServerlessV2ScalingConfiguration'] as\n | { MinCapacity?: number; MaxCapacity?: number }\n | undefined;\n\n await this.getClient().send(\n new ModifyDBClusterCommand({\n DBClusterIdentifier: physicalId,\n EngineVersion: properties['EngineVersion'] as string | undefined,\n DeletionProtection: properties['DeletionProtection'] as boolean | undefined,\n BackupRetentionPeriod:\n properties['BackupRetentionPeriod'] != null\n ? Number(properties['BackupRetentionPeriod'])\n : undefined,\n VpcSecurityGroupIds: properties['VpcSecurityGroupIds'] as string[] | undefined,\n MasterUserPassword: properties['MasterUserPassword'] as string | undefined,\n Port: properties['Port'] != null ? Number(properties['Port']) : undefined,\n ...(serverlessV2Config && {\n ServerlessV2ScalingConfiguration: {\n MinCapacity: serverlessV2Config.MinCapacity,\n MaxCapacity: serverlessV2Config.MaxCapacity,\n },\n }),\n ApplyImmediately: true,\n })\n );\n\n this.logger.debug(`Successfully updated DBCluster ${logicalId}`);\n\n // Describe to get updated attributes\n const described = await this.describeDBCluster(physicalId);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n 'Endpoint.Address': described?.Endpoint ?? '',\n 'Endpoint.Port': String(described?.Port ?? ''),\n 'ReadEndpoint.Address': described?.ReaderEndpoint ?? '',\n Arn: described?.DBClusterArn ?? '',\n DBClusterResourceId: described?.DbClusterResourceId ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update DBCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteDBCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting DBCluster ${logicalId}: ${physicalId}`);\n\n try {\n // Disable deletion protection before deleting if needed\n try {\n await this.getClient().send(\n new ModifyDBClusterCommand({\n DBClusterIdentifier: physicalId,\n DeletionProtection: false,\n })\n );\n } catch (disableError) {\n // Ignore errors from disabling deletion protection (cluster may already be deleted)\n if (!this.isNotFoundError(disableError, 'DBClusterNotFoundFault')) {\n this.logger.debug(\n `Could not disable deletion protection for ${physicalId}: ${disableError instanceof Error ? disableError.message : String(disableError)}`\n );\n }\n }\n\n await this.getClient().send(\n new DeleteDBClusterCommand({\n DBClusterIdentifier: physicalId,\n SkipFinalSnapshot: true,\n })\n );\n\n this.logger.debug(`Successfully initiated deletion of DBCluster ${logicalId}`);\n\n // Wait for cluster to be fully deleted\n await this.waitForClusterDeleted(physicalId);\n } catch (error) {\n if (this.isNotFoundError(error, 'DBClusterNotFoundFault')) {\n this.logger.debug(`DBCluster ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete DBCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 DBInstance \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createDBInstance(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating DBInstance ${logicalId}`);\n\n const dbInstanceIdentifier =\n (properties['DBInstanceIdentifier'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 63, lowercase: true });\n\n try {\n const tags = this.buildTags(properties);\n\n const response = await this.getClient().send(\n new CreateDBInstanceCommand({\n DBInstanceIdentifier: dbInstanceIdentifier,\n DBInstanceClass: properties['DBInstanceClass'] as string,\n Engine: properties['Engine'] as string,\n DBClusterIdentifier: properties['DBClusterIdentifier'] as string | undefined,\n DBSubnetGroupName: properties['DBSubnetGroupName'] as string | undefined,\n PubliclyAccessible: properties['PubliclyAccessible'] as boolean | undefined,\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n const instance = response.DBInstance;\n if (!instance) {\n throw new Error('CreateDBInstance did not return DBInstance');\n }\n\n this.logger.debug(`Successfully created DBInstance ${logicalId}: ${dbInstanceIdentifier}`);\n\n // Wait for instance to become available (skip with --no-wait)\n if (process.env['CDKD_NO_WAIT'] !== 'true') {\n await this.waitForInstanceAvailable(dbInstanceIdentifier);\n }\n\n // Describe to get final attributes\n const described = await this.describeDBInstance(dbInstanceIdentifier);\n\n return {\n physicalId: dbInstanceIdentifier,\n attributes: {\n 'Endpoint.Address': described?.Endpoint?.Address ?? '',\n 'Endpoint.Port': String(described?.Endpoint?.Port ?? ''),\n Arn: described?.DBInstanceArn ?? '',\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create DBInstance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n dbInstanceIdentifier,\n cause\n );\n }\n }\n\n private async updateDBInstance(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating DBInstance ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new ModifyDBInstanceCommand({\n DBInstanceIdentifier: physicalId,\n DBInstanceClass: properties['DBInstanceClass'] as string | undefined,\n PubliclyAccessible: properties['PubliclyAccessible'] as boolean | undefined,\n ApplyImmediately: true,\n })\n );\n\n this.logger.debug(`Successfully updated DBInstance ${logicalId}`);\n\n // Describe to get updated attributes\n const described = await this.describeDBInstance(physicalId);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n 'Endpoint.Address': described?.Endpoint?.Address ?? '',\n 'Endpoint.Port': String(described?.Endpoint?.Port ?? ''),\n Arn: described?.DBInstanceArn ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update DBInstance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteDBInstance(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting DBInstance ${logicalId}: ${physicalId}`);\n\n try {\n // Disable deletion protection before deleting if needed\n try {\n await this.getClient().send(\n new ModifyDBInstanceCommand({\n DBInstanceIdentifier: physicalId,\n DeletionProtection: false,\n ApplyImmediately: true,\n })\n );\n } catch (disableError) {\n if (!this.isNotFoundError(disableError, 'DBInstanceNotFoundFault')) {\n this.logger.debug(\n `Could not disable deletion protection for ${physicalId}: ${disableError instanceof Error ? disableError.message : String(disableError)}`\n );\n }\n }\n\n await this.getClient().send(\n new DeleteDBInstanceCommand({\n DBInstanceIdentifier: physicalId,\n SkipFinalSnapshot: true,\n })\n );\n\n this.logger.debug(`Successfully initiated deletion of DBInstance ${logicalId}`);\n\n // Wait for instance to be fully deleted\n await this.waitForInstanceDeleted(physicalId);\n } catch (error) {\n if (this.isNotFoundError(error, 'DBInstanceNotFoundFault')) {\n this.logger.debug(`DBInstance ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete DBInstance ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private buildTags(properties: Record<string, unknown>): Array<{ Key: string; Value: string }> {\n if (!properties['Tags']) return [];\n return properties['Tags'] as Array<{ Key: string; Value: string }>;\n }\n\n private isNotFoundError(error: unknown, faultName: string): boolean {\n if (!(error instanceof Error)) return false;\n const name = (error as { name?: string }).name ?? '';\n const message = error.message.toLowerCase();\n return (\n name === faultName || message.includes('not found') || message.includes('does not exist')\n );\n }\n\n private async describeDBCluster(dbClusterIdentifier: string) {\n const response = await this.getClient().send(\n new DescribeDBClustersCommand({\n DBClusterIdentifier: dbClusterIdentifier,\n })\n );\n return response.DBClusters?.[0];\n }\n\n private async describeDBInstance(dbInstanceIdentifier: string) {\n const response = await this.getClient().send(\n new DescribeDBInstancesCommand({\n DBInstanceIdentifier: dbInstanceIdentifier,\n })\n );\n return response.DBInstances?.[0];\n }\n\n /**\n * Wait for a DBCluster to become available\n */\n private async waitForClusterAvailable(\n dbClusterIdentifier: string,\n maxWaitMs = 600_000\n ): Promise<void> {\n const startTime = Date.now();\n let delay = 5_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n const cluster = await this.describeDBCluster(dbClusterIdentifier);\n const status = cluster?.Status;\n\n this.logger.debug(`DBCluster ${dbClusterIdentifier} status: ${status}`);\n\n if (status === 'available') return;\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for DBCluster ${dbClusterIdentifier} to become available`);\n }\n\n /**\n * Wait for a DBCluster to be deleted\n */\n private async waitForClusterDeleted(\n dbClusterIdentifier: string,\n maxWaitMs = 600_000\n ): Promise<void> {\n const startTime = Date.now();\n let delay = 5_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const cluster = await this.describeDBCluster(dbClusterIdentifier);\n const status = cluster?.Status;\n\n this.logger.debug(`DBCluster ${dbClusterIdentifier} status: ${status}`);\n\n if (!cluster) return;\n } catch (error) {\n if (this.isNotFoundError(error, 'DBClusterNotFoundFault')) {\n return;\n }\n throw error;\n }\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for DBCluster ${dbClusterIdentifier} to be deleted`);\n }\n\n /**\n * Wait for a DBInstance to become available\n */\n private async waitForInstanceAvailable(\n dbInstanceIdentifier: string,\n maxWaitMs = 600_000\n ): Promise<void> {\n const startTime = Date.now();\n let delay = 10_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n const instance = await this.describeDBInstance(dbInstanceIdentifier);\n const status = instance?.DBInstanceStatus;\n\n this.logger.debug(`DBInstance ${dbInstanceIdentifier} status: ${status}`);\n\n if (status === 'available') return;\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for DBInstance ${dbInstanceIdentifier} to become available`);\n }\n\n /**\n * Wait for a DBInstance to be deleted\n */\n private async waitForInstanceDeleted(\n dbInstanceIdentifier: string,\n maxWaitMs = 600_000\n ): Promise<void> {\n const startTime = Date.now();\n let delay = 10_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const instance = await this.describeDBInstance(dbInstanceIdentifier);\n const status = instance?.DBInstanceStatus;\n\n this.logger.debug(`DBInstance ${dbInstanceIdentifier} status: ${status}`);\n\n if (!instance) return;\n } catch (error) {\n if (this.isNotFoundError(error, 'DBInstanceNotFoundFault')) {\n return;\n }\n throw error;\n }\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for DBInstance ${dbInstanceIdentifier} to be deleted`);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n", "import {\n Route53Client,\n CreateHostedZoneCommand,\n DeleteHostedZoneCommand,\n GetHostedZoneCommand,\n ChangeResourceRecordSetsCommand,\n UpdateHostedZoneCommentCommand,\n ChangeTagsForResourceCommand,\n AssociateVPCWithHostedZoneCommand,\n DisassociateVPCFromHostedZoneCommand,\n CreateQueryLoggingConfigCommand,\n DeleteQueryLoggingConfigCommand,\n ListQueryLoggingConfigsCommand,\n ListHostedZonesByNameCommand,\n type ResourceRecordSet,\n type RRType,\n type VPCRegion,\n} from '@aws-sdk/client-route-53';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Route 53 Provider\n *\n * Implements resource provisioning for Route 53 resources:\n * - AWS::Route53::HostedZone\n * - AWS::Route53::RecordSet\n *\n * WHY: Route 53 operations are synchronous - the CC API adds unnecessary polling\n * overhead for operations that complete immediately. This SDK provider eliminates\n * that polling and returns instantly.\n */\nexport class Route53Provider implements ResourceProvider {\n private route53Client?: Route53Client;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('Route53Provider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Route53::HostedZone',\n new Set(['Name', 'HostedZoneConfig', 'HostedZoneTags', 'VPCs', 'QueryLoggingConfig']),\n ],\n [\n 'AWS::Route53::RecordSet',\n new Set([\n 'HostedZoneId',\n 'HostedZoneName',\n 'Name',\n 'Type',\n 'TTL',\n 'ResourceRecords',\n 'AliasTarget',\n 'SetIdentifier',\n 'Weight',\n 'Region',\n 'Failover',\n 'MultiValueAnswer',\n 'HealthCheckId',\n 'Comment',\n 'GeoLocation',\n ]),\n ],\n ]);\n\n private getClient(): Route53Client {\n if (!this.route53Client) {\n this.route53Client = new Route53Client(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.route53Client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::Route53::HostedZone':\n return this.createHostedZone(logicalId, resourceType, properties);\n case 'AWS::Route53::RecordSet':\n return this.createRecordSet(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::Route53::HostedZone':\n return this.updateHostedZone(logicalId, physicalId, resourceType, properties);\n case 'AWS::Route53::RecordSet':\n return this.updateRecordSet(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::Route53::HostedZone':\n return this.deleteHostedZone(logicalId, physicalId, resourceType);\n case 'AWS::Route53::RecordSet':\n return this.deleteRecordSet(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async getAttribute(\n physicalId: string,\n resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n switch (resourceType) {\n case 'AWS::Route53::HostedZone':\n return this.getHostedZoneAttribute(physicalId, attributeName);\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::Route53::HostedZone \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createHostedZone(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Route 53 hosted zone ${logicalId}`);\n\n const name = properties['Name'] as string;\n if (!name) {\n throw new ProvisioningError(\n `Name is required for hosted zone ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const hostedZoneConfig = properties['HostedZoneConfig'] as\n | Record<string, unknown>\n | undefined;\n\n // VPCs property (for private hosted zones)\n const vpcs = properties['VPCs'] as Array<Record<string, unknown>> | undefined;\n // For CreateHostedZone, only one VPC can be specified; additional VPCs are associated after creation\n const firstVpc = vpcs && vpcs.length > 0 ? vpcs[0] : undefined;\n\n const response = await this.getClient().send(\n new CreateHostedZoneCommand({\n Name: name,\n CallerReference: `${logicalId}-${Date.now()}`,\n ...(hostedZoneConfig && hostedZoneConfig['Comment']\n ? {\n HostedZoneConfig: {\n Comment: hostedZoneConfig['Comment'] as string,\n // When VPCs are specified, this is a private hosted zone\n ...(firstVpc ? { PrivateZone: true } : {}),\n },\n }\n : firstVpc\n ? { HostedZoneConfig: { PrivateZone: true } }\n : {}),\n ...(firstVpc\n ? {\n VPC: {\n VPCId: firstVpc['VPCId'] as string,\n VPCRegion: firstVpc['VPCRegion'] as VPCRegion | undefined,\n },\n }\n : {}),\n })\n );\n\n const hostedZone = response.HostedZone;\n if (!hostedZone?.Id) {\n throw new Error('CreateHostedZone did not return HostedZone.Id');\n }\n\n // Extract zone ID without /hostedzone/ prefix\n const zoneId = hostedZone.Id.replace('/hostedzone/', '');\n\n // Associate additional VPCs (index 1+) after creation\n if (vpcs && vpcs.length > 1) {\n for (let i = 1; i < vpcs.length; i++) {\n const additionalVpc = vpcs[i]!;\n this.logger.debug(\n `Associating additional VPC ${String(additionalVpc['VPCId'])} with hosted zone ${zoneId}`\n );\n await this.getClient().send(\n new AssociateVPCWithHostedZoneCommand({\n HostedZoneId: zoneId,\n VPC: {\n VPCId: additionalVpc['VPCId'] as string,\n VPCRegion: additionalVpc['VPCRegion'] as VPCRegion | undefined,\n },\n })\n );\n }\n }\n\n // Apply tags (HostedZoneTags)\n await this.applyHostedZoneTags(zoneId, properties, logicalId);\n\n // Configure query logging\n await this.applyQueryLoggingConfig(zoneId, properties, logicalId);\n\n // Collect name servers\n const nameServers = response.DelegationSet?.NameServers ?? [];\n\n this.logger.debug(`Successfully created hosted zone ${logicalId}: ${zoneId}`);\n\n return {\n physicalId: zoneId,\n attributes: {\n Id: zoneId,\n NameServers: nameServers.join(','),\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateHostedZone(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Route 53 hosted zone ${logicalId}: ${physicalId}`);\n\n try {\n const hostedZoneConfig = properties['HostedZoneConfig'] as\n | Record<string, unknown>\n | undefined;\n const comment = (hostedZoneConfig?.['Comment'] as string) ?? '';\n\n await this.getClient().send(\n new UpdateHostedZoneCommentCommand({\n Id: physicalId,\n Comment: comment,\n })\n );\n\n // Update tags (replace all tags)\n await this.applyHostedZoneTags(physicalId, properties, logicalId);\n\n // Update query logging config\n await this.applyQueryLoggingConfig(physicalId, properties, logicalId);\n\n // Note: VPC associations on update are complex (need to diff current vs desired).\n // For now, we handle VPCs that need to be added. Full diff requires GetHostedZone\n // to compare current VPCs, which we'll do here.\n await this.syncVPCAssociations(physicalId, properties, logicalId);\n\n // Retrieve name servers\n const getResponse = await this.getClient().send(new GetHostedZoneCommand({ Id: physicalId }));\n const nameServers = getResponse.DelegationSet?.NameServers ?? [];\n\n this.logger.debug(`Successfully updated hosted zone ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n NameServers: nameServers.join(','),\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteHostedZone(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Route 53 hosted zone ${logicalId}: ${physicalId}`);\n\n try {\n // Delete query logging config before deleting hosted zone\n await this.deleteQueryLoggingConfigForZone(physicalId, logicalId);\n\n await this.getClient().send(new DeleteHostedZoneCommand({ Id: physicalId }));\n this.logger.debug(`Successfully deleted hosted zone ${logicalId}`);\n } catch (error) {\n if (error instanceof Error && error.name === 'NoSuchHostedZone') {\n this.logger.debug(`Hosted zone ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async getHostedZoneAttribute(\n physicalId: string,\n attributeName: string\n ): Promise<unknown> {\n switch (attributeName) {\n case 'Id':\n return physicalId;\n case 'NameServers': {\n const response = await this.getClient().send(new GetHostedZoneCommand({ Id: physicalId }));\n return (response.DelegationSet?.NameServers ?? []).join(',');\n }\n default:\n return undefined;\n }\n }\n\n // \u2500\u2500\u2500 AWS::Route53::RecordSet \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createRecordSet(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Route 53 record set ${logicalId}`);\n\n const hostedZoneId = await this.resolveHostedZoneId(properties, logicalId, resourceType);\n\n const recordName = properties['Name'] as string;\n const recordType = properties['Type'] as string;\n\n try {\n const resourceRecordSet = this.buildResourceRecordSet(properties);\n\n const comment = properties['Comment'] as string | undefined;\n\n await this.getClient().send(\n new ChangeResourceRecordSetsCommand({\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n ...(comment ? { Comment: comment } : {}),\n Changes: [\n {\n Action: 'CREATE',\n ResourceRecordSet: resourceRecordSet,\n },\n ],\n },\n })\n );\n\n const compositeId = `${hostedZoneId}|${recordName}|${recordType}`;\n this.logger.debug(`Successfully created record set ${logicalId}: ${compositeId}`);\n\n return {\n physicalId: compositeId,\n attributes: {},\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create record set ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateRecordSet(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Route 53 record set ${logicalId}: ${physicalId}`);\n\n const hostedZoneId = await this.resolveHostedZoneId(\n properties,\n logicalId,\n resourceType,\n physicalId\n );\n\n const recordName = properties['Name'] as string;\n const recordType = properties['Type'] as string;\n\n try {\n const resourceRecordSet = this.buildResourceRecordSet(properties);\n\n const comment = properties['Comment'] as string | undefined;\n\n await this.getClient().send(\n new ChangeResourceRecordSetsCommand({\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n ...(comment ? { Comment: comment } : {}),\n Changes: [\n {\n Action: 'UPSERT',\n ResourceRecordSet: resourceRecordSet,\n },\n ],\n },\n })\n );\n\n const compositeId = `${hostedZoneId}|${recordName}|${recordType}`;\n this.logger.debug(`Successfully updated record set ${logicalId}`);\n\n return {\n physicalId: compositeId,\n wasReplaced: false,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update record set ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteRecordSet(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Route 53 record set ${logicalId}: ${physicalId}`);\n\n // Parse composite ID: hostedZoneId|name|type\n const parts = physicalId.split('|');\n if (parts.length !== 3) {\n throw new ProvisioningError(\n `Invalid record set physical ID format: ${physicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const [hostedZoneId] = parts;\n\n // We need the full record details for DELETE action\n if (!properties) {\n throw new ProvisioningError(\n `Properties required to delete record set ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n const resourceRecordSet = this.buildResourceRecordSet(properties);\n\n await this.getClient().send(\n new ChangeResourceRecordSetsCommand({\n HostedZoneId: hostedZoneId,\n ChangeBatch: {\n Changes: [\n {\n Action: 'DELETE',\n ResourceRecordSet: resourceRecordSet,\n },\n ],\n },\n })\n );\n\n this.logger.debug(`Successfully deleted record set ${logicalId}`);\n } catch (error) {\n // Treat \"not found\" errors as success for idempotency\n if (\n error instanceof Error &&\n (error.name === 'InvalidChangeBatch' || error.message.includes('it was not found'))\n ) {\n this.logger.debug(`Record set ${physicalId} does not exist, skipping deletion`);\n return;\n }\n if (error instanceof Error && error.name === 'NoSuchHostedZone') {\n this.logger.debug(\n `Hosted zone for record set ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete record set ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Build a ResourceRecordSet object from CDK properties.\n *\n * Handles conversion of CDK-style ResourceRecords (array of strings)\n * to SDK-style ResourceRecords (array of {Value}).\n * Also handles routing policy properties: Weight, Region, Failover,\n * MultiValueAnswer, GeoLocation, SetIdentifier, and HealthCheckId.\n */\n private buildResourceRecordSet(properties: Record<string, unknown>): ResourceRecordSet {\n const name = properties['Name'] as string;\n const type = properties['Type'] as string;\n const ttl = properties['TTL'] as string | number | undefined;\n const resourceRecords = properties['ResourceRecords'] as unknown[] | undefined;\n const aliasTarget = properties['AliasTarget'] as Record<string, unknown> | undefined;\n\n const recordSet: ResourceRecordSet = {\n Name: name,\n Type: type as RRType,\n };\n\n if (aliasTarget) {\n recordSet.AliasTarget = {\n HostedZoneId: aliasTarget['HostedZoneId'] as string,\n DNSName: aliasTarget['DNSName'] as string,\n EvaluateTargetHealth: (aliasTarget['EvaluateTargetHealth'] as boolean) ?? false,\n };\n } else {\n // Standard record with TTL and ResourceRecords\n if (ttl !== undefined) {\n recordSet.TTL = Number(ttl);\n }\n\n if (resourceRecords) {\n // CDK provides ResourceRecords as array of strings,\n // SDK expects array of {Value: string}\n recordSet.ResourceRecords = resourceRecords.map((record) => {\n if (typeof record === 'string') {\n return { Value: record };\n }\n // Already in {Value: string} format\n return record as { Value: string };\n });\n }\n }\n\n // Routing policy properties\n const setIdentifier = properties['SetIdentifier'] as string | undefined;\n if (setIdentifier) {\n recordSet.SetIdentifier = setIdentifier;\n }\n\n const weight = properties['Weight'] as number | string | undefined;\n if (weight !== undefined) {\n recordSet.Weight = Number(weight);\n }\n\n const region = properties['Region'] as string | undefined;\n if (region) {\n recordSet.Region = region as ResourceRecordSet['Region'];\n }\n\n const failover = properties['Failover'] as string | undefined;\n if (failover) {\n recordSet.Failover = failover as ResourceRecordSet['Failover'];\n }\n\n const multiValueAnswer = properties['MultiValueAnswer'] as boolean | string | undefined;\n if (multiValueAnswer !== undefined) {\n recordSet.MultiValueAnswer =\n typeof multiValueAnswer === 'string'\n ? multiValueAnswer.toLowerCase() === 'true'\n : multiValueAnswer;\n }\n\n const healthCheckId = properties['HealthCheckId'] as string | undefined;\n if (healthCheckId) {\n recordSet.HealthCheckId = healthCheckId;\n }\n\n const geoLocation = properties['GeoLocation'] as Record<string, unknown> | undefined;\n if (geoLocation) {\n recordSet.GeoLocation = {\n ...(geoLocation['ContinentCode']\n ? { ContinentCode: geoLocation['ContinentCode'] as string }\n : {}),\n ...(geoLocation['CountryCode']\n ? { CountryCode: geoLocation['CountryCode'] as string }\n : {}),\n ...(geoLocation['SubdivisionCode']\n ? { SubdivisionCode: geoLocation['SubdivisionCode'] as string }\n : {}),\n };\n }\n\n return recordSet;\n }\n\n // \u2500\u2500\u2500 HostedZone Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Apply tags to a hosted zone using ChangeTagsForResource.\n * CFn property: HostedZoneTags (array of {Key, Value}).\n */\n private async applyHostedZoneTags(\n zoneId: string,\n properties: Record<string, unknown>,\n logicalId: string\n ): Promise<void> {\n const tags = properties['HostedZoneTags'] as Array<{ Key: string; Value: string }> | undefined;\n if (!tags || !Array.isArray(tags) || tags.length === 0) return;\n\n try {\n await this.getClient().send(\n new ChangeTagsForResourceCommand({\n ResourceType: 'hostedzone',\n ResourceId: zoneId,\n AddTags: tags.map((t) => ({ Key: t.Key, Value: t.Value })),\n })\n );\n this.logger.debug(`Applied ${tags.length} tag(s) to hosted zone ${logicalId}`);\n } catch (error) {\n this.logger.warn(\n `Failed to apply tags to hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Apply QueryLoggingConfig to a hosted zone.\n * CFn property: QueryLoggingConfig ({ CloudWatchLogsLogGroupArn }).\n * Only one query logging config per hosted zone is allowed.\n */\n private async applyQueryLoggingConfig(\n zoneId: string,\n properties: Record<string, unknown>,\n logicalId: string\n ): Promise<void> {\n const queryLoggingConfig = properties['QueryLoggingConfig'] as\n | Record<string, unknown>\n | undefined;\n if (!queryLoggingConfig) return;\n\n const cloudWatchLogsLogGroupArn = queryLoggingConfig['CloudWatchLogsLogGroupArn'] as\n | string\n | undefined;\n if (!cloudWatchLogsLogGroupArn) return;\n\n try {\n // Delete existing query logging config first (only one allowed per zone)\n await this.deleteQueryLoggingConfigForZone(zoneId, logicalId);\n\n await this.getClient().send(\n new CreateQueryLoggingConfigCommand({\n HostedZoneId: zoneId,\n CloudWatchLogsLogGroupArn: cloudWatchLogsLogGroupArn,\n })\n );\n this.logger.debug(`Applied query logging config to hosted zone ${logicalId}`);\n } catch (error) {\n // QueryLoggingConfigAlreadyExists is not fatal if we tried to delete first\n if (error instanceof Error && error.name === 'QueryLoggingConfigAlreadyExists') {\n this.logger.debug(`Query logging config already exists for hosted zone ${logicalId}`);\n return;\n }\n this.logger.warn(\n `Failed to apply query logging config to hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Delete query logging config(s) for a hosted zone.\n */\n private async deleteQueryLoggingConfigForZone(zoneId: string, logicalId: string): Promise<void> {\n try {\n const listResponse = await this.getClient().send(\n new ListQueryLoggingConfigsCommand({ HostedZoneId: zoneId })\n );\n const configs = listResponse.QueryLoggingConfigs ?? [];\n for (const config of configs) {\n if (config.Id) {\n await this.getClient().send(new DeleteQueryLoggingConfigCommand({ Id: config.Id }));\n this.logger.debug(\n `Deleted query logging config ${config.Id} for hosted zone ${logicalId}`\n );\n }\n }\n } catch (error) {\n // NoSuchHostedZone or NoSuchQueryLoggingConfig are not fatal during cleanup\n if (\n error instanceof Error &&\n (error.name === 'NoSuchHostedZone' || error.name === 'NoSuchQueryLoggingConfig')\n ) {\n return;\n }\n this.logger.warn(\n `Failed to delete query logging config for hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Sync VPC associations for a private hosted zone during update.\n * Compares current VPC associations with desired ones and adds/removes as needed.\n */\n private async syncVPCAssociations(\n zoneId: string,\n properties: Record<string, unknown>,\n logicalId: string\n ): Promise<void> {\n const desiredVpcs = properties['VPCs'] as Array<Record<string, unknown>> | undefined;\n if (!desiredVpcs || desiredVpcs.length === 0) return;\n\n try {\n // Get current VPC associations\n const getResponse = await this.getClient().send(new GetHostedZoneCommand({ Id: zoneId }));\n const currentVpcs = getResponse.VPCs ?? [];\n\n const currentVpcIds = new Set(currentVpcs.map((v) => v.VPCId));\n const desiredVpcIds = new Set(desiredVpcs.map((v) => v['VPCId'] as string));\n\n // Associate new VPCs\n for (const vpc of desiredVpcs) {\n const vpcId = vpc['VPCId'] as string;\n if (!currentVpcIds.has(vpcId)) {\n this.logger.debug(`Associating VPC ${vpcId} with hosted zone ${zoneId}`);\n await this.getClient().send(\n new AssociateVPCWithHostedZoneCommand({\n HostedZoneId: zoneId,\n VPC: {\n VPCId: vpcId,\n VPCRegion: vpc['VPCRegion'] as VPCRegion | undefined,\n },\n })\n );\n }\n }\n\n // Disassociate removed VPCs (but never remove the last one)\n for (const vpc of currentVpcs) {\n if (vpc.VPCId && !desiredVpcIds.has(vpc.VPCId)) {\n // Don't disassociate if it would leave 0 VPCs\n if (currentVpcs.length <= 1) {\n this.logger.warn(\n `Cannot disassociate last VPC ${vpc.VPCId} from hosted zone ${logicalId}`\n );\n continue;\n }\n this.logger.debug(`Disassociating VPC ${vpc.VPCId} from hosted zone ${zoneId}`);\n await this.getClient().send(\n new DisassociateVPCFromHostedZoneCommand({\n HostedZoneId: zoneId,\n VPC: {\n VPCId: vpc.VPCId,\n VPCRegion: vpc.VPCRegion,\n },\n })\n );\n }\n }\n } catch (error) {\n this.logger.warn(\n `Failed to sync VPC associations for hosted zone ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // \u2500\u2500\u2500 RecordSet Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Resolve HostedZoneId from properties.\n * If HostedZoneId is provided, use it directly.\n * If HostedZoneName is provided, resolve it to a HostedZoneId via ListHostedZonesByName.\n */\n private async resolveHostedZoneId(\n properties: Record<string, unknown>,\n logicalId: string,\n resourceType: string,\n physicalId?: string\n ): Promise<string> {\n const hostedZoneId = properties['HostedZoneId'] as string | undefined;\n if (hostedZoneId) return hostedZoneId;\n\n const hostedZoneName = properties['HostedZoneName'] as string | undefined;\n if (hostedZoneName) {\n try {\n const response = await this.getClient().send(\n new ListHostedZonesByNameCommand({\n DNSName: hostedZoneName,\n MaxItems: 1,\n })\n );\n const zones = response.HostedZones ?? [];\n // Match the zone name (Route53 returns names with trailing dot)\n const normalizedName = hostedZoneName.endsWith('.') ? hostedZoneName : `${hostedZoneName}.`;\n const matchedZone = zones.find((z) => z.Name === normalizedName);\n if (matchedZone?.Id) {\n return matchedZone.Id.replace('/hostedzone/', '');\n }\n } catch (error) {\n this.logger.warn(\n `Failed to resolve HostedZoneName \"${hostedZoneName}\" for ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n throw new ProvisioningError(\n `Either HostedZoneId or HostedZoneName is required for record set ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n}\n", "import {\n WAFV2Client,\n CreateWebACLCommand,\n UpdateWebACLCommand,\n DeleteWebACLCommand,\n GetWebACLCommand,\n WAFNonexistentItemException,\n type Tag,\n type Rule,\n type DefaultAction,\n type VisibilityConfig,\n type Scope,\n type CaptchaConfig,\n type ChallengeConfig,\n type CustomResponseBody,\n type AssociationConfig,\n} from '@aws-sdk/client-wafv2';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * Parse WAFv2 WebACL ARN to extract Id, Name, and Scope.\n *\n * ARN format:\n * arn:aws:wafv2:{region}:{account}:regional/webacl/{name}/{id}\n * arn:aws:wafv2:{region}:{account}:global/webacl/{name}/{id}\n */\nfunction parseWebACLArn(arn: string): { id: string; name: string; scope: Scope } {\n // Example: arn:aws:wafv2:us-east-1:123456789012:regional/webacl/my-acl/abc-123\n const parts = arn.split(':');\n // parts[5] = \"regional/webacl/my-acl/abc-123\" or \"global/webacl/my-acl/abc-123\"\n const resourcePart = parts.slice(5).join(':');\n const segments = resourcePart.split('/');\n // segments: [\"regional\", \"webacl\", \"my-acl\", \"abc-123\"]\n const scopeRaw = segments[0]!; // \"regional\" or \"global\"\n const name = segments[2]!;\n const id = segments[3]!;\n\n const scope: Scope = scopeRaw === 'global' ? 'CLOUDFRONT' : 'REGIONAL';\n\n return { id, name, scope };\n}\n\n/**\n * AWS WAFv2 WebACL Provider\n *\n * Implements resource provisioning for AWS::WAFv2::WebACL using the WAFv2 SDK.\n * WHY: WAFv2 CreateWebACL is synchronous - the CC API adds unnecessary polling\n * overhead for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class WAFv2WebACLProvider implements ResourceProvider {\n private wafv2Client?: WAFV2Client;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('WAFv2WebACLProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::WAFv2::WebACL',\n new Set([\n 'Name',\n 'Scope',\n 'Tags',\n 'DefaultAction',\n 'Description',\n 'Rules',\n 'VisibilityConfig',\n 'CustomResponseBodies',\n 'CaptchaConfig',\n 'ChallengeConfig',\n 'TokenDomains',\n 'AssociationConfig',\n ]),\n ],\n ]);\n\n private getClient(): WAFV2Client {\n if (!this.wafv2Client) {\n this.wafv2Client = new WAFV2Client(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.wafv2Client;\n }\n\n /**\n * Create a WAFv2 WebACL\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating WAFv2 WebACL ${logicalId}`);\n\n const name =\n (properties['Name'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 128 });\n const scope = ((properties['Scope'] as string) || 'REGIONAL') as Scope;\n\n try {\n // Build tags\n const tags: Tag[] = [];\n if (properties['Tags']) {\n const tagList = properties['Tags'] as Array<{ Key: string; Value: string }>;\n for (const tag of tagList) {\n tags.push({ Key: tag.Key, Value: tag.Value });\n }\n }\n\n const response = await this.getClient().send(\n new CreateWebACLCommand({\n Name: name,\n Scope: scope,\n DefaultAction: properties['DefaultAction'] as DefaultAction,\n Description: properties['Description'] as string | undefined,\n Rules: (properties['Rules'] as Rule[]) || [],\n VisibilityConfig: properties['VisibilityConfig'] as VisibilityConfig,\n ...(tags.length > 0 && { Tags: tags }),\n CustomResponseBodies: properties['CustomResponseBodies'] as\n | Record<string, CustomResponseBody>\n | undefined,\n CaptchaConfig: properties['CaptchaConfig'] as CaptchaConfig | undefined,\n ChallengeConfig: properties['ChallengeConfig'] as ChallengeConfig | undefined,\n TokenDomains: properties['TokenDomains'] as string[] | undefined,\n AssociationConfig: properties['AssociationConfig'] as AssociationConfig | undefined,\n })\n );\n\n const summary = response.Summary;\n if (!summary?.ARN || !summary?.Id) {\n throw new Error('CreateWebACL did not return Summary with ARN and Id');\n }\n\n this.logger.debug(`Successfully created WAFv2 WebACL ${logicalId}: ${summary.ARN}`);\n\n return {\n physicalId: summary.ARN,\n attributes: {\n Arn: summary.ARN,\n Id: summary.Id,\n LabelNamespace: (summary as Record<string, unknown>)['LabelNamespace'],\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create WAFv2 WebACL ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a WAFv2 WebACL\n *\n * Name and Scope are immutable - changes to those require replacement.\n * UpdateWebACL requires LockToken obtained from GetWebACL.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating WAFv2 WebACL ${logicalId}: ${physicalId}`);\n\n try {\n const { id, name, scope } = parseWebACLArn(physicalId);\n\n // Get current WebACL to obtain LockToken\n const getResponse = await this.getClient().send(\n new GetWebACLCommand({\n Name: name,\n Scope: scope,\n Id: id,\n })\n );\n\n const lockToken = getResponse.LockToken;\n if (!lockToken) {\n throw new Error('GetWebACL did not return LockToken');\n }\n\n await this.getClient().send(\n new UpdateWebACLCommand({\n Name: name,\n Scope: scope,\n Id: id,\n LockToken: lockToken,\n DefaultAction: properties['DefaultAction'] as DefaultAction,\n Description: properties['Description'] as string | undefined,\n Rules: (properties['Rules'] as Rule[]) || [],\n VisibilityConfig: properties['VisibilityConfig'] as VisibilityConfig,\n CustomResponseBodies: properties['CustomResponseBodies'] as\n | Record<string, CustomResponseBody>\n | undefined,\n CaptchaConfig: properties['CaptchaConfig'] as CaptchaConfig | undefined,\n ChallengeConfig: properties['ChallengeConfig'] as ChallengeConfig | undefined,\n TokenDomains: properties['TokenDomains'] as string[] | undefined,\n AssociationConfig: properties['AssociationConfig'] as AssociationConfig | undefined,\n })\n );\n\n this.logger.debug(`Successfully updated WAFv2 WebACL ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: physicalId,\n Id: id,\n LabelNamespace: getResponse.WebACL?.LabelNamespace,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update WAFv2 WebACL ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a WAFv2 WebACL\n *\n * DeleteWebACL requires LockToken obtained from GetWebACL.\n * WAFNonexistentItemException is treated as success (idempotent delete).\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting WAFv2 WebACL ${logicalId}: ${physicalId}`);\n\n try {\n const { id, name, scope } = parseWebACLArn(physicalId);\n\n // Get LockToken\n const getResponse = await this.getClient().send(\n new GetWebACLCommand({\n Name: name,\n Scope: scope,\n Id: id,\n })\n );\n\n const lockToken = getResponse.LockToken;\n if (!lockToken) {\n throw new Error('GetWebACL did not return LockToken');\n }\n\n await this.getClient().send(\n new DeleteWebACLCommand({\n Name: name,\n Scope: scope,\n Id: id,\n LockToken: lockToken,\n })\n );\n\n this.logger.debug(`Successfully deleted WAFv2 WebACL ${logicalId}`);\n } catch (error) {\n if (error instanceof WAFNonexistentItemException) {\n this.logger.debug(`WAFv2 WebACL ${physicalId} does not exist, skipping deletion`);\n return;\n }\n\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete WAFv2 WebACL ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n CognitoIdentityProviderClient,\n CreateUserPoolCommand,\n DeleteUserPoolCommand,\n UpdateUserPoolCommand,\n DescribeUserPoolCommand,\n ResourceNotFoundException,\n type VerifiedAttributeType,\n type UsernameAttributeType,\n type AliasAttributeType,\n type UserPoolMfaType,\n type DeletionProtectionType,\n type SchemaAttributeType,\n type LambdaConfigType,\n type PasswordPolicyType,\n type AdminCreateUserConfigType,\n type AccountRecoverySettingType,\n type UserAttributeUpdateSettingsType,\n type EmailConfigurationType,\n type SmsConfigurationType,\n type VerificationMessageTemplateType,\n type UsernameConfigurationType,\n type DeviceConfigurationType,\n type UserPoolAddOnsType,\n type CreateUserPoolCommandInput,\n type UpdateUserPoolCommandInput,\n} from '@aws-sdk/client-cognito-identity-provider';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Cognito User Pool Provider\n *\n * Implements resource provisioning for AWS::Cognito::UserPool using the Cognito SDK.\n * WHY: CreateUserPool is synchronous - the CC API adds unnecessary polling overhead\n * (1s->2s->4s->8s) for an operation that completes immediately.\n * This SDK provider eliminates that polling and returns instantly.\n */\nexport class CognitoUserPoolProvider implements ResourceProvider {\n private cognitoClient?: CognitoIdentityProviderClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('CognitoUserPoolProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Cognito::UserPool',\n new Set([\n 'UserPoolName',\n 'AutoVerifiedAttributes',\n 'UsernameAttributes',\n 'AliasAttributes',\n 'Policies',\n 'Schema',\n 'LambdaConfig',\n 'MfaConfiguration',\n 'UserPoolTags',\n 'AdminCreateUserConfig',\n 'AccountRecoverySetting',\n 'UserAttributeUpdateSettings',\n 'DeletionProtection',\n 'EmailConfiguration',\n 'SmsConfiguration',\n 'VerificationMessageTemplate',\n 'UsernameConfiguration',\n 'DeviceConfiguration',\n 'UserPoolAddOns',\n 'EmailVerificationMessage',\n 'EmailVerificationSubject',\n 'SmsAuthenticationMessage',\n 'SmsVerificationMessage',\n ]),\n ],\n ]);\n\n private getClient(): CognitoIdentityProviderClient {\n if (!this.cognitoClient) {\n this.cognitoClient = new CognitoIdentityProviderClient(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.cognitoClient;\n }\n\n /**\n * Create a Cognito User Pool\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Cognito User Pool ${logicalId}`);\n\n const poolName =\n (properties['UserPoolName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 128 });\n\n try {\n const createParams: CreateUserPoolCommandInput = {\n PoolName: poolName,\n };\n\n if (properties['AutoVerifiedAttributes']) {\n createParams.AutoVerifiedAttributes = properties[\n 'AutoVerifiedAttributes'\n ] as VerifiedAttributeType[];\n }\n if (properties['UsernameAttributes']) {\n createParams.UsernameAttributes = properties[\n 'UsernameAttributes'\n ] as UsernameAttributeType[];\n }\n if (properties['Policies']) {\n const policies = properties['Policies'] as Record<string, unknown>;\n if (policies['PasswordPolicy']) {\n createParams.Policies = {\n PasswordPolicy: policies['PasswordPolicy'] as PasswordPolicyType,\n };\n }\n }\n if (properties['Schema']) {\n createParams.Schema = properties['Schema'] as SchemaAttributeType[];\n }\n if (properties['LambdaConfig']) {\n createParams.LambdaConfig = properties['LambdaConfig'] as LambdaConfigType;\n }\n if (properties['MfaConfiguration']) {\n createParams.MfaConfiguration = properties['MfaConfiguration'] as UserPoolMfaType;\n }\n if (properties['UserPoolTags']) {\n createParams.UserPoolTags = properties['UserPoolTags'] as Record<string, string>;\n }\n if (properties['AdminCreateUserConfig']) {\n createParams.AdminCreateUserConfig = properties[\n 'AdminCreateUserConfig'\n ] as AdminCreateUserConfigType;\n }\n if (properties['AccountRecoverySetting']) {\n createParams.AccountRecoverySetting = properties[\n 'AccountRecoverySetting'\n ] as AccountRecoverySettingType;\n }\n if (properties['UserAttributeUpdateSettings']) {\n createParams.UserAttributeUpdateSettings = properties[\n 'UserAttributeUpdateSettings'\n ] as UserAttributeUpdateSettingsType;\n }\n if (properties['DeletionProtection']) {\n createParams.DeletionProtection = properties[\n 'DeletionProtection'\n ] as DeletionProtectionType;\n }\n if (properties['AliasAttributes']) {\n createParams.AliasAttributes = properties['AliasAttributes'] as AliasAttributeType[];\n }\n if (properties['EmailConfiguration']) {\n createParams.EmailConfiguration = properties[\n 'EmailConfiguration'\n ] as EmailConfigurationType;\n }\n if (properties['SmsConfiguration']) {\n createParams.SmsConfiguration = properties['SmsConfiguration'] as SmsConfigurationType;\n }\n if (properties['VerificationMessageTemplate']) {\n createParams.VerificationMessageTemplate = properties[\n 'VerificationMessageTemplate'\n ] as VerificationMessageTemplateType;\n }\n if (properties['UsernameConfiguration']) {\n createParams.UsernameConfiguration = properties[\n 'UsernameConfiguration'\n ] as UsernameConfigurationType;\n }\n if (properties['DeviceConfiguration']) {\n createParams.DeviceConfiguration = properties[\n 'DeviceConfiguration'\n ] as DeviceConfigurationType;\n }\n if (properties['UserPoolAddOns']) {\n createParams.UserPoolAddOns = properties['UserPoolAddOns'] as UserPoolAddOnsType;\n }\n if (properties['EmailVerificationMessage']) {\n createParams.EmailVerificationMessage = properties['EmailVerificationMessage'] as string;\n }\n if (properties['EmailVerificationSubject']) {\n createParams.EmailVerificationSubject = properties['EmailVerificationSubject'] as string;\n }\n if (properties['SmsAuthenticationMessage']) {\n createParams.SmsAuthenticationMessage = properties['SmsAuthenticationMessage'] as string;\n }\n if (properties['SmsVerificationMessage']) {\n createParams.SmsVerificationMessage = properties['SmsVerificationMessage'] as string;\n }\n\n const response = await this.getClient().send(new CreateUserPoolCommand(createParams));\n\n const userPool = response.UserPool;\n if (!userPool?.Id) {\n throw new Error('CreateUserPool did not return UserPool.Id');\n }\n\n const userPoolId = userPool.Id;\n const userPoolArn = userPool.Arn;\n const region = await this.getClient().config.region();\n const providerName = `cognito-idp.${region}.amazonaws.com/${userPoolId}`;\n const providerUrl = `https://cognito-idp.${region}.amazonaws.com/${userPoolId}`;\n\n this.logger.debug(`Successfully created Cognito User Pool ${logicalId}: ${userPoolId}`);\n\n return {\n physicalId: userPoolId,\n attributes: {\n Arn: userPoolArn,\n ProviderName: providerName,\n ProviderURL: providerUrl,\n UserPoolId: userPoolId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Cognito User Pool ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n poolName,\n cause\n );\n }\n }\n\n /**\n * Update a Cognito User Pool\n *\n * Note: PoolName (UserPoolName) and Schema are immutable and cannot be changed after creation.\n * Changes to these properties require resource replacement.\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Cognito User Pool ${logicalId}: ${physicalId}`);\n\n try {\n const updateParams: UpdateUserPoolCommandInput = {\n UserPoolId: physicalId,\n };\n\n if (properties['Policies']) {\n const policies = properties['Policies'] as Record<string, unknown>;\n if (policies['PasswordPolicy']) {\n updateParams.Policies = {\n PasswordPolicy: policies['PasswordPolicy'] as PasswordPolicyType,\n };\n }\n }\n if (properties['LambdaConfig']) {\n updateParams.LambdaConfig = properties['LambdaConfig'] as LambdaConfigType;\n }\n if (properties['AutoVerifiedAttributes']) {\n updateParams.AutoVerifiedAttributes = properties[\n 'AutoVerifiedAttributes'\n ] as VerifiedAttributeType[];\n }\n if (properties['MfaConfiguration']) {\n updateParams.MfaConfiguration = properties['MfaConfiguration'] as UserPoolMfaType;\n }\n if (properties['AdminCreateUserConfig']) {\n updateParams.AdminCreateUserConfig = properties[\n 'AdminCreateUserConfig'\n ] as AdminCreateUserConfigType;\n }\n if (properties['AccountRecoverySetting']) {\n updateParams.AccountRecoverySetting = properties[\n 'AccountRecoverySetting'\n ] as AccountRecoverySettingType;\n }\n if (properties['UserPoolTags']) {\n updateParams.UserPoolTags = properties['UserPoolTags'] as Record<string, string>;\n }\n if (properties['DeletionProtection']) {\n updateParams.DeletionProtection = properties[\n 'DeletionProtection'\n ] as DeletionProtectionType;\n }\n if (properties['UserAttributeUpdateSettings']) {\n updateParams.UserAttributeUpdateSettings = properties[\n 'UserAttributeUpdateSettings'\n ] as UserAttributeUpdateSettingsType;\n }\n if (properties['EmailConfiguration']) {\n updateParams.EmailConfiguration = properties[\n 'EmailConfiguration'\n ] as EmailConfigurationType;\n }\n if (properties['SmsConfiguration']) {\n updateParams.SmsConfiguration = properties['SmsConfiguration'] as SmsConfigurationType;\n }\n if (properties['VerificationMessageTemplate']) {\n updateParams.VerificationMessageTemplate = properties[\n 'VerificationMessageTemplate'\n ] as VerificationMessageTemplateType;\n }\n if (properties['DeviceConfiguration']) {\n updateParams.DeviceConfiguration = properties[\n 'DeviceConfiguration'\n ] as DeviceConfigurationType;\n }\n if (properties['UserPoolAddOns']) {\n updateParams.UserPoolAddOns = properties['UserPoolAddOns'] as UserPoolAddOnsType;\n }\n if (properties['EmailVerificationMessage']) {\n updateParams.EmailVerificationMessage = properties['EmailVerificationMessage'] as string;\n }\n if (properties['EmailVerificationSubject']) {\n updateParams.EmailVerificationSubject = properties['EmailVerificationSubject'] as string;\n }\n if (properties['SmsAuthenticationMessage']) {\n updateParams.SmsAuthenticationMessage = properties['SmsAuthenticationMessage'] as string;\n }\n if (properties['SmsVerificationMessage']) {\n updateParams.SmsVerificationMessage = properties['SmsVerificationMessage'] as string;\n }\n\n await this.getClient().send(new UpdateUserPoolCommand(updateParams));\n\n this.logger.debug(`Successfully updated Cognito User Pool ${logicalId}`);\n\n // Describe the user pool to get updated attributes\n const describeResponse = await this.getClient().send(\n new DescribeUserPoolCommand({ UserPoolId: physicalId })\n );\n\n const userPool = describeResponse.UserPool;\n const region = await this.getClient().config.region();\n const providerName = `cognito-idp.${region}.amazonaws.com/${physicalId}`;\n const providerUrl = `https://cognito-idp.${region}.amazonaws.com/${physicalId}`;\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: userPool?.Arn,\n ProviderName: providerName,\n ProviderURL: providerUrl,\n UserPoolId: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Cognito User Pool ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Cognito User Pool\n *\n * If DeletionProtection is ACTIVE, it is automatically disabled before deletion.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Cognito User Pool ${logicalId}: ${physicalId}`);\n\n try {\n // Check if DeletionProtection is ACTIVE and disable it before deletion\n const deletionProtection = properties?.['DeletionProtection'] as string | undefined;\n if (deletionProtection === 'ACTIVE') {\n this.logger.debug(\n `Disabling DeletionProtection on Cognito User Pool ${physicalId} before deletion`\n );\n await this.getClient().send(\n new UpdateUserPoolCommand({\n UserPoolId: physicalId,\n DeletionProtection: 'INACTIVE',\n })\n );\n } else {\n // Properties may not reflect current state; describe to check\n try {\n const describeResponse = await this.getClient().send(\n new DescribeUserPoolCommand({ UserPoolId: physicalId })\n );\n if (describeResponse.UserPool?.DeletionProtection === 'ACTIVE') {\n this.logger.debug(\n `Disabling DeletionProtection on Cognito User Pool ${physicalId} before deletion`\n );\n await this.getClient().send(\n new UpdateUserPoolCommand({\n UserPoolId: physicalId,\n DeletionProtection: 'INACTIVE',\n })\n );\n }\n } catch (descError) {\n if (descError instanceof ResourceNotFoundException) {\n this.logger.debug(`Cognito User Pool ${physicalId} does not exist, skipping deletion`);\n return;\n }\n // If describe fails for another reason, proceed with delete attempt anyway\n this.logger.debug(\n `Failed to describe Cognito User Pool ${physicalId}, proceeding with delete`\n );\n }\n }\n\n await this.getClient().send(new DeleteUserPoolCommand({ UserPoolId: physicalId }));\n this.logger.debug(`Successfully deleted Cognito User Pool ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Cognito User Pool ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Cognito User Pool ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n ElastiCacheClient,\n CreateCacheClusterCommand,\n DeleteCacheClusterCommand,\n DescribeCacheClustersCommand,\n CreateCacheSubnetGroupCommand,\n DeleteCacheSubnetGroupCommand,\n ModifyCacheSubnetGroupCommand,\n ModifyCacheClusterCommand,\n type AZMode,\n type LogDeliveryConfigurationRequest,\n type NetworkType,\n type IpDiscovery,\n} from '@aws-sdk/client-elasticache';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS ElastiCache Provider\n *\n * Implements resource provisioning for ElastiCache resources:\n * - AWS::ElastiCache::SubnetGroup\n * - AWS::ElastiCache::CacheCluster\n *\n * WHY: ElastiCache SDK calls are direct and avoid CC API polling overhead.\n * CacheCluster creation requires polling until available.\n */\nexport class ElastiCacheProvider implements ResourceProvider {\n private client?: ElastiCacheClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ElastiCacheProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::ElastiCache::SubnetGroup',\n new Set(['CacheSubnetGroupName', 'CacheSubnetGroupDescription', 'SubnetIds', 'Tags']),\n ],\n [\n 'AWS::ElastiCache::CacheCluster',\n new Set([\n 'ClusterName',\n 'Engine',\n 'CacheNodeType',\n 'NumCacheNodes',\n 'CacheSubnetGroupName',\n 'VpcSecurityGroupIds',\n 'Port',\n 'EngineVersion',\n 'CacheParameterGroupName',\n 'PreferredMaintenanceWindow',\n 'AZMode',\n 'PreferredAvailabilityZone',\n 'PreferredAvailabilityZones',\n 'SnapshotRetentionLimit',\n 'SnapshotWindow',\n 'AutoMinorVersionUpgrade',\n 'Tags',\n 'NotificationTopicArn',\n 'SnapshotName',\n 'LogDeliveryConfigurations',\n 'NetworkType',\n 'IpDiscovery',\n 'TransitEncryptionEnabled',\n ]),\n ],\n ]);\n\n private getClient(): ElastiCacheClient {\n if (!this.client) {\n this.client = new ElastiCacheClient(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ElastiCache::SubnetGroup':\n return this.createSubnetGroup(logicalId, resourceType, properties);\n case 'AWS::ElastiCache::CacheCluster':\n return this.createCacheCluster(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::ElastiCache::SubnetGroup':\n return this.updateSubnetGroup(logicalId, physicalId, resourceType, properties);\n case 'AWS::ElastiCache::CacheCluster':\n return this.updateCacheCluster(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ElastiCache::SubnetGroup':\n return this.deleteSubnetGroup(logicalId, physicalId, resourceType);\n case 'AWS::ElastiCache::CacheCluster':\n return this.deleteCacheCluster(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 SubnetGroup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createSubnetGroup(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CacheSubnetGroup ${logicalId}`);\n\n const cacheSubnetGroupName =\n (properties['CacheSubnetGroupName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 255, lowercase: true });\n\n try {\n await this.getClient().send(\n new CreateCacheSubnetGroupCommand({\n CacheSubnetGroupName: cacheSubnetGroupName,\n CacheSubnetGroupDescription:\n (properties['CacheSubnetGroupDescription'] as string) ||\n `Subnet group for ${logicalId}`,\n SubnetIds: properties['SubnetIds'] as string[],\n })\n );\n\n this.logger.debug(\n `Successfully created CacheSubnetGroup ${logicalId}: ${cacheSubnetGroupName}`\n );\n\n return {\n physicalId: cacheSubnetGroupName,\n attributes: {\n CacheSubnetGroupName: cacheSubnetGroupName,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CacheSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n cacheSubnetGroupName,\n cause\n );\n }\n }\n\n private async updateSubnetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CacheSubnetGroup ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new ModifyCacheSubnetGroupCommand({\n CacheSubnetGroupName: physicalId,\n CacheSubnetGroupDescription: properties['CacheSubnetGroupDescription'] as\n | string\n | undefined,\n SubnetIds: properties['SubnetIds'] as string[],\n })\n );\n\n this.logger.debug(`Successfully updated CacheSubnetGroup ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n CacheSubnetGroupName: physicalId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CacheSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteSubnetGroup(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting CacheSubnetGroup ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteCacheSubnetGroupCommand({\n CacheSubnetGroupName: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted CacheSubnetGroup ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error, 'CacheSubnetGroupNotFoundFault')) {\n this.logger.debug(`CacheSubnetGroup ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CacheSubnetGroup ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 CacheCluster \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createCacheCluster(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CacheCluster ${logicalId}`);\n\n const cacheClusterId =\n (properties['ClusterName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 40, lowercase: true });\n\n try {\n const tags = this.buildTags(properties);\n\n await this.getClient().send(\n new CreateCacheClusterCommand({\n CacheClusterId: cacheClusterId,\n Engine: properties['Engine'] as string,\n CacheNodeType: properties['CacheNodeType'] as string,\n NumCacheNodes:\n properties['NumCacheNodes'] != null ? Number(properties['NumCacheNodes']) : undefined,\n CacheSubnetGroupName: properties['CacheSubnetGroupName'] as string | undefined,\n SecurityGroupIds: properties['VpcSecurityGroupIds'] as string[] | undefined,\n Port: properties['Port'] != null ? Number(properties['Port']) : undefined,\n EngineVersion: properties['EngineVersion'] as string | undefined,\n CacheParameterGroupName: properties['CacheParameterGroupName'] as string | undefined,\n PreferredMaintenanceWindow: properties['PreferredMaintenanceWindow'] as\n | string\n | undefined,\n AZMode: properties['AZMode'] as AZMode | undefined,\n PreferredAvailabilityZone: properties['PreferredAvailabilityZone'] as string | undefined,\n PreferredAvailabilityZones: properties['PreferredAvailabilityZones'] as\n | string[]\n | undefined,\n SnapshotRetentionLimit:\n properties['SnapshotRetentionLimit'] != null\n ? Number(properties['SnapshotRetentionLimit'])\n : undefined,\n SnapshotWindow: properties['SnapshotWindow'] as string | undefined,\n AutoMinorVersionUpgrade: properties['AutoMinorVersionUpgrade'] as boolean | undefined,\n NotificationTopicArn: properties['NotificationTopicArn'] as string | undefined,\n SnapshotName: properties['SnapshotName'] as string | undefined,\n LogDeliveryConfigurations: properties['LogDeliveryConfigurations'] as\n | LogDeliveryConfigurationRequest[]\n | undefined,\n NetworkType: properties['NetworkType'] as NetworkType | undefined,\n IpDiscovery: properties['IpDiscovery'] as IpDiscovery | undefined,\n TransitEncryptionEnabled: properties['TransitEncryptionEnabled'] as boolean | undefined,\n ...(tags.length > 0 && { Tags: tags }),\n })\n );\n\n this.logger.debug(`Successfully created CacheCluster ${logicalId}: ${cacheClusterId}`);\n\n // Wait for cluster to become available (skip with --no-wait)\n if (process.env['CDKD_NO_WAIT'] !== 'true') {\n await this.waitForClusterAvailable(cacheClusterId);\n }\n\n // Describe to get final attributes\n const described = await this.describeCacheCluster(cacheClusterId);\n\n const attributes: Record<string, unknown> = {};\n\n // Redis endpoint attributes\n if (described?.CacheNodes?.[0]?.Endpoint) {\n const endpoint = described.CacheNodes[0].Endpoint;\n attributes['RedisEndpoint.Address'] = endpoint.Address ?? '';\n attributes['RedisEndpoint.Port'] = String(endpoint.Port ?? '');\n }\n\n // Configuration endpoint (for Memcached clusters)\n if (described?.ConfigurationEndpoint) {\n attributes['ConfigurationEndpoint.Address'] = described.ConfigurationEndpoint.Address ?? '';\n attributes['ConfigurationEndpoint.Port'] = String(\n described.ConfigurationEndpoint.Port ?? ''\n );\n }\n\n return {\n physicalId: cacheClusterId,\n attributes,\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CacheCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n cacheClusterId,\n cause\n );\n }\n }\n\n private async updateCacheCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CacheCluster ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new ModifyCacheClusterCommand({\n CacheClusterId: physicalId,\n NumCacheNodes:\n properties['NumCacheNodes'] != null ? Number(properties['NumCacheNodes']) : undefined,\n SecurityGroupIds: properties['VpcSecurityGroupIds'] as string[] | undefined,\n CacheParameterGroupName: properties['CacheParameterGroupName'] as string | undefined,\n EngineVersion: properties['EngineVersion'] as string | undefined,\n PreferredMaintenanceWindow: properties['PreferredMaintenanceWindow'] as\n | string\n | undefined,\n SnapshotRetentionLimit:\n properties['SnapshotRetentionLimit'] != null\n ? Number(properties['SnapshotRetentionLimit'])\n : undefined,\n SnapshotWindow: properties['SnapshotWindow'] as string | undefined,\n AutoMinorVersionUpgrade: properties['AutoMinorVersionUpgrade'] as boolean | undefined,\n NotificationTopicArn: properties['NotificationTopicArn'] as string | undefined,\n LogDeliveryConfigurations: properties['LogDeliveryConfigurations'] as\n | LogDeliveryConfigurationRequest[]\n | undefined,\n IpDiscovery: properties['IpDiscovery'] as IpDiscovery | undefined,\n ApplyImmediately: true,\n })\n );\n\n this.logger.debug(`Successfully updated CacheCluster ${logicalId}`);\n\n // Wait for cluster to become available after modification\n await this.waitForClusterAvailable(physicalId);\n\n // Describe to get updated attributes\n const described = await this.describeCacheCluster(physicalId);\n\n const attributes: Record<string, unknown> = {};\n\n if (described?.CacheNodes?.[0]?.Endpoint) {\n const endpoint = described.CacheNodes[0].Endpoint;\n attributes['RedisEndpoint.Address'] = endpoint.Address ?? '';\n attributes['RedisEndpoint.Port'] = String(endpoint.Port ?? '');\n }\n\n if (described?.ConfigurationEndpoint) {\n attributes['ConfigurationEndpoint.Address'] = described.ConfigurationEndpoint.Address ?? '';\n attributes['ConfigurationEndpoint.Port'] = String(\n described.ConfigurationEndpoint.Port ?? ''\n );\n }\n\n return {\n physicalId,\n wasReplaced: false,\n attributes,\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CacheCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteCacheCluster(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting CacheCluster ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteCacheClusterCommand({\n CacheClusterId: physicalId,\n })\n );\n\n this.logger.debug(`Successfully initiated deletion of CacheCluster ${logicalId}`);\n\n // Wait for cluster to be fully deleted\n await this.waitForClusterDeleted(physicalId);\n } catch (error) {\n if (this.isNotFoundError(error, 'CacheClusterNotFoundFault')) {\n this.logger.debug(`CacheCluster ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CacheCluster ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private buildTags(properties: Record<string, unknown>): Array<{ Key: string; Value: string }> {\n if (!properties['Tags']) return [];\n return properties['Tags'] as Array<{ Key: string; Value: string }>;\n }\n\n private isNotFoundError(error: unknown, faultName: string): boolean {\n if (!(error instanceof Error)) return false;\n const name = (error as { name?: string }).name ?? '';\n const message = error.message.toLowerCase();\n return (\n name === faultName || message.includes('not found') || message.includes('does not exist')\n );\n }\n\n private async describeCacheCluster(cacheClusterId: string) {\n const response = await this.getClient().send(\n new DescribeCacheClustersCommand({\n CacheClusterId: cacheClusterId,\n ShowCacheNodeInfo: true,\n })\n );\n return response.CacheClusters?.[0];\n }\n\n /**\n * Wait for a CacheCluster to become available\n */\n private async waitForClusterAvailable(\n cacheClusterId: string,\n maxWaitMs = 600_000\n ): Promise<void> {\n const startTime = Date.now();\n let delay = 10_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n const cluster = await this.describeCacheCluster(cacheClusterId);\n const status = cluster?.CacheClusterStatus;\n\n this.logger.debug(`CacheCluster ${cacheClusterId} status: ${status}`);\n\n if (status === 'available') return;\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for CacheCluster ${cacheClusterId} to become available`);\n }\n\n /**\n * Wait for a CacheCluster to be deleted\n */\n private async waitForClusterDeleted(cacheClusterId: string, maxWaitMs = 600_000): Promise<void> {\n const startTime = Date.now();\n let delay = 10_000;\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const cluster = await this.describeCacheCluster(cacheClusterId);\n const status = cluster?.CacheClusterStatus;\n\n this.logger.debug(`CacheCluster ${cacheClusterId} status: ${status}`);\n\n if (!cluster) return;\n } catch (error) {\n if (this.isNotFoundError(error, 'CacheClusterNotFoundFault')) {\n return;\n }\n throw error;\n }\n\n await this.sleep(delay);\n delay = Math.min(delay * 2, 30_000);\n }\n\n throw new Error(`Timed out waiting for CacheCluster ${cacheClusterId} to be deleted`);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n", "import {\n ServiceDiscoveryClient,\n CreatePrivateDnsNamespaceCommand,\n DeleteNamespaceCommand,\n CreateServiceCommand,\n DeleteServiceCommand,\n GetOperationCommand,\n NamespaceNotFound,\n ServiceNotFound,\n type DnsConfig,\n type HealthCheckCustomConfig,\n type HealthCheckConfig,\n type Tag,\n type ServiceTypeOption,\n} from '@aws-sdk/client-servicediscovery';\nimport { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Service Discovery Provider\n *\n * Implements resource provisioning for:\n * - AWS::ServiceDiscovery::PrivateDnsNamespace\n * - AWS::ServiceDiscovery::Service\n *\n * WHY: CreatePrivateDnsNamespace is async (returns OperationId) but we handle\n * the polling ourselves, avoiding the CC API's generic polling overhead and\n * giving us direct control over the operation lifecycle.\n */\nexport class ServiceDiscoveryProvider implements ResourceProvider {\n private client?: ServiceDiscoveryClient;\n private stsClient?: STSClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ServiceDiscoveryProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::ServiceDiscovery::PrivateDnsNamespace', new Set(['Name', 'Vpc', 'Description', 'Tags'])],\n [\n 'AWS::ServiceDiscovery::Service',\n new Set([\n 'Name',\n 'NamespaceId',\n 'DnsConfig',\n 'HealthCheckCustomConfig',\n 'Description',\n 'HealthCheckConfig',\n 'Tags',\n 'Type',\n ]),\n ],\n ]);\n\n private getClient(): ServiceDiscoveryClient {\n if (!this.client) {\n this.client = new ServiceDiscoveryClient(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.client;\n }\n\n private getStsClient(): STSClient {\n if (!this.stsClient) {\n this.stsClient = new STSClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.stsClient;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::ServiceDiscovery::PrivateDnsNamespace':\n return this.createNamespace(logicalId, resourceType, properties);\n case 'AWS::ServiceDiscovery::Service':\n return this.createService(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::ServiceDiscovery::PrivateDnsNamespace':\n return this.updateNamespace(logicalId, physicalId);\n case 'AWS::ServiceDiscovery::Service':\n return this.updateService(logicalId, physicalId);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::ServiceDiscovery::PrivateDnsNamespace':\n return this.deleteNamespace(logicalId, physicalId, resourceType);\n case 'AWS::ServiceDiscovery::Service':\n return this.deleteService(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::ServiceDiscovery::PrivateDnsNamespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createNamespace(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating private DNS namespace ${logicalId}`);\n const client = this.getClient();\n\n const name = properties['Name'] as string;\n const vpc = properties['Vpc'] as string;\n const description = properties['Description'] as string | undefined;\n const tags = properties['Tags'] as Tag[] | undefined;\n\n if (!name) {\n throw new ProvisioningError(\n `Name is required for PrivateDnsNamespace ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n if (!vpc) {\n throw new ProvisioningError(\n `Vpc is required for PrivateDnsNamespace ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await client.send(\n new CreatePrivateDnsNamespaceCommand({\n Name: name,\n Vpc: vpc,\n ...(description && { Description: description }),\n ...(tags && tags.length > 0 && { Tags: tags }),\n })\n );\n\n const operationId = response.OperationId;\n if (!operationId) {\n throw new Error('CreatePrivateDnsNamespace did not return OperationId');\n }\n\n // Poll for operation completion\n const namespaceId = await this.pollOperation(operationId, logicalId, resourceType);\n\n // Build ARN\n const arn = await this.buildNamespaceArn(namespaceId);\n\n this.logger.debug(`Successfully created private DNS namespace ${logicalId}: ${namespaceId}`);\n\n return {\n physicalId: namespaceId,\n attributes: {\n Id: namespaceId,\n Arn: arn,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) throw error;\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create private DNS namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateNamespace(logicalId: string, physicalId: string): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating private DNS namespace ${logicalId}: ${physicalId} (no-op)`);\n // Name and Vpc are immutable; updates require replacement (handled by deployment layer)\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n },\n });\n }\n\n private async deleteNamespace(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting private DNS namespace ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n try {\n const response = await client.send(new DeleteNamespaceCommand({ Id: physicalId }));\n\n const operationId = response.OperationId;\n if (operationId) {\n await this.pollOperation(operationId, logicalId, resourceType);\n }\n\n this.logger.debug(`Successfully deleted private DNS namespace ${logicalId}`);\n } catch (error) {\n if (error instanceof NamespaceNotFound) {\n this.logger.debug(`Namespace ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete private DNS namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::ServiceDiscovery::Service \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createService(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating service discovery service ${logicalId}`);\n const client = this.getClient();\n\n const name = properties['Name'] as string;\n const namespaceId = properties['NamespaceId'] as string | undefined;\n const description = properties['Description'] as string | undefined;\n const dnsConfig = properties['DnsConfig'] as DnsConfig | undefined;\n const healthCheckCustomConfig = properties['HealthCheckCustomConfig'] as\n | HealthCheckCustomConfig\n | undefined;\n const healthCheckConfig = properties['HealthCheckConfig'] as HealthCheckConfig | undefined;\n const tags = properties['Tags'] as Tag[] | undefined;\n const type = properties['Type'] as ServiceTypeOption | undefined;\n\n if (!name) {\n throw new ProvisioningError(\n `Name is required for ServiceDiscovery Service ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const response = await client.send(\n new CreateServiceCommand({\n Name: name,\n ...(namespaceId && { NamespaceId: namespaceId }),\n ...(description && { Description: description }),\n ...(dnsConfig && { DnsConfig: dnsConfig }),\n ...(healthCheckCustomConfig && {\n HealthCheckCustomConfig: healthCheckCustomConfig,\n }),\n ...(healthCheckConfig && { HealthCheckConfig: healthCheckConfig }),\n ...(tags && tags.length > 0 && { Tags: tags }),\n ...(type && { Type: type }),\n })\n );\n\n const service = response.Service;\n if (!service || !service.Id) {\n throw new Error('CreateService did not return Service ID');\n }\n\n this.logger.debug(\n `Successfully created service discovery service ${logicalId}: ${service.Id}`\n );\n\n return {\n physicalId: service.Id,\n attributes: {\n Id: service.Id,\n Arn: service.Arn || '',\n Name: service.Name || name || '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create service discovery service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private updateService(logicalId: string, physicalId: string): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating service discovery service ${logicalId}: ${physicalId} (no-op)`);\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n attributes: {\n Id: physicalId,\n },\n });\n }\n\n private async deleteService(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting service discovery service ${logicalId}: ${physicalId}`);\n const client = this.getClient();\n\n try {\n await client.send(new DeleteServiceCommand({ Id: physicalId }));\n this.logger.debug(`Successfully deleted service discovery service ${logicalId}`);\n } catch (error) {\n if (error instanceof ServiceNotFound) {\n this.logger.debug(`Service ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete service discovery service ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Poll a Service Discovery operation until it completes.\n * Returns the target resource ID from the operation result.\n */\n private async pollOperation(\n operationId: string,\n logicalId: string,\n resourceType: string\n ): Promise<string> {\n const client = this.getClient();\n const maxAttempts = 60;\n let delay = 1000; // start at 1s\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const result = await client.send(new GetOperationCommand({ OperationId: operationId }));\n\n const status = result.Operation?.Status;\n\n if (status === 'SUCCESS') {\n // Extract the target resource ID (NAMESPACE or SERVICE)\n const targets = result.Operation?.Targets;\n if (targets) {\n return targets['NAMESPACE'] || targets['SERVICE'] || operationId;\n }\n return operationId;\n }\n\n if (status === 'FAIL') {\n const errorMessage = result.Operation?.ErrorMessage || 'Unknown error';\n throw new ProvisioningError(\n `Operation failed for ${logicalId}: ${errorMessage}`,\n resourceType,\n logicalId\n );\n }\n\n // SUBMITTED or PENDING - wait and retry\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay = Math.min(delay * 2, 10000); // exponential backoff, max 10s\n }\n\n throw new ProvisioningError(\n `Operation timed out for ${logicalId} (operationId: ${operationId})`,\n resourceType,\n logicalId\n );\n }\n\n /**\n * Build a namespace ARN from namespace ID.\n * Format: arn:aws:servicediscovery:{region}:{account}:namespace/{namespaceId}\n */\n private async buildNamespaceArn(namespaceId: string): Promise<string> {\n const stsClient = this.getStsClient();\n const identity = await stsClient.send(new GetCallerIdentityCommand({}));\n const accountId = identity.Account || '';\n const region = await this.getClient().config.region();\n return `arn:aws:servicediscovery:${region}:${accountId}:namespace/${namespaceId}`;\n }\n}\n", "import {\n AppSyncClient,\n CreateGraphqlApiCommand,\n DeleteGraphqlApiCommand,\n CreateDataSourceCommand,\n DeleteDataSourceCommand,\n CreateResolverCommand,\n DeleteResolverCommand,\n CreateApiKeyCommand,\n DeleteApiKeyCommand,\n StartSchemaCreationCommand,\n type AuthenticationType,\n type DataSourceType,\n type CreateGraphqlApiCommandInput,\n type CreateDataSourceCommandInput,\n type CreateResolverCommandInput,\n type CreateApiKeyCommandInput,\n} from '@aws-sdk/client-appsync';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS AppSync resources\n *\n * CC API doesn't support Create for AWS::AppSync::GraphQLApi.\n * This provider uses the AppSync SDK directly.\n *\n * Supported resource types:\n * - AWS::AppSync::GraphQLApi\n * - AWS::AppSync::GraphQLSchema\n * - AWS::AppSync::DataSource\n * - AWS::AppSync::Resolver\n * - AWS::AppSync::ApiKey\n */\nexport class AppSyncProvider implements ResourceProvider {\n private client: AppSyncClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('AppSyncProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::AppSync::GraphQLApi',\n new Set(['Name', 'AuthenticationType', 'XrayEnabled', 'LogConfig', 'Tags']),\n ],\n ['AWS::AppSync::GraphQLSchema', new Set(['ApiId', 'Definition', 'DefinitionS3Location'])],\n [\n 'AWS::AppSync::DataSource',\n new Set([\n 'ApiId',\n 'Name',\n 'Type',\n 'Description',\n 'ServiceRoleArn',\n 'DynamoDBConfig',\n 'LambdaConfig',\n 'HttpConfig',\n ]),\n ],\n [\n 'AWS::AppSync::Resolver',\n new Set([\n 'ApiId',\n 'TypeName',\n 'FieldName',\n 'DataSourceName',\n 'RequestMappingTemplate',\n 'ResponseMappingTemplate',\n 'Kind',\n 'PipelineConfig',\n 'Runtime',\n 'Code',\n ]),\n ],\n ['AWS::AppSync::ApiKey', new Set(['ApiId', 'Description', 'Expires'])],\n ]);\n\n private getClient(): AppSyncClient {\n if (!this.client) {\n this.client = new AppSyncClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::AppSync::GraphQLApi':\n return this.createGraphQLApi(logicalId, resourceType, properties);\n case 'AWS::AppSync::GraphQLSchema':\n return this.createGraphQLSchema(logicalId, resourceType, properties);\n case 'AWS::AppSync::DataSource':\n return this.createDataSource(logicalId, resourceType, properties);\n case 'AWS::AppSync::Resolver':\n return this.createResolver(logicalId, resourceType, properties);\n case 'AWS::AppSync::ApiKey':\n return this.createApiKey(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Update for ${resourceType} ${logicalId} (${physicalId}) - no-op, immutable`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::AppSync::GraphQLApi':\n return this.deleteGraphQLApi(logicalId, physicalId, resourceType);\n case 'AWS::AppSync::GraphQLSchema':\n // Schema is deleted with the API, no-op\n this.logger.debug(`Schema ${logicalId} is deleted with its API, skipping`);\n return;\n case 'AWS::AppSync::DataSource':\n return this.deleteDataSource(logicalId, physicalId, resourceType);\n case 'AWS::AppSync::Resolver':\n return this.deleteResolver(logicalId, physicalId, resourceType);\n case 'AWS::AppSync::ApiKey':\n return this.deleteApiKey(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n getAttribute(physicalId: string, resourceType: string, attributeName: string): Promise<unknown> {\n this.logger.debug(`getAttribute for ${resourceType} ${physicalId}: ${attributeName}`);\n return Promise.resolve(undefined);\n }\n\n // \u2500\u2500\u2500 AWS::AppSync::GraphQLApi \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createGraphQLApi(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating GraphQL API ${logicalId}`);\n\n const name = properties['Name'] as string;\n if (!name) {\n throw new ProvisioningError(\n `Name is required for GraphQLApi ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const authenticationType = properties['AuthenticationType'] as AuthenticationType | undefined;\n\n try {\n const input: CreateGraphqlApiCommandInput = {\n name,\n authenticationType: authenticationType ?? 'API_KEY',\n };\n\n if (properties['XrayEnabled'] !== undefined) {\n input.xrayEnabled = properties['XrayEnabled'] as boolean;\n }\n\n if (properties['LogConfig']) {\n const logConfig = properties['LogConfig'] as Record<string, unknown>;\n input.logConfig = {\n cloudWatchLogsRoleArn: logConfig['CloudWatchLogsRoleArn'] as string,\n fieldLogLevel: logConfig['FieldLogLevel'] as 'NONE' | 'ERROR' | 'ALL',\n excludeVerboseContent: logConfig['ExcludeVerboseContent'] as boolean | undefined,\n };\n }\n\n // Tags\n if (properties['Tags']) {\n const tags = properties['Tags'] as Array<{\n Key: string;\n Value: string;\n }>;\n const tagMap: Record<string, string> = {};\n for (const tag of tags) {\n tagMap[tag.Key] = tag.Value;\n }\n input.tags = tagMap;\n }\n\n const response = await this.getClient().send(new CreateGraphqlApiCommand(input));\n\n const apiId = response.graphqlApi!.apiId!;\n const arn = response.graphqlApi!.arn!;\n const graphQLUrl = response.graphqlApi!.uris?.['GRAPHQL'] ?? '';\n\n this.logger.debug(`Successfully created GraphQL API ${logicalId}: ${apiId}`);\n\n return {\n physicalId: apiId,\n attributes: {\n ApiId: apiId,\n Arn: arn,\n GraphQLUrl: graphQLUrl,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create GraphQL API ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteGraphQLApi(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting GraphQL API ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteGraphqlApiCommand({ apiId: physicalId }));\n this.logger.debug(`Successfully deleted GraphQL API ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`GraphQL API ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete GraphQL API ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::AppSync::GraphQLSchema \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createGraphQLSchema(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating GraphQL Schema ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required for GraphQLSchema ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const definition = properties['Definition'] as string | undefined;\n const definitionS3Location = properties['DefinitionS3Location'] as string | undefined;\n\n try {\n if (definition) {\n await this.getClient().send(\n new StartSchemaCreationCommand({\n apiId,\n definition: new TextEncoder().encode(definition),\n })\n );\n } else if (definitionS3Location) {\n // For S3-based schema, pass as definition bytes\n // In practice, CDK usually inlines the schema\n this.logger.warn(`S3-based schema definition for ${logicalId} - using inline only`);\n }\n\n this.logger.debug(`Successfully started schema creation for ${logicalId}`);\n\n // Schema is tied to the API, use apiId as physical ID\n return {\n physicalId: apiId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create GraphQL Schema ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::AppSync::DataSource \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createDataSource(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating DataSource ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const name = properties['Name'] as string;\n const type = properties['Type'] as DataSourceType;\n\n if (!apiId || !name || !type) {\n throw new ProvisioningError(\n `ApiId, Name, and Type are required for DataSource ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const input: CreateDataSourceCommandInput = {\n apiId,\n name,\n type,\n };\n\n if (properties['Description']) {\n input.description = properties['Description'] as string;\n }\n if (properties['ServiceRoleArn']) {\n input.serviceRoleArn = properties['ServiceRoleArn'] as string;\n }\n if (properties['DynamoDBConfig']) {\n const config = properties['DynamoDBConfig'] as Record<string, unknown>;\n input.dynamodbConfig = {\n tableName: config['TableName'] as string,\n awsRegion: config['AwsRegion'] as string,\n useCallerCredentials: config['UseCallerCredentials'] as boolean | undefined,\n };\n }\n if (properties['LambdaConfig']) {\n const config = properties['LambdaConfig'] as Record<string, unknown>;\n input.lambdaConfig = {\n lambdaFunctionArn: config['LambdaFunctionArn'] as string,\n };\n }\n if (properties['HttpConfig']) {\n const config = properties['HttpConfig'] as Record<string, unknown>;\n input.httpConfig = {\n endpoint: config['Endpoint'] as string,\n };\n }\n\n await this.getClient().send(new CreateDataSourceCommand(input));\n\n const physicalId = `${apiId}|${name}`;\n this.logger.debug(`Successfully created DataSource ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {\n DataSourceArn: `arn:aws:appsync:*:*:apis/${apiId}/datasources/${name}`,\n Name: name,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create DataSource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteDataSource(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting DataSource ${logicalId}: ${physicalId}`);\n\n const [apiId, name] = physicalId.split('|');\n if (!apiId || !name) {\n this.logger.warn(`Invalid DataSource physical ID format: ${physicalId}, skipping`);\n return;\n }\n\n try {\n await this.getClient().send(new DeleteDataSourceCommand({ apiId, name }));\n this.logger.debug(`Successfully deleted DataSource ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`DataSource ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete DataSource ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::AppSync::Resolver \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createResolver(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Resolver ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n const typeName = properties['TypeName'] as string;\n const fieldName = properties['FieldName'] as string;\n\n if (!apiId || !typeName || !fieldName) {\n throw new ProvisioningError(\n `ApiId, TypeName, and FieldName are required for Resolver ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const input: CreateResolverCommandInput = {\n apiId,\n typeName,\n fieldName,\n };\n\n if (properties['DataSourceName']) {\n input.dataSourceName = properties['DataSourceName'] as string;\n }\n if (properties['RequestMappingTemplate']) {\n input.requestMappingTemplate = properties['RequestMappingTemplate'] as string;\n }\n if (properties['ResponseMappingTemplate']) {\n input.responseMappingTemplate = properties['ResponseMappingTemplate'] as string;\n }\n if (properties['Kind']) {\n input.kind = properties['Kind'] as 'UNIT' | 'PIPELINE';\n }\n if (properties['PipelineConfig']) {\n const pipelineConfig = properties['PipelineConfig'] as Record<string, unknown>;\n input.pipelineConfig = {\n functions: pipelineConfig['Functions'] as string[] | undefined,\n };\n }\n if (properties['Runtime']) {\n const runtime = properties['Runtime'] as Record<string, unknown>;\n input.runtime = {\n name: runtime['Name'] as 'APPSYNC_JS',\n runtimeVersion: runtime['RuntimeVersion'] as string,\n };\n }\n if (properties['Code']) {\n input.code = properties['Code'] as string;\n }\n\n await this.getClient().send(new CreateResolverCommand(input));\n\n const physicalId = `${apiId}|${typeName}|${fieldName}`;\n this.logger.debug(`Successfully created Resolver ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {\n ResolverArn: `arn:aws:appsync:*:*:apis/${apiId}/types/${typeName}/resolvers/${fieldName}`,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Resolver ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteResolver(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Resolver ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length < 3) {\n this.logger.warn(`Invalid Resolver physical ID format: ${physicalId}, skipping`);\n return;\n }\n const [apiId, typeName, fieldName] = parts;\n\n try {\n await this.getClient().send(new DeleteResolverCommand({ apiId, typeName, fieldName }));\n this.logger.debug(`Successfully deleted Resolver ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`Resolver ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Resolver ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::AppSync::ApiKey \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createApiKey(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating ApiKey ${logicalId}`);\n\n const apiId = properties['ApiId'] as string;\n if (!apiId) {\n throw new ProvisioningError(\n `ApiId is required for ApiKey ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const input: CreateApiKeyCommandInput = { apiId };\n\n if (properties['Description']) {\n input.description = properties['Description'] as string;\n }\n if (properties['Expires']) {\n input.expires = properties['Expires'] as number;\n }\n\n const response = await this.getClient().send(new CreateApiKeyCommand(input));\n\n const apiKeyId = response.apiKey!.id!;\n this.logger.debug(`Successfully created ApiKey ${logicalId}: ${apiKeyId}`);\n\n return {\n physicalId: `${apiId}|${apiKeyId}`,\n attributes: {\n ApiKey: response.apiKey!.id!,\n Arn: `arn:aws:appsync:*:*:apis/${apiId}/apikeys/${apiKeyId}`,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create ApiKey ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteApiKey(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting ApiKey ${logicalId}: ${physicalId}`);\n\n const [apiId, apiKeyId] = physicalId.split('|');\n if (!apiId || !apiKeyId) {\n this.logger.warn(`Invalid ApiKey physical ID format: ${physicalId}, skipping`);\n return;\n }\n\n try {\n await this.getClient().send(new DeleteApiKeyCommand({ apiId, id: apiKeyId }));\n this.logger.debug(`Successfully deleted ApiKey ${logicalId}`);\n } catch (error) {\n if (this.isNotFoundError(error)) {\n this.logger.debug(`ApiKey ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete ApiKey ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private isNotFoundError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const message = error.message.toLowerCase();\n const name = (error as { name?: string }).name ?? '';\n return (\n message.includes('not found') ||\n message.includes('does not exist') ||\n name === 'NotFoundException'\n );\n }\n}\n", "import {\n GlueClient,\n CreateDatabaseCommand,\n DeleteDatabaseCommand,\n CreateTableCommand,\n UpdateTableCommand,\n DeleteTableCommand,\n EntityNotFoundException,\n type TableInput,\n type StorageDescriptor,\n type Column,\n type Order,\n type SerDeInfo,\n} from '@aws-sdk/client-glue';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS Glue resources\n *\n * Supports:\n * - AWS::Glue::Database\n * - AWS::Glue::Table\n *\n * Glue CreateDatabase/CreateTable are synchronous - the CC API adds unnecessary\n * polling overhead for operations that complete immediately.\n */\nexport class GlueProvider implements ResourceProvider {\n private client: GlueClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('GlueProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::Glue::Database', new Set(['DatabaseInput', 'CatalogId'])],\n ['AWS::Glue::Table', new Set(['DatabaseName', 'TableInput', 'CatalogId'])],\n ]);\n\n private getClient(): GlueClient {\n if (!this.client) {\n this.client = new GlueClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::Glue::Database':\n return this.createDatabase(logicalId, resourceType, properties);\n case 'AWS::Glue::Table':\n return this.createTable(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::Glue::Database':\n // Database update is mostly no-op for basic properties\n this.logger.debug(\n `Update for ${resourceType} ${logicalId} (${physicalId}) - no-op, immutable`\n );\n return { physicalId, wasReplaced: false };\n case 'AWS::Glue::Table':\n return this.updateTable(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::Glue::Database':\n return this.deleteDatabase(logicalId, physicalId, resourceType);\n case 'AWS::Glue::Table':\n return this.deleteTable(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::Glue::Database \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createDatabase(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Glue Database ${logicalId}`);\n\n const databaseInput = properties['DatabaseInput'] as Record<string, unknown> | undefined;\n if (!databaseInput) {\n throw new ProvisioningError(\n `DatabaseInput is required for Glue Database ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const databaseName = databaseInput['Name'] as string;\n if (!databaseName) {\n throw new ProvisioningError(\n `DatabaseInput.Name is required for Glue Database ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const catalogId = properties['CatalogId'] as string | undefined;\n\n try {\n await this.getClient().send(\n new CreateDatabaseCommand({\n CatalogId: catalogId,\n DatabaseInput: {\n Name: databaseName,\n Description: databaseInput['Description'] as string | undefined,\n LocationUri: databaseInput['LocationUri'] as string | undefined,\n Parameters: databaseInput['Parameters'] as Record<string, string> | undefined,\n },\n })\n );\n\n this.logger.debug(`Successfully created Glue Database ${logicalId}: ${databaseName}`);\n\n return {\n physicalId: databaseName,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Glue Database ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteDatabase(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Glue Database ${logicalId}: ${physicalId}`);\n\n try {\n const catalogId = properties?.['CatalogId'] as string | undefined;\n await this.getClient().send(\n new DeleteDatabaseCommand({\n Name: physicalId,\n ...(catalogId && { CatalogId: catalogId }),\n })\n );\n this.logger.debug(`Successfully deleted Glue Database ${logicalId}`);\n } catch (error) {\n if (error instanceof EntityNotFoundException) {\n this.logger.debug(`Glue Database ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Glue Database ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::Glue::Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createTable(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Glue Table ${logicalId}`);\n\n const databaseName = properties['DatabaseName'] as string | undefined;\n if (!databaseName) {\n throw new ProvisioningError(\n `DatabaseName is required for Glue Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const tableInput = properties['TableInput'] as Record<string, unknown> | undefined;\n if (!tableInput) {\n throw new ProvisioningError(\n `TableInput is required for Glue Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const tableName = tableInput['Name'] as string;\n if (!tableName) {\n throw new ProvisioningError(\n `TableInput.Name is required for Glue Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const catalogId = properties['CatalogId'] as string | undefined;\n\n try {\n await this.getClient().send(\n new CreateTableCommand({\n CatalogId: catalogId,\n DatabaseName: databaseName,\n TableInput: this.buildTableInput(tableInput),\n })\n );\n\n const physicalId = `${databaseName}|${tableName}`;\n this.logger.debug(`Successfully created Glue Table ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Glue Table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateTable(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Glue Table ${logicalId}: ${physicalId}`);\n\n const [databaseName] = physicalId.split('|');\n if (!databaseName) {\n throw new ProvisioningError(\n `Invalid Glue Table physical ID format: ${physicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const tableInput = properties['TableInput'] as Record<string, unknown> | undefined;\n if (!tableInput) {\n throw new ProvisioningError(\n `TableInput is required for Glue Table update ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const catalogId = properties['CatalogId'] as string | undefined;\n\n try {\n await this.getClient().send(\n new UpdateTableCommand({\n CatalogId: catalogId,\n DatabaseName: databaseName,\n TableInput: this.buildTableInput(tableInput),\n })\n );\n\n this.logger.debug(`Successfully updated Glue Table ${logicalId}`);\n\n return {\n physicalId,\n wasReplaced: false,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Glue Table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteTable(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting Glue Table ${logicalId}: ${physicalId}`);\n\n const [databaseName, tableName] = physicalId.split('|');\n if (!databaseName || !tableName) {\n this.logger.warn(`Invalid Glue Table physical ID format: ${physicalId}, skipping`);\n return;\n }\n\n try {\n await this.getClient().send(\n new DeleteTableCommand({\n DatabaseName: databaseName,\n Name: tableName,\n })\n );\n this.logger.debug(`Successfully deleted Glue Table ${logicalId}`);\n } catch (error) {\n if (error instanceof EntityNotFoundException) {\n this.logger.debug(`Glue Table ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Glue Table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Build TableInput for Glue API from CFn template properties\n */\n private buildTableInput(tableInput: Record<string, unknown>): TableInput {\n const result: TableInput = {\n Name: tableInput['Name'] as string,\n };\n\n if (tableInput['Description'] !== undefined) {\n result.Description = tableInput['Description'] as string;\n }\n\n if (tableInput['TableType'] !== undefined) {\n result.TableType = tableInput['TableType'] as string;\n }\n\n if (tableInput['Parameters'] !== undefined) {\n // Convert all values to strings (CDK may pass booleans/numbers)\n const rawParams = tableInput['Parameters'] as Record<string, unknown>;\n const params: Record<string, string> = {};\n for (const [k, v] of Object.entries(rawParams)) {\n params[k] = String(v);\n }\n result.Parameters = params;\n }\n\n if (tableInput['Owner'] !== undefined) {\n result.Owner = tableInput['Owner'] as string;\n }\n\n if (tableInput['Retention'] !== undefined) {\n result.Retention = tableInput['Retention'] as number;\n }\n\n if (tableInput['ViewOriginalText'] !== undefined) {\n result.ViewOriginalText = tableInput['ViewOriginalText'] as string;\n }\n\n if (tableInput['ViewExpandedText'] !== undefined) {\n result.ViewExpandedText = tableInput['ViewExpandedText'] as string;\n }\n\n // StorageDescriptor\n if (tableInput['StorageDescriptor'] !== undefined) {\n const sd = tableInput['StorageDescriptor'] as Record<string, unknown>;\n result.StorageDescriptor = this.buildStorageDescriptor(sd);\n }\n\n // PartitionKeys\n if (tableInput['PartitionKeys'] !== undefined) {\n result.PartitionKeys = tableInput['PartitionKeys'] as Column[];\n }\n\n return result;\n }\n\n /**\n * Build StorageDescriptor for Glue API\n */\n private buildStorageDescriptor(sd: Record<string, unknown>): StorageDescriptor {\n const result: StorageDescriptor = {};\n\n if (sd['Columns'] !== undefined) {\n result.Columns = sd['Columns'] as Column[];\n }\n\n if (sd['Location'] !== undefined) {\n result.Location = sd['Location'] as string;\n }\n\n if (sd['InputFormat'] !== undefined) {\n result.InputFormat = sd['InputFormat'] as string;\n }\n\n if (sd['OutputFormat'] !== undefined) {\n result.OutputFormat = sd['OutputFormat'] as string;\n }\n\n if (sd['Compressed'] !== undefined) {\n result.Compressed = sd['Compressed'] as boolean;\n }\n\n if (sd['NumberOfBuckets'] !== undefined) {\n result.NumberOfBuckets = sd['NumberOfBuckets'] as number;\n }\n\n if (sd['SerdeInfo'] !== undefined) {\n const serde = sd['SerdeInfo'] as Record<string, unknown>;\n if (serde['Parameters']) {\n const params = serde['Parameters'] as Record<string, unknown>;\n const converted: Record<string, string> = {};\n for (const [k, v] of Object.entries(params)) {\n converted[k] = String(v);\n }\n serde['Parameters'] = converted;\n }\n result.SerdeInfo = serde as SerDeInfo;\n }\n\n if (sd['BucketColumns'] !== undefined) {\n result.BucketColumns = sd['BucketColumns'] as string[];\n }\n\n if (sd['SortColumns'] !== undefined) {\n result.SortColumns = sd['SortColumns'] as Order[];\n }\n\n if (sd['Parameters'] !== undefined) {\n result.Parameters = sd['Parameters'] as Record<string, string>;\n }\n\n if (sd['StoredAsSubDirectories'] !== undefined) {\n result.StoredAsSubDirectories = sd['StoredAsSubDirectories'] as boolean;\n }\n\n return result;\n }\n}\n", "import {\n KMSClient,\n CreateKeyCommand,\n ScheduleKeyDeletionCommand,\n CreateAliasCommand,\n DeleteAliasCommand,\n UpdateAliasCommand,\n EnableKeyRotationCommand,\n DisableKeyRotationCommand,\n UpdateKeyDescriptionCommand,\n PutKeyPolicyCommand,\n EnableKeyCommand,\n DisableKeyCommand,\n TagResourceCommand,\n UntagResourceCommand,\n NotFoundException,\n type KeyUsageType,\n type KeySpec,\n type OriginType,\n} from '@aws-sdk/client-kms';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS KMS resources\n *\n * Supports:\n * - AWS::KMS::Key\n * - AWS::KMS::Alias\n *\n * KMS CreateKey/CreateAlias are synchronous - the CC API adds unnecessary\n * polling overhead for operations that complete immediately.\n */\nexport class KMSProvider implements ResourceProvider {\n private client: KMSClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('KMSProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::KMS::Key',\n new Set([\n 'Description',\n 'KeyPolicy',\n 'KeySpec',\n 'KeyUsage',\n 'EnableKeyRotation',\n 'Tags',\n 'Enabled',\n 'MultiRegion',\n 'PendingWindowInDays',\n 'RotationPeriodInDays',\n 'Origin',\n 'BypassPolicyLockoutSafetyCheck',\n ]),\n ],\n ['AWS::KMS::Alias', new Set(['AliasName', 'TargetKeyId'])],\n ]);\n\n private getClient(): KMSClient {\n if (!this.client) {\n this.client = new KMSClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::KMS::Key':\n return this.createKey(logicalId, resourceType, properties);\n case 'AWS::KMS::Alias':\n return this.createAlias(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::KMS::Key':\n return this.updateKey(logicalId, physicalId, resourceType, properties, _previousProperties);\n case 'AWS::KMS::Alias':\n return this.updateAlias(logicalId, physicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::KMS::Key':\n return this.deleteKey(logicalId, physicalId, resourceType, _properties);\n case 'AWS::KMS::Alias':\n return this.deleteAlias(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::KMS::Key \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createKey(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating KMS Key ${logicalId}`);\n\n const description = properties['Description'] as string | undefined;\n const keyPolicy = properties['KeyPolicy'];\n const keySpec = properties['KeySpec'] as string | undefined;\n const keyUsage = properties['KeyUsage'] as string | undefined;\n const enableKeyRotation = properties['EnableKeyRotation'] as boolean | undefined;\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n const multiRegion = properties['MultiRegion'] as boolean | undefined;\n const origin = properties['Origin'] as string | undefined;\n const bypassPolicyLockoutSafetyCheck = properties['BypassPolicyLockoutSafetyCheck'] as\n | boolean\n | undefined;\n\n try {\n const result = await this.getClient().send(\n new CreateKeyCommand({\n Description: description,\n KeySpec: keySpec as KeySpec,\n KeyUsage: keyUsage as KeyUsageType,\n Policy: keyPolicy\n ? typeof keyPolicy === 'string'\n ? keyPolicy\n : JSON.stringify(keyPolicy)\n : undefined,\n Tags: tags ? tags.map((t) => ({ TagKey: t.Key, TagValue: t.Value })) : undefined,\n MultiRegion: multiRegion,\n Origin: origin as OriginType | undefined,\n BypassPolicyLockoutSafetyCheck: bypassPolicyLockoutSafetyCheck,\n })\n );\n\n const keyId = result.KeyMetadata!.KeyId!;\n const keyArn = result.KeyMetadata!.Arn!;\n\n // EnableKeyRotation must be called separately after key creation\n if (enableKeyRotation) {\n const rotationPeriodInDays = properties['RotationPeriodInDays'] as number | undefined;\n this.logger.debug(`Enabling key rotation for KMS Key ${logicalId}`);\n await this.getClient().send(\n new EnableKeyRotationCommand({\n KeyId: keyId,\n ...(rotationPeriodInDays !== undefined && {\n RotationPeriodInDays: rotationPeriodInDays,\n }),\n })\n );\n }\n\n // Disable key if Enabled is explicitly false\n const enabled = properties['Enabled'] as boolean | undefined;\n if (enabled === false) {\n this.logger.debug(`Disabling KMS Key ${logicalId}`);\n await this.getClient().send(new DisableKeyCommand({ KeyId: keyId }));\n }\n\n this.logger.debug(`Successfully created KMS Key ${logicalId}: ${keyId}`);\n\n return {\n physicalId: keyId,\n attributes: {\n Arn: keyArn,\n KeyId: keyId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create KMS Key ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateKey(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating KMS Key ${logicalId}: ${physicalId}`);\n\n try {\n // Update Description if changed\n const newDescription = properties['Description'] as string | undefined;\n const oldDescription = previousProperties['Description'] as string | undefined;\n if (newDescription !== oldDescription) {\n this.logger.debug(`Updating description for KMS Key ${logicalId}`);\n await this.getClient().send(\n new UpdateKeyDescriptionCommand({\n KeyId: physicalId,\n Description: newDescription ?? '',\n })\n );\n }\n\n // Update EnableKeyRotation if changed\n const newEnableKeyRotation = properties['EnableKeyRotation'] as boolean | undefined;\n const oldEnableKeyRotation = previousProperties['EnableKeyRotation'] as boolean | undefined;\n if (newEnableKeyRotation !== oldEnableKeyRotation) {\n if (newEnableKeyRotation) {\n const rotationPeriodInDays = properties['RotationPeriodInDays'] as number | undefined;\n this.logger.debug(`Enabling key rotation for KMS Key ${logicalId}`);\n await this.getClient().send(\n new EnableKeyRotationCommand({\n KeyId: physicalId,\n ...(rotationPeriodInDays !== undefined && {\n RotationPeriodInDays: rotationPeriodInDays,\n }),\n })\n );\n } else {\n this.logger.debug(`Disabling key rotation for KMS Key ${logicalId}`);\n await this.getClient().send(new DisableKeyRotationCommand({ KeyId: physicalId }));\n }\n }\n\n // Update Enabled if changed\n const newEnabled = properties['Enabled'] as boolean | undefined;\n const oldEnabled = previousProperties['Enabled'] as boolean | undefined;\n if (newEnabled !== oldEnabled) {\n if (newEnabled === false) {\n this.logger.debug(`Disabling KMS Key ${logicalId}`);\n await this.getClient().send(new DisableKeyCommand({ KeyId: physicalId }));\n } else {\n this.logger.debug(`Enabling KMS Key ${logicalId}`);\n await this.getClient().send(new EnableKeyCommand({ KeyId: physicalId }));\n }\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n const oldTags = previousProperties['Tags'] as\n | Array<{ Key: string; Value: string }>\n | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Remove old tags\n if (oldTags && oldTags.length > 0) {\n await this.getClient().send(\n new UntagResourceCommand({\n KeyId: physicalId,\n TagKeys: oldTags.map((t) => t.Key),\n })\n );\n }\n // Add new tags\n if (newTags && newTags.length > 0) {\n await this.getClient().send(\n new TagResourceCommand({\n KeyId: physicalId,\n Tags: newTags.map((t) => ({ TagKey: t.Key, TagValue: t.Value })),\n })\n );\n }\n }\n\n // Update KeyPolicy if changed\n const newKeyPolicy = properties['KeyPolicy'];\n const oldKeyPolicy = previousProperties['KeyPolicy'];\n const newPolicyStr = newKeyPolicy\n ? typeof newKeyPolicy === 'string'\n ? newKeyPolicy\n : JSON.stringify(newKeyPolicy)\n : undefined;\n const oldPolicyStr = oldKeyPolicy\n ? typeof oldKeyPolicy === 'string'\n ? oldKeyPolicy\n : JSON.stringify(oldKeyPolicy)\n : undefined;\n if (newPolicyStr !== oldPolicyStr && newPolicyStr) {\n this.logger.debug(`Updating key policy for KMS Key ${logicalId}`);\n await this.getClient().send(\n new PutKeyPolicyCommand({\n KeyId: physicalId,\n PolicyName: 'default',\n Policy: newPolicyStr,\n })\n );\n }\n\n this.logger.debug(`Successfully updated KMS Key ${logicalId}`);\n\n return { physicalId, wasReplaced: false };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update KMS Key ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteKey(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Scheduling deletion for KMS Key ${logicalId}: ${physicalId}`);\n\n const pendingWindowInDays = (properties?.['PendingWindowInDays'] as number | undefined) ?? 7;\n\n try {\n await this.getClient().send(\n new ScheduleKeyDeletionCommand({\n KeyId: physicalId,\n PendingWindowInDays: pendingWindowInDays,\n })\n );\n this.logger.debug(`Successfully scheduled deletion for KMS Key ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`KMS Key ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to schedule deletion for KMS Key ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::KMS::Alias \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createAlias(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating KMS Alias ${logicalId}`);\n\n const aliasName = properties['AliasName'] as string | undefined;\n if (!aliasName) {\n throw new ProvisioningError(\n `AliasName is required for KMS Alias ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const targetKeyId = properties['TargetKeyId'] as string | undefined;\n if (!targetKeyId) {\n throw new ProvisioningError(\n `TargetKeyId is required for KMS Alias ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.getClient().send(\n new CreateAliasCommand({\n AliasName: aliasName,\n TargetKeyId: targetKeyId,\n })\n );\n\n this.logger.debug(`Successfully created KMS Alias ${logicalId}: ${aliasName}`);\n\n return {\n physicalId: aliasName,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create KMS Alias ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async updateAlias(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating KMS Alias ${logicalId}: ${physicalId}`);\n\n const targetKeyId = properties['TargetKeyId'] as string | undefined;\n if (!targetKeyId) {\n throw new ProvisioningError(\n `TargetKeyId is required for KMS Alias update ${logicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(\n new UpdateAliasCommand({\n AliasName: physicalId,\n TargetKeyId: targetKeyId,\n })\n );\n\n this.logger.debug(`Successfully updated KMS Alias ${logicalId}`);\n\n return { physicalId, wasReplaced: false };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update KMS Alias ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async deleteAlias(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting KMS Alias ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteAliasCommand({\n AliasName: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted KMS Alias ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`KMS Alias ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete KMS Alias ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n KinesisClient,\n CreateStreamCommand,\n DeleteStreamCommand,\n DescribeStreamCommand,\n UpdateShardCountCommand,\n AddTagsToStreamCommand,\n IncreaseStreamRetentionPeriodCommand,\n DecreaseStreamRetentionPeriodCommand,\n StartStreamEncryptionCommand,\n StopStreamEncryptionCommand,\n ResourceNotFoundException,\n type EncryptionType,\n} from '@aws-sdk/client-kinesis';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS Kinesis Stream Provider\n *\n * Implements resource provisioning for AWS::Kinesis::Stream using the Kinesis SDK.\n * WHY: The CC API polls with exponential backoff (1s->2s->4s->8s->10s) for stream\n * creation, but we can poll DescribeStream directly with shorter intervals (2s),\n * eliminating the CC API intermediary overhead and reducing total wait time.\n */\nexport class KinesisStreamProvider implements ResourceProvider {\n private client: KinesisClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('KinesisProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::Kinesis::Stream',\n new Set([\n 'Name',\n 'StreamModeDetails',\n 'ShardCount',\n 'Tags',\n 'RetentionPeriodHours',\n 'StreamEncryption',\n ]),\n ],\n ]);\n\n private getClient(): KinesisClient {\n if (!this.client) {\n this.client = new KinesisClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n /**\n * Create a Kinesis stream\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Kinesis stream ${logicalId}`);\n\n const streamName =\n (properties['Name'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 128 });\n\n try {\n // Determine stream mode\n const streamModeDetails = properties['StreamModeDetails'] as\n | Record<string, unknown>\n | undefined;\n const streamMode = (streamModeDetails?.['StreamMode'] as string) || 'PROVISIONED';\n\n // ShardCount is required for PROVISIONED mode\n const shardCount =\n streamMode === 'PROVISIONED' ? Number(properties['ShardCount'] ?? 1) : undefined;\n\n await this.getClient().send(\n new CreateStreamCommand({\n StreamName: streamName,\n ...(shardCount !== undefined && { ShardCount: shardCount }),\n StreamModeDetails: {\n StreamMode: streamMode as 'PROVISIONED' | 'ON_DEMAND',\n },\n })\n );\n\n this.logger.debug(`CreateStream initiated for ${streamName}, waiting for ACTIVE status`);\n\n // Poll until stream is ACTIVE\n const streamInfo = await this.waitForStreamActive(streamName);\n\n // Apply tags if specified\n if (properties['Tags']) {\n const tagList = properties['Tags'] as Array<{ Key: string; Value: string }>;\n const tags: Record<string, string> = {};\n for (const tag of tagList) {\n tags[tag.Key] = tag.Value;\n }\n if (Object.keys(tags).length > 0) {\n await this.getClient().send(\n new AddTagsToStreamCommand({\n StreamName: streamName,\n Tags: tags,\n })\n );\n }\n }\n\n // Apply RetentionPeriodHours if specified (default is 24 hours)\n const retentionPeriodHours = properties['RetentionPeriodHours'] as number | undefined;\n if (retentionPeriodHours !== undefined && retentionPeriodHours !== 24) {\n this.logger.debug(\n `Setting retention period to ${retentionPeriodHours} hours for ${streamName}`\n );\n if (retentionPeriodHours > 24) {\n await this.getClient().send(\n new IncreaseStreamRetentionPeriodCommand({\n StreamName: streamName,\n RetentionPeriodHours: retentionPeriodHours,\n })\n );\n } else {\n await this.getClient().send(\n new DecreaseStreamRetentionPeriodCommand({\n StreamName: streamName,\n RetentionPeriodHours: retentionPeriodHours,\n })\n );\n }\n // Wait for stream to become ACTIVE after retention period change\n await this.waitForStreamActive(streamName);\n }\n\n // Apply StreamEncryption if specified\n const streamEncryption = properties['StreamEncryption'] as\n | Record<string, unknown>\n | undefined;\n if (streamEncryption) {\n const encryptionType = (streamEncryption['EncryptionType'] as string) ?? 'KMS';\n const keyId = streamEncryption['KeyId'] as string;\n this.logger.debug(`Enabling stream encryption for ${streamName}`);\n await this.getClient().send(\n new StartStreamEncryptionCommand({\n StreamName: streamName,\n EncryptionType: encryptionType as EncryptionType,\n KeyId: keyId,\n })\n );\n // Wait for stream to become ACTIVE after encryption change\n await this.waitForStreamActive(streamName);\n }\n\n this.logger.debug(`Successfully created Kinesis stream ${logicalId}: ${streamName}`);\n\n return {\n physicalId: streamName,\n attributes: {\n Arn: streamInfo.streamArn,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) {\n throw error;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Kinesis stream ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n streamName,\n cause\n );\n }\n }\n\n /**\n * Update a Kinesis stream\n *\n * Supports updating ShardCount for PROVISIONED mode streams.\n * StreamMode and Name changes require replacement (handled by deployment layer).\n */\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating Kinesis stream ${logicalId}: ${physicalId}`);\n\n try {\n // Update ShardCount if changed (only for PROVISIONED mode)\n const streamModeDetails = properties['StreamModeDetails'] as\n | Record<string, unknown>\n | undefined;\n const streamMode = (streamModeDetails?.['StreamMode'] as string) || 'PROVISIONED';\n\n if (streamMode === 'PROVISIONED') {\n const newShardCount = Number(properties['ShardCount'] ?? 1);\n const oldShardCount = Number(previousProperties['ShardCount'] ?? 1);\n\n if (newShardCount !== oldShardCount) {\n this.logger.debug(\n `Updating shard count for ${physicalId}: ${oldShardCount} -> ${newShardCount}`\n );\n\n await this.getClient().send(\n new UpdateShardCountCommand({\n StreamName: physicalId,\n TargetShardCount: newShardCount,\n ScalingType: 'UNIFORM_SCALING',\n })\n );\n\n // Wait for stream to become ACTIVE after resharding\n await this.waitForStreamActive(physicalId);\n }\n }\n\n // Update RetentionPeriodHours if changed\n const newRetention = properties['RetentionPeriodHours'] as number | undefined;\n const oldRetention = previousProperties['RetentionPeriodHours'] as number | undefined;\n const effectiveNewRetention = newRetention ?? 24;\n const effectiveOldRetention = oldRetention ?? 24;\n if (effectiveNewRetention !== effectiveOldRetention) {\n this.logger.debug(\n `Updating retention period for ${physicalId}: ${effectiveOldRetention} -> ${effectiveNewRetention}`\n );\n if (effectiveNewRetention > effectiveOldRetention) {\n await this.getClient().send(\n new IncreaseStreamRetentionPeriodCommand({\n StreamName: physicalId,\n RetentionPeriodHours: effectiveNewRetention,\n })\n );\n } else {\n await this.getClient().send(\n new DecreaseStreamRetentionPeriodCommand({\n StreamName: physicalId,\n RetentionPeriodHours: effectiveNewRetention,\n })\n );\n }\n await this.waitForStreamActive(physicalId);\n }\n\n // Update StreamEncryption if changed\n const newEncryption = properties['StreamEncryption'] as Record<string, unknown> | undefined;\n const oldEncryption = previousProperties['StreamEncryption'] as\n | Record<string, unknown>\n | undefined;\n if (JSON.stringify(newEncryption) !== JSON.stringify(oldEncryption)) {\n // Remove old encryption if it existed\n if (oldEncryption) {\n await this.getClient().send(\n new StopStreamEncryptionCommand({\n StreamName: physicalId,\n EncryptionType: ((oldEncryption['EncryptionType'] as string) ??\n 'KMS') as EncryptionType,\n KeyId: oldEncryption['KeyId'] as string,\n })\n );\n await this.waitForStreamActive(physicalId);\n }\n // Apply new encryption\n if (newEncryption) {\n await this.getClient().send(\n new StartStreamEncryptionCommand({\n StreamName: physicalId,\n EncryptionType: ((newEncryption['EncryptionType'] as string) ??\n 'KMS') as EncryptionType,\n KeyId: newEncryption['KeyId'] as string,\n })\n );\n await this.waitForStreamActive(physicalId);\n }\n }\n\n // Get current stream description for attributes\n const response = await this.getClient().send(\n new DescribeStreamCommand({ StreamName: physicalId })\n );\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: response.StreamDescription?.StreamARN,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update Kinesis stream ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete a Kinesis stream\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Kinesis stream ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteStreamCommand({\n StreamName: physicalId,\n EnforceConsumerDeletion: true,\n })\n );\n this.logger.debug(`Successfully deleted Kinesis stream ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`Kinesis stream ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Kinesis stream ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Poll DescribeStream until the stream reaches ACTIVE status\n *\n * Uses 2s polling intervals instead of CC API's exponential backoff\n * (1s->2s->4s->8s->10s), reducing total wait time.\n */\n private async waitForStreamActive(\n streamName: string,\n maxAttempts = 30\n ): Promise<{ streamArn: string | undefined }> {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const response = await this.getClient().send(\n new DescribeStreamCommand({ StreamName: streamName })\n );\n\n const status = response.StreamDescription?.StreamStatus;\n this.logger.debug(\n `Stream ${streamName} status: ${status} (attempt ${attempt}/${maxAttempts})`\n );\n\n if (status === 'ACTIVE') {\n return {\n streamArn: response.StreamDescription?.StreamARN,\n };\n }\n\n if (status !== 'CREATING' && status !== 'UPDATING') {\n throw new Error(`Unexpected stream status: ${status}`);\n }\n\n // Wait 2 seconds between polls\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n throw new Error(\n `Stream ${streamName} did not reach ACTIVE status within ${maxAttempts * 2} seconds`\n );\n }\n}\n", "import {\n EFSClient,\n CreateFileSystemCommand,\n DeleteFileSystemCommand,\n CreateMountTargetCommand,\n DeleteMountTargetCommand,\n DescribeMountTargetsCommand,\n CreateAccessPointCommand,\n DeleteAccessPointCommand,\n DescribeFileSystemsCommand,\n FileSystemNotFound,\n MountTargetNotFound,\n AccessPointNotFound,\n type PerformanceMode,\n type ThroughputMode,\n} from '@aws-sdk/client-efs';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS EFS resources\n *\n * Supports:\n * - AWS::EFS::FileSystem\n * - AWS::EFS::MountTarget\n * - AWS::EFS::AccessPoint\n *\n * EFS CreateFileSystem/CreateAccessPoint are synchronous.\n * MountTarget requires polling until state becomes \"available\".\n */\nexport class EFSProvider implements ResourceProvider {\n private client: EFSClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('EFSProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::EFS::FileSystem',\n new Set([\n 'FileSystemTags',\n 'Encrypted',\n 'KmsKeyId',\n 'PerformanceMode',\n 'ThroughputMode',\n 'ProvisionedThroughputInMibps',\n ]),\n ],\n ['AWS::EFS::MountTarget', new Set(['FileSystemId', 'SubnetId', 'SecurityGroups'])],\n [\n 'AWS::EFS::AccessPoint',\n new Set(['FileSystemId', 'PosixUser', 'RootDirectory', 'AccessPointTags']),\n ],\n ]);\n\n private getClient(): EFSClient {\n if (!this.client) {\n this.client = new EFSClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::EFS::FileSystem':\n return this.createFileSystem(logicalId, resourceType, properties);\n case 'AWS::EFS::MountTarget':\n return this.createMountTarget(logicalId, resourceType, properties);\n case 'AWS::EFS::AccessPoint':\n return this.createAccessPoint(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Update for ${resourceType} ${logicalId} (${physicalId}) - no-op, immutable`);\n if (\n resourceType !== 'AWS::EFS::FileSystem' &&\n resourceType !== 'AWS::EFS::MountTarget' &&\n resourceType !== 'AWS::EFS::AccessPoint'\n ) {\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::EFS::FileSystem':\n return this.deleteFileSystem(logicalId, physicalId, resourceType);\n case 'AWS::EFS::MountTarget':\n return this.deleteMountTarget(logicalId, physicalId, resourceType);\n case 'AWS::EFS::AccessPoint':\n return this.deleteAccessPoint(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::EFS::FileSystem \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createFileSystem(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating EFS FileSystem ${logicalId}`);\n\n const creationToken = `cdkd-${logicalId}`;\n\n const tags = properties['FileSystemTags'] as Array<{ Key: string; Value: string }> | undefined;\n\n try {\n const response = await this.getClient().send(\n new CreateFileSystemCommand({\n CreationToken: creationToken,\n Encrypted: properties['Encrypted'] as boolean | undefined,\n KmsKeyId: properties['KmsKeyId'] as string | undefined,\n PerformanceMode: properties['PerformanceMode'] as PerformanceMode | undefined,\n ThroughputMode: properties['ThroughputMode'] as ThroughputMode | undefined,\n ProvisionedThroughputInMibps: properties['ProvisionedThroughputInMibps'] as\n | number\n | undefined,\n Tags: tags?.map((t) => ({ Key: t.Key, Value: t.Value })),\n })\n );\n\n const fileSystemId = response.FileSystemId!;\n const arn = response.FileSystemArn!;\n\n // Wait for FileSystem to become available\n await this.waitForFileSystemAvailable(fileSystemId, logicalId, resourceType);\n\n this.logger.debug(`Successfully created EFS FileSystem ${logicalId}: ${fileSystemId}`);\n\n return {\n physicalId: fileSystemId,\n attributes: {\n Arn: arn,\n FileSystemId: fileSystemId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EFS FileSystem ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteFileSystem(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting EFS FileSystem ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteFileSystemCommand({\n FileSystemId: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted EFS FileSystem ${logicalId}`);\n } catch (error) {\n if (error instanceof FileSystemNotFound) {\n this.logger.debug(`EFS FileSystem ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete EFS FileSystem ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async waitForFileSystemAvailable(\n fileSystemId: string,\n logicalId: string,\n resourceType: string\n ): Promise<void> {\n const pollIntervalMs = 2000;\n const maxWaitMs = 60000;\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n const response = await this.getClient().send(\n new DescribeFileSystemsCommand({ FileSystemId: fileSystemId })\n );\n const fs = response.FileSystems?.[0];\n if (fs?.LifeCycleState === 'available') {\n return;\n }\n this.logger.debug(\n `FileSystem ${fileSystemId} state: ${fs?.LifeCycleState ?? 'unknown'}, waiting...`\n );\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n throw new ProvisioningError(\n `Timed out waiting for EFS FileSystem ${fileSystemId} to become available (60s)`,\n resourceType,\n logicalId,\n fileSystemId\n );\n }\n\n // \u2500\u2500\u2500 AWS::EFS::MountTarget \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createMountTarget(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating EFS MountTarget ${logicalId}`);\n\n const fileSystemId = properties['FileSystemId'] as string | undefined;\n if (!fileSystemId) {\n throw new ProvisioningError(\n `FileSystemId is required for EFS MountTarget ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const subnetId = properties['SubnetId'] as string | undefined;\n if (!subnetId) {\n throw new ProvisioningError(\n `SubnetId is required for EFS MountTarget ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const securityGroups = properties['SecurityGroups'] as string[] | undefined;\n\n try {\n const response = await this.getClient().send(\n new CreateMountTargetCommand({\n FileSystemId: fileSystemId,\n SubnetId: subnetId,\n SecurityGroups: securityGroups,\n })\n );\n\n const mountTargetId = response.MountTargetId!;\n this.logger.debug(\n `Created EFS MountTarget ${logicalId}: ${mountTargetId}, waiting for available state`\n );\n\n // Poll until mount target is available\n await this.waitForMountTargetAvailable(mountTargetId, logicalId, resourceType);\n\n this.logger.debug(`Successfully created EFS MountTarget ${logicalId}: ${mountTargetId}`);\n\n return {\n physicalId: mountTargetId,\n attributes: {},\n };\n } catch (error) {\n if (error instanceof ProvisioningError) {\n throw error;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EFS MountTarget ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async waitForMountTargetAvailable(\n mountTargetId: string,\n logicalId: string,\n resourceType: string\n ): Promise<void> {\n const pollIntervalMs = 5000;\n const maxWaitMs = 120000;\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n const response = await this.getClient().send(\n new DescribeMountTargetsCommand({\n MountTargetId: mountTargetId,\n })\n );\n\n const mountTarget = response.MountTargets?.[0];\n if (mountTarget?.LifeCycleState === 'available') {\n return;\n }\n\n this.logger.debug(\n `MountTarget ${mountTargetId} state: ${mountTarget?.LifeCycleState ?? 'unknown'}, waiting...`\n );\n\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n throw new ProvisioningError(\n `Timed out waiting for EFS MountTarget ${mountTargetId} to become available (120s)`,\n resourceType,\n logicalId,\n mountTargetId\n );\n }\n\n private async deleteMountTarget(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting EFS MountTarget ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteMountTargetCommand({\n MountTargetId: physicalId,\n })\n );\n\n // Wait for mount target to be fully deleted\n await this.waitForMountTargetDeleted(physicalId, logicalId);\n\n this.logger.debug(`Successfully deleted EFS MountTarget ${logicalId}`);\n } catch (error) {\n if (error instanceof MountTargetNotFound) {\n this.logger.debug(`EFS MountTarget ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete EFS MountTarget ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n private async waitForMountTargetDeleted(mountTargetId: string, logicalId: string): Promise<void> {\n const pollIntervalMs = 5000;\n const maxWaitMs = 120000;\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const response = await this.getClient().send(\n new DescribeMountTargetsCommand({\n MountTargetId: mountTargetId,\n })\n );\n\n const mountTarget = response.MountTargets?.[0];\n if (!mountTarget) {\n return;\n }\n\n this.logger.debug(\n `MountTarget ${mountTargetId} state: ${mountTarget.LifeCycleState ?? 'unknown'}, waiting for deletion...`\n );\n } catch (error) {\n if (error instanceof MountTargetNotFound) {\n return;\n }\n throw error;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n }\n\n this.logger.warn(\n `Timed out waiting for EFS MountTarget ${mountTargetId} deletion for ${logicalId} (120s)`\n );\n }\n\n // \u2500\u2500\u2500 AWS::EFS::AccessPoint \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createAccessPoint(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating EFS AccessPoint ${logicalId}`);\n\n const fileSystemId = properties['FileSystemId'] as string | undefined;\n if (!fileSystemId) {\n throw new ProvisioningError(\n `FileSystemId is required for EFS AccessPoint ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const posixUser = properties['PosixUser'] as\n | { Uid: number; Gid: number; SecondaryGids?: number[] }\n | undefined;\n\n const rootDirectory = properties['RootDirectory'] as\n | {\n Path?: string;\n CreationInfo?: {\n OwnerUid: number;\n OwnerGid: number;\n Permissions: string;\n };\n }\n | undefined;\n\n const tags = properties['AccessPointTags'] as Array<{ Key: string; Value: string }> | undefined;\n\n try {\n const response = await this.getClient().send(\n new CreateAccessPointCommand({\n FileSystemId: fileSystemId,\n PosixUser: posixUser\n ? {\n Uid: Number(posixUser.Uid),\n Gid: Number(posixUser.Gid),\n SecondaryGids: posixUser.SecondaryGids?.map(Number),\n }\n : undefined,\n RootDirectory: rootDirectory\n ? {\n Path: rootDirectory.Path,\n CreationInfo: rootDirectory.CreationInfo\n ? {\n OwnerUid: Number(rootDirectory.CreationInfo.OwnerUid),\n OwnerGid: Number(rootDirectory.CreationInfo.OwnerGid),\n Permissions: rootDirectory.CreationInfo.Permissions,\n }\n : undefined,\n }\n : undefined,\n Tags: tags?.map((t) => ({ Key: t.Key, Value: t.Value })),\n })\n );\n\n const accessPointId = response.AccessPointId!;\n const arn = response.AccessPointArn!;\n\n this.logger.debug(`Successfully created EFS AccessPoint ${logicalId}: ${accessPointId}`);\n\n return {\n physicalId: accessPointId,\n attributes: {\n Arn: arn,\n AccessPointId: accessPointId,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create EFS AccessPoint ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteAccessPoint(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting EFS AccessPoint ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteAccessPointCommand({\n AccessPointId: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted EFS AccessPoint ${logicalId}`);\n } catch (error) {\n if (error instanceof AccessPointNotFound) {\n this.logger.debug(`EFS AccessPoint ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete EFS AccessPoint ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n FirehoseClient,\n CreateDeliveryStreamCommand,\n DeleteDeliveryStreamCommand,\n ResourceNotFoundException,\n type CreateDeliveryStreamCommandInput,\n type S3DestinationConfiguration,\n type ExtendedS3DestinationConfiguration,\n type Tag,\n type HttpEndpointDestinationConfiguration,\n type RedshiftDestinationConfiguration,\n type ElasticsearchDestinationConfiguration,\n type AmazonopensearchserviceDestinationConfiguration,\n type SplunkDestinationConfiguration,\n type AmazonOpenSearchServerlessDestinationConfiguration,\n type DeliveryStreamEncryptionConfigurationInput,\n} from '@aws-sdk/client-firehose';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS Kinesis Firehose resources\n *\n * Supports:\n * - AWS::KinesisFirehose::DeliveryStream\n *\n * CreateDeliveryStream is synchronous - the CC API adds unnecessary\n * polling overhead for an operation that completes immediately.\n */\nexport class FirehoseProvider implements ResourceProvider {\n private client: FirehoseClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('FirehoseProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::KinesisFirehose::DeliveryStream',\n new Set([\n 'DeliveryStreamName',\n 'DeliveryStreamType',\n 'S3DestinationConfiguration',\n 'ExtendedS3DestinationConfiguration',\n 'KinesisStreamSourceConfiguration',\n 'Tags',\n 'HttpEndpointDestinationConfiguration',\n 'RedshiftDestinationConfiguration',\n 'ElasticsearchDestinationConfiguration',\n 'AmazonopensearchserviceDestinationConfiguration',\n 'SplunkDestinationConfiguration',\n 'AmazonOpenSearchServerlessDestinationConfiguration',\n 'DeliveryStreamEncryptionConfigurationInput',\n ]),\n ],\n ]);\n\n private getClient(): FirehoseClient {\n if (!this.client) {\n this.client = new FirehoseClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n /**\n * Create a Firehose delivery stream\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating Firehose delivery stream ${logicalId}`);\n\n const deliveryStreamName = properties['DeliveryStreamName'] as string | undefined;\n const deliveryStreamType =\n (properties['DeliveryStreamType'] as string | undefined) || 'DirectPut';\n\n try {\n const input: CreateDeliveryStreamCommandInput = {\n DeliveryStreamName: deliveryStreamName || logicalId,\n DeliveryStreamType: deliveryStreamType as\n | 'DirectPut'\n | 'KinesisStreamAsSource'\n | 'MSKAsSource',\n };\n\n // Map S3DestinationConfiguration (CFn PascalCase -> SDK format)\n if (properties['S3DestinationConfiguration']) {\n const s3Config = properties['S3DestinationConfiguration'] as Record<string, unknown>;\n input.S3DestinationConfiguration = this.mapS3DestinationConfiguration(s3Config);\n }\n\n // Map ExtendedS3DestinationConfiguration\n if (properties['ExtendedS3DestinationConfiguration']) {\n const extS3Config = properties['ExtendedS3DestinationConfiguration'] as Record<\n string,\n unknown\n >;\n input.ExtendedS3DestinationConfiguration =\n this.mapExtendedS3DestinationConfiguration(extS3Config);\n }\n\n // Map KinesisStreamSourceConfiguration\n if (properties['KinesisStreamSourceConfiguration']) {\n const kinesisConfig = properties['KinesisStreamSourceConfiguration'] as Record<\n string,\n unknown\n >;\n input.KinesisStreamSourceConfiguration = {\n KinesisStreamARN: (kinesisConfig['KinesisStreamArn'] ||\n kinesisConfig['KinesisStreamARN']) as string,\n RoleARN: (kinesisConfig['RoleArn'] || kinesisConfig['RoleARN']) as string,\n };\n }\n\n // Map HttpEndpointDestinationConfiguration\n if (properties['HttpEndpointDestinationConfiguration']) {\n const httpConfig = properties['HttpEndpointDestinationConfiguration'] as Record<\n string,\n unknown\n >;\n const endpointConfig = httpConfig['EndpointConfiguration'] as\n | Record<string, unknown>\n | undefined;\n input.HttpEndpointDestinationConfiguration = {\n EndpointConfiguration: endpointConfig\n ? {\n Url: endpointConfig['Url'] as string,\n Name: endpointConfig['Name'] as string | undefined,\n AccessKey: endpointConfig['AccessKey'] as string | undefined,\n }\n : undefined,\n RoleARN: (httpConfig['RoleArn'] || httpConfig['RoleARN']) as string | undefined,\n BufferingHints: httpConfig['BufferingHints'] as\n | HttpEndpointDestinationConfiguration['BufferingHints']\n | undefined,\n CloudWatchLoggingOptions: httpConfig['CloudWatchLoggingOptions'] as\n | HttpEndpointDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n RequestConfiguration: httpConfig['RequestConfiguration'] as\n | HttpEndpointDestinationConfiguration['RequestConfiguration']\n | undefined,\n ProcessingConfiguration: httpConfig['ProcessingConfiguration'] as\n | HttpEndpointDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n RetryOptions: httpConfig['RetryOptions'] as\n | HttpEndpointDestinationConfiguration['RetryOptions']\n | undefined,\n S3BackupMode: httpConfig['S3BackupMode'] as string | undefined,\n S3Configuration: httpConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n httpConfig['S3Configuration'] as Record<string, unknown>\n )\n : undefined,\n } as HttpEndpointDestinationConfiguration;\n }\n\n // Map RedshiftDestinationConfiguration\n if (properties['RedshiftDestinationConfiguration']) {\n const rsConfig = properties['RedshiftDestinationConfiguration'] as Record<string, unknown>;\n input.RedshiftDestinationConfiguration = {\n ClusterJDBCURL: rsConfig['ClusterJDBCURL'] as string,\n RoleARN: (rsConfig['RoleArn'] || rsConfig['RoleARN']) as string,\n CopyCommand: rsConfig['CopyCommand'] as RedshiftDestinationConfiguration['CopyCommand'],\n Username: rsConfig['Username'] as string | undefined,\n Password: rsConfig['Password'] as string | undefined,\n S3Configuration: rsConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n rsConfig['S3Configuration'] as Record<string, unknown>\n )\n : (undefined as unknown as S3DestinationConfiguration),\n CloudWatchLoggingOptions: rsConfig['CloudWatchLoggingOptions'] as\n | RedshiftDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n ProcessingConfiguration: rsConfig['ProcessingConfiguration'] as\n | RedshiftDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n } as RedshiftDestinationConfiguration;\n }\n\n // Map ElasticsearchDestinationConfiguration\n if (properties['ElasticsearchDestinationConfiguration']) {\n const esConfig = properties['ElasticsearchDestinationConfiguration'] as Record<\n string,\n unknown\n >;\n input.ElasticsearchDestinationConfiguration = {\n DomainARN: (esConfig['DomainArn'] || esConfig['DomainARN']) as string | undefined,\n ClusterEndpoint: esConfig['ClusterEndpoint'] as string | undefined,\n IndexName: esConfig['IndexName'] as string,\n TypeName: esConfig['TypeName'] as string | undefined,\n IndexRotationPeriod: esConfig['IndexRotationPeriod'] as string | undefined,\n RoleARN: (esConfig['RoleArn'] || esConfig['RoleARN']) as string,\n BufferingHints: esConfig['BufferingHints'] as\n | ElasticsearchDestinationConfiguration['BufferingHints']\n | undefined,\n RetryOptions: esConfig['RetryOptions'] as\n | ElasticsearchDestinationConfiguration['RetryOptions']\n | undefined,\n S3BackupMode: esConfig['S3BackupMode'] as string | undefined,\n S3Configuration: esConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n esConfig['S3Configuration'] as Record<string, unknown>\n )\n : (undefined as unknown as S3DestinationConfiguration),\n CloudWatchLoggingOptions: esConfig['CloudWatchLoggingOptions'] as\n | ElasticsearchDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n ProcessingConfiguration: esConfig['ProcessingConfiguration'] as\n | ElasticsearchDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n } as ElasticsearchDestinationConfiguration;\n }\n\n // Map AmazonopensearchserviceDestinationConfiguration\n if (properties['AmazonopensearchserviceDestinationConfiguration']) {\n const aosConfig = properties['AmazonopensearchserviceDestinationConfiguration'] as Record<\n string,\n unknown\n >;\n input.AmazonopensearchserviceDestinationConfiguration = {\n DomainARN: (aosConfig['DomainArn'] || aosConfig['DomainARN']) as string | undefined,\n ClusterEndpoint: aosConfig['ClusterEndpoint'] as string | undefined,\n IndexName: aosConfig['IndexName'] as string,\n TypeName: aosConfig['TypeName'] as string | undefined,\n IndexRotationPeriod: aosConfig['IndexRotationPeriod'] as string | undefined,\n RoleARN: (aosConfig['RoleArn'] || aosConfig['RoleARN']) as string,\n BufferingHints: aosConfig['BufferingHints'] as\n | AmazonopensearchserviceDestinationConfiguration['BufferingHints']\n | undefined,\n RetryOptions: aosConfig['RetryOptions'] as\n | AmazonopensearchserviceDestinationConfiguration['RetryOptions']\n | undefined,\n S3BackupMode: aosConfig['S3BackupMode'] as string | undefined,\n S3Configuration: aosConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n aosConfig['S3Configuration'] as Record<string, unknown>\n )\n : (undefined as unknown as S3DestinationConfiguration),\n CloudWatchLoggingOptions: aosConfig['CloudWatchLoggingOptions'] as\n | AmazonopensearchserviceDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n ProcessingConfiguration: aosConfig['ProcessingConfiguration'] as\n | AmazonopensearchserviceDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n } as AmazonopensearchserviceDestinationConfiguration;\n }\n\n // Map SplunkDestinationConfiguration\n if (properties['SplunkDestinationConfiguration']) {\n const splunkConfig = properties['SplunkDestinationConfiguration'] as Record<\n string,\n unknown\n >;\n input.SplunkDestinationConfiguration = {\n HECEndpoint: splunkConfig['HECEndpoint'] as string,\n HECEndpointType: splunkConfig['HECEndpointType'] as string,\n HECToken: splunkConfig['HECToken'] as string,\n HECAcknowledgmentTimeoutInSeconds: splunkConfig['HECAcknowledgmentTimeoutInSeconds'] as\n | number\n | undefined,\n S3BackupMode: splunkConfig['S3BackupMode'] as string | undefined,\n S3Configuration: splunkConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n splunkConfig['S3Configuration'] as Record<string, unknown>\n )\n : (undefined as unknown as S3DestinationConfiguration),\n RetryOptions: splunkConfig['RetryOptions'] as\n | SplunkDestinationConfiguration['RetryOptions']\n | undefined,\n CloudWatchLoggingOptions: splunkConfig['CloudWatchLoggingOptions'] as\n | SplunkDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n ProcessingConfiguration: splunkConfig['ProcessingConfiguration'] as\n | SplunkDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n } as SplunkDestinationConfiguration;\n }\n\n // Map AmazonOpenSearchServerlessDestinationConfiguration\n if (properties['AmazonOpenSearchServerlessDestinationConfiguration']) {\n const aossConfig = properties[\n 'AmazonOpenSearchServerlessDestinationConfiguration'\n ] as Record<string, unknown>;\n input.AmazonOpenSearchServerlessDestinationConfiguration = {\n CollectionEndpoint: aossConfig['CollectionEndpoint'] as string,\n IndexName: aossConfig['IndexName'] as string,\n RoleARN: (aossConfig['RoleArn'] || aossConfig['RoleARN']) as string,\n BufferingHints: aossConfig['BufferingHints'] as\n | AmazonOpenSearchServerlessDestinationConfiguration['BufferingHints']\n | undefined,\n RetryOptions: aossConfig['RetryOptions'] as\n | AmazonOpenSearchServerlessDestinationConfiguration['RetryOptions']\n | undefined,\n S3BackupMode: aossConfig['S3BackupMode'] as string | undefined,\n S3Configuration: aossConfig['S3Configuration']\n ? this.mapS3DestinationConfiguration(\n aossConfig['S3Configuration'] as Record<string, unknown>\n )\n : (undefined as unknown as S3DestinationConfiguration),\n CloudWatchLoggingOptions: aossConfig['CloudWatchLoggingOptions'] as\n | AmazonOpenSearchServerlessDestinationConfiguration['CloudWatchLoggingOptions']\n | undefined,\n ProcessingConfiguration: aossConfig['ProcessingConfiguration'] as\n | AmazonOpenSearchServerlessDestinationConfiguration['ProcessingConfiguration']\n | undefined,\n } as AmazonOpenSearchServerlessDestinationConfiguration;\n }\n\n // Map DeliveryStreamEncryptionConfigurationInput\n if (properties['DeliveryStreamEncryptionConfigurationInput']) {\n const encConfig = properties['DeliveryStreamEncryptionConfigurationInput'] as Record<\n string,\n unknown\n >;\n input.DeliveryStreamEncryptionConfigurationInput = {\n KeyARN: (encConfig['KeyArn'] || encConfig['KeyARN']) as string | undefined,\n KeyType: encConfig['KeyType'] as\n | DeliveryStreamEncryptionConfigurationInput['KeyType']\n | undefined,\n } as DeliveryStreamEncryptionConfigurationInput;\n }\n\n // Map Tags\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n if (tags && tags.length > 0) {\n input.Tags = tags.map((t) => ({ Key: t.Key, Value: t.Value })) as Tag[];\n }\n\n const response = await this.getClient().send(new CreateDeliveryStreamCommand(input));\n\n const physicalId =\n deliveryStreamName ||\n input.DeliveryStreamName ||\n response.DeliveryStreamARN?.split('/').pop() ||\n '';\n const arn = response.DeliveryStreamARN;\n\n this.logger.debug(\n `Successfully created Firehose delivery stream ${logicalId}: ${physicalId}`\n );\n\n // Wait for delivery stream to become ACTIVE before returning.\n // SubscriptionFilter and other dependents fail if the stream is still CREATING.\n await this.waitForActive(physicalId, logicalId);\n\n return {\n physicalId,\n attributes: {\n Arn: arn,\n },\n };\n } catch (error) {\n if (error instanceof ProvisioningError) {\n throw error;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create Firehose delivery stream ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n /**\n * Update a Firehose delivery stream\n *\n * Most changes require replacement, so this is a no-op.\n */\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(\n `Update for ${resourceType} ${logicalId} (${physicalId}) - no-op, most changes require replacement`\n );\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n /**\n * Delete a Firehose delivery stream\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting Firehose delivery stream ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteDeliveryStreamCommand({\n DeliveryStreamName: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted Firehose delivery stream ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(\n `Firehose delivery stream ${physicalId} does not exist, skipping deletion`\n );\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete Firehose delivery stream ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * Map CFn S3DestinationConfiguration to SDK format\n *\n * CFn uses PascalCase (BucketArn, RoleArn) while SDK uses uppercase ARN\n * (BucketARN, RoleARN).\n */\n private mapS3DestinationConfiguration(\n config: Record<string, unknown>\n ): S3DestinationConfiguration {\n const result: S3DestinationConfiguration = {\n BucketARN: (config['BucketArn'] || config['BucketARN']) as string,\n RoleARN: (config['RoleArn'] || config['RoleARN']) as string,\n };\n\n if (config['Prefix'] !== undefined) {\n result.Prefix = config['Prefix'] as string;\n }\n\n if (config['ErrorOutputPrefix'] !== undefined) {\n result.ErrorOutputPrefix = config['ErrorOutputPrefix'] as string;\n }\n\n if (config['CompressionFormat'] !== undefined) {\n result.CompressionFormat = config[\n 'CompressionFormat'\n ] as S3DestinationConfiguration['CompressionFormat'];\n }\n\n if (config['BufferingHints'] !== undefined) {\n const hints = config['BufferingHints'] as Record<string, unknown>;\n result.BufferingHints = {\n ...(hints['SizeInMBs'] !== undefined && { SizeInMBs: hints['SizeInMBs'] as number }),\n ...(hints['IntervalInSeconds'] !== undefined && {\n IntervalInSeconds: hints['IntervalInSeconds'] as number,\n }),\n };\n }\n\n if (config['EncryptionConfiguration'] !== undefined) {\n result.EncryptionConfiguration = config[\n 'EncryptionConfiguration'\n ] as S3DestinationConfiguration['EncryptionConfiguration'];\n }\n\n if (config['CloudWatchLoggingOptions'] !== undefined) {\n result.CloudWatchLoggingOptions = config[\n 'CloudWatchLoggingOptions'\n ] as S3DestinationConfiguration['CloudWatchLoggingOptions'];\n }\n\n return result;\n }\n\n /**\n * Map CFn ExtendedS3DestinationConfiguration to SDK format\n */\n private mapExtendedS3DestinationConfiguration(\n config: Record<string, unknown>\n ): ExtendedS3DestinationConfiguration {\n const result: ExtendedS3DestinationConfiguration = {\n BucketARN: (config['BucketArn'] || config['BucketARN']) as string,\n RoleARN: (config['RoleArn'] || config['RoleARN']) as string,\n };\n\n if (config['Prefix'] !== undefined) {\n result.Prefix = config['Prefix'] as string;\n }\n\n if (config['ErrorOutputPrefix'] !== undefined) {\n result.ErrorOutputPrefix = config['ErrorOutputPrefix'] as string;\n }\n\n if (config['CompressionFormat'] !== undefined) {\n result.CompressionFormat = config[\n 'CompressionFormat'\n ] as ExtendedS3DestinationConfiguration['CompressionFormat'];\n }\n\n if (config['BufferingHints'] !== undefined) {\n const hints = config['BufferingHints'] as Record<string, unknown>;\n result.BufferingHints = {\n ...(hints['SizeInMBs'] !== undefined && { SizeInMBs: hints['SizeInMBs'] as number }),\n ...(hints['IntervalInSeconds'] !== undefined && {\n IntervalInSeconds: hints['IntervalInSeconds'] as number,\n }),\n };\n }\n\n if (config['EncryptionConfiguration'] !== undefined) {\n result.EncryptionConfiguration = config[\n 'EncryptionConfiguration'\n ] as ExtendedS3DestinationConfiguration['EncryptionConfiguration'];\n }\n\n if (config['CloudWatchLoggingOptions'] !== undefined) {\n result.CloudWatchLoggingOptions = config[\n 'CloudWatchLoggingOptions'\n ] as ExtendedS3DestinationConfiguration['CloudWatchLoggingOptions'];\n }\n\n if (config['ProcessingConfiguration'] !== undefined) {\n result.ProcessingConfiguration = config[\n 'ProcessingConfiguration'\n ] as ExtendedS3DestinationConfiguration['ProcessingConfiguration'];\n }\n\n if (config['S3BackupMode'] !== undefined) {\n result.S3BackupMode = config[\n 'S3BackupMode'\n ] as ExtendedS3DestinationConfiguration['S3BackupMode'];\n }\n\n if (config['S3BackupConfiguration'] !== undefined) {\n const backupConfig = config['S3BackupConfiguration'] as Record<string, unknown>;\n result.S3BackupConfiguration = this.mapS3DestinationConfiguration(backupConfig);\n }\n\n if (config['DataFormatConversionConfiguration'] !== undefined) {\n result.DataFormatConversionConfiguration = config[\n 'DataFormatConversionConfiguration'\n ] as ExtendedS3DestinationConfiguration['DataFormatConversionConfiguration'];\n }\n\n return result;\n }\n\n /**\n * Wait for a delivery stream to become ACTIVE.\n * Firehose CreateDeliveryStream returns immediately while the stream is still CREATING.\n */\n private async waitForActive(streamName: string, logicalId: string): Promise<void> {\n const { DescribeDeliveryStreamCommand } = await import('@aws-sdk/client-firehose');\n const maxAttempts = 30;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const resp = await this.getClient().send(\n new DescribeDeliveryStreamCommand({ DeliveryStreamName: streamName })\n );\n const status = resp.DeliveryStreamDescription?.DeliveryStreamStatus;\n if (status === 'ACTIVE') {\n this.logger.debug(`Firehose ${logicalId} is ACTIVE`);\n return;\n }\n this.logger.debug(\n `Firehose ${logicalId} status: ${status} (attempt ${attempt}/${maxAttempts})`\n );\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n this.logger.warn(`Firehose ${logicalId} did not reach ACTIVE after ${maxAttempts} attempts`);\n }\n}\n", "import {\n CloudTrailClient,\n CreateTrailCommand,\n DeleteTrailCommand,\n UpdateTrailCommand,\n StartLoggingCommand,\n StopLoggingCommand,\n PutEventSelectorsCommand,\n PutInsightSelectorsCommand,\n TrailNotFoundException,\n type EventSelector,\n type InsightSelector,\n} from '@aws-sdk/client-cloudtrail';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS CloudTrail resources\n *\n * Supports:\n * - AWS::CloudTrail::Trail\n *\n * CloudTrail CreateTrail/UpdateTrail are synchronous - the CC API adds\n * unnecessary polling overhead for operations that complete immediately.\n */\nexport class CloudTrailProvider implements ResourceProvider {\n private client: CloudTrailClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('CloudTrailProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::CloudTrail::Trail',\n new Set([\n 'S3BucketName',\n 'TrailName',\n 'S3KeyPrefix',\n 'IsMultiRegionTrail',\n 'IncludeGlobalServiceEvents',\n 'EnableLogFileValidation',\n 'IsLogging',\n 'Tags',\n 'CloudWatchLogsLogGroupArn',\n 'CloudWatchLogsRoleArn',\n 'KMSKeyId',\n 'SnsTopicName',\n 'EventSelectors',\n 'InsightSelectors',\n 'IsOrganizationTrail',\n ]),\n ],\n ]);\n\n private getClient(): CloudTrailClient {\n if (!this.client) {\n this.client = new CloudTrailClient(\n this.providerRegion ? { region: this.providerRegion } : {}\n );\n }\n return this.client;\n }\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CloudTrail Trail ${logicalId}`);\n\n const s3BucketName = properties['S3BucketName'] as string | undefined;\n if (!s3BucketName) {\n throw new ProvisioningError(\n `S3BucketName is required for CloudTrail Trail ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const trailName = properties['TrailName'] as string | undefined;\n const s3KeyPrefix = properties['S3KeyPrefix'] as string | undefined;\n const isMultiRegionTrail = properties['IsMultiRegionTrail'] as boolean | undefined;\n const includeGlobalServiceEvents = properties['IncludeGlobalServiceEvents'] as\n | boolean\n | undefined;\n const enableLogFileValidation = properties['EnableLogFileValidation'] as boolean | undefined;\n const isLogging = properties['IsLogging'] as boolean | undefined;\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n const cloudWatchLogsLogGroupArn = properties['CloudWatchLogsLogGroupArn'] as string | undefined;\n const cloudWatchLogsRoleArn = properties['CloudWatchLogsRoleArn'] as string | undefined;\n const kmsKeyId = properties['KMSKeyId'] as string | undefined;\n const snsTopicName = properties['SnsTopicName'] as string | undefined;\n const isOrganizationTrail = properties['IsOrganizationTrail'] as boolean | undefined;\n const eventSelectors = properties['EventSelectors'] as EventSelector[] | undefined;\n const insightSelectors = properties['InsightSelectors'] as InsightSelector[] | undefined;\n\n try {\n const result = await this.getClient().send(\n new CreateTrailCommand({\n Name: trailName ?? logicalId,\n S3BucketName: s3BucketName,\n S3KeyPrefix: s3KeyPrefix,\n IsMultiRegionTrail: isMultiRegionTrail,\n IncludeGlobalServiceEvents: includeGlobalServiceEvents,\n EnableLogFileValidation: enableLogFileValidation,\n TagsList: tags ? tags.map((t) => ({ Key: t.Key, Value: t.Value })) : undefined,\n CloudWatchLogsLogGroupArn: cloudWatchLogsLogGroupArn,\n CloudWatchLogsRoleArn: cloudWatchLogsRoleArn,\n KmsKeyId: kmsKeyId,\n SnsTopicName: snsTopicName,\n IsOrganizationTrail: isOrganizationTrail,\n })\n );\n\n const trailArn = result.TrailARN!;\n\n // Apply EventSelectors if specified (requires separate API call)\n if (eventSelectors && eventSelectors.length > 0) {\n this.logger.debug(`Setting event selectors for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(\n new PutEventSelectorsCommand({\n TrailName: trailArn,\n EventSelectors: eventSelectors,\n })\n );\n }\n\n // Apply InsightSelectors if specified (requires separate API call)\n if (insightSelectors && insightSelectors.length > 0) {\n this.logger.debug(`Setting insight selectors for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(\n new PutInsightSelectorsCommand({\n TrailName: trailArn,\n InsightSelectors: insightSelectors,\n })\n );\n }\n\n // Start logging if IsLogging is true (default behavior)\n if (isLogging !== false) {\n this.logger.debug(`Starting logging for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(new StartLoggingCommand({ Name: trailArn }));\n }\n\n this.logger.debug(`Successfully created CloudTrail Trail ${logicalId}: ${trailArn}`);\n\n return {\n physicalId: trailArn,\n attributes: {\n Arn: trailArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CloudTrail Trail ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CloudTrail Trail ${logicalId}: ${physicalId}`);\n\n const s3BucketName = properties['S3BucketName'] as string | undefined;\n const s3KeyPrefix = properties['S3KeyPrefix'] as string | undefined;\n const isMultiRegionTrail = properties['IsMultiRegionTrail'] as boolean | undefined;\n const includeGlobalServiceEvents = properties['IncludeGlobalServiceEvents'] as\n | boolean\n | undefined;\n const enableLogFileValidation = properties['EnableLogFileValidation'] as boolean | undefined;\n const isLogging = properties['IsLogging'] as boolean | undefined;\n const cloudWatchLogsLogGroupArn = properties['CloudWatchLogsLogGroupArn'] as string | undefined;\n const cloudWatchLogsRoleArn = properties['CloudWatchLogsRoleArn'] as string | undefined;\n const kmsKeyId = properties['KMSKeyId'] as string | undefined;\n const snsTopicName = properties['SnsTopicName'] as string | undefined;\n const isOrganizationTrail = properties['IsOrganizationTrail'] as boolean | undefined;\n\n try {\n await this.getClient().send(\n new UpdateTrailCommand({\n Name: physicalId,\n S3BucketName: s3BucketName,\n S3KeyPrefix: s3KeyPrefix,\n IsMultiRegionTrail: isMultiRegionTrail,\n IncludeGlobalServiceEvents: includeGlobalServiceEvents,\n EnableLogFileValidation: enableLogFileValidation,\n CloudWatchLogsLogGroupArn: cloudWatchLogsLogGroupArn,\n CloudWatchLogsRoleArn: cloudWatchLogsRoleArn,\n KmsKeyId: kmsKeyId,\n SnsTopicName: snsTopicName,\n IsOrganizationTrail: isOrganizationTrail,\n })\n );\n\n // Update EventSelectors if changed\n const newEventSelectors = properties['EventSelectors'] as EventSelector[] | undefined;\n const oldEventSelectors = previousProperties['EventSelectors'] as EventSelector[] | undefined;\n if (JSON.stringify(newEventSelectors) !== JSON.stringify(oldEventSelectors)) {\n if (newEventSelectors && newEventSelectors.length > 0) {\n this.logger.debug(`Updating event selectors for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(\n new PutEventSelectorsCommand({\n TrailName: physicalId,\n EventSelectors: newEventSelectors,\n })\n );\n }\n }\n\n // Update InsightSelectors if changed\n const newInsightSelectors = properties['InsightSelectors'] as InsightSelector[] | undefined;\n const oldInsightSelectors = previousProperties['InsightSelectors'] as\n | InsightSelector[]\n | undefined;\n if (JSON.stringify(newInsightSelectors) !== JSON.stringify(oldInsightSelectors)) {\n if (newInsightSelectors && newInsightSelectors.length > 0) {\n this.logger.debug(`Updating insight selectors for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(\n new PutInsightSelectorsCommand({\n TrailName: physicalId,\n InsightSelectors: newInsightSelectors,\n })\n );\n }\n }\n\n // Handle IsLogging changes\n const oldIsLogging = previousProperties['IsLogging'] as boolean | undefined;\n if (isLogging !== oldIsLogging) {\n if (isLogging === false) {\n this.logger.debug(`Stopping logging for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(new StopLoggingCommand({ Name: physicalId }));\n } else {\n this.logger.debug(`Starting logging for CloudTrail Trail ${logicalId}`);\n await this.getClient().send(new StartLoggingCommand({ Name: physicalId }));\n }\n }\n\n this.logger.debug(`Successfully updated CloudTrail Trail ${logicalId}`);\n\n return { physicalId, wasReplaced: false };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CloudTrail Trail ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting CloudTrail Trail ${logicalId}: ${physicalId}`);\n\n try {\n // Stop logging before deletion (ignore errors)\n try {\n await this.getClient().send(new StopLoggingCommand({ Name: physicalId }));\n } catch {\n // Ignore errors when stopping logging\n }\n\n await this.getClient().send(new DeleteTrailCommand({ Name: physicalId }));\n this.logger.debug(`Successfully deleted CloudTrail Trail ${logicalId}`);\n } catch (error) {\n if (error instanceof TrailNotFoundException) {\n this.logger.debug(`CloudTrail Trail ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CloudTrail Trail ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n getAttribute(\n _physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n // Arn is stored in attributes during create\n return Promise.resolve(attributeName);\n }\n}\n", "import {\n CodeBuildClient,\n CreateProjectCommand,\n DeleteProjectCommand,\n UpdateProjectCommand,\n ResourceNotFoundException,\n type SourceType,\n type EnvironmentType,\n type ComputeType,\n type ArtifactsType,\n type ArtifactNamespace,\n type ArtifactPackaging,\n type EnvironmentVariableType,\n type CacheType,\n type CacheMode,\n type ImagePullCredentialsType,\n} from '@aws-sdk/client-codebuild';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS CodeBuild resources\n *\n * Supports:\n * - AWS::CodeBuild::Project\n *\n * CodeBuild CreateProject/UpdateProject are synchronous - the CC API adds\n * unnecessary polling overhead for operations that complete immediately.\n */\nexport class CodeBuildProvider implements ResourceProvider {\n private client: CodeBuildClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('CodeBuildProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::CodeBuild::Project',\n new Set([\n 'Name',\n 'Source',\n 'Environment',\n 'ServiceRole',\n 'Artifacts',\n 'Tags',\n 'Description',\n 'TimeoutInMinutes',\n 'QueuedTimeoutInMinutes',\n 'EncryptionKey',\n 'Cache',\n 'VpcConfig',\n 'LogsConfig',\n 'ConcurrentBuildLimit',\n 'SecondaryArtifacts',\n 'SecondarySources',\n 'SecondarySourceVersions',\n 'FileSystemLocations',\n 'BuildBatchConfig',\n 'BadgeEnabled',\n 'SourceVersion',\n ]),\n ],\n ]);\n\n private getClient(): CodeBuildClient {\n if (!this.client) {\n this.client = new CodeBuildClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n private mapSource(source: Record<string, unknown> | undefined) {\n if (!source) {\n return { type: 'NO_SOURCE' as SourceType };\n }\n\n let buildspec: string | undefined;\n if (source['BuildSpec'] !== undefined) {\n const bs = source['BuildSpec'];\n buildspec = typeof bs === 'object' ? JSON.stringify(bs) : (bs as string);\n }\n\n return {\n type: ((source['Type'] as string) ?? 'NO_SOURCE') as SourceType,\n buildspec,\n location: source['Location'] as string | undefined,\n gitCloneDepth: source['GitCloneDepth'] as number | undefined,\n insecureSsl: source['InsecureSsl'] as boolean | undefined,\n reportBuildStatus: source['ReportBuildStatus'] as boolean | undefined,\n };\n }\n\n private mapArtifacts(artifacts: Record<string, unknown> | undefined) {\n if (!artifacts) {\n return { type: 'NO_ARTIFACTS' as ArtifactsType };\n }\n\n return {\n type: ((artifacts['Type'] as string) ?? 'NO_ARTIFACTS') as ArtifactsType,\n location: artifacts['Location'] as string | undefined,\n path: artifacts['Path'] as string | undefined,\n name: artifacts['Name'] as string | undefined,\n namespaceType: artifacts['NamespaceType'] as ArtifactNamespace | undefined,\n packaging: artifacts['Packaging'] as ArtifactPackaging | undefined,\n overrideArtifactName: artifacts['OverrideArtifactName'] as boolean | undefined,\n encryptionDisabled: artifacts['EncryptionDisabled'] as boolean | undefined,\n artifactIdentifier: artifacts['ArtifactIdentifier'] as string | undefined,\n };\n }\n\n private mapProperties(logicalId: string, properties: Record<string, unknown>) {\n const name = (properties['Name'] as string | undefined) ?? logicalId;\n const source = properties['Source'] as Record<string, unknown> | undefined;\n const environment = properties['Environment'] as Record<string, unknown> | undefined;\n const serviceRole = properties['ServiceRole'] as string | undefined;\n const artifacts = properties['Artifacts'] as Record<string, unknown> | undefined;\n const tags = properties['Tags'] as Array<{ Key: string; Value: string }> | undefined;\n\n const envVars = environment?.['EnvironmentVariables'] as\n | Array<{ Name: string; Value: string; Type?: string }>\n | undefined;\n\n // Map Cache (CFn PascalCase -> SDK camelCase)\n const cfnCache = properties['Cache'] as Record<string, unknown> | undefined;\n const cache = cfnCache\n ? {\n type: cfnCache['Type'] as string as CacheType,\n location: cfnCache['Location'] as string | undefined,\n modes: cfnCache['Modes'] as CacheMode[] | undefined,\n }\n : undefined;\n\n // Map VpcConfig\n const cfnVpcConfig = properties['VpcConfig'] as Record<string, unknown> | undefined;\n const vpcConfig = cfnVpcConfig\n ? {\n vpcId: cfnVpcConfig['VpcId'] as string | undefined,\n subnets: cfnVpcConfig['Subnets'] as string[] | undefined,\n securityGroupIds: cfnVpcConfig['SecurityGroupIds'] as string[] | undefined,\n }\n : undefined;\n\n // Map LogsConfig\n const cfnLogsConfig = properties['LogsConfig'] as Record<string, unknown> | undefined;\n let logsConfig: Record<string, unknown> | undefined;\n if (cfnLogsConfig) {\n const cwLogs = cfnLogsConfig['CloudWatchLogs'] as Record<string, unknown> | undefined;\n const s3Logs = cfnLogsConfig['S3Logs'] as Record<string, unknown> | undefined;\n logsConfig = {\n cloudWatchLogs: cwLogs\n ? {\n status: cwLogs['Status'] as string | undefined,\n groupName: cwLogs['GroupName'] as string | undefined,\n streamName: cwLogs['StreamName'] as string | undefined,\n }\n : undefined,\n s3Logs: s3Logs\n ? {\n status: s3Logs['Status'] as string | undefined,\n location: s3Logs['Location'] as string | undefined,\n encryptionDisabled: s3Logs['EncryptionDisabled'] as boolean | undefined,\n }\n : undefined,\n };\n }\n\n // Map SecondarySources\n const cfnSecondarySources = properties['SecondarySources'] as\n | Array<Record<string, unknown>>\n | undefined;\n const secondarySources = cfnSecondarySources\n ? cfnSecondarySources.map((s) => this.mapSource(s))\n : undefined;\n\n // Map SecondaryArtifacts\n const cfnSecondaryArtifacts = properties['SecondaryArtifacts'] as\n | Array<Record<string, unknown>>\n | undefined;\n const secondaryArtifacts = cfnSecondaryArtifacts\n ? cfnSecondaryArtifacts.map((a) => this.mapArtifacts(a))\n : undefined;\n\n // Map SecondarySourceVersions\n const cfnSecondarySourceVersions = properties['SecondarySourceVersions'] as\n | Array<Record<string, unknown>>\n | undefined;\n const secondarySourceVersions = cfnSecondarySourceVersions\n ? cfnSecondarySourceVersions.map((sv) => ({\n sourceIdentifier: sv['SourceIdentifier'] as string,\n sourceVersion: sv['SourceVersion'] as string,\n }))\n : undefined;\n\n // Map FileSystemLocations\n const cfnFileSystemLocations = properties['FileSystemLocations'] as\n | Array<Record<string, unknown>>\n | undefined;\n const fileSystemLocations = cfnFileSystemLocations\n ? cfnFileSystemLocations.map((fsl) => ({\n type: fsl['Type'] as 'EFS' | undefined,\n location: fsl['Location'] as string | undefined,\n mountPoint: fsl['MountPoint'] as string | undefined,\n identifier: fsl['Identifier'] as string | undefined,\n mountOptions: fsl['MountOptions'] as string | undefined,\n }))\n : undefined;\n\n // Map BuildBatchConfig\n const cfnBuildBatchConfig = properties['BuildBatchConfig'] as\n | Record<string, unknown>\n | undefined;\n let buildBatchConfig: Record<string, unknown> | undefined;\n if (cfnBuildBatchConfig) {\n const restrictions = cfnBuildBatchConfig['Restrictions'] as\n | Record<string, unknown>\n | undefined;\n buildBatchConfig = {\n serviceRole: cfnBuildBatchConfig['ServiceRole'] as string | undefined,\n combineArtifacts: cfnBuildBatchConfig['CombineArtifacts'] as boolean | undefined,\n timeoutInMins: cfnBuildBatchConfig['TimeoutInMins'] as number | undefined,\n restrictions: restrictions\n ? {\n maximumBuildsAllowed: restrictions['MaximumBuildsAllowed'] as number | undefined,\n computeTypesAllowed: restrictions['ComputeTypesAllowed'] as string[] | undefined,\n }\n : undefined,\n };\n }\n\n return {\n name,\n source: this.mapSource(source),\n environment: {\n type: ((environment?.['Type'] as string) ?? 'LINUX_CONTAINER') as EnvironmentType,\n computeType: ((environment?.['ComputeType'] as string) ??\n 'BUILD_GENERAL1_SMALL') as ComputeType,\n image: environment?.['Image'] as string | undefined,\n environmentVariables: envVars\n ? envVars.map((v) => ({\n name: v.Name,\n value: v.Value,\n type: (v.Type ?? 'PLAINTEXT') as EnvironmentVariableType,\n }))\n : undefined,\n privilegedMode: environment?.['PrivilegedMode'] as boolean | undefined,\n certificate: environment?.['Certificate'] as string | undefined,\n imagePullCredentialsType: environment?.['ImagePullCredentialsType'] as\n | ImagePullCredentialsType\n | undefined,\n registryCredential: environment?.['RegistryCredential']\n ? {\n credential: (environment['RegistryCredential'] as Record<string, unknown>)[\n 'Credential'\n ] as string,\n credentialProvider: (environment['RegistryCredential'] as Record<string, unknown>)[\n 'CredentialProvider'\n ] as 'SECRETS_MANAGER',\n }\n : undefined,\n },\n serviceRole,\n artifacts: this.mapArtifacts(artifacts),\n tags: tags ? tags.map((t) => ({ key: t.Key, value: t.Value })) : undefined,\n description: properties['Description'] as string | undefined,\n timeoutInMinutes: properties['TimeoutInMinutes'] as number | undefined,\n queuedTimeoutInMinutes: properties['QueuedTimeoutInMinutes'] as number | undefined,\n encryptionKey: properties['EncryptionKey'] as string | undefined,\n cache,\n vpcConfig,\n logsConfig,\n concurrentBuildLimit: properties['ConcurrentBuildLimit'] as number | undefined,\n secondarySources,\n secondaryArtifacts,\n secondarySourceVersions,\n fileSystemLocations,\n buildBatchConfig,\n badgeEnabled: properties['BadgeEnabled'] as boolean | undefined,\n sourceVersion: properties['SourceVersion'] as string | undefined,\n };\n }\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating CodeBuild Project ${logicalId}`);\n\n try {\n const input = this.mapProperties(logicalId, properties);\n\n const result = await this.getClient().send(new CreateProjectCommand(input));\n\n const projectName = result.project!.name!;\n const projectArn = result.project!.arn!;\n\n this.logger.debug(`Successfully created CodeBuild Project ${logicalId}: ${projectName}`);\n\n return {\n physicalId: projectName,\n attributes: {\n Arn: projectArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create CodeBuild Project ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n async update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating CodeBuild Project ${logicalId}: ${physicalId}`);\n\n try {\n const input = this.mapProperties(logicalId, properties);\n // Ensure the update targets the existing project\n input.name = physicalId;\n\n await this.getClient().send(new UpdateProjectCommand(input));\n\n this.logger.debug(`Successfully updated CodeBuild Project ${logicalId}`);\n\n return { physicalId, wasReplaced: false };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update CodeBuild Project ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting CodeBuild Project ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(new DeleteProjectCommand({ name: physicalId }));\n this.logger.debug(`Successfully deleted CodeBuild Project ${logicalId}`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n this.logger.debug(`CodeBuild Project ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete CodeBuild Project ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n getAttribute(\n _physicalId: string,\n _resourceType: string,\n attributeName: string\n ): Promise<unknown> {\n // Arn is stored in attributes during create\n return Promise.resolve(attributeName);\n }\n}\n", "import {\n S3VectorsClient,\n CreateVectorBucketCommand,\n DeleteVectorBucketCommand,\n ListIndexesCommand,\n DeleteIndexCommand,\n type SseType,\n} from '@aws-sdk/client-s3vectors';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS S3 Vectors resources\n *\n * Supports:\n * - AWS::S3Vectors::VectorBucket\n *\n * S3 Vectors CreateVectorBucket is synchronous - the CC API adds unnecessary\n * polling overhead for operations that complete immediately.\n */\nexport class S3VectorsProvider implements ResourceProvider {\n private client: S3VectorsClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('S3VectorsProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::S3Vectors::VectorBucket', new Set(['VectorBucketName', 'EncryptionConfiguration'])],\n ]);\n\n private getClient(): S3VectorsClient {\n if (!this.client) {\n this.client = new S3VectorsClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::S3Vectors::VectorBucket':\n return this.createVectorBucket(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n _physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n switch (resourceType) {\n case 'AWS::S3Vectors::VectorBucket':\n // VectorBucket does not support updates\n return Promise.resolve({ physicalId: _physicalId, wasReplaced: false });\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n _physicalId\n );\n }\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::S3Vectors::VectorBucket':\n return this.deleteVectorBucket(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::S3Vectors::VectorBucket \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createVectorBucket(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 VectorBucket ${logicalId}`);\n\n const vectorBucketName = properties['VectorBucketName'] as string | undefined;\n if (!vectorBucketName) {\n throw new ProvisioningError(\n `VectorBucketName is required for S3 VectorBucket ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const encryptionConfiguration = properties['EncryptionConfiguration'] as\n | Record<string, unknown>\n | undefined;\n\n try {\n const result = await this.getClient().send(\n new CreateVectorBucketCommand({\n vectorBucketName,\n encryptionConfiguration: encryptionConfiguration\n ? {\n sseType: encryptionConfiguration['SSEType'] as SseType | undefined,\n kmsKeyArn: encryptionConfiguration['KMSKeyArn'] as string | undefined,\n }\n : undefined,\n })\n );\n\n const vectorBucketArn = result.vectorBucketArn ?? '';\n\n this.logger.debug(`Successfully created S3 VectorBucket ${logicalId}: ${vectorBucketName}`);\n\n return {\n physicalId: vectorBucketName,\n attributes: {\n VectorBucketArn: vectorBucketArn,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 VectorBucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteVectorBucket(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting S3 VectorBucket ${logicalId}: ${physicalId}`);\n\n try {\n // Step 1: Delete all indexes in the vector bucket\n await this.emptyVectorBucket(logicalId, physicalId);\n\n // Step 2: Delete the vector bucket itself\n await this.getClient().send(\n new DeleteVectorBucketCommand({\n vectorBucketName: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted S3 VectorBucket ${logicalId}`);\n } catch (error) {\n // Idempotency: treat not-found as success\n if (this.isNotFoundError(error)) {\n this.logger.debug(`S3 VectorBucket ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 VectorBucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Empty a vector bucket by listing and deleting all indexes.\n * Paginates through all indexes using NextToken.\n */\n private async emptyVectorBucket(logicalId: string, vectorBucketName: string): Promise<void> {\n let nextToken: string | undefined;\n\n do {\n const listResult = await this.getClient().send(\n new ListIndexesCommand({\n vectorBucketName,\n nextToken,\n })\n );\n\n const indexes = listResult.indexes ?? [];\n for (const index of indexes) {\n if (index.indexName) {\n this.logger.debug(`Deleting index ${index.indexName} from VectorBucket ${logicalId}`);\n await this.getClient().send(\n new DeleteIndexCommand({\n vectorBucketName,\n indexName: index.indexName,\n })\n );\n }\n }\n\n nextToken = listResult.nextToken;\n } while (nextToken);\n }\n\n private isNotFoundError(error: unknown): boolean {\n if (error instanceof Error) {\n const name = error.name;\n return (\n name === 'NotFoundException' ||\n name === 'ResourceNotFoundException' ||\n name === 'NoSuchVectorBucket' ||\n name === 'NoSuchBucket'\n );\n }\n return false;\n }\n}\n", "import {\n S3Client,\n CreateBucketCommand,\n DeleteBucketCommand,\n ListObjectsV2Command,\n DeleteObjectsCommand,\n} from '@aws-sdk/client-s3';\nimport { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';\nimport { EC2Client, DescribeAvailabilityZonesCommand } from '@aws-sdk/client-ec2';\nimport { getLogger } from '../../utils/logger.js';\nimport { getAwsClients } from '../../utils/aws-clients.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS::S3Express::DirectoryBucket\n *\n * Uses S3 SDK directly for S3 Express Directory Bucket operations.\n * Directory buckets use the S3 Express One Zone storage class with\n * single-AZ data redundancy.\n */\nexport class S3DirectoryBucketProvider implements ResourceProvider {\n private s3Client: S3Client;\n private stsClient: STSClient;\n private logger = getLogger().child('S3DirectoryBucketProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::S3Express::DirectoryBucket', new Set(['DataRedundancy', 'LocationName', 'BucketName'])],\n ]);\n\n private ec2Client: EC2Client | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n\n constructor() {\n const awsClients = getAwsClients();\n this.s3Client = awsClients.s3;\n this.stsClient = awsClients.sts;\n }\n\n private getEc2Client(): EC2Client {\n if (!this.ec2Client) {\n this.ec2Client = new EC2Client(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.ec2Client;\n }\n\n /**\n * Convert AZ name (us-east-1a) to AZ ID (use1-az1) via EC2 DescribeAvailabilityZones\n */\n private async getAzId(azName: string): Promise<string> {\n try {\n const response = await this.getEc2Client().send(\n new DescribeAvailabilityZonesCommand({\n ZoneNames: [azName],\n })\n );\n const azId = response.AvailabilityZones?.[0]?.ZoneId;\n if (azId) {\n this.logger.debug(`Resolved AZ name ${azName} \u2192 AZ ID ${azId}`);\n return azId;\n }\n } catch (error) {\n this.logger.debug(\n `Failed to resolve AZ ID for ${azName}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n // Fallback: return the AZ name as-is\n return azName;\n }\n\n /**\n * Get the region from the S3 client config\n */\n private async getRegion(): Promise<string> {\n const region = await this.s3Client.config.region();\n return region || 'us-east-1';\n }\n\n /**\n * Get the AWS account ID via STS\n */\n private async getAccountId(): Promise<string> {\n const identity = await this.stsClient.send(new GetCallerIdentityCommand({}));\n return identity.Account!;\n }\n\n /**\n * Build attributes for a directory bucket\n */\n private async buildAttributes(bucketName: string): Promise<Record<string, unknown>> {\n const region = await this.getRegion();\n const accountId = await this.getAccountId();\n return {\n Arn: `arn:aws:s3express:${region}:${accountId}:bucket/${bucketName}`,\n };\n }\n\n /**\n * Create an S3 Express Directory Bucket\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 Express Directory Bucket ${logicalId}`);\n\n const dataRedundancy = (properties['DataRedundancy'] as string) || 'SingleAvailabilityZone';\n // CFn LocationName: \"us-east-1a--x-s3\" \u2192 extract AZ name: \"us-east-1a\"\n const cfnLocationName = properties['LocationName'] as string | undefined;\n const azName = cfnLocationName?.replace(/--x-s3$/, '') || 'us-east-1a';\n\n // S3 CreateBucket API requires AZ ID (use1-az1), not AZ name (us-east-1a)\n const azId = await this.getAzId(azName);\n\n // Generate bucket name if not specified\n // Directory bucket names must follow: {name}--{az-id}--x-s3\n let bucketName = properties['BucketName'] as string | undefined;\n if (!bucketName) {\n const baseName = generateResourceName(logicalId, {\n maxLength: 64,\n lowercase: true,\n });\n bucketName = `${baseName}--${azId}--x-s3`;\n }\n\n try {\n await this.s3Client.send(\n new CreateBucketCommand({\n Bucket: bucketName,\n CreateBucketConfiguration: {\n Bucket: {\n Type: 'Directory',\n DataRedundancy: dataRedundancy as 'SingleAvailabilityZone',\n },\n Location: {\n Name: azId,\n Type: 'AvailabilityZone',\n },\n },\n })\n );\n this.logger.debug(`Created S3 Express Directory Bucket: ${bucketName}`);\n\n const attributes = await this.buildAttributes(bucketName);\n\n return {\n physicalId: bucketName,\n attributes,\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 Express Directory Bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n bucketName,\n cause\n );\n }\n }\n\n /**\n * Update an S3 Express Directory Bucket\n *\n * Most properties are immutable, so this is a no-op.\n */\n update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(\n `Update for S3 Express Directory Bucket ${logicalId} is a no-op (immutable properties)`\n );\n return Promise.resolve({\n physicalId,\n wasReplaced: false,\n });\n }\n\n /**\n * Delete an S3 Express Directory Bucket\n *\n * Must empty the bucket before deletion. Directory buckets do not support\n * versioning, so only current objects need to be deleted.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting S3 Express Directory Bucket ${logicalId}: ${physicalId}`);\n\n try {\n // Empty the bucket first\n await this.emptyBucket(physicalId);\n\n // Delete the bucket\n await this.s3Client.send(\n new DeleteBucketCommand({\n Bucket: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted S3 Express Directory Bucket ${logicalId}`);\n } catch (error) {\n // Bucket not found = already deleted (idempotent)\n if (\n error instanceof Error &&\n (error.name === 'NoSuchBucket' || error.name === 'BucketNotFound')\n ) {\n this.logger.debug(`Bucket ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 Express Directory Bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Empty all objects from a directory bucket.\n * Lists and deletes objects in batches of 1000.\n */\n private async emptyBucket(bucketName: string): Promise<void> {\n let continuationToken: string | undefined;\n\n do {\n const listResponse = await this.s3Client.send(\n new ListObjectsV2Command({\n Bucket: bucketName,\n MaxKeys: 1000,\n ContinuationToken: continuationToken,\n })\n );\n\n const objects = listResponse.Contents;\n if (objects && objects.length > 0) {\n await this.s3Client.send(\n new DeleteObjectsCommand({\n Bucket: bucketName,\n Delete: {\n Objects: objects.map((obj) => ({ Key: obj.Key })),\n Quiet: true,\n },\n })\n );\n this.logger.debug(`Deleted ${objects.length} objects from bucket ${bucketName}`);\n }\n\n continuationToken = listResponse.IsTruncated ? listResponse.NextContinuationToken : undefined;\n } while (continuationToken);\n }\n}\n", "import {\n S3TablesClient,\n CreateTableBucketCommand,\n DeleteTableBucketCommand,\n CreateNamespaceCommand,\n DeleteNamespaceCommand,\n CreateTableCommand,\n DeleteTableCommand,\n ListNamespacesCommand,\n ListTablesCommand,\n NotFoundException,\n} from '@aws-sdk/client-s3tables';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * SDK Provider for AWS S3 Tables resources\n *\n * Supports:\n * - AWS::S3Tables::TableBucket\n * - AWS::S3Tables::Namespace\n * - AWS::S3Tables::Table\n *\n * S3 Tables API calls are synchronous - the CC API adds unnecessary\n * polling overhead for operations that complete immediately.\n */\nexport class S3TablesProvider implements ResourceProvider {\n private client: S3TablesClient | undefined;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('S3TablesProvider');\n\n handledProperties = new Map<string, ReadonlySet<string>>([\n ['AWS::S3Tables::TableBucket', new Set(['TableBucketName'])],\n ['AWS::S3Tables::Namespace', new Set(['TableBucketARN', 'Namespace'])],\n ['AWS::S3Tables::Table', new Set(['TableBucketARN', 'Namespace', 'Name', 'Format'])],\n ]);\n\n private getClient(): S3TablesClient {\n if (!this.client) {\n this.client = new S3TablesClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n // \u2500\u2500\u2500 Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n switch (resourceType) {\n case 'AWS::S3Tables::TableBucket':\n return this.createTableBucket(logicalId, resourceType, properties);\n case 'AWS::S3Tables::Namespace':\n return this.createNamespace(logicalId, resourceType, properties);\n case 'AWS::S3Tables::Table':\n return this.createTable(logicalId, resourceType, properties);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId\n );\n }\n }\n\n update(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties: Record<string, unknown>,\n _previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n // All S3 Tables resources are immutable - no update supported\n this.logger.debug(`Update is no-op for ${resourceType} ${logicalId}`);\n return Promise.resolve({ physicalId, wasReplaced: false });\n }\n\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n switch (resourceType) {\n case 'AWS::S3Tables::TableBucket':\n return this.deleteTableBucket(logicalId, physicalId, resourceType);\n case 'AWS::S3Tables::Namespace':\n return this.deleteNamespace(logicalId, physicalId, resourceType);\n case 'AWS::S3Tables::Table':\n return this.deleteTable(logicalId, physicalId, resourceType);\n default:\n throw new ProvisioningError(\n `Unsupported resource type: ${resourceType}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::S3Tables::TableBucket \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createTableBucket(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 Table Bucket ${logicalId}`);\n\n const tableBucketName = properties['TableBucketName'] as string | undefined;\n if (!tableBucketName) {\n throw new ProvisioningError(\n `TableBucketName is required for S3 Table Bucket ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n const result = await this.getClient().send(\n new CreateTableBucketCommand({\n name: tableBucketName,\n })\n );\n\n const tableBucketARN = result.arn!;\n\n this.logger.debug(`Successfully created S3 Table Bucket ${logicalId}: ${tableBucketARN}`);\n\n return {\n physicalId: tableBucketARN,\n attributes: {\n TableBucketARN: tableBucketARN,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 Table Bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteTableBucket(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting S3 Table Bucket ${logicalId}: ${physicalId}`);\n\n try {\n // Must empty all tables and namespaces before deleting the bucket\n await this.emptyTableBucket(physicalId);\n\n await this.getClient().send(\n new DeleteTableBucketCommand({\n tableBucketARN: physicalId,\n })\n );\n this.logger.debug(`Successfully deleted S3 Table Bucket ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`S3 Table Bucket ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 Table Bucket ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Empty a table bucket by deleting all tables in all namespaces,\n * then deleting all namespaces.\n */\n private async emptyTableBucket(tableBucketARN: string): Promise<void> {\n this.logger.debug(`Emptying table bucket ${tableBucketARN}`);\n\n // List and process all namespaces\n let namespaceContinuationToken: string | undefined;\n do {\n const namespacesResult = await this.getClient().send(\n new ListNamespacesCommand({\n tableBucketARN,\n continuationToken: namespaceContinuationToken,\n })\n );\n\n for (const ns of namespacesResult.namespaces ?? []) {\n const namespaceName = ns.namespace?.[0];\n if (!namespaceName) continue;\n\n // Delete all tables in this namespace\n let tableContinuationToken: string | undefined;\n do {\n const tablesResult = await this.getClient().send(\n new ListTablesCommand({\n tableBucketARN,\n namespace: namespaceName,\n continuationToken: tableContinuationToken,\n })\n );\n\n for (const table of tablesResult.tables ?? []) {\n if (!table.name) continue;\n this.logger.debug(\n `Deleting table ${namespaceName}/${table.name} from bucket ${tableBucketARN}`\n );\n try {\n await this.getClient().send(\n new DeleteTableCommand({\n tableBucketARN,\n namespace: namespaceName,\n name: table.name,\n })\n );\n } catch (error) {\n if (!(error instanceof NotFoundException)) {\n throw error;\n }\n }\n }\n\n tableContinuationToken = tablesResult.continuationToken;\n } while (tableContinuationToken);\n\n // Delete the namespace\n this.logger.debug(`Deleting namespace ${namespaceName} from bucket ${tableBucketARN}`);\n try {\n await this.getClient().send(\n new DeleteNamespaceCommand({\n tableBucketARN,\n namespace: namespaceName,\n })\n );\n } catch (error) {\n if (!(error instanceof NotFoundException)) {\n throw error;\n }\n }\n }\n\n namespaceContinuationToken = namespacesResult.continuationToken;\n } while (namespaceContinuationToken);\n }\n\n // \u2500\u2500\u2500 AWS::S3Tables::Namespace \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createNamespace(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 Tables Namespace ${logicalId}`);\n\n const tableBucketARN = properties['TableBucketARN'] as string | undefined;\n if (!tableBucketARN) {\n throw new ProvisioningError(\n `TableBucketARN is required for S3 Tables Namespace ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const namespace = properties['Namespace'] as string[] | undefined;\n if (!namespace || namespace.length === 0) {\n throw new ProvisioningError(\n `Namespace is required for S3 Tables Namespace ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const namespaceName = namespace[0]!;\n\n try {\n await this.getClient().send(\n new CreateNamespaceCommand({\n tableBucketARN,\n namespace: [namespaceName],\n })\n );\n\n const physicalId = `${tableBucketARN}|${namespaceName}`;\n\n this.logger.debug(`Successfully created S3 Tables Namespace ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 Tables Namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteNamespace(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting S3 Tables Namespace ${logicalId}: ${physicalId}`);\n\n const [tableBucketARN, namespaceName] = physicalId.split('|');\n if (!tableBucketARN || !namespaceName) {\n throw new ProvisioningError(\n `Invalid physical ID format for S3 Tables Namespace ${logicalId}: ${physicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n try {\n await this.getClient().send(\n new DeleteNamespaceCommand({\n tableBucketARN,\n namespace: namespaceName,\n })\n );\n this.logger.debug(`Successfully deleted S3 Tables Namespace ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`S3 Tables Namespace ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 Tables Namespace ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n // \u2500\u2500\u2500 AWS::S3Tables::Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async createTable(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating S3 Tables Table ${logicalId}`);\n\n const tableBucketARN = properties['TableBucketARN'] as string | undefined;\n if (!tableBucketARN) {\n throw new ProvisioningError(\n `TableBucketARN is required for S3 Tables Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const namespace = properties['Namespace'] as string | undefined;\n if (!namespace) {\n throw new ProvisioningError(\n `Namespace is required for S3 Tables Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const name = properties['Name'] as string | undefined;\n if (!name) {\n throw new ProvisioningError(\n `Name is required for S3 Tables Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n const format = properties['Format'] as string | undefined;\n if (!format) {\n throw new ProvisioningError(\n `Format is required for S3 Tables Table ${logicalId}`,\n resourceType,\n logicalId\n );\n }\n\n try {\n await this.getClient().send(\n new CreateTableCommand({\n tableBucketARN,\n namespace,\n name,\n format: format as 'ICEBERG',\n })\n );\n\n const physicalId = `${tableBucketARN}|${namespace}|${name}`;\n\n this.logger.debug(`Successfully created S3 Tables Table ${logicalId}: ${physicalId}`);\n\n return {\n physicalId,\n attributes: {},\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create S3 Tables Table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n undefined,\n cause\n );\n }\n }\n\n private async deleteTable(\n logicalId: string,\n physicalId: string,\n resourceType: string\n ): Promise<void> {\n this.logger.debug(`Deleting S3 Tables Table ${logicalId}: ${physicalId}`);\n\n const parts = physicalId.split('|');\n if (parts.length < 3) {\n throw new ProvisioningError(\n `Invalid physical ID format for S3 Tables Table ${logicalId}: ${physicalId}`,\n resourceType,\n logicalId,\n physicalId\n );\n }\n\n const tableBucketARN = parts[0];\n const namespace = parts[1];\n const name = parts[2];\n\n try {\n await this.getClient().send(\n new DeleteTableCommand({\n tableBucketARN,\n namespace,\n name,\n })\n );\n this.logger.debug(`Successfully deleted S3 Tables Table ${logicalId}`);\n } catch (error) {\n if (error instanceof NotFoundException) {\n this.logger.debug(`S3 Tables Table ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete S3 Tables Table ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import {\n ECRClient,\n CreateRepositoryCommand,\n DeleteRepositoryCommand,\n DescribeRepositoriesCommand,\n PutLifecyclePolicyCommand,\n SetRepositoryPolicyCommand,\n PutImageScanningConfigurationCommand,\n PutImageTagMutabilityCommand,\n TagResourceCommand,\n RepositoryNotFoundException,\n type ImageScanningConfiguration,\n type EncryptionConfiguration,\n type ImageTagMutability,\n type Tag,\n} from '@aws-sdk/client-ecr';\nimport { getLogger } from '../../utils/logger.js';\nimport { ProvisioningError } from '../../utils/error-handler.js';\nimport { generateResourceName } from '../resource-name.js';\nimport type {\n ResourceProvider,\n ResourceCreateResult,\n ResourceUpdateResult,\n} from '../../types/resource.js';\n\n/**\n * AWS ECR Repository Provider\n *\n * Implements resource provisioning for AWS::ECR::Repository using the ECR SDK.\n * WHY: The CC API cannot force-delete repositories that contain images.\n * This SDK provider uses DeleteRepositoryCommand with `force: true` to delete\n * repositories along with all their images, supporting CDK's `emptyOnDelete: true`.\n */\nexport class ECRProvider implements ResourceProvider {\n private client?: ECRClient;\n private readonly providerRegion = process.env['AWS_REGION'];\n private logger = getLogger().child('ECRProvider');\n handledProperties = new Map<string, ReadonlySet<string>>([\n [\n 'AWS::ECR::Repository',\n new Set([\n 'RepositoryName',\n 'ImageScanningConfiguration',\n 'ImageTagMutability',\n 'EncryptionConfiguration',\n 'LifecyclePolicy',\n 'RepositoryPolicyText',\n 'Tags',\n 'EmptyOnDelete',\n 'ImageTagMutabilityExclusionFilters',\n ]),\n ],\n ]);\n\n private getClient(): ECRClient {\n if (!this.client) {\n this.client = new ECRClient(this.providerRegion ? { region: this.providerRegion } : {});\n }\n return this.client;\n }\n\n /**\n * Create an ECR Repository\n */\n async create(\n logicalId: string,\n resourceType: string,\n properties: Record<string, unknown>\n ): Promise<ResourceCreateResult> {\n this.logger.debug(`Creating ECR Repository ${logicalId}`);\n\n const repositoryName =\n (properties['RepositoryName'] as string | undefined) ||\n generateResourceName(logicalId, { maxLength: 256 }).toLowerCase();\n\n try {\n // Convert CFn Tags format to SDK tags format\n const tags = properties['Tags'] as Tag[] | undefined;\n\n const response = await this.getClient().send(\n new CreateRepositoryCommand({\n repositoryName,\n ...(properties['ImageScanningConfiguration']\n ? {\n imageScanningConfiguration: properties[\n 'ImageScanningConfiguration'\n ] as ImageScanningConfiguration,\n }\n : {}),\n ...(properties['ImageTagMutability']\n ? {\n imageTagMutability: properties['ImageTagMutability'] as ImageTagMutability,\n }\n : {}),\n ...(properties['EncryptionConfiguration']\n ? {\n encryptionConfiguration: properties[\n 'EncryptionConfiguration'\n ] as EncryptionConfiguration,\n }\n : {}),\n ...(tags ? { tags } : {}),\n })\n );\n\n const repo = response.repository;\n if (!repo?.repositoryName) {\n throw new Error('CreateRepository did not return repository name');\n }\n\n const arn = repo.repositoryArn ?? '';\n const repositoryUri = repo.repositoryUri ?? '';\n\n // Apply lifecycle policy (separate API call)\n const lifecyclePolicy = properties['LifecyclePolicy'] as\n | { LifecyclePolicyText?: string }\n | undefined;\n if (lifecyclePolicy?.LifecyclePolicyText) {\n await this.getClient().send(\n new PutLifecyclePolicyCommand({\n repositoryName: repo.repositoryName,\n lifecyclePolicyText: lifecyclePolicy.LifecyclePolicyText,\n })\n );\n this.logger.debug(`Applied lifecycle policy to ${repo.repositoryName}`);\n }\n\n // Apply repository policy (separate API call)\n const repositoryPolicyText = properties['RepositoryPolicyText'];\n if (repositoryPolicyText) {\n const policyText =\n typeof repositoryPolicyText === 'string'\n ? repositoryPolicyText\n : JSON.stringify(repositoryPolicyText);\n await this.getClient().send(\n new SetRepositoryPolicyCommand({\n repositoryName: repo.repositoryName,\n policyText,\n })\n );\n this.logger.debug(`Applied repository policy to ${repo.repositoryName}`);\n }\n\n this.logger.debug(`Successfully created ECR Repository ${logicalId}: ${repo.repositoryName}`);\n\n return {\n physicalId: repo.repositoryName,\n attributes: {\n Arn: arn,\n RepositoryUri: repositoryUri,\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to create ECR Repository ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n repositoryName,\n cause\n );\n }\n }\n\n /**\n * Update an ECR Repository\n *\n * Mutable properties: ImageScanningConfiguration, ImageTagMutability,\n * LifecyclePolicy, RepositoryPolicyText, Tags.\n * Immutable: RepositoryName, EncryptionConfiguration (require replacement).\n */\n async update(\n logicalId: string,\n physicalId: string,\n _resourceType: string,\n properties: Record<string, unknown>,\n previousProperties: Record<string, unknown>\n ): Promise<ResourceUpdateResult> {\n this.logger.debug(`Updating ECR Repository ${logicalId} (${physicalId})`);\n\n try {\n // Update ImageScanningConfiguration if changed\n const newScanConfig = properties['ImageScanningConfiguration'] as\n | ImageScanningConfiguration\n | undefined;\n const oldScanConfig = previousProperties['ImageScanningConfiguration'] as\n | ImageScanningConfiguration\n | undefined;\n if (JSON.stringify(newScanConfig) !== JSON.stringify(oldScanConfig)) {\n await this.getClient().send(\n new PutImageScanningConfigurationCommand({\n repositoryName: physicalId,\n imageScanningConfiguration: newScanConfig ?? { scanOnPush: false },\n })\n );\n this.logger.debug(`Updated image scanning configuration for ${physicalId}`);\n }\n\n // Update ImageTagMutability if changed\n const newMutability = properties['ImageTagMutability'] as ImageTagMutability | undefined;\n const oldMutability = previousProperties['ImageTagMutability'] as\n | ImageTagMutability\n | undefined;\n if (newMutability !== oldMutability) {\n await this.getClient().send(\n new PutImageTagMutabilityCommand({\n repositoryName: physicalId,\n imageTagMutability: newMutability ?? 'MUTABLE',\n })\n );\n this.logger.debug(`Updated image tag mutability for ${physicalId}`);\n }\n\n // Update LifecyclePolicy if changed\n const newLifecycle = properties['LifecyclePolicy'] as\n | { LifecyclePolicyText?: string }\n | undefined;\n const oldLifecycle = previousProperties['LifecyclePolicy'] as\n | { LifecyclePolicyText?: string }\n | undefined;\n if (JSON.stringify(newLifecycle) !== JSON.stringify(oldLifecycle)) {\n if (newLifecycle?.LifecyclePolicyText) {\n await this.getClient().send(\n new PutLifecyclePolicyCommand({\n repositoryName: physicalId,\n lifecyclePolicyText: newLifecycle.LifecyclePolicyText,\n })\n );\n this.logger.debug(`Updated lifecycle policy for ${physicalId}`);\n }\n }\n\n // Update RepositoryPolicyText if changed\n const newPolicy = properties['RepositoryPolicyText'];\n const oldPolicy = previousProperties['RepositoryPolicyText'];\n if (JSON.stringify(newPolicy) !== JSON.stringify(oldPolicy) && newPolicy) {\n const policyText = typeof newPolicy === 'string' ? newPolicy : JSON.stringify(newPolicy);\n await this.getClient().send(\n new SetRepositoryPolicyCommand({\n repositoryName: physicalId,\n policyText,\n })\n );\n this.logger.debug(`Updated repository policy for ${physicalId}`);\n }\n\n // Update Tags if changed\n const newTags = properties['Tags'] as Tag[] | undefined;\n const oldTags = previousProperties['Tags'] as Tag[] | undefined;\n if (JSON.stringify(newTags) !== JSON.stringify(oldTags)) {\n // Get repository ARN for tagging\n const describeResponse = await this.getClient().send(\n new DescribeRepositoriesCommand({ repositoryNames: [physicalId] })\n );\n const repoArn = describeResponse.repositories?.[0]?.repositoryArn;\n if (repoArn && newTags) {\n await this.getClient().send(\n new TagResourceCommand({\n resourceArn: repoArn,\n tags: newTags,\n })\n );\n this.logger.debug(`Updated tags for ${physicalId}`);\n }\n }\n\n // Get current attributes\n const response = await this.getClient().send(\n new DescribeRepositoriesCommand({ repositoryNames: [physicalId] })\n );\n const repo = response.repositories?.[0];\n\n return {\n physicalId,\n wasReplaced: false,\n attributes: {\n Arn: repo?.repositoryArn ?? '',\n RepositoryUri: repo?.repositoryUri ?? '',\n },\n };\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to update ECR Repository ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n _resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n\n /**\n * Delete an ECR Repository\n *\n * Uses `force: true` to delete the repository even if it contains images.\n * This supports CDK's `emptyOnDelete: true` / `removalPolicy: DESTROY` pattern.\n */\n async delete(\n logicalId: string,\n physicalId: string,\n resourceType: string,\n _properties?: Record<string, unknown>\n ): Promise<void> {\n this.logger.debug(`Deleting ECR Repository ${logicalId}: ${physicalId}`);\n\n try {\n await this.getClient().send(\n new DeleteRepositoryCommand({\n repositoryName: physicalId,\n force: true,\n })\n );\n this.logger.debug(`Successfully deleted ECR Repository ${logicalId}`);\n } catch (error) {\n if (error instanceof RepositoryNotFoundException) {\n this.logger.debug(`ECR Repository ${physicalId} does not exist, skipping deletion`);\n return;\n }\n const cause = error instanceof Error ? error : undefined;\n throw new ProvisioningError(\n `Failed to delete ECR Repository ${logicalId}: ${error instanceof Error ? error.message : String(error)}`,\n resourceType,\n logicalId,\n physicalId,\n cause\n );\n }\n }\n}\n", "import { ProviderRegistry } from './provider-registry.js';\nimport { IAMRoleProvider } from './providers/iam-role-provider.js';\nimport { IAMPolicyProvider } from './providers/iam-policy-provider.js';\nimport { IAMInstanceProfileProvider } from './providers/iam-instance-profile-provider.js';\nimport { IAMUserGroupProvider } from './providers/iam-user-group-provider.js';\nimport { S3BucketProvider } from './providers/s3-bucket-provider.js';\nimport { S3BucketPolicyProvider } from './providers/s3-bucket-policy-provider.js';\nimport { SQSQueueProvider } from './providers/sqs-queue-provider.js';\nimport { SQSQueuePolicyProvider } from './providers/sqs-queue-policy-provider.js';\nimport { SNSTopicProvider } from './providers/sns-topic-provider.js';\nimport { SNSSubscriptionProvider } from './providers/sns-subscription-provider.js';\nimport { SNSTopicPolicyProvider } from './providers/sns-topic-policy-provider.js';\nimport { LambdaFunctionProvider } from './providers/lambda-function-provider.js';\nimport { LambdaPermissionProvider } from './providers/lambda-permission-provider.js';\nimport { LambdaUrlProvider } from './providers/lambda-url-provider.js';\nimport { LambdaEventSourceMappingProvider } from './providers/lambda-eventsource-provider.js';\nimport { LambdaLayerVersionProvider } from './providers/lambda-layer-provider.js';\nimport { DynamoDBTableProvider } from './providers/dynamodb-table-provider.js';\nimport { LogsLogGroupProvider } from './providers/logs-loggroup-provider.js';\nimport { CloudWatchAlarmProvider } from './providers/cloudwatch-alarm-provider.js';\nimport { SecretsManagerSecretProvider } from './providers/secretsmanager-secret-provider.js';\nimport { SSMParameterProvider } from './providers/ssm-parameter-provider.js';\nimport { EventBridgeRuleProvider } from './providers/eventbridge-rule-provider.js';\nimport { EventBridgeBusProvider } from './providers/eventbridge-bus-provider.js';\nimport { EC2Provider } from './providers/ec2-provider.js';\nimport { ApiGatewayProvider } from './providers/apigateway-provider.js';\nimport { ApiGatewayV2Provider } from './providers/apigatewayv2-provider.js';\nimport { CloudFrontOAIProvider } from './providers/cloudfront-oai-provider.js';\nimport { CloudFrontDistributionProvider } from './providers/cloudfront-distribution-provider.js';\nimport { AgentCoreRuntimeProvider } from './providers/agentcore-runtime-provider.js';\nimport { StepFunctionsProvider } from './providers/stepfunctions-provider.js';\nimport { ECSProvider } from './providers/ecs-provider.js';\nimport { ELBv2Provider } from './providers/elbv2-provider.js';\nimport { RDSProvider } from './providers/rds-provider.js';\nimport { Route53Provider } from './providers/route53-provider.js';\nimport { WAFv2WebACLProvider } from './providers/wafv2-provider.js';\nimport { CognitoUserPoolProvider } from './providers/cognito-provider.js';\nimport { ElastiCacheProvider } from './providers/elasticache-provider.js';\nimport { ServiceDiscoveryProvider } from './providers/servicediscovery-provider.js';\nimport { AppSyncProvider } from './providers/appsync-provider.js';\nimport { GlueProvider } from './providers/glue-provider.js';\nimport { KMSProvider } from './providers/kms-provider.js';\nimport { KinesisStreamProvider } from './providers/kinesis-provider.js';\nimport { EFSProvider } from './providers/efs-provider.js';\nimport { FirehoseProvider } from './providers/firehose-provider.js';\nimport { CloudTrailProvider } from './providers/cloudtrail-provider.js';\nimport { CodeBuildProvider } from './providers/codebuild-provider.js';\nimport { S3VectorsProvider } from './providers/s3-vectors-provider.js';\nimport { S3DirectoryBucketProvider } from './providers/s3-directory-bucket-provider.js';\nimport { S3TablesProvider } from './providers/s3-tables-provider.js';\nimport { ECRProvider } from './providers/ecr-provider.js';\n\n/**\n * Register all SDK providers with the given registry.\n * Called from both deploy and destroy commands.\n */\nexport function registerAllProviders(registry: ProviderRegistry): void {\n // IAM\n registry.register('AWS::IAM::Role', new IAMRoleProvider());\n registry.register('AWS::IAM::Policy', new IAMPolicyProvider());\n registry.register('AWS::IAM::InstanceProfile', new IAMInstanceProfileProvider());\n const iamUserGroupProvider = new IAMUserGroupProvider();\n registry.register('AWS::IAM::User', iamUserGroupProvider);\n registry.register('AWS::IAM::Group', iamUserGroupProvider);\n registry.register('AWS::IAM::UserToGroupAddition', iamUserGroupProvider);\n\n // S3\n registry.register('AWS::S3::Bucket', new S3BucketProvider());\n registry.register('AWS::S3::BucketPolicy', new S3BucketPolicyProvider());\n registry.register('AWS::S3Express::DirectoryBucket', new S3DirectoryBucketProvider());\n\n // SQS\n registry.register('AWS::SQS::Queue', new SQSQueueProvider());\n registry.register('AWS::SQS::QueuePolicy', new SQSQueuePolicyProvider());\n\n // SNS\n registry.register('AWS::SNS::Topic', new SNSTopicProvider());\n registry.register('AWS::SNS::Subscription', new SNSSubscriptionProvider());\n registry.register('AWS::SNS::TopicPolicy', new SNSTopicPolicyProvider());\n\n // Lambda\n registry.register('AWS::Lambda::Function', new LambdaFunctionProvider());\n registry.register('AWS::Lambda::Permission', new LambdaPermissionProvider());\n registry.register('AWS::Lambda::Url', new LambdaUrlProvider());\n registry.register('AWS::Lambda::EventSourceMapping', new LambdaEventSourceMappingProvider());\n registry.register('AWS::Lambda::LayerVersion', new LambdaLayerVersionProvider());\n\n // DynamoDB\n registry.register('AWS::DynamoDB::Table', new DynamoDBTableProvider());\n\n // Monitoring\n registry.register('AWS::Logs::LogGroup', new LogsLogGroupProvider());\n registry.register('AWS::CloudWatch::Alarm', new CloudWatchAlarmProvider());\n\n // Secrets / Config\n registry.register('AWS::SecretsManager::Secret', new SecretsManagerSecretProvider());\n registry.register('AWS::SSM::Parameter', new SSMParameterProvider());\n\n // EventBridge\n registry.register('AWS::Events::Rule', new EventBridgeRuleProvider());\n registry.register('AWS::Events::EventBus', new EventBridgeBusProvider());\n\n // EC2 / Networking\n const ec2Provider = new EC2Provider();\n registry.register('AWS::EC2::VPC', ec2Provider);\n registry.register('AWS::EC2::Subnet', ec2Provider);\n registry.register('AWS::EC2::InternetGateway', ec2Provider);\n registry.register('AWS::EC2::VPCGatewayAttachment', ec2Provider);\n registry.register('AWS::EC2::RouteTable', ec2Provider);\n registry.register('AWS::EC2::Route', ec2Provider);\n registry.register('AWS::EC2::SubnetRouteTableAssociation', ec2Provider);\n registry.register('AWS::EC2::SecurityGroup', ec2Provider);\n registry.register('AWS::EC2::SecurityGroupIngress', ec2Provider);\n registry.register('AWS::EC2::Instance', ec2Provider);\n registry.register('AWS::EC2::NetworkAcl', ec2Provider);\n registry.register('AWS::EC2::NetworkAclEntry', ec2Provider);\n registry.register('AWS::EC2::SubnetNetworkAclAssociation', ec2Provider);\n\n // API Gateway\n const apigwProvider = new ApiGatewayProvider();\n registry.register('AWS::ApiGateway::Account', apigwProvider);\n registry.register('AWS::ApiGateway::Authorizer', apigwProvider);\n registry.register('AWS::ApiGateway::Resource', apigwProvider);\n registry.register('AWS::ApiGateway::Deployment', apigwProvider);\n registry.register('AWS::ApiGateway::Stage', apigwProvider);\n registry.register('AWS::ApiGateway::Method', apigwProvider);\n\n // API Gateway V2 (HTTP API)\n const apigwV2Provider = new ApiGatewayV2Provider();\n registry.register('AWS::ApiGatewayV2::Api', apigwV2Provider);\n registry.register('AWS::ApiGatewayV2::Stage', apigwV2Provider);\n registry.register('AWS::ApiGatewayV2::Integration', apigwV2Provider);\n registry.register('AWS::ApiGatewayV2::Route', apigwV2Provider);\n registry.register('AWS::ApiGatewayV2::Authorizer', apigwV2Provider);\n\n // CloudFront\n registry.register('AWS::CloudFront::CloudFrontOriginAccessIdentity', new CloudFrontOAIProvider());\n registry.register('AWS::CloudFront::Distribution', new CloudFrontDistributionProvider());\n\n // StepFunctions\n registry.register('AWS::StepFunctions::StateMachine', new StepFunctionsProvider());\n\n // ECS\n const ecsProvider = new ECSProvider();\n registry.register('AWS::ECS::Cluster', ecsProvider);\n registry.register('AWS::ECS::TaskDefinition', ecsProvider);\n registry.register('AWS::ECS::Service', ecsProvider);\n\n // ELBv2\n const elbv2Provider = new ELBv2Provider();\n registry.register('AWS::ElasticLoadBalancingV2::LoadBalancer', elbv2Provider);\n registry.register('AWS::ElasticLoadBalancingV2::TargetGroup', elbv2Provider);\n registry.register('AWS::ElasticLoadBalancingV2::Listener', elbv2Provider);\n\n // RDS\n const rdsProvider = new RDSProvider();\n registry.register('AWS::RDS::DBSubnetGroup', rdsProvider);\n registry.register('AWS::RDS::DBCluster', rdsProvider);\n registry.register('AWS::RDS::DBInstance', rdsProvider);\n\n // Route53\n const route53Provider = new Route53Provider();\n registry.register('AWS::Route53::HostedZone', route53Provider);\n registry.register('AWS::Route53::RecordSet', route53Provider);\n\n // WAFv2\n registry.register('AWS::WAFv2::WebACL', new WAFv2WebACLProvider());\n\n // Cognito\n registry.register('AWS::Cognito::UserPool', new CognitoUserPoolProvider());\n\n // ElastiCache\n const elasticacheProvider = new ElastiCacheProvider();\n registry.register('AWS::ElastiCache::SubnetGroup', elasticacheProvider);\n registry.register('AWS::ElastiCache::CacheCluster', elasticacheProvider);\n\n // Service Discovery\n const serviceDiscoveryProvider = new ServiceDiscoveryProvider();\n registry.register('AWS::ServiceDiscovery::PrivateDnsNamespace', serviceDiscoveryProvider);\n registry.register('AWS::ServiceDiscovery::Service', serviceDiscoveryProvider);\n\n // Bedrock\n registry.register('AWS::BedrockAgentCore::Runtime', new AgentCoreRuntimeProvider());\n\n // AppSync\n const appSyncProvider = new AppSyncProvider();\n registry.register('AWS::AppSync::GraphQLApi', appSyncProvider);\n registry.register('AWS::AppSync::GraphQLSchema', appSyncProvider);\n registry.register('AWS::AppSync::DataSource', appSyncProvider);\n registry.register('AWS::AppSync::Resolver', appSyncProvider);\n registry.register('AWS::AppSync::ApiKey', appSyncProvider);\n\n // Glue\n const glueProvider = new GlueProvider();\n registry.register('AWS::Glue::Database', glueProvider);\n registry.register('AWS::Glue::Table', glueProvider);\n\n // KMS\n const kmsProvider = new KMSProvider();\n registry.register('AWS::KMS::Key', kmsProvider);\n registry.register('AWS::KMS::Alias', kmsProvider);\n\n // Kinesis\n registry.register('AWS::Kinesis::Stream', new KinesisStreamProvider());\n\n // EFS\n const efsProvider = new EFSProvider();\n registry.register('AWS::EFS::FileSystem', efsProvider);\n registry.register('AWS::EFS::MountTarget', efsProvider);\n registry.register('AWS::EFS::AccessPoint', efsProvider);\n\n // Firehose\n registry.register('AWS::KinesisFirehose::DeliveryStream', new FirehoseProvider());\n\n // CloudTrail\n registry.register('AWS::CloudTrail::Trail', new CloudTrailProvider());\n\n // CodeBuild\n registry.register('AWS::CodeBuild::Project', new CodeBuildProvider());\n\n // S3 Vectors\n registry.register('AWS::S3Vectors::VectorBucket', new S3VectorsProvider());\n\n // ECR\n registry.register('AWS::ECR::Repository', new ECRProvider());\n\n // S3 Tables\n const s3TablesProvider = new S3TablesProvider();\n registry.register('AWS::S3Tables::TableBucket', s3TablesProvider);\n registry.register('AWS::S3Tables::Namespace', s3TablesProvider);\n registry.register('AWS::S3Tables::Table', s3TablesProvider);\n}\n", "import pLimit from 'p-limit';\nimport { getLogger } from '../utils/logger.js';\nimport { ProvisioningError } from '../utils/error-handler.js';\nimport { setCurrentStackName, applyDefaultNameForFallback } from '../provisioning/resource-name.js';\nimport { IntrinsicFunctionResolver } from './intrinsic-function-resolver.js';\nimport type { CloudFormationTemplate, ResourceProvider } from '../types/resource.js';\nimport type { StackState, ResourceState, ResourceChange } from '../types/state.js';\nimport type { S3StateBackend } from '../state/s3-state-backend.js';\nimport type { LockManager } from '../state/lock-manager.js';\nimport type { DagBuilder } from '../analyzer/dag-builder.js';\nimport type { DiffCalculator } from '../analyzer/diff-calculator.js';\nimport { ProviderRegistry } from '../provisioning/provider-registry.js';\nimport { CloudControlProvider } from '../provisioning/cloud-control-provider.js';\nimport { TemplateParser } from '../analyzer/template-parser.js';\n\n/**\n * Completed operation record for rollback tracking\n */\ninterface CompletedOperation {\n /** Logical ID of the resource */\n logicalId: string;\n /** Type of change that was applied */\n changeType: 'CREATE' | 'UPDATE' | 'DELETE';\n /** Resource type (e.g., \"AWS::S3::Bucket\") */\n resourceType: string;\n /** Previous resource state (for UPDATE rollback) */\n previousState?: ResourceState | undefined;\n /** Physical ID of newly created resource (for CREATE rollback) */\n physicalId?: string | undefined;\n /** Properties used for creation (for CREATE rollback / delete) */\n properties?: Record<string, unknown> | undefined;\n}\n\n/**\n * Deploy engine options\n */\nexport interface DeployEngineOptions {\n /** Maximum concurrent resource operations */\n concurrency?: number;\n /** Dry run mode (plan only, no actual changes) */\n dryRun?: boolean;\n /** Lock timeout in milliseconds */\n lockTimeout?: number;\n /** User-provided parameter values */\n parameters?: Record<string, string>;\n /** Skip rollback on failure (save partial state and fail) */\n noRollback?: boolean;\n}\n\n/**\n * Deploy result\n */\nexport interface DeployResult {\n /** Stack name */\n stackName: string;\n /** Number of resources created */\n created: number;\n /** Number of resources updated */\n updated: number;\n /** Number of resources deleted */\n deleted: number;\n /** Number of resources unchanged */\n unchanged: number;\n /** Total deployment time in milliseconds */\n durationMs: number;\n}\n\n/**\n * Deploy engine orchestrates the entire deployment process\n *\n * Responsibilities:\n * 1. Acquire stack lock\n * 2. Load current state\n * 3. Calculate diff\n * 4. Validate resource types\n * 5. Execute deployment in DAG order\n * 6. Save new state\n * 7. Release lock\n *\n * Rollback mechanism:\n * - Tracks completed operations during deployment\n * - On failure, rolls back in reverse order (best-effort)\n * - Supports --no-rollback flag to skip rollback (saves partial state and fails)\n * - CREATE \u2192 delete the newly created resource\n * - UPDATE \u2192 restore previous properties\n * - DELETE \u2192 cannot rollback (log warning)\n */\n/**\n * Error thrown when deployment is interrupted by SIGINT\n */\nclass InterruptedError extends Error {\n constructor() {\n super('Deployment interrupted by user (Ctrl+C)');\n this.name = 'InterruptedError';\n }\n}\n\nexport class DeployEngine {\n private logger = getLogger().child('DeployEngine');\n private resolver: IntrinsicFunctionResolver;\n private interrupted = false;\n\n /** Target region for this stack (saved in state for cross-region destroy) */\n private stackRegion: string | undefined;\n\n constructor(\n private stateBackend: S3StateBackend,\n private lockManager: LockManager,\n private dagBuilder: DagBuilder,\n private diffCalculator: DiffCalculator,\n private providerRegistry: ProviderRegistry,\n private options: DeployEngineOptions = {},\n stackRegion?: string\n ) {\n this.stackRegion = stackRegion;\n this.resolver = new IntrinsicFunctionResolver(stackRegion);\n this.options.concurrency = options.concurrency ?? 10;\n this.options.dryRun = options.dryRun ?? false;\n this.options.lockTimeout = options.lockTimeout ?? 5 * 60 * 1000; // 5 minutes\n this.options.noRollback = options.noRollback ?? false;\n }\n\n /**\n * Deploy a CloudFormation template\n */\n async deploy(stackName: string, template: CloudFormationTemplate): Promise<DeployResult> {\n const startTime = Date.now();\n this.logger.debug(`Starting deployment for stack: ${stackName}`);\n\n // Set stack name for resource name generation (CloudFormation-compatible naming)\n setCurrentStackName(stackName);\n\n // Acquire lock with retry (retries up to 3 times with 2s delay for transient lock conflicts)\n await this.lockManager.acquireLockWithRetry(stackName, undefined, 'deploy');\n\n // Register SIGINT handler to save partial state on Ctrl+C\n this.interrupted = false;\n const sigintHandler = () => {\n process.stderr.write(\n '\\nInterrupted \u2014 saving partial state after current operations complete...\\n'\n );\n this.interrupted = true;\n };\n process.on('SIGINT', sigintHandler);\n\n try {\n // 1. Load current state\n const currentStateData = await this.stateBackend.getState(stackName);\n const currentState: StackState = currentStateData?.state ?? {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName,\n resources: {},\n outputs: {},\n lastModified: Date.now(),\n };\n const currentEtag = currentStateData?.etag;\n\n this.logger.debug(\n `Loaded current state: ${Object.keys(currentState.resources).length} resources`\n );\n\n // 2. Template parsing is handled by DagBuilder (dependency analysis) and\n // IntrinsicResolver (intrinsic function resolution) in later steps\n this.logger.debug(`Template has ${Object.keys(template.Resources || {}).length} resources`);\n\n // 2.5. Resolve parameters from template and user input\n const parameterValues = await this.resolver.resolveParameters(\n template,\n this.options.parameters\n );\n this.logger.debug(\n `Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(', ')}`\n );\n\n // 2.6. Evaluate conditions from template\n const context = {\n template,\n resources: currentState.resources,\n ...(Object.keys(parameterValues).length > 0 && { parameters: parameterValues }),\n stateBackend: this.stateBackend,\n stackName,\n };\n const conditions = await this.resolver.evaluateConditions(context);\n this.logger.debug(\n `Evaluated ${Object.keys(conditions).length} conditions: ${Object.keys(conditions).join(', ')}`\n );\n\n // 3. Validate resource types (before deployment starts)\n // Skip metadata resources as they don't actually deploy\n const resourceTypes = new Set(\n Object.values(template.Resources || {})\n .map((r) => r.Type)\n .filter((type) => type !== 'AWS::CDK::Metadata')\n );\n this.providerRegistry.validateResourceTypes(resourceTypes);\n this.logger.debug(`All resource types validated`);\n\n // 4. Build dependency graph\n const dag = this.dagBuilder.buildGraph(template);\n const executionLevels = this.dagBuilder.getExecutionLevels(dag);\n this.logger.debug(`Dependency graph: ${executionLevels.length} execution levels`);\n\n // 5. Calculate diff\n // Pass a best-effort resolver so that changes hidden inside intrinsics (e.g.\n // `Fn::Join` literal args like \"-value\" -> \"-value2\") are detected against\n // the already-resolved values stored in state.\n const diffResolverContext = {\n template,\n resources: currentState.resources,\n ...(Object.keys(parameterValues).length > 0 && { parameters: parameterValues }),\n ...(Object.keys(conditions).length > 0 && { conditions }),\n stateBackend: this.stateBackend,\n stackName,\n };\n const diffResolveFn = (value: unknown) => this.resolver.resolve(value, diffResolverContext);\n const changes = await this.diffCalculator.calculateDiff(\n currentState,\n template,\n diffResolveFn\n );\n const hasChanges = this.diffCalculator.hasChanges(changes);\n\n if (!hasChanges) {\n this.logger.info('No changes detected. Stack is up to date.');\n return {\n stackName,\n created: 0,\n updated: 0,\n deleted: 0,\n unchanged: Object.keys(currentState.resources).length,\n durationMs: Date.now() - startTime,\n };\n }\n\n // Log changes summary\n const createChanges = this.diffCalculator.filterByType(changes, 'CREATE');\n const updateChanges = this.diffCalculator.filterByType(changes, 'UPDATE');\n const deleteChanges = this.diffCalculator.filterByType(changes, 'DELETE');\n\n this.logger.info(\n `Changes: ${createChanges.length} to create, ${updateChanges.length} to update, ${deleteChanges.length} to delete`\n );\n\n if (this.options.dryRun) {\n this.logger.info('Dry run mode - skipping actual deployment');\n return {\n stackName,\n created: createChanges.length,\n updated: updateChanges.length,\n deleted: deleteChanges.length,\n unchanged: this.diffCalculator.filterByType(changes, 'NO_CHANGE').length,\n durationMs: Date.now() - startTime,\n };\n }\n\n // Progress counter for tracking overall deployment progress\n const totalOperations = createChanges.length + updateChanges.length + deleteChanges.length;\n const progress = { current: 0, total: totalOperations };\n\n // 6. Execute deployment (with partial state saves after each level)\n const { state: newState, actualCounts } = await this.executeDeployment(\n template,\n currentState,\n changes,\n executionLevels,\n stackName,\n parameterValues,\n conditions,\n currentEtag,\n progress\n );\n\n // 7. Save final state (ETag may have been updated by partial saves)\n const newEtag = await this.stateBackend.saveState(stackName, newState);\n this.logger.debug(`State saved (ETag: ${newEtag})`);\n\n const durationMs = Date.now() - startTime;\n const unchangedCount =\n this.diffCalculator.filterByType(changes, 'NO_CHANGE').length + actualCounts.skipped;\n\n return {\n stackName,\n created: actualCounts.created,\n updated: actualCounts.updated,\n deleted: actualCounts.deleted,\n unchanged: unchangedCount,\n durationMs,\n };\n } finally {\n // Remove SIGINT handler\n process.removeListener('SIGINT', sigintHandler);\n\n // Always release lock\n try {\n await this.lockManager.releaseLock(stackName);\n this.logger.debug('Lock released');\n } catch (lockError) {\n this.logger.warn(\n `Failed to release lock: ${lockError instanceof Error ? lockError.message : String(lockError)}`\n );\n }\n }\n }\n\n /**\n * Execute deployment by processing resources in DAG order\n *\n * Important: DELETE operations are executed in reverse dependency order,\n * while CREATE/UPDATE follow normal dependency order.\n */\n private async executeDeployment(\n template: CloudFormationTemplate,\n currentState: StackState,\n changes: Map<string, ResourceChange>,\n executionLevels: string[][],\n stackName: string,\n parameterValues?: Record<string, unknown>,\n conditions?: Record<string, boolean>,\n currentEtag?: string,\n progress?: { current: number; total: number }\n ): Promise<{\n state: StackState;\n actualCounts: { created: number; updated: number; deleted: number; skipped: number };\n }> {\n const limit = pLimit(this.options.concurrency!);\n const newResources: Record<string, ResourceState> = { ...currentState.resources };\n const actualCounts = { created: 0, updated: 0, deleted: 0, skipped: 0 };\n const completedOperations: CompletedOperation[] = [];\n\n // Serialize per-resource state saves to avoid ETag conflicts from concurrent writes\n let saveChain: Promise<void> = Promise.resolve();\n const saveStateAfterResource = (logicalId: string): void => {\n if (currentEtag === undefined) return;\n saveChain = saveChain.then(async () => {\n try {\n const partialState: StackState = {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName: currentState.stackName,\n resources: newResources,\n outputs: currentState.outputs,\n lastModified: Date.now(),\n };\n currentEtag = await this.stateBackend.saveState(stackName, partialState, currentEtag);\n this.logger.debug(`State saved after ${logicalId}`);\n } catch (error) {\n this.logger.warn(\n `Failed to save state after ${logicalId}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n });\n };\n\n // Separate DELETE operations from CREATE/UPDATE\n const deleteChanges = new Set(\n Array.from(changes.entries())\n .filter(([_, change]) => change.changeType === 'DELETE')\n .map(([logicalId]) => logicalId)\n );\n\n try {\n // Step 1: Process CREATE/UPDATE in normal DAG order\n for (let levelIndex = 0; levelIndex < executionLevels.length; levelIndex++) {\n // Check for SIGINT before starting next level\n if (this.interrupted) {\n throw new InterruptedError();\n }\n\n const levelNodes = executionLevels[levelIndex];\n if (!levelNodes) continue;\n // Exclude DELETE (handled in Step 2), NO_CHANGE, and nodes without a change\n // entry (e.g. AWS::CDK::Metadata) so the level count reflects real work.\n const level = levelNodes.filter((id) => {\n if (deleteChanges.has(id)) return false;\n const change = changes.get(id);\n return !!change && change.changeType !== 'NO_CHANGE';\n });\n\n if (level.length === 0) continue;\n\n this.logger.info(\n `Level ${levelIndex + 1}/${executionLevels.length} (${level.length} resources)`\n );\n\n // Use allSettled to ensure ALL parallel tasks complete before checking errors.\n // Promise.all rejects immediately on first failure, leaving background tasks\n // that create resources without tracking them in completedOperations.\n const results = await Promise.allSettled(\n level.map((logicalId) =>\n limit(async () => {\n const change = changes.get(logicalId);\n if (!change || change.changeType === 'NO_CHANGE') {\n this.logger.debug(`Skipping ${logicalId} (no change)`);\n return;\n }\n\n // Capture previous state before provisioning (for rollback)\n const previousState = currentState.resources[logicalId]\n ? { ...currentState.resources[logicalId] }\n : undefined;\n\n try {\n await this.provisionResource(\n logicalId,\n change,\n newResources,\n stackName,\n template,\n parameterValues,\n conditions,\n actualCounts,\n progress\n );\n } catch (provisionError) {\n // Signal interruption so that long-running operations (e.g., CloudFront\n // waitForDeployed) in sibling tasks abort promptly instead of blocking\n // the entire level until they time out.\n this.interrupted = true;\n throw provisionError;\n }\n\n // Track completed operation for potential rollback\n completedOperations.push({\n logicalId,\n changeType: change.changeType as 'CREATE' | 'UPDATE',\n resourceType: change.resourceType,\n previousState,\n physicalId: newResources[logicalId]?.physicalId,\n properties: newResources[logicalId]?.properties,\n });\n\n // Save state immediately after each successful resource provision\n saveStateAfterResource(logicalId);\n })\n )\n );\n\n // Wait for any pending per-resource state saves to complete before next level\n await saveChain;\n\n // Check for failures after ALL tasks in the level have completed\n const failures = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected');\n if (failures.length > 0) {\n // Throw the first failure to trigger rollback (all completed ops are tracked)\n throw failures[0]!.reason;\n }\n }\n\n // Step 2: Process DELETE operations in reverse dependency order\n if (deleteChanges.size > 0) {\n this.logger.info(`Deleting ${deleteChanges.size} resource(s)`);\n\n // Build deletion levels from state dependencies (reverse topological order)\n const deletionLevels = this.buildDeletionLevels(deleteChanges, currentState);\n\n for (let levelIndex = 0; levelIndex < deletionLevels.length; levelIndex++) {\n // Check for SIGINT before starting next deletion level\n if (this.interrupted) {\n throw new InterruptedError();\n }\n\n const level = deletionLevels[levelIndex]!;\n if (level.length === 0) continue;\n\n const deleteResults = await Promise.allSettled(\n level.map((logicalId) =>\n limit(async () => {\n const change = changes.get(logicalId)!;\n\n const previousState = currentState.resources[logicalId]\n ? { ...currentState.resources[logicalId] }\n : undefined;\n\n await this.provisionResource(\n logicalId,\n change,\n newResources,\n stackName,\n template,\n parameterValues,\n conditions,\n actualCounts,\n progress\n );\n\n completedOperations.push({\n logicalId,\n changeType: 'DELETE',\n resourceType: change.resourceType,\n previousState,\n });\n\n // Save state immediately after each successful resource deletion\n saveStateAfterResource(logicalId);\n })\n )\n );\n\n // Wait for any pending per-resource state saves to complete before next deletion level\n await saveChain;\n\n const deleteFailures = deleteResults.filter(\n (r): r is PromiseRejectedResult => r.status === 'rejected'\n );\n if (deleteFailures.length > 0) {\n throw deleteFailures[0]!.reason;\n }\n }\n }\n } catch (error) {\n // Save partial state BEFORE rollback to track all successfully provisioned\n // resources (including those in the failed level). This prevents orphaned\n // resources \u2014 resources that exist in AWS but not in the state file.\n try {\n const preRollbackState: StackState = {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName: currentState.stackName,\n resources: newResources,\n outputs: currentState.outputs,\n lastModified: Date.now(),\n };\n currentEtag = await this.stateBackend.saveState(stackName, preRollbackState, currentEtag);\n this.logger.debug('Partial state saved before rollback (orphaned resource tracking)');\n } catch (saveError) {\n this.logger.warn(\n `Failed to save partial state before rollback: ${saveError instanceof Error ? saveError.message : String(saveError)}`\n );\n }\n\n // On SIGINT, skip rollback \u2014 just save partial state and let the caller exit\n if (error instanceof InterruptedError) {\n this.logger.info(\n `Partial state saved (${Object.keys(newResources).length} resources). ` +\n 'Run deploy again to resume, or destroy to clean up.'\n );\n throw error;\n }\n\n // Deployment failed \u2014 attempt rollback unless --no-rollback is set\n if (this.options.noRollback) {\n this.logger.warn('Deployment failed. --no-rollback is set, skipping rollback.');\n this.logger.warn('Partial state has been saved. Manual cleanup may be required.');\n } else {\n await this.performRollback(completedOperations, newResources, stackName);\n }\n\n // Save state after rollback (reflects rolled-back resource state).\n // This is critical: if rollback deleted resources, the state must reflect\n // that. Otherwise, next deploy will think deleted resources still exist.\n try {\n const postRollbackState: StackState = {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName: currentState.stackName,\n resources: newResources,\n outputs: currentState.outputs,\n lastModified: Date.now(),\n };\n await this.stateBackend.saveState(stackName, postRollbackState, currentEtag);\n this.logger.debug('State saved after deployment failure');\n } catch (saveError) {\n // ETag mismatch from per-resource saves \u2014 force overwrite with fresh ETag\n this.logger.debug(\n `Retrying state save after rollback (ETag mismatch): ${saveError instanceof Error ? saveError.message : String(saveError)}`\n );\n try {\n const freshState = await this.stateBackend.getState(stackName);\n const freshEtag = freshState?.etag;\n const postRollbackState: StackState = {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName: currentState.stackName,\n resources: newResources,\n outputs: currentState.outputs,\n lastModified: Date.now(),\n };\n await this.stateBackend.saveState(stackName, postRollbackState, freshEtag);\n this.logger.debug('State saved after deployment failure (retry succeeded)');\n } catch (retryError) {\n this.logger.warn(\n `Failed to save state after rollback: ${retryError instanceof Error ? retryError.message : String(retryError)}`\n );\n }\n }\n\n throw error;\n }\n\n // Resolve outputs\n const outputs = await this.resolveOutputs(\n template,\n newResources,\n stackName,\n parameterValues,\n conditions\n );\n\n return {\n state: {\n version: 1,\n ...(this.stackRegion && { region: this.stackRegion }),\n stackName: currentState.stackName,\n resources: newResources,\n outputs,\n lastModified: Date.now(),\n },\n actualCounts,\n };\n }\n\n /**\n * Perform best-effort rollback of completed operations respecting dependencies\n *\n * - CREATE \u2192 delete the newly created resource (in reverse dependency order)\n * - UPDATE \u2192 update back to previous properties\n * - DELETE \u2192 cannot rollback (resource already deleted), log warning\n *\n * Resources created in the same DAG level may have dependencies between them\n * (e.g., IAM Policy depends on IAM Role). When rolling back CREATEs (deleting),\n * dependent resources must be deleted before their dependencies. This method\n * sorts CREATE rollback operations using dependency information from state,\n * then processes UPDATE/DELETE rollbacks, and finally processes sorted CREATE\n * rollback deletions.\n */\n private async performRollback(\n completedOperations: CompletedOperation[],\n stateResources: Record<string, ResourceState>,\n _stackName: string\n ): Promise<void> {\n if (completedOperations.length === 0) {\n this.logger.info('No completed operations to roll back.');\n return;\n }\n\n this.logger.info(`Rolling back ${completedOperations.length} completed operation(s)...`);\n\n // Separate CREATE operations (which need dependency-aware ordering) from others\n const createOps: CompletedOperation[] = [];\n const otherOps: CompletedOperation[] = [];\n\n for (const op of completedOperations) {\n if (op.changeType === 'CREATE') {\n createOps.push(op);\n } else {\n otherOps.push(op);\n }\n }\n\n // Step 1: Process UPDATE/DELETE rollbacks in reverse order (simple reversal is fine)\n for (let i = otherOps.length - 1; i >= 0; i--) {\n const op = otherOps[i]!;\n await this.performSingleRollback(op, stateResources);\n }\n\n // Step 2: Process CREATE rollbacks (deletions) in dependency-aware order\n // Build deletion levels so dependents are deleted before their dependencies\n if (createOps.length > 0) {\n const sortedCreateOps = this.sortRollbackCreates(createOps, stateResources);\n for (const op of sortedCreateOps) {\n await this.performSingleRollback(op, stateResources);\n }\n }\n\n this.logger.info('Rollback completed. Some resources may remain if deletion failed.');\n }\n\n /**\n * Sort CREATE rollback operations so that resources depending on others\n * are deleted first (reverse dependency order).\n *\n * Uses state dependencies to build deletion levels, similar to buildDeletionLevels.\n */\n private sortRollbackCreates(\n createOps: CompletedOperation[],\n stateResources: Record<string, ResourceState>\n ): CompletedOperation[] {\n const opMap = new Map<string, CompletedOperation>();\n const deleteIds = new Set<string>();\n for (const op of createOps) {\n opMap.set(op.logicalId, op);\n deleteIds.add(op.logicalId);\n }\n\n // Build reverse dependency map: resource \u2192 resources that depend on it\n const dependedBy = new Map<string, Set<string>>();\n for (const id of deleteIds) {\n if (!dependedBy.has(id)) dependedBy.set(id, new Set());\n }\n\n for (const id of deleteIds) {\n const resource = stateResources[id];\n if (!resource?.dependencies) continue;\n for (const dep of resource.dependencies) {\n if (!deleteIds.has(dep)) continue;\n // id depends on dep \u2192 dep must be deleted AFTER id\n if (!dependedBy.has(dep)) dependedBy.set(dep, new Set());\n dependedBy.get(dep)!.add(id);\n }\n }\n\n // Topological sort (Kahn's algorithm) \u2014 produces levels for parallel delete\n const sorted: CompletedOperation[] = [];\n let remaining = new Set(deleteIds);\n\n while (remaining.size > 0) {\n // Find resources with no remaining dependents (safe to delete now)\n const level: string[] = [];\n for (const id of remaining) {\n const dependents = dependedBy.get(id);\n const hasPendingDependents = dependents\n ? [...dependents].some((d) => remaining.has(d))\n : false;\n if (!hasPendingDependents) {\n level.push(id);\n }\n }\n\n if (level.length === 0) {\n // Circular dependency fallback: add all remaining\n this.logger.warn(\n `Circular dependency detected in rollback order, processing remaining ${remaining.size} resources`\n );\n for (const id of remaining) {\n const op = opMap.get(id);\n if (op) sorted.push(op);\n }\n break;\n }\n\n for (const id of level) {\n const op = opMap.get(id);\n if (op) sorted.push(op);\n }\n remaining = new Set([...remaining].filter((id) => !level.includes(id)));\n }\n\n this.logger.debug(\n `Rollback CREATE deletion order: ${sorted.map((op) => op.logicalId).join(' \u2192 ')}`\n );\n return sorted;\n }\n\n /**\n * Perform a single rollback operation (extracted for reuse)\n */\n private async performSingleRollback(\n op: CompletedOperation,\n stateResources: Record<string, ResourceState>\n ): Promise<void> {\n try {\n switch (op.changeType) {\n case 'CREATE': {\n // Rollback CREATE by deleting the newly created resource\n if (!op.physicalId) {\n this.logger.warn(` Rollback: Cannot delete ${op.logicalId} \u2014 no physical ID recorded`);\n break;\n }\n\n this.logger.info(\n ` Rollback: Deleting created resource ${op.logicalId} (${op.resourceType})`\n );\n const provider = this.providerRegistry.getProvider(op.resourceType);\n await provider.delete(op.logicalId, op.physicalId, op.resourceType, op.properties);\n\n // Remove from state\n delete stateResources[op.logicalId];\n this.logger.info(` Rollback: ${op.logicalId} deleted successfully`);\n break;\n }\n\n case 'UPDATE': {\n // Rollback UPDATE by restoring previous properties\n if (!op.previousState) {\n this.logger.warn(\n ` Rollback: Cannot restore ${op.logicalId} \u2014 no previous state available`\n );\n break;\n }\n\n this.logger.info(\n ` Rollback: Restoring ${op.logicalId} (${op.resourceType}) to previous state`\n );\n const provider = this.providerRegistry.getProvider(op.resourceType);\n const currentResource = stateResources[op.logicalId];\n\n if (!currentResource) {\n this.logger.warn(\n ` Rollback: Cannot restore ${op.logicalId} \u2014 resource not found in current state`\n );\n break;\n }\n\n await provider.update(\n op.logicalId,\n currentResource.physicalId,\n op.resourceType,\n op.previousState.properties,\n currentResource.properties\n );\n\n // Restore previous state\n stateResources[op.logicalId] = op.previousState;\n this.logger.info(` Rollback: ${op.logicalId} restored successfully`);\n break;\n }\n\n case 'DELETE': {\n // Cannot rollback DELETE \u2014 resource is already deleted\n this.logger.warn(\n ` Rollback: Cannot restore deleted resource ${op.logicalId} (${op.resourceType}) \u2014 resource has already been deleted`\n );\n break;\n }\n }\n } catch (rollbackError) {\n // Best-effort: log warning and continue with remaining rollbacks\n this.logger.warn(\n ` Rollback failed for ${op.logicalId} (${op.changeType}): ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`\n );\n this.logger.warn(' Continuing with remaining rollback operations...');\n }\n }\n\n /**\n * Provision a single resource (CREATE/UPDATE/DELETE)\n */\n private async provisionResource(\n logicalId: string,\n change: ResourceChange,\n stateResources: Record<string, ResourceState>,\n stackName: string,\n template?: CloudFormationTemplate,\n parameterValues?: Record<string, unknown>,\n conditions?: Record<string, boolean>,\n counts?: { created: number; updated: number; deleted: number; skipped: number },\n progress?: { current: number; total: number }\n ): Promise<void> {\n const resourceType = change.resourceType;\n const provider = this.providerRegistry.getProvider(resourceType);\n\n try {\n switch (change.changeType) {\n case 'CREATE': {\n const desiredProps = change.desiredProperties || {};\n\n // Resolve intrinsic functions in properties\n const context = {\n template: template!,\n resources: stateResources,\n ...(parameterValues &&\n Object.keys(parameterValues).length > 0 && { parameters: parameterValues }),\n ...(conditions && Object.keys(conditions).length > 0 && { conditions }),\n stateBackend: this.stateBackend,\n stackName,\n };\n\n const resolvedProps = (await this.resolver.resolve(desiredProps, context)) as Record<\n string,\n unknown\n >;\n\n // Safety net: if SDK provider doesn't handle all template properties,\n // fall back to CC API for create to ensure no properties are silently dropped\n const { provider: createProvider, properties: createProps } =\n this.selectProviderWithSafetyNet(provider, resourceType, resolvedProps, logicalId);\n\n const result = await this.withRetry(\n () => createProvider.create(logicalId, resourceType, createProps),\n logicalId\n );\n\n // Extract ALL dependencies from template (Ref, Fn::GetAtt, DependsOn)\n // so that deletion order is correct even without implicit type-based deps\n const dependencies = this.extractAllDependencies(template, logicalId);\n\n stateResources[logicalId] = {\n physicalId: result.physicalId,\n resourceType,\n properties: resolvedProps,\n ...(result.attributes && { attributes: result.attributes }),\n ...(dependencies && dependencies.length > 0 && { dependencies }),\n };\n\n if (counts) counts.created++;\n if (progress) progress.current++;\n const createPrefix = progress ? `[${progress.current}/${progress.total}] ` : ' ';\n this.logger.info(`${createPrefix}\u2705 ${logicalId} (${resourceType}) created`);\n break;\n }\n\n case 'UPDATE': {\n const currentResource = stateResources[logicalId];\n if (!currentResource) {\n throw new Error(`Cannot update ${logicalId}: resource not found in state`);\n }\n\n const desiredProps = change.desiredProperties || {};\n const currentProps = change.currentProperties || {};\n\n // Resolve intrinsic functions in properties\n const context = {\n template: template!,\n resources: stateResources,\n ...(parameterValues &&\n Object.keys(parameterValues).length > 0 && { parameters: parameterValues }),\n ...(conditions && Object.keys(conditions).length > 0 && { conditions }),\n stateBackend: this.stateBackend,\n stackName,\n };\n\n const resolvedProps = (await this.resolver.resolve(desiredProps, context)) as Record<\n string,\n unknown\n >;\n\n // Re-check diff after resolving intrinsic functions\n // DiffCalculator compares unresolved template vs resolved state, which may produce false positives\n if (JSON.stringify(resolvedProps) === JSON.stringify(currentProps)) {\n this.logger.debug(\n `Skipping ${logicalId}: no actual changes after intrinsic function resolution`\n );\n if (counts) counts.skipped++;\n break;\n }\n\n // Check if this update requires resource replacement (immutable property changed)\n const needsReplacement = change.propertyChanges?.some((pc) => pc.requiresReplacement);\n\n // Extract ALL dependencies from template (Ref, Fn::GetAtt, DependsOn)\n const dependencies = this.extractAllDependencies(template, logicalId);\n\n if (needsReplacement) {\n // Resource replacement: DELETE old \u2192 CREATE new\n const replacedProps = change.propertyChanges\n ?.filter((pc) => pc.requiresReplacement)\n .map((pc) => pc.path)\n .join(', ');\n this.logger.info(\n `Replacing ${logicalId} (${resourceType}) - immutable properties changed: ${replacedProps}`\n );\n\n // 1. Create new resource first (CFn order: safe - old resource survives if CREATE fails)\n this.logger.info(` Creating new ${logicalId}...`);\n const { provider: replaceProvider, properties: replaceProps } =\n this.selectProviderWithSafetyNet(provider, resourceType, resolvedProps, logicalId);\n const createResult = await this.withRetry(\n () => replaceProvider.create(logicalId, resourceType, replaceProps),\n logicalId\n );\n\n // 2. Delete old resource (after successful CREATE)\n const updateReplacePolicy = template?.Resources?.[logicalId]?.UpdateReplacePolicy;\n\n if (updateReplacePolicy === 'Retain') {\n this.logger.info(\n ` Retaining old ${logicalId} (${currentResource.physicalId}) - UpdateReplacePolicy: Retain`\n );\n } else {\n this.logger.info(` Deleting old ${logicalId} (${currentResource.physicalId})...`);\n try {\n await provider.delete(\n logicalId,\n currentResource.physicalId,\n resourceType,\n currentResource.properties\n );\n this.logger.info(` \u2713 Old resource deleted`);\n } catch (deleteError) {\n this.logger.warn(\n ` \u26A0 Failed to delete old resource ${logicalId} (${currentResource.physicalId}): ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`\n );\n }\n }\n\n stateResources[logicalId] = {\n physicalId: createResult.physicalId,\n resourceType,\n properties: resolvedProps,\n ...(createResult.attributes && { attributes: createResult.attributes }),\n ...(dependencies && dependencies.length > 0 && { dependencies }),\n };\n\n if (counts) counts.updated++;\n if (progress) progress.current++;\n const replacePrefix = progress ? `[${progress.current}/${progress.total}] ` : ' ';\n this.logger.info(`${replacePrefix}\u2705 ${logicalId} (${resourceType}) replaced`);\n } else {\n // Normal update (in-place)\n this.logger.debug(`Updating ${logicalId} (${resourceType})`);\n\n // Safety net: fall back to CC API if SDK provider doesn't handle all properties\n const { provider: updateProvider, properties: updateProps } =\n this.selectProviderWithSafetyNet(provider, resourceType, resolvedProps, logicalId);\n\n let result;\n try {\n result = await this.withRetry(\n () =>\n updateProvider.update(\n logicalId,\n currentResource.physicalId,\n resourceType,\n updateProps,\n currentProps\n ),\n logicalId\n );\n } catch (updateError) {\n // If UPDATE is not supported (e.g., CC API UnsupportedActionException),\n // fall back to DELETE \u2192 CREATE (replacement)\n const msg = updateError instanceof Error ? updateError.message : String(updateError);\n if (\n msg.includes('UnsupportedActionException') ||\n msg.includes('does not support UPDATE')\n ) {\n this.logger.info(\n `UPDATE not supported for ${logicalId} (${resourceType}), replacing (DELETE \u2192 CREATE)`\n );\n try {\n await provider.delete(\n logicalId,\n currentResource.physicalId,\n resourceType,\n currentProps\n );\n } catch (deleteError) {\n // If old resource doesn't exist (already deleted), proceed with CREATE\n const deleteMsg =\n deleteError instanceof Error ? deleteError.message : String(deleteError);\n if (\n deleteMsg.includes('does not exist') ||\n deleteMsg.includes('not found') ||\n deleteMsg.includes('NotFound')\n ) {\n this.logger.debug(\n `Old resource ${logicalId} already gone, proceeding with CREATE`\n );\n } else {\n throw deleteError;\n }\n }\n const { provider: replProvider, properties: replProps } =\n this.selectProviderWithSafetyNet(\n provider,\n resourceType,\n resolvedProps,\n logicalId\n );\n const createResult = await this.withRetry(\n () => replProvider.create(logicalId, resourceType, replProps),\n logicalId\n );\n result = {\n physicalId: createResult.physicalId,\n attributes: createResult.attributes,\n wasReplaced: true,\n };\n } else {\n throw updateError;\n }\n }\n\n if (result.wasReplaced) {\n this.logger.info(\n `Resource ${logicalId} was replaced: ${currentResource.physicalId} -> ${result.physicalId}`\n );\n }\n\n stateResources[logicalId] = {\n physicalId: result.physicalId,\n resourceType,\n properties: resolvedProps,\n ...(result.attributes && { attributes: result.attributes }),\n ...(dependencies && dependencies.length > 0 && { dependencies }),\n };\n\n if (counts) counts.updated++;\n if (progress) progress.current++;\n const updatePrefix = progress ? `[${progress.current}/${progress.total}] ` : ' ';\n this.logger.info(`${updatePrefix}\u2705 ${logicalId} (${resourceType}) updated`);\n }\n break;\n }\n\n case 'DELETE': {\n const currentResource = stateResources[logicalId];\n if (!currentResource) {\n throw new Error(`Cannot delete ${logicalId}: resource not found in state`);\n }\n\n // Check DeletionPolicy from template\n const deletionPolicy = template?.Resources?.[logicalId]?.DeletionPolicy;\n if (deletionPolicy === 'Retain') {\n this.logger.info(`Retaining ${logicalId} (${resourceType}) - DeletionPolicy: Retain`);\n delete stateResources[logicalId];\n break;\n }\n\n this.logger.debug(`Deleting ${logicalId} (${resourceType})`);\n try {\n await this.withRetry(\n () =>\n provider.delete(\n logicalId,\n currentResource.physicalId,\n resourceType,\n currentResource.properties\n ),\n logicalId,\n 3, // fewer retries for DELETE\n 5_000\n );\n } catch (deleteError) {\n const msg = deleteError instanceof Error ? deleteError.message : String(deleteError);\n // Treat \"not found\" errors as success (resource already deleted)\n if (\n msg.includes('does not exist') ||\n msg.includes('was not found') ||\n msg.includes('not found') ||\n msg.includes('No policy found') ||\n msg.includes('NoSuchEntity') ||\n msg.includes('NotFoundException') ||\n msg.includes('ResourceNotFoundException')\n ) {\n this.logger.debug(\n `Resource ${logicalId} already deleted (${msg}), removing from state`\n );\n } else {\n throw deleteError;\n }\n }\n\n delete stateResources[logicalId];\n if (counts) counts.deleted++;\n if (progress) progress.current++;\n const deletePrefix = progress ? `[${progress.current}/${progress.total}] ` : ' ';\n this.logger.info(`${deletePrefix}\u2705 ${logicalId} (${resourceType}) deleted`);\n break;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger.error(`Failed to ${change.changeType.toLowerCase()} ${logicalId}: ${message}`);\n\n throw new ProvisioningError(\n `Failed to ${change.changeType.toLowerCase()} resource ${logicalId}`,\n resourceType,\n logicalId,\n stateResources[logicalId]?.physicalId,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Create a resource with retry for transient errors\n *\n * Some resources fail immediately after their dependencies are created due to\n * AWS eventual consistency (e.g., Lambda fails if IAM Role hasn't propagated yet).\n * CloudFormation handles this internally; cdkd retries with exponential backoff.\n */\n /**\n * Extract ALL dependencies for a resource from the template.\n *\n * Uses TemplateParser.extractDependencies() to capture Ref, Fn::GetAtt,\n * and DependsOn dependencies. This ensures the state contains complete\n * dependency information for correct deletion ordering (not just DependsOn).\n */\n private extractAllDependencies(\n template: CloudFormationTemplate | undefined,\n logicalId: string\n ): string[] | undefined {\n const resource = template?.Resources?.[logicalId];\n if (!resource) return undefined;\n const parser = new TemplateParser();\n const deps = parser.extractDependencies(resource);\n return deps.size > 0 ? [...deps] : undefined;\n }\n\n /**\n * Implicit dependency map for correct deletion order.\n *\n * Key = resource type that must be deleted AFTER all value types are deleted.\n * Value = resource types that must be deleted BEFORE the key type.\n *\n * Example: InternetGateway depends on VPCGatewayAttachment being deleted first,\n * because AWS won't let you delete an IGW while it's still attached to a VPC.\n */\n private static readonly IMPLICIT_DELETE_DEPENDENCIES: Record<string, string[]> = {\n // IGW must be deleted AFTER VPCGatewayAttachment\n 'AWS::EC2::InternetGateway': ['AWS::EC2::VPCGatewayAttachment'],\n // EventBus must be deleted AFTER Rules on that bus\n 'AWS::Events::EventBus': ['AWS::Events::Rule'],\n // VPC must be deleted AFTER all VPC-dependent resources\n 'AWS::EC2::VPC': [\n 'AWS::EC2::Subnet',\n 'AWS::EC2::SecurityGroup',\n 'AWS::EC2::InternetGateway',\n 'AWS::EC2::EgressOnlyInternetGateway',\n 'AWS::EC2::VPCGatewayAttachment',\n 'AWS::EC2::RouteTable',\n ],\n // Subnet must be deleted AFTER RouteTableAssociation\n 'AWS::EC2::Subnet': ['AWS::EC2::SubnetRouteTableAssociation'],\n // RouteTable must be deleted AFTER Route and Association\n 'AWS::EC2::RouteTable': ['AWS::EC2::Route', 'AWS::EC2::SubnetRouteTableAssociation'],\n // SecurityGroup must be deleted AFTER SecurityGroupIngress/Egress\n 'AWS::EC2::SecurityGroup': ['AWS::EC2::SecurityGroupIngress', 'AWS::EC2::SecurityGroupEgress'],\n };\n\n /**\n * Build deletion levels from state dependencies (reverse topological order).\n * Resources that are depended upon by others are deleted LAST.\n */\n private buildDeletionLevels(deleteIds: Set<string>, state: StackState): string[][] {\n // Build reverse dependency map: resource \u2192 resources that depend on it\n const dependedBy = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n\n for (const id of deleteIds) {\n if (!dependedBy.has(id)) dependedBy.set(id, new Set());\n if (!inDegree.has(id)) inDegree.set(id, 0);\n }\n\n for (const id of deleteIds) {\n const resource = state.resources[id];\n if (!resource?.dependencies) continue;\n for (const dep of resource.dependencies) {\n if (!deleteIds.has(dep)) continue;\n // id depends on dep \u2192 dep must be deleted AFTER id\n if (!dependedBy.has(dep)) dependedBy.set(dep, new Set());\n dependedBy.get(dep)!.add(id);\n inDegree.set(id, (inDegree.get(id) ?? 0) + 1);\n }\n }\n\n // Add implicit dependencies based on resource types.\n // For each resource being deleted, if its type has implicit dependencies,\n // find other resources being deleted that match those dependency types\n // and add edges so those dependents are deleted first.\n this.addImplicitDeleteDependencies(deleteIds, state, dependedBy);\n\n // Topological sort (Kahn's algorithm) \u2014 produces levels for parallel delete\n const levels: string[][] = [];\n let remaining = new Set(deleteIds);\n\n while (remaining.size > 0) {\n // Find resources with no remaining dependents (safe to delete now)\n const level: string[] = [];\n for (const id of remaining) {\n const dependents = dependedBy.get(id);\n const hasPendingDependents = dependents\n ? [...dependents].some((d) => remaining.has(d))\n : false;\n if (!hasPendingDependents) {\n level.push(id);\n }\n }\n\n if (level.length === 0) {\n // Circular dependency fallback: delete all remaining\n this.logger.warn(\n `Circular dependency detected in delete order, deleting remaining ${remaining.size} resources`\n );\n levels.push([...remaining]);\n break;\n }\n\n levels.push(level);\n remaining = new Set([...remaining].filter((id) => !level.includes(id)));\n }\n\n this.logger.debug(\n `Delete order: ${levels.length} levels - ${levels.map((l, i) => `L${i + 1}(${l.length})`).join(', ')}`\n );\n return levels;\n }\n\n /**\n * Add implicit delete dependency edges based on resource type relationships.\n *\n * Some AWS resources have ordering constraints during deletion that are NOT\n * expressed via Ref/GetAtt in CloudFormation templates. For example, an\n * InternetGateway cannot be deleted until its VPCGatewayAttachment is removed,\n * even though the attachment references the IGW (not the other way around).\n *\n * This method inspects resource types and adds edges so that dependents\n * (e.g., VPCGatewayAttachment) are deleted BEFORE the resources they implicitly\n * depend on (e.g., InternetGateway).\n */\n private addImplicitDeleteDependencies(\n deleteIds: Set<string>,\n state: StackState,\n dependedBy: Map<string, Set<string>>\n ): void {\n // Build a type \u2192 logical IDs index for resources being deleted\n const typeToIds = new Map<string, string[]>();\n for (const id of deleteIds) {\n const resource = state.resources[id];\n if (!resource) continue;\n const ids = typeToIds.get(resource.resourceType) ?? [];\n ids.push(id);\n typeToIds.set(resource.resourceType, ids);\n }\n\n for (const id of deleteIds) {\n const resource = state.resources[id];\n if (!resource) continue;\n\n const mustDeleteAfter = DeployEngine.IMPLICIT_DELETE_DEPENDENCIES[resource.resourceType];\n if (!mustDeleteAfter) continue;\n\n for (const depType of mustDeleteAfter) {\n const depIds = typeToIds.get(depType);\n if (!depIds) continue;\n\n for (const depId of depIds) {\n // depId (of depType) must be deleted BEFORE id (of resource.resourceType)\n // In the dependedBy map: id is \"depended on\" by depId\n // meaning depId will be picked first (deleted first)\n if (!dependedBy.has(id)) dependedBy.set(id, new Set());\n if (!dependedBy.get(id)!.has(depId)) {\n dependedBy.get(id)!.add(depId);\n this.logger.debug(\n `Implicit delete dependency: ${depId} (${depType}) must be deleted before ${id} (${resource.resourceType})`\n );\n }\n }\n }\n }\n }\n\n /**\n * Select the appropriate provider for create/update, falling back to CC API\n * if the SDK provider doesn't handle all template properties.\n *\n * This safety net prevents properties from being silently dropped when an SDK\n * provider only maps a subset of CloudFormation properties.\n *\n * DELETE always uses the SDK provider (force-delete, cleanup, etc.).\n */\n private selectProviderWithSafetyNet(\n sdkProvider: ResourceProvider,\n resourceType: string,\n resolvedProps: Record<string, unknown>,\n logicalId: string\n ): { provider: ResourceProvider; properties: Record<string, unknown> } {\n const handledSet = sdkProvider.handledProperties?.get(resourceType);\n if (!handledSet) {\n // Provider doesn't declare handledProperties for this type \u2014 assume full coverage\n return { provider: sdkProvider, properties: resolvedProps };\n }\n\n const templateProps = Object.keys(resolvedProps);\n const unhandledProps = templateProps.filter((p) => !handledSet.has(p));\n\n if (unhandledProps.length === 0) {\n // All properties are handled by the SDK provider\n return { provider: sdkProvider, properties: resolvedProps };\n }\n\n // There are unhandled properties \u2014 try to fall back to CC API\n if (\n CloudControlProvider.isSupportedResourceType(resourceType) &&\n !sdkProvider.disableCcApiFallback\n ) {\n this.logger.info(\n `${logicalId}: SDK provider does not handle [${unhandledProps.join(', ')}] \u2014 falling back to CC API for create/update`\n );\n\n // Apply default name generation so CC API uses the same names SDK provider would have.\n // If the provider has custom pre-processing, use that instead.\n const fallbackProps = sdkProvider.preparePropertiesForFallback\n ? sdkProvider.preparePropertiesForFallback(logicalId, resourceType, resolvedProps)\n : applyDefaultNameForFallback(logicalId, resourceType, resolvedProps);\n\n return {\n provider: this.providerRegistry.getCloudControlProvider(),\n properties: fallbackProps,\n };\n }\n\n // CC API fallback not available \u2014 fail to prevent silent property loss\n const reason = sdkProvider.disableCcApiFallback\n ? 'CC API fallback is disabled for this provider (known CC API issues)'\n : `CC API does not support ${resourceType}`;\n throw new ProvisioningError(\n `SDK provider for ${resourceType} does not handle properties [${unhandledProps.join(', ')}] ` +\n `and ${reason}. ` +\n `These properties would be silently dropped. ` +\n `Please update the SDK provider to handle all required properties.`,\n resourceType,\n logicalId,\n ''\n );\n }\n\n /**\n * Execute an operation with retry for transient IAM propagation errors\n */\n private async withRetry<T>(\n operation: () => Promise<T>,\n logicalId: string,\n maxRetries: number = 8,\n initialDelayMs: number = 10_000\n ): Promise<T> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n const message = error instanceof Error ? error.message : String(error);\n\n const isRetryable = this.isRetryableError(error, message);\n\n if (!isRetryable || attempt >= maxRetries) {\n throw error;\n }\n\n const delay = initialDelayMs * Math.pow(2, attempt);\n this.logger.debug(\n ` \u23F3 Retrying ${logicalId} in ${delay / 1000}s (attempt ${attempt + 1}/${maxRetries}) - ${message}`\n );\n // Interruptible sleep: check for SIGINT every second during delay\n for (let waited = 0; waited < delay; waited += 1000) {\n if (this.interrupted) throw new InterruptedError();\n await new Promise((resolve) => setTimeout(resolve, Math.min(1000, delay - waited)));\n }\n }\n }\n\n throw lastError;\n }\n\n /**\n * Determine if an error is retryable (transient).\n * Checks HTTP status codes (429 throttle, 503 unavailable)\n * and IAM propagation delay message patterns.\n */\n private isRetryableError(error: unknown, message: string): boolean {\n // Check HTTP status code from AWS SDK errors\n const metadata = (error as { $metadata?: { httpStatusCode?: number } }).$metadata;\n const statusCode = metadata?.httpStatusCode;\n if (statusCode === 429 || statusCode === 503) return true;\n\n // Check cause chain for wrapped errors\n const cause = (error as { cause?: { $metadata?: { httpStatusCode?: number } } }).cause;\n const causeStatus = cause?.$metadata?.httpStatusCode;\n if (causeStatus === 429 || causeStatus === 503) return true;\n\n // IAM propagation delay patterns\n const retryablePatterns = [\n 'cannot be assumed',\n 'role defined for the function',\n 'not authorized to perform',\n 'execution role',\n 'trust policy',\n 'Role validation failed',\n 'does not have required permissions',\n 'Trusted Entity',\n 'currently in the following state: Pending',\n // DELETE dependency ordering (parallel deletion race conditions)\n 'has dependencies and cannot be deleted',\n \"can't be deleted since it has\",\n 'DependencyViolation',\n // AWS eventual consistency (dependency just created but not yet visible)\n // e.g., RDS DBCluster referencing a just-created DBSubnetGroup\n 'does not exist',\n // AppSync schema is being created asynchronously\n 'Schema is currently being altered',\n // IAM principal not yet propagated to S3 bucket policy\n 'Invalid principal in policy',\n // S3 bucket creation/deletion still in progress\n 'conflicting conditional operation',\n // Secrets Manager: ForceDeleteWithoutRecovery may take a moment to propagate\n 'scheduled for deletion',\n // DynamoDB Streams / Kinesis: IAM role not yet propagated\n 'Cannot access stream',\n 'Please ensure the role can perform',\n // KMS: IAM role not yet propagated for CreateGrant\n 'KMS key is invalid for CreateGrant',\n ];\n return retryablePatterns.some((p) => message.includes(p));\n }\n\n /**\n * Resolve stack outputs from template and resource attributes\n *\n * Uses IntrinsicFunctionResolver for full CloudFormation intrinsic function support.\n */\n private async resolveOutputs(\n template: CloudFormationTemplate,\n resources: Record<string, ResourceState>,\n stackName: string,\n parameterValues?: Record<string, unknown>,\n conditions?: Record<string, boolean>\n ): Promise<Record<string, unknown>> {\n if (!template.Outputs) {\n return {};\n }\n\n const outputs: Record<string, unknown> = {};\n const context = {\n template: template,\n resources: resources,\n ...(parameterValues &&\n Object.keys(parameterValues).length > 0 && { parameters: parameterValues }),\n ...(conditions && Object.keys(conditions).length > 0 && { conditions }),\n stateBackend: this.stateBackend,\n stackName,\n };\n\n for (const [outputKey, output] of Object.entries(template.Outputs)) {\n try {\n const value = await this.resolver.resolve(output.Value, context);\n outputs[outputKey] = value;\n\n // If the output has an Export.Name, also store under that key\n // so Fn::ImportValue can find it by export name\n if (output.Export?.Name) {\n const exportName =\n typeof output.Export.Name === 'string'\n ? output.Export.Name\n : await this.resolver.resolve(output.Export.Name, context);\n if (typeof exportName === 'string') {\n outputs[exportName] = value;\n }\n }\n } catch (error) {\n this.logger.warn(`Failed to resolve output ${outputKey}: ${String(error)}`);\n outputs[outputKey] = undefined;\n }\n }\n\n return outputs;\n }\n}\n", "import { Command } from 'commander';\nimport {\n appOptions,\n commonOptions,\n stateOptions,\n stackOptions,\n contextOptions,\n parseContextOptions,\n} from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { Synthesizer } from '../../synthesis/synthesizer.js';\nimport { S3StateBackend } from '../../state/s3-state-backend.js';\nimport { DiffCalculator } from '../../analyzer/diff-calculator.js';\nimport { IntrinsicFunctionResolver } from '../../deployment/intrinsic-function-resolver.js';\nimport { setAwsClients, AwsClients } from '../../utils/aws-clients.js';\nimport { resolveApp, resolveStateBucketWithDefault } from '../config-loader.js';\n\nconst INTRINSIC_KEYS = new Set([\n 'Ref',\n 'Fn::Sub',\n 'Fn::GetAtt',\n 'Fn::Join',\n 'Fn::Select',\n 'Fn::Split',\n 'Fn::If',\n 'Fn::ImportValue',\n 'Fn::FindInMap',\n 'Fn::Base64',\n 'Fn::GetAZs',\n 'Fn::Equals',\n 'Fn::And',\n 'Fn::Or',\n 'Fn::Not',\n]);\n\nfunction isIntrinsic(value: unknown): boolean {\n if (value === null || value === undefined || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const keys = Object.keys(value as Record<string, unknown>);\n return keys.length === 1 && INTRINSIC_KEYS.has(keys[0]!);\n}\n\n/**\n * Strip unchanged and intrinsic-only values from a diff value.\n *\n * Recursively compares `value` against `other` and keeps only the keys\n * whose values actually differ (excluding intrinsic vs resolved mismatches).\n * This produces a minimal diff showing only real changes.\n */\nfunction stripUnchangedValues(value: unknown, other: unknown): unknown {\n // Primitives or nulls: return as-is (the caller already determined these differ)\n if (value === null || value === undefined || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value;\n\n // If value itself is an intrinsic, omit it (it's not a real change)\n if (isIntrinsic(value)) return undefined;\n // If the other side is an intrinsic, the resolved value on this side is not a real change\n if (isIntrinsic(other)) return undefined;\n\n if (other === null || other === undefined || typeof other !== 'object' || Array.isArray(other)) {\n return value;\n }\n\n const valObj = value as Record<string, unknown>;\n const otherObj = other as Record<string, unknown>;\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(valObj)) {\n const v = valObj[key];\n const o = otherObj[key];\n\n // If either side is intrinsic for this key, skip (not a real change)\n if (isIntrinsic(v) || isIntrinsic(o)) continue;\n\n // If values are deeply equal, skip\n if (JSON.stringify(v) === JSON.stringify(o)) continue;\n\n // Recurse for nested objects\n if (typeof v === 'object' && v !== null && typeof o === 'object' && o !== null) {\n const filtered = stripUnchangedValues(v, o);\n if (filtered !== undefined && JSON.stringify(filtered) !== '{}') {\n result[key] = filtered;\n }\n } else {\n result[key] = v;\n }\n }\n\n return Object.keys(result).length > 0 ? result : value;\n}\n\n/**\n * Diff command implementation\n */\nasync function diffCommand(\n stacks: string[],\n options: {\n app?: string;\n output: string;\n stateBucket?: string;\n statePrefix: string;\n stack?: string;\n all?: boolean;\n region?: string;\n profile?: string;\n verbose: boolean;\n context?: string[];\n }\n): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n // Resolve --app from CLI, env, or cdk.json\n const app = resolveApp(options.app);\n if (!app) {\n throw new Error(\n 'No app command specified. Use --app, set CDKD_APP env var, or add \"app\" to cdk.json'\n );\n }\n options.app = app;\n\n // Resolve --state-bucket from CLI, env, cdk.json, or default\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n const stateBucket = await resolveStateBucketWithDefault(options.stateBucket, region);\n\n logger.info('Calculating diff...');\n logger.debug('Options:', options);\n\n // Initialize AWS clients with region/profile\n const awsClients = new AwsClients({\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(awsClients);\n\n try {\n // 1. Synthesize CDK app\n logger.info('Synthesizing CDK app...');\n const synthesizer = new Synthesizer();\n const context = parseContextOptions(options.context);\n const result = await synthesizer.synthesize({\n app: options.app,\n output: options.output,\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n ...(Object.keys(context).length > 0 && { context }),\n });\n\n const { stacks: allStacks } = result;\n logger.info(`Found ${allStacks.length} stack(s) in assembly`);\n\n // Determine target stacks: positional args > --stack > --all > auto (single stack)\n const stackPatterns = stacks.length > 0 ? stacks : options.stack ? [options.stack] : [];\n let targetStacks;\n\n if (options.all) {\n targetStacks = allStacks;\n } else if (stackPatterns.length > 0) {\n targetStacks = allStacks.filter((s) =>\n stackPatterns.some((pattern) =>\n pattern.includes('*')\n ? new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$').test(s.stackName)\n : s.stackName === pattern\n )\n );\n } else if (allStacks.length === 1) {\n targetStacks = allStacks;\n } else {\n throw new Error(\n `Multiple stacks found: ${allStacks.map((s) => s.stackName).join(', ')}. ` +\n `Specify stack name(s) or use --all`\n );\n }\n\n if (targetStacks.length === 0) {\n throw new Error(\n stackPatterns.length > 0\n ? `No stacks matching ${stackPatterns.join(', ')} found in assembly`\n : 'No stacks found in assembly'\n );\n }\n\n // 3. Initialize components\n const stateConfig = {\n bucket: stateBucket,\n prefix: options.statePrefix,\n };\n const stateBackend = new S3StateBackend(awsClients.s3, stateConfig);\n const diffCalculator = new DiffCalculator();\n const intrinsicResolver = new IntrinsicFunctionResolver(region);\n\n // 4. Calculate and display diff for each stack\n for (const stackInfo of targetStacks) {\n logger.info(`\\nCalculating diff for stack: ${stackInfo.stackName}`);\n\n const template = stackInfo.template;\n\n // Load current state\n let currentState;\n const stateResult = await stateBackend.getState(stackInfo.stackName);\n if (stateResult) {\n currentState = stateResult.state;\n } else {\n logger.debug(`No existing state for ${stackInfo.stackName}`);\n currentState = {\n stackName: stackInfo.stackName,\n resources: {},\n outputs: {},\n version: 1,\n lastModified: Date.now(),\n };\n }\n\n // Calculate diff. A best-effort intrinsic resolver lets us detect changes\n // buried inside intrinsics (e.g. Fn::Join literal args) against resolved\n // values in state. Resolution failures fall back to the unresolved value.\n const diffResolveFn = (value: unknown) =>\n intrinsicResolver.resolve(value, {\n template,\n resources: currentState.resources,\n stateBackend,\n stackName: stackInfo.stackName,\n });\n const changes = await diffCalculator.calculateDiff(currentState, template, diffResolveFn);\n\n // Display changes\n if (changes.size === 0) {\n logger.info('\\n\u2713 No changes detected');\n continue;\n }\n\n logger.info(`\\nStack ${stackInfo.stackName}:`);\n\n let createCount = 0;\n let updateCount = 0;\n let deleteCount = 0;\n\n for (const [logicalId, change] of changes.entries()) {\n switch (change.changeType) {\n case 'CREATE':\n createCount++;\n logger.info(` [+] ${logicalId} (${change.resourceType})`);\n break;\n case 'UPDATE': {\n updateCount++;\n logger.info(` [~] ${logicalId} (${change.resourceType})`);\n if (change.propertyChanges && change.propertyChanges.length > 0) {\n for (const propChange of change.propertyChanges) {\n const requiresReplace = propChange.requiresReplacement\n ? ' [requires replacement]'\n : '';\n // Strip unchanged and intrinsic values to show only actual changes\n const oldFiltered = stripUnchangedValues(propChange.oldValue, propChange.newValue);\n const newFiltered = stripUnchangedValues(propChange.newValue, propChange.oldValue);\n const indent = ' ';\n const oldStr = (JSON.stringify(oldFiltered, null, 2) ?? 'undefined').replace(\n /\\n/g,\n `\\n${indent}`\n );\n const newStr = (JSON.stringify(newFiltered, null, 2) ?? 'undefined').replace(\n /\\n/g,\n `\\n${indent}`\n );\n logger.info(` - ${propChange.path}:${requiresReplace}`);\n logger.info(` old: ${oldStr}`);\n logger.info(` new: ${newStr}`);\n }\n }\n break;\n }\n case 'DELETE':\n deleteCount++;\n logger.info(` [-] ${logicalId} (${change.resourceType})`);\n break;\n }\n }\n\n logger.info(`\\n${createCount} to create, ${updateCount} to update, ${deleteCount} to delete`);\n }\n } finally {\n awsClients.destroy();\n }\n}\n\n/**\n * Create diff command\n */\nexport function createDiffCommand(): Command {\n const cmd = new Command('diff')\n .description('Show difference between current state and desired state')\n .argument('[stacks...]', 'Stack name(s) to diff (supports wildcards)')\n .option('--all', 'Diff all stacks', false)\n .action(withErrorHandling(diffCommand));\n\n // Add options\n [...commonOptions, ...appOptions, ...stateOptions, ...stackOptions, ...contextOptions].forEach(\n (opt) => cmd.addOption(opt)\n );\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport {\n appOptions,\n commonOptions,\n stateOptions,\n stackOptions,\n destroyOptions,\n contextOptions,\n parseContextOptions,\n} from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { Synthesizer } from '../../synthesis/synthesizer.js';\nimport { S3StateBackend } from '../../state/s3-state-backend.js';\nimport { LockManager } from '../../state/lock-manager.js';\nimport { DagBuilder } from '../../analyzer/dag-builder.js';\nimport { ProviderRegistry } from '../../provisioning/provider-registry.js';\nimport { registerAllProviders } from '../../provisioning/register-providers.js';\nimport { setAwsClients, AwsClients } from '../../utils/aws-clients.js';\nimport * as readline from 'node:readline/promises';\nimport { resolveApp, resolveStateBucketWithDefault } from '../config-loader.js';\n\n/**\n * Destroy command implementation\n */\nasync function destroyCommand(\n stackArgs: string[],\n options: {\n app?: string;\n output?: string;\n stateBucket?: string;\n statePrefix: string;\n stack?: string;\n all?: boolean;\n region?: string;\n profile?: string;\n force: boolean;\n verbose: boolean;\n context?: string[];\n }\n): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n // Resolve --state-bucket from CLI, env, cdk.json, or default\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n const stateBucket = await resolveStateBucketWithDefault(options.stateBucket, region);\n\n logger.info('Starting stack destruction...');\n logger.debug('Options:', options);\n\n // Initialize AWS clients with region/profile\n // Also set AWS_REGION env for providers using local SDK clients\n if (options.region) {\n process.env['AWS_REGION'] = options.region;\n process.env['AWS_DEFAULT_REGION'] = options.region;\n }\n const awsClients = new AwsClients({\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(awsClients);\n\n try {\n // 1. Initialize components\n const stateConfig = {\n bucket: stateBucket,\n prefix: options.statePrefix,\n };\n const stateBackend = new S3StateBackend(awsClients.s3, stateConfig);\n const lockManager = new LockManager(awsClients.s3, stateConfig);\n const dagBuilder = new DagBuilder();\n const providerRegistry = new ProviderRegistry();\n\n // Register all SDK providers\n registerAllProviders(providerRegistry);\n\n // Configure custom resource response handling via S3\n providerRegistry.setCustomResourceResponseBucket(stateBucket);\n\n // 2. Resolve stacks to destroy (CDK CLI compatible behavior)\n // Always synth to determine which stacks belong to this CDK app.\n const appCmd = options.app || resolveApp();\n let appStackNames: string[] = [];\n\n if (appCmd) {\n try {\n const synthesizer = new Synthesizer();\n const context = parseContextOptions(options.context);\n const result = await synthesizer.synthesize({\n app: appCmd,\n output: options.output || 'cdk.out',\n ...(Object.keys(context).length > 0 && { context }),\n });\n appStackNames = result.stacks.map((s) => s.stackName);\n } catch {\n logger.debug('Could not synthesize app, falling back to state-based stack list');\n }\n }\n\n // Determine candidate stacks\n const allStateStacks = await stateBackend.listStacks();\n let candidateStacks: string[];\n if (appStackNames.length > 0) {\n // App synth succeeded: only consider stacks from this app\n candidateStacks = appStackNames.filter((name) => allStateStacks.includes(name));\n } else if (stackArgs.length > 0 || options.stack || options.all) {\n // No synth but explicit stack names or --all given: use state stacks\n candidateStacks = allStateStacks;\n } else {\n // No synth and no explicit stacks: refuse to guess\n throw new Error(\n 'Could not determine which stacks belong to this app. ' +\n 'Specify stack names explicitly, use --all, or ensure --app / cdk.json is configured.'\n );\n }\n\n const stackPatterns = stackArgs.length > 0 ? stackArgs : options.stack ? [options.stack] : [];\n\n let stackNames: string[];\n if (options.all) {\n // --all: destroy all stacks in the current app\n stackNames = candidateStacks;\n } else if (stackPatterns.length > 0) {\n // Explicit stack names or wildcards\n stackNames = candidateStacks.filter((name) =>\n stackPatterns.some((pattern) =>\n pattern.includes('*')\n ? new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$').test(name)\n : name === pattern\n )\n );\n } else if (candidateStacks.length === 1) {\n // Single stack: auto-select (CDK CLI compatible)\n stackNames = candidateStacks;\n } else if (candidateStacks.length === 0) {\n logger.info('No stacks found in state');\n return;\n } else {\n throw new Error(\n `Multiple stacks found: ${candidateStacks.join(', ')}. ` +\n `Specify stack name(s) or use --all`\n );\n }\n\n if (stackNames.length === 0) {\n logger.info('No matching stacks found in state');\n return;\n }\n\n logger.info(`Found ${stackNames.length} stack(s) to destroy: ${stackNames.join(', ')}`);\n\n // 3. Process each stack\n for (const stackName of stackNames) {\n logger.info(`\\nPreparing to destroy stack: ${stackName}`);\n\n // Load current state\n const stateResult = await stateBackend.getState(stackName);\n if (!stateResult) {\n logger.warn(`No state found for stack ${stackName}, skipping`);\n continue;\n }\n const currentState = stateResult.state;\n\n const resourceCount = Object.keys(currentState.resources).length;\n if (resourceCount === 0) {\n logger.info(`Stack ${stackName} has no resources, cleaning up state...`);\n await stateBackend.deleteState(stackName);\n logger.info('\u2713 State deleted');\n continue;\n }\n\n // Show resources to be deleted\n logger.info(`\\nResources to be deleted (${resourceCount}):`);\n for (const [logicalId, resource] of Object.entries(currentState.resources)) {\n logger.info(` - ${logicalId} (${resource.resourceType})`);\n }\n\n // 4. Confirm (unless --force)\n if (!options.force) {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const answer = await rl.question(\n `\\nAre you sure you want to destroy stack \"${stackName}\" and delete all ${resourceCount} resources? (Y/n): `\n );\n rl.close();\n\n const trimmed = answer.trim().toLowerCase();\n if (trimmed === 'n' || trimmed === 'no') {\n logger.info('Destroy cancelled');\n continue;\n }\n }\n\n // 5. Switch region if stack was deployed to a different region\n const stackRegion = currentState.region;\n let destroyProviderRegistry = providerRegistry;\n let destroyAwsClients: AwsClients | undefined;\n\n if (stackRegion && stackRegion !== region) {\n logger.info(`Stack region: ${stackRegion}`);\n process.env['AWS_REGION'] = stackRegion;\n process.env['AWS_DEFAULT_REGION'] = stackRegion;\n\n destroyAwsClients = new AwsClients({\n region: stackRegion,\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(destroyAwsClients);\n\n destroyProviderRegistry = new ProviderRegistry();\n registerAllProviders(destroyProviderRegistry);\n destroyProviderRegistry.setCustomResourceResponseBucket(stateBucket);\n }\n\n // Acquire lock (always uses base region for state bucket)\n logger.info(`\\nAcquiring lock for stack ${stackName}...`);\n await lockManager.acquireLock(stackName, 'destroy');\n\n try {\n // 6. Build dependency graph from current state\n logger.info('Building dependency graph...');\n\n // Create a minimal template from current state for DAG building\n const template = {\n AWSTemplateFormatVersion: '2010-09-09',\n Resources: {} as Record<\n string,\n { Type: string; Properties: Record<string, unknown>; DependsOn?: string[] }\n >,\n };\n\n for (const [logicalId, resource] of Object.entries(currentState.resources)) {\n template.Resources[logicalId] = {\n Type: resource.resourceType,\n Properties: resource.properties || {},\n ...(resource.dependencies &&\n resource.dependencies.length > 0 && {\n DependsOn: resource.dependencies,\n }),\n };\n }\n\n // Add implicit dependencies for correct deletion order.\n const implicitDeleteDeps: Record<string, string[]> = {\n 'AWS::EC2::InternetGateway': ['AWS::EC2::VPCGatewayAttachment'],\n 'AWS::Events::EventBus': ['AWS::Events::Rule'],\n 'AWS::Athena::WorkGroup': ['AWS::Athena::NamedQuery'],\n 'AWS::CloudFront::ResponseHeadersPolicy': ['AWS::CloudFront::Distribution'],\n 'AWS::CloudFront::CachePolicy': ['AWS::CloudFront::Distribution'],\n 'AWS::CloudFront::OriginAccessControl': ['AWS::CloudFront::Distribution'],\n 'AWS::EC2::VPC': [\n 'AWS::EC2::Subnet',\n 'AWS::EC2::SecurityGroup',\n 'AWS::EC2::InternetGateway',\n 'AWS::EC2::VPCGatewayAttachment',\n 'AWS::EC2::RouteTable',\n ],\n 'AWS::EC2::Subnet': ['AWS::EC2::SubnetRouteTableAssociation'],\n 'AWS::EC2::RouteTable': ['AWS::EC2::Route', 'AWS::EC2::SubnetRouteTableAssociation'],\n 'AWS::EC2::SecurityGroup': [\n 'AWS::EC2::SecurityGroupIngress',\n 'AWS::EC2::SecurityGroupEgress',\n ],\n };\n\n // Build type \u2192 logicalId index\n const typeToLogicalIds = new Map<string, string[]>();\n for (const [logicalId, resource] of Object.entries(currentState.resources)) {\n const ids = typeToLogicalIds.get(resource.resourceType) ?? [];\n ids.push(logicalId);\n typeToLogicalIds.set(resource.resourceType, ids);\n }\n\n for (const [logicalId, resource] of Object.entries(currentState.resources)) {\n const mustDeleteAfter = implicitDeleteDeps[resource.resourceType];\n if (!mustDeleteAfter) continue;\n\n for (const depType of mustDeleteAfter) {\n const depIds = typeToLogicalIds.get(depType);\n if (!depIds) continue;\n for (const depId of depIds) {\n const existing = template.Resources[depId]?.DependsOn ?? [];\n const depsArray = Array.isArray(existing) ? existing : [existing];\n if (!depsArray.includes(logicalId)) {\n template.Resources[depId] = {\n ...template.Resources[depId]!,\n DependsOn: [...depsArray, logicalId],\n };\n logger.debug(\n `Implicit delete dependency: ${depId} (${depType}) must be deleted before ${logicalId} (${resource.resourceType})`\n );\n }\n }\n }\n }\n\n const graph = dagBuilder.buildGraph(template);\n const executionLevels = dagBuilder.getExecutionLevels(graph);\n\n logger.debug(`Dependency graph: ${executionLevels.length} level(s)`);\n\n let deletedCount = 0;\n let errorCount = 0;\n\n // Process levels in reverse order for deletion\n for (let levelIndex = executionLevels.length - 1; levelIndex >= 0; levelIndex--) {\n const level = executionLevels[levelIndex];\n if (!level) {\n continue;\n }\n\n logger.debug(\n `Deletion level ${executionLevels.length - levelIndex}/${executionLevels.length} (${level.length} resources)`\n );\n\n // Delete resources in parallel within each level\n const deletePromises = level.map(async (logicalId) => {\n const resource = currentState.resources[logicalId];\n if (!resource) {\n logger.warn(`Resource ${logicalId} not found in state, skipping`);\n return;\n }\n\n try {\n const provider = destroyProviderRegistry.getProvider(resource.resourceType);\n // Retry DELETE for transient errors (throttle, dependency race)\n let lastDeleteError: unknown;\n for (let attempt = 0; attempt <= 3; attempt++) {\n try {\n await provider.delete(\n logicalId,\n resource.physicalId,\n resource.resourceType,\n resource.properties\n );\n lastDeleteError = null;\n break;\n } catch (retryError) {\n lastDeleteError = retryError;\n const msg = retryError instanceof Error ? retryError.message : String(retryError);\n const isRetryable =\n msg.includes('Too Many Requests') ||\n msg.includes('has dependencies') ||\n msg.includes(\"can't be deleted since\") ||\n msg.includes('DependencyViolation');\n if (!isRetryable || attempt >= 3) break;\n const delay = 5000 * Math.pow(2, attempt);\n logger.debug(\n ` \u23F3 Retrying delete ${logicalId} in ${delay / 1000}s (attempt ${attempt + 1}/3)`\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n if (lastDeleteError) throw lastDeleteError;\n\n logger.info(` \u2705 ${logicalId} (${resource.resourceType}) deleted`);\n deletedCount++;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n // Treat \"not found\" as already deleted\n if (\n msg.includes('does not exist') ||\n msg.includes('not found') ||\n msg.includes('No policy found') ||\n msg.includes('NoSuchEntity') ||\n msg.includes('NotFoundException')\n ) {\n logger.debug(` ${logicalId} already deleted, removing from state`);\n deletedCount++;\n } else {\n logger.error(` \u2717 Failed to delete ${logicalId}:`, String(error));\n errorCount++;\n }\n }\n });\n\n await Promise.all(deletePromises);\n }\n\n // 8. Delete state\n if (errorCount === 0) {\n await stateBackend.deleteState(stackName);\n logger.debug('State deleted');\n } else {\n logger.warn(`${errorCount} resource(s) failed to delete. State preserved.`);\n }\n\n logger.info(\n `\\n\u2713 Stack ${stackName} destroyed (${deletedCount} deleted, ${errorCount} errors)`\n );\n } finally {\n // 9. Release lock\n logger.debug('Releasing lock...');\n await lockManager.releaseLock(stackName);\n\n // Restore region if changed\n if (destroyAwsClients) {\n destroyAwsClients.destroy();\n process.env['AWS_REGION'] = region;\n process.env['AWS_DEFAULT_REGION'] = region;\n setAwsClients(awsClients);\n }\n }\n }\n } finally {\n // Cleanup AWS clients\n awsClients.destroy();\n }\n}\n\n/**\n * Create destroy command\n */\nexport function createDestroyCommand(): Command {\n const cmd = new Command('destroy')\n .description('Destroy all resources in the stack')\n .argument('[stacks...]', 'Stack name(s) to destroy (supports wildcards)')\n .option('--all', 'Destroy all stacks', false)\n .action(withErrorHandling(destroyCommand));\n\n // Add options (appOptions accepted for CDK CLI compatibility, but not used)\n [\n ...commonOptions,\n ...appOptions,\n ...stateOptions,\n ...stackOptions,\n ...destroyOptions,\n ...contextOptions,\n ].forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n", "import { Option, Command } from 'commander';\nimport { commonOptions } from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { AssetPublisher } from '../../assets/asset-publisher.js';\n\n/**\n * Publish assets command implementation\n */\nasync function publishAssetsCommand(options: {\n path: string;\n verbose: boolean;\n region?: string;\n profile?: string;\n assetPublishConcurrency: number;\n imageBuildConcurrency: number;\n}): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n logger.info('Publishing assets...');\n logger.debug('Asset manifest path:', options.path);\n\n const publisher = new AssetPublisher();\n\n await publisher.publishFromManifest(options.path, {\n ...(options.profile && { profile: options.profile }),\n ...(options.region && { region: options.region }),\n assetPublishConcurrency: options.assetPublishConcurrency,\n imageBuildConcurrency: options.imageBuildConcurrency,\n });\n\n logger.info('\u2705 Asset publishing complete');\n}\n\n/**\n * Create publish-assets command\n */\nexport function createPublishAssetsCommand(): Command {\n const cmd = new Command('publish-assets')\n .description('Publish assets to S3/ECR from asset manifest')\n .requiredOption('--path <path>', 'Path to asset manifest file or directory')\n .addOption(\n new Option(\n '--asset-publish-concurrency <number>',\n 'Maximum concurrent asset publish operations'\n )\n .default(8)\n .argParser((value) => parseInt(value, 10))\n )\n .addOption(\n new Option('--image-build-concurrency <number>', 'Maximum concurrent Docker image builds')\n .default(4)\n .argParser((value) => parseInt(value, 10))\n )\n .action(withErrorHandling(publishAssetsCommand));\n\n // Add common options\n commonOptions.forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport { commonOptions, stateOptions, stackOptions } from '../options.js';\nimport { getLogger } from '../../utils/logger.js';\nimport { withErrorHandling } from '../../utils/error-handler.js';\nimport { LockManager } from '../../state/lock-manager.js';\nimport { setAwsClients, AwsClients } from '../../utils/aws-clients.js';\nimport { resolveStateBucketWithDefault } from '../config-loader.js';\n\n/**\n * Force-unlock command implementation\n *\n * Removes a stale lock from a stack. Use when a previous deploy was\n * interrupted and left a lock behind.\n */\nasync function forceUnlockCommand(\n stackArgs: string[],\n options: {\n stateBucket?: string;\n statePrefix: string;\n stack?: string;\n region?: string;\n profile?: string;\n verbose: boolean;\n }\n): Promise<void> {\n const logger = getLogger();\n\n if (options.verbose) {\n logger.setLevel('debug');\n }\n\n // Resolve stack name\n const stackPatterns = stackArgs.length > 0 ? stackArgs : options.stack ? [options.stack] : [];\n if (stackPatterns.length === 0) {\n throw new Error('Stack name is required. Usage: cdkd force-unlock <stack-name>');\n }\n\n // Initialize AWS clients\n const awsClients = new AwsClients({\n ...(options.region && { region: options.region }),\n ...(options.profile && { profile: options.profile }),\n });\n setAwsClients(awsClients);\n\n const region = options.region || process.env['AWS_REGION'] || 'us-east-1';\n const stateBucket = await resolveStateBucketWithDefault(options.stateBucket, region);\n\n try {\n const stateConfig = {\n bucket: stateBucket,\n prefix: options.statePrefix,\n };\n const lockManager = new LockManager(awsClients.s3, stateConfig);\n\n for (const stackName of stackPatterns) {\n logger.info(`Force-unlocking stack: ${stackName}`);\n\n try {\n await lockManager.forceReleaseLock(stackName);\n logger.info(`\u2713 Lock released for stack: ${stackName}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes('No lock found') || message.includes('NoSuchKey')) {\n logger.info(`No lock found for stack: ${stackName}`);\n } else {\n logger.error(`Failed to unlock stack ${stackName}: ${message}`);\n }\n }\n }\n } finally {\n awsClients.destroy();\n }\n}\n\n/**\n * Create force-unlock command\n */\nexport function createForceUnlockCommand(): Command {\n const cmd = new Command('force-unlock')\n .description('Force-release a stale lock on a stack')\n .argument('[stacks...]', 'Stack name(s) to unlock')\n .action(withErrorHandling(forceUnlockCommand));\n\n [...commonOptions, ...stateOptions, ...stackOptions].forEach((opt) => cmd.addOption(opt));\n\n return cmd;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Command", "GetCallerIdentityCommand", "getAwsClients", "Command", "writeFileSync", "join", "resolve", "GetCallerIdentityCommand", "STSClient", "join", "join", "resolve", "readFileSync", "join", "join", "readFileSync", "readFileSync", "writeFileSync", "existsSync", "resolve", "resolve", "existsSync", "readFileSync", "writeFileSync", "EC2Client", "EC2Client", "SSMClient", "SSMClient", "zone", "EC2Client", "EC2Client", "CloudControlClient", "CloudControlClient", "EC2Client", "EC2Client", "EC2Client", "EC2Client", "lb", "resolve", "STSClient", "GetCallerIdentityCommand", "join", "writeFileSync", "Command", "Command", "readFileSync", "join", "S3Client", "S3Client", "join", "resolve", "spawn", "DescribeImagesCommand", "DescribeImagesCommand", "resolve", "spawn", "resolve", "readFileSync", "STSClient", "GetCallerIdentityCommand", "PutObjectCommand", "HeadObjectCommand", "HeadObjectCommand", "PutObjectCommand", "PutObjectCommand", "GetObjectCommand", "DeleteObjectCommand", "NoSuchKey", "PutObjectCommand", "GetObjectCommand", "NoSuchKey", "DeleteObjectCommand", "lockInfo", "resolve", "GetResourceCommand", "GetCallerIdentityCommand", "DescribeAvailabilityZonesCommand", "GetParameterCommand", "GetCallerIdentityCommand", "GetParameterCommand", "resolved", "value", "EC2Client", "DescribeVpcsCommand", "resolve", "DescribeAvailabilityZonesCommand", "GetResourceCommand", "resolve", "S3Client", "PutObjectCommand", "GetObjectCommand", "DeleteObjectCommand", "S3Client", "PutObjectCommand", "GetObjectCommand", "DeleteObjectCommand", "resolve", "PutRolePolicyCommand", "DeleteRolePolicyCommand", "NoSuchEntityException", "PutRolePolicyCommand", "DeleteRolePolicyCommand", "NoSuchEntityException", "RemoveRoleFromInstanceProfileCommand", "NoSuchEntityException", "RemoveRoleFromInstanceProfileCommand", "NoSuchEntityException", "PutUserPolicyCommand", "DeleteUserPolicyCommand", "PutGroupPolicyCommand", "DeleteGroupPolicyCommand", "NoSuchEntityException", "PutUserPolicyCommand", "NoSuchEntityException", "DeleteUserPolicyCommand", "PutGroupPolicyCommand", "DeleteGroupPolicyCommand", "CreateBucketCommand", "PutBucketVersioningCommand", "PutBucketEncryptionCommand", "PutBucketVersioningCommand", "PutBucketEncryptionCommand", "CreateBucketCommand", "PutBucketPolicyCommand", "NoSuchBucket", "PutBucketPolicyCommand", "NoSuchBucket", "GetCallerIdentityCommand", "GetCallerIdentityCommand", "SetQueueAttributesCommand", "SetQueueAttributesCommand", "NotFoundException", "NotFoundException", "SetTopicAttributesCommand", "SetTopicAttributesCommand", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "DescribeTableCommand", "ResourceNotFoundException", "DescribeTableCommand", "ResourceNotFoundException", "resolve", "TagResourceCommand", "UntagResourceCommand", "ResourceNotFoundException", "GetCallerIdentityCommand", "arn", "UntagResourceCommand", "TagResourceCommand", "ResourceNotFoundException", "GetCallerIdentityCommand", "TagResourceCommand", "UntagResourceCommand", "ResourceNotFoundException", "UntagResourceCommand", "TagResourceCommand", "ResourceNotFoundException", "TagResourceCommand", "UntagResourceCommand", "ResourceNotFoundException", "UntagResourceCommand", "TagResourceCommand", "ResourceNotFoundException", "RemoveTargetsCommand", "DeleteRuleCommand", "ListTargetsByRuleCommand", "TagResourceCommand", "UntagResourceCommand", "ResourceNotFoundException", "UntagResourceCommand", "TagResourceCommand", "ResourceNotFoundException", "ListTargetsByRuleCommand", "RemoveTargetsCommand", "DeleteRuleCommand", "DescribeVpcsCommand", "DescribeSubnetsCommand", "DescribeSecurityGroupsCommand", "DescribeVpcsCommand", "DescribeSecurityGroupsCommand", "resolve", "DescribeSubnetsCommand", "CreateResourceCommand", "DeleteResourceCommand", "NotFoundException", "NotFoundException", "CreateResourceCommand", "DeleteResourceCommand", "resolve", "CreateStageCommand", "DeleteStageCommand", "CreateRouteCommand", "DeleteRouteCommand", "CreateAuthorizerCommand", "DeleteAuthorizerCommand", "NotFoundException", "NotFoundException", "CreateStageCommand", "DeleteStageCommand", "CreateRouteCommand", "DeleteRouteCommand", "CreateAuthorizerCommand", "DeleteAuthorizerCommand", "GetCloudFrontOriginAccessIdentityCommand", "GetCloudFrontOriginAccessIdentityCommand", "resolve", "ResourceNotFoundException", "ResourceNotFoundException", "ElasticLoadBalancingV2Client", "DescribeLoadBalancersCommand", "ElasticLoadBalancingV2Client", "DescribeLoadBalancersCommand", "resolve", "Route53Client", "GetHostedZoneCommand", "ListHostedZonesByNameCommand", "Route53Client", "GetHostedZoneCommand", "ListHostedZonesByNameCommand", "ResourceNotFoundException", "ResourceNotFoundException", "resolve", "CreateServiceCommand", "DeleteServiceCommand", "STSClient", "GetCallerIdentityCommand", "STSClient", "CreateServiceCommand", "DeleteServiceCommand", "resolve", "GetCallerIdentityCommand", "CreateTableCommand", "DeleteTableCommand", "CreateTableCommand", "DeleteTableCommand", "KMSClient", "TagResourceCommand", "UntagResourceCommand", "NotFoundException", "KMSClient", "UntagResourceCommand", "TagResourceCommand", "NotFoundException", "ResourceNotFoundException", "ResourceNotFoundException", "resolve", "resolve", "ResourceNotFoundException", "ResourceNotFoundException", "resolve", "ResourceNotFoundException", "ResourceNotFoundException", "CreateBucketCommand", "DeleteBucketCommand", "ListObjectsV2Command", "DeleteObjectsCommand", "GetCallerIdentityCommand", "EC2Client", "DescribeAvailabilityZonesCommand", "EC2Client", "DescribeAvailabilityZonesCommand", "GetCallerIdentityCommand", "CreateBucketCommand", "DeleteBucketCommand", "ListObjectsV2Command", "DeleteObjectsCommand", "DeleteNamespaceCommand", "CreateTableCommand", "DeleteTableCommand", "NotFoundException", "NotFoundException", "DeleteTableCommand", "DeleteNamespaceCommand", "CreateTableCommand", "ECRClient", "TagResourceCommand", "ECRClient", "TagResourceCommand", "resolve", "STSClient", "GetCallerIdentityCommand", "region", "Command", "Command", "Command", "Command", "resolve", "Command", "Option", "Command", "Command", "Option", "Command", "Command", "Command"]
7
+ }