{
  "version": 3,
  "sources": ["../../../src/stacks/handler.ts"],
  "sourcesContent": ["import type {\n  ChangeDataCaptureConfig,\n  Model,\n} from '@code-like-a-carpenter/foundation-intermediate-representation';\n\nimport type {\n  AWSEventsRule,\n  AWSKMSKey,\n  AWSSQSQueue,\n  AWSSQSQueuePolicy,\n  Resource1,\n} from '../__generated__/json-schemas/serverless-application-model.ts';\nimport type {Config} from '../config.ts';\nimport {combineFragments} from '../fragments/combine-fragments.ts';\nimport {makeKmsKey} from '../fragments/kms-key.ts';\nimport {makeLogGroup} from '../fragments/log-group.ts';\nimport {filterNull} from '../helpers.ts';\nimport type {ServerlessApplicationModel} from '../types.ts';\n\nexport function isHandlerStack(resourceName: string) {\n  return resourceName.startsWith('FNDNSCDC');\n}\n\nexport function makeHandlerStackName(\n  model: Model,\n  cdc: ChangeDataCaptureConfig\n): string {\n  // Foundation Nested Stack CDC\n  return `FNDNSCDC${cdc.functionName}`;\n}\n\nexport function makeHandlerStack(config: Config): ServerlessApplicationModel {\n  const dlqName = 'DeadLetterQueue';\n  const fnName = 'Function';\n  const qKeyName = 'QueueKey';\n  const qName = 'Queue';\n  const qPolicyName = 'QueuePolicy';\n  const ruleName = 'Rule';\n\n  const KmsMasterKeyId = config.singleQueueKey\n    ? {Ref: 'ExternalKmsMasterKeyId'}\n    : {Ref: qKeyName};\n\n  const dlq: AWSSQSQueue = {\n    Properties: {\n      // @ts-expect-error typedef doesn't include intrinsic functions\n      KmsMasterKeyId: {\n        'Fn::If': ['UseKey', KmsMasterKeyId, 'AWS::NoValue'],\n      },\n    },\n    Type: 'AWS::SQS::Queue',\n  };\n\n  const fn: Resource1 = {\n    Metadata: {\n      BuildMethod: 'esbuild',\n      BuildProperties: {\n        EntryPoints: ['./index'],\n        External: config.buildProperties.external,\n        Minify: config.buildProperties.minify,\n        Sourcemap: config.buildProperties.sourcemap,\n        Target: config.buildProperties.target,\n      },\n    },\n    Properties: {\n      // @ts-expect-error - typedef doesn't include intrinsic functions\n      CodeUri: {Ref: 'CodeUri'},\n      Environment: {\n        Variables: {\n          TABLE_NAMES: {\n            Ref: 'TableNames',\n          },\n        },\n      },\n      Events: {\n        Stream: {\n          Properties: {\n            BatchSize: 10,\n            // @ts-expect-error typedef doesn't include this property yet\n            FunctionResponseTypes: ['ReportBatchItemFailures'],\n            Queue: {'Fn::GetAtt': [qName, 'Arn']},\n          },\n          Type: 'SQS',\n        },\n      },\n      MemorySize: {Ref: 'MemorySize'},\n      Policies: [\n        'AWSLambdaBasicExecutionRole',\n        'AWSLambda_ReadOnlyAccess',\n        'AWSXrayWriteOnlyAccess',\n        'CloudWatchLambdaInsightsExecutionRolePolicy',\n        {CloudWatchPutMetricPolicy: {}},\n        {\n          SQSSendMessagePolicy: {\n            QueueName: {\n              'Fn::GetAtt': [dlqName, 'QueueName'],\n            },\n          },\n        },\n      ].filter(filterNull),\n      Timeout: {Ref: 'Timeout'},\n    },\n    Type: 'AWS::Serverless::Function',\n  };\n\n  const qKey: AWSKMSKey = {\n    ...makeKmsKey(),\n    Condition: 'DefineKey',\n  };\n\n  const q: AWSSQSQueue = {\n    Properties: {\n      // @ts-expect-error typedef doesn't include intrinsic functions\n      'Fn::If': [\n        'UseKey',\n        {\n          KmsMasterKeyId,\n          RedrivePolicy: {\n            deadLetterTargetArn: {\n              'Fn::GetAtt': [dlqName, 'Arn'],\n            },\n            maxReceiveCount: 3,\n          },\n          VisibilityTimeout: 320,\n        },\n        {\n          RedrivePolicy: {\n            deadLetterTargetArn: {\n              'Fn::GetAtt': [dlqName, 'Arn'],\n            },\n            maxReceiveCount: 3,\n          },\n          VisibilityTimeout: 320,\n        },\n      ],\n    },\n    Type: 'AWS::SQS::Queue',\n  };\n\n  const qPolicy: AWSSQSQueuePolicy = {\n    Properties: {\n      PolicyDocument: {\n        Statement: [\n          {\n            Action: ['sqs:SendMessage'],\n            Condition: {\n              ArnEquals: {\n                'aws:SourceArn': {\n                  'Fn::GetAtt': [ruleName, 'Arn'],\n                },\n              },\n            },\n            Effect: 'Allow',\n            Principal: {\n              Service: 'events.amazonaws.com',\n            },\n            Resource: {\n              'Fn::GetAtt': [qName, 'Arn'],\n            },\n            Sid: 'Allow EventBridge to send messages to the queue',\n          },\n        ],\n      },\n      // @ts-expect-error typedef doesn't include intrinsic functions\n      Queues: [{Ref: qName}],\n    },\n    Type: 'AWS::SQS::QueuePolicy',\n  };\n\n  const rule: AWSEventsRule = {\n    Properties: {\n      EventBusName: 'default',\n      EventPattern: {\n        detail: {\n          dynamodb: {\n            NewImage: {\n              _et: {\n                S: [{Ref: 'SourceModelName'}],\n              },\n            },\n          },\n        },\n        'detail-type': {Ref: 'DetailType'},\n        resources: [{Ref: 'TableArn'}],\n        // eslint-disable-next-line no-template-curly-in-string\n        source: [{'Fn::Sub': '${TableName}.${SourceModelName}'}],\n      },\n      Targets: [\n        {\n          // @ts-expect-error typedef doesn't include intrinsic functions\n          Arn: {'Fn::GetAtt': [qName, 'Arn']},\n          Id: fnName,\n        },\n      ],\n    },\n    Type: 'AWS::Events::Rule',\n  };\n\n  return combineFragments(makeLogGroup({functionName: fnName}), {\n    AWSTemplateFormatVersion: '2010-09-09',\n    Conditions: config.singleQueueKey\n      ? {\n          HasExternalKey: {\n            'Fn::Not': [\n              {'Fn::Equals': [{Ref: 'ExternalKmsMasterKeyId'}, 'AWS::NoValue']},\n            ],\n          },\n          IsProd: {'Fn::Equals': [{Ref: 'StageName'}, 'production']},\n          UseKey: {\n            // The IsProd here is slightly redundant, but the goal is to ensure\n            // this fail in prod if not external key is defined.\n            'Fn::Or': [{Condition: 'HasExternalKey'}, {Condition: 'IsProd'}],\n          },\n        }\n      : {\n          DefineKey: {'Fn::And': [{Condition: 'IsProd'}]},\n          IsProd: {'Fn::Equals': [{Ref: 'StageName'}, 'production']},\n          UseKey: {Condition: 'DefineKey'},\n        },\n    Globals: {\n      Function: {\n        Handler: 'index.handler',\n        Runtime: 'nodejs22.x',\n        Tracing: 'Active',\n      },\n    },\n    Outputs: {\n      DeadLetterQueueArn: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-DeadLetterQueueArn'},\n        },\n        Value: {'Fn::GetAtt': [dlqName, 'Arn']},\n      },\n      DeadLetterQueueName: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-DeadLetterQueueName'},\n        },\n        Value: {Ref: dlqName},\n      },\n      FunctionArn: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-FunctionArn'},\n        },\n        Value: {'Fn::GetAtt': [fnName, 'Arn']},\n      },\n      FunctionName: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-FunctionName'},\n        },\n        Value: {Ref: fnName},\n      },\n      QueueArn: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-QueueArn'},\n        },\n        Value: {'Fn::GetAtt': [qName, 'Arn']},\n      },\n      QueueName: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-QueueName'},\n        },\n        Value: {Ref: qName},\n      },\n      Role: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-Role'},\n        },\n        Value: {Ref: `${fnName}Role`},\n      },\n      RuleName: {\n        Export: {\n          // eslint-disable-next-line no-template-curly-in-string\n          Name: {'Fn::Sub': '${AWS::StackName}-RuleName'},\n        },\n        Value: {Ref: ruleName},\n      },\n    },\n    Parameters: {\n      ...(config.singleQueueKey\n        ? {\n            ExternalKmsMasterKeyId: {\n              // We still need to allow this to be undefined in so that we can\n              // avoid generating the key in non-prod scenarios.\n              Default: 'AWS::NoValue',\n              Type: 'String',\n            },\n          }\n        : {}),\n      CodeUri: {Type: 'String'},\n      DetailType: {Type: 'CommaDelimitedList'},\n      MemorySize: {Type: 'Number'},\n      SourceModelName: {Type: 'String'},\n      StageName: {Type: 'String'},\n      TableArn: {Type: 'String'},\n      TableName: {Type: 'String'},\n      TableNames: {Type: 'String'},\n      Timeout: {Type: 'Number'},\n    },\n    Resources: {\n      ...(config.singleQueueKey ? {} : {[qKeyName]: qKey}),\n      [dlqName]: dlq,\n      [fnName]: fn,\n      [qName]: q,\n      [qPolicyName]: qPolicy,\n      [ruleName]: rule,\n    },\n    Transform: 'AWS::Serverless-2016-10-31',\n  });\n}\n"],
  "mappings": "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",
  "names": []
}
