@emarketeer/ts-microservice-commons 10.2.0 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/cdk/utils/naming.ts","../../../src/cdk/utils/tagging.ts","../../../src/cdk/utils/logs.ts","../../../src/cdk/utils/iam.ts","../../../src/cdk/utils/config.ts","../../../src/cdk/utils/constants.ts","../../../src/cdk/utils/handler-path.ts","../../../src/cdk/utils/bundling.ts","../../../src/cdk/constructs/lambda.ts","../../../src/cdk/constructs/dynamodb.ts","../../../src/cdk/constructs/api-gateway.ts","../../../src/cdk/constructs/sqs.ts","../../../src/cdk/constructs/sns.ts","../../../src/cdk/constructs/eventbridge.ts","../../../src/cdk/constructs/dlq-alarm.ts","../../../src/cdk/utils/serverless-migration.ts","../../../src/cdk/constructs/lambda-with-queue.ts","../../../src/cdk/constructs/service-lambda-with-queue.ts","../../../src/cdk/constructs/lambda-with-http-api.ts","../../../src/cdk/constructs/topic-queue-consumer.ts","../../../src/cdk/constructs/stack.ts","../../../src/cdk/utils/rds-vpc.ts","../../../src/cdk/utils/cdk-app.ts","../../../src/cdk/utils/account-rds-vpc.ts"],"sourcesContent":["/**\n * Stack naming conventions and utilities\n */\n\nimport { StackNamingConfig, Stage } from '../types'\n\n/**\n * Generate a standardized stack name\n * Format: {stage}-{serviceName}-stack\n */\nexport const generateStackName = (config: StackNamingConfig): string => {\n const { stage, serviceName } = config\n return `${stage}-${serviceName}-stack`\n}\n\n/**\n * Generate a standardized resource name\n * Format: {stage}-{serviceName}-{resourceType}-{resourceName}\n */\nexport const generateResourceName = (config: StackNamingConfig): string => {\n const { stage, serviceName, resourceType, resourceName } = config\n\n const parts = [stage, serviceName]\n\n if (resourceType) {\n parts.push(resourceType)\n }\n\n if (resourceName) {\n parts.push(resourceName)\n }\n\n return parts.join('-')\n}\n\n/**\n * Generate a standardized Lambda function name\n */\nexport const generateLambdaName = (\n stage: Stage,\n serviceName: string,\n functionName: string\n): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceName: functionName\n })\n}\n\n/**\n * Generate a standardized DynamoDB table name\n */\nexport const generateTableName = (stage: Stage, serviceName: string, tableName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'table',\n resourceName: tableName\n })\n}\n\n/**\n * Generate a standardized API Gateway name\n */\nexport const generateApiName = (stage: Stage, serviceName: string, apiName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'api',\n resourceName: apiName\n })\n}\n\n/**\n * Generate a standardized SQS queue name\n */\nexport const generateQueueName = (stage: Stage, serviceName: string, queueName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'queue',\n resourceName: queueName\n })\n}\n\n/**\n * Generate a standardized SNS topic name\n */\nexport const generateTopicName = (stage: Stage, serviceName: string, topicName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'topic',\n resourceName: topicName\n })\n}\n\n/**\n * Generate a standardized EventBridge rule name\n */\nexport const generateRuleName = (stage: Stage, serviceName: string, ruleName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'rule',\n resourceName: ruleName\n })\n}\n\n/**\n * Generate a standardized log group name\n */\nexport const generateLogGroupName = (\n stage: Stage,\n serviceName: string,\n resourceName: string\n): string => {\n return `${stage}-${serviceName}-${resourceName}`\n}\n\n/**\n * Generate a standardized IAM role name\n */\nexport const generateRoleName = (stage: Stage, serviceName: string, roleName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'role',\n resourceName: roleName\n })\n}\n\n/**\n * Validate stage value\n */\nexport const isValidStage = (stage: string): stage is Stage => {\n return ['dev', 'test', 'staging', 'prod'].includes(stage)\n}\n\n/**\n * Convert stage to uppercase for environment variables\n */\nexport const stageToUpperCase = (stage: Stage): string => {\n return stage.toUpperCase()\n}\n","/**\n * Tagging strategies and utilities\n */\n\nimport { Tags } from 'aws-cdk-lib'\nimport { Construct } from 'constructs'\nimport { TaggingConfig } from '../types'\n\n/**\n * Standard tags applied to all resources\n */\nexport interface StandardTags {\n Stage: string\n Service: string\n ManagedBy: string\n Owner?: string\n CostCenter?: string\n Project?: string\n}\n\n/**\n * Generate standard tags for a resource\n */\nexport const generateStandardTags = (config: TaggingConfig): StandardTags => {\n const tags: StandardTags = {\n Stage: config.stage,\n Service: config.serviceName,\n ManagedBy: 'CDK'\n }\n\n if (config.owner) {\n tags.Owner = config.owner\n }\n\n if (config.costCenter) {\n tags.CostCenter = config.costCenter\n }\n\n if (config.project) {\n tags.Project = config.project\n }\n\n return tags\n}\n\n/**\n * Apply standard tags to a construct\n */\nexport const applyStandardTags = (construct: Construct, config: TaggingConfig): void => {\n const standardTags = generateStandardTags(config)\n\n Object.entries(standardTags).forEach(([key, value]) => {\n if (value) {\n Tags.of(construct).add(key, value)\n }\n })\n\n if (config.customTags) {\n Object.entries(config.customTags).forEach(([key, value]) => {\n Tags.of(construct).add(key, value)\n })\n }\n}\n\n/**\n * Apply tags from a simple record\n */\nexport const applyTags = (construct: Construct, tags: Record<string, string>): void => {\n Object.entries(tags).forEach(([key, value]) => {\n Tags.of(construct).add(key, value)\n })\n}\n\n/**\n * Merge multiple tag sets\n */\nexport const mergeTags = (...tagSets: Record<string, string>[]): Record<string, string> => {\n return Object.assign({}, ...tagSets)\n}\n\n/**\n * Generate environment-specific tags\n */\nexport const getEnvironmentTags = (stage: string): Record<string, string> => {\n const tags: Record<string, string> = {\n Stage: stage\n }\n\n switch (stage) {\n case 'prod':\n tags.Environment = 'production'\n tags.Tier = 'production'\n break\n case 'staging':\n tags.Environment = 'staging'\n tags.Tier = 'pre-production'\n break\n case 'test':\n tags.Environment = 'test'\n tags.Tier = 'testing'\n break\n case 'dev':\n tags.Environment = 'development'\n tags.Tier = 'development'\n break\n }\n\n return tags\n}\n\n/**\n * Generate cost allocation tags\n */\nexport const getCostAllocationTags = (\n serviceName: string,\n costCenter?: string,\n project?: string\n): Record<string, string> => {\n const tags: Record<string, string> = {\n Service: serviceName\n }\n\n if (costCenter) {\n tags.CostCenter = costCenter\n }\n\n if (project) {\n tags.Project = project\n }\n\n return tags\n}\n\n/**\n * Generate compliance tags\n */\nexport const getComplianceTags = (\n dataClassification?: 'public' | 'internal' | 'confidential' | 'restricted',\n compliance?: string[]\n): Record<string, string> => {\n const tags: Record<string, string> = {}\n\n if (dataClassification) {\n tags.DataClassification = dataClassification\n }\n\n if (compliance && compliance.length > 0) {\n tags.Compliance = compliance.join(',')\n }\n\n return tags\n}\n","/**\n * CloudWatch log group configuration utilities\n */\n\nimport { RemovalPolicy } from 'aws-cdk-lib'\nimport { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'\nimport { Construct } from 'constructs'\nimport { LogGroupConfig, Stage } from '../types'\nimport { generateLogGroupName } from './naming'\n\n/**\n * Get retention days based on stage\n */\nexport const getLogRetentionDays = (stage: Stage): RetentionDays => {\n switch (stage) {\n case 'prod':\n return RetentionDays.ONE_MONTH\n case 'staging':\n return RetentionDays.TWO_WEEKS\n case 'test':\n return RetentionDays.ONE_WEEK\n case 'dev':\n return RetentionDays.THREE_DAYS\n default:\n // Stage is a compile-time union. A runtime value outside it means a\n // caller widened the type — fail loud rather than silently returning a\n // dev-shaped default for what may be a production deployment.\n throw new Error(`getLogRetentionDays: unknown stage \"${stage as string}\"`)\n }\n}\n\n/**\n * Convert retention days number to RetentionDays enum.\n *\n * Validates `days` against `RetentionDays`'s TS enum reverse-mapping (every\n * numeric enum member exposes its name as a string-keyed property — e.g.\n * `RetentionDays[1] === 'ONE_DAY'`). This catches typos without\n * hand-maintaining a switch in parallel with the SDK enum.\n *\n * `0` is rejected even though `RetentionDays.INFINITE === 0`: passing 0 from\n * a config object almost always means \"unset\" rather than \"retain forever\".\n * Callers that genuinely want INFINITE must pass `RetentionDays.INFINITE`\n * explicitly via a non-numeric path (or update this guard with a clear test).\n */\nexport const convertRetentionDays = (days?: number): RetentionDays | undefined => {\n if (days === undefined || days === null) return undefined\n\n if (days === 0) {\n throw new Error(\n 'logRetentionDays: 0 is not accepted (would map to RetentionDays.INFINITE). '\n + 'Pass RetentionDays.INFINITE explicitly if infinite retention is intended.'\n )\n }\n\n if (typeof (RetentionDays as Record<number, string | undefined>)[days] !== 'string') {\n const supported = Object.values(RetentionDays)\n .filter((v): v is number => typeof v === 'number')\n .sort((a, b) => a - b)\n .join(', ')\n throw new Error(`Unsupported logRetentionDays value: ${days}. Supported values: ${supported}`)\n }\n return days as RetentionDays\n}\n\n/**\n * Create a CloudWatch log group with standard configuration\n */\nexport const createLogGroup = (scope: Construct, id: string, config: LogGroupConfig): LogGroup => {\n const retentionDays = config.retentionDays\n ? convertRetentionDays(config.retentionDays)\n : getLogRetentionDays(config.stage)\n\n return new LogGroup(scope, id, {\n logGroupName: config.logGroupName,\n retention: retentionDays,\n removalPolicy: config.stage === 'prod' ? RemovalPolicy.RETAIN : RemovalPolicy.DESTROY\n })\n}\n\n/**\n * Create an API Gateway log group\n */\nexport const createApiGatewayLogGroup = (\n scope: Construct,\n id: string,\n stage: Stage,\n serviceName: string,\n apiName: string,\n retentionDays?: number\n): LogGroup => {\n const logGroupName = `/aws/apigateway/${generateLogGroupName(stage, serviceName, apiName)}`\n\n return createLogGroup(scope, id, {\n logGroupName,\n stage,\n retentionDays\n })\n}\n\n/**\n * Get removal policy based on stage\n */\nexport const getRemovalPolicy = (stage: Stage): RemovalPolicy => {\n switch (stage) {\n case 'prod':\n return RemovalPolicy.RETAIN\n case 'staging':\n case 'test':\n case 'dev':\n return RemovalPolicy.DESTROY\n default:\n // Same rationale as getLogRetentionDays: a typo like 'production' must\n // not silently produce DESTROY for what should be a retained resource.\n throw new Error(`getRemovalPolicy: unknown stage \"${stage as string}\"`)\n }\n}\n","import { Effect, PolicyStatement, Role, ServicePrincipal, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { IamRoleConfig } from '../types'\nimport { generateRoleName } from './naming'\n\n/**\n * Create a Lambda execution role with standard permissions\n */\nexport const createLambdaExecutionRole = (\n scope: Construct,\n id: string,\n config: IamRoleConfig\n): Role => {\n const roleName = generateRoleName(config.stage, config.serviceName, config.roleName)\n\n const role = new Role(scope, id, {\n roleName,\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n description: `Lambda execution role for ${config.serviceName}`,\n ...(config.inlinePolicies && { inlinePolicies: config.inlinePolicies })\n })\n\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')\n )\n\n config.managedPolicies?.forEach(policy => {\n role.addManagedPolicy(policy)\n })\n\n return role\n}\n\n/**\n * Create an X-Ray tracing policy statement\n */\nexport const createXRayTracingPolicy = (): PolicyStatement => {\n return new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['xray:PutTraceSegments', 'xray:PutTelemetryRecords'],\n resources: ['*']\n })\n}\n","import { Stack, Token } from 'aws-cdk-lib'\nimport { Construct } from 'constructs'\nimport { StringParameter } from 'aws-cdk-lib/aws-ssm'\nimport { Stage } from '../types'\n\nconst RECAP_DEV_SSM_KEY = 'recap-dev-sync-endpoint'\nconst recapDevEndpointCache = new WeakMap<Stack, string>()\n\nexport const RECAP_DEV_TIMEOUT_WINDOW_SECONDS = 300\n\n/**\n * Returns the standard base environment variables injected into every Lambda.\n * Centralised here so both EmLambdaFunction and LambdaWithQueue stay in sync.\n */\nexport const buildBaseEnvironment = (stage: Stage, scope: Construct): Record<string, string> => ({\n STAGE: stage,\n NODE_ENV: stage === 'prod' ? 'production' : 'development',\n REGION: Stack.of(scope).region,\n})\n\n/**\n * Returns the env var block to inject for recap.dev, or an empty object.\n *\n * The `dummy-value-` early-return guards against CDK's SSM lookup placeholder:\n * `valueFromLookup` returns `dummy-value-…` strings during the first synth\n * before the cache file is populated, and we must not bake those into the\n * Lambda's environment.\n */\nexport const buildRecapDevEnvironment = (endpoint: string | undefined): Record<string, string> => {\n if (!endpoint || endpoint.startsWith('dummy-value-')) {\n return {}\n }\n\n let parsed: URL\n try {\n parsed = new URL(endpoint)\n } catch {\n throw new Error(`recap.dev endpoint is not a valid URL: \"${endpoint}\"`)\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`recap.dev endpoint must use http or https, got: ${parsed.protocol}`)\n }\n\n return {\n RECAP_DEV_SYNC_ENDPOINT: endpoint,\n RECAP_DEV_TIMEOUT_WINDOW: String(RECAP_DEV_TIMEOUT_WINDOW_SECONDS)\n }\n}\n\n/**\n * Resolves the recap.dev sync endpoint from SSM at synth time.\n * Cached per stack so the SSM lookup happens once per stack\n * regardless of how many constructs call this.\n */\nexport const resolveRecapDevEndpoint = (scope: Construct): string | undefined => {\n const stack = Stack.of(scope)\n if (Token.isUnresolved(stack.account) || Token.isUnresolved(stack.region)) {\n return undefined\n }\n if (!recapDevEndpointCache.has(stack)) {\n recapDevEndpointCache.set(stack, StringParameter.valueFromLookup(stack, RECAP_DEV_SSM_KEY))\n }\n return recapDevEndpointCache.get(stack)!\n}\n","import { Runtime } from 'aws-cdk-lib/aws-lambda'\n\nexport const DEFAULT_LAMBDA_RUNTIME = Runtime.NODEJS_24_X\n","import * as path from 'path'\n\nconst DEFAULT_HANDLERS_DIR = 'src/handlers'\n\n/**\n * Public type for constructing handler path config. Enforces at compile time\n * that either `handlerPath` or `functionName` is provided — the runtime throw\n * in `resolveHandlerPath` is a safety net for internal callers that widen the type.\n */\nexport type HandlerPathConfig =\n | {\n readonly handlerPath: string\n readonly functionName?: string\n readonly handler?: string\n readonly codePath?: string\n }\n | {\n readonly handlerPath?: undefined\n readonly functionName: string\n readonly handler?: string\n readonly codePath?: string\n }\n\nexport interface ResolvedHandlerPath {\n readonly functionName: string\n readonly handler?: string\n /**\n * Absolute or project-relative path to the source TS handler file derived\n * from `handlerPath`. Unset when the caller provided an explicit `codePath`\n * (escape hatch — code is packaged as-is, no bundling).\n */\n readonly entryFile?: string\n /** Pass-through of an explicit `codePath` from the input config. */\n readonly codePath?: string\n}\n\n/**\n * Internal flat type accepted by `resolveHandlerPath`. Wider than `HandlerPathConfig`\n * so that internal call sites passing objects with both fields optional still compile.\n * The invariant is enforced at public API boundaries via `HandlerPathConfig`.\n */\ninterface HandlerPathInput {\n readonly handlerPath?: string\n readonly functionName?: string\n readonly handler?: string\n readonly codePath?: string\n}\n\n/**\n * Resolve `handlerPath` into `entryFile`, `handler`, and optionally `functionName`.\n *\n * Given `handlerPath: 'src/handlers/capture-screenshot/capture-screenshot-from-url'`:\n * - `entryFile` → `'src/handlers/capture-screenshot/capture-screenshot-from-url.ts'`\n * - `handler` → `'index.handler'`\n * - `functionName` → `'capture-screenshot-from-url'` (only when not explicitly provided)\n *\n * When `codePath` is provided, `entryFile` is left unset — the construct will\n * package `codePath` directly (no bundling).\n *\n * When `handlerPath` is not provided, `functionName` is required.\n */\nexport function resolveHandlerPath(config: HandlerPathInput): ResolvedHandlerPath {\n const { handlerPath } = config\n\n if (handlerPath) {\n const normalised = handlerPath.replace(/\\.ts$/, '')\n const startsWithHandlersDir = normalised.startsWith(`${DEFAULT_HANDLERS_DIR}/`)\n const containsSeparator = normalised.includes('/') || normalised.includes(path.sep)\n\n if (!startsWithHandlersDir && (path.isAbsolute(normalised) || containsSeparator)) {\n // A bare basename like 'get-data' is fine (treated as relative to\n // src/handlers). Anything with directory components must be rooted at\n // DEFAULT_HANDLERS_DIR — otherwise we'd silently produce e.g.\n // 'src/lambdas/foo.ts' and fail at synth with an opaque\n // Code.fromAsset error far from the call site.\n throw new Error(\n `resolveHandlerPath: handlerPath \"${handlerPath}\" must either be a bare basename or start with \"${DEFAULT_HANDLERS_DIR}/\".`\n )\n }\n\n const relative = startsWithHandlersDir\n ? normalised.slice(DEFAULT_HANDLERS_DIR.length + 1)\n : normalised\n\n return {\n functionName: config.functionName ?? path.basename(relative),\n handler: config.handler ?? 'index.handler',\n entryFile: config.codePath ? undefined : path.join(DEFAULT_HANDLERS_DIR, `${relative}.ts`),\n codePath: config.codePath\n }\n }\n\n if (!config.functionName) {\n throw new Error('Either `handlerPath` or `functionName` must be provided.')\n }\n\n return {\n functionName: config.functionName,\n handler: config.handler,\n codePath: config.codePath\n }\n}\n","import * as path from 'path'\nimport * as fs from 'fs'\nimport { execFileSync } from 'child_process'\nimport { AssetHashType, DockerImage } from 'aws-cdk-lib'\nimport { Code } from 'aws-cdk-lib/aws-lambda'\n\n/**\n * Per-handler esbuild overrides applied on top of the default bundler config\n * (Node 24, CJS, minified, externalised AWS SDK + DB drivers, recap.dev wrappers).\n *\n * `external` is appended to the default externals list. All other fields\n * replace their default. Plugins, entryPoints, outdir, bundle/platform/format\n * are not exposed — they are fixed by the bundler.\n */\nexport interface BundlingOverrides {\n readonly external?: string[]\n readonly target?: string | string[]\n readonly minify?: boolean\n readonly sourcemap?: boolean | 'linked' | 'inline' | 'external' | 'both'\n readonly define?: Record<string, string>\n readonly banner?: { js?: string; css?: string }\n readonly footer?: { js?: string; css?: string }\n readonly loader?: Record<string, string>\n readonly mainFields?: string[]\n readonly conditions?: string[]\n readonly keepNames?: boolean\n readonly treeShaking?: boolean\n readonly legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'external'\n readonly charset?: 'ascii' | 'utf8'\n readonly pure?: string[]\n}\n\nexport interface ResolveLambdaCodeOptions {\n /**\n * Source TS entry file (e.g. `src/handlers/foo.ts`).\n * Required when `codePath` is not provided.\n */\n readonly entryFile?: string\n /**\n * Pre-built directory passed straight to `Code.fromAsset` — bundling is skipped.\n * Use for migration or test scenarios where the code is already built.\n */\n readonly codePath?: string\n readonly bundling?: BundlingOverrides\n}\n\nconst HANDLER_BUNDLER_RELATIVE_PATH = path.join('dist', 'handler-bundler.js')\nconst PACKAGE_NAME = '@emarketeer/ts-microservice-commons'\n\nlet cachedBundlerPath: string | undefined\n\nfunction getHandlerBundlerPath(): string {\n if (cachedBundlerPath) {\n return cachedBundlerPath\n }\n const cwd = process.cwd()\n const candidates = [\n path.join(cwd, 'node_modules', PACKAGE_NAME, HANDLER_BUNDLER_RELATIVE_PATH),\n path.join(cwd, HANDLER_BUNDLER_RELATIVE_PATH)\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n cachedBundlerPath = candidate\n return candidate\n }\n }\n throw new Error(\n `Could not locate the handler bundler. Searched:\\n${candidates.map((c) => ` - ${c}`).join('\\n')}\\n`\n + `Ensure ${PACKAGE_NAME} is installed.`\n )\n}\n\n/**\n * Build the `Code` asset for a Lambda function.\n *\n * - When `codePath` is set, packages that directory directly (no bundling).\n * - Otherwise bundles `entryFile` via the project handler bundler at synth\n * time, with overrides applied on top of the defaults.\n *\n * Bundling uses `assetHashType: OUTPUT` so the asset hash is computed from\n * the bundled output rather than from the (transitive) source tree.\n */\nexport function resolveLambdaCode(options: ResolveLambdaCodeOptions): Code {\n if (options.codePath) {\n return Code.fromAsset(options.codePath)\n }\n if (!options.entryFile) {\n throw new Error('resolveLambdaCode: either `entryFile` or `codePath` is required.')\n }\n\n const entry = path.resolve(options.entryFile)\n if (!fs.existsSync(entry)) {\n throw new Error(`resolveLambdaCode: entry file not found: ${entry}`)\n }\n const overrides = options.bundling\n const bundlerPath = getHandlerBundlerPath()\n\n return Code.fromAsset(path.dirname(entry), {\n assetHashType: AssetHashType.OUTPUT,\n bundling: {\n // CDK requires `image` even when local bundling succeeds. We never use\n // the Docker fallback — `tryBundle` always returns true.\n image: DockerImage.fromRegistry('node:24'),\n local: {\n tryBundle(outputDir: string): boolean {\n const stdin = JSON.stringify({ entry, outDir: outputDir, overrides })\n execFileSync('node', [bundlerPath], {\n input: stdin,\n stdio: ['pipe', 'inherit', 'inherit']\n })\n return true\n }\n }\n }\n })\n}\n","import { Duration } from 'aws-cdk-lib'\nimport { Function as LambdaFunction, Tracing, Architecture } from 'aws-cdk-lib/aws-lambda'\nimport { IRole, IManagedPolicy, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { Construct } from 'constructs'\nimport { LambdaConfig } from '../types'\nimport { generateLambdaName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { convertRetentionDays, getLogRetentionDays, getRemovalPolicy } from '../utils/logs'\nimport { createLambdaExecutionRole } from '../utils/iam'\nimport { buildBaseEnvironment, buildRecapDevEnvironment, resolveRecapDevEndpoint } from '../utils/config'\nimport { DEFAULT_LAMBDA_RUNTIME } from '../utils/constants'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { resolveLambdaCode } from '../utils/bundling'\n\nexport class EmLambdaFunction extends Construct {\n public readonly function: LambdaFunction\n\n constructor(scope: Construct, id: string, config: LambdaConfig) {\n super(scope, id)\n\n const resolved = resolveHandlerPath(config)\n const functionName =\n config.physicalName ??\n generateLambdaName(config.stage, config.serviceName, resolved.functionName)\n\n const extraPolicies: IManagedPolicy[] = []\n if (config.vpcConfig) {\n extraPolicies.push(ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole'))\n }\n if (config.enableTracing) {\n extraPolicies.push(ManagedPolicy.fromAwsManagedPolicyName('AWSXRayDaemonWriteAccess'))\n }\n\n const role: IRole =\n config.role ??\n createLambdaExecutionRole(this, 'Role', {\n roleName: resolved.functionName,\n stage: config.stage,\n serviceName: config.serviceName,\n managedPolicies: extraPolicies.length ? extraPolicies : undefined\n })\n\n // When the caller supplies a role (typically EmStack's sharedRole during\n // Serverless migration) createLambdaExecutionRole is bypassed and the\n // VPC/X-Ray policies above are not attached. Attach them here so\n // vpcConfig/enableTracing produce a working role regardless of source.\n if (config.role) {\n extraPolicies.forEach(policy => role.addManagedPolicy(policy))\n }\n\n const logGroup: ILogGroup = config.importExistingLogGroup\n ? LogGroup.fromLogGroupName(this, `${id}LogGroup`, `/aws/lambda/${functionName}`)\n : new LogGroup(this, `${id}LogGroup`, {\n logGroupName: `/aws/lambda/${functionName}`,\n retention:\n convertRetentionDays(config.logRetentionDays) ?? getLogRetentionDays(config.stage),\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n const handler = resolved.handler ?? config.handler\n const codePath = resolved.codePath ?? config.codePath\n if (!handler) {\n throw new Error(\n `EmLambdaFunction requires either \\`handlerPath\\` or \\`handler\\` for \"${resolved.functionName}\".`\n )\n }\n if (!resolved.entryFile && !codePath) {\n throw new Error(\n `EmLambdaFunction requires either \\`handlerPath\\` or \\`codePath\\` for \"${resolved.functionName}\".`\n )\n }\n\n const code = resolveLambdaCode({\n entryFile: resolved.entryFile,\n codePath,\n bundling: config.bundling\n })\n\n this.function = new LambdaFunction(this, 'Function', {\n functionName,\n runtime: config.runtime ?? DEFAULT_LAMBDA_RUNTIME,\n handler,\n code,\n memorySize: config.memorySize ?? 1024,\n timeout: config.timeout ?? Duration.seconds(15),\n environment: {\n ...buildBaseEnvironment(config.stage, this),\n ...(config.environment ?? {}),\n ...buildRecapDevEnvironment(resolveRecapDevEndpoint(this))\n },\n role,\n architecture: config.architecture ?? Architecture.ARM_64,\n tracing: config.enableTracing ? Tracing.ACTIVE : Tracing.DISABLED,\n reservedConcurrentExecutions: config.reservedConcurrentExecutions,\n retryAttempts: config.retryAttempts,\n logGroup,\n layers: config.layers,\n description: `${config.serviceName} - ${resolved.functionName}`,\n ...(config.vpcConfig && {\n vpc: config.vpcConfig.vpc,\n vpcSubnets: config.vpcConfig.vpcSubnets,\n securityGroups: config.vpcConfig.securityGroups\n })\n })\n\n applyStandardTags(this.function, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n}\n","/**\n * Common DynamoDB table construct with standard configurations\n */\n\nimport {\n Table,\n AttributeType,\n BillingMode,\n CfnTable,\n StreamViewType,\n ProjectionType,\n TableEncryption\n} from 'aws-cdk-lib/aws-dynamodb'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { DynamoDBTableConfig, DynamoDBGSIConfig } from '../types'\nimport { generateTableName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getRemovalPolicy } from '../utils/logs'\n\n/**\n * Standard DynamoDB table construct with eMarketeer defaults\n */\nexport class EmDynamoDBTable extends Construct {\n public readonly table: Table\n\n constructor(scope: Construct, id: string, config: DynamoDBTableConfig) {\n super(scope, id)\n\n const tableName =\n config.rawTableName ?? generateTableName(config.stage, config.serviceName, config.tableName)\n\n // Create DynamoDB table\n this.table = new Table(this, 'Table', {\n tableName,\n partitionKey: config.partitionKey,\n sortKey: config.sortKey,\n billingMode: config.billingMode || BillingMode.PAY_PER_REQUEST,\n pointInTimeRecoverySpecification: {\n pointInTimeRecoveryEnabled: config.pointInTimeRecovery ?? config.stage === 'prod'\n },\n deletionProtection: config.deletionProtection ?? config.stage === 'prod',\n stream: config.stream ? StreamViewType.NEW_AND_OLD_IMAGES : undefined,\n timeToLiveAttribute: config.timeToLiveAttribute,\n encryption: TableEncryption.AWS_MANAGED,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n if (config.overrideLogicalId) {\n const cfnTable = this.table.node.defaultChild\n if (!(cfnTable instanceof CfnTable)) {\n throw new Error(\n `Cannot override table logical ID to \"${config.overrideLogicalId}\": ` +\n 'table does not have a CfnTable default child.'\n )\n }\n cfnTable.overrideLogicalId(config.overrideLogicalId)\n }\n\n // Add Global Secondary Indexes\n if (config.globalSecondaryIndexes) {\n config.globalSecondaryIndexes.forEach(gsi => {\n this.addGlobalSecondaryIndex(gsi)\n })\n }\n\n // Apply standard tags\n applyStandardTags(this.table, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Add a Global Secondary Index to the table\n */\n private addGlobalSecondaryIndex(gsiConfig: DynamoDBGSIConfig): void {\n this.table.addGlobalSecondaryIndex({\n indexName: gsiConfig.indexName,\n partitionKey: gsiConfig.partitionKey,\n sortKey: gsiConfig.sortKey,\n projectionType: gsiConfig.projectionType || ProjectionType.ALL,\n nonKeyAttributes: gsiConfig.nonKeyAttributes\n })\n }\n\n /**\n * Get the table\n */\n public getTable(): Table {\n return this.table\n }\n\n /**\n * Get the table ARN\n */\n public getTableArn(): string {\n return this.table.tableArn\n }\n\n /**\n * Get the table name\n */\n public getTableName(): string {\n return this.table.tableName\n }\n\n /**\n * Grant read permissions to a grantee\n */\n public grantReadData(grantee: IGrantable) {\n return this.table.grantReadData(grantee)\n }\n\n /**\n * Grant write permissions to a grantee\n */\n public grantWriteData(grantee: IGrantable) {\n return this.table.grantWriteData(grantee)\n }\n\n /**\n * Grant read/write permissions to a grantee\n */\n public grantReadWriteData(grantee: IGrantable) {\n return this.table.grantReadWriteData(grantee)\n }\n\n /**\n * Grant stream read permissions to a grantee\n */\n public grantStreamRead(grantee: IGrantable) {\n return this.table.grantStreamRead(grantee)\n }\n}\n\n/**\n * Helper function to create a DynamoDB table with single-table design pattern\n */\nexport const createSingleTable = (\n scope: Construct,\n id: string,\n config: Omit<DynamoDBTableConfig, 'partitionKey' | 'sortKey'>\n): EmDynamoDBTable => {\n return new EmDynamoDBTable(scope, id, {\n ...config,\n partitionKey: {\n name: 'PK',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'SK',\n type: AttributeType.STRING\n }\n })\n}\n\n/**\n * Helper function to create a simple key-value table\n */\nexport const createKeyValueTable = (\n scope: Construct,\n id: string,\n config: Omit<DynamoDBTableConfig, 'partitionKey'>\n): EmDynamoDBTable => {\n return new EmDynamoDBTable(scope, id, {\n ...config,\n partitionKey: {\n name: 'id',\n type: AttributeType.STRING\n }\n })\n}\n\n/**\n * Common GSI configurations\n */\nexport const GSI_PATTERNS = {\n /**\n * GSI for querying by a secondary attribute\n */\n byAttribute: (attributeName: string, indexName?: string): DynamoDBGSIConfig => ({\n indexName: indexName || `${attributeName}Index`,\n partitionKey: {\n name: attributeName,\n type: AttributeType.STRING\n },\n projectionType: ProjectionType.ALL\n }),\n\n /**\n * GSI for querying by status and timestamp\n */\n byStatusAndTimestamp: (indexName = 'StatusTimestampIndex'): DynamoDBGSIConfig => ({\n indexName,\n partitionKey: {\n name: 'status',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'timestamp',\n type: AttributeType.NUMBER\n },\n projectionType: ProjectionType.ALL\n }),\n\n /**\n * GSI for single-table design pattern\n */\n singleTableGSI: (indexName = 'GSI1'): DynamoDBGSIConfig => ({\n indexName,\n partitionKey: {\n name: 'GSI1PK',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'GSI1SK',\n type: AttributeType.STRING\n },\n projectionType: ProjectionType.ALL\n })\n}\n","/**\n * Common API Gateway constructs (REST API and HTTP API)\n */\n\nimport {\n RestApi,\n LambdaIntegration,\n LambdaIntegrationOptions,\n Cors,\n LogGroupLogDestination,\n AccessLogFormat,\n MethodLoggingLevel,\n EndpointType,\n CfnBasePathMapping\n} from 'aws-cdk-lib/aws-apigateway'\nimport {\n HttpApi,\n HttpStage,\n CorsHttpMethod,\n HttpMethod,\n PayloadFormatVersion,\n DomainName,\n ApiMapping,\n CfnApiMapping\n} from 'aws-cdk-lib/aws-apigatewayv2'\nimport { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'\nimport { Certificate } from 'aws-cdk-lib/aws-certificatemanager'\nimport { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda'\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { createHash } from 'crypto'\nimport { Construct } from 'constructs'\nimport { RestApiConfig, HttpApiConfig } from '../types'\nimport { generateApiName, generateLogGroupName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { createApiGatewayLogGroup } from '../utils/logs'\n\n/**\n * Standard REST API construct with eMarketeer defaults\n */\nexport class EmRestApi extends Construct {\n public readonly api: RestApi\n public readonly logGroup: ILogGroup\n\n constructor(scope: Construct, id: string, config: RestApiConfig) {\n super(scope, id)\n\n const apiName = generateApiName(config.stage, config.serviceName, config.apiName)\n\n // Create or import log group\n this.logGroup = config.importExistingLogGroup\n ? LogGroup.fromLogGroupName(\n this,\n 'LogGroup',\n `/aws/apigateway/${generateLogGroupName(\n config.stage,\n config.serviceName,\n config.apiName\n )}`\n )\n : createApiGatewayLogGroup(this, 'LogGroup', config.stage, config.serviceName, config.apiName)\n\n // Create REST API\n this.api = new RestApi(this, 'Api', {\n restApiName: apiName,\n description: config.description || `${config.serviceName} REST API`,\n deployOptions: {\n stageName: config.deployOptions?.stageName ?? config.stage,\n throttlingRateLimit: config.deployOptions?.throttleRateLimit ?? 10000,\n throttlingBurstLimit: config.deployOptions?.throttleBurstLimit ?? 5000,\n loggingLevel: this.getLoggingLevel(config.deployOptions?.loggingLevel),\n dataTraceEnabled: config.deployOptions?.dataTraceEnabled ?? false,\n metricsEnabled: config.deployOptions?.metricsEnabled ?? true,\n accessLogDestination: new LogGroupLogDestination(this.logGroup),\n accessLogFormat: AccessLogFormat.jsonWithStandardFields()\n },\n defaultCorsPreflightOptions: config.defaultCorsOptions\n ? {\n allowOrigins: config.defaultCorsOptions.allowOrigins ?? Cors.ALL_ORIGINS,\n allowMethods: config.defaultCorsOptions.allowMethods || Cors.ALL_METHODS,\n allowHeaders: config.defaultCorsOptions.allowHeaders || Cors.DEFAULT_HEADERS,\n allowCredentials: config.defaultCorsOptions.allowCredentials\n }\n : undefined,\n endpointTypes: [this.resolveEndpointType(config.endpointType)],\n binaryMediaTypes: config.binaryMediaTypes,\n policy: undefined\n })\n\n // Apply standard tags\n applyStandardTags(this.api, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n private resolveEndpointType(type?: 'EDGE' | 'REGIONAL' | 'PRIVATE'): EndpointType {\n switch (type) {\n case 'EDGE':\n return EndpointType.EDGE\n case 'PRIVATE':\n return EndpointType.PRIVATE\n default:\n return EndpointType.REGIONAL\n }\n }\n\n /**\n * Get logging level enum from string\n */\n private getLoggingLevel(level?: string): MethodLoggingLevel {\n switch (level?.toUpperCase()) {\n case 'ERROR':\n return MethodLoggingLevel.ERROR\n case 'INFO':\n return MethodLoggingLevel.INFO\n case 'OFF':\n return MethodLoggingLevel.OFF\n default:\n return MethodLoggingLevel.INFO\n }\n }\n\n /**\n * Add a Lambda integration to a path\n */\n public addLambdaIntegration(\n path: string,\n method: string,\n handler: LambdaFunction,\n options?: LambdaIntegrationOptions\n ) {\n const resource = this.api.root.resourceForPath(path)\n const integration = new LambdaIntegration(handler, options)\n return resource.addMethod(method, integration)\n }\n\n /**\n * Add a base path mapping to an existing custom domain.\n *\n * Use this when the domain was created externally (e.g. by serverless-domain-manager)\n * and you just need to point a base path at this API's deployment stage.\n *\n * @param domainName - The custom domain name (e.g. `'api.example.com'`)\n * @param options - Optional basePath (defaults to `''`) and logical ID override\n * @returns The CfnBasePathMapping resource\n *\n * @example\n * ```typescript\n * const mapping = restApi.addBasePathMapping('api.example.com', {\n * basePath: 'screenshots',\n * logicalId: 'ScreenshotBasePathMapping',\n * })\n * ```\n */\n public addBasePathMapping(\n domainName: string,\n options?: { basePath?: string; logicalId?: string }\n ): CfnBasePathMapping {\n const basePath = options?.basePath ?? ''\n const id = options?.logicalId ?? `${domainName.replace(/\\./g, '')}BasePathMapping`\n\n const mapping = new CfnBasePathMapping(this, id, {\n domainName,\n restApiId: this.api.restApiId,\n stage: this.api.deploymentStage.stageName,\n basePath: basePath || undefined\n })\n\n mapping.node.addDependency(this.api)\n\n if (options?.logicalId) {\n mapping.overrideLogicalId(options.logicalId)\n }\n\n return mapping\n }\n\n /**\n * Add a V2 API mapping to an existing custom domain.\n *\n * Use this instead of `addBasePathMapping` when the domain was created by\n * serverless-domain-manager (which uses API Gateway V2 API mappings, not\n * V1 base path mappings).\n *\n * @param domainName - The custom domain name (e.g. `'api.example.com'`)\n * @param options - Optional basePath and logical ID override\n * @returns The CfnApiMapping resource\n *\n * @example\n * ```typescript\n * restApi.addApiMapping('api.example.com', {\n * basePath: 'forms',\n * logicalId: 'FormsApiMapping',\n * })\n * ```\n */\n public addApiMapping(\n domainName: string,\n options?: { basePath?: string; logicalId?: string }\n ): CfnApiMapping {\n const basePath = options?.basePath ?? ''\n const id = options?.logicalId ?? `${domainName.replace(/\\./g, '')}ApiMapping`\n\n const mapping = new CfnApiMapping(this, id, {\n apiId: this.api.restApiId,\n domainName,\n stage: this.api.deploymentStage.stageName,\n apiMappingKey: basePath || undefined\n })\n\n mapping.node.addDependency(this.api)\n\n if (options?.logicalId) {\n mapping.overrideLogicalId(options.logicalId)\n }\n\n return mapping\n }\n\n /**\n * Get the API\n */\n public getApi(): RestApi {\n return this.api\n }\n\n /**\n * Get the API URL\n */\n public getApiUrl(): string {\n return this.api.url\n }\n\n /**\n * Get the API ID\n */\n public getApiId(): string {\n return this.api.restApiId\n }\n}\n\n/**\n * Standard HTTP API construct with eMarketeer defaults\n */\nexport class EmHttpApi extends Construct {\n public readonly api: HttpApi\n\n public readonly defaultStage: HttpStage\n\n private readonly domainNames = new Map<string, DomainName>()\n\n constructor(scope: Construct, id: string, config: HttpApiConfig) {\n super(scope, id)\n\n const apiName = generateApiName(config.stage, config.serviceName, config.apiName)\n\n // Create HTTP API\n this.api = new HttpApi(this, 'Api', {\n apiName,\n description: config.description || `${config.serviceName} HTTP API`,\n createDefaultStage: false,\n corsPreflight: config.corsOptions\n ? {\n allowOrigins: config.corsOptions.allowOrigins ?? ['*'],\n allowMethods: config.corsOptions.allowMethods?.map(m => this.parseHttpMethod(m)) || [\n CorsHttpMethod.GET,\n CorsHttpMethod.POST,\n CorsHttpMethod.PUT,\n CorsHttpMethod.DELETE,\n CorsHttpMethod.OPTIONS\n ],\n allowHeaders: config.corsOptions.allowHeaders || ['Content-Type', 'Authorization'],\n allowCredentials: config.corsOptions.allowCredentials,\n maxAge: config.corsOptions.maxAge\n }\n : undefined\n })\n\n this.defaultStage = new HttpStage(this, 'DefaultStage', {\n httpApi: this.api,\n stageName: '$default',\n autoDeploy: true,\n ...(config.throttle && {\n throttle: {\n rateLimit: config.throttle.rateLimit,\n burstLimit: config.throttle.burstLimit\n }\n })\n })\n\n // Apply standard tags\n applyStandardTags(this.api, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Parse HTTP method string to enum\n */\n private parseHttpMethod(method: string): CorsHttpMethod {\n const methodMap: Record<string, CorsHttpMethod> = {\n GET: CorsHttpMethod.GET,\n POST: CorsHttpMethod.POST,\n PUT: CorsHttpMethod.PUT,\n DELETE: CorsHttpMethod.DELETE,\n PATCH: CorsHttpMethod.PATCH,\n HEAD: CorsHttpMethod.HEAD,\n OPTIONS: CorsHttpMethod.OPTIONS,\n ANY: CorsHttpMethod.ANY\n }\n const resolved = methodMap[method.toUpperCase()]\n if (!resolved) {\n throw new Error(\n `Unknown HTTP method: \"${method}\". Valid values: ${Object.keys(methodMap).join(', ')}`\n )\n }\n return resolved\n }\n\n /**\n * Add a Lambda integration to a route\n */\n public addLambdaIntegration(path: string, method: string, handler: LambdaFunction) {\n const id = `${createHash('sha256')\n .update(path + method)\n .digest('hex')\n .slice(0, 8)}Integration`\n const integration = new HttpLambdaIntegration(id, handler, {\n payloadFormatVersion: PayloadFormatVersion.VERSION_2_0\n })\n\n return this.api.addRoutes({\n path,\n methods: [this.parseHttpMethodV2(method)],\n integration\n })\n }\n\n /**\n * Parse HTTP method string to HttpMethod enum\n */\n private parseHttpMethodV2(method: string): HttpMethod {\n const methodMap: Record<string, HttpMethod> = {\n GET: HttpMethod.GET,\n POST: HttpMethod.POST,\n PUT: HttpMethod.PUT,\n DELETE: HttpMethod.DELETE,\n PATCH: HttpMethod.PATCH,\n HEAD: HttpMethod.HEAD,\n OPTIONS: HttpMethod.OPTIONS,\n ANY: HttpMethod.ANY\n }\n const resolved = methodMap[method.toUpperCase()]\n if (!resolved) {\n throw new Error(\n `Unknown HTTP method: \"${method}\". Valid values: ${Object.keys(methodMap).join(', ')}`\n )\n }\n return resolved\n }\n\n /**\n * Attach a custom domain with base path mapping to this HTTP API.\n * Returns the full base URL (e.g. https://api.example.com/mypath).\n */\n public addCustomDomain(domainName: string, certificateArn: string, basePath: string): string {\n const normalisedPath = basePath.trim().replace(/^\\/+/, '').replace(/\\/+$/, '')\n const mappingHash = createHash('sha256')\n .update(domainName + normalisedPath)\n .digest('hex')\n .slice(0, 8)\n\n let domain = this.domainNames.get(domainName)\n if (!domain) {\n const domainHash = createHash('sha256')\n .update(domainName)\n .digest('hex')\n .slice(0, 8)\n const certificate = Certificate.fromCertificateArn(\n this,\n `${domainHash}Certificate`,\n certificateArn\n )\n domain = new DomainName(this, `${domainHash}Domain`, { domainName, certificate })\n this.domainNames.set(domainName, domain)\n }\n\n new ApiMapping(this, `${mappingHash}Mapping`, {\n api: this.api,\n domainName: domain,\n ...(normalisedPath && { apiMappingKey: normalisedPath })\n })\n\n return normalisedPath ? `https://${domainName}/${normalisedPath}` : `https://${domainName}`\n }\n\n /**\n * Get the API\n */\n public getApi(): HttpApi {\n return this.api\n }\n\n /**\n * Get the API URL\n */\n public getApiUrl(): string {\n return this.defaultStage.url\n }\n\n /**\n * Get the API ID\n */\n public getApiId(): string {\n return this.api.httpApiId\n }\n}\n\n/**\n * Helper function to create a REST API\n */\nexport const createRestApi = (scope: Construct, id: string, config: RestApiConfig): EmRestApi => {\n return new EmRestApi(scope, id, config)\n}\n\n/**\n * Helper function to create an HTTP API\n */\nexport const createHttpApi = (scope: Construct, id: string, config: HttpApiConfig): EmHttpApi => {\n return new EmHttpApi(scope, id, config)\n}\n","/**\n * Common SQS queue construct with standard configurations\n */\n\nimport { Aws, Duration } from 'aws-cdk-lib'\nimport { Queue, QueueEncryption, DeadLetterQueue } from 'aws-cdk-lib/aws-sqs'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { SqsQueueConfig, Stage } from '../types'\nimport { generateQueueName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getRemovalPolicy } from '../utils/logs'\n\n/**\n * Standard SQS queue construct with eMarketeer defaults\n */\nexport class EmSqsQueue extends Construct {\n public readonly queue: Queue\n public readonly deadLetterQueue?: Queue\n\n constructor(scope: Construct, id: string, config: SqsQueueConfig) {\n super(scope, id)\n\n const queueName = generateQueueName(config.stage, config.serviceName, config.queueName)\n\n // Create Dead Letter Queue if enabled\n if (config.enableDLQ) {\n const dlqName = `${queueName}-dlq`\n this.deadLetterQueue = new Queue(this, 'DLQ', {\n queueName: dlqName,\n retentionPeriod: config.dlqRetentionPeriod || Duration.days(14),\n encryption: QueueEncryption.SQS_MANAGED,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n applyStandardTags(this.deadLetterQueue, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n // Create main queue\n this.queue = new Queue(this, 'Queue', {\n queueName: config.fifo ? `${queueName}.fifo` : queueName,\n visibilityTimeout: config.visibilityTimeout || Duration.seconds(30),\n retentionPeriod: config.retentionPeriod || Duration.days(4),\n receiveMessageWaitTime: config.receiveMessageWaitTime || Duration.seconds(0),\n encryption: QueueEncryption.SQS_MANAGED,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined,\n deadLetterQueue: this.deadLetterQueue\n ? {\n queue: this.deadLetterQueue,\n maxReceiveCount: config.maxReceiveCount || 3\n }\n : undefined,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n // Apply standard tags\n applyStandardTags(this.queue, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Get the queue\n */\n public getQueue(): Queue {\n return this.queue\n }\n\n /**\n * Get the queue ARN\n */\n public getQueueArn(): string {\n return this.queue.queueArn\n }\n\n /**\n * Get the queue URL\n */\n public getQueueUrl(): string {\n return this.queue.queueUrl\n }\n\n /**\n * Get the queue name\n */\n public getQueueName(): string {\n return this.queue.queueName\n }\n\n /**\n * Get the dead letter queue\n */\n public getDeadLetterQueue(): Queue | undefined {\n return this.deadLetterQueue\n }\n\n /**\n * Grant send messages permissions to a grantee\n */\n public grantSendMessages(grantee: IGrantable) {\n return this.queue.grantSendMessages(grantee)\n }\n\n /**\n * Grant consume messages permissions to a grantee\n */\n public grantConsumeMessages(grantee: IGrantable) {\n return this.queue.grantConsumeMessages(grantee)\n }\n\n /**\n * Build an SQS queue URL by name convention.\n * Returns `https://sqs.{region}.amazonaws.com/{account}/{stage}-{queueName}`.\n *\n * @example\n * ```typescript\n * const url = EmSqsQueue.urlFromName(this, 'dev', 'em-contacts-service-contact-source')\n * ```\n */\n static urlFromName(scope: Construct, stage: Stage, queueName: string): string {\n const fullName = `${stage}-${queueName}`\n return `https://sqs.${Aws.REGION}.amazonaws.com/${Aws.ACCOUNT_ID}/${fullName}`\n }\n}\n\n/**\n * Helper function to create an SQS queue\n */\nexport const createQueue = (scope: Construct, id: string, config: SqsQueueConfig): EmSqsQueue => {\n return new EmSqsQueue(scope, id, config)\n}\n\n/**\n * Helper function to create a FIFO queue\n */\nexport const createFifoQueue = (\n scope: Construct,\n id: string,\n config: Omit<SqsQueueConfig, 'fifo'>\n): EmSqsQueue => {\n return new EmSqsQueue(scope, id, {\n ...config,\n fifo: true,\n contentBasedDeduplication: true\n })\n}\n\n/**\n * Helper function to create a queue with DLQ\n */\nexport const createQueueWithDLQ = (\n scope: Construct,\n id: string,\n config: Omit<SqsQueueConfig, 'enableDLQ'>\n): EmSqsQueue => {\n return new EmSqsQueue(scope, id, {\n ...config,\n enableDLQ: true\n })\n}\n","/**\n * Common SNS topic construct with standard configurations\n */\n\nimport { Aws } from 'aws-cdk-lib'\nimport { CfnTopic, ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport {\n EmailSubscription,\n LambdaSubscription,\n SqsSubscription\n} from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Queue } from 'aws-cdk-lib/aws-sqs'\nimport { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { SnsTopicConfig, Stage } from '../types'\nimport { generateTopicName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\n\n/**\n * Standard SNS topic construct with eMarketeer defaults\n */\nexport class EmSnsTopic extends Construct {\n public readonly topic: Topic\n\n constructor(scope: Construct, id: string, config: SnsTopicConfig) {\n super(scope, id)\n\n const topicName =\n config.rawTopicName ?? generateTopicName(config.stage, config.serviceName, config.topicName)\n\n // Create topic\n this.topic = new Topic(this, 'Topic', {\n topicName: config.fifo ? `${topicName}.fifo` : topicName,\n displayName: config.displayName || topicName,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined\n })\n\n if (config.overrideLogicalId) {\n ;(this.topic.node.defaultChild as CfnTopic).overrideLogicalId(config.overrideLogicalId)\n }\n\n // Apply standard tags\n applyStandardTags(this.topic, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Import an external SNS topic by name convention.\n *\n * Builds the ARN as `arn:{partition}:sns:{region}:{account}:{stage}-{topicName}`\n * and returns an `ITopic` reference.\n *\n * @example\n * ```typescript\n * const contactEventTopic = EmSnsTopic.fromName(this, 'ContactEvent', {\n * stage: 'dev',\n * topicName: 'emarketeer-event-contact-event',\n * })\n * // ARN: arn:aws:sns:eu-west-1:123456789012:dev-emarketeer-event-contact-event\n * ```\n */\n static fromName(\n scope: Construct,\n id: string,\n config: { stage: Stage; topicName: string }\n ): ITopic {\n const fullName = `${config.stage}-${config.topicName}`\n const arn = `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${fullName}`\n return Topic.fromTopicArn(scope, id, arn)\n }\n\n /**\n * Get the topic\n */\n public getTopic(): Topic {\n return this.topic\n }\n\n /**\n * Get the topic ARN\n */\n public getTopicArn(): string {\n return this.topic.topicArn\n }\n\n /**\n * Get the topic name\n */\n public getTopicName(): string {\n return this.topic.topicName\n }\n\n /**\n * Add an email subscription\n */\n public addEmailSubscription(email: string) {\n return this.topic.addSubscription(new EmailSubscription(email))\n }\n\n /**\n * Add a Lambda subscription\n */\n public addLambdaSubscription(lambda: LambdaFunction) {\n return this.topic.addSubscription(new LambdaSubscription(lambda))\n }\n\n /**\n * Add an SQS subscription\n */\n public addSqsSubscription(queue: Queue, rawMessageDelivery = false) {\n return this.topic.addSubscription(\n new SqsSubscription(queue, {\n rawMessageDelivery\n })\n )\n }\n\n /**\n * Grant publish permissions to a grantee\n */\n public grantPublish(grantee: IGrantable) {\n return this.topic.grantPublish(grantee)\n }\n}\n\n/**\n * Helper function to create an SNS topic\n */\nexport const createTopic = (scope: Construct, id: string, config: SnsTopicConfig): EmSnsTopic => {\n return new EmSnsTopic(scope, id, config)\n}\n\n/**\n * Helper function to create a FIFO topic\n */\nexport const createFifoTopic = (\n scope: Construct,\n id: string,\n config: Omit<SnsTopicConfig, 'fifo'>\n): EmSnsTopic => {\n return new EmSnsTopic(scope, id, {\n ...config,\n fifo: true,\n contentBasedDeduplication: true\n })\n}\n","/**\n * Common EventBridge rule construct with standard configurations\n */\n\nimport { Rule, RuleProps, RuleTargetInput, Schedule } from 'aws-cdk-lib/aws-events'\nimport { LambdaFunction, SqsQueue, SnsTopic } from 'aws-cdk-lib/aws-events-targets'\nimport { Function as Lambda } from 'aws-cdk-lib/aws-lambda'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\nimport { Construct } from 'constructs'\nimport { EventBridgeRuleConfig } from '../types'\nimport { generateRuleName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\n\n/**\n * Standard EventBridge rule construct with eMarketeer defaults\n */\nexport class EmEventBridgeRule extends Construct {\n public readonly rule: Rule\n\n constructor(scope: Construct, id: string, config: EventBridgeRuleConfig) {\n super(scope, id)\n\n const ruleName = generateRuleName(config.stage, config.serviceName, config.ruleName)\n\n if (!config.eventPattern && !config.schedule) {\n throw new Error('Either eventPattern or schedule must be provided')\n }\n\n if (config.eventPattern && config.schedule) {\n throw new Error('Only one of eventPattern or schedule can be provided, not both')\n }\n\n const ruleProps: RuleProps = {\n ruleName,\n description: config.description || `${config.serviceName} - ${config.ruleName}`,\n enabled: config.enabled ?? true,\n ...(config.eventPattern && { eventPattern: config.eventPattern }),\n ...(config.schedule && { schedule: Schedule.expression(config.schedule) })\n }\n\n this.rule = new Rule(this, 'Rule', ruleProps)\n\n // Apply standard tags\n applyStandardTags(this.rule, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Get the rule\n */\n public getRule(): Rule {\n return this.rule\n }\n\n /**\n * Get the rule ARN\n */\n public getRuleArn(): string {\n return this.rule.ruleArn\n }\n\n /**\n * Get the rule name\n */\n public getRuleName(): string {\n return this.rule.ruleName\n }\n\n /**\n * Add a Lambda function as a target\n */\n public addLambdaTarget(lambda: Lambda, input?: RuleTargetInput) {\n this.rule.addTarget(\n new LambdaFunction(lambda, {\n event: input\n })\n )\n }\n\n /**\n * Add an SQS queue as a target\n */\n public addSqsTarget(queue: IQueue, input?: RuleTargetInput) {\n this.rule.addTarget(\n new SqsQueue(queue, {\n message: input\n })\n )\n }\n\n /**\n * Add an SNS topic as a target\n */\n public addSnsTarget(topic: ITopic, input?: RuleTargetInput) {\n this.rule.addTarget(\n new SnsTopic(topic, {\n message: input\n })\n )\n }\n}\n\n/**\n * Helper function to create an EventBridge rule\n */\nexport const createEventBridgeRule = (\n scope: Construct,\n id: string,\n config: EventBridgeRuleConfig\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Helper function to create a scheduled rule\n */\nexport const createScheduledRule = (\n scope: Construct,\n id: string,\n config: Omit<EventBridgeRuleConfig, 'eventPattern'> &\n Required<Pick<EventBridgeRuleConfig, 'schedule'>>\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Helper function to create an event pattern rule\n */\nexport const createEventPatternRule = (\n scope: Construct,\n id: string,\n config: Omit<EventBridgeRuleConfig, 'schedule'> &\n Required<Pick<EventBridgeRuleConfig, 'eventPattern'>>\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Common event patterns\n */\nexport const EVENT_PATTERNS = {\n /**\n * Match all events from a specific source\n */\n fromSource: (source: string) => ({\n source: [source]\n }),\n\n /**\n * Match specific detail type\n */\n detailType: (detailType: string) => ({\n detailType: [detailType]\n }),\n\n /**\n * Match events from a source with a specific detail type\n */\n sourceAndDetailType: (source: string, detailType: string) => ({\n source: [source],\n detailType: [detailType]\n }),\n\n /**\n * Match S3 object created events\n */\n s3ObjectCreated: (bucketName?: string) => ({\n source: ['aws.s3'],\n detailType: ['Object Created'],\n ...(bucketName ? { detail: { bucket: { name: [bucketName] } } } : {})\n }),\n\n /**\n * Match DynamoDB stream events\n */\n dynamoDbStream: (tableName?: string) => ({\n source: ['aws.dynamodb'],\n ...(tableName ? { resources: [{ prefix: `arn:aws:dynamodb:*:*:table/${tableName}` }] } : {})\n })\n}\n","import { Construct } from 'constructs'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { Alarm, CfnAlarm, ComparisonOperator, TreatMissingData } from 'aws-cdk-lib/aws-cloudwatch'\nimport { SnsAction } from 'aws-cdk-lib/aws-cloudwatch-actions'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\n\nexport interface DlqAlarmProps {\n dlq: IQueue\n alarmName: string\n alarmTopic: ITopic\n /**\n * Migration only: pins the CloudFormation logical ID of the alarm so it\n * matches an existing Serverless-generated CFN alarm during in-place\n * Serverless→CDK migration. Omit for new stacks.\n */\n alarmLogicalId?: string\n}\n\nexport class DlqAlarm extends Construct {\n public readonly alarm: Alarm\n\n constructor(scope: Construct, id: string, props: DlqAlarmProps) {\n super(scope, id)\n\n this.alarm = new Alarm(this, 'Alarm', {\n alarmName: props.alarmName,\n metric: props.dlq.metricApproximateNumberOfMessagesVisible(),\n threshold: 0,\n comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,\n evaluationPeriods: 1,\n treatMissingData: TreatMissingData.NOT_BREACHING\n })\n\n this.alarm.addAlarmAction(new SnsAction(props.alarmTopic))\n\n if (props.alarmLogicalId) {\n const cfnAlarm = this.alarm.node.defaultChild\n if (!(cfnAlarm instanceof CfnAlarm)) {\n throw new Error(\n `Cannot override alarm logical ID \"${props.alarmLogicalId}\": defaultChild is not a CfnAlarm.`\n )\n }\n cfnAlarm.overrideLogicalId(props.alarmLogicalId)\n }\n }\n}\n","import { CfnOutput, Duration, RemovalPolicy, Token } from 'aws-cdk-lib'\nimport {\n Function as LambdaFunction,\n CfnFunction,\n CfnPermission,\n ILayerVersion,\n CfnLayerVersion\n} from 'aws-cdk-lib/aws-lambda'\nimport { CfnLogGroup } from 'aws-cdk-lib/aws-logs'\nimport { CfnRole } from 'aws-cdk-lib/aws-iam'\nimport { CfnSubscription, CfnSubscriptionProps, ITopic } from 'aws-cdk-lib/aws-sns'\nimport { Queue, CfnQueue, CfnQueuePolicy, CfnQueuePolicyProps } from 'aws-cdk-lib/aws-sqs'\nimport { Table, CfnTable, TableProps, BillingMode } from 'aws-cdk-lib/aws-dynamodb'\nimport { Construct } from 'constructs'\nimport { DlqAlarm } from '../constructs/dlq-alarm'\nimport { Stage } from '../types'\nimport { getRemovalPolicy } from './logs'\n\n/**\n * Convert a Serverless Framework function name to its CloudFormation logical ID prefix.\n *\n * Matches the Serverless Framework's normalisation algorithm:\n * 1. Replace hyphens with \"Dash\", underscores with \"Underscore\"\n * 2. Capitalize the first character\n *\n * Example: 'capture-screenshot-from-url' -> 'CaptureDashscreenshotDashfromDashurl'\n */\nexport const toServerlessLogicalIdPrefix = (functionName: string): string => {\n const normalized = functionName.replace(/-/g, 'Dash').replace(/_/g, 'Underscore')\n return normalized.charAt(0).toUpperCase() + normalized.slice(1)\n}\n\n/**\n * Override the logical ID of a Lambda function's CfnFunction to match\n * Serverless Framework naming: {prefix}LambdaFunction\n */\nconst overrideLambdaLogicalId = (fn: LambdaFunction, serverlessFunctionName: string): void => {\n const prefix = toServerlessLogicalIdPrefix(serverlessFunctionName)\n const cfnFunction = fn.node.defaultChild\n\n if (!(cfnFunction instanceof CfnFunction)) {\n throw new Error(\n `Cannot override Lambda logical ID for \"${serverlessFunctionName}\": ` +\n 'the function does not have a CfnFunction default child. ' +\n 'Imported functions (e.g. via Function.fromFunctionArn) cannot have their logical IDs overridden.'\n )\n }\n\n cfnFunction.overrideLogicalId(`${prefix}LambdaFunction`)\n}\n\n/**\n * Override the logical ID of a log group to match Serverless Framework naming: {prefix}LogGroup.\n * Sets removal policy to RETAIN to prevent CloudFormation from deleting existing log data.\n */\nconst overrideLogGroupLogicalId = (logGroup: Construct, serverlessFunctionName: string): void => {\n const prefix = toServerlessLogicalIdPrefix(serverlessFunctionName)\n const defaultChild = logGroup.node.defaultChild\n\n if (!(defaultChild instanceof CfnLogGroup)) {\n throw new Error(\n `Cannot override log group logical ID for \"${serverlessFunctionName}\": ` +\n 'the log group does not have a CfnLogGroup default child. ' +\n 'Imported log groups (e.g. via importExistingLogGroup) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(`${prefix}LogGroup`)\n defaultChild.applyRemovalPolicy(RemovalPolicy.RETAIN)\n}\n\n/**\n * Override both the Lambda function and its associated log group logical IDs.\n * This is the primary convenience function for Serverless-to-CDK migration — one\n * call per migrated function.\n *\n * - Sets the function logical ID to {prefix}LambdaFunction\n * - Sets the log group logical ID to {prefix}LogGroup\n * - Sets the log group removal policy to RETAIN (prevents log deletion during migration)\n *\n * Only works with functions that have explicit (non-imported) log groups.\n *\n * @example\n * ```typescript\n * import { overrideFunctionLogicalIds } from '@emarketeer/ts-microservice-commons/cdk'\n *\n * const fn = new EmLambdaFunction(this, 'MyFunction', { ... })\n * overrideFunctionLogicalIds(fn.function, 'my-function')\n * ```\n */\nexport const overrideFunctionLogicalIds = (\n fn: LambdaFunction,\n serverlessFunctionName: string\n): void => {\n overrideLambdaLogicalId(fn, serverlessFunctionName)\n const logGroup = fn.logGroup\n if (!(logGroup instanceof Construct)) {\n throw new Error(\n `Cannot override log group logical ID for \"${serverlessFunctionName}\": ` +\n 'fn.logGroup is not a Construct. ' +\n 'Imported log groups (importExistingLogGroup: true) cannot have their logical IDs overridden.'\n )\n }\n overrideLogGroupLogicalId(logGroup, serverlessFunctionName)\n}\n\n/**\n * Override a Lambda layer's logical ID.\n *\n * Serverless Framework uses the layer key from serverless.yml as the logical ID,\n * typically in the form '{LayerName}LambdaLayer'.\n *\n * Only works with layers created in this stack, not imported layers.\n *\n * @param logicalId - The full logical ID to set (e.g. 'ChromiumLayerLambdaLayer')\n */\nexport const overrideLayerLogicalId = (layer: ILayerVersion, logicalId: string): void => {\n const defaultChild = (layer as Construct).node.defaultChild\n\n if (!(defaultChild instanceof CfnLayerVersion)) {\n throw new Error(\n `Cannot override logical ID \"${logicalId}\": the layer does not have a CfnLayerVersion default child. ` +\n 'Imported layers (e.g. via LayerVersion.fromLayerVersionArn) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(logicalId)\n}\n\n/**\n * Override an IAM role's logical ID.\n * Defaults to 'IamRoleLambdaExecution' — the standard Serverless Framework\n * shared execution role logical ID.\n *\n * Only works with roles created in this stack, not imported roles.\n */\nexport const overrideRoleLogicalId = (\n role: Construct,\n logicalId = 'IamRoleLambdaExecution',\n options?: {\n /** Override RoleName. Required when live Serverless stack used a specific role name. */\n readonly roleName?: string\n /**\n * Delete Path from the template. Serverless never emits Path; CDK always writes Path: \"/\".\n * A mismatch causes role replacement. Set true to prevent it.\n */\n readonly deletePath?: boolean\n }\n): void => {\n const defaultChild = role.node.defaultChild\n\n if (!(defaultChild instanceof CfnRole)) {\n throw new Error(\n 'Cannot override role logical ID: the role does not have a CfnRole default child. ' +\n 'Imported roles (e.g. via Role.fromRoleArn) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(logicalId)\n\n if (options?.roleName) {\n defaultChild.addPropertyOverride('RoleName', options.roleName)\n }\n\n if (options?.deletePath) {\n defaultChild.addPropertyDeletionOverride('Path')\n }\n}\n\nexport interface ServerlessCompatibleOutputProps {\n readonly serviceName: string\n readonly stage: string\n readonly outputKey: string\n readonly value: string\n readonly description?: string\n}\n\n/**\n * Create a CfnOutput with a Serverless Framework-compatible export name.\n * Export pattern: sls-{serviceName}-{stage}-{outputKey}\n */\nexport const createServerlessCompatibleOutput = (\n scope: Construct,\n id: string,\n props: ServerlessCompatibleOutputProps\n): CfnOutput =>\n new CfnOutput(scope, id, {\n value: props.value,\n description: props.description,\n exportName: `sls-${props.serviceName}-${props.stage}-${props.outputKey}`\n })\n\nexport interface MakeServerlessQueueOpts {\n /** Override visibility timeout. Defaults to 900 seconds (Serverless convention). */\n readonly visibilityTimeout?: Duration\n /** Max times a message is received before moving to DLQ. Defaults to 3. */\n readonly maxReceiveCount?: number\n /**\n * When provided, creates a DlqAlarm on the DLQ.\n * Uses the DlqAlarm commons construct.\n */\n readonly alarm?: {\n readonly name: string\n readonly topic: ITopic\n /** CloudFormation logical ID override for the alarm. Use during Serverless-to-CDK migrations. */\n readonly logicalId?: string\n }\n}\n\n/**\n * Creates an SQS queue with a dead-letter queue using the names and logical IDs\n * from the existing Serverless stack.\n *\n * Use this during Serverless to CDK migrations when the queues already exist.\n * The queue and DLQ logical IDs must match the CloudFormation resources created\n * by Serverless, otherwise CloudFormation can replace the queues during deploy.\n *\n * Production queues are retained. Other stages use the shared removal policy\n * from `getRemovalPolicy()`. The DLQ message retention is set to 14 days.\n *\n * @example\n * ```typescript\n * const alarmTopic = (scope as EmStack).alarmTopic()\n * const { queue, dlq } = makeServerlessQueue(\n * scope, 'MqlEventsQueue', 'MqlEventsQueueDLQ',\n * `${svc}-mql-event-queue`, `${svc}-mql-event-queue-dlq`,\n * stage,\n * { alarm: { name: 'MqlEventsQueueDLQAlarm', topic: alarmTopic } },\n * )\n * ```\n */\nexport function makeServerlessQueue(\n scope: Construct,\n queueLogicalId: string,\n dlqLogicalId: string,\n queueName: string,\n dlqName: string,\n stage: Stage,\n opts: MakeServerlessQueueOpts = {}\n): { queue: Queue; dlq: Queue } {\n const removalPolicy = getRemovalPolicy(stage)\n\n const dlq = new Queue(scope, dlqLogicalId, {\n queueName: dlqName,\n retentionPeriod: Duration.days(14),\n removalPolicy\n })\n const cfnDlq = dlq.node.defaultChild\n if (!(cfnDlq instanceof CfnQueue)) {\n throw new Error(\n `Cannot override DLQ logical ID \"${dlqLogicalId}\": defaultChild is not a CfnQueue.`\n )\n }\n cfnDlq.overrideLogicalId(dlqLogicalId)\n\n const queue = new Queue(scope, queueLogicalId, {\n queueName,\n visibilityTimeout: opts.visibilityTimeout ?? Duration.seconds(900),\n deadLetterQueue: { queue: dlq, maxReceiveCount: opts.maxReceiveCount ?? 3 },\n removalPolicy\n })\n const cfnQueue = queue.node.defaultChild\n if (!(cfnQueue instanceof CfnQueue)) {\n throw new Error(\n `Cannot override queue logical ID \"${queueLogicalId}\": defaultChild is not a CfnQueue.`\n )\n }\n cfnQueue.overrideLogicalId(queueLogicalId)\n\n if (opts.alarm) {\n new DlqAlarm(scope, `${queueLogicalId}DLQAlarm`, {\n dlq,\n alarmName: opts.alarm.name,\n alarmTopic: opts.alarm.topic,\n alarmLogicalId: opts.alarm.logicalId\n })\n }\n\n return { queue, dlq }\n}\n\n/**\n * Creates an SNS to SQS subscription with the same logical ID as the existing\n * Serverless resource.\n *\n * Use this when migrating an existing subscription from Serverless to CDK.\n * `topic.addSubscription(new SqsSubscription(queue))` lets CDK generate the\n * logical ID, which usually does not match the resource already in CloudFormation.\n * That can cause the subscription to be replaced during deployment.\n *\n * Both the construct ID and CloudFormation logical ID are set from `logicalId`.\n *\n * **Queue policy not included.** Unlike CDK's `SqsSubscription`, this helper only\n * creates the `AWS::SNS::Subscription`. It does NOT create an `AWS::SQS::QueuePolicy`\n * allowing SNS to send to the queue. On migrated stacks the policy was already created\n * by Serverless Framework — use `makeServerlessQueuePolicy` to preserve it with the\n * correct logical ID. On new queues call `makeServerlessQueuePolicy` (or use the CDK\n * `SqsSubscription` helper instead) to ensure SNS can deliver messages.\n *\n * @example\n * ```typescript\n * makeSnsToSqsSubscription(scope, 'TenantPurgeSubscription', {\n * topicArn: `arn:aws:sns:${region}:${accountId}:${stage}-emarketeer-event-purge-tenant-data`,\n * endpoint: queues.tenantPurgeQueue.queue.queueArn,\n * protocol: 'sqs',\n * rawMessageDelivery: true,\n * })\n * // Also preserve (or create) the matching queue policy:\n * makeServerlessQueuePolicy(scope, 'TenantPurgeSQSPolicy', { ... })\n * ```\n */\nexport function makeSnsToSqsSubscription(\n scope: Construct,\n logicalId: string,\n props: Omit<CfnSubscriptionProps, 'protocol'> & { readonly protocol: 'sqs' }\n): CfnSubscription {\n const sub = new CfnSubscription(scope, logicalId, props)\n sub.overrideLogicalId(logicalId)\n return sub\n}\n\n/**\n * Creates an SNS to Lambda subscription and matching invoke permission using\n * logical IDs from the existing Serverless stack.\n *\n * Use this when migrating an existing SNS Lambda trigger to CDK. The normal CDK\n * subscription helper generates its own logical IDs, so it can replace the\n * Serverless-created subscription and permission during deploy. For SNS Lambda\n * subscriptions that means events published during the replacement window are lost.\n *\n * Pass literal ARN strings for both the topic and Lambda function. Avoid using\n * `topic.topicArn` or `function.functionArn` here, since changes in the generated\n * CloudFormation expression can still force replacement even when the final ARN is\n * the same.\n *\n * The Lambda function must have a fixed `physicalName`, otherwise the function ARN\n * cannot be written safely by hand.\n *\n * Check the live CloudFormation stack for the subscription and permission logical\n * IDs before using this helper:\n *\n * ```bash\n * aws cloudformation list-stack-resources --stack-name <stack-name> \\\n * --query \"StackResourceSummaries[?ResourceType=='AWS::SNS::Subscription' ||\n * ResourceType=='AWS::Lambda::Permission'].[LogicalResourceId,ResourceType]\" \\\n * --output table\n * ```\n *\n * @example\n * ```typescript\n * const stagePrefix = stage.charAt(0).toUpperCase() + stage.slice(1)\n * makeSnsToLambdaSubscription(\n * scope,\n * `HandleDashorderDashcreatedSnsSubscription${stagePrefix}myserviceeventordercreated`,\n * `HandleDashorderDashcreatedLambdaPermission${stagePrefix}myserviceeventordercreatedSNS`,\n * {\n * topicArn: `arn:aws:sns:eu-west-1:${accountId}:${stage}-my-service-event-order-created`,\n * functionArn: `arn:aws:lambda:eu-west-1:${accountId}:function:my-service-${stage}-handle-order-created`,\n * }\n * )\n * ```\n */\nexport function makeSnsToLambdaSubscription(\n scope: Construct,\n subscriptionLogicalId: string,\n permissionLogicalId: string,\n props: {\n readonly topicArn: string\n readonly functionArn: string\n }\n): { subscription: CfnSubscription; permission: CfnPermission } {\n if (Token.isUnresolved(props.topicArn) || Token.isUnresolved(props.functionArn)) {\n throw new Error(\n 'makeSnsToLambdaSubscription requires literal ARN strings, not CDK tokens. ' +\n 'Using topic.topicArn or function.functionArn produces a CloudFormation expression whose ' +\n 'rendered form can change independently of the resolved ARN, forcing subscription replacement. ' +\n 'Pass the physical ARN as a string literal (e.g. `arn:aws:sns:eu-west-1:${accountId}:${stage}-my-topic`).'\n )\n }\n\n const subscription = new CfnSubscription(scope, subscriptionLogicalId, {\n topicArn: props.topicArn,\n protocol: 'lambda',\n endpoint: props.functionArn,\n })\n subscription.overrideLogicalId(subscriptionLogicalId)\n\n const permission = new CfnPermission(scope, permissionLogicalId, {\n action: 'lambda:InvokeFunction',\n functionName: props.functionArn,\n principal: 'sns.amazonaws.com',\n sourceArn: props.topicArn,\n })\n permission.overrideLogicalId(permissionLogicalId)\n subscription.addDependency(permission)\n\n return { subscription, permission }\n}\n\n/**\n * Creates an SQS queue policy using the logical ID from the existing Serverless\n * stack.\n *\n * Use this for migrated queues instead of `queue.addToResourcePolicy()`. The CDK\n * helper creates its own logical ID, which usually does not match the\n * `AWS::SQS::QueuePolicy` resource already managed by CloudFormation.\n *\n * Both the construct ID and CloudFormation logical ID are set from `logicalId`.\n *\n * @example\n * ```typescript\n * makeServerlessQueuePolicy(scope, 'MqlEventSQSPolicy', {\n * queues: [queues.mqlEventsQueue.queue.queueUrl],\n * policyDocument: {\n * Version: '2012-10-17',\n * Statement: [{\n * Effect: 'Allow', Principal: '*', Action: 'sqs:SendMessage', Resource: '*',\n * // Keep the policy limited to the SNS topic that sends to this queue.\n * Condition: { ArnEquals: { 'aws:SourceArn': `arn:aws:sns:...` } },\n * }],\n * },\n * })\n * ```\n */\nexport function makeServerlessQueuePolicy(\n scope: Construct,\n logicalId: string,\n props: CfnQueuePolicyProps\n): CfnQueuePolicy {\n const policy = new CfnQueuePolicy(scope, logicalId, props)\n policy.overrideLogicalId(logicalId)\n return policy\n}\n\n/**\n * Creates a DynamoDB table with the physical name and logical ID used by the\n * existing Serverless stack.\n *\n * Use this when moving an existing Serverless-managed table to CDK. The logical\n * ID should be copied from the CloudFormation resource, usually the resource key\n * from `serverless.yml`. If it does not match, CloudFormation may replace the\n * table during deploy.\n *\n * Defaults used by this helper:\n * - billing mode is PAY_PER_REQUEST\n * - point-in-time recovery is enabled only in prod\n * - removal policy is RETAIN in prod and DESTROY in other stages\n *\n * @example\n * ```typescript\n * const table = makeServerlessDynamoTable(scope, 'LeadCountTable', `${stage}-em-my-service-lead-count`, stage, {\n * partitionKey: { name: 'streamId', type: AttributeType.STRING },\n * sortKey: { name: 'day', type: AttributeType.NUMBER },\n * })\n * ```\n */\nexport function makeServerlessDynamoTable(\n scope: Construct,\n logicalId: string,\n tableName: string,\n stage: Stage,\n options: Omit<\n TableProps,\n | 'tableName'\n | 'billingMode'\n | 'pointInTimeRecovery'\n | 'pointInTimeRecoverySpecification'\n | 'removalPolicy'\n >\n): Table {\n const table = new Table(scope, logicalId, {\n tableName,\n billingMode: BillingMode.PAY_PER_REQUEST,\n pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: stage === 'prod' },\n removalPolicy: getRemovalPolicy(stage),\n ...options\n })\n const cfnTable = table.node.defaultChild\n if (!(cfnTable instanceof CfnTable)) {\n throw new Error(\n `Cannot override DynamoDB table logical ID \"${logicalId}\": defaultChild is not a CfnTable. ` +\n 'Imported tables cannot have their logical IDs overridden.'\n )\n }\n cfnTable.overrideLogicalId(logicalId)\n return table\n}\n","import { Annotations, Duration } from 'aws-cdk-lib'\nimport { CfnQueue, Queue, IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources'\nimport {\n Function as LambdaFunction,\n Architecture,\n Runtime,\n Tracing\n} from 'aws-cdk-lib/aws-lambda'\nimport { IRole, Role, ServicePrincipal, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscription, SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Construct } from 'constructs'\nimport { Stage, VpcConfig } from '../types'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getLogRetentionDays, getRemovalPolicy } from '../utils/logs'\nimport { buildBaseEnvironment, buildRecapDevEnvironment, resolveRecapDevEndpoint } from '../utils/config'\nimport { DEFAULT_LAMBDA_RUNTIME } from '../utils/constants'\nimport { generateLambdaName } from '../utils/naming'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { resolveLambdaCode, BundlingOverrides } from '../utils/bundling'\nimport { makeSnsToSqsSubscription, overrideFunctionLogicalIds } from '../utils/serverless-migration'\nimport { DlqAlarm } from './dlq-alarm'\n\n/**\n * Props for `LambdaWithQueue`. The `handlerPath` / `functionName` / `handler`\n * / `codePath` fields mirror `LambdaConfig` — `resolveHandlerPath()` throws at\n * synth if neither `handlerPath` nor `functionName` is provided.\n *\n * (`LambdaConfig` uses a discriminated `HandlerPathConfig` intersection at\n * compile time; we keep this type loose because `TopicQueueConsumerProps\n * extends LambdaWithQueueProps` and `EmStack.createQueueConsumer` merges\n * partial defaults — both patterns break against a union-shaped base.)\n */\nexport interface LambdaWithQueueProps {\n /** Lambda function name. Required when `handlerPath` is not provided. */\n readonly functionName?: string\n readonly queueName: string\n /** Short name used for codePath default and alarm naming. Defaults to functionName. */\n readonly resourceName?: string\n readonly handler?: string\n readonly codePath?: string\n /**\n * Source handler path, same as `EmStack.createFunction()`.\n * Derives `functionName`, `handler`, and `codePath` from the path.\n */\n readonly handlerPath?: string\n readonly reservedConcurrency?: number\n readonly batchSize?: number\n readonly reportBatchItemFailures?: boolean\n readonly stage: Stage\n readonly serviceName: string\n readonly environment?: Record<string, string>\n /** Lambda memory in MB. Defaults to 1024. */\n readonly memorySize?: number\n /** Lambda timeout. Defaults to 15 seconds. */\n readonly timeout?: Duration\n /** Enable X-Ray tracing. Defaults to true. */\n readonly enableTracing?: boolean\n readonly tags?: Record<string, string>\n /** IAM role name. Required when `role` is not provided. */\n readonly roleName?: string\n /** Provide an existing IAM role instead of creating one. When set, `roleName` is ignored. */\n readonly role?: IRole\n readonly alarmTopic: ITopic\n /** Override DLQ name. Defaults to `{queueName}-dlq`. */\n readonly dlqName?: string\n /** Override alarm name. Defaults to `{stage}-{serviceName}-{resourceName}-dlq-alarm`. */\n readonly alarmName?: string\n readonly additionalQueues?: IQueue[]\n readonly maxReceiveCount?: number\n /** Override queue visibility timeout. Defaults to `max(30s, timeout * 3)`. */\n readonly visibilityTimeout?: Duration\n readonly maxBatchingWindow?: Duration\n readonly maxConcurrency?: number\n readonly vpcConfig?: VpcConfig\n readonly architecture?: Architecture\n readonly runtime?: Runtime\n /** Per-handler esbuild overrides. Ignored when `codePath` is set. */\n readonly bundling?: BundlingOverrides\n /**\n * Migration-only: use this exact Lambda function name instead of the name\n * generated by `generateLambdaName()`.\n *\n * Needed when an existing Serverless function uses a legacy physical name\n * that CDK must keep during migration. The same name is used for the\n * Lambda log group path.\n *\n * Does NOT change the CloudFormation logical ID. For Serverless migrations,\n * also set `serverlessFunctionName` when the Lambda and log group logical\n * IDs need to match the existing Serverless stack. See\n * `LambdaConfig.physicalName` for the same migration caveat on\n * `EmStack.createFunction()`.\n */\n readonly physicalName?: string\n /**\n * Migration-only: Serverless function name for logical ID overrides.\n * Overrides Lambda + log group logical IDs to match Serverless Framework naming.\n */\n readonly serverlessFunctionName?: string\n /**\n * Override CloudFormation logical IDs for queue resources (migration mode).\n */\n readonly overrideLogicalIds?: {\n readonly queue?: string\n readonly dlq?: string\n readonly alarm?: string\n }\n}\n\nexport class LambdaWithQueue extends Construct {\n public readonly function: LambdaFunction\n\n public readonly queue: Queue\n\n public readonly dlq: Queue\n\n public readonly dlqAlarm: DlqAlarm\n\n constructor(scope: Construct, id: string, props: LambdaWithQueueProps) {\n super(scope, id)\n\n const resolved = resolveHandlerPath(props)\n const shortName = resolved.functionName\n const resourceName = props.resourceName ?? shortName\n const functionName = props.physicalName ?? generateLambdaName(props.stage, props.serviceName, shortName)\n const handler = resolved.handler ?? props.handler ?? 'index.handler'\n const codePath = resolved.codePath ?? props.codePath\n if (!resolved.entryFile && !codePath) {\n throw new Error(\n `LambdaWithQueue requires either \\`handlerPath\\` or \\`codePath\\` for \"${shortName}\".`\n )\n }\n const code = resolveLambdaCode({\n entryFile: resolved.entryFile,\n codePath,\n bundling: props.bundling\n })\n\n if (props.reservedConcurrency === 0) {\n throw new Error(\n `reservedConcurrency:0 disables the Lambda entirely for ${shortName}. Omit the prop to use account-level concurrency.`\n )\n }\n\n const {\n batchSize = 10,\n reportBatchItemFailures = true,\n additionalQueues = [],\n maxReceiveCount = 3\n } = props\n\n const memorySize = props.memorySize ?? 1024\n const timeout = props.timeout ?? Duration.seconds(15)\n const enableTracing = props.enableTracing ?? true\n\n this.dlq = new Queue(this, 'DLQ', {\n queueName: props.dlqName ?? `${props.queueName}-dlq`,\n retentionPeriod: Duration.days(14),\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n this.queue = new Queue(this, 'Queue', {\n queueName: props.queueName,\n visibilityTimeout:\n props.visibilityTimeout ?? Duration.seconds(Math.max(30, timeout.toSeconds() * 3)),\n retentionPeriod: Duration.days(4),\n deadLetterQueue: {\n queue: this.dlq,\n maxReceiveCount\n },\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n const role: IRole = props.role ?? this.createRole(props, enableTracing)\n\n const logGroup = new LogGroup(this, 'LogGroup', {\n logGroupName: `/aws/lambda/${functionName}`,\n retention: getLogRetentionDays(props.stage),\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n this.function = new LambdaFunction(this, 'Function', {\n functionName,\n runtime: props.runtime ?? DEFAULT_LAMBDA_RUNTIME,\n handler,\n code,\n architecture: props.architecture ?? Architecture.ARM_64,\n memorySize,\n timeout,\n environment: {\n ...buildBaseEnvironment(props.stage, this),\n ...(props.environment ?? {}),\n ...buildRecapDevEnvironment(resolveRecapDevEndpoint(this))\n },\n role,\n reservedConcurrentExecutions: props.reservedConcurrency,\n tracing: enableTracing ? Tracing.ACTIVE : Tracing.DISABLED,\n logGroup,\n ...(props.vpcConfig && {\n vpc: props.vpcConfig.vpc,\n vpcSubnets: props.vpcConfig.vpcSubnets,\n securityGroups: props.vpcConfig.securityGroups\n })\n })\n\n this.function.addEventSource(\n new SqsEventSource(this.queue, {\n batchSize,\n reportBatchItemFailures,\n ...(props.maxBatchingWindow && { maxBatchingWindow: props.maxBatchingWindow }),\n ...(props.maxConcurrency !== undefined && { maxConcurrency: props.maxConcurrency })\n })\n )\n\n applyStandardTags(this.function, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n applyStandardTags(this.queue, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n applyStandardTags(this.dlq, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n this.dlqAlarm = new DlqAlarm(this, 'DLQAlarm', {\n dlq: this.dlq,\n alarmName: props.alarmName ?? `${props.stage}-${props.serviceName}-${resourceName}-dlq-alarm`,\n alarmTopic: props.alarmTopic,\n alarmLogicalId: props.overrideLogicalIds?.alarm\n })\n\n additionalQueues.forEach(queue => {\n queue.grantSendMessages(this.function)\n queue.grantConsumeMessages(this.function)\n })\n\n // Serverless migration: override logical IDs\n if (props.serverlessFunctionName) {\n overrideFunctionLogicalIds(this.function, props.serverlessFunctionName)\n }\n\n if (props.overrideLogicalIds?.queue) {\n const cfnQueue = this.queue.node.defaultChild\n if (!(cfnQueue instanceof CfnQueue)) {\n throw new Error(\n `Cannot override queue logical ID to \"${props.overrideLogicalIds.queue}\": queue does not have a CfnQueue default child.`\n )\n }\n cfnQueue.overrideLogicalId(props.overrideLogicalIds.queue)\n }\n\n if (props.overrideLogicalIds?.dlq) {\n const cfnDlq = this.dlq.node.defaultChild\n if (!(cfnDlq instanceof CfnQueue)) {\n throw new Error(\n `Cannot override DLQ logical ID to \"${props.overrideLogicalIds.dlq}\": DLQ does not have a CfnQueue default child.`\n )\n }\n cfnDlq.overrideLogicalId(props.overrideLogicalIds.dlq)\n }\n }\n\n private createRole(props: LambdaWithQueueProps, enableTracing: boolean): IRole {\n if (!props.roleName) {\n throw new Error('LambdaWithQueue requires either `role` or `roleName` to be provided.')\n }\n\n const role = new Role(this, 'Role', {\n roleName: props.roleName,\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n description: `Lambda execution role for ${props.serviceName}`\n })\n\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')\n )\n\n if (props.vpcConfig) {\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')\n )\n }\n\n if (enableTracing) {\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('AWSXRayDaemonWriteAccess')\n )\n }\n\n return role\n }\n\n public subscribeToTopic(\n topic: ITopic,\n options?: SqsSubscriptionProps,\n serverlessSubscriptionLogicalId?: string\n ): void {\n if (serverlessSubscriptionLogicalId !== undefined) {\n const trimmed = serverlessSubscriptionLogicalId.trim()\n if (!trimmed) {\n throw new Error(\n 'subscribeToTopic: serverlessSubscriptionLogicalId must not be an empty string — ' +\n 'omit the argument to use the standard CDK subscription path.'\n )\n }\n if (options?.filterPolicy) {\n throw new Error(\n 'subscribeToTopic: filterPolicy is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n if (options?.filterPolicyWithMessageBody) {\n throw new Error(\n 'subscribeToTopic: filterPolicyWithMessageBody is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n if (options?.deadLetterQueue) {\n throw new Error(\n 'subscribeToTopic: deadLetterQueue is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n Annotations.of(this).addWarning(\n `subscribeToTopic with serverlessSubscriptionLogicalId=\"${trimmed}\" ` +\n 'creates only the SNS subscription — no SQS queue policy is created. ' +\n 'On migrated stacks the queue policy already exists in CloudFormation; ' +\n 'preserve it with makeServerlessQueuePolicy(). ' +\n 'On new queues you must also call makeServerlessQueuePolicy() or SNS delivery will fail silently.'\n )\n makeSnsToSqsSubscription(this, trimmed, {\n topicArn: topic.topicArn,\n endpoint: this.queue.queueArn,\n protocol: 'sqs',\n rawMessageDelivery: options?.rawMessageDelivery\n })\n } else {\n topic.addSubscription(new SqsSubscription(this.queue, options))\n }\n }\n}\n","import { Construct } from 'constructs'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\nimport { generateQueueName, generateRoleName } from '../utils/naming'\nimport { resolveHandlerPath } from '../utils/handler-path'\n\nexport interface ServiceLambdaWithQueueProps\n extends Omit<LambdaWithQueueProps, 'queueName' | 'roleName' | 'resourceName'> {\n queueBaseName: string\n}\n\nexport class ServiceLambdaWithQueue extends LambdaWithQueue {\n constructor(scope: Construct, id: string, props: ServiceLambdaWithQueueProps) {\n const { queueBaseName, ...rest } = props\n const { functionName } = resolveHandlerPath(rest)\n\n super(scope, id, {\n ...rest,\n resourceName: functionName,\n functionName,\n queueName: generateQueueName(props.stage, props.serviceName, queueBaseName),\n roleName: rest.role\n ? undefined\n : generateRoleName(props.stage, props.serviceName, functionName)\n })\n }\n}\n","import { Construct } from 'constructs'\nimport { EmLambdaFunction } from './lambda'\nimport { EmHttpApi } from './api-gateway'\nimport { LambdaConfig } from '../types'\n\nexport type LambdaWithHttpApiConfig = LambdaConfig & {\n readonly httpApi: EmHttpApi\n readonly route: {\n path: string\n method: string\n }\n}\n\nexport class EmLambdaWithHttpApi extends Construct {\n public readonly lambda: EmLambdaFunction\n\n constructor(scope: Construct, id: string, config: LambdaWithHttpApiConfig) {\n super(scope, id)\n\n this.lambda = new EmLambdaFunction(this, 'Lambda', config)\n\n config.httpApi.addLambdaIntegration(\n config.route.path,\n config.route.method,\n this.lambda.function\n )\n }\n}\n","import { ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscription, SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Construct } from 'constructs'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\n\nexport interface TopicQueueConsumerProps extends LambdaWithQueueProps {\n /** The SNS topic to subscribe to. Can be an ITopic or a topic ARN string. */\n readonly topic: ITopic | string\n /** Options for the SQS subscription (e.g. rawMessageDelivery, filterPolicy). */\n readonly subscriptionOptions?: Omit<SqsSubscriptionProps, 'rawMessageDelivery'> & {\n rawMessageDelivery?: boolean\n }\n /**\n * Migration only: pins SNS subscription logical ID to prevent recreation\n * and in-flight message loss during Serverless→CDK deploy.\n */\n readonly serverlessSubscriptionLogicalId?: string\n}\n\n/**\n * Lambda function consuming messages from an SNS topic via an SQS queue.\n *\n * Combines SNS subscription → SQS queue → DLQ + alarm → Lambda consumer\n * in a single construct. Supports all `LambdaWithQueue` features including\n * migration mode (shared role, logical ID overrides).\n *\n * @example\n * ```typescript\n * // Import external topic by ARN or use EmSnsTopic.fromName()\n * const contactEventTopic = EmSnsTopic.fromName(this, 'ContactEvent', {\n * stage: 'dev',\n * topicName: 'emarketeer-event-contact-event',\n * })\n *\n * const consumer = new TopicQueueConsumer(this, 'ContactEvents', {\n * topic: contactEventTopic,\n * handlerPath: 'src/handlers/process-contact-event',\n * queueName: 'dev-my-service-contact-event-queue',\n * alarmTopic,\n * })\n * ```\n */\nexport class TopicQueueConsumer extends LambdaWithQueue {\n constructor(scope: Construct, id: string, props: TopicQueueConsumerProps) {\n const {\n topic: topicOrArn,\n subscriptionOptions,\n serverlessSubscriptionLogicalId,\n ...queueProps\n } = props\n super(scope, id, queueProps)\n\n const topic =\n typeof topicOrArn === 'string'\n ? Topic.fromTopicArn(this, 'SubscribedTopic', topicOrArn)\n : topicOrArn\n\n this.subscribeToTopic(topic, subscriptionOptions, serverlessSubscriptionLogicalId)\n }\n}\n","import * as cdk from 'aws-cdk-lib'\nimport { Annotations, Aws, Tags } from 'aws-cdk-lib'\nimport {\n Effect,\n IRole,\n PolicyStatement,\n Role,\n ServicePrincipal,\n ManagedPolicy,\n IManagedPolicy\n} from 'aws-cdk-lib/aws-iam'\nimport { ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { ITable } from 'aws-cdk-lib/aws-dynamodb'\nimport { IBucket } from 'aws-cdk-lib/aws-s3'\nimport { IStream } from 'aws-cdk-lib/aws-kinesis'\nimport { StringParameter } from 'aws-cdk-lib/aws-ssm'\nimport { Construct } from 'constructs'\nimport { LambdaConfig, Stage } from '../types'\nimport { generateStackName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { EmLambdaFunction } from './lambda'\nimport { EmEventBridgeRule } from './eventbridge'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\nimport { TopicQueueConsumer } from './topic-queue-consumer'\nimport {\n overrideFunctionLogicalIds,\n overrideRoleLogicalId,\n createServerlessCompatibleOutput\n} from '../utils/serverless-migration'\nimport { createXRayTracingPolicy } from '../utils/iam'\n\ntype BaseEmStackProps = cdk.StackProps & {\n readonly stage: Stage\n readonly serviceName: string\n readonly tags?: Record<string, string>\n readonly owner?: string\n readonly costCenter?: string\n /**\n * Default config applied to every function created via `createFunction()`.\n * Per-function config takes precedence over these defaults.\n *\n * @example\n * ```typescript\n * super(scope, id, {\n * ...props,\n * defaultFunctionConfig: {\n * memorySize: 1536,\n * timeout: Duration.seconds(30),\n * enableTracing: true,\n * layers: [insightsLayer],\n * }\n * })\n * ```\n */\n readonly defaultFunctionConfig?: Partial<CreateFunctionConfig>\n}\n\nexport type EmStackProps = BaseEmStackProps & (\n | {\n /**\n * When true, creates a shared IAM role for all functions — matching the\n * Serverless Framework pattern where one role is shared across all Lambdas.\n *\n * The role is pinned to logical ID `IamRoleLambdaExecution` so existing\n * Serverless stacks are migrated in-place without resource replacement.\n *\n * `createFunction()` will use this role by default unless a specific role\n * is passed in the function config.\n */\n readonly useSharedRole: true\n /**\n * Replaces the default managed policies on the shared role.\n * Only valid when `useSharedRole: true`.\n *\n * Defaults to `[AWSLambdaBasicExecutionRole, CloudWatchLambdaInsightsExecutionRolePolicy]`.\n * Providing this option replaces that entire list — include `AWSLambdaBasicExecutionRole`\n * explicitly if it is still needed.\n *\n * For VPC services, prefer passing `sharedRole` to `createRdsVpcConfig` instead.\n * That appends `AWSLambdaVPCAccessExecutionRole` without replacing the defaults.\n */\n readonly sharedRoleManagedPolicies?: IManagedPolicy[]\n }\n | {\n readonly useSharedRole?: false\n /** Not valid when `useSharedRole` is false or omitted. */\n readonly sharedRoleManagedPolicies?: never\n }\n)\n\n/**\n * Config for `EmStack.createFunction()`. Stage and serviceName are optional —\n * they default to the stack's values.\n *\n * When `handlerPath` is provided, `codePath`, `handler`, and `functionName`\n * become optional — they are derived from the source path:\n *\n * ```typescript\n * // Instead of:\n * this.createFunction('CaptureScreenshot', {\n * functionName: 'capture-screenshot-from-url',\n * handler: 'index.handler',\n * codePath: 'dist/handlers/capture-screenshot/capture-screenshot-from-url',\n * })\n *\n * // You can write:\n * this.createFunction('CaptureScreenshot', {\n * handlerPath: 'src/handlers/capture-screenshot/capture-screenshot-from-url',\n * })\n * ```\n */\nexport type CreateFunctionConfig = Omit<\n LambdaConfig,\n 'stage' | 'serviceName'\n> & {\n readonly stage?: LambdaConfig['stage']\n readonly serviceName?: LambdaConfig['serviceName']\n}\n\n/**\n * Base stack class for eMarketeer microservices.\n *\n * - Auto-generates stackName from stage + serviceName\n * - Auto-generates description\n * - Applies standard tags (Stage, Service, ManagedBy) to all resources\n * - `createFunction()` creates Lambdas with stable, Serverless-compatible logical IDs\n * - `addOutput()` creates exports with the `sls-{service}-{stage}-{key}` pattern\n * - `overrideLayer()` pins layer logical IDs\n * - Optional shared role for Serverless migration compatibility\n *\n * @example\n * ```typescript\n * export class MyServiceStack extends EmStack {\n * constructor(scope: Construct, id: string, props: MyStackProps) {\n * super(scope, id, { ...props, useSharedRole: true })\n *\n * // Short form — derives codePath, handler, and functionName from handlerPath\n * const fn = this.createFunction('GetData', {\n * handlerPath: 'src/handlers/get-data',\n * })\n *\n * // Explicit form — still supported\n * const fn2 = this.createFunction('PostData', {\n * functionName: 'post-data',\n * handler: 'index.handler',\n * codePath: './dist/handlers/post-data',\n * })\n *\n * this.addOutput('ServiceEndpoint', 'https://...')\n * }\n * }\n * ```\n */\nexport class EmStack extends cdk.Stack {\n public readonly stage: Stage\n public readonly serviceName: string\n /**\n * Shared IAM role for all functions. Only created when `useSharedRole: true`.\n * Pinned to logical ID `IamRoleLambdaExecution` for Serverless migration.\n */\n public readonly sharedRole?: Role\n private defaultFunctionConfig: Partial<CreateFunctionConfig>\n private _alarmTopic?: ITopic\n\n constructor(scope: Construct, id: string, props: EmStackProps) {\n super(scope, id, {\n ...props,\n stackName:\n props.stackName ??\n (props.useSharedRole\n ? `${props.serviceName}-${props.stage}`\n : generateStackName({\n stage: props.stage,\n serviceName: props.serviceName\n })),\n description: props.description ?? `${props.serviceName} (${props.stage})`\n })\n\n this.stage = props.stage\n this.serviceName = props.serviceName\n this.defaultFunctionConfig = props.defaultFunctionConfig ?? {}\n\n applyStandardTags(this, {\n stage: props.stage,\n serviceName: props.serviceName,\n owner: props.owner,\n costCenter: props.costCenter,\n customTags: props.tags\n })\n\n Tags.of(this).add('em-microservice', `${props.stage}-${props.serviceName}`)\n\n if (props.useSharedRole) {\n this.sharedRole = new Role(this, 'LambdaExecutionRole', {\n roleName: `${props.serviceName}-${props.stage}-${this.region}-lambdaRole`,\n path: '/',\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n managedPolicies: props.sharedRoleManagedPolicies ?? [\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),\n ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaInsightsExecutionRolePolicy')\n ]\n })\n overrideRoleLogicalId(this.sharedRole)\n }\n }\n\n /**\n * Update default function config after construction.\n * Use this when defaults depend on resources created after `super()`.\n * The environment map is shallow-merged with existing defaults; all other keys are replaced.\n *\n * @example\n * ```typescript\n * // After creating resources:\n * this.setDefaultFunctionConfig({\n * environment: sharedEnvironment,\n * vpcConfig,\n * })\n * ```\n */\n setDefaultFunctionConfig(config: Partial<CreateFunctionConfig>): void {\n this.defaultFunctionConfig = {\n ...this.defaultFunctionConfig,\n ...config,\n environment: {\n ...(this.defaultFunctionConfig.environment ?? {}),\n ...(config.environment ?? {})\n }\n }\n }\n\n private mergeConfig<T extends { environment?: Record<string, string> }>(\n config: T\n ): Partial<CreateFunctionConfig> & T {\n const defaultEnv = this.defaultFunctionConfig.environment\n const configEnv = config.environment\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n ...this.defaultFunctionConfig,\n ...config,\n ...(defaultEnv || configEnv\n ? { environment: { ...(defaultEnv ?? {}), ...(configEnv ?? {}) } }\n : {})\n } as Partial<CreateFunctionConfig> & T\n }\n\n /**\n * Create a Lambda function. Defaults `stage` and `serviceName` from the stack.\n *\n * When `useSharedRole: true` (Serverless migration mode), also:\n * - Overrides Lambda logical ID to `{prefix}LambdaFunction`\n * - Overrides log group logical ID to `{prefix}LogGroup`\n * - Sets log group removal policy via `getRemovalPolicy(stage)` (RETAIN in\n * prod, DESTROY otherwise — see utils/logs.ts)\n * - Uses the shared role unless `config.role` is provided\n * - Throws if `importExistingLogGroup` is set — migration mode requires managed log groups\n * to override their logical IDs\n */\n createFunction(id: string, config: CreateFunctionConfig): EmLambdaFunction {\n const merged = this.mergeConfig(config)\n const resolved = resolveHandlerPath(merged)\n const functionName = resolved.functionName\n\n const fn = new EmLambdaFunction(this, id, {\n ...merged,\n functionName,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole\n })\n\n if (this.sharedRole) {\n if (merged.importExistingLogGroup) {\n throw new Error(\n `Cannot use importExistingLogGroup with useSharedRole (migration mode) for \"${functionName}\". ` +\n 'Migration mode requires explicit log groups to override their logical IDs.'\n )\n }\n overrideFunctionLogicalIds(fn.function, functionName)\n }\n this.errorIfRoleOverrideInMigrationMode(fn, 'createFunction', functionName, merged.role)\n\n return fn\n }\n\n /**\n * Create a Lambda function with an SQS queue consumer pattern.\n * Defaults `stage`, `serviceName`, and `role` from the stack.\n *\n * When `useSharedRole: true` (Serverless migration mode), also:\n * - Uses the shared role (skips per-function role creation)\n * - Overrides Lambda + log group logical IDs to match Serverless Framework naming\n *\n * @example\n * ```typescript\n * const consumer = this.createQueueConsumer('ProcessJobs', {\n * handlerPath: 'src/handlers/process-jobs',\n * queueName: 'dev-my-service-queue-jobs',\n * memorySize: 512,\n * timeout: Duration.seconds(30),\n * enableTracing: true,\n * alarmTopic: this.alarmTopic,\n * })\n * ```\n */\n createQueueConsumer(id: string, config: CreateQueueConsumerConfig): LambdaWithQueue {\n const merged = this.mergeConfig(config)\n const { functionName } = resolveHandlerPath(merged)\n const consumer = new LambdaWithQueue(this, id, {\n ...merged,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole,\n ...(this.sharedRole && {\n serverlessFunctionName: merged.serverlessFunctionName ?? functionName\n })\n })\n this.errorIfRoleOverrideInMigrationMode(consumer, 'createQueueConsumer', functionName ?? id, merged.role)\n return consumer\n }\n\n /**\n * Create a Lambda function consuming messages from an SNS topic via SQS.\n * Combines `createQueueConsumer()` + `subscribeToTopic()` in one call and\n * inherits the stack's default function config (env vars, VPC, timeout).\n *\n * Prefer this over constructing `TopicQueueConsumer` directly — the raw\n * constructor bypasses default-config merging.\n *\n * @example\n * ```typescript\n * this.createTopicQueueConsumer('ProcessInvoices', {\n * topic: invoiceTopic,\n * subscriptionOptions: { rawMessageDelivery: true },\n * handlerPath: 'src/handlers/process-invoices',\n * queueName: 'dev-my-service-invoice-queue',\n * alarmTopic,\n * })\n * ```\n */\n createTopicQueueConsumer(\n id: string,\n config: CreateTopicQueueConsumerConfig\n ): TopicQueueConsumer {\n const { topic, subscriptionOptions, serverlessSubscriptionLogicalId, ...queueConfig } = config\n const merged = this.mergeConfig(queueConfig)\n const { functionName } = resolveHandlerPath(merged)\n const consumer = new TopicQueueConsumer(this, id, {\n ...merged,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole,\n topic,\n subscriptionOptions,\n serverlessSubscriptionLogicalId,\n ...(this.sharedRole && {\n serverlessFunctionName: merged.serverlessFunctionName ?? functionName\n })\n })\n this.errorIfRoleOverrideInMigrationMode(consumer, 'createTopicQueueConsumer', functionName ?? id, merged.role)\n return consumer\n }\n\n /**\n * Create a scheduled Lambda function with an EventBridge rule.\n * Combines `createFunction()` + `EmEventBridgeRule` + `addLambdaTarget()` in one call.\n *\n * @example\n * ```typescript\n * this.createScheduledFunction('DailyReport', {\n * handlerPath: 'src/handlers/daily-report',\n * schedule: 'cron(0 8 * * ? *)',\n * })\n * ```\n */\n createScheduledFunction(\n id: string,\n config: CreateScheduledFunctionConfig\n ): { function: EmLambdaFunction; rule: EmEventBridgeRule } {\n const { schedule, ruleName, ruleDescription, ...functionConfig } = config\n const merged = this.mergeConfig(functionConfig)\n const fn = this.createFunction(id, merged)\n const { functionName } = resolveHandlerPath(merged)\n\n const rule = new EmEventBridgeRule(this, `${id}Rule`, {\n stage: functionConfig.stage ?? this.stage,\n serviceName: functionConfig.serviceName ?? this.serviceName,\n ruleName: ruleName ?? functionName,\n description: ruleDescription,\n schedule\n })\n\n rule.addLambdaTarget(fn.function)\n\n return { function: fn, rule }\n }\n\n /**\n * Import an SSM parameter value.\n *\n * By default resolves `/{stage}/{serviceName}/{paramName}`.\n * Pass `{ raw: true }` to use the name as-is (for root-level params from Serverless).\n *\n * @example\n * ```typescript\n * // Convention-based:\n * this.ssmParam('db_host') // → /{stage}/{serviceName}/db_host\n *\n * // Raw (root-level SSM params):\n * this.ssmParam('proxy_dbms_host', { raw: true }) // → proxy_dbms_host\n * ```\n */\n ssmParam(paramName: string, options?: { serviceName?: string; raw?: boolean }): string {\n const path = options?.raw\n ? paramName\n : `/${this.stage}/${options?.serviceName ?? this.serviceName}/${paramName}`\n return StringParameter.valueForStringParameter(this, path)\n }\n\n /**\n * Import the alarm email topic by convention.\n * ARN: `arn:{partition}:sns:{region}:{account}:{stage}-alarm-email`\n *\n * Memoised: `Topic.fromTopicArn` registers a new construct on each call and\n * CDK errors on duplicate construct IDs in the same scope, so multiple\n * call sites would otherwise fail synth.\n */\n alarmTopic(): ITopic {\n if (!this._alarmTopic) {\n const arn = `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-alarm-email`\n this._alarmTopic = Topic.fromTopicArn(this, 'AlarmTopic', arn)\n }\n return this._alarmTopic\n }\n\n /**\n * Add a Lambda invoke policy to the shared role.\n * @param functionPattern - Optional function name pattern. Defaults to `{stage}-{serviceName}-*`.\n * Pass `'*'` for account-wide access.\n *\n * **Note:** The default pattern only matches functions named with the CDK convention\n * (`{stage}-{serviceName}-{fn}`). Functions created with `physicalName` using the legacy\n * Serverless convention (`{service}-{stage}-{fn}`) will not be matched. Pass `'*'` when\n * the service has any `physicalName` functions that must be invocable.\n */\n addLambdaInvokePolicy(functionPattern?: string): void {\n if (functionPattern !== undefined && functionPattern.trim() === '') {\n throw new Error('addLambdaInvokePolicy: functionPattern must not be empty.')\n }\n const role = this.requireSharedRole('addLambdaInvokePolicy')\n const pattern = functionPattern ?? `${this.stage}-${this.serviceName}-*`\n const resources =\n pattern === '*'\n ? ['*']\n : [`arn:${Aws.PARTITION}:lambda:${Aws.REGION}:${Aws.ACCOUNT_ID}:function:${pattern}`]\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['lambda:InvokeFunction'],\n resources\n })\n )\n }\n\n /**\n * Add a Kinesis PutRecord/PutRecords policy to the shared role.\n * @param streamOrName - An IStream reference, or a short stream name (prefixed with `{stage}-`).\n */\n addKinesisPolicy(streamOrName: IStream | string): void {\n const role = this.requireSharedRole('addKinesisPolicy')\n const arn = this.resolveResourceArn(\n streamOrName,\n 'addKinesisPolicy',\n 'streamName',\n name => `arn:${Aws.PARTITION}:kinesis:${Aws.REGION}:${Aws.ACCOUNT_ID}:stream/${this.stage}-${name}`,\n stream => stream.streamArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['kinesis:PutRecord', 'kinesis:PutRecords'],\n resources: [arn]\n })\n )\n }\n\n /**\n * Add an SNS Publish policy to the shared role.\n * @param topicOrName - An ITopic reference, or a short topic name (prefixed with `{stage}-`).\n */\n addSnsPublishPolicy(topicOrName: ITopic | string): void {\n const role = this.requireSharedRole('addSnsPublishPolicy')\n const arn = this.resolveResourceArn(\n topicOrName,\n 'addSnsPublishPolicy',\n 'topicName',\n name => `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n topic => topic.topicArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['sns:Publish'],\n resources: [arn]\n })\n )\n }\n\n /**\n * Add an SQS SendMessage policy to the shared role.\n * @param queueOrNames - One or more IQueue references and/or short queue names\n * (string names are prefixed with `{stage}-`).\n */\n addSqsSendPolicy(queueOrNames: IQueue | string | (IQueue | string)[]): void {\n const items = Array.isArray(queueOrNames) ? queueOrNames : [queueOrNames]\n if (items.length === 0) {\n throw new Error('addSqsSendPolicy: queueOrNames must not be empty.')\n }\n const role = this.requireSharedRole('addSqsSendPolicy')\n const resources = items.map(item =>\n this.resolveResourceArn(\n item,\n 'addSqsSendPolicy',\n 'queueName',\n name => `arn:${Aws.PARTITION}:sqs:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n queue => queue.queueArn\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['sqs:SendMessage', 'sqs:GetQueueAttributes', 'sqs:GetQueueUrl'],\n resources\n })\n )\n }\n\n /** Add an XRay tracing policy to the shared role. */\n addXRayPolicy(): void {\n const role = this.requireSharedRole('addXRayPolicy')\n role.addToPolicy(createXRayTracingPolicy())\n }\n\n /**\n * Add a CloudWatch Logs policy to the shared role.\n * Grants create, write, describe, read, and query access on all log groups.\n */\n addCloudWatchLogsPolicy(): void {\n const role = this.requireSharedRole('addCloudWatchLogsPolicy')\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'logs:CreateLogGroup',\n 'logs:CreateLogStream',\n 'logs:PutLogEvents',\n 'logs:DescribeLogGroups',\n 'logs:DescribeLogStreams',\n 'logs:FilterLogEvents',\n 'logs:GetLogEvents',\n 'logs:StartQuery',\n 'logs:StopQuery',\n 'logs:GetQueryResults'\n ],\n resources: ['*']\n })\n )\n }\n\n /**\n * Add an SNS policy to the shared role.\n * @param options.actions - SNS actions (e.g. ['sns:Publish', 'sns:Subscribe']).\n * @param options.resources - Resource ARNs. When omitted, defaults to `['*']`\n * (account-wide access). Prefer `addSnsPublishPolicy(topicArn)` for scoped\n * publish-only access to a specific topic.\n */\n addSnsPolicy(options: { actions: string[]; resources?: string[] }): void {\n if (options.actions.length === 0) {\n throw new Error('addSnsPolicy: actions must not be empty.')\n }\n if (options.resources && options.resources.length === 0) {\n throw new Error(\n 'addSnsPolicy: resources must not be empty. Omit the field to grant account-wide access explicitly.'\n )\n }\n const role = this.requireSharedRole('addSnsPolicy')\n if (!options.resources) {\n Annotations.of(this).addWarning(\n 'addSnsPolicy: no resources specified — policy grants account-wide SNS access on all topics. ' +\n 'Pass resources to scope the policy, or use addSnsPublishPolicy(topicArn) for publish access.'\n )\n }\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: options.actions,\n resources: options.resources ?? ['*']\n })\n )\n }\n\n /**\n * Add an SQS consumer policy to the shared role.\n * Grants ChangeMessageVisibility, DeleteMessage, ReceiveMessage, and GetQueueAttributes on each queue.\n * Use `addSqsSendPolicy` separately for queues the service also produces to.\n * @param queues - One or more IQueue references and/or short queue names\n * (string names are prefixed with `{stage}-`).\n */\n addSqsConsumerPolicy(queues: (IQueue | string)[]): void {\n if (queues.length === 0) {\n throw new Error('addSqsConsumerPolicy: queues must not be empty.')\n }\n const role = this.requireSharedRole('addSqsConsumerPolicy')\n const resources = queues.map(item =>\n this.resolveResourceArn(\n item,\n 'addSqsConsumerPolicy',\n 'queueName',\n name => `arn:${Aws.PARTITION}:sqs:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n queue => queue.queueArn\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'sqs:ChangeMessageVisibility',\n 'sqs:DeleteMessage',\n 'sqs:ReceiveMessage',\n 'sqs:GetQueueAttributes'\n ],\n resources\n })\n )\n }\n\n /**\n * Add an execute-api:Invoke policy to the shared role.\n * Resources are scoped to `*` — API Gateway requires the full execution ARN\n * (`arn:{partition}:execute-api:{region}:{account}:{api-id}/{stage}/{method}/{path}`)\n * which is not available as a stable value in migration stacks.\n */\n addExecuteApiPolicy(): void {\n const role = this.requireSharedRole('addExecuteApiPolicy')\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['execute-api:Invoke'],\n resources: ['*']\n })\n )\n }\n\n /**\n * Add an S3 policy to the shared role.\n * @param bucketOrName - An IBucket reference, or a full bucket name (no stage prefix added).\n * @param actions - S3 actions to grant. Defaults to `['s3:GetObject', 's3:PutObject',\n * 's3:DeleteObject', 's3:ListBucket']`. Pass an explicit non-empty list for narrower or broader access.\n */\n addS3Policy(bucketOrName: IBucket | string, actions?: string[]): void {\n if (actions && actions.length === 0) {\n throw new Error('addS3Policy: actions must not be empty.')\n }\n const role = this.requireSharedRole('addS3Policy')\n const bucketArn = this.resolveResourceArn(\n bucketOrName,\n 'addS3Policy',\n 'bucketName',\n name => `arn:${Aws.PARTITION}:s3:::${name}`,\n bucket => bucket.bucketArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: actions ?? ['s3:GetObject', 's3:PutObject', 's3:DeleteObject', 's3:ListBucket'],\n resources: [bucketArn, `${bucketArn}/*`]\n })\n )\n }\n\n /**\n * Add a DynamoDB policy to the shared role.\n * Grants read, write, transact, and describe actions on each table.\n *\n * String-name ARNs use literal `*` for region and account. This matches the\n * Serverless Framework's source policy on migrated stacks; replacing the `*`\n * with `${Aws.REGION}/${Aws.ACCOUNT_ID}` would generate a noisy CloudFormation\n * diff on first deploy without changing effective access.\n *\n * @param tables - One or more ITable references and/or short table names\n * (string names are prefixed with `{stage}-`).\n * @param options.streamTables - Tables to also grant stream read access.\n * Accepts ITable refs (uses tableStreamArn) or string short names.\n * @param options.indexTables - Tables to also grant Query/Scan on all indexes.\n * Uses a separate policy statement scoped to only dynamodb:Query and dynamodb:Scan.\n */\n addDynamoDbPolicy(\n tables: (ITable | string)[],\n options?: { streamTables?: (ITable | string)[]; indexTables?: (ITable | string)[] }\n ): void {\n if (tables.length === 0) {\n throw new Error('addDynamoDbPolicy: tables must not be empty.')\n }\n const role = this.requireSharedRole('addDynamoDbPolicy')\n const tableArns = tables.map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}`,\n table => table.tableArn\n )\n )\n const streamArns = (options?.streamTables ?? []).map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy(streamTables)',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}/stream/*`,\n table => table.tableStreamArn ?? `${table.tableArn}/stream/*`\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:PutItem',\n 'dynamodb:UpdateItem',\n 'dynamodb:DeleteItem',\n 'dynamodb:Query',\n 'dynamodb:Scan',\n 'dynamodb:BatchGetItem',\n 'dynamodb:BatchWriteItem',\n 'dynamodb:TransactGetItems',\n 'dynamodb:TransactWriteItems',\n 'dynamodb:DescribeTable',\n 'dynamodb:DescribeStream',\n 'dynamodb:GetRecords',\n 'dynamodb:GetShardIterator',\n 'dynamodb:ListStreams'\n ],\n resources: [...tableArns, ...streamArns]\n })\n )\n const indexArns = (options?.indexTables ?? []).map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy(indexTables)',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}/index/*`,\n table => `${table.tableArn}/index/*`\n )\n )\n if (indexArns.length > 0) {\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['dynamodb:Query', 'dynamodb:Scan'],\n resources: indexArns,\n })\n )\n }\n }\n\n private requireSharedRole(methodName: string): Role {\n if (!this.sharedRole) {\n throw new Error(`${methodName}() requires useSharedRole: true on the stack.`)\n }\n return this.sharedRole\n }\n\n /**\n * Resolve a CDK resource reference or short name into an ARN string.\n * Centralises empty-input validation so callers (add*Policy methods)\n * fail loud at synth instead of producing a malformed ARN that\n * CloudFormation later rejects with a generic error.\n */\n private resolveResourceArn<T extends object>(\n refOrName: T | string,\n methodName: string,\n nameLabel: string,\n fromName: (name: string) => string,\n fromRef: (ref: T) => string\n ): string {\n if (typeof refOrName === 'string') {\n if (refOrName.trim() === '') {\n throw new Error(`${methodName}: ${nameLabel} must not be empty.`)\n }\n return fromName(refOrName)\n }\n return fromRef(refOrName)\n }\n\n /**\n * Blocks synth with an error when a custom role is passed in migration mode.\n * The Lambda logical ID is overridden to match Serverless naming, but the\n * custom role's logical ID will NOT be pinned — CloudFormation may replace it.\n * Uses addError (not addWarning) so the misconfiguration is caught before a\n * changeset is created.\n * Called from createFunction, createQueueConsumer, and createTopicQueueConsumer.\n */\n private errorIfRoleOverrideInMigrationMode(\n scope: Construct,\n callerMethod: string,\n functionName: string,\n role?: IRole\n ): void {\n if (this.sharedRole && role && role !== this.sharedRole) {\n Annotations.of(scope).addError(\n `${callerMethod}(\"${functionName}\"): a custom role was provided in migration mode (useSharedRole: true). ` +\n 'The Lambda logical ID will be overridden to match Serverless naming, but the custom role\\'s logical ID ' +\n 'will NOT be pinned to IamRoleLambdaExecution — CloudFormation may replace the role on deploy. ' +\n 'Pass the shared role via the stack\\'s sharedRole property instead, or omit config.role.'\n )\n }\n }\n\n /**\n * Create a CfnOutput with a stable export name.\n * Export pattern: `sls-{serviceName}-{stage}-{outputKey}`\n *\n * @param id - Construct ID for the output\n * @param value - The output value\n * @param options - Optional outputKey (defaults to `id`) and description\n */\n addOutput(\n id: string,\n value: string,\n options?: { outputKey?: string; description?: string }\n ): cdk.CfnOutput {\n return createServerlessCompatibleOutput(this, id, {\n serviceName: this.serviceName,\n stage: this.stage,\n outputKey: options?.outputKey ?? id,\n value,\n description: options?.description\n })\n }\n}\n\n/**\n * Config for `EmStack.createQueueConsumer()`. Stage, serviceName, and role\n * are optional — they default to the stack's values.\n */\nexport type CreateQueueConsumerConfig = Omit<LambdaWithQueueProps, 'stage' | 'serviceName'> & {\n stage?: LambdaWithQueueProps['stage']\n serviceName?: LambdaWithQueueProps['serviceName']\n}\n\n/**\n * Config for `EmStack.createScheduledFunction()`.\n */\nexport type CreateScheduledFunctionConfig = CreateFunctionConfig & {\n /** Schedule expression (e.g. `'cron(5 * * * ? *)'` or `'rate(1 day)'`). */\n readonly schedule: string\n /** Override the EventBridge rule name. Defaults to the function name. */\n readonly ruleName?: string\n /** Description for the EventBridge rule. */\n readonly ruleDescription?: string\n}\n\n/**\n * Config for `EmStack.createTopicQueueConsumer()`. Adds the SNS topic and\n * subscription options on top of `CreateQueueConsumerConfig`.\n */\nexport type CreateTopicQueueConsumerConfig = CreateQueueConsumerConfig & {\n /** The SNS topic to subscribe to. Can be an ITopic or a topic ARN string. */\n readonly topic: ITopic | string\n /** Options for the SQS subscription (e.g. rawMessageDelivery, filterPolicy). */\n readonly subscriptionOptions?: Omit<SqsSubscriptionProps, 'rawMessageDelivery'> & {\n rawMessageDelivery?: boolean\n }\n /**\n * Migration only: pins the SNS subscription logical ID to prevent recreation\n * and in-flight message loss during Serverless→CDK deploy.\n */\n readonly serverlessSubscriptionLogicalId?: string\n}\n","import { Construct } from 'constructs'\nimport { Annotations } from 'aws-cdk-lib'\nimport * as ec2 from 'aws-cdk-lib/aws-ec2'\nimport { Role, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { Stage, VpcConfig } from '../types'\n\nexport interface RdsVpcConfiguration {\n readonly vpcId: string\n readonly privateSubnetIds: readonly string[]\n readonly dbSecurityGroupId: string\n /** Override CloudFormation logical IDs for migration. */\n readonly overrideLogicalIds?: {\n readonly securityGroup?: string\n readonly ingress?: string\n }\n /** DB port. Defaults to 3306 (MySQL). */\n readonly dbPort?: number\n /** When provided, auto-attaches AWSLambdaVPCAccessExecutionRole to the role. */\n readonly sharedRole?: Role\n /**\n * Security group description. Defaults to `'Lambda security group for RDS access'`.\n *\n * Override when migrating from Serverless Framework — CloudFormation treats the\n * description as immutable, so it must match the existing value to avoid a\n * disruptive security-group replacement.\n */\n readonly securityGroupDescription?: string\n /**\n * When false, strips SecurityGroupEgress from the CloudFormation template.\n * Use for the initial Serverless→CDK migration deploy when the live stack never had\n * an explicit egress rule. Prevents rollback from revoking the default allow-all-outbound\n * rule. Remove this option in a follow-up deploy to hand CloudFormation ownership.\n */\n readonly manageSgEgress?: boolean\n}\n\nexport function createRdsVpcConfig(\n scope: Construct,\n stage: Stage,\n config: RdsVpcConfiguration\n): VpcConfig {\n const vpc = ec2.Vpc.fromLookup(scope, `RdsVpc-${stage}`, {\n vpcId: config.vpcId\n })\n\n // The imported subnets are only handed to Lambda's VpcConfig. We never read\n // `subnet.routeTable.routeTableId`, so acknowledge the CDK warning that\n // `fromSubnetId` emits for imports without route-table metadata.\n const privateSubnets = config.privateSubnetIds.map((subnetId, index) => {\n const subnet = ec2.Subnet.fromSubnetId(scope, `RdsPrivateSubnet${index}-${stage}`, subnetId)\n Annotations.of(subnet).acknowledgeWarning(\n '@aws-cdk/aws-ec2:noSubnetRouteTableId',\n 'This construct only passes imported subnets to Lambda VpcConfig and does not require routeTableId metadata.'\n )\n return subnet\n })\n\n const lambdaSecurityGroup = new ec2.SecurityGroup(scope, `RdsLambdaSecurityGroup-${stage}`, {\n vpc,\n description: config.securityGroupDescription ?? 'Lambda security group for RDS access',\n allowAllOutbound: true\n })\n\n if (config.overrideLogicalIds?.securityGroup || config.manageSgEgress === false) {\n const cfnSg = lambdaSecurityGroup.node.defaultChild\n if (!(cfnSg instanceof ec2.CfnSecurityGroup)) {\n throw new Error(\n 'Security group does not have a CfnSecurityGroup default child — ' +\n 'cannot apply overrideLogicalIds.securityGroup or manageSgEgress.'\n )\n }\n if (config.overrideLogicalIds?.securityGroup) {\n cfnSg.overrideLogicalId(config.overrideLogicalIds.securityGroup)\n }\n if (config.manageSgEgress === false) {\n cfnSg.addPropertyDeletionOverride('SecurityGroupEgress')\n }\n }\n\n const ingress = new ec2.CfnSecurityGroupIngress(scope, `RdsIngress-${stage}`, {\n groupId: config.dbSecurityGroupId,\n ipProtocol: 'tcp',\n fromPort: config.dbPort ?? 3306,\n toPort: config.dbPort ?? 3306,\n sourceSecurityGroupId: lambdaSecurityGroup.securityGroupId,\n description: 'Allow Lambda to access RDS'\n })\n\n if (config.overrideLogicalIds?.ingress) {\n ingress.overrideLogicalId(config.overrideLogicalIds.ingress)\n }\n\n if (config.overrideLogicalIds?.securityGroup) {\n // When the SG logical ID is pinned, CDK's auto-generated `Ref` on the\n // ingress points at the original (CDK-generated) logical ID. CloudFormation\n // can't resolve that reference at deploy and the changeset fails. Rewrite\n // the Ref to the overridden ID.\n ingress.addPropertyOverride('SourceSecurityGroupId', {\n Ref: config.overrideLogicalIds.securityGroup\n })\n }\n\n if (config.sharedRole) {\n config.sharedRole.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')\n )\n }\n\n return {\n vpc,\n vpcSubnets: { subnets: privateSubnets },\n securityGroups: [lambdaSecurityGroup]\n }\n}\n","import * as cdk from 'aws-cdk-lib'\nimport { CURRENTLY_RECOMMENDED_FLAGS } from 'aws-cdk-lib/cx-api'\nimport { Stage } from '../types'\n\nexport interface CreateEmAppOptions {\n /** Valid stage values. Defaults to all Stage values: dev, test, staging, prod */\n readonly validStages?: readonly Stage[]\n /** Default stage when no context is provided. Defaults to 'dev' */\n readonly defaultStage?: Stage\n /** Additional CDK context values. Applied after the standard feature flags. */\n readonly context?: Record<string, string | boolean | number>\n}\n\nexport interface EmAppContext {\n readonly app: cdk.App\n readonly stage: Stage\n}\n\n/**\n * Create a CDK App with stage resolution from context.\n * Reads `-c stage=...` from CDK context, defaults to 'dev'.\n * Validates against allowed values and throws on invalid input.\n *\n * @example\n * ```typescript\n * const { app, stage } = createEmApp({ validStages: ['dev', 'prod'] })\n * const cfg = getStageConfig(stage)\n * new MyServiceStack(app, `my-service-${stage}`, { stage, ...cfg })\n * app.synth()\n * ```\n */\nexport const createEmApp = (options?: CreateEmAppOptions): EmAppContext => {\n const app = new cdk.App({\n context: {\n ...CURRENTLY_RECOMMENDED_FLAGS,\n ...options?.context\n }\n })\n const rawStage = app.node.tryGetContext('stage') ?? options?.defaultStage ?? 'dev'\n const validStages = options?.validStages ?? ['dev', 'test', 'staging', 'prod']\n\n if (!validStages.includes(rawStage)) {\n throw new Error(\n `Invalid --context stage=\"${rawStage}\". Valid stages: ${validStages.join(', ')}`\n )\n }\n\n return { app, stage: rawStage as Stage }\n}\n","/**\n * Account-level RDS networking constants — the VPC, private subnets, and the\n * RDS security group that Lambda functions need to reach the shared database\n * cluster.\n *\n * These values are account-level constants: every service deploying into the\n * eMarketeer AWS account uses the same VPC/subnets/SG per stage. The VPC and\n * private subnets exist solely to give Lambdas a route to RDS — Lambdas that\n * don't talk to RDS do not need them.\n *\n * Designed to compose with `createRdsVpcConfig()` in `./rds-vpc`:\n *\n * ```typescript\n * const account = getAccountRdsVpcConfig(this.stage)\n * const vpcConfig = createRdsVpcConfig(this, this.stage, { ...account })\n * ```\n */\n\nimport { Stage } from '../types'\n\nexport interface AccountRdsVpcConfig {\n readonly vpcId: string\n readonly privateSubnetIds: readonly string[]\n readonly dbSecurityGroupId: string\n}\n\nexport function getAccountRdsVpcConfig(stage: Stage): AccountRdsVpcConfig {\n switch (stage) {\n case 'dev':\n return {\n vpcId: 'vpc-d2fd89b5',\n privateSubnetIds: ['subnet-7c74d81a', 'subnet-de04eb84', 'subnet-e29b26aa'],\n dbSecurityGroupId: 'sg-711c3f09'\n }\n case 'prod':\n return {\n vpcId: 'vpc-aeaf41cb',\n privateSubnetIds: ['subnet-dab14f80', 'subnet-e06ad686', 'subnet-14ea665c'],\n dbSecurityGroupId: 'sg-427bda39'\n }\n default:\n throw new Error(`getAccountRdsVpcConfig: unsupported stage \"${stage}\". Only 'dev' and 'prod' are supported.`)\n }\n}\n"],"names":["Tags","RetentionDays","LogGroup","RemovalPolicy","Role","ServicePrincipal","ManagedPolicy","PolicyStatement","Effect","Stack","Token","StringParameter","Runtime","path","fs","Code","AssetHashType","DockerImage","execFileSync","Construct","LambdaFunction","Duration","Architecture","Tracing","Table","BillingMode","StreamViewType","TableEncryption","CfnTable","ProjectionType","AttributeType","RestApi","LogGroupLogDestination","AccessLogFormat","Cors","EndpointType","MethodLoggingLevel","LambdaIntegration","CfnBasePathMapping","CfnApiMapping","HttpApi","CorsHttpMethod","HttpStage","createHash","HttpLambdaIntegration","PayloadFormatVersion","HttpMethod","Certificate","DomainName","ApiMapping","Queue","QueueEncryption","Aws","Topic","EmailSubscription","LambdaSubscription","SqsSubscription","Schedule","Rule","SqsQueue","SnsTopic","Alarm","ComparisonOperator","TreatMissingData","SnsAction","CfnAlarm","CfnFunction","CfnLogGroup","CfnLayerVersion","CfnRole","CfnOutput","CfnQueue","CfnSubscription","CfnPermission","CfnQueuePolicy","SqsEventSource","Annotations","cdk","ec2","CURRENTLY_RECOMMENDED_FLAGS"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/cdk/utils/naming.ts","../../../src/cdk/utils/tagging.ts","../../../src/cdk/utils/logs.ts","../../../src/cdk/utils/iam.ts","../../../src/cdk/utils/config.ts","../../../src/cdk/utils/constants.ts","../../../src/cdk/utils/handler-path.ts","../../../src/cdk/utils/bundling.ts","../../../src/cdk/constructs/lambda.ts","../../../src/cdk/constructs/dynamodb.ts","../../../src/cdk/constructs/api-gateway.ts","../../../src/cdk/constructs/sqs.ts","../../../src/cdk/constructs/sns.ts","../../../src/cdk/constructs/eventbridge.ts","../../../src/cdk/constructs/dlq-alarm.ts","../../../src/cdk/utils/serverless-migration.ts","../../../src/cdk/constructs/lambda-with-queue.ts","../../../src/cdk/constructs/service-lambda-with-queue.ts","../../../src/cdk/constructs/lambda-with-http-api.ts","../../../src/cdk/constructs/topic-queue-consumer.ts","../../../src/cdk/constructs/stack.ts","../../../src/cdk/utils/rds-vpc.ts","../../../src/cdk/utils/cdk-app.ts","../../../src/cdk/utils/account-rds-vpc.ts"],"sourcesContent":["/**\n * Stack naming conventions and utilities\n */\n\nimport { StackNamingConfig, Stage } from '../types'\n\n/**\n * Generate a standardized stack name\n * Format: {stage}-{serviceName}-stack\n */\nexport const generateStackName = (config: StackNamingConfig): string => {\n const { stage, serviceName } = config\n return `${stage}-${serviceName}-stack`\n}\n\n/**\n * Generate a standardized resource name\n * Format: {stage}-{serviceName}-{resourceType}-{resourceName}\n */\nexport const generateResourceName = (config: StackNamingConfig): string => {\n const { stage, serviceName, resourceType, resourceName } = config\n\n const parts = [stage, serviceName]\n\n if (resourceType) {\n parts.push(resourceType)\n }\n\n if (resourceName) {\n parts.push(resourceName)\n }\n\n return parts.join('-')\n}\n\n/**\n * Generate a standardized Lambda function name\n */\nexport const generateLambdaName = (\n stage: Stage,\n serviceName: string,\n functionName: string\n): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceName: functionName\n })\n}\n\n/**\n * Generate a standardized DynamoDB table name\n */\nexport const generateTableName = (stage: Stage, serviceName: string, tableName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'table',\n resourceName: tableName\n })\n}\n\n/**\n * Generate a standardized API Gateway name\n */\nexport const generateApiName = (stage: Stage, serviceName: string, apiName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'api',\n resourceName: apiName\n })\n}\n\n/**\n * Generate a standardized SQS queue name\n */\nexport const generateQueueName = (stage: Stage, serviceName: string, queueName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'queue',\n resourceName: queueName\n })\n}\n\n/**\n * Generate a standardized SNS topic name\n */\nexport const generateTopicName = (stage: Stage, serviceName: string, topicName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'topic',\n resourceName: topicName\n })\n}\n\n/**\n * Generate a standardized EventBridge rule name\n */\nexport const generateRuleName = (stage: Stage, serviceName: string, ruleName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'rule',\n resourceName: ruleName\n })\n}\n\n/**\n * Generate a standardized log group name\n */\nexport const generateLogGroupName = (\n stage: Stage,\n serviceName: string,\n resourceName: string\n): string => {\n return `${stage}-${serviceName}-${resourceName}`\n}\n\n/**\n * Generate a standardized IAM role name\n */\nexport const generateRoleName = (stage: Stage, serviceName: string, roleName: string): string => {\n return generateResourceName({\n stage,\n serviceName,\n resourceType: 'role',\n resourceName: roleName\n })\n}\n\n/**\n * Validate stage value\n */\nexport const isValidStage = (stage: string): stage is Stage => {\n return ['dev', 'test', 'staging', 'prod'].includes(stage)\n}\n\n/**\n * Convert stage to uppercase for environment variables\n */\nexport const stageToUpperCase = (stage: Stage): string => {\n return stage.toUpperCase()\n}\n","/**\n * Tagging strategies and utilities\n */\n\nimport { Tags } from 'aws-cdk-lib'\nimport { Construct } from 'constructs'\nimport { TaggingConfig } from '../types'\n\n/**\n * Standard tags applied to all resources\n */\nexport interface StandardTags {\n Stage: string\n Service: string\n ManagedBy: string\n Owner?: string\n CostCenter?: string\n Project?: string\n}\n\n/**\n * Generate standard tags for a resource\n */\nexport const generateStandardTags = (config: TaggingConfig): StandardTags => {\n const tags: StandardTags = {\n Stage: config.stage,\n Service: config.serviceName,\n ManagedBy: 'CDK'\n }\n\n if (config.owner) {\n tags.Owner = config.owner\n }\n\n if (config.costCenter) {\n tags.CostCenter = config.costCenter\n }\n\n if (config.project) {\n tags.Project = config.project\n }\n\n return tags\n}\n\n/**\n * Apply standard tags to a construct\n */\nexport const applyStandardTags = (construct: Construct, config: TaggingConfig): void => {\n const standardTags = generateStandardTags(config)\n\n Object.entries(standardTags).forEach(([key, value]) => {\n if (value) {\n Tags.of(construct).add(key, value)\n }\n })\n\n if (config.customTags) {\n Object.entries(config.customTags).forEach(([key, value]) => {\n Tags.of(construct).add(key, value)\n })\n }\n}\n\n/**\n * Apply tags from a simple record\n */\nexport const applyTags = (construct: Construct, tags: Record<string, string>): void => {\n Object.entries(tags).forEach(([key, value]) => {\n Tags.of(construct).add(key, value)\n })\n}\n\n/**\n * Merge multiple tag sets\n */\nexport const mergeTags = (...tagSets: Record<string, string>[]): Record<string, string> => {\n return Object.assign({}, ...tagSets)\n}\n\n/**\n * Generate environment-specific tags\n */\nexport const getEnvironmentTags = (stage: string): Record<string, string> => {\n const tags: Record<string, string> = {\n Stage: stage\n }\n\n switch (stage) {\n case 'prod':\n tags.Environment = 'production'\n tags.Tier = 'production'\n break\n case 'staging':\n tags.Environment = 'staging'\n tags.Tier = 'pre-production'\n break\n case 'test':\n tags.Environment = 'test'\n tags.Tier = 'testing'\n break\n case 'dev':\n tags.Environment = 'development'\n tags.Tier = 'development'\n break\n }\n\n return tags\n}\n\n/**\n * Generate cost allocation tags\n */\nexport const getCostAllocationTags = (\n serviceName: string,\n costCenter?: string,\n project?: string\n): Record<string, string> => {\n const tags: Record<string, string> = {\n Service: serviceName\n }\n\n if (costCenter) {\n tags.CostCenter = costCenter\n }\n\n if (project) {\n tags.Project = project\n }\n\n return tags\n}\n\n/**\n * Generate compliance tags\n */\nexport const getComplianceTags = (\n dataClassification?: 'public' | 'internal' | 'confidential' | 'restricted',\n compliance?: string[]\n): Record<string, string> => {\n const tags: Record<string, string> = {}\n\n if (dataClassification) {\n tags.DataClassification = dataClassification\n }\n\n if (compliance && compliance.length > 0) {\n tags.Compliance = compliance.join(',')\n }\n\n return tags\n}\n","/**\n * CloudWatch log group configuration utilities\n */\n\nimport { RemovalPolicy } from 'aws-cdk-lib'\nimport { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'\nimport { Construct } from 'constructs'\nimport { LogGroupConfig, Stage } from '../types'\nimport { generateLogGroupName } from './naming'\n\n/**\n * Get retention days based on stage\n */\nexport const getLogRetentionDays = (stage: Stage): RetentionDays => {\n switch (stage) {\n case 'prod':\n return RetentionDays.ONE_MONTH\n case 'staging':\n return RetentionDays.TWO_WEEKS\n case 'test':\n return RetentionDays.ONE_WEEK\n case 'dev':\n return RetentionDays.THREE_DAYS\n default:\n // Stage is a compile-time union. A runtime value outside it means a\n // caller widened the type — fail loud rather than silently returning a\n // dev-shaped default for what may be a production deployment.\n throw new Error(`getLogRetentionDays: unknown stage \"${stage as string}\"`)\n }\n}\n\n/**\n * Convert retention days number to RetentionDays enum.\n *\n * Validates `days` against `RetentionDays`'s TS enum reverse-mapping (every\n * numeric enum member exposes its name as a string-keyed property — e.g.\n * `RetentionDays[1] === 'ONE_DAY'`). This catches typos without\n * hand-maintaining a switch in parallel with the SDK enum.\n *\n * `0` is rejected even though `RetentionDays.INFINITE === 0`: passing 0 from\n * a config object almost always means \"unset\" rather than \"retain forever\".\n * Callers that genuinely want INFINITE must pass `RetentionDays.INFINITE`\n * explicitly via a non-numeric path (or update this guard with a clear test).\n */\nexport const convertRetentionDays = (days?: number): RetentionDays | undefined => {\n if (days === undefined || days === null) return undefined\n\n if (days === 0) {\n throw new Error(\n 'logRetentionDays: 0 is not accepted (would map to RetentionDays.INFINITE). '\n + 'Pass RetentionDays.INFINITE explicitly if infinite retention is intended.'\n )\n }\n\n if (typeof (RetentionDays as Record<number, string | undefined>)[days] !== 'string') {\n const supported = Object.values(RetentionDays)\n .filter((v): v is number => typeof v === 'number')\n .sort((a, b) => a - b)\n .join(', ')\n throw new Error(`Unsupported logRetentionDays value: ${days}. Supported values: ${supported}`)\n }\n return days as RetentionDays\n}\n\n/**\n * Create a CloudWatch log group with standard configuration\n */\nexport const createLogGroup = (scope: Construct, id: string, config: LogGroupConfig): LogGroup => {\n const retentionDays = config.retentionDays\n ? convertRetentionDays(config.retentionDays)\n : getLogRetentionDays(config.stage)\n\n return new LogGroup(scope, id, {\n logGroupName: config.logGroupName,\n retention: retentionDays,\n removalPolicy: config.stage === 'prod' ? RemovalPolicy.RETAIN : RemovalPolicy.DESTROY\n })\n}\n\n/**\n * Create an API Gateway log group\n */\nexport const createApiGatewayLogGroup = (\n scope: Construct,\n id: string,\n stage: Stage,\n serviceName: string,\n apiName: string,\n retentionDays?: number\n): LogGroup => {\n const logGroupName = `/aws/apigateway/${generateLogGroupName(stage, serviceName, apiName)}`\n\n return createLogGroup(scope, id, {\n logGroupName,\n stage,\n retentionDays\n })\n}\n\n/**\n * Get removal policy based on stage\n */\nexport const getRemovalPolicy = (stage: Stage): RemovalPolicy => {\n switch (stage) {\n case 'prod':\n return RemovalPolicy.RETAIN\n case 'staging':\n case 'test':\n case 'dev':\n return RemovalPolicy.DESTROY\n default:\n // Same rationale as getLogRetentionDays: a typo like 'production' must\n // not silently produce DESTROY for what should be a retained resource.\n throw new Error(`getRemovalPolicy: unknown stage \"${stage as string}\"`)\n }\n}\n","import { Effect, PolicyStatement, Role, ServicePrincipal, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { IamRoleConfig } from '../types'\nimport { generateRoleName } from './naming'\n\n/**\n * Create a Lambda execution role with standard permissions\n */\nexport const createLambdaExecutionRole = (\n scope: Construct,\n id: string,\n config: IamRoleConfig\n): Role => {\n const roleName = generateRoleName(config.stage, config.serviceName, config.roleName)\n\n const role = new Role(scope, id, {\n roleName,\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n description: `Lambda execution role for ${config.serviceName}`,\n ...(config.inlinePolicies && { inlinePolicies: config.inlinePolicies })\n })\n\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')\n )\n\n config.managedPolicies?.forEach(policy => {\n role.addManagedPolicy(policy)\n })\n\n return role\n}\n\n/**\n * Create an X-Ray tracing policy statement\n */\nexport const createXRayTracingPolicy = (): PolicyStatement => {\n return new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['xray:PutTraceSegments', 'xray:PutTelemetryRecords'],\n resources: ['*']\n })\n}\n","import { Stack, Token } from 'aws-cdk-lib'\nimport { Construct } from 'constructs'\nimport { StringParameter } from 'aws-cdk-lib/aws-ssm'\nimport { Stage } from '../types'\n\nconst RECAP_DEV_SSM_KEY = 'recap-dev-sync-endpoint'\nconst recapDevEndpointCache = new WeakMap<Stack, string>()\n\nexport const RECAP_DEV_TIMEOUT_WINDOW_SECONDS = 300\n\n/**\n * Returns the standard base environment variables injected into every Lambda.\n * Centralised here so both EmLambdaFunction and LambdaWithQueue stay in sync.\n */\nexport const buildBaseEnvironment = (stage: Stage, scope: Construct): Record<string, string> => ({\n STAGE: stage,\n NODE_ENV: stage === 'prod' ? 'production' : 'development',\n REGION: Stack.of(scope).region,\n})\n\n/**\n * Returns the env var block to inject for recap.dev, or an empty object.\n *\n * The `dummy-value-` early-return guards against CDK's SSM lookup placeholder:\n * `valueFromLookup` returns `dummy-value-…` strings during the first synth\n * before the cache file is populated, and we must not bake those into the\n * Lambda's environment.\n */\nexport const buildRecapDevEnvironment = (endpoint: string | undefined): Record<string, string> => {\n if (!endpoint || endpoint.startsWith('dummy-value-')) {\n return {}\n }\n\n let parsed: URL\n try {\n parsed = new URL(endpoint)\n } catch {\n throw new Error(`recap.dev endpoint is not a valid URL: \"${endpoint}\"`)\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`recap.dev endpoint must use http or https, got: ${parsed.protocol}`)\n }\n\n return {\n RECAP_DEV_SYNC_ENDPOINT: endpoint,\n RECAP_DEV_TIMEOUT_WINDOW: String(RECAP_DEV_TIMEOUT_WINDOW_SECONDS)\n }\n}\n\n/**\n * Resolves the recap.dev sync endpoint from SSM at synth time.\n * Cached per stack so the SSM lookup happens once per stack\n * regardless of how many constructs call this.\n */\nexport const resolveRecapDevEndpoint = (scope: Construct): string | undefined => {\n const stack = Stack.of(scope)\n if (Token.isUnresolved(stack.account) || Token.isUnresolved(stack.region)) {\n return undefined\n }\n if (!recapDevEndpointCache.has(stack)) {\n recapDevEndpointCache.set(stack, StringParameter.valueFromLookup(stack, RECAP_DEV_SSM_KEY))\n }\n return recapDevEndpointCache.get(stack)!\n}\n","import { Runtime } from 'aws-cdk-lib/aws-lambda'\n\nexport const DEFAULT_LAMBDA_RUNTIME = Runtime.NODEJS_24_X\n","import * as path from 'path'\n\nconst DEFAULT_HANDLERS_DIR = 'src/handlers'\n\n/**\n * Public type for constructing handler path config. Enforces at compile time\n * that either `handlerPath` or `functionName` is provided — the runtime throw\n * in `resolveHandlerPath` is a safety net for internal callers that widen the type.\n */\nexport type HandlerPathConfig =\n | {\n readonly handlerPath: string\n readonly functionName?: string\n readonly handler?: string\n readonly codePath?: string\n }\n | {\n readonly handlerPath?: undefined\n readonly functionName: string\n readonly handler?: string\n readonly codePath?: string\n }\n\nexport interface ResolvedHandlerPath {\n readonly functionName: string\n readonly handler?: string\n /**\n * Absolute or project-relative path to the source TS handler file derived\n * from `handlerPath`. Unset when the caller provided an explicit `codePath`\n * (escape hatch — code is packaged as-is, no bundling).\n */\n readonly entryFile?: string\n /** Pass-through of an explicit `codePath` from the input config. */\n readonly codePath?: string\n}\n\n/**\n * Internal flat type accepted by `resolveHandlerPath`. Wider than `HandlerPathConfig`\n * so that internal call sites passing objects with both fields optional still compile.\n * The invariant is enforced at public API boundaries via `HandlerPathConfig`.\n */\ninterface HandlerPathInput {\n readonly handlerPath?: string\n readonly functionName?: string\n readonly handler?: string\n readonly codePath?: string\n}\n\n/**\n * Resolve `handlerPath` into `entryFile`, `handler`, and optionally `functionName`.\n *\n * Given `handlerPath: 'src/handlers/capture-screenshot/capture-screenshot-from-url'`:\n * - `entryFile` → `'src/handlers/capture-screenshot/capture-screenshot-from-url.ts'`\n * - `handler` → `'index.handler'`\n * - `functionName` → `'capture-screenshot-from-url'` (only when not explicitly provided)\n *\n * When `codePath` is provided, `entryFile` is left unset — the construct will\n * package `codePath` directly (no bundling).\n *\n * When `handlerPath` is not provided, `functionName` is required.\n */\nexport function resolveHandlerPath(config: HandlerPathInput): ResolvedHandlerPath {\n const { handlerPath } = config\n\n if (handlerPath) {\n const normalised = handlerPath.replace(/\\.ts$/, '')\n const startsWithHandlersDir = normalised.startsWith(`${DEFAULT_HANDLERS_DIR}/`)\n const containsSeparator = normalised.includes('/') || normalised.includes(path.sep)\n\n if (!startsWithHandlersDir && (path.isAbsolute(normalised) || containsSeparator)) {\n // A bare basename like 'get-data' is fine (treated as relative to\n // src/handlers). Anything with directory components must be rooted at\n // DEFAULT_HANDLERS_DIR — otherwise we'd silently produce e.g.\n // 'src/lambdas/foo.ts' and fail at synth with an opaque\n // Code.fromAsset error far from the call site.\n throw new Error(\n `resolveHandlerPath: handlerPath \"${handlerPath}\" must either be a bare basename or start with \"${DEFAULT_HANDLERS_DIR}/\".`\n )\n }\n\n const relative = startsWithHandlersDir\n ? normalised.slice(DEFAULT_HANDLERS_DIR.length + 1)\n : normalised\n\n return {\n functionName: config.functionName ?? path.basename(relative),\n handler: config.handler ?? 'index.handler',\n entryFile: config.codePath ? undefined : path.join(DEFAULT_HANDLERS_DIR, `${relative}.ts`),\n codePath: config.codePath\n }\n }\n\n if (!config.functionName) {\n throw new Error('Either `handlerPath` or `functionName` must be provided.')\n }\n\n return {\n functionName: config.functionName,\n handler: config.handler,\n codePath: config.codePath\n }\n}\n","import * as path from 'path'\nimport * as fs from 'fs'\nimport { execFileSync } from 'child_process'\nimport { AssetHashType, DockerImage } from 'aws-cdk-lib'\nimport { Code } from 'aws-cdk-lib/aws-lambda'\n\n/**\n * Per-handler esbuild overrides applied on top of the default bundler config\n * (Node 24, CJS, minified, externalised AWS SDK + DB drivers, recap.dev wrappers).\n *\n * `external` is appended to the default externals list. All other fields\n * replace their default. Plugins, entryPoints, outdir, bundle/platform/format\n * are not exposed — they are fixed by the bundler.\n */\nexport interface BundlingOverrides {\n readonly external?: string[]\n readonly target?: string | string[]\n readonly minify?: boolean\n readonly sourcemap?: boolean | 'linked' | 'inline' | 'external' | 'both'\n readonly define?: Record<string, string>\n readonly banner?: { js?: string; css?: string }\n readonly footer?: { js?: string; css?: string }\n readonly loader?: Record<string, string>\n readonly mainFields?: string[]\n readonly conditions?: string[]\n readonly keepNames?: boolean\n readonly treeShaking?: boolean\n readonly legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'external'\n readonly charset?: 'ascii' | 'utf8'\n readonly pure?: string[]\n /**\n * Packages copied verbatim from the consuming project's `node_modules/` into\n * the lambda asset directory (alongside the bundled `index.js`), and added to\n * the esbuild `external` list. Use for packages that can't be bundled because\n * they perform `require.resolve()` against their own files at runtime\n * (`playwright-core`, `puppeteer-core`, `sharp`, etc.).\n *\n * Each listed package is resolved from the consuming project's CWD. Its\n * declared `dependencies` are walked transitively and copied as well.\n * `peerDependencies` and `optionalDependencies` are NOT auto-included — list\n * them explicitly if needed.\n *\n * Symlinked packages (yarn workspaces, pnpm) are dereferenced so the lambda\n * zip contains real files. Native binaries are NOT recompiled — packages with\n * prebuilds must already match the lambda's runtime architecture.\n */\n readonly nodeModules?: string[]\n}\n\nexport interface ResolveLambdaCodeOptions {\n /**\n * Source TS entry file (e.g. `src/handlers/foo.ts`).\n * Required when `codePath` is not provided.\n */\n readonly entryFile?: string\n /**\n * Pre-built directory passed straight to `Code.fromAsset` — bundling is skipped.\n * Use for migration or test scenarios where the code is already built.\n */\n readonly codePath?: string\n readonly bundling?: BundlingOverrides\n}\n\nconst HANDLER_BUNDLER_RELATIVE_PATH = path.join('dist', 'handler-bundler.js')\nconst PACKAGE_NAME = '@emarketeer/ts-microservice-commons'\n\nlet cachedBundlerPath: string | undefined\n\nfunction getHandlerBundlerPath(): string {\n if (cachedBundlerPath) {\n return cachedBundlerPath\n }\n const cwd = process.cwd()\n const candidates = [\n path.join(cwd, 'node_modules', PACKAGE_NAME, HANDLER_BUNDLER_RELATIVE_PATH),\n path.join(cwd, HANDLER_BUNDLER_RELATIVE_PATH)\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n cachedBundlerPath = candidate\n return candidate\n }\n }\n throw new Error(\n `Could not locate the handler bundler. Searched:\\n${candidates.map((c) => ` - ${c}`).join('\\n')}\\n`\n + `Ensure ${PACKAGE_NAME} is installed.`\n )\n}\n\n/**\n * Build the `Code` asset for a Lambda function.\n *\n * - When `codePath` is set, packages that directory directly (no bundling).\n * - Otherwise bundles `entryFile` via the project handler bundler at synth\n * time, with overrides applied on top of the defaults.\n *\n * Bundling uses `assetHashType: OUTPUT` so the asset hash is computed from\n * the bundled output rather than from the (transitive) source tree.\n */\nexport function resolveLambdaCode(options: ResolveLambdaCodeOptions): Code {\n if (options.codePath) {\n return Code.fromAsset(options.codePath)\n }\n if (!options.entryFile) {\n throw new Error('resolveLambdaCode: either `entryFile` or `codePath` is required.')\n }\n\n const entry = path.resolve(options.entryFile)\n if (!fs.existsSync(entry)) {\n throw new Error(`resolveLambdaCode: entry file not found: ${entry}`)\n }\n const overrides = options.bundling\n const bundlerPath = getHandlerBundlerPath()\n\n return Code.fromAsset(path.dirname(entry), {\n assetHashType: AssetHashType.OUTPUT,\n bundling: {\n // CDK requires `image` even when local bundling succeeds. We never use\n // the Docker fallback — `tryBundle` always returns true.\n image: DockerImage.fromRegistry('node:24'),\n local: {\n tryBundle(outputDir: string): boolean {\n const stdin = JSON.stringify({ entry, outDir: outputDir, overrides })\n execFileSync('node', [bundlerPath], {\n input: stdin,\n stdio: ['pipe', 'inherit', 'inherit']\n })\n return true\n }\n }\n }\n })\n}\n","import { Duration } from 'aws-cdk-lib'\nimport { Function as LambdaFunction, Tracing, Architecture } from 'aws-cdk-lib/aws-lambda'\nimport { IRole, IManagedPolicy, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { Construct } from 'constructs'\nimport { LambdaConfig } from '../types'\nimport { generateLambdaName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { convertRetentionDays, getLogRetentionDays, getRemovalPolicy } from '../utils/logs'\nimport { createLambdaExecutionRole } from '../utils/iam'\nimport { buildBaseEnvironment, buildRecapDevEnvironment, resolveRecapDevEndpoint } from '../utils/config'\nimport { DEFAULT_LAMBDA_RUNTIME } from '../utils/constants'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { resolveLambdaCode } from '../utils/bundling'\n\nexport class EmLambdaFunction extends Construct {\n public readonly function: LambdaFunction\n\n constructor(scope: Construct, id: string, config: LambdaConfig) {\n super(scope, id)\n\n const resolved = resolveHandlerPath(config)\n const functionName =\n config.physicalName ??\n generateLambdaName(config.stage, config.serviceName, resolved.functionName)\n\n const extraPolicies: IManagedPolicy[] = []\n if (config.vpcConfig) {\n extraPolicies.push(ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole'))\n }\n if (config.enableTracing) {\n extraPolicies.push(ManagedPolicy.fromAwsManagedPolicyName('AWSXRayDaemonWriteAccess'))\n }\n\n const role: IRole =\n config.role ??\n createLambdaExecutionRole(this, 'Role', {\n roleName: resolved.functionName,\n stage: config.stage,\n serviceName: config.serviceName,\n managedPolicies: extraPolicies.length ? extraPolicies : undefined\n })\n\n // When the caller supplies a role (typically EmStack's sharedRole during\n // Serverless migration) createLambdaExecutionRole is bypassed and the\n // VPC/X-Ray policies above are not attached. Attach them here so\n // vpcConfig/enableTracing produce a working role regardless of source.\n if (config.role) {\n extraPolicies.forEach(policy => role.addManagedPolicy(policy))\n }\n\n const logGroup: ILogGroup = config.importExistingLogGroup\n ? LogGroup.fromLogGroupName(this, `${id}LogGroup`, `/aws/lambda/${functionName}`)\n : new LogGroup(this, `${id}LogGroup`, {\n logGroupName: `/aws/lambda/${functionName}`,\n retention:\n convertRetentionDays(config.logRetentionDays) ?? getLogRetentionDays(config.stage),\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n const handler = resolved.handler ?? config.handler\n const codePath = resolved.codePath ?? config.codePath\n if (!handler) {\n throw new Error(\n `EmLambdaFunction requires either \\`handlerPath\\` or \\`handler\\` for \"${resolved.functionName}\".`\n )\n }\n if (!resolved.entryFile && !codePath) {\n throw new Error(\n `EmLambdaFunction requires either \\`handlerPath\\` or \\`codePath\\` for \"${resolved.functionName}\".`\n )\n }\n\n const code = resolveLambdaCode({\n entryFile: resolved.entryFile,\n codePath,\n bundling: config.bundling\n })\n\n this.function = new LambdaFunction(this, 'Function', {\n functionName,\n runtime: config.runtime ?? DEFAULT_LAMBDA_RUNTIME,\n handler,\n code,\n memorySize: config.memorySize ?? 1024,\n timeout: config.timeout ?? Duration.seconds(15),\n environment: {\n ...buildBaseEnvironment(config.stage, this),\n ...(config.environment ?? {}),\n ...buildRecapDevEnvironment(resolveRecapDevEndpoint(this))\n },\n role,\n architecture: config.architecture ?? Architecture.ARM_64,\n tracing: config.enableTracing ? Tracing.ACTIVE : Tracing.DISABLED,\n reservedConcurrentExecutions: config.reservedConcurrentExecutions,\n retryAttempts: config.retryAttempts,\n logGroup,\n layers: config.layers,\n description: `${config.serviceName} - ${resolved.functionName}`,\n ...(config.vpcConfig && {\n vpc: config.vpcConfig.vpc,\n vpcSubnets: config.vpcConfig.vpcSubnets,\n securityGroups: config.vpcConfig.securityGroups\n })\n })\n\n applyStandardTags(this.function, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n}\n","/**\n * Common DynamoDB table construct with standard configurations\n */\n\nimport {\n Table,\n AttributeType,\n BillingMode,\n CfnTable,\n StreamViewType,\n ProjectionType,\n TableEncryption\n} from 'aws-cdk-lib/aws-dynamodb'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { DynamoDBTableConfig, DynamoDBGSIConfig } from '../types'\nimport { generateTableName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getRemovalPolicy } from '../utils/logs'\n\n/**\n * Standard DynamoDB table construct with eMarketeer defaults\n */\nexport class EmDynamoDBTable extends Construct {\n public readonly table: Table\n\n constructor(scope: Construct, id: string, config: DynamoDBTableConfig) {\n super(scope, id)\n\n const tableName =\n config.rawTableName ?? generateTableName(config.stage, config.serviceName, config.tableName)\n\n // Create DynamoDB table\n this.table = new Table(this, 'Table', {\n tableName,\n partitionKey: config.partitionKey,\n sortKey: config.sortKey,\n billingMode: config.billingMode || BillingMode.PAY_PER_REQUEST,\n pointInTimeRecoverySpecification: {\n pointInTimeRecoveryEnabled: config.pointInTimeRecovery ?? config.stage === 'prod'\n },\n deletionProtection: config.deletionProtection ?? config.stage === 'prod',\n stream: config.stream ? StreamViewType.NEW_AND_OLD_IMAGES : undefined,\n timeToLiveAttribute: config.timeToLiveAttribute,\n encryption: TableEncryption.AWS_MANAGED,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n if (config.overrideLogicalId) {\n const cfnTable = this.table.node.defaultChild\n if (!(cfnTable instanceof CfnTable)) {\n throw new Error(\n `Cannot override table logical ID to \"${config.overrideLogicalId}\": ` +\n 'table does not have a CfnTable default child.'\n )\n }\n cfnTable.overrideLogicalId(config.overrideLogicalId)\n }\n\n // Add Global Secondary Indexes\n if (config.globalSecondaryIndexes) {\n config.globalSecondaryIndexes.forEach(gsi => {\n this.addGlobalSecondaryIndex(gsi)\n })\n }\n\n // Apply standard tags\n applyStandardTags(this.table, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Add a Global Secondary Index to the table\n */\n private addGlobalSecondaryIndex(gsiConfig: DynamoDBGSIConfig): void {\n this.table.addGlobalSecondaryIndex({\n indexName: gsiConfig.indexName,\n partitionKey: gsiConfig.partitionKey,\n sortKey: gsiConfig.sortKey,\n projectionType: gsiConfig.projectionType || ProjectionType.ALL,\n nonKeyAttributes: gsiConfig.nonKeyAttributes\n })\n }\n\n /**\n * Get the table\n */\n public getTable(): Table {\n return this.table\n }\n\n /**\n * Get the table ARN\n */\n public getTableArn(): string {\n return this.table.tableArn\n }\n\n /**\n * Get the table name\n */\n public getTableName(): string {\n return this.table.tableName\n }\n\n /**\n * Grant read permissions to a grantee\n */\n public grantReadData(grantee: IGrantable) {\n return this.table.grantReadData(grantee)\n }\n\n /**\n * Grant write permissions to a grantee\n */\n public grantWriteData(grantee: IGrantable) {\n return this.table.grantWriteData(grantee)\n }\n\n /**\n * Grant read/write permissions to a grantee\n */\n public grantReadWriteData(grantee: IGrantable) {\n return this.table.grantReadWriteData(grantee)\n }\n\n /**\n * Grant stream read permissions to a grantee\n */\n public grantStreamRead(grantee: IGrantable) {\n return this.table.grantStreamRead(grantee)\n }\n}\n\n/**\n * Helper function to create a DynamoDB table with single-table design pattern\n */\nexport const createSingleTable = (\n scope: Construct,\n id: string,\n config: Omit<DynamoDBTableConfig, 'partitionKey' | 'sortKey'>\n): EmDynamoDBTable => {\n return new EmDynamoDBTable(scope, id, {\n ...config,\n partitionKey: {\n name: 'PK',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'SK',\n type: AttributeType.STRING\n }\n })\n}\n\n/**\n * Helper function to create a simple key-value table\n */\nexport const createKeyValueTable = (\n scope: Construct,\n id: string,\n config: Omit<DynamoDBTableConfig, 'partitionKey'>\n): EmDynamoDBTable => {\n return new EmDynamoDBTable(scope, id, {\n ...config,\n partitionKey: {\n name: 'id',\n type: AttributeType.STRING\n }\n })\n}\n\n/**\n * Common GSI configurations\n */\nexport const GSI_PATTERNS = {\n /**\n * GSI for querying by a secondary attribute\n */\n byAttribute: (attributeName: string, indexName?: string): DynamoDBGSIConfig => ({\n indexName: indexName || `${attributeName}Index`,\n partitionKey: {\n name: attributeName,\n type: AttributeType.STRING\n },\n projectionType: ProjectionType.ALL\n }),\n\n /**\n * GSI for querying by status and timestamp\n */\n byStatusAndTimestamp: (indexName = 'StatusTimestampIndex'): DynamoDBGSIConfig => ({\n indexName,\n partitionKey: {\n name: 'status',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'timestamp',\n type: AttributeType.NUMBER\n },\n projectionType: ProjectionType.ALL\n }),\n\n /**\n * GSI for single-table design pattern\n */\n singleTableGSI: (indexName = 'GSI1'): DynamoDBGSIConfig => ({\n indexName,\n partitionKey: {\n name: 'GSI1PK',\n type: AttributeType.STRING\n },\n sortKey: {\n name: 'GSI1SK',\n type: AttributeType.STRING\n },\n projectionType: ProjectionType.ALL\n })\n}\n","/**\n * Common API Gateway constructs (REST API and HTTP API)\n */\n\nimport {\n RestApi,\n LambdaIntegration,\n LambdaIntegrationOptions,\n Cors,\n LogGroupLogDestination,\n AccessLogFormat,\n MethodLoggingLevel,\n EndpointType,\n CfnBasePathMapping\n} from 'aws-cdk-lib/aws-apigateway'\nimport {\n HttpApi,\n HttpStage,\n CorsHttpMethod,\n HttpMethod,\n PayloadFormatVersion,\n DomainName,\n ApiMapping,\n CfnApiMapping\n} from 'aws-cdk-lib/aws-apigatewayv2'\nimport { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'\nimport { Certificate } from 'aws-cdk-lib/aws-certificatemanager'\nimport { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda'\nimport { ILogGroup, LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { createHash } from 'crypto'\nimport { Construct } from 'constructs'\nimport { RestApiConfig, HttpApiConfig } from '../types'\nimport { generateApiName, generateLogGroupName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { createApiGatewayLogGroup } from '../utils/logs'\n\n/**\n * Standard REST API construct with eMarketeer defaults\n */\nexport class EmRestApi extends Construct {\n public readonly api: RestApi\n public readonly logGroup: ILogGroup\n\n constructor(scope: Construct, id: string, config: RestApiConfig) {\n super(scope, id)\n\n const apiName = generateApiName(config.stage, config.serviceName, config.apiName)\n\n // Create or import log group\n this.logGroup = config.importExistingLogGroup\n ? LogGroup.fromLogGroupName(\n this,\n 'LogGroup',\n `/aws/apigateway/${generateLogGroupName(\n config.stage,\n config.serviceName,\n config.apiName\n )}`\n )\n : createApiGatewayLogGroup(this, 'LogGroup', config.stage, config.serviceName, config.apiName)\n\n // Create REST API\n this.api = new RestApi(this, 'Api', {\n restApiName: apiName,\n description: config.description || `${config.serviceName} REST API`,\n deployOptions: {\n stageName: config.deployOptions?.stageName ?? config.stage,\n throttlingRateLimit: config.deployOptions?.throttleRateLimit ?? 10000,\n throttlingBurstLimit: config.deployOptions?.throttleBurstLimit ?? 5000,\n loggingLevel: this.getLoggingLevel(config.deployOptions?.loggingLevel),\n dataTraceEnabled: config.deployOptions?.dataTraceEnabled ?? false,\n metricsEnabled: config.deployOptions?.metricsEnabled ?? true,\n accessLogDestination: new LogGroupLogDestination(this.logGroup),\n accessLogFormat: AccessLogFormat.jsonWithStandardFields()\n },\n defaultCorsPreflightOptions: config.defaultCorsOptions\n ? {\n allowOrigins: config.defaultCorsOptions.allowOrigins ?? Cors.ALL_ORIGINS,\n allowMethods: config.defaultCorsOptions.allowMethods || Cors.ALL_METHODS,\n allowHeaders: config.defaultCorsOptions.allowHeaders || Cors.DEFAULT_HEADERS,\n allowCredentials: config.defaultCorsOptions.allowCredentials\n }\n : undefined,\n endpointTypes: [this.resolveEndpointType(config.endpointType)],\n binaryMediaTypes: config.binaryMediaTypes,\n policy: undefined\n })\n\n // Apply standard tags\n applyStandardTags(this.api, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n private resolveEndpointType(type?: 'EDGE' | 'REGIONAL' | 'PRIVATE'): EndpointType {\n switch (type) {\n case 'EDGE':\n return EndpointType.EDGE\n case 'PRIVATE':\n return EndpointType.PRIVATE\n default:\n return EndpointType.REGIONAL\n }\n }\n\n /**\n * Get logging level enum from string\n */\n private getLoggingLevel(level?: string): MethodLoggingLevel {\n switch (level?.toUpperCase()) {\n case 'ERROR':\n return MethodLoggingLevel.ERROR\n case 'INFO':\n return MethodLoggingLevel.INFO\n case 'OFF':\n return MethodLoggingLevel.OFF\n default:\n return MethodLoggingLevel.INFO\n }\n }\n\n /**\n * Add a Lambda integration to a path\n */\n public addLambdaIntegration(\n path: string,\n method: string,\n handler: LambdaFunction,\n options?: LambdaIntegrationOptions\n ) {\n const resource = this.api.root.resourceForPath(path)\n const integration = new LambdaIntegration(handler, options)\n return resource.addMethod(method, integration)\n }\n\n /**\n * Add a base path mapping to an existing custom domain.\n *\n * Use this when the domain was created externally (e.g. by serverless-domain-manager)\n * and you just need to point a base path at this API's deployment stage.\n *\n * @param domainName - The custom domain name (e.g. `'api.example.com'`)\n * @param options - Optional basePath (defaults to `''`) and logical ID override\n * @returns The CfnBasePathMapping resource\n *\n * @example\n * ```typescript\n * const mapping = restApi.addBasePathMapping('api.example.com', {\n * basePath: 'screenshots',\n * logicalId: 'ScreenshotBasePathMapping',\n * })\n * ```\n */\n public addBasePathMapping(\n domainName: string,\n options?: { basePath?: string; logicalId?: string }\n ): CfnBasePathMapping {\n const basePath = options?.basePath ?? ''\n const id = options?.logicalId ?? `${domainName.replace(/\\./g, '')}BasePathMapping`\n\n const mapping = new CfnBasePathMapping(this, id, {\n domainName,\n restApiId: this.api.restApiId,\n stage: this.api.deploymentStage.stageName,\n basePath: basePath || undefined\n })\n\n mapping.node.addDependency(this.api)\n\n if (options?.logicalId) {\n mapping.overrideLogicalId(options.logicalId)\n }\n\n return mapping\n }\n\n /**\n * Add a V2 API mapping to an existing custom domain.\n *\n * Use this instead of `addBasePathMapping` when the domain was created by\n * serverless-domain-manager (which uses API Gateway V2 API mappings, not\n * V1 base path mappings).\n *\n * @param domainName - The custom domain name (e.g. `'api.example.com'`)\n * @param options - Optional basePath and logical ID override\n * @returns The CfnApiMapping resource\n *\n * @example\n * ```typescript\n * restApi.addApiMapping('api.example.com', {\n * basePath: 'forms',\n * logicalId: 'FormsApiMapping',\n * })\n * ```\n */\n public addApiMapping(\n domainName: string,\n options?: { basePath?: string; logicalId?: string }\n ): CfnApiMapping {\n const basePath = options?.basePath ?? ''\n const id = options?.logicalId ?? `${domainName.replace(/\\./g, '')}ApiMapping`\n\n const mapping = new CfnApiMapping(this, id, {\n apiId: this.api.restApiId,\n domainName,\n stage: this.api.deploymentStage.stageName,\n apiMappingKey: basePath || undefined\n })\n\n mapping.node.addDependency(this.api)\n\n if (options?.logicalId) {\n mapping.overrideLogicalId(options.logicalId)\n }\n\n return mapping\n }\n\n /**\n * Get the API\n */\n public getApi(): RestApi {\n return this.api\n }\n\n /**\n * Get the API URL\n */\n public getApiUrl(): string {\n return this.api.url\n }\n\n /**\n * Get the API ID\n */\n public getApiId(): string {\n return this.api.restApiId\n }\n}\n\n/**\n * Standard HTTP API construct with eMarketeer defaults\n */\nexport class EmHttpApi extends Construct {\n public readonly api: HttpApi\n\n public readonly defaultStage: HttpStage\n\n private readonly domainNames = new Map<string, DomainName>()\n\n constructor(scope: Construct, id: string, config: HttpApiConfig) {\n super(scope, id)\n\n const apiName = generateApiName(config.stage, config.serviceName, config.apiName)\n\n // Create HTTP API\n this.api = new HttpApi(this, 'Api', {\n apiName,\n description: config.description || `${config.serviceName} HTTP API`,\n createDefaultStage: false,\n corsPreflight: config.corsOptions\n ? {\n allowOrigins: config.corsOptions.allowOrigins ?? ['*'],\n allowMethods: config.corsOptions.allowMethods?.map(m => this.parseHttpMethod(m)) || [\n CorsHttpMethod.GET,\n CorsHttpMethod.POST,\n CorsHttpMethod.PUT,\n CorsHttpMethod.DELETE,\n CorsHttpMethod.OPTIONS\n ],\n allowHeaders: config.corsOptions.allowHeaders || ['Content-Type', 'Authorization'],\n allowCredentials: config.corsOptions.allowCredentials,\n maxAge: config.corsOptions.maxAge\n }\n : undefined\n })\n\n this.defaultStage = new HttpStage(this, 'DefaultStage', {\n httpApi: this.api,\n stageName: '$default',\n autoDeploy: true,\n ...(config.throttle && {\n throttle: {\n rateLimit: config.throttle.rateLimit,\n burstLimit: config.throttle.burstLimit\n }\n })\n })\n\n // Apply standard tags\n applyStandardTags(this.api, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Parse HTTP method string to enum\n */\n private parseHttpMethod(method: string): CorsHttpMethod {\n const methodMap: Record<string, CorsHttpMethod> = {\n GET: CorsHttpMethod.GET,\n POST: CorsHttpMethod.POST,\n PUT: CorsHttpMethod.PUT,\n DELETE: CorsHttpMethod.DELETE,\n PATCH: CorsHttpMethod.PATCH,\n HEAD: CorsHttpMethod.HEAD,\n OPTIONS: CorsHttpMethod.OPTIONS,\n ANY: CorsHttpMethod.ANY\n }\n const resolved = methodMap[method.toUpperCase()]\n if (!resolved) {\n throw new Error(\n `Unknown HTTP method: \"${method}\". Valid values: ${Object.keys(methodMap).join(', ')}`\n )\n }\n return resolved\n }\n\n /**\n * Add a Lambda integration to a route\n */\n public addLambdaIntegration(path: string, method: string, handler: LambdaFunction) {\n const id = `${createHash('sha256')\n .update(path + method)\n .digest('hex')\n .slice(0, 8)}Integration`\n const integration = new HttpLambdaIntegration(id, handler, {\n payloadFormatVersion: PayloadFormatVersion.VERSION_2_0\n })\n\n return this.api.addRoutes({\n path,\n methods: [this.parseHttpMethodV2(method)],\n integration\n })\n }\n\n /**\n * Parse HTTP method string to HttpMethod enum\n */\n private parseHttpMethodV2(method: string): HttpMethod {\n const methodMap: Record<string, HttpMethod> = {\n GET: HttpMethod.GET,\n POST: HttpMethod.POST,\n PUT: HttpMethod.PUT,\n DELETE: HttpMethod.DELETE,\n PATCH: HttpMethod.PATCH,\n HEAD: HttpMethod.HEAD,\n OPTIONS: HttpMethod.OPTIONS,\n ANY: HttpMethod.ANY\n }\n const resolved = methodMap[method.toUpperCase()]\n if (!resolved) {\n throw new Error(\n `Unknown HTTP method: \"${method}\". Valid values: ${Object.keys(methodMap).join(', ')}`\n )\n }\n return resolved\n }\n\n /**\n * Attach a custom domain with base path mapping to this HTTP API.\n * Returns the full base URL (e.g. https://api.example.com/mypath).\n */\n public addCustomDomain(domainName: string, certificateArn: string, basePath: string): string {\n const normalisedPath = basePath.trim().replace(/^\\/+/, '').replace(/\\/+$/, '')\n const mappingHash = createHash('sha256')\n .update(domainName + normalisedPath)\n .digest('hex')\n .slice(0, 8)\n\n let domain = this.domainNames.get(domainName)\n if (!domain) {\n const domainHash = createHash('sha256')\n .update(domainName)\n .digest('hex')\n .slice(0, 8)\n const certificate = Certificate.fromCertificateArn(\n this,\n `${domainHash}Certificate`,\n certificateArn\n )\n domain = new DomainName(this, `${domainHash}Domain`, { domainName, certificate })\n this.domainNames.set(domainName, domain)\n }\n\n new ApiMapping(this, `${mappingHash}Mapping`, {\n api: this.api,\n domainName: domain,\n ...(normalisedPath && { apiMappingKey: normalisedPath })\n })\n\n return normalisedPath ? `https://${domainName}/${normalisedPath}` : `https://${domainName}`\n }\n\n /**\n * Get the API\n */\n public getApi(): HttpApi {\n return this.api\n }\n\n /**\n * Get the API URL\n */\n public getApiUrl(): string {\n return this.defaultStage.url\n }\n\n /**\n * Get the API ID\n */\n public getApiId(): string {\n return this.api.httpApiId\n }\n}\n\n/**\n * Helper function to create a REST API\n */\nexport const createRestApi = (scope: Construct, id: string, config: RestApiConfig): EmRestApi => {\n return new EmRestApi(scope, id, config)\n}\n\n/**\n * Helper function to create an HTTP API\n */\nexport const createHttpApi = (scope: Construct, id: string, config: HttpApiConfig): EmHttpApi => {\n return new EmHttpApi(scope, id, config)\n}\n","/**\n * Common SQS queue construct with standard configurations\n */\n\nimport { Aws, Duration } from 'aws-cdk-lib'\nimport { Queue, QueueEncryption, DeadLetterQueue } from 'aws-cdk-lib/aws-sqs'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { SqsQueueConfig, Stage } from '../types'\nimport { generateQueueName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getRemovalPolicy } from '../utils/logs'\n\n/**\n * Standard SQS queue construct with eMarketeer defaults\n */\nexport class EmSqsQueue extends Construct {\n public readonly queue: Queue\n public readonly deadLetterQueue?: Queue\n\n constructor(scope: Construct, id: string, config: SqsQueueConfig) {\n super(scope, id)\n\n const queueName = generateQueueName(config.stage, config.serviceName, config.queueName)\n\n // Create Dead Letter Queue if enabled\n if (config.enableDLQ) {\n const dlqName = `${queueName}-dlq`\n this.deadLetterQueue = new Queue(this, 'DLQ', {\n queueName: dlqName,\n retentionPeriod: config.dlqRetentionPeriod || Duration.days(14),\n encryption: QueueEncryption.SQS_MANAGED,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n applyStandardTags(this.deadLetterQueue, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n // Create main queue\n this.queue = new Queue(this, 'Queue', {\n queueName: config.fifo ? `${queueName}.fifo` : queueName,\n visibilityTimeout: config.visibilityTimeout || Duration.seconds(30),\n retentionPeriod: config.retentionPeriod || Duration.days(4),\n receiveMessageWaitTime: config.receiveMessageWaitTime || Duration.seconds(0),\n encryption: QueueEncryption.SQS_MANAGED,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined,\n deadLetterQueue: this.deadLetterQueue\n ? {\n queue: this.deadLetterQueue,\n maxReceiveCount: config.maxReceiveCount || 3\n }\n : undefined,\n removalPolicy: getRemovalPolicy(config.stage)\n })\n\n // Apply standard tags\n applyStandardTags(this.queue, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Get the queue\n */\n public getQueue(): Queue {\n return this.queue\n }\n\n /**\n * Get the queue ARN\n */\n public getQueueArn(): string {\n return this.queue.queueArn\n }\n\n /**\n * Get the queue URL\n */\n public getQueueUrl(): string {\n return this.queue.queueUrl\n }\n\n /**\n * Get the queue name\n */\n public getQueueName(): string {\n return this.queue.queueName\n }\n\n /**\n * Get the dead letter queue\n */\n public getDeadLetterQueue(): Queue | undefined {\n return this.deadLetterQueue\n }\n\n /**\n * Grant send messages permissions to a grantee\n */\n public grantSendMessages(grantee: IGrantable) {\n return this.queue.grantSendMessages(grantee)\n }\n\n /**\n * Grant consume messages permissions to a grantee\n */\n public grantConsumeMessages(grantee: IGrantable) {\n return this.queue.grantConsumeMessages(grantee)\n }\n\n /**\n * Build an SQS queue URL by name convention.\n * Returns `https://sqs.{region}.amazonaws.com/{account}/{stage}-{queueName}`.\n *\n * @example\n * ```typescript\n * const url = EmSqsQueue.urlFromName(this, 'dev', 'em-contacts-service-contact-source')\n * ```\n */\n static urlFromName(scope: Construct, stage: Stage, queueName: string): string {\n const fullName = `${stage}-${queueName}`\n return `https://sqs.${Aws.REGION}.amazonaws.com/${Aws.ACCOUNT_ID}/${fullName}`\n }\n}\n\n/**\n * Helper function to create an SQS queue\n */\nexport const createQueue = (scope: Construct, id: string, config: SqsQueueConfig): EmSqsQueue => {\n return new EmSqsQueue(scope, id, config)\n}\n\n/**\n * Helper function to create a FIFO queue\n */\nexport const createFifoQueue = (\n scope: Construct,\n id: string,\n config: Omit<SqsQueueConfig, 'fifo'>\n): EmSqsQueue => {\n return new EmSqsQueue(scope, id, {\n ...config,\n fifo: true,\n contentBasedDeduplication: true\n })\n}\n\n/**\n * Helper function to create a queue with DLQ\n */\nexport const createQueueWithDLQ = (\n scope: Construct,\n id: string,\n config: Omit<SqsQueueConfig, 'enableDLQ'>\n): EmSqsQueue => {\n return new EmSqsQueue(scope, id, {\n ...config,\n enableDLQ: true\n })\n}\n","/**\n * Common SNS topic construct with standard configurations\n */\n\nimport { Aws } from 'aws-cdk-lib'\nimport { CfnTopic, ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport {\n EmailSubscription,\n LambdaSubscription,\n SqsSubscription\n} from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Queue } from 'aws-cdk-lib/aws-sqs'\nimport { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda'\nimport { IGrantable } from 'aws-cdk-lib/aws-iam'\nimport { Construct } from 'constructs'\nimport { SnsTopicConfig, Stage } from '../types'\nimport { generateTopicName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\n\n/**\n * Standard SNS topic construct with eMarketeer defaults\n */\nexport class EmSnsTopic extends Construct {\n public readonly topic: Topic\n\n constructor(scope: Construct, id: string, config: SnsTopicConfig) {\n super(scope, id)\n\n const topicName =\n config.rawTopicName ?? generateTopicName(config.stage, config.serviceName, config.topicName)\n\n // Create topic\n this.topic = new Topic(this, 'Topic', {\n topicName: config.fifo ? `${topicName}.fifo` : topicName,\n displayName: config.displayName || topicName,\n fifo: config.fifo,\n contentBasedDeduplication: config.fifo ? config.contentBasedDeduplication : undefined\n })\n\n if (config.overrideLogicalId) {\n ;(this.topic.node.defaultChild as CfnTopic).overrideLogicalId(config.overrideLogicalId)\n }\n\n // Apply standard tags\n applyStandardTags(this.topic, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Import an external SNS topic by name convention.\n *\n * Builds the ARN as `arn:{partition}:sns:{region}:{account}:{stage}-{topicName}`\n * and returns an `ITopic` reference.\n *\n * @example\n * ```typescript\n * const contactEventTopic = EmSnsTopic.fromName(this, 'ContactEvent', {\n * stage: 'dev',\n * topicName: 'emarketeer-event-contact-event',\n * })\n * // ARN: arn:aws:sns:eu-west-1:123456789012:dev-emarketeer-event-contact-event\n * ```\n */\n static fromName(\n scope: Construct,\n id: string,\n config: { stage: Stage; topicName: string }\n ): ITopic {\n const fullName = `${config.stage}-${config.topicName}`\n const arn = `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${fullName}`\n return Topic.fromTopicArn(scope, id, arn)\n }\n\n /**\n * Get the topic\n */\n public getTopic(): Topic {\n return this.topic\n }\n\n /**\n * Get the topic ARN\n */\n public getTopicArn(): string {\n return this.topic.topicArn\n }\n\n /**\n * Get the topic name\n */\n public getTopicName(): string {\n return this.topic.topicName\n }\n\n /**\n * Add an email subscription\n */\n public addEmailSubscription(email: string) {\n return this.topic.addSubscription(new EmailSubscription(email))\n }\n\n /**\n * Add a Lambda subscription\n */\n public addLambdaSubscription(lambda: LambdaFunction) {\n return this.topic.addSubscription(new LambdaSubscription(lambda))\n }\n\n /**\n * Add an SQS subscription\n */\n public addSqsSubscription(queue: Queue, rawMessageDelivery = false) {\n return this.topic.addSubscription(\n new SqsSubscription(queue, {\n rawMessageDelivery\n })\n )\n }\n\n /**\n * Grant publish permissions to a grantee\n */\n public grantPublish(grantee: IGrantable) {\n return this.topic.grantPublish(grantee)\n }\n}\n\n/**\n * Helper function to create an SNS topic\n */\nexport const createTopic = (scope: Construct, id: string, config: SnsTopicConfig): EmSnsTopic => {\n return new EmSnsTopic(scope, id, config)\n}\n\n/**\n * Helper function to create a FIFO topic\n */\nexport const createFifoTopic = (\n scope: Construct,\n id: string,\n config: Omit<SnsTopicConfig, 'fifo'>\n): EmSnsTopic => {\n return new EmSnsTopic(scope, id, {\n ...config,\n fifo: true,\n contentBasedDeduplication: true\n })\n}\n","/**\n * Common EventBridge rule construct with standard configurations\n */\n\nimport { Rule, RuleProps, RuleTargetInput, Schedule } from 'aws-cdk-lib/aws-events'\nimport { LambdaFunction, SqsQueue, SnsTopic } from 'aws-cdk-lib/aws-events-targets'\nimport { Function as Lambda } from 'aws-cdk-lib/aws-lambda'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\nimport { Construct } from 'constructs'\nimport { EventBridgeRuleConfig } from '../types'\nimport { generateRuleName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\n\n/**\n * Standard EventBridge rule construct with eMarketeer defaults\n */\nexport class EmEventBridgeRule extends Construct {\n public readonly rule: Rule\n\n constructor(scope: Construct, id: string, config: EventBridgeRuleConfig) {\n super(scope, id)\n\n const ruleName = generateRuleName(config.stage, config.serviceName, config.ruleName)\n\n if (!config.eventPattern && !config.schedule) {\n throw new Error('Either eventPattern or schedule must be provided')\n }\n\n if (config.eventPattern && config.schedule) {\n throw new Error('Only one of eventPattern or schedule can be provided, not both')\n }\n\n const ruleProps: RuleProps = {\n ruleName,\n description: config.description || `${config.serviceName} - ${config.ruleName}`,\n enabled: config.enabled ?? true,\n ...(config.eventPattern && { eventPattern: config.eventPattern }),\n ...(config.schedule && { schedule: Schedule.expression(config.schedule) })\n }\n\n this.rule = new Rule(this, 'Rule', ruleProps)\n\n // Apply standard tags\n applyStandardTags(this.rule, {\n stage: config.stage,\n serviceName: config.serviceName,\n customTags: config.tags\n })\n }\n\n /**\n * Get the rule\n */\n public getRule(): Rule {\n return this.rule\n }\n\n /**\n * Get the rule ARN\n */\n public getRuleArn(): string {\n return this.rule.ruleArn\n }\n\n /**\n * Get the rule name\n */\n public getRuleName(): string {\n return this.rule.ruleName\n }\n\n /**\n * Add a Lambda function as a target\n */\n public addLambdaTarget(lambda: Lambda, input?: RuleTargetInput) {\n this.rule.addTarget(\n new LambdaFunction(lambda, {\n event: input\n })\n )\n }\n\n /**\n * Add an SQS queue as a target\n */\n public addSqsTarget(queue: IQueue, input?: RuleTargetInput) {\n this.rule.addTarget(\n new SqsQueue(queue, {\n message: input\n })\n )\n }\n\n /**\n * Add an SNS topic as a target\n */\n public addSnsTarget(topic: ITopic, input?: RuleTargetInput) {\n this.rule.addTarget(\n new SnsTopic(topic, {\n message: input\n })\n )\n }\n}\n\n/**\n * Helper function to create an EventBridge rule\n */\nexport const createEventBridgeRule = (\n scope: Construct,\n id: string,\n config: EventBridgeRuleConfig\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Helper function to create a scheduled rule\n */\nexport const createScheduledRule = (\n scope: Construct,\n id: string,\n config: Omit<EventBridgeRuleConfig, 'eventPattern'> &\n Required<Pick<EventBridgeRuleConfig, 'schedule'>>\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Helper function to create an event pattern rule\n */\nexport const createEventPatternRule = (\n scope: Construct,\n id: string,\n config: Omit<EventBridgeRuleConfig, 'schedule'> &\n Required<Pick<EventBridgeRuleConfig, 'eventPattern'>>\n): EmEventBridgeRule => {\n return new EmEventBridgeRule(scope, id, config)\n}\n\n/**\n * Common event patterns\n */\nexport const EVENT_PATTERNS = {\n /**\n * Match all events from a specific source\n */\n fromSource: (source: string) => ({\n source: [source]\n }),\n\n /**\n * Match specific detail type\n */\n detailType: (detailType: string) => ({\n detailType: [detailType]\n }),\n\n /**\n * Match events from a source with a specific detail type\n */\n sourceAndDetailType: (source: string, detailType: string) => ({\n source: [source],\n detailType: [detailType]\n }),\n\n /**\n * Match S3 object created events\n */\n s3ObjectCreated: (bucketName?: string) => ({\n source: ['aws.s3'],\n detailType: ['Object Created'],\n ...(bucketName ? { detail: { bucket: { name: [bucketName] } } } : {})\n }),\n\n /**\n * Match DynamoDB stream events\n */\n dynamoDbStream: (tableName?: string) => ({\n source: ['aws.dynamodb'],\n ...(tableName ? { resources: [{ prefix: `arn:aws:dynamodb:*:*:table/${tableName}` }] } : {})\n })\n}\n","import { Construct } from 'constructs'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { Alarm, CfnAlarm, ComparisonOperator, TreatMissingData } from 'aws-cdk-lib/aws-cloudwatch'\nimport { SnsAction } from 'aws-cdk-lib/aws-cloudwatch-actions'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\n\nexport interface DlqAlarmProps {\n dlq: IQueue\n alarmName: string\n alarmTopic: ITopic\n /**\n * Migration only: pins the CloudFormation logical ID of the alarm so it\n * matches an existing Serverless-generated CFN alarm during in-place\n * Serverless→CDK migration. Omit for new stacks.\n */\n alarmLogicalId?: string\n}\n\nexport class DlqAlarm extends Construct {\n public readonly alarm: Alarm\n\n constructor(scope: Construct, id: string, props: DlqAlarmProps) {\n super(scope, id)\n\n this.alarm = new Alarm(this, 'Alarm', {\n alarmName: props.alarmName,\n metric: props.dlq.metricApproximateNumberOfMessagesVisible(),\n threshold: 0,\n comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,\n evaluationPeriods: 1,\n treatMissingData: TreatMissingData.NOT_BREACHING\n })\n\n this.alarm.addAlarmAction(new SnsAction(props.alarmTopic))\n\n if (props.alarmLogicalId) {\n const cfnAlarm = this.alarm.node.defaultChild\n if (!(cfnAlarm instanceof CfnAlarm)) {\n throw new Error(\n `Cannot override alarm logical ID \"${props.alarmLogicalId}\": defaultChild is not a CfnAlarm.`\n )\n }\n cfnAlarm.overrideLogicalId(props.alarmLogicalId)\n }\n }\n}\n","import { CfnOutput, Duration, RemovalPolicy, Token } from 'aws-cdk-lib'\nimport {\n Function as LambdaFunction,\n CfnFunction,\n CfnPermission,\n ILayerVersion,\n CfnLayerVersion\n} from 'aws-cdk-lib/aws-lambda'\nimport { CfnLogGroup } from 'aws-cdk-lib/aws-logs'\nimport { CfnRole } from 'aws-cdk-lib/aws-iam'\nimport { CfnSubscription, CfnSubscriptionProps, ITopic } from 'aws-cdk-lib/aws-sns'\nimport { Queue, CfnQueue, CfnQueuePolicy, CfnQueuePolicyProps } from 'aws-cdk-lib/aws-sqs'\nimport { Table, CfnTable, TableProps, BillingMode } from 'aws-cdk-lib/aws-dynamodb'\nimport { Construct } from 'constructs'\nimport { DlqAlarm } from '../constructs/dlq-alarm'\nimport { Stage } from '../types'\nimport { getRemovalPolicy } from './logs'\n\n/**\n * Convert a Serverless Framework function name to its CloudFormation logical ID prefix.\n *\n * Matches the Serverless Framework's normalisation algorithm:\n * 1. Replace hyphens with \"Dash\", underscores with \"Underscore\"\n * 2. Capitalize the first character\n *\n * Example: 'capture-screenshot-from-url' -> 'CaptureDashscreenshotDashfromDashurl'\n */\nexport const toServerlessLogicalIdPrefix = (functionName: string): string => {\n const normalized = functionName.replace(/-/g, 'Dash').replace(/_/g, 'Underscore')\n return normalized.charAt(0).toUpperCase() + normalized.slice(1)\n}\n\n/**\n * Override the logical ID of a Lambda function's CfnFunction to match\n * Serverless Framework naming: {prefix}LambdaFunction\n */\nconst overrideLambdaLogicalId = (fn: LambdaFunction, serverlessFunctionName: string): void => {\n const prefix = toServerlessLogicalIdPrefix(serverlessFunctionName)\n const cfnFunction = fn.node.defaultChild\n\n if (!(cfnFunction instanceof CfnFunction)) {\n throw new Error(\n `Cannot override Lambda logical ID for \"${serverlessFunctionName}\": ` +\n 'the function does not have a CfnFunction default child. ' +\n 'Imported functions (e.g. via Function.fromFunctionArn) cannot have their logical IDs overridden.'\n )\n }\n\n cfnFunction.overrideLogicalId(`${prefix}LambdaFunction`)\n}\n\n/**\n * Override the logical ID of a log group to match Serverless Framework naming: {prefix}LogGroup.\n * Sets removal policy to RETAIN to prevent CloudFormation from deleting existing log data.\n */\nconst overrideLogGroupLogicalId = (logGroup: Construct, serverlessFunctionName: string): void => {\n const prefix = toServerlessLogicalIdPrefix(serverlessFunctionName)\n const defaultChild = logGroup.node.defaultChild\n\n if (!(defaultChild instanceof CfnLogGroup)) {\n throw new Error(\n `Cannot override log group logical ID for \"${serverlessFunctionName}\": ` +\n 'the log group does not have a CfnLogGroup default child. ' +\n 'Imported log groups (e.g. via importExistingLogGroup) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(`${prefix}LogGroup`)\n defaultChild.applyRemovalPolicy(RemovalPolicy.RETAIN)\n}\n\n/**\n * Override both the Lambda function and its associated log group logical IDs.\n * This is the primary convenience function for Serverless-to-CDK migration — one\n * call per migrated function.\n *\n * - Sets the function logical ID to {prefix}LambdaFunction\n * - Sets the log group logical ID to {prefix}LogGroup\n * - Sets the log group removal policy to RETAIN (prevents log deletion during migration)\n *\n * Only works with functions that have explicit (non-imported) log groups.\n *\n * @example\n * ```typescript\n * import { overrideFunctionLogicalIds } from '@emarketeer/ts-microservice-commons/cdk'\n *\n * const fn = new EmLambdaFunction(this, 'MyFunction', { ... })\n * overrideFunctionLogicalIds(fn.function, 'my-function')\n * ```\n */\nexport const overrideFunctionLogicalIds = (\n fn: LambdaFunction,\n serverlessFunctionName: string\n): void => {\n overrideLambdaLogicalId(fn, serverlessFunctionName)\n const logGroup = fn.logGroup\n if (!(logGroup instanceof Construct)) {\n throw new Error(\n `Cannot override log group logical ID for \"${serverlessFunctionName}\": ` +\n 'fn.logGroup is not a Construct. ' +\n 'Imported log groups (importExistingLogGroup: true) cannot have their logical IDs overridden.'\n )\n }\n overrideLogGroupLogicalId(logGroup, serverlessFunctionName)\n}\n\n/**\n * Override a Lambda layer's logical ID.\n *\n * Serverless Framework uses the layer key from serverless.yml as the logical ID,\n * typically in the form '{LayerName}LambdaLayer'.\n *\n * Only works with layers created in this stack, not imported layers.\n *\n * @param logicalId - The full logical ID to set (e.g. 'ChromiumLayerLambdaLayer')\n */\nexport const overrideLayerLogicalId = (layer: ILayerVersion, logicalId: string): void => {\n const defaultChild = (layer as Construct).node.defaultChild\n\n if (!(defaultChild instanceof CfnLayerVersion)) {\n throw new Error(\n `Cannot override logical ID \"${logicalId}\": the layer does not have a CfnLayerVersion default child. ` +\n 'Imported layers (e.g. via LayerVersion.fromLayerVersionArn) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(logicalId)\n}\n\n/**\n * Override an IAM role's logical ID.\n * Defaults to 'IamRoleLambdaExecution' — the standard Serverless Framework\n * shared execution role logical ID.\n *\n * Only works with roles created in this stack, not imported roles.\n */\nexport const overrideRoleLogicalId = (\n role: Construct,\n logicalId = 'IamRoleLambdaExecution',\n options?: {\n /** Override RoleName. Required when live Serverless stack used a specific role name. */\n readonly roleName?: string\n /**\n * Delete Path from the template. Serverless never emits Path; CDK always writes Path: \"/\".\n * A mismatch causes role replacement. Set true to prevent it.\n */\n readonly deletePath?: boolean\n }\n): void => {\n const defaultChild = role.node.defaultChild\n\n if (!(defaultChild instanceof CfnRole)) {\n throw new Error(\n 'Cannot override role logical ID: the role does not have a CfnRole default child. ' +\n 'Imported roles (e.g. via Role.fromRoleArn) cannot have their logical IDs overridden.'\n )\n }\n\n defaultChild.overrideLogicalId(logicalId)\n\n if (options?.roleName) {\n defaultChild.addPropertyOverride('RoleName', options.roleName)\n }\n\n if (options?.deletePath) {\n defaultChild.addPropertyDeletionOverride('Path')\n }\n}\n\nexport interface ServerlessCompatibleOutputProps {\n readonly serviceName: string\n readonly stage: string\n readonly outputKey: string\n readonly value: string\n readonly description?: string\n}\n\n/**\n * Create a CfnOutput with a Serverless Framework-compatible export name.\n * Export pattern: sls-{serviceName}-{stage}-{outputKey}\n */\nexport const createServerlessCompatibleOutput = (\n scope: Construct,\n id: string,\n props: ServerlessCompatibleOutputProps\n): CfnOutput =>\n new CfnOutput(scope, id, {\n value: props.value,\n description: props.description,\n exportName: `sls-${props.serviceName}-${props.stage}-${props.outputKey}`\n })\n\nexport interface MakeServerlessQueueOpts {\n /** Override visibility timeout. Defaults to 900 seconds (Serverless convention). */\n readonly visibilityTimeout?: Duration\n /** Max times a message is received before moving to DLQ. Defaults to 3. */\n readonly maxReceiveCount?: number\n /**\n * When provided, creates a DlqAlarm on the DLQ.\n * Uses the DlqAlarm commons construct.\n */\n readonly alarm?: {\n readonly name: string\n readonly topic: ITopic\n /** CloudFormation logical ID override for the alarm. Use during Serverless-to-CDK migrations. */\n readonly logicalId?: string\n }\n}\n\n/**\n * Creates an SQS queue with a dead-letter queue using the names and logical IDs\n * from the existing Serverless stack.\n *\n * Use this during Serverless to CDK migrations when the queues already exist.\n * The queue and DLQ logical IDs must match the CloudFormation resources created\n * by Serverless, otherwise CloudFormation can replace the queues during deploy.\n *\n * Production queues are retained. Other stages use the shared removal policy\n * from `getRemovalPolicy()`. The DLQ message retention is set to 14 days.\n *\n * @example\n * ```typescript\n * const alarmTopic = (scope as EmStack).alarmTopic()\n * const { queue, dlq } = makeServerlessQueue(\n * scope, 'MqlEventsQueue', 'MqlEventsQueueDLQ',\n * `${svc}-mql-event-queue`, `${svc}-mql-event-queue-dlq`,\n * stage,\n * { alarm: { name: 'MqlEventsQueueDLQAlarm', topic: alarmTopic } },\n * )\n * ```\n */\nexport function makeServerlessQueue(\n scope: Construct,\n queueLogicalId: string,\n dlqLogicalId: string,\n queueName: string,\n dlqName: string,\n stage: Stage,\n opts: MakeServerlessQueueOpts = {}\n): { queue: Queue; dlq: Queue } {\n const removalPolicy = getRemovalPolicy(stage)\n\n const dlq = new Queue(scope, dlqLogicalId, {\n queueName: dlqName,\n retentionPeriod: Duration.days(14),\n removalPolicy\n })\n const cfnDlq = dlq.node.defaultChild\n if (!(cfnDlq instanceof CfnQueue)) {\n throw new Error(\n `Cannot override DLQ logical ID \"${dlqLogicalId}\": defaultChild is not a CfnQueue.`\n )\n }\n cfnDlq.overrideLogicalId(dlqLogicalId)\n\n const queue = new Queue(scope, queueLogicalId, {\n queueName,\n visibilityTimeout: opts.visibilityTimeout ?? Duration.seconds(900),\n deadLetterQueue: { queue: dlq, maxReceiveCount: opts.maxReceiveCount ?? 3 },\n removalPolicy\n })\n const cfnQueue = queue.node.defaultChild\n if (!(cfnQueue instanceof CfnQueue)) {\n throw new Error(\n `Cannot override queue logical ID \"${queueLogicalId}\": defaultChild is not a CfnQueue.`\n )\n }\n cfnQueue.overrideLogicalId(queueLogicalId)\n\n if (opts.alarm) {\n new DlqAlarm(scope, `${queueLogicalId}DLQAlarm`, {\n dlq,\n alarmName: opts.alarm.name,\n alarmTopic: opts.alarm.topic,\n alarmLogicalId: opts.alarm.logicalId\n })\n }\n\n return { queue, dlq }\n}\n\n/**\n * Creates an SNS to SQS subscription with the same logical ID as the existing\n * Serverless resource.\n *\n * Use this when migrating an existing subscription from Serverless to CDK.\n * `topic.addSubscription(new SqsSubscription(queue))` lets CDK generate the\n * logical ID, which usually does not match the resource already in CloudFormation.\n * That can cause the subscription to be replaced during deployment.\n *\n * Both the construct ID and CloudFormation logical ID are set from `logicalId`.\n *\n * **Queue policy not included.** Unlike CDK's `SqsSubscription`, this helper only\n * creates the `AWS::SNS::Subscription`. It does NOT create an `AWS::SQS::QueuePolicy`\n * allowing SNS to send to the queue. On migrated stacks the policy was already created\n * by Serverless Framework — use `makeServerlessQueuePolicy` to preserve it with the\n * correct logical ID. On new queues call `makeServerlessQueuePolicy` (or use the CDK\n * `SqsSubscription` helper instead) to ensure SNS can deliver messages.\n *\n * @example\n * ```typescript\n * makeSnsToSqsSubscription(scope, 'TenantPurgeSubscription', {\n * topicArn: `arn:aws:sns:${region}:${accountId}:${stage}-emarketeer-event-purge-tenant-data`,\n * endpoint: queues.tenantPurgeQueue.queue.queueArn,\n * protocol: 'sqs',\n * rawMessageDelivery: true,\n * })\n * // Also preserve (or create) the matching queue policy:\n * makeServerlessQueuePolicy(scope, 'TenantPurgeSQSPolicy', { ... })\n * ```\n */\nexport function makeSnsToSqsSubscription(\n scope: Construct,\n logicalId: string,\n props: Omit<CfnSubscriptionProps, 'protocol'> & { readonly protocol: 'sqs' }\n): CfnSubscription {\n const sub = new CfnSubscription(scope, logicalId, props)\n sub.overrideLogicalId(logicalId)\n return sub\n}\n\n/**\n * Creates an SNS to Lambda subscription and matching invoke permission using\n * logical IDs from the existing Serverless stack.\n *\n * Use this when migrating an existing SNS Lambda trigger to CDK. The normal CDK\n * subscription helper generates its own logical IDs, so it can replace the\n * Serverless-created subscription and permission during deploy. For SNS Lambda\n * subscriptions that means events published during the replacement window are lost.\n *\n * Pass literal ARN strings for both the topic and Lambda function. Avoid using\n * `topic.topicArn` or `function.functionArn` here, since changes in the generated\n * CloudFormation expression can still force replacement even when the final ARN is\n * the same.\n *\n * The Lambda function must have a fixed `physicalName`, otherwise the function ARN\n * cannot be written safely by hand.\n *\n * Check the live CloudFormation stack for the subscription and permission logical\n * IDs before using this helper:\n *\n * ```bash\n * aws cloudformation list-stack-resources --stack-name <stack-name> \\\n * --query \"StackResourceSummaries[?ResourceType=='AWS::SNS::Subscription' ||\n * ResourceType=='AWS::Lambda::Permission'].[LogicalResourceId,ResourceType]\" \\\n * --output table\n * ```\n *\n * @example\n * ```typescript\n * const stagePrefix = stage.charAt(0).toUpperCase() + stage.slice(1)\n * makeSnsToLambdaSubscription(\n * scope,\n * `HandleDashorderDashcreatedSnsSubscription${stagePrefix}myserviceeventordercreated`,\n * `HandleDashorderDashcreatedLambdaPermission${stagePrefix}myserviceeventordercreatedSNS`,\n * {\n * topicArn: `arn:aws:sns:eu-west-1:${accountId}:${stage}-my-service-event-order-created`,\n * functionArn: `arn:aws:lambda:eu-west-1:${accountId}:function:my-service-${stage}-handle-order-created`,\n * }\n * )\n * ```\n */\nexport function makeSnsToLambdaSubscription(\n scope: Construct,\n subscriptionLogicalId: string,\n permissionLogicalId: string,\n props: {\n readonly topicArn: string\n readonly functionArn: string\n }\n): { subscription: CfnSubscription; permission: CfnPermission } {\n if (Token.isUnresolved(props.topicArn) || Token.isUnresolved(props.functionArn)) {\n throw new Error(\n 'makeSnsToLambdaSubscription requires literal ARN strings, not CDK tokens. ' +\n 'Using topic.topicArn or function.functionArn produces a CloudFormation expression whose ' +\n 'rendered form can change independently of the resolved ARN, forcing subscription replacement. ' +\n 'Pass the physical ARN as a string literal (e.g. `arn:aws:sns:eu-west-1:${accountId}:${stage}-my-topic`).'\n )\n }\n\n const subscription = new CfnSubscription(scope, subscriptionLogicalId, {\n topicArn: props.topicArn,\n protocol: 'lambda',\n endpoint: props.functionArn,\n })\n subscription.overrideLogicalId(subscriptionLogicalId)\n\n const permission = new CfnPermission(scope, permissionLogicalId, {\n action: 'lambda:InvokeFunction',\n functionName: props.functionArn,\n principal: 'sns.amazonaws.com',\n sourceArn: props.topicArn,\n })\n permission.overrideLogicalId(permissionLogicalId)\n subscription.addDependency(permission)\n\n return { subscription, permission }\n}\n\n/**\n * Creates an SQS queue policy using the logical ID from the existing Serverless\n * stack.\n *\n * Use this for migrated queues instead of `queue.addToResourcePolicy()`. The CDK\n * helper creates its own logical ID, which usually does not match the\n * `AWS::SQS::QueuePolicy` resource already managed by CloudFormation.\n *\n * Both the construct ID and CloudFormation logical ID are set from `logicalId`.\n *\n * @example\n * ```typescript\n * makeServerlessQueuePolicy(scope, 'MqlEventSQSPolicy', {\n * queues: [queues.mqlEventsQueue.queue.queueUrl],\n * policyDocument: {\n * Version: '2012-10-17',\n * Statement: [{\n * Effect: 'Allow', Principal: '*', Action: 'sqs:SendMessage', Resource: '*',\n * // Keep the policy limited to the SNS topic that sends to this queue.\n * Condition: { ArnEquals: { 'aws:SourceArn': `arn:aws:sns:...` } },\n * }],\n * },\n * })\n * ```\n */\nexport function makeServerlessQueuePolicy(\n scope: Construct,\n logicalId: string,\n props: CfnQueuePolicyProps\n): CfnQueuePolicy {\n const policy = new CfnQueuePolicy(scope, logicalId, props)\n policy.overrideLogicalId(logicalId)\n return policy\n}\n\n/**\n * Creates a DynamoDB table with the physical name and logical ID used by the\n * existing Serverless stack.\n *\n * Use this when moving an existing Serverless-managed table to CDK. The logical\n * ID should be copied from the CloudFormation resource, usually the resource key\n * from `serverless.yml`. If it does not match, CloudFormation may replace the\n * table during deploy.\n *\n * Defaults used by this helper:\n * - billing mode is PAY_PER_REQUEST\n * - point-in-time recovery is enabled only in prod\n * - removal policy is RETAIN in prod and DESTROY in other stages\n *\n * @example\n * ```typescript\n * const table = makeServerlessDynamoTable(scope, 'LeadCountTable', `${stage}-em-my-service-lead-count`, stage, {\n * partitionKey: { name: 'streamId', type: AttributeType.STRING },\n * sortKey: { name: 'day', type: AttributeType.NUMBER },\n * })\n * ```\n */\nexport function makeServerlessDynamoTable(\n scope: Construct,\n logicalId: string,\n tableName: string,\n stage: Stage,\n options: Omit<\n TableProps,\n | 'tableName'\n | 'billingMode'\n | 'pointInTimeRecovery'\n | 'pointInTimeRecoverySpecification'\n | 'removalPolicy'\n >\n): Table {\n const table = new Table(scope, logicalId, {\n tableName,\n billingMode: BillingMode.PAY_PER_REQUEST,\n pointInTimeRecoverySpecification: { pointInTimeRecoveryEnabled: stage === 'prod' },\n removalPolicy: getRemovalPolicy(stage),\n ...options\n })\n const cfnTable = table.node.defaultChild\n if (!(cfnTable instanceof CfnTable)) {\n throw new Error(\n `Cannot override DynamoDB table logical ID \"${logicalId}\": defaultChild is not a CfnTable. ` +\n 'Imported tables cannot have their logical IDs overridden.'\n )\n }\n cfnTable.overrideLogicalId(logicalId)\n return table\n}\n","import { Annotations, Duration } from 'aws-cdk-lib'\nimport { CfnQueue, Queue, IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources'\nimport {\n Function as LambdaFunction,\n Architecture,\n Runtime,\n Tracing\n} from 'aws-cdk-lib/aws-lambda'\nimport { IRole, Role, ServicePrincipal, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { LogGroup } from 'aws-cdk-lib/aws-logs'\nimport { ITopic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscription, SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Construct } from 'constructs'\nimport { Stage, VpcConfig } from '../types'\nimport { applyStandardTags } from '../utils/tagging'\nimport { getLogRetentionDays, getRemovalPolicy } from '../utils/logs'\nimport { buildBaseEnvironment, buildRecapDevEnvironment, resolveRecapDevEndpoint } from '../utils/config'\nimport { DEFAULT_LAMBDA_RUNTIME } from '../utils/constants'\nimport { generateLambdaName } from '../utils/naming'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { resolveLambdaCode, BundlingOverrides } from '../utils/bundling'\nimport { makeSnsToSqsSubscription, overrideFunctionLogicalIds } from '../utils/serverless-migration'\nimport { DlqAlarm } from './dlq-alarm'\n\n/**\n * Props for `LambdaWithQueue`. The `handlerPath` / `functionName` / `handler`\n * / `codePath` fields mirror `LambdaConfig` — `resolveHandlerPath()` throws at\n * synth if neither `handlerPath` nor `functionName` is provided.\n *\n * (`LambdaConfig` uses a discriminated `HandlerPathConfig` intersection at\n * compile time; we keep this type loose because `TopicQueueConsumerProps\n * extends LambdaWithQueueProps` and `EmStack.createQueueConsumer` merges\n * partial defaults — both patterns break against a union-shaped base.)\n */\nexport interface LambdaWithQueueProps {\n /** Lambda function name. Required when `handlerPath` is not provided. */\n readonly functionName?: string\n readonly queueName: string\n /** Short name used for codePath default and alarm naming. Defaults to functionName. */\n readonly resourceName?: string\n readonly handler?: string\n readonly codePath?: string\n /**\n * Source handler path, same as `EmStack.createFunction()`.\n * Derives `functionName`, `handler`, and `codePath` from the path.\n */\n readonly handlerPath?: string\n readonly reservedConcurrency?: number\n readonly batchSize?: number\n readonly reportBatchItemFailures?: boolean\n readonly stage: Stage\n readonly serviceName: string\n readonly environment?: Record<string, string>\n /** Lambda memory in MB. Defaults to 1024. */\n readonly memorySize?: number\n /** Lambda timeout. Defaults to 15 seconds. */\n readonly timeout?: Duration\n /** Enable X-Ray tracing. Defaults to true. */\n readonly enableTracing?: boolean\n readonly tags?: Record<string, string>\n /** IAM role name. Required when `role` is not provided. */\n readonly roleName?: string\n /** Provide an existing IAM role instead of creating one. When set, `roleName` is ignored. */\n readonly role?: IRole\n readonly alarmTopic: ITopic\n /** Override DLQ name. Defaults to `{queueName}-dlq`. */\n readonly dlqName?: string\n /** Override alarm name. Defaults to `{stage}-{serviceName}-{resourceName}-dlq-alarm`. */\n readonly alarmName?: string\n readonly additionalQueues?: IQueue[]\n readonly maxReceiveCount?: number\n /** Override queue visibility timeout. Defaults to `max(30s, timeout * 3)`. */\n readonly visibilityTimeout?: Duration\n readonly maxBatchingWindow?: Duration\n readonly maxConcurrency?: number\n readonly vpcConfig?: VpcConfig\n readonly architecture?: Architecture\n readonly runtime?: Runtime\n /** Per-handler esbuild overrides. Ignored when `codePath` is set. */\n readonly bundling?: BundlingOverrides\n /**\n * Migration-only: use this exact Lambda function name instead of the name\n * generated by `generateLambdaName()`.\n *\n * Needed when an existing Serverless function uses a legacy physical name\n * that CDK must keep during migration. The same name is used for the\n * Lambda log group path.\n *\n * Does NOT change the CloudFormation logical ID. For Serverless migrations,\n * also set `serverlessFunctionName` when the Lambda and log group logical\n * IDs need to match the existing Serverless stack. See\n * `LambdaConfig.physicalName` for the same migration caveat on\n * `EmStack.createFunction()`.\n */\n readonly physicalName?: string\n /**\n * Migration-only: Serverless function name for logical ID overrides.\n * Overrides Lambda + log group logical IDs to match Serverless Framework naming.\n */\n readonly serverlessFunctionName?: string\n /**\n * Override CloudFormation logical IDs for queue resources (migration mode).\n */\n readonly overrideLogicalIds?: {\n readonly queue?: string\n readonly dlq?: string\n readonly alarm?: string\n }\n}\n\nexport class LambdaWithQueue extends Construct {\n public readonly function: LambdaFunction\n\n public readonly queue: Queue\n\n public readonly dlq: Queue\n\n public readonly dlqAlarm: DlqAlarm\n\n constructor(scope: Construct, id: string, props: LambdaWithQueueProps) {\n super(scope, id)\n\n const resolved = resolveHandlerPath(props)\n const shortName = resolved.functionName\n const resourceName = props.resourceName ?? shortName\n const functionName = props.physicalName ?? generateLambdaName(props.stage, props.serviceName, shortName)\n const handler = resolved.handler ?? props.handler ?? 'index.handler'\n const codePath = resolved.codePath ?? props.codePath\n if (!resolved.entryFile && !codePath) {\n throw new Error(\n `LambdaWithQueue requires either \\`handlerPath\\` or \\`codePath\\` for \"${shortName}\".`\n )\n }\n const code = resolveLambdaCode({\n entryFile: resolved.entryFile,\n codePath,\n bundling: props.bundling\n })\n\n if (props.reservedConcurrency === 0) {\n throw new Error(\n `reservedConcurrency:0 disables the Lambda entirely for ${shortName}. Omit the prop to use account-level concurrency.`\n )\n }\n\n const {\n batchSize = 10,\n reportBatchItemFailures = true,\n additionalQueues = [],\n maxReceiveCount = 3\n } = props\n\n const memorySize = props.memorySize ?? 1024\n const timeout = props.timeout ?? Duration.seconds(15)\n const enableTracing = props.enableTracing ?? true\n\n this.dlq = new Queue(this, 'DLQ', {\n queueName: props.dlqName ?? `${props.queueName}-dlq`,\n retentionPeriod: Duration.days(14),\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n this.queue = new Queue(this, 'Queue', {\n queueName: props.queueName,\n visibilityTimeout:\n props.visibilityTimeout ?? Duration.seconds(Math.max(30, timeout.toSeconds() * 3)),\n retentionPeriod: Duration.days(4),\n deadLetterQueue: {\n queue: this.dlq,\n maxReceiveCount\n },\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n const role: IRole = props.role ?? this.createRole(props, enableTracing)\n\n const logGroup = new LogGroup(this, 'LogGroup', {\n logGroupName: `/aws/lambda/${functionName}`,\n retention: getLogRetentionDays(props.stage),\n removalPolicy: getRemovalPolicy(props.stage)\n })\n\n this.function = new LambdaFunction(this, 'Function', {\n functionName,\n runtime: props.runtime ?? DEFAULT_LAMBDA_RUNTIME,\n handler,\n code,\n architecture: props.architecture ?? Architecture.ARM_64,\n memorySize,\n timeout,\n environment: {\n ...buildBaseEnvironment(props.stage, this),\n ...(props.environment ?? {}),\n ...buildRecapDevEnvironment(resolveRecapDevEndpoint(this))\n },\n role,\n reservedConcurrentExecutions: props.reservedConcurrency,\n tracing: enableTracing ? Tracing.ACTIVE : Tracing.DISABLED,\n logGroup,\n ...(props.vpcConfig && {\n vpc: props.vpcConfig.vpc,\n vpcSubnets: props.vpcConfig.vpcSubnets,\n securityGroups: props.vpcConfig.securityGroups\n })\n })\n\n this.function.addEventSource(\n new SqsEventSource(this.queue, {\n batchSize,\n reportBatchItemFailures,\n ...(props.maxBatchingWindow && { maxBatchingWindow: props.maxBatchingWindow }),\n ...(props.maxConcurrency !== undefined && { maxConcurrency: props.maxConcurrency })\n })\n )\n\n applyStandardTags(this.function, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n applyStandardTags(this.queue, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n applyStandardTags(this.dlq, {\n stage: props.stage,\n serviceName: props.serviceName,\n customTags: props.tags\n })\n\n this.dlqAlarm = new DlqAlarm(this, 'DLQAlarm', {\n dlq: this.dlq,\n alarmName: props.alarmName ?? `${props.stage}-${props.serviceName}-${resourceName}-dlq-alarm`,\n alarmTopic: props.alarmTopic,\n alarmLogicalId: props.overrideLogicalIds?.alarm\n })\n\n additionalQueues.forEach(queue => {\n queue.grantSendMessages(this.function)\n queue.grantConsumeMessages(this.function)\n })\n\n // Serverless migration: override logical IDs\n if (props.serverlessFunctionName) {\n overrideFunctionLogicalIds(this.function, props.serverlessFunctionName)\n }\n\n if (props.overrideLogicalIds?.queue) {\n const cfnQueue = this.queue.node.defaultChild\n if (!(cfnQueue instanceof CfnQueue)) {\n throw new Error(\n `Cannot override queue logical ID to \"${props.overrideLogicalIds.queue}\": queue does not have a CfnQueue default child.`\n )\n }\n cfnQueue.overrideLogicalId(props.overrideLogicalIds.queue)\n }\n\n if (props.overrideLogicalIds?.dlq) {\n const cfnDlq = this.dlq.node.defaultChild\n if (!(cfnDlq instanceof CfnQueue)) {\n throw new Error(\n `Cannot override DLQ logical ID to \"${props.overrideLogicalIds.dlq}\": DLQ does not have a CfnQueue default child.`\n )\n }\n cfnDlq.overrideLogicalId(props.overrideLogicalIds.dlq)\n }\n }\n\n private createRole(props: LambdaWithQueueProps, enableTracing: boolean): IRole {\n if (!props.roleName) {\n throw new Error('LambdaWithQueue requires either `role` or `roleName` to be provided.')\n }\n\n const role = new Role(this, 'Role', {\n roleName: props.roleName,\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n description: `Lambda execution role for ${props.serviceName}`\n })\n\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')\n )\n\n if (props.vpcConfig) {\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')\n )\n }\n\n if (enableTracing) {\n role.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('AWSXRayDaemonWriteAccess')\n )\n }\n\n return role\n }\n\n public subscribeToTopic(\n topic: ITopic,\n options?: SqsSubscriptionProps,\n serverlessSubscriptionLogicalId?: string\n ): void {\n if (serverlessSubscriptionLogicalId !== undefined) {\n const trimmed = serverlessSubscriptionLogicalId.trim()\n if (!trimmed) {\n throw new Error(\n 'subscribeToTopic: serverlessSubscriptionLogicalId must not be an empty string — ' +\n 'omit the argument to use the standard CDK subscription path.'\n )\n }\n if (options?.filterPolicy) {\n throw new Error(\n 'subscribeToTopic: filterPolicy is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n if (options?.filterPolicyWithMessageBody) {\n throw new Error(\n 'subscribeToTopic: filterPolicyWithMessageBody is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n if (options?.deadLetterQueue) {\n throw new Error(\n 'subscribeToTopic: deadLetterQueue is not supported with serverlessSubscriptionLogicalId. ' +\n 'Use the standard CDK subscription path instead.'\n )\n }\n Annotations.of(this).addWarning(\n `subscribeToTopic with serverlessSubscriptionLogicalId=\"${trimmed}\" ` +\n 'creates only the SNS subscription — no SQS queue policy is created. ' +\n 'On migrated stacks the queue policy already exists in CloudFormation; ' +\n 'preserve it with makeServerlessQueuePolicy(). ' +\n 'On new queues you must also call makeServerlessQueuePolicy() or SNS delivery will fail silently.'\n )\n makeSnsToSqsSubscription(this, trimmed, {\n topicArn: topic.topicArn,\n endpoint: this.queue.queueArn,\n protocol: 'sqs',\n rawMessageDelivery: options?.rawMessageDelivery\n })\n } else {\n topic.addSubscription(new SqsSubscription(this.queue, options))\n }\n }\n}\n","import { Construct } from 'constructs'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\nimport { generateQueueName, generateRoleName } from '../utils/naming'\nimport { resolveHandlerPath } from '../utils/handler-path'\n\nexport interface ServiceLambdaWithQueueProps\n extends Omit<LambdaWithQueueProps, 'queueName' | 'roleName' | 'resourceName'> {\n queueBaseName: string\n}\n\nexport class ServiceLambdaWithQueue extends LambdaWithQueue {\n constructor(scope: Construct, id: string, props: ServiceLambdaWithQueueProps) {\n const { queueBaseName, ...rest } = props\n const { functionName } = resolveHandlerPath(rest)\n\n super(scope, id, {\n ...rest,\n resourceName: functionName,\n functionName,\n queueName: generateQueueName(props.stage, props.serviceName, queueBaseName),\n roleName: rest.role\n ? undefined\n : generateRoleName(props.stage, props.serviceName, functionName)\n })\n }\n}\n","import { Construct } from 'constructs'\nimport { EmLambdaFunction } from './lambda'\nimport { EmHttpApi } from './api-gateway'\nimport { LambdaConfig } from '../types'\n\nexport type LambdaWithHttpApiConfig = LambdaConfig & {\n readonly httpApi: EmHttpApi\n readonly route: {\n path: string\n method: string\n }\n}\n\nexport class EmLambdaWithHttpApi extends Construct {\n public readonly lambda: EmLambdaFunction\n\n constructor(scope: Construct, id: string, config: LambdaWithHttpApiConfig) {\n super(scope, id)\n\n this.lambda = new EmLambdaFunction(this, 'Lambda', config)\n\n config.httpApi.addLambdaIntegration(\n config.route.path,\n config.route.method,\n this.lambda.function\n )\n }\n}\n","import { ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscription, SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { Construct } from 'constructs'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\n\nexport interface TopicQueueConsumerProps extends LambdaWithQueueProps {\n /** The SNS topic to subscribe to. Can be an ITopic or a topic ARN string. */\n readonly topic: ITopic | string\n /** Options for the SQS subscription (e.g. rawMessageDelivery, filterPolicy). */\n readonly subscriptionOptions?: Omit<SqsSubscriptionProps, 'rawMessageDelivery'> & {\n rawMessageDelivery?: boolean\n }\n /**\n * Migration only: pins SNS subscription logical ID to prevent recreation\n * and in-flight message loss during Serverless→CDK deploy.\n */\n readonly serverlessSubscriptionLogicalId?: string\n}\n\n/**\n * Lambda function consuming messages from an SNS topic via an SQS queue.\n *\n * Combines SNS subscription → SQS queue → DLQ + alarm → Lambda consumer\n * in a single construct. Supports all `LambdaWithQueue` features including\n * migration mode (shared role, logical ID overrides).\n *\n * @example\n * ```typescript\n * // Import external topic by ARN or use EmSnsTopic.fromName()\n * const contactEventTopic = EmSnsTopic.fromName(this, 'ContactEvent', {\n * stage: 'dev',\n * topicName: 'emarketeer-event-contact-event',\n * })\n *\n * const consumer = new TopicQueueConsumer(this, 'ContactEvents', {\n * topic: contactEventTopic,\n * handlerPath: 'src/handlers/process-contact-event',\n * queueName: 'dev-my-service-contact-event-queue',\n * alarmTopic,\n * })\n * ```\n */\nexport class TopicQueueConsumer extends LambdaWithQueue {\n constructor(scope: Construct, id: string, props: TopicQueueConsumerProps) {\n const {\n topic: topicOrArn,\n subscriptionOptions,\n serverlessSubscriptionLogicalId,\n ...queueProps\n } = props\n super(scope, id, queueProps)\n\n const topic =\n typeof topicOrArn === 'string'\n ? Topic.fromTopicArn(this, 'SubscribedTopic', topicOrArn)\n : topicOrArn\n\n this.subscribeToTopic(topic, subscriptionOptions, serverlessSubscriptionLogicalId)\n }\n}\n","import * as cdk from 'aws-cdk-lib'\nimport { Annotations, Aws, Tags } from 'aws-cdk-lib'\nimport {\n Effect,\n IRole,\n PolicyStatement,\n Role,\n ServicePrincipal,\n ManagedPolicy,\n IManagedPolicy\n} from 'aws-cdk-lib/aws-iam'\nimport { ITopic, Topic } from 'aws-cdk-lib/aws-sns'\nimport { SqsSubscriptionProps } from 'aws-cdk-lib/aws-sns-subscriptions'\nimport { IQueue } from 'aws-cdk-lib/aws-sqs'\nimport { ITable } from 'aws-cdk-lib/aws-dynamodb'\nimport { IBucket } from 'aws-cdk-lib/aws-s3'\nimport { IStream } from 'aws-cdk-lib/aws-kinesis'\nimport { StringParameter } from 'aws-cdk-lib/aws-ssm'\nimport { Construct } from 'constructs'\nimport { LambdaConfig, Stage } from '../types'\nimport { generateStackName } from '../utils/naming'\nimport { applyStandardTags } from '../utils/tagging'\nimport { resolveHandlerPath } from '../utils/handler-path'\nimport { EmLambdaFunction } from './lambda'\nimport { EmEventBridgeRule } from './eventbridge'\nimport { LambdaWithQueue, LambdaWithQueueProps } from './lambda-with-queue'\nimport { TopicQueueConsumer } from './topic-queue-consumer'\nimport {\n overrideFunctionLogicalIds,\n overrideRoleLogicalId,\n createServerlessCompatibleOutput\n} from '../utils/serverless-migration'\nimport { createXRayTracingPolicy } from '../utils/iam'\n\ntype BaseEmStackProps = cdk.StackProps & {\n readonly stage: Stage\n readonly serviceName: string\n readonly tags?: Record<string, string>\n readonly owner?: string\n readonly costCenter?: string\n /**\n * Default config applied to every function created via `createFunction()`.\n * Per-function config takes precedence over these defaults.\n *\n * @example\n * ```typescript\n * super(scope, id, {\n * ...props,\n * defaultFunctionConfig: {\n * memorySize: 1536,\n * timeout: Duration.seconds(30),\n * enableTracing: true,\n * layers: [insightsLayer],\n * }\n * })\n * ```\n */\n readonly defaultFunctionConfig?: Partial<CreateFunctionConfig>\n}\n\nexport type EmStackProps = BaseEmStackProps & (\n | {\n /**\n * When true, creates a shared IAM role for all functions — matching the\n * Serverless Framework pattern where one role is shared across all Lambdas.\n *\n * The role is pinned to logical ID `IamRoleLambdaExecution` so existing\n * Serverless stacks are migrated in-place without resource replacement.\n *\n * `createFunction()` will use this role by default unless a specific role\n * is passed in the function config.\n */\n readonly useSharedRole: true\n /**\n * Replaces the default managed policies on the shared role.\n * Only valid when `useSharedRole: true`.\n *\n * Defaults to `[AWSLambdaBasicExecutionRole, CloudWatchLambdaInsightsExecutionRolePolicy]`.\n * Providing this option replaces that entire list — include `AWSLambdaBasicExecutionRole`\n * explicitly if it is still needed.\n *\n * For VPC services, prefer passing `sharedRole` to `createRdsVpcConfig` instead.\n * That appends `AWSLambdaVPCAccessExecutionRole` without replacing the defaults.\n */\n readonly sharedRoleManagedPolicies?: IManagedPolicy[]\n }\n | {\n readonly useSharedRole?: false\n /** Not valid when `useSharedRole` is false or omitted. */\n readonly sharedRoleManagedPolicies?: never\n }\n)\n\n/**\n * Config for `EmStack.createFunction()`. Stage and serviceName are optional —\n * they default to the stack's values.\n *\n * When `handlerPath` is provided, `codePath`, `handler`, and `functionName`\n * become optional — they are derived from the source path:\n *\n * ```typescript\n * // Instead of:\n * this.createFunction('CaptureScreenshot', {\n * functionName: 'capture-screenshot-from-url',\n * handler: 'index.handler',\n * codePath: 'dist/handlers/capture-screenshot/capture-screenshot-from-url',\n * })\n *\n * // You can write:\n * this.createFunction('CaptureScreenshot', {\n * handlerPath: 'src/handlers/capture-screenshot/capture-screenshot-from-url',\n * })\n * ```\n */\nexport type CreateFunctionConfig = Omit<\n LambdaConfig,\n 'stage' | 'serviceName'\n> & {\n readonly stage?: LambdaConfig['stage']\n readonly serviceName?: LambdaConfig['serviceName']\n}\n\n/**\n * Base stack class for eMarketeer microservices.\n *\n * - Auto-generates stackName from stage + serviceName\n * - Auto-generates description\n * - Applies standard tags (Stage, Service, ManagedBy) to all resources\n * - `createFunction()` creates Lambdas with stable, Serverless-compatible logical IDs\n * - `addOutput()` creates exports with the `sls-{service}-{stage}-{key}` pattern\n * - `overrideLayer()` pins layer logical IDs\n * - Optional shared role for Serverless migration compatibility\n *\n * @example\n * ```typescript\n * export class MyServiceStack extends EmStack {\n * constructor(scope: Construct, id: string, props: MyStackProps) {\n * super(scope, id, { ...props, useSharedRole: true })\n *\n * // Short form — derives codePath, handler, and functionName from handlerPath\n * const fn = this.createFunction('GetData', {\n * handlerPath: 'src/handlers/get-data',\n * })\n *\n * // Explicit form — still supported\n * const fn2 = this.createFunction('PostData', {\n * functionName: 'post-data',\n * handler: 'index.handler',\n * codePath: './dist/handlers/post-data',\n * })\n *\n * this.addOutput('ServiceEndpoint', 'https://...')\n * }\n * }\n * ```\n */\nexport class EmStack extends cdk.Stack {\n public readonly stage: Stage\n public readonly serviceName: string\n /**\n * Shared IAM role for all functions. Only created when `useSharedRole: true`.\n * Pinned to logical ID `IamRoleLambdaExecution` for Serverless migration.\n */\n public readonly sharedRole?: Role\n private defaultFunctionConfig: Partial<CreateFunctionConfig>\n private _alarmTopic?: ITopic\n\n constructor(scope: Construct, id: string, props: EmStackProps) {\n super(scope, id, {\n ...props,\n stackName:\n props.stackName ??\n (props.useSharedRole\n ? `${props.serviceName}-${props.stage}`\n : generateStackName({\n stage: props.stage,\n serviceName: props.serviceName\n })),\n description: props.description ?? `${props.serviceName} (${props.stage})`\n })\n\n this.stage = props.stage\n this.serviceName = props.serviceName\n this.defaultFunctionConfig = props.defaultFunctionConfig ?? {}\n\n applyStandardTags(this, {\n stage: props.stage,\n serviceName: props.serviceName,\n owner: props.owner,\n costCenter: props.costCenter,\n customTags: props.tags\n })\n\n Tags.of(this).add('em-microservice', `${props.stage}-${props.serviceName}`)\n\n if (props.useSharedRole) {\n this.sharedRole = new Role(this, 'LambdaExecutionRole', {\n roleName: `${props.serviceName}-${props.stage}-${this.region}-lambdaRole`,\n path: '/',\n assumedBy: new ServicePrincipal('lambda.amazonaws.com'),\n managedPolicies: props.sharedRoleManagedPolicies ?? [\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),\n ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaInsightsExecutionRolePolicy')\n ]\n })\n overrideRoleLogicalId(this.sharedRole)\n }\n }\n\n /**\n * Update default function config after construction.\n * Use this when defaults depend on resources created after `super()`.\n * The environment map is shallow-merged with existing defaults; all other keys are replaced.\n *\n * @example\n * ```typescript\n * // After creating resources:\n * this.setDefaultFunctionConfig({\n * environment: sharedEnvironment,\n * vpcConfig,\n * })\n * ```\n */\n setDefaultFunctionConfig(config: Partial<CreateFunctionConfig>): void {\n this.defaultFunctionConfig = {\n ...this.defaultFunctionConfig,\n ...config,\n environment: {\n ...(this.defaultFunctionConfig.environment ?? {}),\n ...(config.environment ?? {})\n }\n }\n }\n\n private mergeConfig<T extends { environment?: Record<string, string> }>(\n config: T\n ): Partial<CreateFunctionConfig> & T {\n const defaultEnv = this.defaultFunctionConfig.environment\n const configEnv = config.environment\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n ...this.defaultFunctionConfig,\n ...config,\n ...(defaultEnv || configEnv\n ? { environment: { ...(defaultEnv ?? {}), ...(configEnv ?? {}) } }\n : {})\n } as Partial<CreateFunctionConfig> & T\n }\n\n /**\n * Create a Lambda function. Defaults `stage` and `serviceName` from the stack.\n *\n * When `useSharedRole: true` (Serverless migration mode), also:\n * - Overrides Lambda logical ID to `{prefix}LambdaFunction`\n * - Overrides log group logical ID to `{prefix}LogGroup`\n * - Sets log group removal policy via `getRemovalPolicy(stage)` (RETAIN in\n * prod, DESTROY otherwise — see utils/logs.ts)\n * - Uses the shared role unless `config.role` is provided\n * - Throws if `importExistingLogGroup` is set — migration mode requires managed log groups\n * to override their logical IDs\n */\n createFunction(id: string, config: CreateFunctionConfig): EmLambdaFunction {\n const merged = this.mergeConfig(config)\n const resolved = resolveHandlerPath(merged)\n const functionName = resolved.functionName\n\n const fn = new EmLambdaFunction(this, id, {\n ...merged,\n functionName,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole\n })\n\n if (this.sharedRole) {\n if (merged.importExistingLogGroup) {\n throw new Error(\n `Cannot use importExistingLogGroup with useSharedRole (migration mode) for \"${functionName}\". ` +\n 'Migration mode requires explicit log groups to override their logical IDs.'\n )\n }\n overrideFunctionLogicalIds(fn.function, functionName)\n }\n this.errorIfRoleOverrideInMigrationMode(fn, 'createFunction', functionName, merged.role)\n\n return fn\n }\n\n /**\n * Create a Lambda function with an SQS queue consumer pattern.\n * Defaults `stage`, `serviceName`, and `role` from the stack.\n *\n * When `useSharedRole: true` (Serverless migration mode), also:\n * - Uses the shared role (skips per-function role creation)\n * - Overrides Lambda + log group logical IDs to match Serverless Framework naming\n *\n * @example\n * ```typescript\n * const consumer = this.createQueueConsumer('ProcessJobs', {\n * handlerPath: 'src/handlers/process-jobs',\n * queueName: 'dev-my-service-queue-jobs',\n * memorySize: 512,\n * timeout: Duration.seconds(30),\n * enableTracing: true,\n * alarmTopic: this.alarmTopic,\n * })\n * ```\n */\n createQueueConsumer(id: string, config: CreateQueueConsumerConfig): LambdaWithQueue {\n const merged = this.mergeConfig(config)\n const { functionName } = resolveHandlerPath(merged)\n const consumer = new LambdaWithQueue(this, id, {\n ...merged,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole,\n ...(this.sharedRole && {\n serverlessFunctionName: merged.serverlessFunctionName ?? functionName\n })\n })\n this.errorIfRoleOverrideInMigrationMode(consumer, 'createQueueConsumer', functionName ?? id, merged.role)\n return consumer\n }\n\n /**\n * Create a Lambda function consuming messages from an SNS topic via SQS.\n * Combines `createQueueConsumer()` + `subscribeToTopic()` in one call and\n * inherits the stack's default function config (env vars, VPC, timeout).\n *\n * Prefer this over constructing `TopicQueueConsumer` directly — the raw\n * constructor bypasses default-config merging.\n *\n * @example\n * ```typescript\n * this.createTopicQueueConsumer('ProcessInvoices', {\n * topic: invoiceTopic,\n * subscriptionOptions: { rawMessageDelivery: true },\n * handlerPath: 'src/handlers/process-invoices',\n * queueName: 'dev-my-service-invoice-queue',\n * alarmTopic,\n * })\n * ```\n */\n createTopicQueueConsumer(\n id: string,\n config: CreateTopicQueueConsumerConfig\n ): TopicQueueConsumer {\n const { topic, subscriptionOptions, serverlessSubscriptionLogicalId, ...queueConfig } = config\n const merged = this.mergeConfig(queueConfig)\n const { functionName } = resolveHandlerPath(merged)\n const consumer = new TopicQueueConsumer(this, id, {\n ...merged,\n stage: merged.stage ?? this.stage,\n serviceName: merged.serviceName ?? this.serviceName,\n role: merged.role ?? this.sharedRole,\n topic,\n subscriptionOptions,\n serverlessSubscriptionLogicalId,\n ...(this.sharedRole && {\n serverlessFunctionName: merged.serverlessFunctionName ?? functionName\n })\n })\n this.errorIfRoleOverrideInMigrationMode(consumer, 'createTopicQueueConsumer', functionName ?? id, merged.role)\n return consumer\n }\n\n /**\n * Create a scheduled Lambda function with an EventBridge rule.\n * Combines `createFunction()` + `EmEventBridgeRule` + `addLambdaTarget()` in one call.\n *\n * @example\n * ```typescript\n * this.createScheduledFunction('DailyReport', {\n * handlerPath: 'src/handlers/daily-report',\n * schedule: 'cron(0 8 * * ? *)',\n * })\n * ```\n */\n createScheduledFunction(\n id: string,\n config: CreateScheduledFunctionConfig\n ): { function: EmLambdaFunction; rule: EmEventBridgeRule } {\n const { schedule, ruleName, ruleDescription, ...functionConfig } = config\n const merged = this.mergeConfig(functionConfig)\n const fn = this.createFunction(id, merged)\n const { functionName } = resolveHandlerPath(merged)\n\n const rule = new EmEventBridgeRule(this, `${id}Rule`, {\n stage: functionConfig.stage ?? this.stage,\n serviceName: functionConfig.serviceName ?? this.serviceName,\n ruleName: ruleName ?? functionName,\n description: ruleDescription,\n schedule\n })\n\n rule.addLambdaTarget(fn.function)\n\n return { function: fn, rule }\n }\n\n /**\n * Import an SSM parameter value.\n *\n * By default resolves `/{stage}/{serviceName}/{paramName}`.\n * Pass `{ raw: true }` to use the name as-is (for root-level params from Serverless).\n *\n * @example\n * ```typescript\n * // Convention-based:\n * this.ssmParam('db_host') // → /{stage}/{serviceName}/db_host\n *\n * // Raw (root-level SSM params):\n * this.ssmParam('proxy_dbms_host', { raw: true }) // → proxy_dbms_host\n * ```\n */\n ssmParam(paramName: string, options?: { serviceName?: string; raw?: boolean }): string {\n const path = options?.raw\n ? paramName\n : `/${this.stage}/${options?.serviceName ?? this.serviceName}/${paramName}`\n return StringParameter.valueForStringParameter(this, path)\n }\n\n /**\n * Import the alarm email topic by convention.\n * ARN: `arn:{partition}:sns:{region}:{account}:{stage}-alarm-email`\n *\n * Memoised: `Topic.fromTopicArn` registers a new construct on each call and\n * CDK errors on duplicate construct IDs in the same scope, so multiple\n * call sites would otherwise fail synth.\n */\n alarmTopic(): ITopic {\n if (!this._alarmTopic) {\n const arn = `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-alarm-email`\n this._alarmTopic = Topic.fromTopicArn(this, 'AlarmTopic', arn)\n }\n return this._alarmTopic\n }\n\n /**\n * Add a Lambda invoke policy to the shared role.\n * @param functionPattern - Optional function name pattern. Defaults to `{stage}-{serviceName}-*`.\n * Pass `'*'` for account-wide access.\n *\n * **Note:** The default pattern only matches functions named with the CDK convention\n * (`{stage}-{serviceName}-{fn}`). Functions created with `physicalName` using the legacy\n * Serverless convention (`{service}-{stage}-{fn}`) will not be matched. Pass `'*'` when\n * the service has any `physicalName` functions that must be invocable.\n */\n addLambdaInvokePolicy(functionPattern?: string): void {\n if (functionPattern !== undefined && functionPattern.trim() === '') {\n throw new Error('addLambdaInvokePolicy: functionPattern must not be empty.')\n }\n const role = this.requireSharedRole('addLambdaInvokePolicy')\n const pattern = functionPattern ?? `${this.stage}-${this.serviceName}-*`\n const resources =\n pattern === '*'\n ? ['*']\n : [`arn:${Aws.PARTITION}:lambda:${Aws.REGION}:${Aws.ACCOUNT_ID}:function:${pattern}`]\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['lambda:InvokeFunction'],\n resources\n })\n )\n }\n\n /**\n * Add a Kinesis PutRecord/PutRecords policy to the shared role.\n * @param streamOrName - An IStream reference, or a short stream name (prefixed with `{stage}-`).\n */\n addKinesisPolicy(streamOrName: IStream | string): void {\n const role = this.requireSharedRole('addKinesisPolicy')\n const arn = this.resolveResourceArn(\n streamOrName,\n 'addKinesisPolicy',\n 'streamName',\n name => `arn:${Aws.PARTITION}:kinesis:${Aws.REGION}:${Aws.ACCOUNT_ID}:stream/${this.stage}-${name}`,\n stream => stream.streamArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['kinesis:PutRecord', 'kinesis:PutRecords'],\n resources: [arn]\n })\n )\n }\n\n /**\n * Add an SNS Publish policy to the shared role.\n * @param topicOrName - An ITopic reference, or a short topic name (prefixed with `{stage}-`).\n */\n addSnsPublishPolicy(topicOrName: ITopic | string): void {\n const role = this.requireSharedRole('addSnsPublishPolicy')\n const arn = this.resolveResourceArn(\n topicOrName,\n 'addSnsPublishPolicy',\n 'topicName',\n name => `arn:${Aws.PARTITION}:sns:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n topic => topic.topicArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['sns:Publish'],\n resources: [arn]\n })\n )\n }\n\n /**\n * Add an SQS SendMessage policy to the shared role.\n * @param queueOrNames - One or more IQueue references and/or short queue names\n * (string names are prefixed with `{stage}-`).\n */\n addSqsSendPolicy(queueOrNames: IQueue | string | (IQueue | string)[]): void {\n const items = Array.isArray(queueOrNames) ? queueOrNames : [queueOrNames]\n if (items.length === 0) {\n throw new Error('addSqsSendPolicy: queueOrNames must not be empty.')\n }\n const role = this.requireSharedRole('addSqsSendPolicy')\n const resources = items.map(item =>\n this.resolveResourceArn(\n item,\n 'addSqsSendPolicy',\n 'queueName',\n name => `arn:${Aws.PARTITION}:sqs:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n queue => queue.queueArn\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['sqs:SendMessage', 'sqs:GetQueueAttributes', 'sqs:GetQueueUrl'],\n resources\n })\n )\n }\n\n /** Add an XRay tracing policy to the shared role. */\n addXRayPolicy(): void {\n const role = this.requireSharedRole('addXRayPolicy')\n role.addToPolicy(createXRayTracingPolicy())\n }\n\n /**\n * Add a CloudWatch Logs policy to the shared role.\n * Grants create, write, describe, read, and query access on all log groups.\n */\n addCloudWatchLogsPolicy(): void {\n const role = this.requireSharedRole('addCloudWatchLogsPolicy')\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'logs:CreateLogGroup',\n 'logs:CreateLogStream',\n 'logs:PutLogEvents',\n 'logs:DescribeLogGroups',\n 'logs:DescribeLogStreams',\n 'logs:FilterLogEvents',\n 'logs:GetLogEvents',\n 'logs:StartQuery',\n 'logs:StopQuery',\n 'logs:GetQueryResults'\n ],\n resources: ['*']\n })\n )\n }\n\n /**\n * Add an SNS policy to the shared role.\n * @param options.actions - SNS actions (e.g. ['sns:Publish', 'sns:Subscribe']).\n * @param options.resources - Resource ARNs. When omitted, defaults to `['*']`\n * (account-wide access). Prefer `addSnsPublishPolicy(topicArn)` for scoped\n * publish-only access to a specific topic.\n */\n addSnsPolicy(options: { actions: string[]; resources?: string[] }): void {\n if (options.actions.length === 0) {\n throw new Error('addSnsPolicy: actions must not be empty.')\n }\n if (options.resources && options.resources.length === 0) {\n throw new Error(\n 'addSnsPolicy: resources must not be empty. Omit the field to grant account-wide access explicitly.'\n )\n }\n const role = this.requireSharedRole('addSnsPolicy')\n if (!options.resources) {\n Annotations.of(this).addWarning(\n 'addSnsPolicy: no resources specified — policy grants account-wide SNS access on all topics. ' +\n 'Pass resources to scope the policy, or use addSnsPublishPolicy(topicArn) for publish access.'\n )\n }\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: options.actions,\n resources: options.resources ?? ['*']\n })\n )\n }\n\n /**\n * Add an SQS consumer policy to the shared role.\n * Grants ChangeMessageVisibility, DeleteMessage, ReceiveMessage, and GetQueueAttributes on each queue.\n * Use `addSqsSendPolicy` separately for queues the service also produces to.\n * @param queues - One or more IQueue references and/or short queue names\n * (string names are prefixed with `{stage}-`).\n */\n addSqsConsumerPolicy(queues: (IQueue | string)[]): void {\n if (queues.length === 0) {\n throw new Error('addSqsConsumerPolicy: queues must not be empty.')\n }\n const role = this.requireSharedRole('addSqsConsumerPolicy')\n const resources = queues.map(item =>\n this.resolveResourceArn(\n item,\n 'addSqsConsumerPolicy',\n 'queueName',\n name => `arn:${Aws.PARTITION}:sqs:${Aws.REGION}:${Aws.ACCOUNT_ID}:${this.stage}-${name}`,\n queue => queue.queueArn\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'sqs:ChangeMessageVisibility',\n 'sqs:DeleteMessage',\n 'sqs:ReceiveMessage',\n 'sqs:GetQueueAttributes'\n ],\n resources\n })\n )\n }\n\n /**\n * Add an execute-api:Invoke policy to the shared role.\n * Resources are scoped to `*` — API Gateway requires the full execution ARN\n * (`arn:{partition}:execute-api:{region}:{account}:{api-id}/{stage}/{method}/{path}`)\n * which is not available as a stable value in migration stacks.\n */\n addExecuteApiPolicy(): void {\n const role = this.requireSharedRole('addExecuteApiPolicy')\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['execute-api:Invoke'],\n resources: ['*']\n })\n )\n }\n\n /**\n * Add an S3 policy to the shared role.\n * @param bucketOrName - An IBucket reference, or a full bucket name (no stage prefix added).\n * @param actions - S3 actions to grant. Defaults to `['s3:GetObject', 's3:PutObject',\n * 's3:DeleteObject', 's3:ListBucket']`. Pass an explicit non-empty list for narrower or broader access.\n */\n addS3Policy(bucketOrName: IBucket | string, actions?: string[]): void {\n if (actions && actions.length === 0) {\n throw new Error('addS3Policy: actions must not be empty.')\n }\n const role = this.requireSharedRole('addS3Policy')\n const bucketArn = this.resolveResourceArn(\n bucketOrName,\n 'addS3Policy',\n 'bucketName',\n name => `arn:${Aws.PARTITION}:s3:::${name}`,\n bucket => bucket.bucketArn\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: actions ?? ['s3:GetObject', 's3:PutObject', 's3:DeleteObject', 's3:ListBucket'],\n resources: [bucketArn, `${bucketArn}/*`]\n })\n )\n }\n\n /**\n * Add a DynamoDB policy to the shared role.\n * Grants read, write, transact, and describe actions on each table.\n *\n * String-name ARNs use literal `*` for region and account. This matches the\n * Serverless Framework's source policy on migrated stacks; replacing the `*`\n * with `${Aws.REGION}/${Aws.ACCOUNT_ID}` would generate a noisy CloudFormation\n * diff on first deploy without changing effective access.\n *\n * @param tables - One or more ITable references and/or short table names\n * (string names are prefixed with `{stage}-`).\n * @param options.streamTables - Tables to also grant stream read access.\n * Accepts ITable refs (uses tableStreamArn) or string short names.\n * @param options.indexTables - Tables to also grant Query/Scan on all indexes.\n * Uses a separate policy statement scoped to only dynamodb:Query and dynamodb:Scan.\n */\n addDynamoDbPolicy(\n tables: (ITable | string)[],\n options?: { streamTables?: (ITable | string)[]; indexTables?: (ITable | string)[] }\n ): void {\n if (tables.length === 0) {\n throw new Error('addDynamoDbPolicy: tables must not be empty.')\n }\n const role = this.requireSharedRole('addDynamoDbPolicy')\n const tableArns = tables.map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}`,\n table => table.tableArn\n )\n )\n const streamArns = (options?.streamTables ?? []).map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy(streamTables)',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}/stream/*`,\n table => table.tableStreamArn ?? `${table.tableArn}/stream/*`\n )\n )\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:PutItem',\n 'dynamodb:UpdateItem',\n 'dynamodb:DeleteItem',\n 'dynamodb:Query',\n 'dynamodb:Scan',\n 'dynamodb:BatchGetItem',\n 'dynamodb:BatchWriteItem',\n 'dynamodb:TransactGetItems',\n 'dynamodb:TransactWriteItems',\n 'dynamodb:DescribeTable',\n 'dynamodb:DescribeStream',\n 'dynamodb:GetRecords',\n 'dynamodb:GetShardIterator',\n 'dynamodb:ListStreams'\n ],\n resources: [...tableArns, ...streamArns]\n })\n )\n const indexArns = (options?.indexTables ?? []).map(item =>\n this.resolveResourceArn(\n item,\n 'addDynamoDbPolicy(indexTables)',\n 'tableName',\n name => `arn:${Aws.PARTITION}:dynamodb:*:*:table/${this.stage}-${name}/index/*`,\n table => `${table.tableArn}/index/*`\n )\n )\n if (indexArns.length > 0) {\n role.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: ['dynamodb:Query', 'dynamodb:Scan'],\n resources: indexArns,\n })\n )\n }\n }\n\n private requireSharedRole(methodName: string): Role {\n if (!this.sharedRole) {\n throw new Error(`${methodName}() requires useSharedRole: true on the stack.`)\n }\n return this.sharedRole\n }\n\n /**\n * Resolve a CDK resource reference or short name into an ARN string.\n * Centralises empty-input validation so callers (add*Policy methods)\n * fail loud at synth instead of producing a malformed ARN that\n * CloudFormation later rejects with a generic error.\n */\n private resolveResourceArn<T extends object>(\n refOrName: T | string,\n methodName: string,\n nameLabel: string,\n fromName: (name: string) => string,\n fromRef: (ref: T) => string\n ): string {\n if (typeof refOrName === 'string') {\n if (refOrName.trim() === '') {\n throw new Error(`${methodName}: ${nameLabel} must not be empty.`)\n }\n return fromName(refOrName)\n }\n return fromRef(refOrName)\n }\n\n /**\n * Blocks synth with an error when a custom role is passed in migration mode.\n * The Lambda logical ID is overridden to match Serverless naming, but the\n * custom role's logical ID will NOT be pinned — CloudFormation may replace it.\n * Uses addError (not addWarning) so the misconfiguration is caught before a\n * changeset is created.\n * Called from createFunction, createQueueConsumer, and createTopicQueueConsumer.\n */\n private errorIfRoleOverrideInMigrationMode(\n scope: Construct,\n callerMethod: string,\n functionName: string,\n role?: IRole\n ): void {\n if (this.sharedRole && role && role !== this.sharedRole) {\n Annotations.of(scope).addError(\n `${callerMethod}(\"${functionName}\"): a custom role was provided in migration mode (useSharedRole: true). ` +\n 'The Lambda logical ID will be overridden to match Serverless naming, but the custom role\\'s logical ID ' +\n 'will NOT be pinned to IamRoleLambdaExecution — CloudFormation may replace the role on deploy. ' +\n 'Pass the shared role via the stack\\'s sharedRole property instead, or omit config.role.'\n )\n }\n }\n\n /**\n * Create a CfnOutput with a stable export name.\n * Export pattern: `sls-{serviceName}-{stage}-{outputKey}`\n *\n * @param id - Construct ID for the output\n * @param value - The output value\n * @param options - Optional outputKey (defaults to `id`) and description\n */\n addOutput(\n id: string,\n value: string,\n options?: { outputKey?: string; description?: string }\n ): cdk.CfnOutput {\n return createServerlessCompatibleOutput(this, id, {\n serviceName: this.serviceName,\n stage: this.stage,\n outputKey: options?.outputKey ?? id,\n value,\n description: options?.description\n })\n }\n}\n\n/**\n * Config for `EmStack.createQueueConsumer()`. Stage, serviceName, and role\n * are optional — they default to the stack's values.\n */\nexport type CreateQueueConsumerConfig = Omit<LambdaWithQueueProps, 'stage' | 'serviceName'> & {\n stage?: LambdaWithQueueProps['stage']\n serviceName?: LambdaWithQueueProps['serviceName']\n}\n\n/**\n * Config for `EmStack.createScheduledFunction()`.\n */\nexport type CreateScheduledFunctionConfig = CreateFunctionConfig & {\n /** Schedule expression (e.g. `'cron(5 * * * ? *)'` or `'rate(1 day)'`). */\n readonly schedule: string\n /** Override the EventBridge rule name. Defaults to the function name. */\n readonly ruleName?: string\n /** Description for the EventBridge rule. */\n readonly ruleDescription?: string\n}\n\n/**\n * Config for `EmStack.createTopicQueueConsumer()`. Adds the SNS topic and\n * subscription options on top of `CreateQueueConsumerConfig`.\n */\nexport type CreateTopicQueueConsumerConfig = CreateQueueConsumerConfig & {\n /** The SNS topic to subscribe to. Can be an ITopic or a topic ARN string. */\n readonly topic: ITopic | string\n /** Options for the SQS subscription (e.g. rawMessageDelivery, filterPolicy). */\n readonly subscriptionOptions?: Omit<SqsSubscriptionProps, 'rawMessageDelivery'> & {\n rawMessageDelivery?: boolean\n }\n /**\n * Migration only: pins the SNS subscription logical ID to prevent recreation\n * and in-flight message loss during Serverless→CDK deploy.\n */\n readonly serverlessSubscriptionLogicalId?: string\n}\n","import { Construct } from 'constructs'\nimport { Annotations } from 'aws-cdk-lib'\nimport * as ec2 from 'aws-cdk-lib/aws-ec2'\nimport { Role, ManagedPolicy } from 'aws-cdk-lib/aws-iam'\nimport { Stage, VpcConfig } from '../types'\n\nexport interface RdsVpcConfiguration {\n readonly vpcId: string\n readonly privateSubnetIds: readonly string[]\n readonly dbSecurityGroupId: string\n /** Override CloudFormation logical IDs for migration. */\n readonly overrideLogicalIds?: {\n readonly securityGroup?: string\n readonly ingress?: string\n }\n /** DB port. Defaults to 3306 (MySQL). */\n readonly dbPort?: number\n /** When provided, auto-attaches AWSLambdaVPCAccessExecutionRole to the role. */\n readonly sharedRole?: Role\n /**\n * Security group description. Defaults to `'Lambda security group for RDS access'`.\n *\n * Override when migrating from Serverless Framework — CloudFormation treats the\n * description as immutable, so it must match the existing value to avoid a\n * disruptive security-group replacement.\n */\n readonly securityGroupDescription?: string\n /**\n * When false, strips SecurityGroupEgress from the CloudFormation template.\n * Use for the initial Serverless→CDK migration deploy when the live stack never had\n * an explicit egress rule. Prevents rollback from revoking the default allow-all-outbound\n * rule. Remove this option in a follow-up deploy to hand CloudFormation ownership.\n */\n readonly manageSgEgress?: boolean\n}\n\nexport function createRdsVpcConfig(\n scope: Construct,\n stage: Stage,\n config: RdsVpcConfiguration\n): VpcConfig {\n const vpc = ec2.Vpc.fromLookup(scope, `RdsVpc-${stage}`, {\n vpcId: config.vpcId\n })\n\n // The imported subnets are only handed to Lambda's VpcConfig. We never read\n // `subnet.routeTable.routeTableId`, so acknowledge the CDK warning that\n // `fromSubnetId` emits for imports without route-table metadata.\n const privateSubnets = config.privateSubnetIds.map((subnetId, index) => {\n const subnet = ec2.Subnet.fromSubnetId(scope, `RdsPrivateSubnet${index}-${stage}`, subnetId)\n Annotations.of(subnet).acknowledgeWarning(\n '@aws-cdk/aws-ec2:noSubnetRouteTableId',\n 'This construct only passes imported subnets to Lambda VpcConfig and does not require routeTableId metadata.'\n )\n return subnet\n })\n\n const lambdaSecurityGroup = new ec2.SecurityGroup(scope, `RdsLambdaSecurityGroup-${stage}`, {\n vpc,\n description: config.securityGroupDescription ?? 'Lambda security group for RDS access',\n allowAllOutbound: true\n })\n\n if (config.overrideLogicalIds?.securityGroup || config.manageSgEgress === false) {\n const cfnSg = lambdaSecurityGroup.node.defaultChild\n if (!(cfnSg instanceof ec2.CfnSecurityGroup)) {\n throw new Error(\n 'Security group does not have a CfnSecurityGroup default child — ' +\n 'cannot apply overrideLogicalIds.securityGroup or manageSgEgress.'\n )\n }\n if (config.overrideLogicalIds?.securityGroup) {\n cfnSg.overrideLogicalId(config.overrideLogicalIds.securityGroup)\n }\n if (config.manageSgEgress === false) {\n cfnSg.addPropertyDeletionOverride('SecurityGroupEgress')\n }\n }\n\n const ingress = new ec2.CfnSecurityGroupIngress(scope, `RdsIngress-${stage}`, {\n groupId: config.dbSecurityGroupId,\n ipProtocol: 'tcp',\n fromPort: config.dbPort ?? 3306,\n toPort: config.dbPort ?? 3306,\n sourceSecurityGroupId: lambdaSecurityGroup.securityGroupId,\n description: 'Allow Lambda to access RDS'\n })\n\n if (config.overrideLogicalIds?.ingress) {\n ingress.overrideLogicalId(config.overrideLogicalIds.ingress)\n }\n\n if (config.overrideLogicalIds?.securityGroup) {\n // When the SG logical ID is pinned, CDK's auto-generated `Ref` on the\n // ingress points at the original (CDK-generated) logical ID. CloudFormation\n // can't resolve that reference at deploy and the changeset fails. Rewrite\n // the Ref to the overridden ID.\n ingress.addPropertyOverride('SourceSecurityGroupId', {\n Ref: config.overrideLogicalIds.securityGroup\n })\n }\n\n if (config.sharedRole) {\n config.sharedRole.addManagedPolicy(\n ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaVPCAccessExecutionRole')\n )\n }\n\n return {\n vpc,\n vpcSubnets: { subnets: privateSubnets },\n securityGroups: [lambdaSecurityGroup]\n }\n}\n","import * as cdk from 'aws-cdk-lib'\nimport { CURRENTLY_RECOMMENDED_FLAGS } from 'aws-cdk-lib/cx-api'\nimport { Stage } from '../types'\n\nexport interface CreateEmAppOptions {\n /** Valid stage values. Defaults to all Stage values: dev, test, staging, prod */\n readonly validStages?: readonly Stage[]\n /** Default stage when no context is provided. Defaults to 'dev' */\n readonly defaultStage?: Stage\n /** Additional CDK context values. Applied after the standard feature flags. */\n readonly context?: Record<string, string | boolean | number>\n}\n\nexport interface EmAppContext {\n readonly app: cdk.App\n readonly stage: Stage\n}\n\n/**\n * Create a CDK App with stage resolution from context.\n * Reads `-c stage=...` from CDK context, defaults to 'dev'.\n * Validates against allowed values and throws on invalid input.\n *\n * @example\n * ```typescript\n * const { app, stage } = createEmApp({ validStages: ['dev', 'prod'] })\n * const cfg = getStageConfig(stage)\n * new MyServiceStack(app, `my-service-${stage}`, { stage, ...cfg })\n * app.synth()\n * ```\n */\nexport const createEmApp = (options?: CreateEmAppOptions): EmAppContext => {\n const app = new cdk.App({\n context: {\n ...CURRENTLY_RECOMMENDED_FLAGS,\n ...options?.context\n }\n })\n const rawStage = app.node.tryGetContext('stage') ?? options?.defaultStage ?? 'dev'\n const validStages = options?.validStages ?? ['dev', 'test', 'staging', 'prod']\n\n if (!validStages.includes(rawStage)) {\n throw new Error(\n `Invalid --context stage=\"${rawStage}\". Valid stages: ${validStages.join(', ')}`\n )\n }\n\n return { app, stage: rawStage as Stage }\n}\n","/**\n * Account-level RDS networking constants — the VPC, private subnets, and the\n * RDS security group that Lambda functions need to reach the shared database\n * cluster.\n *\n * These values are account-level constants: every service deploying into the\n * eMarketeer AWS account uses the same VPC/subnets/SG per stage. The VPC and\n * private subnets exist solely to give Lambdas a route to RDS — Lambdas that\n * don't talk to RDS do not need them.\n *\n * Designed to compose with `createRdsVpcConfig()` in `./rds-vpc`:\n *\n * ```typescript\n * const account = getAccountRdsVpcConfig(this.stage)\n * const vpcConfig = createRdsVpcConfig(this, this.stage, { ...account })\n * ```\n */\n\nimport { Stage } from '../types'\n\nexport interface AccountRdsVpcConfig {\n readonly vpcId: string\n readonly privateSubnetIds: readonly string[]\n readonly dbSecurityGroupId: string\n}\n\nexport function getAccountRdsVpcConfig(stage: Stage): AccountRdsVpcConfig {\n switch (stage) {\n case 'dev':\n return {\n vpcId: 'vpc-d2fd89b5',\n privateSubnetIds: ['subnet-7c74d81a', 'subnet-de04eb84', 'subnet-e29b26aa'],\n dbSecurityGroupId: 'sg-711c3f09'\n }\n case 'prod':\n return {\n vpcId: 'vpc-aeaf41cb',\n privateSubnetIds: ['subnet-dab14f80', 'subnet-e06ad686', 'subnet-14ea665c'],\n dbSecurityGroupId: 'sg-427bda39'\n }\n default:\n throw new Error(`getAccountRdsVpcConfig: unsupported stage \"${stage}\". Only 'dev' and 'prod' are supported.`)\n }\n}\n"],"names":["Tags","RetentionDays","LogGroup","RemovalPolicy","Role","ServicePrincipal","ManagedPolicy","PolicyStatement","Effect","Stack","Token","StringParameter","Runtime","path","fs","Code","AssetHashType","DockerImage","execFileSync","Construct","LambdaFunction","Duration","Architecture","Tracing","Table","BillingMode","StreamViewType","TableEncryption","CfnTable","ProjectionType","AttributeType","RestApi","LogGroupLogDestination","AccessLogFormat","Cors","EndpointType","MethodLoggingLevel","LambdaIntegration","CfnBasePathMapping","CfnApiMapping","HttpApi","CorsHttpMethod","HttpStage","createHash","HttpLambdaIntegration","PayloadFormatVersion","HttpMethod","Certificate","DomainName","ApiMapping","Queue","QueueEncryption","Aws","Topic","EmailSubscription","LambdaSubscription","SqsSubscription","Schedule","Rule","SqsQueue","SnsTopic","Alarm","ComparisonOperator","TreatMissingData","SnsAction","CfnAlarm","CfnFunction","CfnLogGroup","CfnLayerVersion","CfnRole","CfnOutput","CfnQueue","CfnSubscription","CfnPermission","CfnQueuePolicy","SqsEventSource","Annotations","cdk","ec2","CURRENTLY_RECOMMENDED_FLAGS"],"mappings":"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"}