@jaypie/constructs 1.2.19 → 1.2.21

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.cjs","sources":["../../../src/constants.ts","../../../src/JaypieAccountLoggingBucket.ts","../../../src/helpers/addDatadogLayers.ts","../../../src/helpers/constructEnvName.ts","../../../src/helpers/constructStackName.ts","../../../src/helpers/constructTagger.ts","../../../src/helpers/envHostname.ts","../../../src/helpers/extendDatadogRole.ts","../../../src/helpers/resolveCertificate.ts","../../../src/helpers/isEnv.ts","../../../src/helpers/isValidHostname.ts","../../../src/helpers/isValidSubdomain.ts","../../../src/helpers/jaypieLambdaEnv.ts","../../../src/helpers/mergeDomain.ts","../../../src/helpers/resolveDatadogForwarderFunction.ts","../../../src/helpers/resolveDatadogLayers.ts","../../../src/helpers/resolveDatadogLoggingDestination.ts","../../../src/helpers/resolveEnvironment.ts","../../../src/helpers/resolveHostedZone.ts","../../../src/helpers/resolveParamsAndSecrets.ts","../../../src/JaypieEnvSecret.ts","../../../src/helpers/resolveSecrets.ts","../../../src/JaypieApiGateway.ts","../../../src/JaypieStack.ts","../../../src/JaypieAppStack.ts","../../../src/JaypieLambda.ts","../../../src/JaypieQueuedLambda.ts","../../../src/JaypieBucketQueuedLambda.ts","../../../src/JaypieCertificate.ts","../../../src/JaypieDatadogBucket.ts","../../../src/JaypieDatadogForwarder.ts","../../../src/JaypieDatadogSecret.ts","../../../src/JaypieDistribution.ts","../../../src/JaypieDnsRecord.ts","../../../src/JaypieDynamoDb.ts","../../../src/JaypieEventsRule.ts","../../../src/JaypieExpressLambda.ts","../../../src/JaypieGitHubDeployRole.ts","../../../src/JaypieHostedZone.ts","../../../src/JaypieInfrastructureStack.ts","../../../src/JaypieMongoDbSecret.ts","../../../src/JaypieNextJs.ts","../../../src/JaypieOpenAiSecret.ts","../../../src/JaypieOrganizationTrail.ts","../../../src/JaypieSsoPermissions.ts","../../../src/JaypieSsoSyncApplication.ts","../../../src/JaypieWebDeploymentBucket.ts","../../../src/JaypieStaticWebBucket.ts","../../../src/JaypieTraceSigningKeySecret.ts","../../../src/JaypieWebSocket.ts","../../../src/JaypieWebSocketLambda.ts","../../../src/JaypieWebSocketTable.ts"],"sourcesContent":["export const CDK = {\n ACCOUNT: {\n DEVELOPMENT: \"development\",\n MANAGEMENT: \"management\",\n OPERATIONS: \"operations\",\n PRODUCTION: \"production\",\n SANDBOX: \"sandbox\",\n SECURITY: \"security\",\n STAGE: \"stage\",\n },\n BUILD: {\n CONFIG: {\n ALL: \"all\",\n API: \"api\",\n INFRASTRUCTURE: \"infrastructure\",\n NONE: \"none\",\n WEB: \"web\",\n },\n PERSONAL: \"personal\",\n /**\n * @deprecated rename \"ephemeral\" to \"personal\" (since 2/24/2025)\n */\n EPHEMERAL: \"ephemeral\",\n /**\n * @deprecated as even \"ephemeral\" builds have static assets (since 7/6/2024)\n */\n STATIC: \"static\",\n },\n CREATION: {\n CDK: \"cdk\",\n CLOUDFORMATION_TEMPLATE: \"template\",\n MANUAL: \"manual\",\n },\n DATADOG: {\n SITE: \"datadoghq.com\",\n LAYER: {\n // https://docs.datadoghq.com/meta/latest-lambda-layer-version.json\n NODE: 131, // 127 on 9/12/2025\n EXTENSION: 86, // 86 on 9/12/2025\n },\n },\n DEFAULT: {\n REGION: \"us-east-1\",\n },\n DNS: {\n CONFIG: {\n TTL: 300, // 5 minutes in seconds for Route53\n },\n RECORD: {\n A: \"A\",\n CNAME: \"CNAME\",\n MX: \"MX\",\n NS: \"NS\",\n TXT: \"TXT\",\n },\n },\n DURATION: {\n EXPRESS_API: 30,\n CLOUDFRONT_API: 120,\n LAMBDA_MAXIMUM: 900,\n LAMBDA_WORKER: 900,\n },\n ENV: {\n DEMO: \"demo\", // Mirror of production\n DEVELOPMENT: \"development\", // Internal most stable development space\n /** @deprecated */ EPHEMERAL: \"ephemeral\", // Alias for \"build\"\n LOCAL: \"local\",\n /** @deprecated */ MAIN: \"main\", // Alias for development\n META: \"meta\", // For non-environment/infrastructure stacks\n PERSONAL: \"personal\", // Personal builds using resources provided by sandbox\n PREVIEW: \"preview\", // External next thing to be released\n PRODUCTION: \"production\",\n RELEASE: \"release\", // Internal next thing to be released\n REVIEW: \"review\", // Internal place to collaborate on issues\n SANDBOX: \"sandbox\", // Internal build space with no guaranteed longevity\n TRAINING: \"training\", // aka \"test\"; mirror of production for external audiences\n },\n HOST: {\n APEX: \"@\",\n },\n IMPORT: {\n DATADOG_LOG_FORWARDER: \"account-datadog-forwarder\",\n DATADOG_ROLE: \"account-datadog-role\",\n DATADOG_SECRET: \"account-datadog-secret\",\n LOG_BUCKET: \"account-log-bucket\",\n OIDC_PROVIDER: \"github-oidc-provider\",\n },\n LAMBDA: {\n LOG_RETENTION: 90,\n MEMORY_SIZE: 1024,\n },\n PRINCIPAL: {\n ROUTE53: \"route53.amazonaws.com\",\n },\n PRINCIPAL_TYPE: {\n GROUP: \"GROUP\",\n USER: \"USER\",\n },\n PROJECT: {\n INFRASTRUCTURE: \"infrastructure\",\n },\n ROLE: {\n API: \"api\",\n DEPLOY: \"deploy\",\n HOSTING: \"hosting\",\n MONITORING: \"monitoring\",\n NETWORKING: \"networking\",\n PROCESSING: \"processing\",\n SECURITY: \"security\",\n STACK: \"stack\",\n STORAGE: \"storage\",\n TOY: \"toy\",\n },\n SERVICE: {\n DATADOG: \"datadog\",\n INFRASTRUCTURE: \"infrastructure\",\n LIBRARIES: \"libraries\",\n NONE: \"none\",\n SSO: \"sso\",\n TRACE: \"trace\",\n },\n TAG: {\n BUILD_DATE: \"buildDate\",\n BUILD_HEX: \"buildHex\",\n BUILD_NUMBER: \"buildNumber\",\n BUILD_TIME: \"buildTime\",\n BUILD_TYPE: \"buildType\",\n COMMIT: \"commit\",\n CREATION: \"creation\",\n ENV: \"env\",\n NONCE: \"nonce\",\n PROJECT: \"project\",\n ROLE: \"role\",\n SERVICE: \"service\",\n SPONSOR: \"sponsor\",\n STACK: \"stack\",\n STACK_SHA: \"stackSha\",\n VENDOR: \"vendor\",\n VERSION: \"version\",\n },\n TARGET_TYPE: {\n AWS_ACCOUNT: \"AWS_ACCOUNT\",\n },\n VENDOR: {\n ANTHROPIC: \"anthropic\",\n AUTH0: \"auth0\",\n DATADOG: \"datadog\",\n KNOWTRACE: \"knowtrace\",\n MONGODB: \"mongodb\",\n OPENAI: \"openai\",\n SPLINTERLANDS: \"splinterlands\",\n },\n};\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport {\n Bucket,\n BucketAccessControl,\n BucketProps,\n IBucket,\n StorageClass,\n} from \"aws-cdk-lib/aws-s3\";\nimport { Construct } from \"constructs\";\n\nexport interface JaypieAccountLoggingBucketProps extends BucketProps {\n /**\n * Optional construct ID\n * @default \"AccountLoggingBucket\"\n */\n id?: string;\n\n /**\n * Bucket name\n * @default `account-logging-stack-${PROJECT_NONCE}`\n */\n bucketName?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Number of days before logs expire\n * @default 365\n */\n expirationDays?: number;\n\n /**\n * Number of days before transitioning to INFREQUENT_ACCESS storage\n * @default 30\n */\n infrequentAccessTransitionDays?: number;\n\n /**\n * Number of days before transitioning to GLACIER storage\n * @default 180\n */\n glacierTransitionDays?: number;\n\n /**\n * Whether to create CloudFormation output for bucket name\n * @default true\n */\n createOutput?: boolean;\n\n /**\n * Custom export name for the bucket name output\n * @default CDK.IMPORT.LOG_BUCKET\n */\n exportName?: string;\n\n /**\n * Description for the CloudFormation output\n * @default \"Account-wide logging bucket\"\n */\n outputDescription?: string;\n}\n\nexport class JaypieAccountLoggingBucket extends Construct {\n public readonly bucket: IBucket;\n\n /**\n * Create a new account-wide logging S3 bucket with lifecycle policies and export\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieAccountLoggingBucketProps,\n propsOrUndefined?: JaypieAccountLoggingBucketProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieAccountLoggingBucketProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"AccountLoggingBucket\";\n }\n\n super(scope, id);\n\n // Generate default bucket name with PROJECT_NONCE\n const defaultBucketName = process.env.PROJECT_NONCE\n ? `account-logging-stack-${process.env.PROJECT_NONCE.toLowerCase()}`\n : \"account-logging-stack\";\n\n // Extract Jaypie-specific options\n\n const {\n bucketName = defaultBucketName,\n createOutput = true,\n expirationDays = 365,\n exportName = CDK.IMPORT.LOG_BUCKET,\n glacierTransitionDays = 180,\n id: _id,\n infrequentAccessTransitionDays = 30,\n outputDescription = \"Account-wide logging bucket\",\n project,\n service = CDK.SERVICE.INFRASTRUCTURE,\n ...bucketProps\n } = props;\n\n // Create the bucket with lifecycle rules\n this.bucket = new Bucket(this, \"Bucket\", {\n accessControl: BucketAccessControl.LOG_DELIVERY_WRITE,\n bucketName,\n lifecycleRules: [\n {\n expiration: cdk.Duration.days(expirationDays),\n transitions: [\n {\n storageClass: StorageClass.INFREQUENT_ACCESS,\n transitionAfter: cdk.Duration.days(\n infrequentAccessTransitionDays,\n ),\n },\n {\n storageClass: StorageClass.GLACIER,\n transitionAfter: cdk.Duration.days(glacierTransitionDays),\n },\n ],\n },\n ],\n ...bucketProps,\n });\n\n // Add tags\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (service) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n }\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Create CloudFormation output if enabled\n if (createOutput) {\n new cdk.CfnOutput(this, \"BucketNameOutput\", {\n description: outputDescription,\n exportName,\n value: this.bucket.bucketName,\n });\n }\n }\n}\n","import * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { CDK } from \"../constants\";\nimport { DatadogLambda } from \"datadog-cdk-constructs-v2\";\n\nexport interface AddDatadogLayerOptions {\n datadogApiKeyArn?: string;\n}\n\nexport function addDatadogLayers(\n lambdaFunction: lambda.Function,\n options: AddDatadogLayerOptions = {},\n): boolean {\n const datadogApiKeyArn = options?.datadogApiKeyArn;\n\n const resolvedDatadogApiKeyArn =\n datadogApiKeyArn ||\n process.env.DATADOG_API_KEY_ARN ||\n process.env.CDK_ENV_DATADOG_API_KEY_ARN;\n if (!resolvedDatadogApiKeyArn) {\n return false;\n }\n\n // Define Datadog environment variables\n const datadogEnvVars = {\n DD_API_KEY_SECRET_ARN: resolvedDatadogApiKeyArn,\n DD_ENHANCED_METRICS: \"true\",\n DD_ENV: process.env.PROJECT_ENV || \"\",\n DD_PROFILING_ENABLED: \"false\",\n DD_SERVERLESS_APPSEC_ENABLED: \"false\",\n DD_SERVICE: process.env.PROJECT_SERVICE || \"\",\n DD_SITE: CDK.DATADOG.SITE,\n DD_TAGS: `${CDK.TAG.SPONSOR}:${process.env.PROJECT_SPONSOR || \"\"}`,\n DD_TRACE_OTEL_ENABLED: \"false\",\n };\n\n // Add environment variables only if they don't already exist\n Object.entries(datadogEnvVars).forEach(([key, value]) => {\n lambdaFunction.addEnvironment(key, value);\n });\n\n const datadogApiKeySecret: secretsmanager.ISecret =\n secretsmanager.Secret.fromSecretCompleteArn(\n lambdaFunction,\n \"DatadogApiKey\",\n resolvedDatadogApiKeyArn,\n );\n const datadogLambda = new DatadogLambda(lambdaFunction, \"DatadogLambda\", {\n apiKeySecret: datadogApiKeySecret, // apiKeySecret auto-grants secret access to the added lambdas\n nodeLayerVersion: CDK.DATADOG.LAYER.NODE,\n extensionLayerVersion: CDK.DATADOG.LAYER.EXTENSION,\n env: process.env.PROJECT_ENV,\n service: process.env.PROJECT_SERVICE,\n version: process.env.PROJECT_VERSION,\n });\n datadogLambda.addLambdaFunctions([lambdaFunction]);\n\n return true;\n}\n","export function constructEnvName(\n name: string,\n opts?: { env?: string; key?: string; nonce?: string },\n) {\n const env = opts?.env ?? process.env.PROJECT_ENV ?? \"build\";\n const key = opts?.key ?? process.env.PROJECT_KEY ?? \"project\";\n const nonce = opts?.nonce ?? process.env.PROJECT_NONCE ?? \"cfe2\"; // This default is intentionally short. It is not a special value but should not be changed.\n return `${env}-${key}-${name}-${nonce}`;\n}\n","export function constructStackName(key?: string): string {\n if (!key) {\n return `cdk-${process.env.PROJECT_SPONSOR}-${process.env.PROJECT_KEY}-${process.env.PROJECT_ENV}-${process.env.PROJECT_NONCE}`;\n } else {\n return `cdk-${process.env.PROJECT_SPONSOR}-${process.env.PROJECT_KEY}-${process.env.PROJECT_ENV}-${process.env.PROJECT_NONCE}-${key}`;\n }\n}\n","import { Construct } from \"constructs\";\nimport { Tags } from \"aws-cdk-lib\";\nimport { constructStackName } from \"./constructStackName\";\n\nconst CDK = {\n CREATION: {\n CDK: \"cdk\",\n },\n ROLE: {\n STACK: \"stack\",\n },\n TAG: {\n BUILD_DATE: \"buildDate\",\n BUILD_HEX: \"buildHex\",\n BUILD_TIME: \"buildTime\",\n COMMIT: \"commit\",\n CREATION: \"creation\",\n ENV: \"env\",\n NONCE: \"nonce\",\n PROJECT: \"project\",\n ROLE: \"role\",\n SERVICE: \"service\",\n SPONSOR: \"sponsor\",\n STACK: \"stack\",\n STACK_SHA: \"stackSha\",\n VERSION: \"version\",\n },\n};\n\nexport function constructTagger(\n construct: Construct,\n { name }: { name?: string } = {},\n): boolean {\n const stackName = name || constructStackName();\n const version =\n process.env.npm_package_version || process.env.PROJECT_VERSION || null;\n\n if (process.env.PROJECT_COMMIT && process.env.PROJECT_COMMIT.length > 8) {\n Tags.of(construct).add(\n CDK.TAG.BUILD_HEX,\n process.env.PROJECT_COMMIT.slice(0, 8),\n );\n }\n Tags.of(construct).add(CDK.TAG.BUILD_DATE, new Date().toISOString());\n Tags.of(construct).add(CDK.TAG.BUILD_TIME, Date.now().toString());\n if (process.env.PROJECT_COMMIT)\n Tags.of(construct).add(CDK.TAG.COMMIT, process.env.PROJECT_COMMIT);\n Tags.of(construct).add(CDK.TAG.CREATION, CDK.CREATION.CDK);\n if (process.env.PROJECT_ENV)\n Tags.of(construct).add(CDK.TAG.ENV, process.env.PROJECT_ENV);\n if (process.env.PROJECT_NONCE)\n Tags.of(construct).add(CDK.TAG.NONCE, process.env.PROJECT_NONCE);\n if (process.env.PROJECT_KEY)\n Tags.of(construct).add(CDK.TAG.PROJECT, process.env.PROJECT_KEY);\n Tags.of(construct).add(CDK.TAG.ROLE, CDK.ROLE.STACK);\n if (process.env.PROJECT_SERVICE)\n Tags.of(construct).add(CDK.TAG.SERVICE, process.env.PROJECT_SERVICE);\n if (process.env.PROJECT_SPONSOR)\n Tags.of(construct).add(CDK.TAG.SPONSOR, process.env.PROJECT_SPONSOR);\n if (stackName) Tags.of(construct).add(CDK.TAG.STACK, stackName);\n if (version) Tags.of(construct).add(CDK.TAG.VERSION, version);\n\n return true;\n}\n","import { ConfigurationError } from \"@jaypie/errors\";\nimport { CDK } from \"../constants\";\n\n/**\n * Configuration for resolving a hostname from parts.\n * Used by envHostname() to construct domain names from environment and config.\n */\nexport interface HostConfig {\n component?: string;\n domain?: string;\n env?: string;\n subdomain?: string;\n}\n\nexport function envHostname({\n component,\n domain,\n env,\n subdomain,\n}: HostConfig = {}) {\n const resolvedDomain =\n domain || process.env.CDK_ENV_DOMAIN || process.env.CDK_ENV_HOSTED_ZONE;\n\n if (!resolvedDomain) {\n throw new ConfigurationError(\n \"No hostname `domain` provided. Set CDK_ENV_DOMAIN or CDK_ENV_HOSTED_ZONE to use environment domain\",\n );\n }\n\n const resolvedComponent =\n component === \"@\" || component === \"\" ? undefined : component;\n const providedSubdomain =\n subdomain === \"@\" || subdomain === \"\" ? undefined : subdomain;\n const resolvedSubdomain = providedSubdomain || process.env.CDK_ENV_SUBDOMAIN;\n const resolvedEnv = env || process.env.PROJECT_ENV;\n const filteredEnv =\n resolvedEnv === CDK.ENV.PRODUCTION ? undefined : resolvedEnv;\n\n // Check if parts are already contained in the domain to avoid duplication\n const domainParts = resolvedDomain.split(\".\");\n\n const isPartInDomain = (part: string | undefined): boolean => {\n if (!part) return false;\n return domainParts.includes(part);\n };\n\n const parts = [\n isPartInDomain(resolvedComponent) ? undefined : resolvedComponent,\n isPartInDomain(resolvedSubdomain) ? undefined : resolvedSubdomain,\n isPartInDomain(filteredEnv) ? undefined : filteredEnv,\n resolvedDomain,\n ].filter((part) => part);\n\n return parts.join(\".\");\n}\n","import { CDK } from \"../constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Policy, PolicyStatement, Role } from \"aws-cdk-lib/aws-iam\";\nimport { Construct } from \"constructs\";\n\nexport interface ExtendDatadogRoleOptions {\n /**\n * Optional construct ID for the policy\n * @default \"DatadogCustomPolicy\"\n */\n id?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n}\n\n/**\n * Extends the Datadog IAM role with additional permissions\n *\n * Checks for CDK_ENV_DATADOG_ROLE_ARN environment variable.\n * If found, creates a custom policy with:\n * - budgets:ViewBudget\n * - logs:DescribeLogGroups\n *\n * @param scope - The construct scope\n * @param options - Configuration options\n * @returns The created Policy, or undefined if CDK_ENV_DATADOG_ROLE_ARN is not set\n */\nexport function extendDatadogRole(\n scope: Construct,\n options?: ExtendDatadogRoleOptions,\n): Policy | undefined {\n const datadogRoleArn = process.env.CDK_ENV_DATADOG_ROLE_ARN;\n\n // Early return if no Datadog role ARN is configured\n if (!datadogRoleArn) {\n return undefined;\n }\n\n const {\n id = \"DatadogCustomPolicy\",\n project,\n service = CDK.SERVICE.DATADOG,\n } = options || {};\n\n // Lookup the Datadog role\n const datadogRole = Role.fromRoleArn(scope, \"DatadogRole\", datadogRoleArn);\n\n // Build policy statements\n const statements: PolicyStatement[] = [\n // Allow view budget\n new PolicyStatement({\n actions: [\"budgets:ViewBudget\"],\n resources: [\"*\"],\n }),\n // Allow describe log groups\n new PolicyStatement({\n actions: [\"logs:DescribeLogGroups\"],\n resources: [\"*\"],\n }),\n ];\n\n // Create the custom policy\n const datadogCustomPolicy = new Policy(scope, id, {\n roles: [datadogRole],\n statements,\n });\n\n // Add tags\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.PROJECT, project);\n }\n\n return datadogCustomPolicy;\n}\n","import { Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"../constants\";\n\n// Cache: Stack -> (domain -> certificate)\n// Using WeakMap for automatic garbage collection when stacks are destroyed\nconst certificateCache = new WeakMap<Stack, Map<string, acm.ICertificate>>();\n\nexport interface ResolveCertificateOptions {\n /** Certificate input - true creates at stack level, false skips, ICertificate uses as-is, string imports from ARN */\n certificate?: boolean | acm.ICertificate | string;\n /** Domain name for the certificate (required if certificate is true) */\n domainName: string;\n /** Construct ID name prefix (defaults to \"Certificate\") */\n name?: string;\n /** Role tag for tagging (defaults to CDK.ROLE.API) */\n roleTag?: string;\n /** Hosted zone for DNS validation (required if certificate is true) */\n zone: route53.IHostedZone;\n}\n\n/**\n * Resolves a certificate based on input type.\n *\n * Key behavior: When certificate is `true`, the certificate is created at the\n * STACK level (not construct level) and cached by domain name. This allows\n * swapping between constructs (e.g., JaypieDistribution to JaypieApiGateway)\n * without recreating the certificate.\n *\n * @param scope - The construct scope (used to find the stack)\n * @param options - Certificate resolution options\n * @returns The resolved certificate, or undefined if certificate is false\n *\n * @example\n * // Create or get cached certificate at stack level\n * const cert = resolveCertificate(this, {\n * certificate: true,\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n *\n * @example\n * // Use existing certificate\n * const cert = resolveCertificate(this, {\n * certificate: existingCert,\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n *\n * @example\n * // Import certificate from ARN\n * const cert = resolveCertificate(this, {\n * certificate: \"arn:aws:acm:us-east-1:123456789:certificate/abc-123\",\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n */\nexport function resolveCertificate(\n scope: Construct,\n options: ResolveCertificateOptions,\n): acm.ICertificate | undefined {\n const {\n certificate,\n domainName,\n name = \"Certificate\",\n roleTag = CDK.ROLE.API,\n zone,\n } = options;\n\n // false = no certificate\n if (certificate === false) {\n return undefined;\n }\n\n // ICertificate passed directly - use as-is\n if (typeof certificate === \"object\" && certificate !== null) {\n return certificate;\n }\n\n // ARN string - import from ARN\n if (typeof certificate === \"string\") {\n // Sanitize domain for construct ID\n const sanitizedDomain = sanitizeDomainForId(domainName);\n return acm.Certificate.fromCertificateArn(\n scope,\n `${name}-${sanitizedDomain}`,\n certificate,\n );\n }\n\n // true (default) = create at STACK level with caching\n const stack = Stack.of(scope);\n\n // Get or create cache for this stack\n let stackCache = certificateCache.get(stack);\n if (!stackCache) {\n stackCache = new Map<string, acm.ICertificate>();\n certificateCache.set(stack, stackCache);\n }\n\n // Return cached certificate if one exists for this domain\n const cached = stackCache.get(domainName);\n if (cached) {\n return cached;\n }\n\n // Create certificate at STACK level (not construct level!)\n // This is the key difference - the certificate's lifecycle is tied to the stack,\n // not to the individual construct that requested it\n const sanitizedDomain = sanitizeDomainForId(domainName);\n const cert = new acm.Certificate(stack, `${name}-${sanitizedDomain}`, {\n domainName,\n validation: acm.CertificateValidation.fromDns(zone),\n });\n Tags.of(cert).add(CDK.TAG.ROLE, roleTag);\n\n // Cache for future requests\n stackCache.set(domainName, cert);\n\n return cert;\n}\n\n/**\n * Sanitizes a domain name for use in CDK construct IDs.\n * CDK construct IDs can only contain alphanumeric characters and hyphens.\n */\nfunction sanitizeDomainForId(domain: string): string {\n return domain.replace(/\\./g, \"-\").replace(/[^a-zA-Z0-9-]/g, \"\");\n}\n\n/**\n * Clears the certificate cache for a specific stack.\n * Primarily useful for testing.\n */\nexport function clearCertificateCache(stack: Stack): void {\n certificateCache.delete(stack);\n}\n\n/**\n * Clears all certificate caches.\n * Primarily useful for testing.\n */\nexport function clearAllCertificateCaches(): void {\n // WeakMap doesn't have a clear() method, so we create a new one\n // This is a no-op since we can't actually clear a WeakMap,\n // but stacks going out of scope will be garbage collected anyway\n}\n","import { CDK } from \"../constants\";\n\n/**\n * Check if the current environment matches the given environment\n */\nexport function isEnv(env: string): boolean {\n return process.env.PROJECT_ENV === env;\n}\n\n/**\n * Check if the current environment is production\n */\nexport function isProductionEnv(): boolean {\n return isEnv(CDK.ENV.PRODUCTION);\n}\n\n/**\n * Check if the current environment is sandbox\n */\nexport function isSandboxEnv(): boolean {\n return isEnv(CDK.ENV.SANDBOX);\n}\n","// In short the RFC 1035 standard for valid hostnames is:\n// 1. Must be less than 253 characters\n// 2. Must start with a letter\n// 3. Must end with a letter or number\n// 4. Can only contain letters, numbers, and hyphens\n// 5. Last part of the domain must be at least 2 characters\n\nfunction validPart(part: string): boolean {\n if (!part.match(/^[a-z]/)) return false;\n if (!part.match(/[a-z0-9]$/)) return false;\n return /^[a-zA-Z0-9-]+$/.test(part);\n}\n\nexport function isValidHostname(hostname: string): boolean {\n // Check hostname is a string\n if (typeof hostname !== \"string\") return false;\n\n // Convert hostname to lowercase\n const check = hostname.toString().toLowerCase();\n\n // Check hostname is less than 253 characters\n if (check.length > 253) return false;\n\n // Split on dots\n const parts = check.split(\".\");\n\n // Check each part is validPart\n const validParts = parts.map(validPart);\n\n // Confirm all parts are valid\n if (!validParts.every((part) => part)) return false;\n\n // Confirm last part is at least 2 characters\n const lastPart = parts[parts.length - 1];\n if (lastPart.length < 2) return false;\n\n // Confirm last part is all letters\n if (!lastPart.match(/^[a-z]+$/)) return false;\n\n // This is a valid hostname\n return true;\n}\n","import { CDK } from \"../constants\";\n\nfunction validPart(part: string): boolean {\n if (!part.match(/^[a-z]/)) return false;\n if (!part.match(/[a-z0-9]$/)) return false;\n return /^[a-zA-Z0-9-]+$/.test(part);\n}\n\nexport function isValidSubdomain(subdomain: string): boolean {\n // Check subdomain is a string\n if (typeof subdomain !== \"string\") return false;\n\n // Special case for apex\n if (subdomain === CDK.HOST.APEX) return true;\n\n // Convert subdomain to lowercase\n const check = subdomain.toString().toLowerCase();\n\n // Check subdomain is less than 250 characters\n // We use 250 instead of 253 because we need to leave room for the dot top-level domain\n if (check.length > 250) return false;\n\n // Split on dots\n const parts = check.split(\".\");\n\n // Check each part is validPart\n const validParts = parts.map(validPart);\n\n // Confirm all parts are valid\n if (!validParts.every((part) => part)) return false;\n\n // Do not care if last part is at least 2 characters\n // Do not care if last part is all letters\n\n // This is a valid subdomain\n return true;\n}\n","export interface JaypieLambdaEnvOptions {\n initialEnvironment?: { [key: string]: string };\n}\n\nexport function jaypieLambdaEnv(options: JaypieLambdaEnvOptions = {}): {\n [key: string]: string;\n} {\n const { initialEnvironment = {} } = options;\n\n // Start with empty environment - we'll only add valid values\n let environment: { [key: string]: string } = {};\n\n // First, add all valid string values from initialEnvironment\n Object.entries(initialEnvironment).forEach(([key, value]) => {\n if (typeof value === \"string\") {\n environment[key] = value;\n }\n });\n\n // Default environment values\n const defaultEnvValues: { [key: string]: string } = {\n AWS_LAMBDA_NODEJS_DISABLE_CALLBACK_WARNING: \"true\",\n };\n\n // Apply default environment values with user overrides\n Object.entries(defaultEnvValues).forEach(([key, defaultValue]) => {\n if (key in initialEnvironment) {\n const userValue = initialEnvironment[key];\n // If user passes a string, it's already added above\n // If user passes non-string falsy value, omit the key\n if (!userValue) {\n delete environment[key];\n }\n // Ignore non-string truthy values (key not added)\n } else {\n // No user override, use default value\n environment[key] = defaultValue;\n }\n });\n\n // Default environment variables from process.env if present\n const defaultEnvVars = [\n \"DATADOG_API_KEY_ARN\",\n \"LOG_LEVEL\",\n \"MODULE_LOGGER\",\n \"MODULE_LOG_LEVEL\",\n \"PROJECT_CHAOS\",\n \"PROJECT_COMMIT\",\n \"PROJECT_ENV\",\n \"PROJECT_KEY\",\n \"PROJECT_SECRET\",\n \"PROJECT_SERVICE\",\n \"PROJECT_SPONSOR\",\n \"PROJECT_VERSION\",\n ];\n\n // Add default environment variables if they exist in process.env\n defaultEnvVars.forEach((envVar) => {\n if (process.env[envVar] && !environment[envVar]) {\n environment[envVar] = process.env[envVar]!;\n }\n });\n\n return environment;\n}\n","import { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"../constants\";\n\nexport function mergeDomain(subDomain: string, hostedZone: string): string {\n if (!hostedZone) {\n throw new ConfigurationError(\"hostedZone is required\");\n }\n if (!subDomain) {\n // Return hostedZone if subDomain is not passed\n // Pass CDK.HOST.APEX to explicitly indicate apex domain\n return hostedZone;\n }\n if (subDomain === CDK.HOST.APEX) {\n return hostedZone;\n }\n return `${subDomain}.${hostedZone}`;\n}\n","import { CDK } from \"../constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nconst DEFAULT_FUNCTION_NAME = \"DatadogForwarderFunction\";\n\n// Cache to store resolved functions\n// Using nested structure to support multiple functions per scope with automatic GC\nconst functionCache = new WeakMap<Construct, Map<string, lambda.IFunction>>();\n\nexport interface ResolveDatadogForwarderFunctionOptions {\n import?: string;\n name?: string;\n}\n\nexport function resolveDatadogForwarderFunction(\n scope: Construct,\n options?: ResolveDatadogForwarderFunctionOptions,\n): lambda.IFunction {\n const { import: importValue, name } = options || {};\n\n const functionName = name || DEFAULT_FUNCTION_NAME;\n const importKey = importValue || CDK.IMPORT.DATADOG_LOG_FORWARDER;\n\n // Create a cache key based on name and import\n const cacheKey = `${functionName}:${importKey}`;\n\n // Get or create scope cache\n let scopeCache = functionCache.get(scope);\n if (!scopeCache) {\n scopeCache = new Map<string, lambda.IFunction>();\n functionCache.set(scope, scopeCache);\n }\n\n // Return cached function if it exists\n const cachedFunction = scopeCache.get(cacheKey);\n if (cachedFunction) {\n return cachedFunction;\n }\n\n // Create and cache the function\n const func = lambda.Function.fromFunctionArn(\n scope,\n functionName,\n cdk.Fn.importValue(importKey),\n );\n scopeCache.set(cacheKey, func);\n\n return func;\n}\n","import { CDK } from \"../constants\";\nimport { Stack } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nexport interface ResolveDatadogLayerOptions {\n datadogApiKeyArn?: string;\n uniqueId?: string;\n}\n\nexport function resolveDatadogLayers(\n scope: Construct,\n options: ResolveDatadogLayerOptions = {},\n): lambda.ILayerVersion[] | undefined {\n const { datadogApiKeyArn, uniqueId } = options;\n\n let resolvedRegion = Stack.of(scope).region || \"us-east-1\";\n\n // Resolve the Datadog API key ARN from multiple sources\n const resolvedDatadogApiKeyArn =\n datadogApiKeyArn ||\n process.env.DATADOG_API_KEY_ARN ||\n process.env.CDK_ENV_DATADOG_API_KEY_ARN;\n\n // Return null if no API key is found\n if (!resolvedDatadogApiKeyArn) {\n return undefined;\n }\n\n const layerIdSuffix =\n uniqueId || process.env.PROJECT_NONCE || Date.now().toString();\n\n // Create Datadog Node.js layer\n const datadogNodeLayer = lambda.LayerVersion.fromLayerVersionArn(\n scope,\n `DatadogNodeLayer-${layerIdSuffix}`,\n `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Node24-x:${CDK.DATADOG.LAYER.NODE}`,\n );\n\n // Create Datadog Extension layer\n const datadogExtensionLayer = lambda.LayerVersion.fromLayerVersionArn(\n scope,\n `DatadogExtensionLayer-${layerIdSuffix}`,\n `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Extension:${CDK.DATADOG.LAYER.EXTENSION}`,\n );\n\n return [datadogNodeLayer, datadogExtensionLayer];\n}\n","import { CDK } from \"../constants\";\nimport * as logDestinations from \"aws-cdk-lib/aws-logs-destinations\";\nimport { Construct } from \"constructs\";\n\nimport {\n resolveDatadogForwarderFunction,\n ResolveDatadogForwarderFunctionOptions,\n} from \"./resolveDatadogForwarderFunction\";\n\nconst DEFAULT_FUNCTION_NAME = \"DatadogForwarderFunction\";\n\n// Cache to store resolved logging destinations\n// Using nested structure to support multiple destinations per scope with automatic GC\nconst destinationCache = new WeakMap<\n Construct,\n Map<string, logDestinations.LambdaDestination>\n>();\n\nexport function resolveDatadogLoggingDestination(\n scope: Construct,\n options?: ResolveDatadogForwarderFunctionOptions,\n): logDestinations.LambdaDestination {\n const { import: importValue, name } = options || {};\n\n // Create a cache key based on name and import (same as forwarder function)\n const functionName = name || DEFAULT_FUNCTION_NAME;\n const importKey = importValue || CDK.IMPORT.DATADOG_LOG_FORWARDER;\n const cacheKey = `${functionName}:${importKey}`;\n\n // Get or create scope cache\n let scopeCache = destinationCache.get(scope);\n if (!scopeCache) {\n scopeCache = new Map<string, logDestinations.LambdaDestination>();\n destinationCache.set(scope, scopeCache);\n }\n\n // Return cached destination if it exists\n const cachedDestination = scopeCache.get(cacheKey);\n if (cachedDestination) {\n return cachedDestination;\n }\n\n // Resolve the Datadog forwarder function\n const datadogForwarderFunction = resolveDatadogForwarderFunction(\n scope,\n options,\n );\n\n // Create and cache the logging destination\n const datadogLoggingDestination = new logDestinations.LambdaDestination(\n datadogForwarderFunction,\n );\n scopeCache.set(cacheKey, datadogLoggingDestination);\n\n return datadogLoggingDestination;\n}\n","/**\n * Environment value type for the new array syntax\n * - string: key to lookup in process.env\n * - object: key-value pairs to include directly\n */\nexport type EnvironmentArrayItem = string | { [key: string]: string };\n\n/**\n * Environment type that supports both legacy object syntax and new array syntax\n */\nexport type EnvironmentInput =\n | { [key: string]: string }\n | EnvironmentArrayItem[];\n\n/**\n * Resolves environment input to a plain object.\n *\n * When environment is an object (legacy syntax), returns it as-is.\n * When environment is an array:\n * - Strings are treated as keys to lookup in process.env\n * - Objects have their key-value pairs merged in\n *\n * @example\n * // Legacy object syntax\n * resolveEnvironment({ FOO: \"bar\" })\n * // => { FOO: \"bar\" }\n *\n * @example\n * // Array syntax with process.env lookup\n * // Given process.env.MY_VAR = \"hello\"\n * resolveEnvironment([\"MY_VAR\"])\n * // => { MY_VAR: \"hello\" }\n *\n * @example\n * // Array syntax with objects\n * resolveEnvironment([{ FOO: \"bar\", BAZ: \"qux\" }])\n * // => { FOO: \"bar\", BAZ: \"qux\" }\n *\n * @example\n * // Mixed array syntax\n * // Given process.env.MY_VAR = \"hello\"\n * resolveEnvironment([\"MY_VAR\", { FOO: \"bar\" }])\n * // => { MY_VAR: \"hello\", FOO: \"bar\" }\n */\nexport function resolveEnvironment(\n environment?: EnvironmentInput,\n env: Record<string, string | undefined> = process.env,\n): { [key: string]: string } {\n if (!environment) {\n return {};\n }\n\n // Legacy object syntax - return as-is\n if (!Array.isArray(environment)) {\n return environment;\n }\n\n // Array syntax - process each item\n return environment.reduce<{ [key: string]: string }>((acc, item) => {\n if (typeof item === \"string\") {\n // String: lookup in process.env\n const value = env[item];\n if (value !== undefined) {\n return {\n ...acc,\n [item]: value,\n };\n }\n // Skip if not found in process.env\n return acc;\n }\n\n // Object: merge key-value pairs\n return {\n ...acc,\n ...item,\n };\n }, {});\n}\n","import { Construct } from \"constructs\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nexport function resolveHostedZone(\n scope: Construct,\n {\n name = \"HostedZone\",\n zone = process.env.CDK_ENV_HOSTED_ZONE,\n }: {\n name?: string;\n zone?: string | route53.IHostedZone;\n } = {},\n): route53.IHostedZone {\n if (!zone) {\n throw new ConfigurationError(\n \"No `zone` provided. Set CDK_ENV_HOSTED_ZONE to use environment zone\",\n );\n }\n\n if (typeof zone === \"string\") {\n return route53.HostedZone.fromLookup(scope, name, {\n domainName: zone,\n });\n }\n return zone;\n}\n","import { Duration } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\n\nexport interface ResolveParamsAndSecretsOptions {\n cacheSize?: number;\n logLevel?: lambda.ParamsAndSecretsLogLevel;\n parameterStoreTtl?: Duration;\n secretsManagerTtl?: Duration;\n}\n\nexport const resolveParamsAndSecrets = ({\n paramsAndSecrets,\n options,\n}: {\n paramsAndSecrets?: lambda.ParamsAndSecretsLayerVersion | boolean;\n options?: ResolveParamsAndSecretsOptions;\n} = {}) => {\n if (paramsAndSecrets === false) {\n return;\n }\n\n let resolvedParamsAndSecrets: lambda.ParamsAndSecretsLayerVersion;\n if (paramsAndSecrets instanceof lambda.ParamsAndSecretsLayerVersion) {\n resolvedParamsAndSecrets = paramsAndSecrets;\n } else {\n const resolvedOptions = options || {};\n resolvedParamsAndSecrets = lambda.ParamsAndSecretsLayerVersion.fromVersion(\n lambda.ParamsAndSecretsVersions.V1_0_103,\n {\n cacheSize: resolvedOptions.cacheSize,\n logLevel:\n resolvedOptions.logLevel || lambda.ParamsAndSecretsLogLevel.WARN,\n parameterStoreTtl: resolvedOptions.parameterStoreTtl,\n secretsManagerTtl: resolvedOptions.secretsManagerTtl,\n },\n );\n }\n\n return resolvedParamsAndSecrets;\n};\n\nexport default resolveParamsAndSecrets;\n","import { Construct } from \"constructs\";\nimport {\n CfnOutput,\n Fn,\n SecretValue,\n Tags,\n RemovalPolicy,\n Stack,\n} from \"aws-cdk-lib\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport {\n ISecret,\n ISecretAttachmentTarget,\n RotationSchedule,\n RotationScheduleOptions,\n} from \"aws-cdk-lib/aws-secretsmanager\";\nimport { IKey } from \"aws-cdk-lib/aws-kms\";\nimport {\n Grant,\n IGrantable,\n PolicyStatement,\n AddToResourcePolicyResult,\n} from \"aws-cdk-lib/aws-iam\";\n\nimport { CDK } from \"./constants\";\n\n// It is a consumer if the environment is ephemeral\nfunction checkEnvIsConsumer(env = process.env): boolean {\n return (\n env.PROJECT_ENV === CDK.ENV.PERSONAL ||\n !!env.CDK_ENV_PERSONAL ||\n /** @deprecated */ env.PROJECT_ENV === \"ephemeral\" ||\n /** @deprecated */ !!env.CDK_ENV_EPHEMERAL\n );\n}\n\nfunction checkEnvIsProvider(env = process.env): boolean {\n return env.PROJECT_ENV === CDK.ENV.SANDBOX;\n}\n\nfunction cleanName(name: string): string {\n return name.replace(/[^a-zA-Z0-9:-]/g, \"\");\n}\n\nfunction exportEnvName(name: string, env = process.env): string {\n let rawName;\n if (checkEnvIsProvider(env)) {\n rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;\n // Clean the entire name to only allow alphanumeric, colons, and hyphens\n return cleanName(rawName);\n } else {\n if (checkEnvIsConsumer(env)) {\n rawName = `env-${CDK.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;\n } else {\n rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;\n }\n }\n return cleanName(rawName);\n}\n\nexport interface JaypieEnvSecretProps {\n consumer?: boolean;\n envKey?: string;\n export?: string;\n generateSecretString?: secretsmanager.SecretStringGenerator;\n provider?: boolean;\n roleTag?: string;\n vendorTag?: string;\n value?: string;\n}\n\nexport class JaypieEnvSecret extends Construct implements ISecret {\n private readonly _envKey?: string;\n private readonly _secret: secretsmanager.ISecret;\n\n constructor(\n scope: Construct,\n idOrEnvKey: string,\n props?: JaypieEnvSecretProps,\n ) {\n // Check if idOrEnvKey should be treated as envKey:\n // - No props provided OR props.envKey is not set\n // - AND idOrEnvKey exists as a non-empty string in process.env\n const treatAsEnvKey =\n (!props || props.envKey === undefined) &&\n typeof process.env[idOrEnvKey] === \"string\" &&\n process.env[idOrEnvKey] !== \"\";\n\n const id = treatAsEnvKey ? `EnvSecret_${idOrEnvKey}` : idOrEnvKey;\n\n super(scope, id);\n\n const {\n consumer = checkEnvIsConsumer(),\n envKey: envKeyProp,\n export: exportParam,\n generateSecretString,\n provider = checkEnvIsProvider(),\n roleTag,\n vendorTag,\n value,\n } = props || {};\n\n const envKey = treatAsEnvKey ? idOrEnvKey : envKeyProp;\n\n this._envKey = envKey;\n\n let exportName;\n\n if (!exportParam) {\n exportName = exportEnvName(id);\n } else {\n exportName = cleanName(exportParam);\n }\n\n if (consumer) {\n const secretName = Fn.importValue(exportName);\n this._secret = secretsmanager.Secret.fromSecretNameV2(\n this,\n id,\n secretName,\n );\n\n // Add CfnOutput for consumer secrets\n new CfnOutput(this, `ConsumedName`, {\n value: this._secret.secretName,\n });\n } else {\n const secretValue =\n envKey && process.env[envKey] ? process.env[envKey] : value;\n\n const secretProps: secretsmanager.SecretProps = {\n generateSecretString,\n secretStringValue:\n !generateSecretString && secretValue\n ? SecretValue.unsafePlainText(secretValue)\n : undefined,\n };\n\n this._secret = new secretsmanager.Secret(this, id, secretProps);\n\n if (roleTag) {\n Tags.of(this._secret).add(CDK.TAG.ROLE, roleTag);\n }\n\n if (vendorTag) {\n Tags.of(this._secret).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n if (provider) {\n new CfnOutput(this, `ProvidedName`, {\n value: this._secret.secretName,\n exportName,\n });\n } else {\n new CfnOutput(this, `CreatedName`, {\n value: this._secret.secretName,\n });\n }\n }\n }\n\n // IResource implementation\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public get env(): { account: string; region: string } {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._secret.applyRemovalPolicy(policy);\n }\n\n // ISecret implementation\n public get secretArn(): string {\n return this._secret.secretArn;\n }\n\n public get secretFullArn(): string | undefined {\n return this._secret.secretFullArn;\n }\n\n public get secretName(): string {\n return this._secret.secretName;\n }\n\n public get secretRef(): secretsmanager.SecretReference {\n return this._secret.secretRef;\n }\n\n public get encryptionKey(): IKey | undefined {\n return this._secret.encryptionKey;\n }\n\n public get secretValue(): SecretValue {\n return this._secret.secretValue;\n }\n\n public secretValueFromJson(key: string): SecretValue {\n return this._secret.secretValueFromJson(key);\n }\n\n public grantRead(grantee: IGrantable, versionStages?: string[]): Grant {\n return this._secret.grantRead(grantee, versionStages);\n }\n\n public grantWrite(grantee: IGrantable): Grant {\n return this._secret.grantWrite(grantee);\n }\n\n public addRotationSchedule(\n id: string,\n options: RotationScheduleOptions,\n ): RotationSchedule {\n return this._secret.addRotationSchedule(id, options);\n }\n\n public addToResourcePolicy(\n statement: PolicyStatement,\n ): AddToResourcePolicyResult {\n return this._secret.addToResourcePolicy(statement);\n }\n\n public denyAccountRootDelete(): void {\n this._secret.denyAccountRootDelete();\n }\n\n public attach(target: ISecretAttachmentTarget): ISecret {\n return this._secret.attach(target);\n }\n\n public cfnDynamicReferenceKey(\n options?: Parameters<ISecret[\"cfnDynamicReferenceKey\"]>[0],\n ): string {\n return this._secret.cfnDynamicReferenceKey(options);\n }\n\n public get envKey(): string | undefined {\n return this._envKey;\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"../JaypieEnvSecret.js\";\n\n/**\n * Secrets input type that supports both JaypieEnvSecret instances and strings\n * - JaypieEnvSecret: passed through as-is\n * - string: converted to JaypieEnvSecret with the string as envKey\n */\nexport type SecretsArrayItem = JaypieEnvSecret | string;\n\n/**\n * Cache for secrets by scope to avoid creating duplicates.\n * Uses WeakMap to allow garbage collection when scopes are no longer referenced.\n */\nconst secretsByScope = new WeakMap<Construct, Map<string, JaypieEnvSecret>>();\n\n/**\n * Gets or creates the secrets cache for a given scope.\n */\nfunction getSecretsCache(scope: Construct): Map<string, JaypieEnvSecret> {\n let cache = secretsByScope.get(scope);\n if (!cache) {\n cache = new Map<string, JaypieEnvSecret>();\n secretsByScope.set(scope, cache);\n }\n return cache;\n}\n\n/**\n * Gets an existing secret from the cache or creates a new one.\n * This ensures that multiple constructs within the same scope share secrets.\n */\nfunction getOrCreateSecret(\n scope: Construct,\n envKey: string,\n props?: Omit<JaypieEnvSecretProps, \"envKey\">,\n): JaypieEnvSecret {\n const cache = getSecretsCache(scope);\n const existingSecret = cache.get(envKey);\n\n if (existingSecret) {\n return existingSecret;\n }\n\n // Create new secret - JaypieEnvSecret's smart constructor handles envKey detection\n const secret = new JaypieEnvSecret(scope, envKey, {\n ...props,\n envKey,\n });\n cache.set(envKey, secret);\n return secret;\n}\n\n/**\n * Resolves secrets input to an array of JaypieEnvSecret instances.\n *\n * When an item is already a JaypieEnvSecret, it's passed through as-is.\n * When an item is a string, a JaypieEnvSecret is created (or reused from cache)\n * with the string as the envKey.\n *\n * Secrets are cached per scope to avoid creating duplicate secrets when\n * multiple constructs in the same scope reference the same secret.\n *\n * @example\n * // JaypieEnvSecret instances pass through\n * const secret = new JaypieEnvSecret(scope, \"MySecret\", { envKey: \"MY_KEY\" });\n * resolveSecrets(scope, [secret])\n * // => [secret]\n *\n * @example\n * // Strings create JaypieEnvSecret instances\n * resolveSecrets(scope, [\"AUTH0_SECRET\", \"MONGODB_URI\"])\n * // => [JaypieEnvSecret(envKey: \"AUTH0_SECRET\"), JaypieEnvSecret(envKey: \"MONGODB_URI\")]\n *\n * @example\n * // Mixed input\n * const existingSecret = new JaypieEnvSecret(scope, \"Existing\", { envKey: \"EXISTING\" });\n * resolveSecrets(scope, [existingSecret, \"NEW_SECRET\"])\n * // => [existingSecret, JaypieEnvSecret(envKey: \"NEW_SECRET\")]\n *\n * @example\n * // Secrets are shared across calls with the same scope\n * const secrets1 = resolveSecrets(scope, [\"SHARED_SECRET\"]);\n * const secrets2 = resolveSecrets(scope, [\"SHARED_SECRET\"]);\n * // secrets1[0] === secrets2[0] (same instance)\n */\nexport function resolveSecrets(\n scope: Construct,\n secrets?: SecretsArrayItem[],\n): JaypieEnvSecret[] {\n if (!secrets || secrets.length === 0) {\n return [];\n }\n\n return secrets.map((item) => {\n if (typeof item === \"string\") {\n return getOrCreateSecret(scope, item);\n }\n // Already a JaypieEnvSecret instance\n return item;\n });\n}\n\n/**\n * Clears the secrets cache for a given scope.\n * Primarily useful for testing.\n */\nexport function clearSecretsCache(scope: Construct): void {\n secretsByScope.delete(scope);\n}\n\n/**\n * Clears all secrets caches.\n * Primarily useful for testing.\n */\nexport function clearAllSecretsCaches(): void {\n // WeakMap doesn't have a clear() method, so we create a new one\n // This relies on the module being reloaded or the function being called\n // between test runs. For testing, use clearSecretsCache(scope) instead.\n}\n","import { Construct } from \"constructs\";\nimport { RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as apiGateway from \"aws-cdk-lib/aws-apigateway\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\nexport interface JaypieApiGatewayProps extends apiGateway.LambdaRestApiProps {\n certificate?: boolean | acm.ICertificate;\n /**\n * The domain name for the API Gateway.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"api.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @example\n * // Direct string\n * host: \"api.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { subdomain: \"api\" }\n */\n host?: string | HostConfig;\n name?: string;\n roleTag?: string;\n zone?: string | route53.IHostedZone;\n}\n\nexport class JaypieApiGateway extends Construct implements apiGateway.IRestApi {\n private readonly _api: apiGateway.LambdaRestApi;\n private readonly _certificate?: acm.ICertificate;\n private readonly _domainName?: apiGateway.DomainName;\n private readonly _host?: string;\n\n constructor(scope: Construct, id: string, props: JaypieApiGatewayProps) {\n super(scope, id);\n\n const {\n certificate = true,\n handler,\n host: propsHost,\n name,\n roleTag = CDK.ROLE.API,\n zone: propsZone,\n } = props;\n\n // Determine zone from props or environment\n let zone = propsZone;\n if (!zone && process.env.CDK_ENV_API_HOSTED_ZONE) {\n zone = process.env.CDK_ENV_API_HOSTED_ZONE;\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n host = envHostname(propsHost);\n } else if (process.env.CDK_ENV_API_HOST_NAME) {\n host = process.env.CDK_ENV_API_HOST_NAME;\n } else if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n process.env.CDK_ENV_API_HOSTED_ZONE\n ) {\n host = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE,\n );\n }\n\n const apiGatewayName = name || constructEnvName(\"ApiGateway\");\n const apiDomainName = constructEnvName(\"ApiDomainName\");\n\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n certificateToUse = resolveCertificate(this, {\n certificate,\n domainName: host,\n roleTag: CDK.ROLE.HOSTING,\n zone: hostedZone,\n });\n\n this._certificate = certificateToUse;\n this._host = host;\n }\n\n const {\n // * `...lambdaRestApiProps` cannot be moved to the first const destructuring because it needs to exclude the custom properties first.\n // Ignore the variables we already assigned to other properties\n /* eslint-disable @typescript-eslint/no-unused-vars */\n certificate: _certificate,\n host: _host,\n name: _name,\n roleTag: _roleTag,\n zone: _zone,\n handler: _handler,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...lambdaRestApiProps\n } = props;\n\n this._api = new apiGateway.LambdaRestApi(this, apiGatewayName, {\n handler,\n ...lambdaRestApiProps,\n });\n Tags.of(this._api).add(CDK.TAG.ROLE, roleTag);\n\n if (host && certificateToUse && hostedZone) {\n this._domainName = this._api.addDomainName(apiDomainName, {\n domainName: host,\n certificate: certificateToUse,\n });\n Tags.of(this._domainName).add(CDK.TAG.ROLE, roleTag);\n\n const record = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayDomain(this._domainName),\n ),\n zone: hostedZone,\n });\n Tags.of(record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n }\n\n public get api(): apiGateway.LambdaRestApi {\n return this._api;\n }\n\n public get url(): string {\n return this._api.url;\n }\n\n public get certificateArn(): string | undefined {\n return this._certificate?.certificateArn;\n }\n\n public get domainName(): string | undefined {\n return this._domainName?.domainName;\n }\n\n public get host(): string | undefined {\n return this._host;\n }\n\n public get restApiId(): string {\n return this._api.restApiId;\n }\n\n public get restApiName(): string {\n return this._api.restApiName;\n }\n\n public get restApiRootResourceId(): string {\n return this._api.restApiRootResourceId;\n }\n\n public get deploymentStage(): apiGateway.Stage {\n return this._api.deploymentStage;\n }\n\n public get domainNameAliasDomainName(): string | undefined {\n return this._domainName?.domainNameAliasDomainName;\n }\n\n public get domainNameAliasHostedZoneId(): string | undefined {\n return this._domainName?.domainNameAliasHostedZoneId;\n }\n\n public get root(): apiGateway.IResource {\n return this._api.root;\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this._api.stack;\n }\n\n public arnForExecuteApi(\n method?: string,\n path?: string,\n stage?: string,\n ): string {\n return this._api.arnForExecuteApi(method, path, stage);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metric(metricName, props);\n }\n\n public metricCacheHitCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCacheHitCount(props);\n }\n\n public metricCacheMissCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCacheMissCount(props);\n }\n\n public metricClientError(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricClientError(props);\n }\n\n public metricCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCount(props);\n }\n\n public metricIntegrationLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricIntegrationLatency(props);\n }\n\n public metricLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricLatency(props);\n }\n\n public metricServerError(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricServerError(props);\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._api.applyRemovalPolicy(policy);\n }\n\n public get restApiRef(): apiGateway.RestApiReference {\n return {\n restApiId: this._api.restApiId,\n };\n }\n}\n","import { Stack, StackProps } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { constructStackName, constructTagger } from \"./helpers\";\n\nexport interface JaypieStackProps extends StackProps {\n key?: string;\n}\n\nexport class JaypieStack extends Stack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key, ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n // Handle env\n stackProps.env = {\n account: process.env.CDK_DEFAULT_ACCOUNT,\n region: process.env.CDK_DEFAULT_REGION,\n ...stackProps.env,\n };\n\n super(scope, id, stackProps);\n\n // Apply tags\n constructTagger(this, { name: stackProps.stackName });\n }\n}\n","import { Construct } from \"constructs\";\nimport { JaypieStack, JaypieStackProps } from \"./JaypieStack\";\nimport { constructStackName } from \"./helpers\";\n\nexport class JaypieAppStack extends JaypieStack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key = \"app\", ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n super(scope, id, { key, ...stackProps });\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Stack, RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as cloudwatch from \"aws-cdk-lib/aws-cloudwatch\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport * as ec2 from \"aws-cdk-lib/aws-ec2\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as logs from \"aws-cdk-lib/aws-logs\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { CDK } from \"./constants\";\nimport {\n addDatadogLayers,\n EnvironmentInput,\n jaypieLambdaEnv,\n resolveEnvironment,\n resolveParamsAndSecrets,\n resolveSecrets,\n SecretsArrayItem,\n} from \"./helpers/index.js\";\n\nexport interface JaypieLambdaProps {\n allowAllOutbound?: boolean;\n allowPublicSubnet?: boolean;\n architecture?: lambda.Architecture;\n code: lambda.Code | string;\n datadogApiKeyArn?: string;\n deadLetterQueue?: import(\"aws-cdk-lib/aws-sqs\").IQueue;\n deadLetterQueueEnabled?: boolean;\n deadLetterTopic?: import(\"aws-cdk-lib/aws-sns\").ITopic;\n description?: string;\n /**\n * DynamoDB tables to grant read/write access to the Lambda function.\n * Each table is granted read/write access and if exactly one table is provided,\n * the DYNAMODB_TABLE_NAME environment variable is set to the table name.\n */\n tables?: dynamodb.ITable[];\n /**\n * Environment variables for the Lambda function.\n *\n * Supports both legacy object syntax and new array syntax:\n * - Object: { KEY: \"value\" } - directly sets environment variables\n * - Array: [\"KEY1\", \"KEY2\", { KEY3: \"value\" }]\n * - Strings: lookup value from process.env\n * - Objects: merge key-value pairs directly\n */\n environment?: EnvironmentInput;\n envSecrets?: { [key: string]: secretsmanager.ISecret };\n ephemeralStorageSize?: import(\"aws-cdk-lib\").Size;\n filesystem?: lambda.FileSystem;\n handler: string;\n initialPolicy?: iam.PolicyStatement[];\n layers?: lambda.ILayerVersion[];\n logGroup?: logs.ILogGroup;\n logRetention?: logs.RetentionDays | number;\n maxEventAge?: Duration;\n memorySize?: number;\n paramsAndSecrets?: lambda.ParamsAndSecretsLayerVersion | boolean;\n paramsAndSecretsOptions?: {\n cacheSize?: number;\n logLevel?: lambda.ParamsAndSecretsLogLevel;\n parameterStoreTtl?: Duration;\n secretsManagerTtl?: Duration;\n };\n profiling?: boolean;\n profilingGroup?: import(\"aws-cdk-lib/aws-codeguruprofiler\").IProfilingGroup;\n provisionedConcurrentExecutions?: number;\n reservedConcurrentExecutions?: number;\n retryAttempts?: number;\n roleTag?: string;\n runtime?: lambda.Runtime;\n runtimeManagementMode?: lambda.RuntimeManagementMode;\n /**\n * Secrets to make available to the Lambda function.\n *\n * Supports both JaypieEnvSecret instances and strings:\n * - JaypieEnvSecret: used directly\n * - String: creates a JaypieEnvSecret with the string as envKey\n * (reuses existing secrets within the same scope)\n */\n secrets?: SecretsArrayItem[];\n securityGroups?: ec2.ISecurityGroup[];\n timeout?: Duration | number;\n tracing?: lambda.Tracing;\n vendorTag?: string;\n vpc?: ec2.IVpc;\n vpcSubnets?: ec2.SubnetSelection;\n}\n\nexport class JaypieLambda extends Construct implements lambda.IFunction {\n private readonly _lambda: lambda.Function;\n private readonly _provisioned?: lambda.Alias;\n private readonly _reference: lambda.IFunction;\n\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id);\n\n const {\n allowAllOutbound,\n allowPublicSubnet,\n architecture = lambda.Architecture.X86_64,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n tables = [],\n environment: environmentInput,\n envSecrets = {},\n ephemeralStorageSize,\n filesystem,\n handler = \"index.handler\",\n initialPolicy,\n layers = [],\n logGroup,\n logRetention = CDK.LAMBDA.LOG_RETENTION,\n maxEventAge,\n memorySize = CDK.LAMBDA.MEMORY_SIZE,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag = CDK.ROLE.PROCESSING,\n runtime = new lambda.Runtime(\"nodejs24.x\", lambda.RuntimeFamily.NODEJS, {\n supportsInlineCode: true,\n }),\n runtimeManagementMode,\n secrets: secretsInput = [],\n securityGroups,\n timeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n tracing,\n vendorTag,\n vpc,\n vpcSubnets,\n } = props;\n\n // Resolve environment from array or object syntax\n const initialEnvironment = resolveEnvironment(environmentInput);\n\n // Get base environment with defaults\n const environment = jaypieLambdaEnv({ initialEnvironment });\n\n // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)\n const secrets = resolveSecrets(scope, secretsInput);\n\n const codeAsset =\n typeof code === \"string\" ? lambda.Code.fromAsset(code) : code;\n\n // Create a working copy of layers\n const resolvedLayers = [...layers];\n\n // Process secrets environment variables\n const secretsEnvironment = Object.entries(envSecrets).reduce(\n (acc, [key, secret]) => ({\n ...acc,\n [`SECRET_${key}`]: secret.secretName,\n }),\n {},\n );\n\n // Process JaypieEnvSecret array\n const jaypieSecretsEnvironment = secrets.reduce<{ [key: string]: string }>(\n (acc, secret) => {\n if (secret.envKey) {\n return {\n ...acc,\n [`SECRET_${secret.envKey}`]: secret.secretName,\n };\n }\n return acc;\n },\n {},\n );\n\n // Add ParamsAndSecrets layer if configured\n const resolvedParamsAndSecrets = resolveParamsAndSecrets({\n paramsAndSecrets,\n options: paramsAndSecretsOptions,\n });\n\n // Create LogGroup if not provided\n const resolvedLogGroup =\n logGroup ??\n new logs.LogGroup(this, \"LogGroup\", {\n retention: logRetention as logs.RetentionDays,\n removalPolicy: RemovalPolicy.DESTROY,\n });\n\n // Create Lambda Function\n this._lambda = new lambda.Function(this, \"Function\", {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n code: codeAsset,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment: {\n ...environment,\n ...secretsEnvironment,\n ...jaypieSecretsEnvironment,\n },\n ephemeralStorageSize,\n filesystem,\n handler,\n initialPolicy,\n layers: resolvedLayers,\n logGroup: resolvedLogGroup,\n maxEventAge,\n memorySize,\n paramsAndSecrets: resolvedParamsAndSecrets,\n profiling,\n profilingGroup,\n reservedConcurrentExecutions,\n retryAttempts,\n runtime,\n runtimeManagementMode,\n securityGroups,\n timeout:\n typeof timeout === \"number\" ? Duration.seconds(timeout) : timeout,\n tracing,\n vpc,\n vpcSubnets,\n // Enable auto-publishing of versions when using provisioned concurrency\n currentVersionOptions:\n provisionedConcurrentExecutions !== undefined\n ? {\n removalPolicy: RemovalPolicy.RETAIN,\n description: \"Auto-published version for provisioned concurrency\",\n // Don't set provisioned concurrency here - it will be set on the alias\n }\n : undefined,\n });\n\n addDatadogLayers(this._lambda, { datadogApiKeyArn });\n\n // Grant secret read permissions\n Object.values(envSecrets).forEach((secret) => {\n secret.grantRead(this._lambda);\n });\n\n // Grant read permissions for JaypieEnvSecrets\n secrets.forEach((secret) => {\n secret.grantRead(this._lambda);\n });\n\n // Grant read/write permissions for DynamoDB tables\n tables.forEach((table) => {\n table.grantReadWriteData(this._lambda);\n });\n\n // Add table name to environment if there's exactly one table\n if (tables.length === 1) {\n this._lambda.addEnvironment(\"DYNAMODB_TABLE_NAME\", tables[0].tableName);\n }\n\n // Configure provisioned concurrency if specified\n if (provisionedConcurrentExecutions !== undefined) {\n // Use currentVersion which is auto-published with proper configuration\n const version = this._lambda.currentVersion;\n\n // Create alias for provisioned concurrency\n this._provisioned = new lambda.Alias(this, \"ProvisionedAlias\", {\n aliasName: \"provisioned\",\n version,\n provisionedConcurrentExecutions,\n });\n\n // Add explicit dependencies to ensure proper creation order\n this._provisioned.node.addDependency(version);\n }\n\n if (roleTag) {\n Tags.of(this._lambda).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._lambda).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Assign _reference based on provisioned state\n this._reference =\n this._provisioned !== undefined ? this._provisioned : this._lambda;\n }\n\n // Public accessors\n public get lambda(): lambda.Function {\n return this._lambda;\n }\n\n public get provisioned(): lambda.Alias | undefined {\n return this._provisioned;\n }\n\n public get reference(): lambda.IFunction {\n return this._reference;\n }\n\n // IFunction implementation\n public get functionArn(): string {\n return this._reference.functionArn;\n }\n\n public get functionName(): string {\n return this._reference.functionName;\n }\n\n public get grantPrincipal(): iam.IPrincipal {\n return this._reference.grantPrincipal;\n }\n\n public get role(): iam.IRole | undefined {\n return this._reference.role;\n }\n\n public get architecture(): lambda.Architecture {\n return this._reference.architecture;\n }\n\n public get connections(): import(\"aws-cdk-lib/aws-ec2\").Connections {\n return this._reference.connections;\n }\n\n public get isBoundToVpc(): boolean {\n return this._reference.isBoundToVpc;\n }\n\n public get latestVersion(): lambda.IVersion {\n return this._reference.latestVersion;\n }\n\n public get permissionsNode(): import(\"constructs\").Node {\n return this._reference.permissionsNode;\n }\n\n public get resourceArnsForGrantInvoke(): string[] {\n return this._reference.resourceArnsForGrantInvoke;\n }\n\n public get functionRef(): lambda.FunctionReference {\n return {\n functionArn: this._reference.functionArn,\n functionName: this._reference.functionName,\n };\n }\n\n public addEventSource(source: lambda.IEventSource): void {\n this._reference.addEventSource(source);\n }\n\n public addEventSourceMapping(\n id: string,\n options: lambda.EventSourceMappingOptions,\n ): lambda.EventSourceMapping {\n return this._reference.addEventSourceMapping(id, options);\n }\n\n public addFunctionUrl(\n options?: lambda.FunctionUrlOptions,\n ): lambda.FunctionUrl {\n return this._reference.addFunctionUrl(options);\n }\n\n public addPermission(id: string, permission: lambda.Permission): void {\n this._reference.addPermission(id, permission);\n }\n\n public addToRolePolicy(statement: iam.PolicyStatement): void {\n this._reference.addToRolePolicy(statement);\n }\n\n public configureAsyncInvoke(options: lambda.EventInvokeConfigOptions): void {\n this._reference.configureAsyncInvoke(options);\n }\n\n public grantInvoke(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvoke(grantee);\n }\n\n public grantInvokeCompositePrincipal(\n compositePrincipal: iam.CompositePrincipal,\n ): iam.Grant[] {\n return this._reference.grantInvokeCompositePrincipal(compositePrincipal);\n }\n\n public grantInvokeUrl(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvokeUrl(grantee);\n }\n\n public grantInvokeLatestVersion(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvokeLatestVersion(grantee);\n }\n\n public grantInvokeVersion(\n grantee: iam.IGrantable,\n version: lambda.IVersion,\n ): iam.Grant {\n return this._reference.grantInvokeVersion(grantee, version);\n }\n\n public metric(\n metricName: string,\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._reference.metric(metricName, props);\n }\n\n public metricDuration(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricDuration(props);\n }\n\n public metricErrors(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricErrors(props);\n }\n\n public metricInvocations(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._reference.metricInvocations(props);\n }\n\n public metricThrottles(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricThrottles(props);\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this._reference.stack;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._reference.applyRemovalPolicy(policy);\n }\n\n public addEnvironment(key: string, value: string): void {\n this._lambda.addEnvironment(key, value);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Tags, Stack, RemovalPolicy } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as sqs from \"aws-cdk-lib/aws-sqs\";\nimport { CDK } from \"./constants\";\nimport * as lambdaEventSources from \"aws-cdk-lib/aws-lambda-event-sources\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as cloudwatch from \"aws-cdk-lib/aws-cloudwatch\";\nimport * as kms from \"aws-cdk-lib/aws-kms\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\nexport interface JaypieQueuedLambdaProps extends JaypieLambdaProps {\n batchSize?: number;\n fifo?: boolean;\n visibilityTimeout?: Duration | number;\n}\n\nexport class JaypieQueuedLambda\n extends Construct\n implements lambda.IFunction, sqs.IQueue\n{\n private readonly _queue: sqs.Queue;\n private readonly _lambdaConstruct: JaypieLambda;\n\n constructor(scope: Construct, id: string, props: JaypieQueuedLambdaProps) {\n super(scope, id);\n\n const {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n batchSize = 1,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment = {},\n envSecrets = {},\n ephemeralStorageSize,\n fifo = true,\n filesystem,\n handler = \"index.handler\",\n initialPolicy,\n layers = [],\n logGroup,\n logRetention = CDK.LAMBDA.LOG_RETENTION,\n maxEventAge,\n memorySize = CDK.LAMBDA.MEMORY_SIZE,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag,\n runtime = new lambda.Runtime(\"nodejs24.x\", lambda.RuntimeFamily.NODEJS, {\n supportsInlineCode: true,\n }),\n runtimeManagementMode,\n secrets = [],\n securityGroups,\n timeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n tracing,\n vendorTag,\n visibilityTimeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n vpc,\n vpcSubnets,\n } = props;\n\n // Create SQS Queue\n this._queue = new sqs.Queue(this, \"Queue\", {\n fifo,\n visibilityTimeout:\n typeof visibilityTimeout === \"number\"\n ? Duration.seconds(visibilityTimeout)\n : visibilityTimeout,\n });\n if (roleTag) {\n Tags.of(this._queue).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._queue).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Create Lambda with JaypieLambda\n this._lambdaConstruct = new JaypieLambda(this, \"Function\", {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment: {\n ...environment,\n CDK_ENV_QUEUE_URL: this._queue.queueUrl,\n },\n envSecrets,\n ephemeralStorageSize,\n filesystem,\n handler,\n initialPolicy,\n layers,\n logGroup,\n logRetention,\n maxEventAge,\n memorySize,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag,\n runtime,\n runtimeManagementMode,\n secrets,\n securityGroups,\n timeout,\n tracing,\n vendorTag,\n vpc,\n vpcSubnets,\n });\n\n // Set up queue and lambda integration\n this._queue.grantConsumeMessages(this._lambdaConstruct);\n this._queue.grantSendMessages(this._lambdaConstruct);\n this._lambdaConstruct.addEventSource(\n new lambdaEventSources.SqsEventSource(this._queue, {\n batchSize,\n }),\n );\n }\n\n // Public accessors\n public get queue(): sqs.Queue {\n return this._queue;\n }\n\n public get lambda(): lambda.Function {\n return this._lambdaConstruct.lambda;\n }\n\n // IFunction implementation\n public get functionArn(): string {\n return this._lambdaConstruct.functionArn;\n }\n\n public get functionName(): string {\n return this._lambdaConstruct.functionName;\n }\n\n public get grantPrincipal(): import(\"aws-cdk-lib/aws-iam\").IPrincipal {\n return this._lambdaConstruct.grantPrincipal;\n }\n\n public get role(): import(\"aws-cdk-lib/aws-iam\").IRole | undefined {\n return this._lambdaConstruct.role;\n }\n\n public get architecture(): lambda.Architecture {\n return this._lambdaConstruct.architecture;\n }\n\n public get connections(): import(\"aws-cdk-lib/aws-ec2\").Connections {\n return this._lambdaConstruct.connections;\n }\n\n public get isBoundToVpc(): boolean {\n return this._lambdaConstruct.isBoundToVpc;\n }\n\n public get latestVersion(): lambda.IVersion {\n return this._lambdaConstruct.latestVersion;\n }\n\n public get permissionsNode(): import(\"constructs\").Node {\n return this._lambdaConstruct.permissionsNode;\n }\n\n public get resourceArnsForGrantInvoke(): string[] {\n return this._lambdaConstruct.resourceArnsForGrantInvoke;\n }\n\n public get functionRef(): lambda.FunctionReference {\n return this._lambdaConstruct.functionRef;\n }\n\n public addEventSource(source: lambda.IEventSource): void {\n this._lambdaConstruct.addEventSource(source);\n }\n\n public addEventSourceMapping(\n id: string,\n options: lambda.EventSourceMappingOptions,\n ): lambda.EventSourceMapping {\n return this._lambdaConstruct.addEventSourceMapping(id, options);\n }\n\n public addFunctionUrl(\n options?: lambda.FunctionUrlOptions,\n ): lambda.FunctionUrl {\n return this._lambdaConstruct.addFunctionUrl(options);\n }\n\n public addPermission(id: string, permission: lambda.Permission): void {\n this._lambdaConstruct.addPermission(id, permission);\n }\n\n public addToRolePolicy(\n statement: import(\"aws-cdk-lib/aws-iam\").PolicyStatement,\n ): void {\n this._lambdaConstruct.addToRolePolicy(statement);\n }\n\n public configureAsyncInvoke(options: lambda.EventInvokeConfigOptions): void {\n this._lambdaConstruct.configureAsyncInvoke(options);\n }\n\n public grantInvoke(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._lambdaConstruct.grantInvoke(grantee);\n }\n\n public grantInvokeCompositePrincipal(\n compositePrincipal: import(\"aws-cdk-lib/aws-iam\").CompositePrincipal,\n ): import(\"aws-cdk-lib/aws-iam\").Grant[] {\n return this._lambdaConstruct.grantInvokeCompositePrincipal(\n compositePrincipal,\n );\n }\n\n public grantInvokeUrl(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._lambdaConstruct.grantInvokeUrl(grantee);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metric(metricName, props);\n }\n\n public metricDuration(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricDuration(props);\n }\n\n public metricErrors(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricErrors(props);\n }\n\n public metricInvocations(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricInvocations(props);\n }\n\n public metricThrottles(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricThrottles(props);\n }\n\n // Additional IFunction implementation\n public grantInvokeLatestVersion(grantee: iam.IGrantable): iam.Grant {\n return this._lambdaConstruct.grantInvokeLatestVersion(grantee);\n }\n\n public grantInvokeVersion(\n grantee: iam.IGrantable,\n version: lambda.Version,\n ): iam.Grant {\n return this._lambdaConstruct.grantInvokeVersion(grantee, version);\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._lambdaConstruct.applyRemovalPolicy(policy);\n this._queue.applyRemovalPolicy(policy);\n }\n\n // IQueue implementation\n public get queueRef() {\n return {\n queueUrl: this._queue.queueUrl,\n queueArn: this._queue.queueArn,\n };\n }\n\n public get fifo(): boolean {\n return this._queue.fifo;\n }\n\n public get queueArn(): string {\n return this._queue.queueArn;\n }\n\n public get queueName(): string {\n return this._queue.queueName;\n }\n\n public get queueUrl(): string {\n return this._queue.queueUrl;\n }\n\n public get encryptionMasterKey(): kms.IKey | undefined {\n return this._queue.encryptionMasterKey;\n }\n\n public addToResourcePolicy(\n statement: iam.PolicyStatement,\n ): iam.AddToResourcePolicyResult {\n return this._queue.addToResourcePolicy(statement);\n }\n\n public grant(grantee: iam.IGrantable, ...actions: string[]): iam.Grant {\n return this._queue.grant(grantee, ...actions);\n }\n\n public grantConsumeMessages(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantConsumeMessages(grantee);\n }\n\n public grantPurge(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantPurge(grantee);\n }\n\n public grantSendMessages(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantSendMessages(grantee);\n }\n\n // Queue metrics\n public metricApproximateAgeOfOldestMessage(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateAgeOfOldestMessage(props);\n }\n\n public metricApproximateNumberOfMessagesDelayed(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesDelayed(props);\n }\n\n public metricApproximateNumberOfMessagesNotVisible(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesNotVisible(props);\n }\n\n public metricApproximateNumberOfMessagesVisible(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesVisible(props);\n }\n\n public metricNumberOfEmptyReceives(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfEmptyReceives(props);\n }\n\n public metricNumberOfMessagesDeleted(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesDeleted(props);\n }\n\n public metricNumberOfMessagesReceived(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesReceived(props);\n }\n\n public metricNumberOfMessagesSent(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesSent(props);\n }\n\n public metricSentMessageSize(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricSentMessageSize(props);\n }\n\n public addEnvironment(key: string, value: string): void {\n this._lambdaConstruct.addEnvironment(key, value);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Tags, RemovalPolicy } from \"aws-cdk-lib\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport * as s3n from \"aws-cdk-lib/aws-s3-notifications\";\nimport { CDK } from \"./constants\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport {\n JaypieQueuedLambda,\n JaypieQueuedLambdaProps,\n} from \"./JaypieQueuedLambda.js\";\n\nexport interface JaypieBucketQueuedLambdaProps extends JaypieQueuedLambdaProps {\n bucketName?: string;\n bucketOptions?: s3.BucketProps;\n}\n\nexport class JaypieBucketQueuedLambda\n extends JaypieQueuedLambda\n implements s3.IBucket\n{\n private readonly _bucket: s3.Bucket;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieBucketQueuedLambdaProps,\n ) {\n props.fifo = false; // S3 event notifications are not supported for FIFO queues\n super(scope, id, props);\n\n const { bucketName, roleTag, vendorTag, bucketOptions = {} } = props;\n\n // Create S3 Bucket\n this._bucket = new s3.Bucket(this, \"Bucket\", {\n bucketName: bucketOptions.bucketName || bucketName,\n removalPolicy: bucketOptions.removalPolicy || RemovalPolicy.RETAIN,\n ...bucketOptions,\n });\n\n // Add tags to bucket\n if (roleTag) {\n Tags.of(this._bucket).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._bucket).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Add an event notification from the bucket to the queue\n this._bucket.addEventNotification(\n s3.EventType.OBJECT_CREATED,\n new s3n.SqsDestination(this.queue),\n );\n\n // Grant the lambda access to the bucket\n this._bucket.grantReadWrite(this);\n\n // Add environment variable for bucket name\n this.lambda.addEnvironment(\"CDK_ENV_BUCKET_NAME\", this._bucket.bucketName);\n }\n\n // Public accessors\n public get bucket(): s3.Bucket {\n return this._bucket;\n }\n\n // IBucket implementation\n public get bucketArn(): string {\n return this._bucket.bucketArn;\n }\n\n public get bucketDomainName(): string {\n return this._bucket.bucketDomainName;\n }\n\n public get bucketDualStackDomainName(): string {\n return this._bucket.bucketDualStackDomainName;\n }\n\n public get bucketName(): string {\n return this._bucket.bucketName;\n }\n\n public get bucketRegionalDomainName(): string {\n return this._bucket.bucketRegionalDomainName;\n }\n\n public get bucketWebsiteDomainName(): string {\n return this._bucket.bucketWebsiteDomainName;\n }\n\n public get bucketWebsiteUrl(): string {\n return this._bucket.bucketWebsiteUrl;\n }\n\n public get encryptionKey(): undefined | import(\"aws-cdk-lib/aws-kms\").IKey {\n return this._bucket.encryptionKey;\n }\n\n public get isWebsite(): boolean {\n return this._bucket.isWebsite || false;\n }\n\n public get policy(): s3.BucketPolicy | undefined {\n return this._bucket.policy;\n }\n\n public addEventNotification(\n event: s3.EventType,\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addEventNotification(event, dest, ...filters);\n }\n\n public addObjectCreatedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addObjectCreatedNotification(dest, ...filters);\n }\n\n public addObjectRemovedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addObjectRemovedNotification(dest, ...filters);\n }\n\n public addToResourcePolicy(\n permission: iam.PolicyStatement,\n ): iam.AddToResourcePolicyResult {\n return this._bucket.addToResourcePolicy(permission);\n }\n\n public arnForObjects(objectKeyPattern: string): string {\n return this._bucket.arnForObjects(objectKeyPattern);\n }\n\n public enableEventBridgeNotification(): void {\n this._bucket.enableEventBridgeNotification();\n }\n\n public grantDelete(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantDelete(grantee, objectsKeyPattern);\n }\n\n public grantPublicAccess(\n keyPrefix?: string,\n ...allowedActions: string[]\n ): iam.Grant {\n return this._bucket.grantPublicAccess(keyPrefix, ...allowedActions);\n }\n\n public grantPut(grantee: iam.IGrantable, objectsKeyPattern?: any): iam.Grant {\n return this._bucket.grantPut(grantee, objectsKeyPattern);\n }\n\n public grantPutAcl(\n grantee: iam.IGrantable,\n objectsKeyPattern?: string,\n ): iam.Grant {\n return this._bucket.grantPutAcl(grantee, objectsKeyPattern);\n }\n\n public grantRead(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantRead(grantee, objectsKeyPattern);\n }\n\n public grantReadWrite(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantReadWrite(grantee, objectsKeyPattern);\n }\n\n public grantWrite(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantWrite(grantee, objectsKeyPattern);\n }\n\n public onCloudTrailEvent(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailEvent(id, options);\n }\n\n public onCloudTrailPutObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailPutObject(id, options);\n }\n\n public onCloudTrailWriteObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailWriteObject(id, options);\n }\n\n public s3UrlForObject(key?: string): string {\n return this._bucket.s3UrlForObject(key);\n }\n\n public transferAccelerationUrlForObject(\n key?: string,\n options?: s3.TransferAccelerationUrlOptions,\n ): string {\n return this._bucket.transferAccelerationUrlForObject(key, options);\n }\n\n public urlForObject(key?: string): string {\n return this._bucket.urlForObject(key);\n }\n\n public virtualHostedUrlForObject(\n key?: string,\n options?: s3.VirtualHostedStyleUrlOptions,\n ): string {\n return this._bucket.virtualHostedUrlForObject(key, options);\n }\n\n public grantReplicationPermission(\n identity: iam.IGrantable,\n props: any,\n ): iam.Grant {\n return this._bucket.grantReplicationPermission(identity, props);\n }\n\n public addReplicationPolicy(policy: any): void {\n this._bucket.addReplicationPolicy(policy);\n }\n\n public get bucketRef(): s3.BucketReference {\n return {\n bucketArn: this._bucket.bucketArn,\n bucketName: this._bucket.bucketName,\n };\n }\n\n // Override applyRemovalPolicy to apply to all resources\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n super.applyRemovalPolicy(policy);\n this._bucket.applyRemovalPolicy(policy);\n }\n}\n","import { CfnOutput, Fn, RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport {\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\n// Check if environment is a consumer (personal/ephemeral builds import from sandbox)\nfunction checkEnvIsConsumer(env = process.env): boolean {\n return (\n env.PROJECT_ENV === CDK.ENV.PERSONAL ||\n !!env.CDK_ENV_PERSONAL ||\n env.PROJECT_ENV === \"ephemeral\" ||\n !!env.CDK_ENV_EPHEMERAL\n );\n}\n\n// Check if environment is a provider (sandbox exports for consumers)\nfunction checkEnvIsProvider(env = process.env): boolean {\n return env.PROJECT_ENV === CDK.ENV.SANDBOX;\n}\n\n// Sanitize export name to only allow alphanumeric, colons, and hyphens\nfunction cleanName(name: string): string {\n return name.replace(/[^a-zA-Z0-9:-]/g, \"\");\n}\n\n// Generate export name based on environment\nfunction exportEnvName(name: string, env = process.env): string {\n const projectKey = env.PROJECT_KEY || \"default\";\n let rawName;\n if (checkEnvIsProvider(env)) {\n rawName = `env-${env.PROJECT_ENV}-${projectKey}-cert-${name}`;\n } else if (checkEnvIsConsumer(env)) {\n rawName = `env-${CDK.ENV.SANDBOX}-${projectKey}-cert-${name}`;\n } else {\n rawName = `env-${env.PROJECT_ENV || \"default\"}-${projectKey}-cert-${name}`;\n }\n return cleanName(rawName);\n}\n\n// Resolve domain name from props or environment (called before super)\nfunction resolveDomainNameFromProps(\n props?: JaypieCertificateProps,\n): string | undefined {\n if (props?.domainName) {\n return props.domainName;\n }\n if (process.env.CDK_ENV_API_HOST_NAME) {\n return process.env.CDK_ENV_API_HOST_NAME;\n }\n if (process.env.CDK_ENV_API_SUBDOMAIN) {\n return mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n return undefined;\n}\n\n// Sanitize domain for construct ID\nfunction sanitizeDomain(domain: string): string {\n return domain.replace(/\\./g, \"-\");\n}\n\nexport interface JaypieCertificateProps {\n /**\n * Import certificate from a provider stack instead of creating one.\n * When true, imports the certificate ARN via CloudFormation export.\n * @default false\n */\n consumer?: boolean;\n /**\n * The domain name for the certificate.\n * @default Derived from CDK_ENV_API_HOST_NAME or CDK_ENV_API_SUBDOMAIN + CDK_ENV_API_HOSTED_ZONE\n */\n domainName?: string;\n /**\n * Export name override for cross-stack sharing.\n * Only used when provider is true.\n * @default Generated from environment and domain\n */\n export?: string;\n /**\n * Construct ID override. When not provided, ID is auto-generated from domain.\n * Use this to align with certificates created by other constructs.\n * @default Auto-generated as \"JaypieCert-{sanitized-domain}\"\n */\n id?: string;\n /**\n * Export certificate ARN for other stacks to import.\n * When true, creates a CloudFormation export that consumer stacks can import.\n * @default false\n */\n provider?: boolean;\n /**\n * Role tag for tagging the certificate.\n * @default CDK.ROLE.API\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS validation.\n * @default CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone;\n}\n\n/**\n * A standalone certificate construct that can be shared across constructs.\n *\n * Key feature: Uses the same `resolveCertificate()` helper as JaypieDistribution,\n * JaypieApiGateway, etc. This means:\n * - Certificates are created at the stack level and cached by domain\n * - You can \"take over\" a certificate from another construct by using the same domain\n * - Swapping between JaypieDistribution and JaypieApiGateway won't recreate certs\n *\n * Supports flexible constructor signatures:\n * - `new JaypieCertificate(scope)` - uses environment defaults\n * - `new JaypieCertificate(scope, props)` - ID auto-generated from domain\n * - `new JaypieCertificate(scope, id, props)` - explicit ID\n *\n * @example\n * // Minimal - uses environment variables for domain/zone\n * const cert = new JaypieCertificate(this);\n *\n * @example\n * // With options - ID auto-generated as \"JaypieCert-api-example-com\"\n * const cert = new JaypieCertificate(this, {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Explicit ID - useful when you need a specific construct ID\n * const cert = new JaypieCertificate(this, \"MyApiCert\", {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Take over from JaypieDistribution (uses same ID format)\n * // After removing JaypieDistribution with certificate: true\n * const cert = new JaypieCertificate(this, {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Optional: Provider/consumer pattern for cross-stack sharing\n * // In sandbox stack (explicitly export):\n * new JaypieCertificate(this, { provider: true });\n *\n * // In personal build (explicitly import):\n * new JaypieCertificate(this, { consumer: true });\n */\nexport class JaypieCertificate extends Construct implements acm.ICertificate {\n public readonly certificate: acm.ICertificate;\n public readonly certificateArn: string;\n public readonly domainName: string;\n\n /**\n * Create a certificate with environment defaults.\n */\n constructor(scope: Construct);\n /**\n * Create a certificate with options (ID auto-generated from domain).\n */\n constructor(scope: Construct, props: JaypieCertificateProps);\n /**\n * Create a certificate with explicit ID.\n */\n constructor(scope: Construct, id: string, props?: JaypieCertificateProps);\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieCertificateProps,\n maybeProps?: JaypieCertificateProps,\n ) {\n // Resolve constructor arguments\n let id: string;\n let props: JaypieCertificateProps;\n\n if (typeof idOrProps === \"string\") {\n // (scope, id, props) pattern\n id = idOrProps;\n props = maybeProps || {};\n } else if (typeof idOrProps === \"object\" && idOrProps !== null) {\n // (scope, props) pattern - auto-generate id\n props = idOrProps;\n const domainName = resolveDomainNameFromProps(props);\n if (domainName) {\n // Use \"JaypieCert-\" prefix to avoid collision with internal certificate\n id = props.id || `JaypieCert-${sanitizeDomain(domainName)}`;\n } else {\n id = props.id || \"JaypieCert\";\n }\n } else {\n // (scope) pattern - no id, no props\n props = {};\n const domainName = resolveDomainNameFromProps(props);\n if (domainName) {\n id = `JaypieCert-${sanitizeDomain(domainName)}`;\n } else {\n id = \"JaypieCert\";\n }\n }\n\n super(scope, id);\n\n const {\n consumer = false,\n domainName: propsDomainName,\n export: exportParam,\n provider = false,\n roleTag = CDK.ROLE.API,\n zone: propsZone,\n } = props;\n\n // Validate environment variables\n if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_API_SUBDOMAIN)\n ) {\n throw new Error(\"CDK_ENV_API_SUBDOMAIN is not a valid subdomain\");\n }\n\n if (\n process.env.CDK_ENV_API_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_API_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_API_HOSTED_ZONE is not a valid hostname\");\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_HOSTED_ZONE is not a valid hostname\");\n }\n\n // Determine domain name from props or environment\n let domainName = propsDomainName;\n if (!domainName) {\n if (process.env.CDK_ENV_API_HOST_NAME) {\n domainName = process.env.CDK_ENV_API_HOST_NAME;\n } else if (process.env.CDK_ENV_API_SUBDOMAIN) {\n domainName = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n }\n\n if (!domainName) {\n throw new Error(\n \"domainName is required for JaypieCertificate (or set CDK_ENV_API_HOST_NAME / CDK_ENV_API_SUBDOMAIN)\",\n );\n }\n\n if (!isValidHostname(domainName)) {\n throw new Error(\"domainName is not a valid hostname\");\n }\n\n this.domainName = domainName;\n\n // Determine zone from props or environment\n const zone =\n propsZone ||\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE;\n\n // Generate export name\n const sanitizedDomain = domainName.replace(/\\./g, \"-\");\n const exportName = exportParam\n ? cleanName(exportParam)\n : exportEnvName(sanitizedDomain);\n\n if (consumer) {\n // Import certificate ARN from provider stack\n const certificateArn = Fn.importValue(exportName);\n this.certificate = acm.Certificate.fromCertificateArn(\n this,\n \"ImportedCertificate\",\n certificateArn,\n );\n this.certificateArn = certificateArn;\n\n new CfnOutput(this, \"ConsumedCertificateArn\", {\n value: this.certificateArn,\n });\n } else {\n // Create or get cached certificate at stack level\n if (!zone) {\n throw new Error(\n \"zone is required for JaypieCertificate when not consuming (or set CDK_ENV_API_HOSTED_ZONE / CDK_ENV_HOSTED_ZONE)\",\n );\n }\n\n const hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create at stack level (enables sharing)\n const cert = resolveCertificate(this, {\n certificate: true,\n domainName,\n roleTag,\n zone: hostedZone,\n });\n\n if (!cert) {\n throw new Error(\"Failed to create certificate\");\n }\n\n this.certificate = cert;\n this.certificateArn = cert.certificateArn;\n\n if (provider) {\n new CfnOutput(this, \"ProvidedCertificateArn\", {\n value: this.certificateArn,\n exportName,\n });\n } else {\n new CfnOutput(this, \"CertificateArn\", {\n value: this.certificateArn,\n });\n }\n }\n }\n\n // IResource implementation\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public get env(): { account: string; region: string } {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this.certificate.applyRemovalPolicy(policy);\n }\n\n // ICertificate implementation\n public get certificateRef(): acm.CertificateReference {\n return this.certificate.certificateRef;\n }\n\n public metricDaysToExpiry(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this.certificate.metricDaysToExpiry(props);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Policy, PolicyStatement, Role } from \"aws-cdk-lib/aws-iam\";\nimport { Bucket, BucketProps, IBucket } from \"aws-cdk-lib/aws-s3\";\nimport { Construct } from \"constructs\";\n\nexport interface JaypieDatadogBucketProps extends BucketProps {\n /**\n * Optional construct ID\n * @default \"JaypieDatadogBucket\"\n */\n id?: string;\n\n /**\n * The scope to use when creating the S3 bucket\n * @default this (the construct itself)\n */\n bucketScope?: Construct;\n\n /**\n * The ID to use for the S3 bucket construct\n * @default \"DatadogArchiveBucket\"\n */\n bucketId?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to grant Datadog role access to this bucket\n * Uses CDK_ENV_DATADOG_ROLE_ARN if set\n * @default true\n */\n grantDatadogAccess?: boolean;\n}\n\nexport class JaypieDatadogBucket extends Construct {\n public readonly bucket: IBucket;\n public readonly policy?: Policy;\n\n /**\n * Create a new S3 bucket for Datadog log archiving with automatic IAM permissions\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieDatadogBucketProps,\n propsOrUndefined?: JaypieDatadogBucketProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieDatadogBucketProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"JaypieDatadogBucket\";\n }\n\n super(scope, id);\n\n // Extract Jaypie-specific options\n\n const {\n bucketId = \"DatadogArchiveBucket\",\n bucketScope,\n grantDatadogAccess = true,\n project,\n service = CDK.SERVICE.DATADOG,\n ...bucketProps\n } = props;\n\n // Create the bucket using bucketScope (defaults to this) and bucketId\n const effectiveBucketScope = bucketScope || this;\n this.bucket = new Bucket(effectiveBucketScope, bucketId, bucketProps);\n\n // Add tags to bucket\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Grant Datadog role access to bucket if enabled\n if (grantDatadogAccess) {\n this.policy = this.grantDatadogRoleBucketAccess({ project, service });\n }\n }\n\n /**\n * Grants the Datadog IAM role access to this bucket\n *\n * Checks for CDK_ENV_DATADOG_ROLE_ARN environment variable.\n * If found, creates a custom policy with:\n * - s3:ListBucket on bucket\n * - s3:GetObject and s3:PutObject on bucket/*\n *\n * @param options - Configuration options\n * @returns The created Policy, or undefined if CDK_ENV_DATADOG_ROLE_ARN is not set\n */\n private grantDatadogRoleBucketAccess(options?: {\n project?: string;\n service?: string;\n }): Policy | undefined {\n const datadogRoleArn = process.env.CDK_ENV_DATADOG_ROLE_ARN;\n\n // Early return if no Datadog role ARN is configured\n if (!datadogRoleArn) {\n return undefined;\n }\n\n const { project, service = CDK.SERVICE.DATADOG } = options || {};\n\n // Lookup the Datadog role\n const datadogRole = Role.fromRoleArn(this, \"DatadogRole\", datadogRoleArn);\n\n // Build policy statements for bucket access\n const statements: PolicyStatement[] = [\n // Allow list bucket\n new PolicyStatement({\n actions: [\"s3:ListBucket\"],\n resources: [this.bucket.bucketArn],\n }),\n // Allow read and write to the bucket\n new PolicyStatement({\n actions: [\"s3:GetObject\", \"s3:PutObject\"],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n ];\n\n // Create the custom policy\n const datadogBucketPolicy = new Policy(this, \"DatadogBucketPolicy\", {\n roles: [datadogRole],\n statements,\n });\n\n // Add tags\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.PROJECT, project);\n }\n\n return datadogBucketPolicy;\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { CfnStack } from \"aws-cdk-lib\";\nimport { Rule, RuleTargetInput } from \"aws-cdk-lib/aws-events\";\nimport { LambdaFunction } from \"aws-cdk-lib/aws-events-targets\";\nimport { IFunction } from \"aws-cdk-lib/aws-lambda\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nimport { extendDatadogRole } from \"./helpers/extendDatadogRole\";\n\nconst DATADOG_FORWARDER_TEMPLATE_URL =\n \"https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml\";\nconst DEFAULT_RESERVED_CONCURRENCY = \"10\";\n\nexport interface JaypieDatadogForwarderProps {\n /**\n * Optional construct ID\n * @default \"DatadogForwarder\"\n */\n id?: string;\n\n /**\n * Datadog API key\n * @default process.env.CDK_ENV_DATADOG_API_KEY\n */\n datadogApiKey?: string;\n\n /**\n * Account identifier for Datadog tags\n * @default process.env.CDK_ENV_ACCOUNT\n */\n account?: string;\n\n /**\n * Reserved concurrency for the forwarder Lambda\n * Must be a string as required by the CloudFormation template\n * @default \"10\"\n */\n reservedConcurrency?: string;\n\n /**\n * Additional Datadog tags (comma-separated)\n * Will be appended to account tag\n */\n additionalTags?: string;\n\n /**\n * The service tag value\n * @default CDK.VENDOR.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to create CloudFormation events rule\n * @default true\n */\n enableCloudFormationEvents?: boolean;\n\n /**\n * Whether to extend Datadog role with custom permissions\n * Uses CDK_ENV_DATADOG_ROLE_ARN if set\n * @default true\n */\n enableRoleExtension?: boolean;\n\n /**\n * Whether to create CloudFormation output for forwarder ARN\n * @default true\n */\n createOutput?: boolean;\n\n /**\n * Custom export name for the forwarder ARN output\n * @default CDK.IMPORT.DATADOG_LOG_FORWARDER\n */\n exportName?: string;\n\n /**\n * URL to Datadog forwarder CloudFormation template\n * @default \"https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml\"\n */\n templateUrl?: string;\n}\n\nexport class JaypieDatadogForwarder extends Construct {\n public readonly cfnStack: CfnStack;\n public readonly forwarderFunction: IFunction;\n public readonly eventsRule?: Rule;\n\n /**\n * Create a new Datadog forwarder with CloudFormation nested stack\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieDatadogForwarderProps,\n propsOrUndefined?: JaypieDatadogForwarderProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieDatadogForwarderProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"DatadogForwarder\";\n }\n\n super(scope, id);\n\n // Resolve options with defaults\n const {\n account = process.env.CDK_ENV_ACCOUNT,\n additionalTags,\n createOutput = true,\n datadogApiKey = process.env.CDK_ENV_DATADOG_API_KEY,\n enableCloudFormationEvents = true,\n enableRoleExtension = true,\n exportName = CDK.IMPORT.DATADOG_LOG_FORWARDER,\n project,\n reservedConcurrency = DEFAULT_RESERVED_CONCURRENCY,\n service = CDK.VENDOR.DATADOG,\n templateUrl = DATADOG_FORWARDER_TEMPLATE_URL,\n } = props;\n\n // Validate required parameters\n if (!datadogApiKey) {\n throw new Error(\n \"Datadog API key is required. Provide via datadogApiKey prop or CDK_ENV_DATADOG_API_KEY environment variable.\",\n );\n }\n\n // Build Datadog tags\n let ddTags = account ? `account:${account}` : \"\";\n if (additionalTags) {\n ddTags = ddTags ? `${ddTags},${additionalTags}` : additionalTags;\n }\n\n // Deploy Datadog CloudFormation stack\n this.cfnStack = new CfnStack(this, \"Stack\", {\n parameters: {\n DdApiKey: datadogApiKey,\n DdTags: ddTags,\n ReservedConcurrency: reservedConcurrency,\n },\n templateUrl,\n });\n\n // Add tags to stack\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.PROJECT, project);\n }\n\n // Extract forwarder function from stack outputs\n this.forwarderFunction = lambda.Function.fromFunctionArn(\n this,\n \"Function\",\n this.cfnStack.getAtt(\"Outputs.DatadogForwarderArn\").toString(),\n );\n\n // Extend Datadog role with custom permissions if enabled\n if (enableRoleExtension) {\n extendDatadogRole(this, { project, service });\n }\n\n // Create CloudFormation events rule if enabled\n if (enableCloudFormationEvents) {\n this.eventsRule = new Rule(this, \"CloudFormationEventsRule\", {\n eventPattern: {\n source: [\"aws.cloudformation\"],\n },\n targets: [\n new LambdaFunction(this.forwarderFunction, {\n event: RuleTargetInput.fromEventPath(\"$\"),\n }),\n ],\n });\n\n // Add tags to events rule\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.PROJECT, project);\n }\n }\n\n // Create CloudFormation output if enabled\n if (createOutput) {\n new cdk.CfnOutput(this, \"ForwarderArnOutput\", {\n description: \"Datadog Log Forwarder Lambda ARN\",\n exportName,\n value: this.cfnStack.getAtt(\"Outputs.DatadogForwarderArn\").toString(),\n });\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieDatadogSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"MongoConnectionString\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"DATADOG_API_KEY\",\n roleTag: CDK.ROLE.MONITORING,\n vendorTag: CDK.VENDOR.DATADOG,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { Duration, Fn, RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as cloudfront from \"aws-cdk-lib/aws-cloudfront\";\nimport * as origins from \"aws-cdk-lib/aws-cloudfront-origins\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-s3-notifications\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieDistributionProps extends Omit<\n cloudfront.DistributionProps,\n \"certificate\" | \"defaultBehavior\" | \"logBucket\"\n> {\n /**\n * SSL certificate for the CloudFront distribution\n * @default true (creates a new certificate)\n */\n certificate?: boolean | acm.ICertificate;\n /**\n * Override default behavior (optional if handler is provided)\n */\n defaultBehavior?: cloudfront.BehaviorOptions;\n /**\n * Log destination configuration for CloudFront access logs\n * - LambdaDestination: Use a specific Lambda destination for S3 notifications\n * - true: Use Datadog forwarder for S3 notifications (default)\n * - false: Disable S3 notifications (logging still occurs if logBucket is set)\n * @default true\n */\n destination?: LambdaDestination | boolean;\n /**\n * External log bucket for CloudFront access logs.\n * - IBucket: Use existing bucket directly\n * - string: Bucket name to import\n * - { exportName: string }: CloudFormation export name to import\n * - true: Use account logging bucket (CDK.IMPORT.LOG_BUCKET)\n * @default undefined (creates new bucket if destination !== false)\n */\n logBucket?: s3.IBucket | string | { exportName: string } | true;\n /**\n * The origin handler - can be an IOrigin, IFunctionUrl, or IFunction\n * If IFunction, a FunctionUrl will be created with auth NONE\n */\n handler?: cloudfront.IOrigin | lambda.IFunctionUrl | lambda.IFunction;\n /**\n * The domain name for the distribution.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"api.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @default mergeDomain(CDK_ENV_API_SUBDOMAIN, CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE)\n *\n * @example\n * // Direct string\n * host: \"api.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { subdomain: \"api\" }\n */\n host?: string | HostConfig;\n /**\n * Enable response streaming for Lambda Function URLs.\n * Use with createLambdaStreamHandler for SSE/streaming responses.\n * @default false\n */\n streaming?: boolean;\n /**\n * Origin read timeout - how long CloudFront waits for a response from the origin.\n * This is the maximum time allowed for the origin to respond.\n * @default CDK.DURATION.CLOUDFRONT_API (120 seconds)\n * @max Duration.seconds(120)\n */\n originReadTimeout?: Duration;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS records\n * @default CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone;\n}\n\nexport class JaypieDistribution\n extends Construct\n implements cloudfront.IDistribution\n{\n public readonly certificate?: acm.ICertificate;\n public readonly distribution: cloudfront.Distribution;\n public readonly distributionArn: string;\n public readonly distributionDomainName: string;\n public readonly distributionId: string;\n public readonly domainName: string;\n public readonly functionUrl?: lambda.FunctionUrl;\n public readonly host?: string;\n public readonly logBucket?: s3.IBucket;\n\n constructor(scope: Construct, id: string, props: JaypieDistributionProps) {\n super(scope, id);\n\n const {\n certificate: certificateProp = true,\n defaultBehavior: propsDefaultBehavior,\n destination: destinationProp = true,\n handler,\n host: propsHost,\n logBucket: logBucketProp,\n originReadTimeout = Duration.seconds(CDK.DURATION.CLOUDFRONT_API),\n roleTag = CDK.ROLE.API,\n streaming = false,\n zone: propsZone,\n ...distributionProps\n } = props;\n\n // Validate environment variables\n if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_API_SUBDOMAIN)\n ) {\n throw new Error(\"CDK_ENV_API_SUBDOMAIN is not a valid subdomain\");\n }\n\n if (\n process.env.CDK_ENV_API_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_API_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_API_HOSTED_ZONE is not a valid hostname\");\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_HOSTED_ZONE is not a valid hostname\");\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n try {\n host = envHostname(propsHost);\n } catch {\n host = undefined;\n }\n } else {\n try {\n if (process.env.CDK_ENV_API_HOST_NAME) {\n host = process.env.CDK_ENV_API_HOST_NAME;\n } else if (process.env.CDK_ENV_API_SUBDOMAIN) {\n host = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n } catch {\n host = undefined;\n }\n }\n\n if (host && !isValidHostname(host)) {\n throw new Error(\"Host is not a valid hostname\");\n }\n\n this.host = host;\n\n // Determine zone from props or environment\n const zone = propsZone || process.env.CDK_ENV_HOSTED_ZONE;\n\n // Resolve the origin from handler\n // Check order matters: IFunctionUrl before IOrigin (FunctionUrl also has bind method)\n // IFunction before IFunctionUrl (IFunction doesn't have functionUrlId)\n let origin: cloudfront.IOrigin | undefined;\n if (handler) {\n const resolvedInvokeMode = streaming\n ? lambda.InvokeMode.RESPONSE_STREAM\n : lambda.InvokeMode.BUFFERED;\n\n if (this.isIFunction(handler)) {\n // Create FunctionUrl for the Lambda function\n const functionUrl = new lambda.FunctionUrl(this, \"FunctionUrl\", {\n function: handler,\n authType: lambda.FunctionUrlAuthType.NONE,\n invokeMode: resolvedInvokeMode,\n });\n this.functionUrl = functionUrl;\n origin = new origins.FunctionUrlOrigin(functionUrl, {\n readTimeout: originReadTimeout,\n });\n } else if (this.isIFunctionUrl(handler)) {\n origin = new origins.FunctionUrlOrigin(handler, {\n readTimeout: originReadTimeout,\n });\n } else if (this.isIOrigin(handler)) {\n origin = handler;\n }\n }\n\n // Build default behavior\n let defaultBehavior: cloudfront.BehaviorOptions;\n if (propsDefaultBehavior) {\n defaultBehavior = propsDefaultBehavior;\n } else if (origin) {\n defaultBehavior = {\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n origin,\n originRequestPolicy:\n cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,\n viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n };\n } else {\n throw new Error(\n \"Either handler or defaultBehavior must be provided to JaypieDistribution\",\n );\n }\n\n // Resolve hosted zone and certificate\n // Only resolve zone when we need it (for certificate or DNS)\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone && certificateProp !== false) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n certificateToUse = resolveCertificate(this, {\n certificate: certificateProp,\n domainName: host,\n roleTag,\n zone: hostedZone,\n });\n\n this.certificate = certificateToUse;\n }\n\n // Resolve or create log bucket\n let logBucket: s3.IBucket | undefined;\n const isExternalBucket = logBucketProp !== undefined;\n\n if (logBucketProp !== undefined) {\n // Use external bucket\n logBucket = this.resolveLogBucket(logBucketProp);\n } else if (destinationProp !== false) {\n // Create new bucket (original behavior)\n const createdBucket = new s3.Bucket(this, constructEnvName(\"LogBucket\"), {\n autoDeleteObjects: true,\n lifecycleRules: [\n {\n expiration: Duration.days(90),\n transitions: [\n {\n storageClass: s3.StorageClass.INFREQUENT_ACCESS,\n transitionAfter: Duration.days(30),\n },\n ],\n },\n ],\n objectOwnership: s3.ObjectOwnership.OBJECT_WRITER,\n removalPolicy: RemovalPolicy.DESTROY,\n });\n Tags.of(createdBucket).add(CDK.TAG.ROLE, CDK.ROLE.STORAGE);\n logBucket = createdBucket;\n }\n\n // Add S3 notifications if we have a bucket and destination is not false\n if (logBucket && destinationProp !== false && !isExternalBucket) {\n // Only add notifications to buckets we created (not external buckets)\n const lambdaDestination =\n destinationProp === true\n ? new LambdaDestination(resolveDatadogForwarderFunction(this))\n : destinationProp;\n\n (logBucket as s3.Bucket).addEventNotification(\n s3.EventType.OBJECT_CREATED,\n lambdaDestination,\n );\n }\n\n this.logBucket = logBucket;\n\n // Create the CloudFront distribution\n this.distribution = new cloudfront.Distribution(\n this,\n constructEnvName(\"Distribution\"),\n {\n defaultBehavior,\n ...(host && certificateToUse\n ? {\n certificate: certificateToUse,\n domainNames: [host],\n }\n : {}),\n ...(logBucket\n ? {\n enableLogging: true,\n logBucket,\n logFilePrefix: \"cloudfront-logs/\",\n }\n : {}),\n ...distributionProps,\n },\n );\n Tags.of(this.distribution).add(CDK.TAG.ROLE, roleTag);\n\n this.distributionArn = `arn:aws:cloudfront::${Stack.of(this).account}:distribution/${this.distribution.distributionId}`;\n this.distributionDomainName = this.distribution.distributionDomainName;\n this.distributionId = this.distribution.distributionId;\n this.domainName = this.distribution.domainName;\n\n // Create DNS records if we have host and zone\n if (host && hostedZone) {\n const aRecord = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(aRecord).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n\n const aaaaRecord = new route53.AaaaRecord(this, \"AaaaAliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(aaaaRecord).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n }\n\n // Type guards for handler types\n private isIOrigin(handler: unknown): handler is cloudfront.IOrigin {\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"bind\" in handler &&\n typeof (handler as cloudfront.IOrigin).bind === \"function\"\n );\n }\n\n private isIFunctionUrl(handler: unknown): handler is lambda.IFunctionUrl {\n // FunctionUrl has 'url' property which is the function URL string\n // IFunction does not have 'url' property\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"url\" in handler &&\n \"functionArn\" in handler\n );\n }\n\n private isIFunction(handler: unknown): handler is lambda.IFunction {\n // IFunction has functionArn and functionName but NOT 'url'\n // (FunctionUrl also has functionArn but also has 'url')\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"functionArn\" in handler &&\n \"functionName\" in handler &&\n !(\"url\" in handler)\n );\n }\n\n private isExportNameObject(value: unknown): value is { exportName: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"exportName\" in value &&\n typeof (value as { exportName: string }).exportName === \"string\"\n );\n }\n\n private resolveLogBucket(\n logBucketProp: s3.IBucket | string | { exportName: string } | true,\n ): s3.IBucket {\n // true = use account logging bucket\n if (logBucketProp === true) {\n const bucketName = Fn.importValue(CDK.IMPORT.LOG_BUCKET);\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", bucketName);\n }\n\n // { exportName: string } = import from CloudFormation export\n if (this.isExportNameObject(logBucketProp)) {\n const bucketName = Fn.importValue(logBucketProp.exportName);\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", bucketName);\n }\n\n // string = bucket name\n if (typeof logBucketProp === \"string\") {\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", logBucketProp);\n }\n\n // IBucket = use directly\n return logBucketProp;\n }\n\n // Implement IDistribution interface\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this.distribution.stack;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this.distribution.applyRemovalPolicy(policy);\n }\n\n public grant(\n identity: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this.distribution.grant(identity, ...actions);\n }\n\n public grantCreateInvalidation(\n identity: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this.distribution.grantCreateInvalidation(identity);\n }\n\n public get distributionRef(): cloudfront.DistributionReference {\n return {\n distributionId: this.distribution.distributionId,\n };\n }\n}\n","import * as cdk from \"aws-cdk-lib\";\nimport {\n ARecord,\n CnameRecord,\n IHostedZone,\n MxRecord,\n NsRecord,\n RecordTarget,\n TxtRecord,\n} from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\nimport { resolveHostedZone } from \"./helpers/resolveHostedZone\";\n\nexport interface JaypieDnsRecordProps {\n /**\n * Optional comment to add to the DNS record\n */\n comment?: string;\n /**\n * Optional record name (subdomain). If not provided, creates record at zone apex\n */\n recordName?: string;\n /**\n * Time to live for the DNS record\n * @default CDK.DNS.CONFIG.TTL (5 minutes)\n */\n ttl?: cdk.Duration;\n /**\n * The DNS record type (A, CNAME, MX, NS, TXT)\n */\n type: string;\n /**\n * Values for the DNS record. Format depends on record type:\n * - A: Array of IPv4 addresses (e.g., [\"1.2.3.4\", \"5.6.7.8\"])\n * - CNAME: Single domain name as first element (e.g., [\"example.com\"])\n * - MX: Array of objects with priority and hostName (e.g., [{priority: 10, hostName: \"mail.example.com\"}])\n * - NS: Array of name server addresses (e.g., [\"ns1.example.com\", \"ns2.example.com\"])\n * - TXT: Array of text values (e.g., [\"v=spf1 include:example.com ~all\"])\n */\n values: string[] | Array<{ hostName: string; priority: number }>;\n /**\n * The hosted zone where the record will be created.\n * Can be either:\n * - A string (zone name) - will lookup the hosted zone by domain name\n * - An IHostedZone object - will use the provided zone directly\n */\n zone: string | IHostedZone;\n}\n\nexport class JaypieDnsRecord extends Construct {\n public readonly record:\n | ARecord\n | CnameRecord\n | MxRecord\n | NsRecord\n | TxtRecord;\n\n constructor(scope: Construct, id: string, props: JaypieDnsRecordProps) {\n super(scope, id);\n\n const { comment, recordName, type, values } = props;\n const ttl = props.ttl || cdk.Duration.seconds(CDK.DNS.CONFIG.TTL);\n\n // Resolve the hosted zone (supports both string and IHostedZone)\n const zone = resolveHostedZone(scope, {\n name: `${id}HostedZone`,\n zone: props.zone,\n });\n\n // Common properties for all record types\n const baseProps = {\n comment,\n recordName,\n ttl,\n zone,\n };\n\n // Create the appropriate record based on type\n switch (type) {\n case CDK.DNS.RECORD.A: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"A record requires at least one IP address\",\n );\n }\n this.record = new ARecord(this, \"Record\", {\n ...baseProps,\n target: RecordTarget.fromIpAddresses(...(values as string[])),\n });\n break;\n }\n\n case CDK.DNS.RECORD.CNAME: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\"CNAME record requires a domain name\");\n }\n this.record = new CnameRecord(this, \"Record\", {\n ...baseProps,\n domainName: (values as string[])[0],\n });\n break;\n }\n\n case CDK.DNS.RECORD.MX: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"MX record requires at least one mail server\",\n );\n }\n this.record = new MxRecord(this, \"Record\", {\n ...baseProps,\n values: values as Array<{ hostName: string; priority: number }>,\n });\n break;\n }\n\n case CDK.DNS.RECORD.NS: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"NS record requires at least one name server\",\n );\n }\n this.record = new NsRecord(this, \"Record\", {\n ...baseProps,\n values: values as string[],\n });\n break;\n }\n\n case CDK.DNS.RECORD.TXT: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"TXT record requires at least one value\",\n );\n }\n this.record = new TxtRecord(this, \"Record\", {\n ...baseProps,\n values: values as string[],\n });\n break;\n }\n\n default:\n throw new ConfigurationError(\n `Unsupported DNS record type: ${type}. Supported types: A, CNAME, MX, NS, TXT`,\n );\n }\n\n // Add standard tags to the DNS record\n cdk.Tags.of(this.record).add(CDK.TAG.SERVICE, CDK.SERVICE.INFRASTRUCTURE);\n cdk.Tags.of(this.record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n}\n","import { Construct } from \"constructs\";\nimport { RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\n\nimport {\n DEFAULT_INDEXES,\n DEFAULT_SORT_KEY,\n generateIndexName,\n type IndexDefinition,\n} from \"@jaypie/fabric\";\n\nimport { CDK } from \"./constants\";\nimport { isProductionEnv } from \"./helpers/isEnv\";\n\n//\n//\n// Constants\n//\n\n/** Composite key separator used in GSI partition keys */\nconst SEPARATOR = \"#\";\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Convert IndexDefinition[] from @jaypie/fabric to CDK GlobalSecondaryIndexPropsV2[]\n *\n * @param indexes - Array of IndexDefinition from @jaypie/fabric\n * @returns Array of CDK GlobalSecondaryIndexPropsV2\n */\nfunction indexesToGsi(\n indexes: IndexDefinition[],\n): dynamodb.GlobalSecondaryIndexPropsV2[] {\n return indexes.map((index) => {\n // Generate index name from pk fields if not provided\n const indexName = index.name ?? generateIndexName(index.pk);\n\n // Sort key defaults to [\"sequence\"] if not provided\n const skFields = index.sk ?? DEFAULT_SORT_KEY;\n\n return {\n indexName,\n partitionKey: {\n name: indexName,\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.ALL,\n sortKey:\n skFields.length === 1 && skFields[0] === \"sequence\"\n ? { name: \"sequence\", type: dynamodb.AttributeType.NUMBER }\n : {\n name: skFields.join(SEPARATOR),\n type: dynamodb.AttributeType.STRING,\n },\n };\n });\n}\n\n//\n//\n// Types\n//\n\nexport interface JaypieDynamoDbProps extends Omit<\n dynamodb.TablePropsV2,\n \"globalSecondaryIndexes\" | \"partitionKey\" | \"sortKey\"\n> {\n /**\n * Configure GSIs for the table using @jaypie/fabric IndexDefinition format.\n * - `undefined`: No GSIs (default)\n * - Array of IndexDefinition: Use the specified indexes\n *\n * Use `JaypieDynamoDb.DEFAULT_INDEXES` for the standard Jaypie GSIs.\n *\n * @example\n * // No GSIs (default)\n * new JaypieDynamoDb(this, \"myTable\");\n *\n * @example\n * // With default Jaypie indexes\n * new JaypieDynamoDb(this, \"myTable\", {\n * indexes: JaypieDynamoDb.DEFAULT_INDEXES,\n * });\n *\n * @example\n * // With custom indexes\n * new JaypieDynamoDb(this, \"myTable\", {\n * indexes: [\n * { pk: [\"scope\", \"model\"], sk: [\"sequence\"] },\n * { pk: [\"scope\", \"model\", \"type\"], sk: [\"sequence\"], sparse: true },\n * ],\n * });\n */\n indexes?: IndexDefinition[];\n /**\n * Partition key attribute definition.\n * @default { name: \"model\", type: AttributeType.STRING }\n */\n partitionKey?: dynamodb.Attribute;\n /**\n * Optional project identifier for tagging\n */\n project?: string;\n /**\n * Optional role tag for the table\n */\n roleTag?: string;\n /**\n * Optional service identifier for tagging\n */\n service?: string;\n /**\n * Sort key attribute definition.\n * @default { name: \"id\", type: AttributeType.STRING }\n */\n sortKey?: dynamodb.Attribute;\n /**\n * Optional vendor tag for the table\n */\n vendorTag?: string;\n}\n\n//\n//\n// Main\n//\n\n/**\n * DynamoDB table with Jaypie single-table design patterns.\n *\n * Creates a table with:\n * - Partition key: `model` (String)\n * - Sort key: `id` (String)\n * - Billing: PAY_PER_REQUEST (on-demand)\n * - Removal policy: RETAIN in production, DESTROY otherwise\n * - No GSIs by default (use `indexes` prop to add them)\n * - Table name: CDK-generated (includes stack name and unique suffix)\n *\n * @example\n * // Shorthand: construct id is \"JaypieDynamoDb-myApp\", table name is CDK-generated\n * const table = new JaypieDynamoDb(this, \"myApp\");\n *\n * @example\n * // With default Jaypie indexes\n * const table = new JaypieDynamoDb(this, \"myApp\", {\n * indexes: JaypieDynamoDb.DEFAULT_INDEXES,\n * });\n *\n * @example\n * // With explicit table name (overrides CDK-generated name)\n * const table = new JaypieDynamoDb(this, \"MyTable\", {\n * tableName: \"custom-table-name\",\n * indexes: [\n * { pk: [\"scope\", \"model\"] },\n * { pk: [\"scope\", \"model\", \"type\"], sparse: true },\n * ],\n * });\n */\nexport class JaypieDynamoDb extends Construct implements dynamodb.ITableV2 {\n /**\n * Default Jaypie GSI definitions from @jaypie/fabric.\n * Pass to `indexes` prop to create all standard GSIs.\n */\n public static readonly DEFAULT_INDEXES = DEFAULT_INDEXES;\n\n private readonly _table: dynamodb.TableV2;\n\n constructor(scope: Construct, id: string, props: JaypieDynamoDbProps = {}) {\n // Determine if this is shorthand usage: new JaypieDynamoDb(this, \"myApp\")\n // In shorthand, construct id is prefixed for clarity; tableName left undefined\n // so CDK generates it with stack prefix (e.g., cdk-sponsor-project-env-nonce-app-JaypieDynamoDb-myApp-Table-XXXXX)\n const isShorthand = !props.tableName && !id.includes(\"-\");\n const constructId = isShorthand ? `JaypieDynamoDb-${id}` : id;\n\n super(scope, constructId);\n\n const {\n billing = dynamodb.Billing.onDemand(),\n indexes,\n partitionKey = {\n name: \"model\",\n type: dynamodb.AttributeType.STRING,\n },\n project,\n removalPolicy = isProductionEnv()\n ? RemovalPolicy.RETAIN\n : RemovalPolicy.DESTROY,\n roleTag = CDK.ROLE.STORAGE,\n service,\n sortKey = { name: \"id\", type: dynamodb.AttributeType.STRING },\n vendorTag,\n ...restProps\n } = props;\n\n // Convert IndexDefinition[] to CDK GSI props\n const globalSecondaryIndexes = indexes ? indexesToGsi(indexes) : undefined;\n\n this._table = new dynamodb.TableV2(this, \"Table\", {\n billing,\n globalSecondaryIndexes,\n partitionKey,\n removalPolicy,\n sortKey,\n ...restProps,\n });\n\n // Apply tags\n if (project) {\n Tags.of(this._table).add(CDK.TAG.PROJECT, project);\n }\n Tags.of(this._table).add(CDK.TAG.ROLE, roleTag);\n if (service) {\n Tags.of(this._table).add(CDK.TAG.SERVICE, service);\n }\n if (vendorTag) {\n Tags.of(this._table).add(CDK.TAG.VENDOR, vendorTag);\n }\n }\n\n //\n //\n // Public accessors\n //\n\n /**\n * The underlying DynamoDB TableV2 construct\n */\n public get table(): dynamodb.TableV2 {\n return this._table;\n }\n\n //\n //\n // ITableV2 implementation\n //\n\n public get env() {\n return this._table.env;\n }\n\n public get stack() {\n return this._table.stack;\n }\n\n public get tableArn(): string {\n return this._table.tableArn;\n }\n\n public get tableId(): string | undefined {\n return this._table.tableId;\n }\n\n public get tableName(): string {\n return this._table.tableName;\n }\n\n public get tableRef(): dynamodb.TableReference {\n return this._table.tableRef;\n }\n\n public get tableStreamArn(): string | undefined {\n return this._table.tableStreamArn;\n }\n\n public get encryptionKey(): import(\"aws-cdk-lib/aws-kms\").IKey | undefined {\n return this._table.encryptionKey;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._table.applyRemovalPolicy(policy);\n }\n\n public grant(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grant(grantee, ...actions);\n }\n\n public grantFullAccess(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantFullAccess(grantee);\n }\n\n public grantReadData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantReadData(grantee);\n }\n\n public grantReadWriteData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantReadWriteData(grantee);\n }\n\n public grantStream(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantStream(grantee, ...actions);\n }\n\n public grantStreamRead(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantStreamRead(grantee);\n }\n\n public grantTableListStreams(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantTableListStreams(grantee);\n }\n\n public grantWriteData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantWriteData(grantee);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metric(metricName, props);\n }\n\n public metricConditionalCheckFailedRequests(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConditionalCheckFailedRequests(props);\n }\n\n public metricConsumedReadCapacityUnits(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConsumedReadCapacityUnits(props);\n }\n\n public metricConsumedWriteCapacityUnits(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConsumedWriteCapacityUnits(props);\n }\n\n public metricSuccessfulRequestLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricSuccessfulRequestLatency(props);\n }\n\n public metricSystemErrorsForOperations(\n props?: dynamodb.SystemErrorsForOperationsMetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").IMetric {\n return this._table.metricSystemErrorsForOperations(props);\n }\n\n public metricThrottledRequests(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricThrottledRequests(props);\n }\n\n public metricThrottledRequestsForOperations(\n props?: dynamodb.OperationsMetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").IMetric {\n return this._table.metricThrottledRequestsForOperations(props);\n }\n\n public metricUserErrors(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricUserErrors(props);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Rule, RuleProps, RuleTargetInput } from \"aws-cdk-lib/aws-events\";\nimport { LambdaFunction } from \"aws-cdk-lib/aws-events-targets\";\nimport { IFunction } from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieEventsRuleProps extends Omit<RuleProps, \"targets\"> {\n /**\n * Optional construct ID\n * @default Generated from source or \"EventsRule\"\n */\n id?: string;\n\n /**\n * Event source(s) to match\n * @default undefined\n */\n source?: string | string[];\n\n /**\n * Lambda function to target\n * Can be:\n * - An IFunction instance\n * - undefined (will resolve Datadog forwarder)\n * @default Resolves Datadog forwarder via resolveDatadogForwarderFunction\n */\n targetFunction?: IFunction;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * The vendor tag value\n * @default CDK.VENDOR.DATADOG\n */\n vendor?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n}\n\nexport class JaypieEventsRule extends Construct {\n public readonly rule: Rule;\n public readonly targetFunction: IFunction;\n\n /**\n * Create a new EventBridge rule that targets a Lambda function\n */\n constructor(\n scope: Construct,\n idOrSourceOrProps?: string | JaypieEventsRuleProps,\n propsOrUndefined?: JaypieEventsRuleProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieEventsRuleProps;\n let id: string;\n\n if (typeof idOrSourceOrProps === \"string\") {\n // Check if it looks like an AWS source (starts with \"aws.\")\n if (idOrSourceOrProps.startsWith(\"aws.\")) {\n // First param is source, second is props\n props = propsOrUndefined || {};\n props.source = idOrSourceOrProps;\n // Generate ID from source\n const sourceName = idOrSourceOrProps\n .replace(\"aws.\", \"\")\n .split(\".\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n id = props.id || `${sourceName}EventsRule`;\n } else {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrSourceOrProps;\n }\n } else {\n // First param is props\n props = idOrSourceOrProps || {};\n if (props.source) {\n const sourceName =\n typeof props.source === \"string\"\n ? props.source\n .replace(\"aws.\", \"\")\n .split(\".\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\")\n : \"Events\";\n id = props.id || `${sourceName}EventsRule`;\n } else {\n id = props.id || \"EventsRule\";\n }\n }\n\n super(scope, id);\n\n // Extract Jaypie-specific options\n\n const {\n id: _id,\n project,\n service = CDK.SERVICE.DATADOG,\n source,\n targetFunction,\n vendor = CDK.VENDOR.DATADOG,\n ...ruleProps\n } = props;\n\n // Resolve target function\n this.targetFunction =\n targetFunction || resolveDatadogForwarderFunction(scope);\n\n // Build event pattern if source is specified\n const eventPattern = source\n ? {\n ...ruleProps.eventPattern,\n source: Array.isArray(source) ? source : [source],\n }\n : ruleProps.eventPattern;\n\n // Build rule props\n const finalRuleProps: RuleProps = {\n ...ruleProps,\n eventPattern,\n targets: [\n new LambdaFunction(this.targetFunction, {\n event: RuleTargetInput.fromEventPath(\"$\"),\n }),\n ],\n };\n\n // Create the rule\n this.rule = new Rule(this, \"Rule\", finalRuleProps);\n\n // Add tags\n cdk.Tags.of(this.rule).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.rule).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.rule).add(CDK.TAG.VENDOR, vendor);\n if (project) {\n cdk.Tags.of(this.rule).add(CDK.TAG.PROJECT, project);\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration } from \"aws-cdk-lib\";\nimport { CDK } from \"./constants\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\nexport class JaypieExpressLambda extends JaypieLambda {\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id, {\n timeout: Duration.seconds(CDK.DURATION.EXPRESS_API),\n roleTag: CDK.ROLE.API,\n ...props,\n });\n }\n}\n","import { CfnOutput, Duration, Fn, Stack, Tags } from \"aws-cdk-lib\";\nimport {\n Effect,\n FederatedPrincipal,\n PolicyStatement,\n Role,\n} from \"aws-cdk-lib/aws-iam\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\nexport interface JaypieGitHubDeployRoleProps {\n oidcProviderArn?: string;\n output?: boolean | string;\n repoRestriction?: string;\n}\n\nexport class JaypieGitHubDeployRole extends Construct {\n private readonly _role: Role;\n\n constructor(\n scope: Construct,\n id: string = \"GitHubDeployRole\",\n props: JaypieGitHubDeployRoleProps = {},\n ) {\n super(scope, id);\n\n const {\n oidcProviderArn = Fn.importValue(CDK.IMPORT.OIDC_PROVIDER),\n output = true,\n repoRestriction: propsRepoRestriction,\n } = props;\n\n // Extract account ID from the scope\n const accountId = Stack.of(this).account;\n\n // Resolve repoRestriction from props or environment variables\n let repoRestriction = propsRepoRestriction;\n if (!repoRestriction) {\n const envRepo = process.env.CDK_ENV_REPO || process.env.PROJECT_REPO;\n if (!envRepo) {\n throw new ConfigurationError(\n \"No repoRestriction provided. Set repoRestriction prop, CDK_ENV_REPO, or PROJECT_REPO environment variable\",\n );\n }\n // Extract organization from owner/repo format and create org-wide restriction\n const organization = envRepo.split(\"/\")[0];\n repoRestriction = `repo:${organization}/*:*`;\n }\n\n // Create the IAM role\n this._role = new Role(this, \"GitHubActionsRole\", {\n assumedBy: new FederatedPrincipal(\n oidcProviderArn,\n {\n StringLike: {\n \"token.actions.githubusercontent.com:sub\": repoRestriction,\n },\n },\n \"sts:AssumeRoleWithWebIdentity\",\n ),\n maxSessionDuration: Duration.hours(1),\n path: \"/\",\n });\n Tags.of(this._role).add(CDK.TAG.ROLE, CDK.ROLE.DEPLOY);\n\n // Allow the role to access the GitHub OIDC provider\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\"sts:AssumeRoleWithWebIdentity\"],\n resources: [`arn:aws:iam::${accountId}:oidc-provider/*`],\n }),\n );\n\n // Allow the role to deploy CDK apps\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\n \"cloudformation:CreateStack\",\n \"cloudformation:DeleteStack\",\n \"cloudformation:DescribeStackEvents\",\n \"cloudformation:DescribeStackResource\",\n \"cloudformation:DescribeStackResources\",\n \"cloudformation:DescribeStacks\",\n \"cloudformation:GetTemplate\",\n \"cloudformation:SetStackPolicy\",\n \"cloudformation:UpdateStack\",\n \"cloudformation:ValidateTemplate\",\n \"iam:PassRole\",\n \"route53:ListHostedZones*\",\n \"s3:GetObject\",\n \"s3:ListBucket\",\n ],\n effect: Effect.ALLOW,\n resources: [\"*\"],\n }),\n );\n\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\"iam:PassRole\", \"sts:AssumeRole\"],\n effect: Effect.ALLOW,\n resources: [\n \"arn:aws:iam::*:role/cdk-hnb659fds-deploy-role-*\",\n \"arn:aws:iam::*:role/cdk-hnb659fds-file-publishing-*\",\n \"arn:aws:iam::*:role/cdk-readOnlyRole\",\n ],\n }),\n );\n\n // Export the ARN of the role\n if (output !== false) {\n const outputId =\n typeof output === \"string\" ? output : \"GitHubActionsRoleArn\";\n new CfnOutput(this, outputId, {\n value: this._role.roleArn,\n });\n }\n }\n\n public get role(): Role {\n return this._role;\n }\n\n public get roleArn(): string {\n return this._role.roleArn;\n }\n\n public get roleName(): string {\n return this._role.roleName;\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { ServicePrincipal } from \"aws-cdk-lib/aws-iam\";\nimport {\n FilterPattern,\n ILogGroup,\n LogGroup,\n RetentionDays,\n} from \"aws-cdk-lib/aws-logs\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-logs-destinations\";\nimport { HostedZone, IHostedZone } from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogLoggingDestination } from \"./helpers/resolveDatadogLoggingDestination\";\nimport { JaypieDnsRecord, JaypieDnsRecordProps } from \"./JaypieDnsRecord\";\n\nconst SERVICE = {\n ROUTE53: \"route53.amazonaws.com\",\n} as const;\n\n/**\n * Check if a string is a valid hostname\n */\nfunction isValidHostname(str: string): boolean {\n // Check if it contains a dot and matches hostname pattern\n if (!str.includes(\".\")) return false;\n\n // Basic hostname validation: alphanumeric, hyphens, dots\n // Each label must start and end with alphanumeric\n const hostnameRegex = /^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$/i;\n return hostnameRegex.test(str);\n}\n\n/**\n * DNS record configuration for JaypieHostedZone\n * Omits 'zone' since it will be automatically set to the created hosted zone\n */\nexport interface JaypieHostedZoneRecordProps extends Omit<\n JaypieDnsRecordProps,\n \"zone\"\n> {\n /**\n * Optional ID for the DNS record construct\n * @default Generated from record type and name\n */\n id?: string;\n}\n\ninterface JaypieHostedZoneProps {\n /**\n * Optional construct ID\n * @default `${zoneName}-HostedZone`\n */\n id?: string;\n /**\n * The domain name for the hosted zone\n */\n zoneName: string;\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n /**\n * Optional project tag value\n */\n project?: string;\n /**\n * Log destination configuration\n * - LambdaDestination: Use a specific Lambda destination\n * - true: Use Datadog logging destination (default)\n * - false: Do not use a destination\n * @default true\n */\n destination?: LambdaDestination | boolean;\n /**\n * Optional DNS records to create for this hosted zone\n * Each record will be created as a JaypieDnsRecord construct\n */\n records?: JaypieHostedZoneRecordProps[];\n}\n\nexport class JaypieHostedZone extends Construct {\n public readonly hostedZone: IHostedZone;\n public readonly logGroup: ILogGroup;\n public readonly dnsRecords: JaypieDnsRecord[];\n\n /**\n * Create a new hosted zone with query logging and optional DNS records\n */\n constructor(\n scope: Construct,\n idOrProps: string | JaypieHostedZoneProps,\n propsOrRecords?: JaypieHostedZoneProps | JaypieHostedZoneRecordProps[],\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieHostedZoneProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // If it's a valid hostname, treat it as zoneName\n if (isValidHostname(idOrProps)) {\n // Third param can be props object or records array\n if (Array.isArray(propsOrRecords)) {\n props = { zoneName: idOrProps, records: propsOrRecords };\n } else {\n props = propsOrRecords || { zoneName: idOrProps };\n // Set zoneName if not already set\n if (!props.zoneName) {\n props = { ...props, zoneName: idOrProps };\n }\n }\n // Use id from props if provided, otherwise derive from zoneName\n id = props.id || `${idOrProps}-HostedZone`;\n } else {\n // Otherwise treat it as an explicit id\n props = propsOrRecords as JaypieHostedZoneProps;\n id = idOrProps;\n }\n } else {\n // idOrProps is props\n props = idOrProps;\n id = props.id || `${props.zoneName}-HostedZone`;\n }\n\n super(scope, id);\n\n const { zoneName, project } = props;\n const destination = props.destination ?? true;\n const service = props.service || CDK.SERVICE.INFRASTRUCTURE;\n\n // Create the log group\n this.logGroup = new LogGroup(this, \"LogGroup\", {\n logGroupName: process.env.PROJECT_NONCE\n ? `/aws/route53/${zoneName}-${process.env.PROJECT_NONCE}`\n : `/aws/route53/${zoneName}`,\n retention: RetentionDays.ONE_WEEK,\n });\n\n // Add tags\n cdk.Tags.of(this.logGroup).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.logGroup).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n if (project) {\n cdk.Tags.of(this.logGroup).add(CDK.TAG.PROJECT, project);\n }\n\n // Grant Route 53 permissions to write to the log group\n this.logGroup.grantWrite(new ServicePrincipal(SERVICE.ROUTE53));\n\n // Add destination based on configuration\n if (destination !== false) {\n const lambdaDestination =\n destination === true\n ? resolveDatadogLoggingDestination(scope)\n : destination;\n\n this.logGroup.addSubscriptionFilter(\"DatadogLambdaDestination\", {\n destination: lambdaDestination,\n filterPattern: FilterPattern.allEvents(),\n });\n }\n\n // Create the hosted zone\n this.hostedZone = new HostedZone(this, \"HostedZone\", {\n queryLogsLogGroupArn: this.logGroup.logGroupArn,\n zoneName,\n });\n\n // Add tags\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n if (project) {\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.PROJECT, project);\n }\n\n // Create DNS records if provided\n this.dnsRecords = [];\n if (props.records) {\n props.records.forEach((recordConfig, index) => {\n const { id, ...recordProps } = recordConfig;\n // Generate a default ID if not provided\n const recordId =\n id ||\n `${recordProps.type}${recordProps.recordName ? `-${recordProps.recordName}` : \"\"}-${index}`;\n\n const dnsRecord = new JaypieDnsRecord(this, recordId, {\n ...recordProps,\n zone: this.hostedZone,\n });\n\n this.dnsRecords.push(dnsRecord);\n });\n }\n }\n}\n","import { Tags } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { JaypieStack, JaypieStackProps } from \"./JaypieStack\";\nimport { constructStackName } from \"./helpers\";\n\nconst CDK = {\n TAG: {\n STACK_SHA: \"stackSha\",\n },\n};\n\nexport class JaypieInfrastructureStack extends JaypieStack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key = \"infra\", ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n super(scope, id, { key, ...stackProps });\n\n // Add infrastructure-specific tag\n if (process.env.CDK_ENV_INFRASTRUCTURE_STACK_SHA) {\n Tags.of(this).add(\n CDK.TAG.STACK_SHA,\n process.env.CDK_ENV_INFRASTRUCTURE_STACK_SHA,\n );\n }\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieMongoDbSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"MongoConnectionString\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"MONGODB_URI\",\n roleTag: CDK.ROLE.STORAGE,\n vendorTag: CDK.VENDOR.MONGODB,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport { IHostedZone } from \"aws-cdk-lib/aws-route53\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { Nextjs } from \"cdk-nextjs-standalone\";\nimport { Construct } from \"constructs\";\nimport * as path from \"path\";\n\nimport {\n addDatadogLayers,\n envHostname,\n EnvironmentInput,\n HostConfig,\n jaypieLambdaEnv,\n resolveEnvironment,\n resolveHostedZone,\n resolveParamsAndSecrets,\n resolveSecrets,\n SecretsArrayItem,\n} from \"./helpers\";\n\n/**\n * @deprecated Use HostConfig instead. This alias is kept for backwards compatibility.\n */\nexport type DomainNameConfig = HostConfig;\n\nexport interface JaypieNextjsProps {\n datadogApiKeyArn?: string;\n /**\n * Domain name for the Next.js application.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name\n * - Object: passed to envHostname() to construct the domain name\n * - { component, domain, env, subdomain }\n *\n * To deploy without a domain (CloudFront URL only), set domainProps: false\n */\n domainName?: string | DomainNameConfig;\n /**\n * Set to false to deploy without a custom domain.\n * When false, the application will only be accessible via CloudFront URL.\n * This overrides any domainName configuration.\n */\n domainProps?: false;\n /**\n * DynamoDB tables to grant read/write access to the Next.js server function.\n * Each table is granted read/write access and if exactly one table is provided,\n * the DYNAMODB_TABLE_NAME environment variable is set to the table name.\n */\n tables?: dynamodb.ITable[];\n /**\n * Environment variables for the Next.js application.\n *\n * Supports both legacy object syntax and new array syntax:\n * - Object: { KEY: \"value\" } - directly sets environment variables\n * - Array: [\"KEY1\", \"KEY2\", { KEY3: \"value\" }]\n * - Strings: lookup value from process.env\n * - Objects: merge key-value pairs directly\n */\n environment?: EnvironmentInput;\n envSecrets?: { [key: string]: secretsmanager.ISecret };\n hostedZone?: IHostedZone | string;\n nextjsPath?: string;\n /**\n * Secrets to make available to the Next.js application.\n *\n * Supports both JaypieEnvSecret instances and strings:\n * - JaypieEnvSecret: used directly\n * - String: creates a JaypieEnvSecret with the string as envKey\n * (reuses existing secrets within the same scope)\n */\n secrets?: SecretsArrayItem[];\n}\n\nexport class JaypieNextJs extends Construct {\n private readonly _nextjs: Nextjs;\n public readonly domainName?: string;\n\n constructor(scope: Construct, id: string, props?: JaypieNextjsProps) {\n super(scope, id);\n\n // Determine if we should use a custom domain\n const useDomain = props?.domainProps !== false;\n\n // Resolve domain name only if using a custom domain\n const domainName = useDomain\n ? typeof props?.domainName === \"string\"\n ? props.domainName\n : envHostname(props?.domainName)\n : undefined;\n this.domainName = domainName;\n\n // Use domain name or construct ID for cache policy naming\n const cachePolicyIdentifier = domainName\n ? domainName.replace(/\\./g, \"-\").replace(/[^a-zA-Z0-9]/g, \"_\")\n : id.replace(/[^a-zA-Z0-9]/g, \"_\");\n\n // Resolve environment from array or object syntax\n const environment = resolveEnvironment(props?.environment);\n const envSecrets = props?.envSecrets || {};\n const nextjsPath = props?.nextjsPath?.startsWith(\"..\")\n ? path.join(process.cwd(), props.nextjsPath)\n : props?.nextjsPath || path.join(process.cwd(), \"..\", \"nextjs\");\n const paramsAndSecrets = resolveParamsAndSecrets();\n\n // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)\n const secrets = resolveSecrets(scope, props?.secrets);\n\n // Process secrets environment variables\n const secretsEnvironment = Object.entries(envSecrets).reduce(\n (acc, [key, secret]) => ({\n ...acc,\n [`SECRET_${key}`]: secret.secretName,\n }),\n {},\n );\n\n // Process JaypieEnvSecret array\n const jaypieSecretsEnvironment = secrets.reduce<{ [key: string]: string }>(\n (acc, secret) => {\n if (secret.envKey) {\n return {\n ...acc,\n [`SECRET_${secret.envKey}`]: secret.secretName,\n };\n }\n return acc;\n },\n {},\n );\n\n // Process NEXT_PUBLIC_ environment variables\n const nextPublicEnv = Object.entries(process.env).reduce(\n (acc, [key, value]) => {\n if (key.startsWith(\"NEXT_PUBLIC_\") && value) {\n return {\n ...acc,\n [key]: value,\n };\n }\n return acc;\n },\n {},\n );\n\n const nextjs = new Nextjs(this, \"NextJsApp\", {\n nextjsPath,\n // Only configure custom domain if useDomain is true\n ...(useDomain &&\n domainName && {\n domainProps: {\n domainName,\n hostedZone: resolveHostedZone(this, {\n zone: props?.hostedZone,\n }),\n },\n }),\n environment: {\n ...jaypieLambdaEnv(),\n ...environment,\n ...secretsEnvironment,\n ...jaypieSecretsEnvironment,\n ...nextPublicEnv,\n // NEXT_PUBLIC_SITE_URL will be set after construct creation for CloudFront URL\n ...(domainName && { NEXT_PUBLIC_SITE_URL: `https://${domainName}` }),\n },\n overrides: {\n nextjsDistribution: {\n imageCachePolicyProps: {\n cachePolicyName: `NextJsImageCachePolicy-${cachePolicyIdentifier}`,\n },\n serverCachePolicyProps: {\n cachePolicyName: `NextJsServerCachePolicy-${cachePolicyIdentifier}`,\n },\n },\n nextjsImage: {\n functionProps: {\n paramsAndSecrets,\n },\n },\n nextjsServer: {\n functionProps: {\n paramsAndSecrets,\n },\n },\n },\n });\n\n // Set NEXT_PUBLIC_SITE_URL to CloudFront URL when no custom domain\n if (!domainName) {\n nextjs.serverFunction.lambdaFunction.addEnvironment(\n \"NEXT_PUBLIC_SITE_URL\",\n `https://${nextjs.distribution.distributionDomain}`,\n );\n }\n\n addDatadogLayers(nextjs.imageOptimizationFunction);\n addDatadogLayers(nextjs.serverFunction.lambdaFunction);\n\n // Grant secret read permissions\n Object.values(envSecrets).forEach((secret) => {\n secret.grantRead(nextjs.serverFunction.lambdaFunction);\n });\n\n // Grant read permissions for JaypieEnvSecrets\n secrets.forEach((secret) => {\n secret.grantRead(nextjs.serverFunction.lambdaFunction);\n });\n\n // Grant read/write permissions for DynamoDB tables\n const tables = props?.tables || [];\n tables.forEach((table) => {\n table.grantReadWriteData(nextjs.serverFunction.lambdaFunction);\n });\n\n // Add table name to environment if there's exactly one table\n if (tables.length === 1) {\n nextjs.serverFunction.lambdaFunction.addEnvironment(\n \"DYNAMODB_TABLE_NAME\",\n tables[0].tableName,\n );\n }\n\n // Store reference to nextjs for property exposure\n this._nextjs = nextjs;\n }\n\n // Expose Nextjs construct properties\n\n /** S3 bucket for static assets */\n public get bucket() {\n return this._nextjs.bucket;\n }\n\n /** CloudFront distribution */\n public get distribution() {\n return this._nextjs.distribution;\n }\n\n /** Route53 domain configuration */\n public get domain() {\n return this._nextjs.domain;\n }\n\n /** Image optimization Lambda function */\n public get imageOptimizationFunction() {\n return this._nextjs.imageOptimizationFunction;\n }\n\n /** Image optimization Lambda function URL */\n public get imageOptimizationLambdaFunctionUrl() {\n return this._nextjs.imageOptimizationLambdaFunctionUrl;\n }\n\n /** Server Lambda function URL */\n public get lambdaFunctionUrl() {\n return this._nextjs.lambdaFunctionUrl;\n }\n\n /** Next.js build output */\n public get nextBuild() {\n return this._nextjs.nextBuild;\n }\n\n /** ISR revalidation configuration */\n public get revalidation() {\n return this._nextjs.revalidation;\n }\n\n /** Next.js server function */\n public get serverFunction() {\n return this._nextjs.serverFunction;\n }\n\n /** Static assets configuration */\n public get staticAssets() {\n return this._nextjs.staticAssets;\n }\n\n /** CloudFront distribution URL */\n public get url() {\n return this._nextjs.url;\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieOpenAiSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"OpenAiApiKey\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"OPENAI_API_KEY\",\n roleTag: CDK.ROLE.PROCESSING,\n vendorTag: CDK.VENDOR.OPENAI,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Effect, PolicyStatement, ServicePrincipal } from \"aws-cdk-lib/aws-iam\";\nimport {\n EventType,\n Bucket,\n BucketAccessControl,\n IBucket,\n StorageClass,\n} from \"aws-cdk-lib/aws-s3\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-s3-notifications\";\nimport { ReadWriteType, Trail } from \"aws-cdk-lib/aws-cloudtrail\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieOrganizationTrailProps {\n /**\n * Optional construct ID\n * @default Generated from trail name\n */\n id?: string;\n\n /**\n * The name of the CloudTrail trail\n * @default Uses PROJECT_NONCE: `organization-cloudtrail-${PROJECT_NONCE}`\n */\n trailName?: string;\n\n /**\n * The name of the S3 bucket for CloudTrail logs\n * @default Uses PROJECT_NONCE: `organization-cloudtrail-${PROJECT_NONCE}`\n */\n bucketName?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to enable file validation for the trail\n * @default false\n */\n enableFileValidation?: boolean;\n\n /**\n * Number of days before logs expire\n * @default 365\n */\n expirationDays?: number;\n\n /**\n * Number of days before transitioning to INFREQUENT_ACCESS storage\n * @default 30\n */\n infrequentAccessTransitionDays?: number;\n\n /**\n * Number of days before transitioning to GLACIER storage\n * @default 180\n */\n glacierTransitionDays?: number;\n\n /**\n * Whether to send S3 notifications to Datadog forwarder\n * @default true\n */\n enableDatadogNotifications?: boolean;\n}\n\nexport class JaypieOrganizationTrail extends Construct {\n public readonly bucket: IBucket;\n public readonly trail: Trail;\n\n /**\n * Create a new organization CloudTrail with S3 bucket and lifecycle policies\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieOrganizationTrailProps,\n propsOrUndefined?: JaypieOrganizationTrailProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieOrganizationTrailProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n const defaultName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\";\n id = props.id || `${props.trailName || defaultName}-Trail`;\n }\n\n super(scope, id);\n\n // Resolve options with defaults\n const {\n bucketName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\",\n enableDatadogNotifications = true,\n enableFileValidation = false,\n expirationDays = 365,\n glacierTransitionDays = 180,\n infrequentAccessTransitionDays = 30,\n project,\n service = CDK.SERVICE.INFRASTRUCTURE,\n trailName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\",\n } = props;\n\n // Create the S3 bucket for CloudTrail logs\n this.bucket = new Bucket(this, \"Bucket\", {\n accessControl: BucketAccessControl.LOG_DELIVERY_WRITE,\n bucketName,\n lifecycleRules: [\n {\n expiration: cdk.Duration.days(expirationDays),\n transitions: [\n {\n storageClass: StorageClass.INFREQUENT_ACCESS,\n transitionAfter: cdk.Duration.days(\n infrequentAccessTransitionDays,\n ),\n },\n {\n storageClass: StorageClass.GLACIER,\n transitionAfter: cdk.Duration.days(glacierTransitionDays),\n },\n ],\n },\n ],\n });\n\n // Add CloudTrail bucket policies\n this.bucket.addToResourcePolicy(\n new PolicyStatement({\n actions: [\"s3:GetBucketAcl\"],\n effect: Effect.ALLOW,\n principals: [new ServicePrincipal(\"cloudtrail.amazonaws.com\")],\n resources: [this.bucket.bucketArn],\n }),\n );\n\n this.bucket.addToResourcePolicy(\n new PolicyStatement({\n actions: [\"s3:PutObject\"],\n conditions: {\n StringEquals: {\n \"s3:x-amz-acl\": \"bucket-owner-full-control\",\n },\n },\n effect: Effect.ALLOW,\n principals: [new ServicePrincipal(\"cloudtrail.amazonaws.com\")],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n );\n\n // Add tags to bucket\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Add Datadog notifications if enabled\n if (enableDatadogNotifications) {\n const datadogForwarderFunction = resolveDatadogForwarderFunction(scope);\n this.bucket.addEventNotification(\n EventType.OBJECT_CREATED,\n new LambdaDestination(datadogForwarderFunction),\n );\n }\n\n // Create the organization trail\n this.trail = new Trail(this, \"Trail\", {\n bucket: this.bucket,\n enableFileValidation,\n isOrganizationTrail: true,\n managementEvents: ReadWriteType.ALL,\n trailName,\n });\n\n // Add tags to trail\n cdk.Tags.of(this.trail).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.trail).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.trail).add(CDK.TAG.PROJECT, project);\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Tags } from \"aws-cdk-lib\";\nimport { CfnAssignment, CfnPermissionSet } from \"aws-cdk-lib/aws-sso\";\nimport { ManagedPolicy } from \"aws-cdk-lib/aws-iam\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\n/**\n * Mapping of account IDs to permission set names\n * Key: AWS account ID\n * Value: Array of permission set names to assign to this account\n */\nexport interface AccountAssignments {\n [accountId: string]: string[];\n}\n\n/**\n * Properties for the JaypieSsoPermissions construct\n */\nexport interface JaypieSsoPermissionsProps {\n /**\n * ARN of the IAM Identity Center instance\n * If not provided, falls back to CDK_ENV_IAM_IDENTITY_CENTER_ARN\n * If neither is set, SSO setup will be skipped\n */\n iamIdentityCenterArn?: string;\n\n /**\n * Google Workspace group GUID for administrators\n * Example: \"b4c8b438-4031-7000-782d-5046945fb956\"\n */\n administratorGroupId?: string;\n\n /**\n * Google Workspace group GUID for analysts\n * Example: \"2488f4e8-d061-708e-abe1-c315f0e30005\"\n */\n analystGroupId?: string;\n\n /**\n * Google Workspace group GUID for developers\n * Example: \"b438a4f8-e0e1-707c-c6e8-21841daf9ad1\"\n */\n developerGroupId?: string;\n\n /**\n * Account assignments for administrator group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Administrator\", \"Analyst\"],\n * \"381492033431\": [\"Administrator\"],\n * }\n */\n administratorAccountAssignments?: AccountAssignments;\n\n /**\n * Account assignments for analyst group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Analyst\"],\n * \"381492033431\": [\"Analyst\"],\n * }\n */\n analystAccountAssignments?: AccountAssignments;\n\n /**\n * Account assignments for developer group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Developer\"],\n * }\n */\n developerAccountAssignments?: AccountAssignments;\n}\n\n/**\n * JaypieSsoPermissions Construct\n *\n * Creates and manages AWS IAM Identity Center (SSO) permission sets and assignments\n *\n * @example\n * const permissionSets = new JaypieSsoPermissions(this, \"PermissionSets\", {\n * iamIdentityCenterArn: \"arn:aws:sso:::instance/...\",\n * administratorGroupId: \"b4c8b438-4031-7000-782d-5046945fb956\",\n * analystGroupId: \"2488f4e8-d061-708e-abe1-c315f0e30005\",\n * developerGroupId: \"b438a4f8-e0e1-707c-c6e8-21841daf9ad1\",\n * administratorAccountAssignments: {\n * \"211125635435\": [\"Administrator\", \"Analyst\", \"Developer\"],\n * \"381492033431\": [\"Administrator\", \"Analyst\"],\n * },\n * analystAccountAssignments: {\n * \"211125635435\": [\"Analyst\", \"Developer\"],\n * \"381492033431\": [],\n * },\n * developerAccountAssignments: {\n * \"211125635435\": [\"Analyst\", \"Developer\"],\n * \"381492033431\": [],\n * },\n * });\n */\nexport class JaypieSsoPermissions extends Construct {\n public readonly administratorPermissionSet?: CfnPermissionSet;\n public readonly analystPermissionSet?: CfnPermissionSet;\n public readonly developerPermissionSet?: CfnPermissionSet;\n\n constructor(scope: Construct, id: string, props: JaypieSsoPermissionsProps) {\n super(scope, id);\n\n const {\n iamIdentityCenterArn: iamIdentityCenterArnProp,\n administratorGroupId,\n analystGroupId,\n developerGroupId,\n administratorAccountAssignments,\n analystAccountAssignments,\n developerAccountAssignments,\n } = props;\n\n const iamIdentityCenterArn =\n iamIdentityCenterArnProp || process.env.CDK_ENV_IAM_IDENTITY_CENTER_ARN;\n\n if (!iamIdentityCenterArn) {\n // If no IAM Identity Center ARN provided, skip SSO setup\n return;\n }\n\n //\n // Permission Sets\n //\n\n this.administratorPermissionSet = new CfnPermissionSet(\n this,\n \"AdministratorPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Administrator\",\n\n // Optional\n description: \"Unrestricted access\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"aws-portal:ViewUsage\",\n \"aws-portal:ViewBilling\",\n \"budgets:*\",\n \"cur:DescribeReportDefinitions\",\n \"cur:PutReportDefinition\",\n \"cur:DeleteReportDefinition\",\n \"cur:ModifyReportDefinition\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AdministratorAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ],\n sessionDuration: Duration.hours(1).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n this.analystPermissionSet = new CfnPermissionSet(\n this,\n \"AnalystPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Analyst\",\n\n // Optional\n description: \"Read-only access; may expand to limited write access\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"aws-portal:ViewUsage\",\n \"aws-portal:ViewBilling\",\n \"budgets:Describe*\",\n \"budgets:View*\",\n \"ce:Get*\",\n \"ce:List*\",\n \"cloudformation:Describe*\",\n \"cloudformation:Get*\",\n \"cloudformation:List*\",\n \"cloudwatch:BatchGet*\",\n \"cloudwatch:Get*\",\n \"cloudwatch:List*\",\n \"cost-optimization-hub:Get*\",\n \"cost-optimization-hub:List*\",\n \"ec2:Describe*\",\n \"ec2:Get*\",\n \"ec2:List*\",\n \"ec2:Search*\",\n \"iam:Get*\",\n \"iam:List*\",\n \"iam:PassRole\",\n \"lambda:Get*\",\n \"lambda:List*\",\n \"logs:Describe*\",\n \"logs:Get*\",\n \"logs:List*\",\n \"pipes:Describe*\",\n \"pipes:List*\",\n \"s3:Get*\",\n \"s3:List*\",\n \"secretsmanager:GetRandomPassword\",\n \"secretsmanager:GetResourcePolicy\",\n \"secretsmanager:List*\",\n \"securityhub:Describe*\",\n \"securityhub:Get*\",\n \"securityhub:List*\",\n \"servicecatalog:Describe*\",\n \"sns:Get*\",\n \"sns:List*\",\n \"sqs:Get*\",\n \"sqs:List*\",\n \"states:Describe*\",\n \"states:Get*\",\n \"states:List*\",\n \"tag:*\",\n \"uxc:*\",\n \"xray:*\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AmazonQDeveloperAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\"ReadOnlyAccess\")\n .managedPolicyArn,\n ],\n sessionDuration: Duration.hours(12).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n this.developerPermissionSet = new CfnPermissionSet(\n this,\n \"DeveloperPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Developer\",\n\n // Optional\n description: \"Administrative access with limited restrictions\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"budgets:*\",\n \"ce:*\",\n \"cloudformation:*\",\n \"cloudwatch:*\",\n \"cost-optimization-hub:*\",\n \"ec2:*\",\n \"iam:Get*\",\n \"iam:List*\",\n \"iam:PassRole\",\n \"lambda:*\",\n \"logs:*\",\n \"pipes:*\",\n \"s3:*\",\n \"secretsmanager:*\",\n \"securityhub:*\",\n \"servicecatalog:*\",\n \"sns:*\",\n \"sqs:*\",\n \"states:*\",\n \"tag:*\",\n \"uxc:*\",\n \"xray:*\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AmazonQDeveloperAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\"ReadOnlyAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"job-function/SystemAdministrator\",\n ).managedPolicyArn,\n ],\n sessionDuration: Duration.hours(4).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n // Map permission set names to their ARNs and labels\n const permissionSetMap: Record<string, { arn: string; label: string }> = {\n Administrator: {\n arn: this.administratorPermissionSet.attrPermissionSetArn,\n label: \"Administrator\",\n },\n Analyst: {\n arn: this.analystPermissionSet.attrPermissionSetArn,\n label: \"Analyst\",\n },\n Developer: {\n arn: this.developerPermissionSet.attrPermissionSetArn,\n label: \"Developer\",\n },\n };\n\n //\n // Assignments\n //\n\n // Helper function to create assignments for a group\n const createAssignments = (\n groupId: string | undefined,\n accountAssignments: AccountAssignments | undefined,\n ) => {\n if (!groupId || !accountAssignments) {\n return; // Skip if group ID or assignments not provided\n }\n\n Object.keys(accountAssignments).forEach((accountId) => {\n const permissionSetNames = accountAssignments[accountId];\n\n permissionSetNames.forEach((permissionSetName) => {\n const permissionSet = permissionSetMap[permissionSetName];\n\n if (!permissionSet) {\n throw new ConfigurationError(\n `Unknown permission set: ${permissionSetName}. Valid options: ${Object.keys(permissionSetMap).join(\", \")}`,\n );\n }\n\n const accountAssignment = new CfnAssignment(\n this,\n `AccountAssignment-${accountId}-${permissionSet.label}Role-${groupId}Group`,\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n permissionSetArn: permissionSet.arn,\n principalId: groupId,\n principalType: CDK.PRINCIPAL_TYPE.GROUP,\n targetId: accountId,\n targetType: CDK.TARGET_TYPE.AWS_ACCOUNT,\n },\n );\n Tags.of(accountAssignment).add(CDK.TAG.SERVICE, CDK.SERVICE.SSO);\n Tags.of(accountAssignment).add(CDK.TAG.ROLE, CDK.ROLE.SECURITY);\n });\n });\n };\n\n // Create assignments for each group\n createAssignments(administratorGroupId, administratorAccountAssignments);\n createAssignments(analystGroupId, analystAccountAssignments);\n createAssignments(developerGroupId, developerAccountAssignments);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Stack, Tags } from \"aws-cdk-lib\";\nimport { CfnApplication } from \"aws-cdk-lib/aws-sam\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\n//\n//\n// Constants\n//\n\nconst DEFAULT_APPLICATION_ID =\n \"arn:aws:serverlessrepo:us-east-2:004480582608:applications/SSOSync\";\nconst DEFAULT_APPLICATION_VERSION = \"2.3.3\";\nconst DEFAULT_GOOGLE_GROUP_MATCH = \"name:AWS*\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieSsoSyncApplicationProps {\n googleAdminEmail?: string;\n googleAdminEmailEnvKey?: string;\n googleCredentials?: string;\n googleCredentialsEnvKey?: string;\n googleGroupMatch?: string;\n googleGroupMatchEnvKey?: string;\n identityStoreId?: string;\n identityStoreIdEnvKey?: string;\n scimEndpointAccessToken?: string;\n scimEndpointAccessTokenEnvKey?: string;\n scimEndpointUrl?: string;\n scimEndpointUrlEnvKey?: string;\n semanticVersion?: string;\n semanticVersionEnvKey?: string;\n ssoSyncApplicationId?: string;\n tags?: { [key: string]: string };\n}\n\n//\n//\n// Class\n//\n\nexport class JaypieSsoSyncApplication extends Construct {\n private readonly _application: CfnApplication;\n\n constructor(\n scope: Construct,\n id = \"SsoSyncApplication\",\n props: JaypieSsoSyncApplicationProps = {},\n ) {\n super(scope, id);\n\n const {\n googleAdminEmail,\n googleAdminEmailEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_ADMIN_EMAIL\",\n googleCredentials,\n googleCredentialsEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_CREDENTIALS\",\n googleGroupMatch,\n googleGroupMatchEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_GROUP_MATCH\",\n identityStoreId,\n identityStoreIdEnvKey = \"CDK_ENV_SSOSYNC_IDENTITY_STORE_ID\",\n scimEndpointAccessToken,\n scimEndpointAccessTokenEnvKey = \"CDK_ENV_SCIM_ENDPOINT_ACCESS_TOKEN\",\n scimEndpointUrl,\n scimEndpointUrlEnvKey = \"CDK_ENV_SSOSYNC_SCIM_ENDPOINT_URL\",\n semanticVersion,\n semanticVersionEnvKey = \"CDK_ENV_SSOSYNC_SEMANTIC_VERSION\",\n ssoSyncApplicationId = DEFAULT_APPLICATION_ID,\n tags,\n } = props;\n\n // Resolve all values from props or environment variables\n const resolvedGoogleAdminEmail =\n googleAdminEmail || process.env[googleAdminEmailEnvKey];\n const resolvedGoogleCredentials =\n googleCredentials || process.env[googleCredentialsEnvKey];\n const resolvedGoogleGroupMatch =\n googleGroupMatch ||\n process.env[googleGroupMatchEnvKey] ||\n DEFAULT_GOOGLE_GROUP_MATCH;\n const resolvedIdentityStoreId =\n identityStoreId || process.env[identityStoreIdEnvKey];\n const resolvedScimEndpointAccessToken =\n scimEndpointAccessToken || process.env[scimEndpointAccessTokenEnvKey];\n const resolvedScimEndpointUrl =\n scimEndpointUrl || process.env[scimEndpointUrlEnvKey];\n const resolvedSemanticVersion =\n semanticVersion ||\n process.env[semanticVersionEnvKey] ||\n DEFAULT_APPLICATION_VERSION;\n\n // Validate required parameters\n const missingParams: string[] = [];\n\n if (!resolvedGoogleAdminEmail) {\n missingParams.push(\n `googleAdminEmail or ${googleAdminEmailEnvKey} environment variable`,\n );\n }\n if (!resolvedGoogleCredentials) {\n missingParams.push(\n `googleCredentials or ${googleCredentialsEnvKey} environment variable`,\n );\n }\n if (!resolvedIdentityStoreId) {\n missingParams.push(\n `identityStoreId or ${identityStoreIdEnvKey} environment variable`,\n );\n }\n if (!resolvedScimEndpointAccessToken) {\n missingParams.push(\n `scimEndpointAccessToken or ${scimEndpointAccessTokenEnvKey} environment variable`,\n );\n }\n if (!resolvedScimEndpointUrl) {\n missingParams.push(\n `scimEndpointUrl or ${scimEndpointUrlEnvKey} environment variable`,\n );\n }\n\n if (missingParams.length > 0) {\n throw new ConfigurationError(\n `JaypieSsoSyncApplication missing required configuration: ${missingParams.join(\", \")}`,\n );\n }\n\n // Create the SSO Sync Application\n // Type assertion is safe because we validated all required values above\n this._application = new CfnApplication(this, \"Application\", {\n location: {\n applicationId: ssoSyncApplicationId,\n semanticVersion: resolvedSemanticVersion,\n },\n parameters: {\n GoogleAdminEmail: resolvedGoogleAdminEmail!,\n GoogleCredentials: resolvedGoogleCredentials!,\n GoogleGroupMatch: resolvedGoogleGroupMatch,\n IdentityStoreID: resolvedIdentityStoreId!,\n Region: Stack.of(this).region,\n SCIMEndpointAccessToken: resolvedScimEndpointAccessToken!,\n SCIMEndpointUrl: resolvedScimEndpointUrl!,\n },\n });\n\n // Add tags\n const defaultTags = {\n [CDK.TAG.ROLE]: CDK.ROLE.SECURITY,\n };\n\n const allTags = { ...defaultTags, ...tags };\n Object.entries(allTags).forEach(([key, value]) => {\n Tags.of(this._application).add(key, value);\n });\n }\n\n public get application(): CfnApplication {\n return this._application;\n }\n}\n","import {\n CfnOutput,\n Duration,\n Fn,\n RemovalPolicy,\n Stack,\n Tags,\n} from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as cloudfront from \"aws-cdk-lib/aws-cloudfront\";\nimport * as origins from \"aws-cdk-lib/aws-cloudfront-origins\";\nimport {\n AddToResourcePolicyResult,\n Effect,\n FederatedPrincipal,\n Role,\n PolicyStatement,\n} from \"aws-cdk-lib/aws-iam\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport * as kms from \"aws-cdk-lib/aws-kms\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n isProductionEnv,\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n} from \"./helpers\";\nimport { JaypieHostedZone } from \"./JaypieHostedZone\";\n\nexport interface JaypieWebDeploymentBucketProps extends s3.BucketProps {\n /**\n * SSL certificate for the CloudFront distribution\n * @default true (creates a new certificate)\n */\n certificate?: boolean | acm.ICertificate;\n /**\n * The domain name for the website\n * @default mergeDomain(CDK_ENV_WEB_SUBDOMAIN, CDK_ENV_WEB_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE)\n */\n host?: string;\n /**\n * Optional bucket name\n */\n name?: string;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS records\n * @default CDK_ENV_WEB_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone | JaypieHostedZone;\n}\n\nexport class JaypieWebDeploymentBucket extends Construct implements s3.IBucket {\n public readonly bucket: s3.Bucket;\n public readonly bucketArn: string;\n public readonly bucketDomainName: string;\n public readonly bucketDualStackDomainName: string;\n public readonly bucketName: string;\n public readonly bucketRegionalDomainName: string;\n public readonly bucketWebsiteDomainName: string;\n public readonly bucketWebsiteUrl: string;\n public readonly encryptionKey?: kms.IKey;\n public readonly isWebsite?: boolean;\n public readonly notificationsHandlerRole?: string;\n public readonly policy?: s3.BucketPolicy;\n public readonly deployRoleArn?: string;\n public readonly distributionDomainName?: string;\n public readonly certificate?: acm.ICertificate;\n public readonly distribution?: cloudfront.Distribution;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieWebDeploymentBucketProps = {},\n ) {\n super(scope, id);\n\n const roleTag = props.roleTag || CDK.ROLE.HOSTING;\n\n // Environment variable validation\n if (\n process.env.CDK_ENV_WEB_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_WEB_SUBDOMAIN)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_WEB_SUBDOMAIN is not a valid subdomain\",\n );\n }\n\n if (\n process.env.CDK_ENV_WEB_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_WEB_HOSTED_ZONE)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_WEB_HOSTED_ZONE is not a valid hostname\",\n );\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_HOSTED_ZONE is not a valid hostname\",\n );\n }\n\n // Determine host from props or environment\n let host = props.host;\n if (!host) {\n try {\n host =\n process.env.CDK_ENV_WEB_HOST ||\n mergeDomain(\n process.env.CDK_ENV_WEB_SUBDOMAIN || \"\",\n process.env.CDK_ENV_WEB_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n } catch {\n host = undefined;\n }\n }\n\n if (host && !isValidHostname(host)) {\n throw new ConfigurationError(\"Host is not a valid hostname\");\n }\n\n // Determine zone from props or environment\n const zone =\n props.zone ||\n process.env.CDK_ENV_WEB_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE;\n\n // Create the S3 bucket\n this.bucket = new s3.Bucket(this, \"DestinationBucket\", {\n accessControl: s3.BucketAccessControl.BUCKET_OWNER_FULL_CONTROL,\n autoDeleteObjects: true,\n blockPublicAccess: s3.BlockPublicAccess.BLOCK_ACLS_ONLY,\n bucketName: props.name || constructEnvName(\"web\"),\n publicReadAccess: true,\n removalPolicy: RemovalPolicy.DESTROY,\n versioned: false,\n websiteErrorDocument: \"index.html\",\n websiteIndexDocument: \"index.html\",\n ...props,\n });\n\n // Delegate IBucket properties to the bucket\n this.bucketArn = this.bucket.bucketArn;\n this.bucketDomainName = this.bucket.bucketDomainName;\n this.bucketDualStackDomainName = this.bucket.bucketDualStackDomainName;\n this.bucketName = this.bucket.bucketName;\n this.bucketRegionalDomainName = this.bucket.bucketRegionalDomainName;\n this.bucketWebsiteDomainName = this.bucket.bucketWebsiteDomainName;\n this.bucketWebsiteUrl = this.bucket.bucketWebsiteUrl;\n this.encryptionKey = this.bucket.encryptionKey;\n this.isWebsite = this.bucket.isWebsite;\n this.notificationsHandlerRole = undefined;\n this.policy = this.bucket.policy;\n\n Tags.of(this.bucket).add(CDK.TAG.ROLE, roleTag);\n\n // Create deployment role if repository is configured\n let repo: string | undefined;\n if (process.env.CDK_ENV_REPO) {\n repo = `repo:${process.env.CDK_ENV_REPO}:*`;\n }\n\n if (repo) {\n const bucketDeployRole = new Role(this, \"DestinationBucketDeployRole\", {\n assumedBy: new FederatedPrincipal(\n Fn.importValue(CDK.IMPORT.OIDC_PROVIDER),\n {\n StringLike: {\n \"token.actions.githubusercontent.com:sub\": repo,\n },\n },\n \"sts:AssumeRoleWithWebIdentity\",\n ),\n maxSessionDuration: Duration.hours(1),\n });\n Tags.of(bucketDeployRole).add(CDK.TAG.ROLE, CDK.ROLE.DEPLOY);\n\n // Allow the role to write to the bucket\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:ListObjectsV2\",\n \"s3:PutObject\",\n ],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n );\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\"s3:ListBucket\"],\n resources: [this.bucket.bucketArn],\n }),\n );\n\n // Allow the role to describe the current stack\n const stack = Stack.of(this);\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n actions: [\"cloudformation:DescribeStacks\"],\n effect: Effect.ALLOW,\n resources: [\n `arn:aws:cloudformation:${stack.region}:${stack.account}:stack/${stack.stackName}/*`,\n ],\n }),\n );\n\n this.deployRoleArn = bucketDeployRole.roleArn;\n\n // Output the deploy role ARN\n new CfnOutput(this, \"DestinationBucketDeployRoleArn\", {\n value: bucketDeployRole.roleArn,\n });\n\n // Output the bucket name for workflows\n new CfnOutput(this, \"DestinationBucketName\", {\n value: this.bucket.bucketName,\n });\n }\n\n // Create CloudFront distribution and certificate if host and zone are provided\n if (host && zone) {\n let hostedZone: route53.IHostedZone;\n if (typeof zone === \"string\") {\n hostedZone = route53.HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: zone,\n });\n } else if (zone instanceof JaypieHostedZone) {\n hostedZone = zone.hostedZone;\n } else {\n hostedZone = zone;\n }\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n this.certificate = resolveCertificate(this, {\n certificate: props.certificate,\n domainName: host,\n roleTag,\n zone: hostedZone,\n });\n\n if (this.certificate) {\n new CfnOutput(this, \"CertificateArn\", {\n value: this.certificate.certificateArn,\n });\n }\n\n // Create CloudFront distribution\n this.distribution = new cloudfront.Distribution(this, \"Distribution\", {\n defaultBehavior: {\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n origin: new origins.S3StaticWebsiteOrigin(this.bucket),\n viewerProtocolPolicy:\n cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n },\n certificate: this.certificate,\n domainNames: [host],\n });\n Tags.of(this.distribution).add(CDK.TAG.ROLE, roleTag);\n\n // If this is production, enable caching on everything but index.html\n if (isProductionEnv()) {\n this.distribution.addBehavior(\n \"/*\",\n new origins.S3StaticWebsiteOrigin(this.bucket),\n {\n viewerProtocolPolicy:\n cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED,\n },\n );\n }\n\n // Create DNS record\n const record = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n\n this.distributionDomainName = this.distribution.distributionDomainName;\n\n // Output the distribution ID for cache invalidation\n new CfnOutput(this, \"DistributionId\", {\n value: this.distribution.distributionId,\n });\n }\n }\n\n // Implement remaining IBucket methods by delegating to the bucket\n addEventNotification(\n event: s3.EventType,\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addEventNotification(event, dest, ...filters);\n }\n\n addObjectCreatedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addObjectCreatedNotification(dest, ...filters);\n }\n\n addObjectRemovedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addObjectRemovedNotification(dest, ...filters);\n }\n\n addToResourcePolicy(permission: PolicyStatement): AddToResourcePolicyResult {\n return this.bucket.addToResourcePolicy(permission);\n }\n\n arnForObjects(keyPattern: string): string {\n return this.bucket.arnForObjects(keyPattern);\n }\n\n grantDelete(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantDelete(identity, objectsKeyPattern);\n }\n\n grantPublicAccess(allowedActions: string, keyPrefix?: string): any {\n return keyPrefix\n ? this.bucket.grantPublicAccess(allowedActions, keyPrefix)\n : this.bucket.grantPublicAccess(allowedActions);\n }\n\n grantPut(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantPut(identity, objectsKeyPattern);\n }\n\n grantPutAcl(identity: any, objectsKeyPattern?: string): any {\n return this.bucket.grantPutAcl(identity, objectsKeyPattern);\n }\n\n grantRead(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantRead(identity, objectsKeyPattern);\n }\n\n grantReadWrite(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantReadWrite(identity, objectsKeyPattern);\n }\n\n grantWrite(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantWrite(identity, objectsKeyPattern);\n }\n\n grantReplicationPermission(identity: any, props: any): any {\n return this.bucket.grantReplicationPermission(identity, props);\n }\n\n s3UrlForObject(key?: string): string {\n return this.bucket.s3UrlForObject(key);\n }\n\n urlForObject(key?: string): string {\n return this.bucket.urlForObject(key);\n }\n\n virtualHostedUrlForObject(\n key?: string,\n options?: s3.VirtualHostedStyleUrlOptions,\n ): string {\n return this.bucket.virtualHostedUrlForObject(key, options);\n }\n\n transferAccelerationUrlForObject(key?: string): string {\n return this.bucket.transferAccelerationUrlForObject(key);\n }\n\n onCloudTrailEvent(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailEvent(id, options);\n }\n\n onCloudTrailPutObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailPutObject(id, options);\n }\n\n onCloudTrailWriteObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailWriteObject(id, options);\n }\n\n addCorsRule(rule: s3.CorsRule): void {\n this.bucket.addCorsRule(rule);\n }\n\n addInventory(inventory: s3.Inventory): void {\n this.bucket.addInventory(inventory);\n }\n\n addLifecycleRule(rule: s3.LifecycleRule): void {\n this.bucket.addLifecycleRule(rule);\n }\n\n addMetric(metric: s3.BucketMetrics): void {\n this.bucket.addMetric(metric);\n }\n\n enableEventBridgeNotification(): void {\n this.bucket.enableEventBridgeNotification();\n }\n\n addReplicationPolicy(policy: any): void {\n this.bucket.addReplicationPolicy(policy);\n }\n\n get stack(): any {\n return this.bucket.stack;\n }\n\n get env(): any {\n return this.bucket.env;\n }\n\n applyRemovalPolicy(policy: RemovalPolicy): void {\n this.bucket.applyRemovalPolicy(policy);\n }\n\n get bucketRef(): s3.BucketReference {\n return {\n bucketArn: this.bucket.bucketArn,\n bucketName: this.bucket.bucketName,\n };\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport { constructEnvName, envHostname } from \"./helpers\";\nimport {\n JaypieWebDeploymentBucket,\n JaypieWebDeploymentBucketProps,\n} from \"./JaypieWebDeploymentBucket\";\n\nexport interface JaypieStaticWebBucketProps extends Omit<\n JaypieWebDeploymentBucketProps,\n \"host\" | \"name\" | \"roleTag\"\n> {\n /**\n * The domain name for the website\n * @default envHostname({ subdomain: \"static\" })\n */\n host?: string;\n /**\n * Optional bucket name\n * @default constructEnvName(\"static\")\n */\n name?: string;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n}\n\nexport class JaypieStaticWebBucket extends JaypieWebDeploymentBucket {\n constructor(\n scope: Construct,\n id?: string | JaypieStaticWebBucketProps,\n props: JaypieStaticWebBucketProps = {},\n ) {\n // Handle overloaded signatures: (scope), (scope, props), (scope, id, props)\n let resolvedId: string;\n let resolvedProps: JaypieStaticWebBucketProps;\n\n if (typeof id === \"string\") {\n resolvedId = id;\n resolvedProps = props;\n } else if (typeof id === \"object\") {\n resolvedId = \"JaypieStaticWebBucket\";\n resolvedProps = id;\n } else {\n resolvedId = \"JaypieStaticWebBucket\";\n resolvedProps = props;\n }\n\n const host = resolvedProps.host ?? envHostname({ subdomain: \"static\" });\n const name = resolvedProps.name ?? constructEnvName(\"static\");\n const roleTag = resolvedProps.roleTag ?? CDK.ROLE.HOSTING;\n // Only use default zone if zone is not explicitly provided (including undefined)\n const zone =\n \"zone\" in resolvedProps\n ? resolvedProps.zone\n : process.env.CDK_ENV_DOMAIN || process.env.CDK_ENV_HOSTED_ZONE;\n\n super(scope, resolvedId, {\n ...resolvedProps,\n host,\n name,\n roleTag,\n zone,\n });\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieTraceSigningKeySecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"TraceSigningKey\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"TRACE_SIGNING_KEY\",\n roleTag: CDK.ROLE.API,\n vendorTag: CDK.VENDOR.KNOWTRACE,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { Construct } from \"constructs\";\nimport { ArnFormat, RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as apigatewayv2 from \"aws-cdk-lib/aws-apigatewayv2\";\nimport * as apigatewayv2Integrations from \"aws-cdk-lib/aws-apigatewayv2-integrations\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as logs from \"aws-cdk-lib/aws-logs\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieWebSocketProps {\n /**\n * Certificate configuration.\n * - true: Create certificate at stack level (default, reusable)\n * - false: No certificate (use regional endpoint)\n * - ICertificate: Use provided certificate\n * - string: Import certificate from ARN\n */\n certificate?: boolean | acm.ICertificate | string;\n\n /**\n * Lambda handler for $connect route (connection established).\n * Use this to validate connections (e.g., auth tokens) and store connection IDs.\n */\n connect?: lambda.IFunction;\n\n /**\n * Lambda handler for $default route (catches unmatched messages).\n * Use this as the main message handler.\n */\n default?: lambda.IFunction;\n\n /**\n * Lambda handler for $disconnect route (connection closed).\n * Use this to clean up connection IDs from storage.\n */\n disconnect?: lambda.IFunction;\n\n /**\n * Single Lambda handler for all routes.\n * Alternative to providing separate connect/disconnect/default handlers.\n * The handler receives routeKey in the context to determine which route was invoked.\n */\n handler?: lambda.IFunction;\n\n /**\n * The domain name for the WebSocket API.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"ws.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @example\n * // Direct string\n * host: \"ws.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { component: \"ws\" }\n */\n host?: string | HostConfig;\n\n /**\n * Log retention for WebSocket API access logs.\n * @default logs.RetentionDays.THREE_MONTHS\n */\n logRetention?: logs.RetentionDays;\n\n /**\n * Construct name (used for resource naming).\n */\n name?: string;\n\n /**\n * Role tag for tagging resources.\n * @default CDK.ROLE.API\n */\n roleTag?: string;\n\n /**\n * Additional named routes beyond $connect, $disconnect, and $default.\n * Keys are route keys (e.g., \"sendMessage\", \"subscribe\").\n */\n routes?: Record<string, lambda.IFunction>;\n\n /**\n * Stage name for the WebSocket API.\n * @default \"production\"\n */\n stageName?: string;\n\n /**\n * Route53 hosted zone for DNS records.\n * - string: Zone domain name (looked up or imported)\n * - IHostedZone: Use provided hosted zone\n */\n zone?: string | route53.IHostedZone;\n}\n\n//\n//\n// Main\n//\n\nexport class JaypieWebSocket extends Construct {\n private readonly _api: apigatewayv2.WebSocketApi;\n private readonly _certificate?: acm.ICertificate;\n private readonly _domainName?: apigatewayv2.DomainName;\n private readonly _host?: string;\n private readonly _stage: apigatewayv2.WebSocketStage;\n\n constructor(scope: Construct, id: string, props: JaypieWebSocketProps = {}) {\n super(scope, id);\n\n const {\n certificate = true,\n connect,\n default: defaultHandler,\n disconnect,\n handler,\n host: propsHost,\n logRetention = logs.RetentionDays.THREE_MONTHS,\n name,\n roleTag = CDK.ROLE.API,\n routes = {},\n stageName = \"production\",\n zone: propsZone,\n } = props;\n\n // Validate: either handler OR individual handlers, not both\n const hasIndividualHandlers = connect || disconnect || defaultHandler;\n if (handler && hasIndividualHandlers) {\n throw new Error(\n \"Cannot specify both 'handler' and individual route handlers (connect/disconnect/default)\",\n );\n }\n\n // Determine zone from props or environment\n let zone = propsZone;\n if (!zone && process.env.CDK_ENV_HOSTED_ZONE) {\n zone = process.env.CDK_ENV_HOSTED_ZONE;\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n host = envHostname(propsHost);\n } else if (process.env.CDK_ENV_WS_HOST_NAME) {\n host = process.env.CDK_ENV_WS_HOST_NAME;\n } else if (\n process.env.CDK_ENV_WS_SUBDOMAIN &&\n process.env.CDK_ENV_HOSTED_ZONE\n ) {\n host = mergeDomain(\n process.env.CDK_ENV_WS_SUBDOMAIN,\n process.env.CDK_ENV_HOSTED_ZONE,\n );\n }\n\n const apiName = name || constructEnvName(\"WebSocket\");\n\n // Create WebSocket API\n this._api = new apigatewayv2.WebSocketApi(this, \"Api\", {\n apiName,\n });\n Tags.of(this._api).add(CDK.TAG.ROLE, roleTag);\n\n // Add routes with Lambda integrations\n const connectHandler = handler || connect;\n const disconnectHandler = handler || disconnect;\n const defaultRouteHandler = handler || defaultHandler;\n\n if (connectHandler) {\n this._api.addRoute(\"$connect\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"ConnectIntegration\",\n connectHandler,\n ),\n });\n }\n\n if (disconnectHandler) {\n this._api.addRoute(\"$disconnect\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"DisconnectIntegration\",\n disconnectHandler,\n ),\n });\n }\n\n if (defaultRouteHandler) {\n this._api.addRoute(\"$default\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"DefaultIntegration\",\n defaultRouteHandler,\n ),\n });\n }\n\n // Add custom routes\n for (const [routeKey, routeHandler] of Object.entries(routes)) {\n this._api.addRoute(routeKey, {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n `${routeKey}Integration`,\n routeHandler,\n ),\n });\n }\n\n // Create log group for access logs\n // Note: logGroup is created for future use when API Gateway v2 WebSocket\n // access logging is fully supported in CDK\n new logs.LogGroup(this, \"AccessLogs\", {\n removalPolicy: RemovalPolicy.DESTROY,\n retention: logRetention,\n });\n\n // Create stage\n this._stage = new apigatewayv2.WebSocketStage(this, \"Stage\", {\n autoDeploy: true,\n stageName,\n webSocketApi: this._api,\n });\n Tags.of(this._stage).add(CDK.TAG.ROLE, roleTag);\n\n // Set up custom domain if host and zone are provided\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse)\n certificateToUse = resolveCertificate(this, {\n certificate,\n domainName: host,\n roleTag: CDK.ROLE.HOSTING,\n zone: hostedZone,\n });\n\n this._certificate = certificateToUse;\n this._host = host;\n\n if (certificateToUse) {\n // Create custom domain\n this._domainName = new apigatewayv2.DomainName(this, \"DomainName\", {\n certificate: certificateToUse,\n domainName: host,\n });\n Tags.of(this._domainName).add(CDK.TAG.ROLE, roleTag);\n\n // Map domain to stage\n new apigatewayv2.ApiMapping(this, \"ApiMapping\", {\n api: this._api,\n domainName: this._domainName,\n stage: this._stage,\n });\n\n // Create DNS record\n new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayv2DomainProperties(\n this._domainName.regionalDomainName,\n this._domainName.regionalHostedZoneId,\n ),\n ),\n zone: hostedZone,\n });\n\n // Also create AAAA record for IPv6\n new route53.AaaaRecord(this, \"AaaaAliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayv2DomainProperties(\n this._domainName.regionalDomainName,\n this._domainName.regionalHostedZoneId,\n ),\n ),\n zone: hostedZone,\n });\n }\n }\n\n // Grant all handlers permission to manage connections\n const allHandlers = new Set<lambda.IFunction>();\n if (connectHandler) allHandlers.add(connectHandler);\n if (disconnectHandler) allHandlers.add(disconnectHandler);\n if (defaultRouteHandler) allHandlers.add(defaultRouteHandler);\n Object.values(routes).forEach((h) => allHandlers.add(h));\n\n for (const lambdaHandler of allHandlers) {\n this.grantManageConnections(lambdaHandler);\n }\n }\n\n //\n //\n // Public accessors\n //\n\n public get api(): apigatewayv2.WebSocketApi {\n return this._api;\n }\n\n public get apiId(): string {\n return this._api.apiId;\n }\n\n public get certificate(): acm.ICertificate | undefined {\n return this._certificate;\n }\n\n public get domainName(): string | undefined {\n return this._domainName?.name;\n }\n\n /**\n * The WebSocket endpoint URL.\n * Uses custom domain if configured, otherwise returns the default stage URL.\n */\n public get endpoint(): string {\n if (this._host) {\n return `wss://${this._host}`;\n }\n return this._stage.url;\n }\n\n public get host(): string | undefined {\n return this._host;\n }\n\n public get stage(): apigatewayv2.WebSocketStage {\n return this._stage;\n }\n\n /**\n * The callback URL for API Gateway Management API.\n * Use this URL to send messages to connected clients.\n */\n public get callbackUrl(): string {\n if (this._host) {\n return `https://${this._host}`;\n }\n // Extract callback URL from stage URL\n // Stage URL: wss://abc123.execute-api.us-east-1.amazonaws.com/production\n // Callback URL: https://abc123.execute-api.us-east-1.amazonaws.com/production\n return this._stage.url.replace(\"wss://\", \"https://\");\n }\n\n //\n //\n // Public methods\n //\n\n /**\n * Grant a Lambda function permission to manage WebSocket connections\n * (post to connections, delete connections).\n */\n public grantManageConnections(grantee: lambda.IFunction): iam.Grant {\n return iam.Grant.addToPrincipal({\n actions: [\"execute-api:ManageConnections\"],\n grantee: grantee.grantPrincipal,\n resourceArns: [\n Stack.of(this).formatArn({\n arnFormat: ArnFormat.SLASH_RESOURCE_SLASH_RESOURCE_NAME,\n resource: this._api.apiId,\n resourceName: `${this._stage.stageName}/*`,\n service: \"execute-api\",\n }),\n ],\n });\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration } from \"aws-cdk-lib\";\n\nimport { CDK } from \"./constants\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\n/**\n * JaypieWebSocketLambda - A Lambda function optimized for WebSocket handlers.\n *\n * Provides sensible defaults for WebSocket event handling:\n * - 30 second timeout (same as API handlers)\n * - API role tag\n *\n * @example\n * ```typescript\n * const handler = new JaypieWebSocketLambda(this, \"ChatHandler\", {\n * code: \"dist/handlers\",\n * handler: \"chat.handler\",\n * secrets: [\"MONGODB_URI\"],\n * });\n *\n * new JaypieWebSocket(this, \"Chat\", {\n * host: \"ws.example.com\",\n * handler,\n * });\n * ```\n */\nexport class JaypieWebSocketLambda extends JaypieLambda {\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id, {\n roleTag: CDK.ROLE.API,\n timeout: Duration.seconds(CDK.DURATION.EXPRESS_API),\n ...props,\n });\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\n\nimport { CDK } from \"./constants\";\nimport { constructEnvName } from \"./helpers\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieWebSocketTableProps {\n /**\n * Explicit table name. If not provided, uses CDK-generated name.\n */\n tableName?: string;\n\n /**\n * Time-to-live duration for connections.\n * Connections will be automatically deleted after this duration.\n * @default Duration.hours(24)\n */\n ttl?: Duration;\n\n /**\n * Whether to create a GSI for looking up connections by user ID.\n * @default false\n */\n userIndex?: boolean;\n\n /**\n * Role tag for tagging resources.\n * @default CDK.ROLE.STORAGE\n */\n roleTag?: string;\n}\n\n//\n//\n// Main\n//\n\n/**\n * JaypieWebSocketTable - DynamoDB table for storing WebSocket connection IDs.\n *\n * Provides a simple table structure for tracking active WebSocket connections:\n * - Partition key: connectionId (String)\n * - TTL attribute: expiresAt (for automatic cleanup)\n * - Optional GSI: userId-index (for looking up connections by user)\n *\n * @example\n * ```typescript\n * const connectionTable = new JaypieWebSocketTable(this, \"Connections\");\n *\n * const ws = new JaypieWebSocket(this, \"Chat\", {\n * host: \"ws.example.com\",\n * handler: chatHandler,\n * });\n *\n * // Grant Lambda access to the table\n * connectionTable.grantReadWriteData(chatHandler);\n *\n * // Pass table name to Lambda\n * chatHandler.addEnvironment(\"CONNECTION_TABLE\", connectionTable.tableName);\n * ```\n *\n * @example\n * // With user index for looking up all connections for a user\n * const connectionTable = new JaypieWebSocketTable(this, \"Connections\", {\n * userIndex: true,\n * ttl: Duration.hours(12),\n * });\n */\nexport class JaypieWebSocketTable extends Construct {\n private readonly _table: dynamodb.TableV2;\n private readonly _ttlDuration: Duration;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieWebSocketTableProps = {},\n ) {\n super(scope, id);\n\n const {\n roleTag = CDK.ROLE.STORAGE,\n tableName,\n ttl = Duration.hours(24),\n userIndex = false,\n } = props;\n\n this._ttlDuration = ttl;\n\n // Build global secondary indexes\n const globalSecondaryIndexes: dynamodb.GlobalSecondaryIndexPropsV2[] = [];\n\n if (userIndex) {\n globalSecondaryIndexes.push({\n indexName: \"userId-index\",\n partitionKey: { name: \"userId\", type: dynamodb.AttributeType.STRING },\n sortKey: { name: \"connectedAt\", type: dynamodb.AttributeType.STRING },\n });\n }\n\n // Create the table\n this._table = new dynamodb.TableV2(this, \"Table\", {\n billing: dynamodb.Billing.onDemand(),\n globalSecondaryIndexes:\n globalSecondaryIndexes.length > 0 ? globalSecondaryIndexes : undefined,\n partitionKey: {\n name: \"connectionId\",\n type: dynamodb.AttributeType.STRING,\n },\n removalPolicy: RemovalPolicy.DESTROY,\n tableName: tableName || constructEnvName(\"WebSocketConnections\"),\n timeToLiveAttribute: \"expiresAt\",\n });\n\n Tags.of(this._table).add(CDK.TAG.ROLE, roleTag);\n }\n\n //\n //\n // Public accessors\n //\n\n /**\n * The underlying DynamoDB TableV2 construct.\n */\n public get table(): dynamodb.TableV2 {\n return this._table;\n }\n\n /**\n * The name of the DynamoDB table.\n */\n public get tableName(): string {\n return this._table.tableName;\n }\n\n /**\n * The ARN of the DynamoDB table.\n */\n public get tableArn(): string {\n return this._table.tableArn;\n }\n\n /**\n * TTL duration for connections in seconds.\n * Use this to calculate expiresAt when storing connections.\n */\n public get ttlSeconds(): number {\n return this._ttlDuration.toSeconds();\n }\n\n //\n //\n // Grant methods\n //\n\n /**\n * Grant read permissions to the table.\n */\n public grantReadData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantReadData(grantee);\n }\n\n /**\n * Grant write permissions to the table.\n */\n public grantWriteData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantWriteData(grantee);\n }\n\n /**\n * Grant read and write permissions to the table.\n */\n public grantReadWriteData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantReadWriteData(grantee);\n }\n\n //\n //\n // Convenience methods\n //\n\n /**\n * Add the table name to a Lambda function's environment variables.\n * Also grants read/write access to the table.\n */\n public connectLambda(\n lambdaFunction: lambda.IFunction,\n options: { envKey?: string; readOnly?: boolean } = {},\n ): void {\n const { envKey = \"CONNECTION_TABLE\", readOnly = false } = options;\n\n // Add environment variable\n if (\"addEnvironment\" in lambdaFunction) {\n (lambdaFunction as lambda.Function).addEnvironment(\n envKey,\n this.tableName,\n );\n }\n\n // Grant permissions\n if (readOnly) {\n this.grantReadData(lambdaFunction.grantPrincipal);\n } else {\n this.grantReadWriteData(lambdaFunction.grantPrincipal);\n }\n }\n}\n"],"names":["CDK","Construct","Bucket","BucketAccessControl","cdk","StorageClass","secretsmanager","DatadogLambda","Tags","ConfigurationError","Role","PolicyStatement","Policy","acm","Stack","validPart","isValidHostname","DEFAULT_FUNCTION_NAME","lambda","logDestinations","route53","checkEnvIsConsumer","checkEnvIsProvider","cleanName","exportEnvName","Fn","CfnOutput","SecretValue","apiGateway","route53Targets","Duration","logs","RemovalPolicy","sqs","lambdaEventSources","s3","s3n","CfnStack","Rule","LambdaFunction","RuleTargetInput","origins","cloudfront","LambdaDestination","ARecord","RecordTarget","CnameRecord","MxRecord","NsRecord","TxtRecord","generateIndexName","DEFAULT_SORT_KEY","dynamodb","DEFAULT_INDEXES","FederatedPrincipal","Effect","LogGroup","RetentionDays","ServicePrincipal","FilterPattern","HostedZone","path","Nextjs","EventType","Trail","ReadWriteType","CfnPermissionSet","ManagedPolicy","CfnAssignment","CfnApplication","apigatewayv2","apigatewayv2Integrations","iam","ArnFormat"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/constants.ts","../../../src/JaypieAccountLoggingBucket.ts","../../../src/helpers/addDatadogLayers.ts","../../../src/helpers/constructEnvName.ts","../../../src/helpers/constructStackName.ts","../../../src/helpers/constructTagger.ts","../../../src/helpers/envHostname.ts","../../../src/helpers/extendDatadogRole.ts","../../../src/helpers/resolveCertificate.ts","../../../src/helpers/isEnv.ts","../../../src/helpers/isValidHostname.ts","../../../src/helpers/isValidSubdomain.ts","../../../src/helpers/jaypieLambdaEnv.ts","../../../src/helpers/mergeDomain.ts","../../../src/helpers/resolveDatadogForwarderFunction.ts","../../../src/helpers/resolveDatadogLayers.ts","../../../src/helpers/resolveDatadogLoggingDestination.ts","../../../src/helpers/resolveEnvironment.ts","../../../src/helpers/resolveHostedZone.ts","../../../src/helpers/resolveParamsAndSecrets.ts","../../../src/JaypieEnvSecret.ts","../../../src/helpers/resolveSecrets.ts","../../../src/JaypieApiGateway.ts","../../../src/JaypieStack.ts","../../../src/JaypieAppStack.ts","../../../src/JaypieLambda.ts","../../../src/JaypieQueuedLambda.ts","../../../src/JaypieBucketQueuedLambda.ts","../../../src/JaypieCertificate.ts","../../../src/JaypieDatadogBucket.ts","../../../src/JaypieDatadogForwarder.ts","../../../src/JaypieDatadogSecret.ts","../../../src/JaypieDistribution.ts","../../../src/JaypieDnsRecord.ts","../../../src/JaypieDynamoDb.ts","../../../src/JaypieEventsRule.ts","../../../src/JaypieExpressLambda.ts","../../../src/JaypieGitHubDeployRole.ts","../../../src/JaypieHostedZone.ts","../../../src/JaypieInfrastructureStack.ts","../../../src/JaypieMongoDbSecret.ts","../../../src/JaypieNextJs.ts","../../../src/JaypieOpenAiSecret.ts","../../../src/JaypieOrganizationTrail.ts","../../../src/JaypieSsoPermissions.ts","../../../src/JaypieSsoSyncApplication.ts","../../../src/JaypieWebDeploymentBucket.ts","../../../src/JaypieStaticWebBucket.ts","../../../src/JaypieTraceSigningKeySecret.ts","../../../src/JaypieWebSocket.ts","../../../src/JaypieWebSocketLambda.ts","../../../src/JaypieWebSocketTable.ts"],"sourcesContent":["export const CDK = {\n ACCOUNT: {\n DEVELOPMENT: \"development\",\n MANAGEMENT: \"management\",\n OPERATIONS: \"operations\",\n PRODUCTION: \"production\",\n SANDBOX: \"sandbox\",\n SECURITY: \"security\",\n STAGE: \"stage\",\n },\n BUILD: {\n CONFIG: {\n ALL: \"all\",\n API: \"api\",\n INFRASTRUCTURE: \"infrastructure\",\n NONE: \"none\",\n WEB: \"web\",\n },\n PERSONAL: \"personal\",\n /**\n * @deprecated rename \"ephemeral\" to \"personal\" (since 2/24/2025)\n */\n EPHEMERAL: \"ephemeral\",\n /**\n * @deprecated as even \"ephemeral\" builds have static assets (since 7/6/2024)\n */\n STATIC: \"static\",\n },\n CREATION: {\n CDK: \"cdk\",\n CLOUDFORMATION_TEMPLATE: \"template\",\n MANUAL: \"manual\",\n },\n DATADOG: {\n SITE: \"datadoghq.com\",\n LAYER: {\n // https://docs.datadoghq.com/meta/latest-lambda-layer-version.json\n NODE: 131, // 127 on 9/12/2025\n EXTENSION: 86, // 86 on 9/12/2025\n },\n },\n DEFAULT: {\n REGION: \"us-east-1\",\n },\n DNS: {\n CONFIG: {\n TTL: 300, // 5 minutes in seconds for Route53\n },\n RECORD: {\n A: \"A\",\n CNAME: \"CNAME\",\n MX: \"MX\",\n NS: \"NS\",\n TXT: \"TXT\",\n },\n },\n DURATION: {\n EXPRESS_API: 30,\n CLOUDFRONT_API: 120,\n LAMBDA_MAXIMUM: 900,\n LAMBDA_WORKER: 900,\n },\n ENV: {\n DEMO: \"demo\", // Mirror of production\n DEVELOPMENT: \"development\", // Internal most stable development space\n /** @deprecated */ EPHEMERAL: \"ephemeral\", // Alias for \"build\"\n LOCAL: \"local\",\n /** @deprecated */ MAIN: \"main\", // Alias for development\n META: \"meta\", // For non-environment/infrastructure stacks\n PERSONAL: \"personal\", // Personal builds using resources provided by sandbox\n PREVIEW: \"preview\", // External next thing to be released\n PRODUCTION: \"production\",\n RELEASE: \"release\", // Internal next thing to be released\n REVIEW: \"review\", // Internal place to collaborate on issues\n SANDBOX: \"sandbox\", // Internal build space with no guaranteed longevity\n TRAINING: \"training\", // aka \"test\"; mirror of production for external audiences\n },\n HOST: {\n APEX: \"@\",\n },\n IMPORT: {\n DATADOG_LOG_FORWARDER: \"account-datadog-forwarder\",\n DATADOG_ROLE: \"account-datadog-role\",\n DATADOG_SECRET: \"account-datadog-secret\",\n LOG_BUCKET: \"account-log-bucket\",\n OIDC_PROVIDER: \"github-oidc-provider\",\n },\n LAMBDA: {\n LOG_RETENTION: 90,\n MEMORY_SIZE: 1024,\n },\n PRINCIPAL: {\n ROUTE53: \"route53.amazonaws.com\",\n },\n PRINCIPAL_TYPE: {\n GROUP: \"GROUP\",\n USER: \"USER\",\n },\n PROJECT: {\n INFRASTRUCTURE: \"infrastructure\",\n },\n ROLE: {\n API: \"api\",\n DEPLOY: \"deploy\",\n HOSTING: \"hosting\",\n MONITORING: \"monitoring\",\n NETWORKING: \"networking\",\n PROCESSING: \"processing\",\n SECURITY: \"security\",\n STACK: \"stack\",\n STORAGE: \"storage\",\n TOY: \"toy\",\n },\n SERVICE: {\n DATADOG: \"datadog\",\n INFRASTRUCTURE: \"infrastructure\",\n LIBRARIES: \"libraries\",\n NONE: \"none\",\n SSO: \"sso\",\n TRACE: \"trace\",\n },\n TAG: {\n BUILD_DATE: \"buildDate\",\n BUILD_HEX: \"buildHex\",\n BUILD_NUMBER: \"buildNumber\",\n BUILD_TIME: \"buildTime\",\n BUILD_TYPE: \"buildType\",\n COMMIT: \"commit\",\n CREATION: \"creation\",\n ENV: \"env\",\n NONCE: \"nonce\",\n PROJECT: \"project\",\n ROLE: \"role\",\n SERVICE: \"service\",\n SPONSOR: \"sponsor\",\n STACK: \"stack\",\n STACK_SHA: \"stackSha\",\n VENDOR: \"vendor\",\n VERSION: \"version\",\n },\n TARGET_TYPE: {\n AWS_ACCOUNT: \"AWS_ACCOUNT\",\n },\n VENDOR: {\n ANTHROPIC: \"anthropic\",\n AUTH0: \"auth0\",\n DATADOG: \"datadog\",\n KNOWTRACE: \"knowtrace\",\n MONGODB: \"mongodb\",\n OPENAI: \"openai\",\n SPLINTERLANDS: \"splinterlands\",\n },\n};\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport {\n Bucket,\n BucketAccessControl,\n BucketProps,\n IBucket,\n StorageClass,\n} from \"aws-cdk-lib/aws-s3\";\nimport { Construct } from \"constructs\";\n\nexport interface JaypieAccountLoggingBucketProps extends BucketProps {\n /**\n * Optional construct ID\n * @default \"AccountLoggingBucket\"\n */\n id?: string;\n\n /**\n * Bucket name\n * @default `account-logging-stack-${PROJECT_NONCE}`\n */\n bucketName?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Number of days before logs expire\n * @default 365\n */\n expirationDays?: number;\n\n /**\n * Number of days before transitioning to INFREQUENT_ACCESS storage\n * @default 30\n */\n infrequentAccessTransitionDays?: number;\n\n /**\n * Number of days before transitioning to GLACIER storage\n * @default 180\n */\n glacierTransitionDays?: number;\n\n /**\n * Whether to create CloudFormation output for bucket name\n * @default true\n */\n createOutput?: boolean;\n\n /**\n * Custom export name for the bucket name output\n * @default CDK.IMPORT.LOG_BUCKET\n */\n exportName?: string;\n\n /**\n * Description for the CloudFormation output\n * @default \"Account-wide logging bucket\"\n */\n outputDescription?: string;\n}\n\nexport class JaypieAccountLoggingBucket extends Construct {\n public readonly bucket: IBucket;\n\n /**\n * Create a new account-wide logging S3 bucket with lifecycle policies and export\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieAccountLoggingBucketProps,\n propsOrUndefined?: JaypieAccountLoggingBucketProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieAccountLoggingBucketProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"AccountLoggingBucket\";\n }\n\n super(scope, id);\n\n // Generate default bucket name with PROJECT_NONCE\n const defaultBucketName = process.env.PROJECT_NONCE\n ? `account-logging-stack-${process.env.PROJECT_NONCE.toLowerCase()}`\n : \"account-logging-stack\";\n\n // Extract Jaypie-specific options\n\n const {\n bucketName = defaultBucketName,\n createOutput = true,\n expirationDays = 365,\n exportName = CDK.IMPORT.LOG_BUCKET,\n glacierTransitionDays = 180,\n id: _id,\n infrequentAccessTransitionDays = 30,\n outputDescription = \"Account-wide logging bucket\",\n project,\n service = CDK.SERVICE.INFRASTRUCTURE,\n ...bucketProps\n } = props;\n\n // Create the bucket with lifecycle rules\n this.bucket = new Bucket(this, \"Bucket\", {\n accessControl: BucketAccessControl.LOG_DELIVERY_WRITE,\n bucketName,\n lifecycleRules: [\n {\n expiration: cdk.Duration.days(expirationDays),\n transitions: [\n {\n storageClass: StorageClass.INFREQUENT_ACCESS,\n transitionAfter: cdk.Duration.days(\n infrequentAccessTransitionDays,\n ),\n },\n {\n storageClass: StorageClass.GLACIER,\n transitionAfter: cdk.Duration.days(glacierTransitionDays),\n },\n ],\n },\n ],\n ...bucketProps,\n });\n\n // Add tags\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (service) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n }\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Create CloudFormation output if enabled\n if (createOutput) {\n new cdk.CfnOutput(this, \"BucketNameOutput\", {\n description: outputDescription,\n exportName,\n value: this.bucket.bucketName,\n });\n }\n }\n}\n","import * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { CDK } from \"../constants\";\nimport { DatadogLambda } from \"datadog-cdk-constructs-v2\";\n\nexport interface AddDatadogLayerOptions {\n datadogApiKeyArn?: string;\n}\n\nexport function addDatadogLayers(\n lambdaFunction: lambda.Function,\n options: AddDatadogLayerOptions = {},\n): boolean {\n const datadogApiKeyArn = options?.datadogApiKeyArn;\n\n const resolvedDatadogApiKeyArn =\n datadogApiKeyArn ||\n process.env.DATADOG_API_KEY_ARN ||\n process.env.CDK_ENV_DATADOG_API_KEY_ARN;\n if (!resolvedDatadogApiKeyArn) {\n return false;\n }\n\n // Define Datadog environment variables\n const datadogEnvVars = {\n DD_API_KEY_SECRET_ARN: resolvedDatadogApiKeyArn,\n DD_ENHANCED_METRICS: \"true\",\n DD_ENV: process.env.PROJECT_ENV || \"\",\n DD_PROFILING_ENABLED: \"false\",\n DD_SERVERLESS_APPSEC_ENABLED: \"false\",\n DD_SERVICE: process.env.PROJECT_SERVICE || \"\",\n DD_SITE: CDK.DATADOG.SITE,\n DD_TAGS: `${CDK.TAG.SPONSOR}:${process.env.PROJECT_SPONSOR || \"\"}`,\n DD_TRACE_OTEL_ENABLED: \"false\",\n };\n\n // Add environment variables only if they don't already exist\n Object.entries(datadogEnvVars).forEach(([key, value]) => {\n lambdaFunction.addEnvironment(key, value);\n });\n\n const datadogApiKeySecret: secretsmanager.ISecret =\n secretsmanager.Secret.fromSecretCompleteArn(\n lambdaFunction,\n \"DatadogApiKey\",\n resolvedDatadogApiKeyArn,\n );\n const datadogLambda = new DatadogLambda(lambdaFunction, \"DatadogLambda\", {\n apiKeySecret: datadogApiKeySecret, // apiKeySecret auto-grants secret access to the added lambdas\n nodeLayerVersion: CDK.DATADOG.LAYER.NODE,\n extensionLayerVersion: CDK.DATADOG.LAYER.EXTENSION,\n env: process.env.PROJECT_ENV,\n service: process.env.PROJECT_SERVICE,\n version: process.env.PROJECT_VERSION,\n });\n datadogLambda.addLambdaFunctions([lambdaFunction]);\n\n return true;\n}\n","export function constructEnvName(\n name: string,\n opts?: { env?: string; key?: string; nonce?: string },\n) {\n const env = opts?.env ?? process.env.PROJECT_ENV ?? \"build\";\n const key = opts?.key ?? process.env.PROJECT_KEY ?? \"project\";\n const nonce = opts?.nonce ?? process.env.PROJECT_NONCE ?? \"cfe2\"; // This default is intentionally short. It is not a special value but should not be changed.\n return `${env}-${key}-${name}-${nonce}`;\n}\n","export function constructStackName(key?: string): string {\n if (!key) {\n return `cdk-${process.env.PROJECT_SPONSOR}-${process.env.PROJECT_KEY}-${process.env.PROJECT_ENV}-${process.env.PROJECT_NONCE}`;\n } else {\n return `cdk-${process.env.PROJECT_SPONSOR}-${process.env.PROJECT_KEY}-${process.env.PROJECT_ENV}-${process.env.PROJECT_NONCE}-${key}`;\n }\n}\n","import { Construct } from \"constructs\";\nimport { Tags } from \"aws-cdk-lib\";\nimport { constructStackName } from \"./constructStackName\";\n\nconst CDK = {\n CREATION: {\n CDK: \"cdk\",\n },\n ROLE: {\n STACK: \"stack\",\n },\n TAG: {\n BUILD_DATE: \"buildDate\",\n BUILD_HEX: \"buildHex\",\n BUILD_TIME: \"buildTime\",\n COMMIT: \"commit\",\n CREATION: \"creation\",\n ENV: \"env\",\n NONCE: \"nonce\",\n PROJECT: \"project\",\n ROLE: \"role\",\n SERVICE: \"service\",\n SPONSOR: \"sponsor\",\n STACK: \"stack\",\n STACK_SHA: \"stackSha\",\n VERSION: \"version\",\n },\n};\n\nexport function constructTagger(\n construct: Construct,\n { name }: { name?: string } = {},\n): boolean {\n const stackName = name || constructStackName();\n const version =\n process.env.npm_package_version || process.env.PROJECT_VERSION || null;\n\n if (process.env.PROJECT_COMMIT && process.env.PROJECT_COMMIT.length > 8) {\n Tags.of(construct).add(\n CDK.TAG.BUILD_HEX,\n process.env.PROJECT_COMMIT.slice(0, 8),\n );\n }\n Tags.of(construct).add(CDK.TAG.BUILD_DATE, new Date().toISOString());\n Tags.of(construct).add(CDK.TAG.BUILD_TIME, Date.now().toString());\n if (process.env.PROJECT_COMMIT)\n Tags.of(construct).add(CDK.TAG.COMMIT, process.env.PROJECT_COMMIT);\n Tags.of(construct).add(CDK.TAG.CREATION, CDK.CREATION.CDK);\n if (process.env.PROJECT_ENV)\n Tags.of(construct).add(CDK.TAG.ENV, process.env.PROJECT_ENV);\n if (process.env.PROJECT_NONCE)\n Tags.of(construct).add(CDK.TAG.NONCE, process.env.PROJECT_NONCE);\n if (process.env.PROJECT_KEY)\n Tags.of(construct).add(CDK.TAG.PROJECT, process.env.PROJECT_KEY);\n Tags.of(construct).add(CDK.TAG.ROLE, CDK.ROLE.STACK);\n if (process.env.PROJECT_SERVICE)\n Tags.of(construct).add(CDK.TAG.SERVICE, process.env.PROJECT_SERVICE);\n if (process.env.PROJECT_SPONSOR)\n Tags.of(construct).add(CDK.TAG.SPONSOR, process.env.PROJECT_SPONSOR);\n if (stackName) Tags.of(construct).add(CDK.TAG.STACK, stackName);\n if (version) Tags.of(construct).add(CDK.TAG.VERSION, version);\n\n return true;\n}\n","import { ConfigurationError } from \"@jaypie/errors\";\nimport { CDK } from \"../constants\";\n\n/**\n * Configuration for resolving a hostname from parts.\n * Used by envHostname() to construct domain names from environment and config.\n */\nexport interface HostConfig {\n component?: string;\n domain?: string;\n env?: string;\n subdomain?: string;\n}\n\nexport function envHostname({\n component,\n domain,\n env,\n subdomain,\n}: HostConfig = {}) {\n const resolvedDomain =\n domain || process.env.CDK_ENV_DOMAIN || process.env.CDK_ENV_HOSTED_ZONE;\n\n if (!resolvedDomain) {\n throw new ConfigurationError(\n \"No hostname `domain` provided. Set CDK_ENV_DOMAIN or CDK_ENV_HOSTED_ZONE to use environment domain\",\n );\n }\n\n const resolvedComponent =\n component === \"@\" || component === \"\" ? undefined : component;\n const providedSubdomain =\n subdomain === \"@\" || subdomain === \"\" ? undefined : subdomain;\n const resolvedSubdomain = providedSubdomain || process.env.CDK_ENV_SUBDOMAIN;\n const resolvedEnv = env || process.env.PROJECT_ENV;\n const filteredEnv =\n resolvedEnv === CDK.ENV.PRODUCTION ? undefined : resolvedEnv;\n\n // Check if parts are already contained in the domain to avoid duplication\n const domainParts = resolvedDomain.split(\".\");\n\n const isPartInDomain = (part: string | undefined): boolean => {\n if (!part) return false;\n return domainParts.includes(part);\n };\n\n const parts = [\n isPartInDomain(resolvedComponent) ? undefined : resolvedComponent,\n isPartInDomain(resolvedSubdomain) ? undefined : resolvedSubdomain,\n isPartInDomain(filteredEnv) ? undefined : filteredEnv,\n resolvedDomain,\n ].filter((part) => part);\n\n return parts.join(\".\");\n}\n","import { CDK } from \"../constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Policy, PolicyStatement, Role } from \"aws-cdk-lib/aws-iam\";\nimport { Construct } from \"constructs\";\n\nexport interface ExtendDatadogRoleOptions {\n /**\n * Optional construct ID for the policy\n * @default \"DatadogCustomPolicy\"\n */\n id?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n}\n\n/**\n * Extends the Datadog IAM role with additional permissions\n *\n * Checks for CDK_ENV_DATADOG_ROLE_ARN environment variable.\n * If found, creates a custom policy with:\n * - budgets:ViewBudget\n * - logs:DescribeLogGroups\n *\n * @param scope - The construct scope\n * @param options - Configuration options\n * @returns The created Policy, or undefined if CDK_ENV_DATADOG_ROLE_ARN is not set\n */\nexport function extendDatadogRole(\n scope: Construct,\n options?: ExtendDatadogRoleOptions,\n): Policy | undefined {\n const datadogRoleArn = process.env.CDK_ENV_DATADOG_ROLE_ARN;\n\n // Early return if no Datadog role ARN is configured\n if (!datadogRoleArn) {\n return undefined;\n }\n\n const {\n id = \"DatadogCustomPolicy\",\n project,\n service = CDK.SERVICE.DATADOG,\n } = options || {};\n\n // Lookup the Datadog role\n const datadogRole = Role.fromRoleArn(scope, \"DatadogRole\", datadogRoleArn);\n\n // Build policy statements\n const statements: PolicyStatement[] = [\n // Allow view budget\n new PolicyStatement({\n actions: [\"budgets:ViewBudget\"],\n resources: [\"*\"],\n }),\n // Allow describe log groups\n new PolicyStatement({\n actions: [\"logs:DescribeLogGroups\"],\n resources: [\"*\"],\n }),\n ];\n\n // Create the custom policy\n const datadogCustomPolicy = new Policy(scope, id, {\n roles: [datadogRole],\n statements,\n });\n\n // Add tags\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(datadogCustomPolicy).add(CDK.TAG.PROJECT, project);\n }\n\n return datadogCustomPolicy;\n}\n","import { Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"../constants\";\n\n// Cache: Stack -> (domain -> certificate)\n// Using WeakMap for automatic garbage collection when stacks are destroyed\nconst certificateCache = new WeakMap<Stack, Map<string, acm.ICertificate>>();\n\nexport interface ResolveCertificateOptions {\n /** Certificate input - true creates at stack level, false skips, ICertificate uses as-is, string imports from ARN */\n certificate?: boolean | acm.ICertificate | string;\n /** Domain name for the certificate (required if certificate is true) */\n domainName: string;\n /** Construct ID name prefix (defaults to \"Certificate\") */\n name?: string;\n /** Role tag for tagging (defaults to CDK.ROLE.API) */\n roleTag?: string;\n /** Hosted zone for DNS validation (required if certificate is true) */\n zone: route53.IHostedZone;\n}\n\n/**\n * Resolves a certificate based on input type.\n *\n * Key behavior: When certificate is `true`, the certificate is created at the\n * STACK level (not construct level) and cached by domain name. This allows\n * swapping between constructs (e.g., JaypieDistribution to JaypieApiGateway)\n * without recreating the certificate.\n *\n * @param scope - The construct scope (used to find the stack)\n * @param options - Certificate resolution options\n * @returns The resolved certificate, or undefined if certificate is false\n *\n * @example\n * // Create or get cached certificate at stack level\n * const cert = resolveCertificate(this, {\n * certificate: true,\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n *\n * @example\n * // Use existing certificate\n * const cert = resolveCertificate(this, {\n * certificate: existingCert,\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n *\n * @example\n * // Import certificate from ARN\n * const cert = resolveCertificate(this, {\n * certificate: \"arn:aws:acm:us-east-1:123456789:certificate/abc-123\",\n * domainName: \"api.example.com\",\n * zone: hostedZone,\n * });\n */\nexport function resolveCertificate(\n scope: Construct,\n options: ResolveCertificateOptions,\n): acm.ICertificate | undefined {\n const {\n certificate,\n domainName,\n name = \"Certificate\",\n roleTag = CDK.ROLE.API,\n zone,\n } = options;\n\n // false = no certificate\n if (certificate === false) {\n return undefined;\n }\n\n // ICertificate passed directly - use as-is\n if (typeof certificate === \"object\" && certificate !== null) {\n return certificate;\n }\n\n // ARN string - import from ARN\n if (typeof certificate === \"string\") {\n // Sanitize domain for construct ID\n const sanitizedDomain = sanitizeDomainForId(domainName);\n return acm.Certificate.fromCertificateArn(\n scope,\n `${name}-${sanitizedDomain}`,\n certificate,\n );\n }\n\n // true (default) = create at STACK level with caching\n const stack = Stack.of(scope);\n\n // Get or create cache for this stack\n let stackCache = certificateCache.get(stack);\n if (!stackCache) {\n stackCache = new Map<string, acm.ICertificate>();\n certificateCache.set(stack, stackCache);\n }\n\n // Return cached certificate if one exists for this domain\n const cached = stackCache.get(domainName);\n if (cached) {\n return cached;\n }\n\n // Create certificate at STACK level (not construct level!)\n // This is the key difference - the certificate's lifecycle is tied to the stack,\n // not to the individual construct that requested it\n const sanitizedDomain = sanitizeDomainForId(domainName);\n const cert = new acm.Certificate(stack, `${name}-${sanitizedDomain}`, {\n domainName,\n validation: acm.CertificateValidation.fromDns(zone),\n });\n Tags.of(cert).add(CDK.TAG.ROLE, roleTag);\n\n // Cache for future requests\n stackCache.set(domainName, cert);\n\n return cert;\n}\n\n/**\n * Sanitizes a domain name for use in CDK construct IDs.\n * CDK construct IDs can only contain alphanumeric characters and hyphens.\n */\nfunction sanitizeDomainForId(domain: string): string {\n return domain.replace(/\\./g, \"-\").replace(/[^a-zA-Z0-9-]/g, \"\");\n}\n\n/**\n * Clears the certificate cache for a specific stack.\n * Primarily useful for testing.\n */\nexport function clearCertificateCache(stack: Stack): void {\n certificateCache.delete(stack);\n}\n\n/**\n * Clears all certificate caches.\n * Primarily useful for testing.\n */\nexport function clearAllCertificateCaches(): void {\n // WeakMap doesn't have a clear() method, so we create a new one\n // This is a no-op since we can't actually clear a WeakMap,\n // but stacks going out of scope will be garbage collected anyway\n}\n","import { CDK } from \"../constants\";\n\n/**\n * Check if the current environment matches the given environment\n */\nexport function isEnv(env: string): boolean {\n return process.env.PROJECT_ENV === env;\n}\n\n/**\n * Check if the current environment is production\n */\nexport function isProductionEnv(): boolean {\n return isEnv(CDK.ENV.PRODUCTION);\n}\n\n/**\n * Check if the current environment is sandbox\n */\nexport function isSandboxEnv(): boolean {\n return isEnv(CDK.ENV.SANDBOX);\n}\n","// In short the RFC 1035 standard for valid hostnames is:\n// 1. Must be less than 253 characters\n// 2. Must start with a letter\n// 3. Must end with a letter or number\n// 4. Can only contain letters, numbers, and hyphens\n// 5. Last part of the domain must be at least 2 characters\n\nfunction validPart(part: string): boolean {\n if (!part.match(/^[a-z]/)) return false;\n if (!part.match(/[a-z0-9]$/)) return false;\n return /^[a-zA-Z0-9-]+$/.test(part);\n}\n\nexport function isValidHostname(hostname: string): boolean {\n // Check hostname is a string\n if (typeof hostname !== \"string\") return false;\n\n // Convert hostname to lowercase\n const check = hostname.toString().toLowerCase();\n\n // Check hostname is less than 253 characters\n if (check.length > 253) return false;\n\n // Split on dots\n const parts = check.split(\".\");\n\n // Check each part is validPart\n const validParts = parts.map(validPart);\n\n // Confirm all parts are valid\n if (!validParts.every((part) => part)) return false;\n\n // Confirm last part is at least 2 characters\n const lastPart = parts[parts.length - 1];\n if (lastPart.length < 2) return false;\n\n // Confirm last part is all letters\n if (!lastPart.match(/^[a-z]+$/)) return false;\n\n // This is a valid hostname\n return true;\n}\n","import { CDK } from \"../constants\";\n\nfunction validPart(part: string): boolean {\n if (!part.match(/^[a-z]/)) return false;\n if (!part.match(/[a-z0-9]$/)) return false;\n return /^[a-zA-Z0-9-]+$/.test(part);\n}\n\nexport function isValidSubdomain(subdomain: string): boolean {\n // Check subdomain is a string\n if (typeof subdomain !== \"string\") return false;\n\n // Special case for apex\n if (subdomain === CDK.HOST.APEX) return true;\n\n // Convert subdomain to lowercase\n const check = subdomain.toString().toLowerCase();\n\n // Check subdomain is less than 250 characters\n // We use 250 instead of 253 because we need to leave room for the dot top-level domain\n if (check.length > 250) return false;\n\n // Split on dots\n const parts = check.split(\".\");\n\n // Check each part is validPart\n const validParts = parts.map(validPart);\n\n // Confirm all parts are valid\n if (!validParts.every((part) => part)) return false;\n\n // Do not care if last part is at least 2 characters\n // Do not care if last part is all letters\n\n // This is a valid subdomain\n return true;\n}\n","export interface JaypieLambdaEnvOptions {\n initialEnvironment?: { [key: string]: string };\n}\n\nexport function jaypieLambdaEnv(options: JaypieLambdaEnvOptions = {}): {\n [key: string]: string;\n} {\n const { initialEnvironment = {} } = options;\n\n // Start with empty environment - we'll only add valid values\n let environment: { [key: string]: string } = {};\n\n // First, add all valid string values from initialEnvironment\n Object.entries(initialEnvironment).forEach(([key, value]) => {\n if (typeof value === \"string\") {\n environment[key] = value;\n }\n });\n\n // Default environment values\n const defaultEnvValues: { [key: string]: string } = {\n AWS_LAMBDA_NODEJS_DISABLE_CALLBACK_WARNING: \"true\",\n };\n\n // Apply default environment values with user overrides\n Object.entries(defaultEnvValues).forEach(([key, defaultValue]) => {\n if (key in initialEnvironment) {\n const userValue = initialEnvironment[key];\n // If user passes a string, it's already added above\n // If user passes non-string falsy value, omit the key\n if (!userValue) {\n delete environment[key];\n }\n // Ignore non-string truthy values (key not added)\n } else {\n // No user override, use default value\n environment[key] = defaultValue;\n }\n });\n\n // Default environment variables from process.env if present\n const defaultEnvVars = [\n \"DATADOG_API_KEY_ARN\",\n \"LOG_LEVEL\",\n \"MODULE_LOGGER\",\n \"MODULE_LOG_LEVEL\",\n \"PROJECT_CHAOS\",\n \"PROJECT_COMMIT\",\n \"PROJECT_ENV\",\n \"PROJECT_KEY\",\n \"PROJECT_SECRET\",\n \"PROJECT_SERVICE\",\n \"PROJECT_SPONSOR\",\n \"PROJECT_VERSION\",\n ];\n\n // Add default environment variables if they exist in process.env\n defaultEnvVars.forEach((envVar) => {\n if (process.env[envVar] && !environment[envVar]) {\n environment[envVar] = process.env[envVar]!;\n }\n });\n\n return environment;\n}\n","import { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"../constants\";\n\nexport function mergeDomain(subDomain: string, hostedZone: string): string {\n if (!hostedZone) {\n throw new ConfigurationError(\"hostedZone is required\");\n }\n if (!subDomain) {\n // Return hostedZone if subDomain is not passed\n // Pass CDK.HOST.APEX to explicitly indicate apex domain\n return hostedZone;\n }\n if (subDomain === CDK.HOST.APEX) {\n return hostedZone;\n }\n return `${subDomain}.${hostedZone}`;\n}\n","import { CDK } from \"../constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nconst DEFAULT_FUNCTION_NAME = \"DatadogForwarderFunction\";\n\n// Cache to store resolved functions\n// Using nested structure to support multiple functions per scope with automatic GC\nconst functionCache = new WeakMap<Construct, Map<string, lambda.IFunction>>();\n\nexport interface ResolveDatadogForwarderFunctionOptions {\n import?: string;\n name?: string;\n}\n\nexport function resolveDatadogForwarderFunction(\n scope: Construct,\n options?: ResolveDatadogForwarderFunctionOptions,\n): lambda.IFunction {\n const { import: importValue, name } = options || {};\n\n const functionName = name || DEFAULT_FUNCTION_NAME;\n const importKey = importValue || CDK.IMPORT.DATADOG_LOG_FORWARDER;\n\n // Create a cache key based on name and import\n const cacheKey = `${functionName}:${importKey}`;\n\n // Get or create scope cache\n let scopeCache = functionCache.get(scope);\n if (!scopeCache) {\n scopeCache = new Map<string, lambda.IFunction>();\n functionCache.set(scope, scopeCache);\n }\n\n // Return cached function if it exists\n const cachedFunction = scopeCache.get(cacheKey);\n if (cachedFunction) {\n return cachedFunction;\n }\n\n // Create and cache the function\n const func = lambda.Function.fromFunctionArn(\n scope,\n functionName,\n cdk.Fn.importValue(importKey),\n );\n scopeCache.set(cacheKey, func);\n\n return func;\n}\n","import { CDK } from \"../constants\";\nimport { Stack } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nexport interface ResolveDatadogLayerOptions {\n datadogApiKeyArn?: string;\n uniqueId?: string;\n}\n\nexport function resolveDatadogLayers(\n scope: Construct,\n options: ResolveDatadogLayerOptions = {},\n): lambda.ILayerVersion[] | undefined {\n const { datadogApiKeyArn, uniqueId } = options;\n\n let resolvedRegion = Stack.of(scope).region || \"us-east-1\";\n\n // Resolve the Datadog API key ARN from multiple sources\n const resolvedDatadogApiKeyArn =\n datadogApiKeyArn ||\n process.env.DATADOG_API_KEY_ARN ||\n process.env.CDK_ENV_DATADOG_API_KEY_ARN;\n\n // Return null if no API key is found\n if (!resolvedDatadogApiKeyArn) {\n return undefined;\n }\n\n const layerIdSuffix =\n uniqueId || process.env.PROJECT_NONCE || Date.now().toString();\n\n // Create Datadog Node.js layer\n const datadogNodeLayer = lambda.LayerVersion.fromLayerVersionArn(\n scope,\n `DatadogNodeLayer-${layerIdSuffix}`,\n `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Node24-x:${CDK.DATADOG.LAYER.NODE}`,\n );\n\n // Create Datadog Extension layer\n const datadogExtensionLayer = lambda.LayerVersion.fromLayerVersionArn(\n scope,\n `DatadogExtensionLayer-${layerIdSuffix}`,\n `arn:aws:lambda:${resolvedRegion}:464622532012:layer:Datadog-Extension:${CDK.DATADOG.LAYER.EXTENSION}`,\n );\n\n return [datadogNodeLayer, datadogExtensionLayer];\n}\n","import { CDK } from \"../constants\";\nimport * as logDestinations from \"aws-cdk-lib/aws-logs-destinations\";\nimport { Construct } from \"constructs\";\n\nimport {\n resolveDatadogForwarderFunction,\n ResolveDatadogForwarderFunctionOptions,\n} from \"./resolveDatadogForwarderFunction\";\n\nconst DEFAULT_FUNCTION_NAME = \"DatadogForwarderFunction\";\n\n// Cache to store resolved logging destinations\n// Using nested structure to support multiple destinations per scope with automatic GC\nconst destinationCache = new WeakMap<\n Construct,\n Map<string, logDestinations.LambdaDestination>\n>();\n\nexport function resolveDatadogLoggingDestination(\n scope: Construct,\n options?: ResolveDatadogForwarderFunctionOptions,\n): logDestinations.LambdaDestination {\n const { import: importValue, name } = options || {};\n\n // Create a cache key based on name and import (same as forwarder function)\n const functionName = name || DEFAULT_FUNCTION_NAME;\n const importKey = importValue || CDK.IMPORT.DATADOG_LOG_FORWARDER;\n const cacheKey = `${functionName}:${importKey}`;\n\n // Get or create scope cache\n let scopeCache = destinationCache.get(scope);\n if (!scopeCache) {\n scopeCache = new Map<string, logDestinations.LambdaDestination>();\n destinationCache.set(scope, scopeCache);\n }\n\n // Return cached destination if it exists\n const cachedDestination = scopeCache.get(cacheKey);\n if (cachedDestination) {\n return cachedDestination;\n }\n\n // Resolve the Datadog forwarder function\n const datadogForwarderFunction = resolveDatadogForwarderFunction(\n scope,\n options,\n );\n\n // Create and cache the logging destination\n const datadogLoggingDestination = new logDestinations.LambdaDestination(\n datadogForwarderFunction,\n );\n scopeCache.set(cacheKey, datadogLoggingDestination);\n\n return datadogLoggingDestination;\n}\n","/**\n * Environment value type for the new array syntax\n * - string: key to lookup in process.env\n * - object: key-value pairs to include directly\n */\nexport type EnvironmentArrayItem = string | { [key: string]: string };\n\n/**\n * Environment type that supports both legacy object syntax and new array syntax\n */\nexport type EnvironmentInput =\n | { [key: string]: string }\n | EnvironmentArrayItem[];\n\n/**\n * Resolves environment input to a plain object.\n *\n * When environment is an object (legacy syntax), returns it as-is.\n * When environment is an array:\n * - Strings are treated as keys to lookup in process.env\n * - Objects have their key-value pairs merged in\n *\n * @example\n * // Legacy object syntax\n * resolveEnvironment({ FOO: \"bar\" })\n * // => { FOO: \"bar\" }\n *\n * @example\n * // Array syntax with process.env lookup\n * // Given process.env.MY_VAR = \"hello\"\n * resolveEnvironment([\"MY_VAR\"])\n * // => { MY_VAR: \"hello\" }\n *\n * @example\n * // Array syntax with objects\n * resolveEnvironment([{ FOO: \"bar\", BAZ: \"qux\" }])\n * // => { FOO: \"bar\", BAZ: \"qux\" }\n *\n * @example\n * // Mixed array syntax\n * // Given process.env.MY_VAR = \"hello\"\n * resolveEnvironment([\"MY_VAR\", { FOO: \"bar\" }])\n * // => { MY_VAR: \"hello\", FOO: \"bar\" }\n */\nexport function resolveEnvironment(\n environment?: EnvironmentInput,\n env: Record<string, string | undefined> = process.env,\n): { [key: string]: string } {\n if (!environment) {\n return {};\n }\n\n // Legacy object syntax - return as-is\n if (!Array.isArray(environment)) {\n return environment;\n }\n\n // Array syntax - process each item\n return environment.reduce<{ [key: string]: string }>((acc, item) => {\n if (typeof item === \"string\") {\n // String: lookup in process.env\n const value = env[item];\n if (value !== undefined) {\n return {\n ...acc,\n [item]: value,\n };\n }\n // Skip if not found in process.env\n return acc;\n }\n\n // Object: merge key-value pairs\n return {\n ...acc,\n ...item,\n };\n }, {});\n}\n","import { Construct } from \"constructs\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nexport function resolveHostedZone(\n scope: Construct,\n {\n name = \"HostedZone\",\n zone = process.env.CDK_ENV_HOSTED_ZONE,\n }: {\n name?: string;\n zone?: string | route53.IHostedZone;\n } = {},\n): route53.IHostedZone {\n if (!zone) {\n throw new ConfigurationError(\n \"No `zone` provided. Set CDK_ENV_HOSTED_ZONE to use environment zone\",\n );\n }\n\n if (typeof zone === \"string\") {\n return route53.HostedZone.fromLookup(scope, name, {\n domainName: zone,\n });\n }\n return zone;\n}\n","import { Duration } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\n\nexport interface ResolveParamsAndSecretsOptions {\n cacheSize?: number;\n logLevel?: lambda.ParamsAndSecretsLogLevel;\n parameterStoreTtl?: Duration;\n secretsManagerTtl?: Duration;\n}\n\nexport const resolveParamsAndSecrets = ({\n paramsAndSecrets,\n options,\n}: {\n paramsAndSecrets?: lambda.ParamsAndSecretsLayerVersion | boolean;\n options?: ResolveParamsAndSecretsOptions;\n} = {}) => {\n if (paramsAndSecrets === false) {\n return;\n }\n\n let resolvedParamsAndSecrets: lambda.ParamsAndSecretsLayerVersion;\n if (paramsAndSecrets instanceof lambda.ParamsAndSecretsLayerVersion) {\n resolvedParamsAndSecrets = paramsAndSecrets;\n } else {\n const resolvedOptions = options || {};\n resolvedParamsAndSecrets = lambda.ParamsAndSecretsLayerVersion.fromVersion(\n lambda.ParamsAndSecretsVersions.V1_0_103,\n {\n cacheSize: resolvedOptions.cacheSize,\n logLevel:\n resolvedOptions.logLevel || lambda.ParamsAndSecretsLogLevel.WARN,\n parameterStoreTtl: resolvedOptions.parameterStoreTtl,\n secretsManagerTtl: resolvedOptions.secretsManagerTtl,\n },\n );\n }\n\n return resolvedParamsAndSecrets;\n};\n\nexport default resolveParamsAndSecrets;\n","import { Construct } from \"constructs\";\nimport {\n CfnOutput,\n Fn,\n SecretValue,\n Tags,\n RemovalPolicy,\n Stack,\n} from \"aws-cdk-lib\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport {\n ISecret,\n ISecretAttachmentTarget,\n RotationSchedule,\n RotationScheduleOptions,\n} from \"aws-cdk-lib/aws-secretsmanager\";\nimport { IKey } from \"aws-cdk-lib/aws-kms\";\nimport {\n Grant,\n IGrantable,\n PolicyStatement,\n AddToResourcePolicyResult,\n} from \"aws-cdk-lib/aws-iam\";\n\nimport { CDK } from \"./constants\";\n\n// It is a consumer if the environment is ephemeral\nfunction checkEnvIsConsumer(env = process.env): boolean {\n return (\n env.PROJECT_ENV === CDK.ENV.PERSONAL ||\n !!env.CDK_ENV_PERSONAL ||\n /** @deprecated */ env.PROJECT_ENV === \"ephemeral\" ||\n /** @deprecated */ !!env.CDK_ENV_EPHEMERAL\n );\n}\n\nfunction checkEnvIsProvider(env = process.env): boolean {\n return env.PROJECT_ENV === CDK.ENV.SANDBOX;\n}\n\nfunction cleanName(name: string): string {\n return name.replace(/[^a-zA-Z0-9:-]/g, \"\");\n}\n\nfunction exportEnvName(name: string, env = process.env): string {\n let rawName;\n if (checkEnvIsProvider(env)) {\n rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;\n // Clean the entire name to only allow alphanumeric, colons, and hyphens\n return cleanName(rawName);\n } else {\n if (checkEnvIsConsumer(env)) {\n rawName = `env-${CDK.ENV.SANDBOX}-${env.PROJECT_KEY}-${name}`;\n } else {\n rawName = `env-${env.PROJECT_ENV}-${env.PROJECT_KEY}-${name}`;\n }\n }\n return cleanName(rawName);\n}\n\nexport interface JaypieEnvSecretProps {\n consumer?: boolean;\n envKey?: string;\n export?: string;\n generateSecretString?: secretsmanager.SecretStringGenerator;\n provider?: boolean;\n roleTag?: string;\n vendorTag?: string;\n value?: string;\n}\n\nexport class JaypieEnvSecret extends Construct implements ISecret {\n private readonly _envKey?: string;\n private readonly _secret: secretsmanager.ISecret;\n\n constructor(\n scope: Construct,\n idOrEnvKey: string,\n props?: JaypieEnvSecretProps,\n ) {\n // Check if idOrEnvKey should be treated as envKey:\n // - No props provided OR props.envKey is not set\n // - AND idOrEnvKey exists as a non-empty string in process.env\n const treatAsEnvKey =\n (!props || props.envKey === undefined) &&\n typeof process.env[idOrEnvKey] === \"string\" &&\n process.env[idOrEnvKey] !== \"\";\n\n const id = treatAsEnvKey ? `EnvSecret_${idOrEnvKey}` : idOrEnvKey;\n\n super(scope, id);\n\n const {\n consumer = checkEnvIsConsumer(),\n envKey: envKeyProp,\n export: exportParam,\n generateSecretString,\n provider = checkEnvIsProvider(),\n roleTag,\n vendorTag,\n value,\n } = props || {};\n\n const envKey = treatAsEnvKey ? idOrEnvKey : envKeyProp;\n\n this._envKey = envKey;\n\n let exportName;\n\n if (!exportParam) {\n exportName = exportEnvName(id);\n } else {\n exportName = cleanName(exportParam);\n }\n\n if (consumer) {\n const secretName = Fn.importValue(exportName);\n this._secret = secretsmanager.Secret.fromSecretNameV2(\n this,\n id,\n secretName,\n );\n\n // Add CfnOutput for consumer secrets\n new CfnOutput(this, `ConsumedName`, {\n value: this._secret.secretName,\n });\n } else {\n const secretValue =\n envKey && process.env[envKey] ? process.env[envKey] : value;\n\n const secretProps: secretsmanager.SecretProps = {\n generateSecretString,\n secretStringValue:\n !generateSecretString && secretValue\n ? SecretValue.unsafePlainText(secretValue)\n : undefined,\n };\n\n this._secret = new secretsmanager.Secret(this, id, secretProps);\n\n if (roleTag) {\n Tags.of(this._secret).add(CDK.TAG.ROLE, roleTag);\n }\n\n if (vendorTag) {\n Tags.of(this._secret).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n if (provider) {\n new CfnOutput(this, `ProvidedName`, {\n value: this._secret.secretName,\n exportName,\n });\n } else {\n new CfnOutput(this, `CreatedName`, {\n value: this._secret.secretName,\n });\n }\n }\n }\n\n // IResource implementation\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public get env(): { account: string; region: string } {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._secret.applyRemovalPolicy(policy);\n }\n\n // ISecret implementation\n public get secretArn(): string {\n return this._secret.secretArn;\n }\n\n public get secretFullArn(): string | undefined {\n return this._secret.secretFullArn;\n }\n\n public get secretName(): string {\n return this._secret.secretName;\n }\n\n public get secretRef(): secretsmanager.SecretReference {\n return this._secret.secretRef;\n }\n\n public get encryptionKey(): IKey | undefined {\n return this._secret.encryptionKey;\n }\n\n public get secretValue(): SecretValue {\n return this._secret.secretValue;\n }\n\n public secretValueFromJson(key: string): SecretValue {\n return this._secret.secretValueFromJson(key);\n }\n\n public grantRead(grantee: IGrantable, versionStages?: string[]): Grant {\n return this._secret.grantRead(grantee, versionStages);\n }\n\n public grantWrite(grantee: IGrantable): Grant {\n return this._secret.grantWrite(grantee);\n }\n\n public addRotationSchedule(\n id: string,\n options: RotationScheduleOptions,\n ): RotationSchedule {\n return this._secret.addRotationSchedule(id, options);\n }\n\n public addToResourcePolicy(\n statement: PolicyStatement,\n ): AddToResourcePolicyResult {\n return this._secret.addToResourcePolicy(statement);\n }\n\n public denyAccountRootDelete(): void {\n this._secret.denyAccountRootDelete();\n }\n\n public attach(target: ISecretAttachmentTarget): ISecret {\n return this._secret.attach(target);\n }\n\n public cfnDynamicReferenceKey(\n options?: Parameters<ISecret[\"cfnDynamicReferenceKey\"]>[0],\n ): string {\n return this._secret.cfnDynamicReferenceKey(options);\n }\n\n public get envKey(): string | undefined {\n return this._envKey;\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"../JaypieEnvSecret.js\";\n\n/**\n * Secrets input type that supports both JaypieEnvSecret instances and strings\n * - JaypieEnvSecret: passed through as-is\n * - string: converted to JaypieEnvSecret with the string as envKey\n */\nexport type SecretsArrayItem = JaypieEnvSecret | string;\n\n/**\n * Cache for secrets by scope to avoid creating duplicates.\n * Uses WeakMap to allow garbage collection when scopes are no longer referenced.\n */\nconst secretsByScope = new WeakMap<Construct, Map<string, JaypieEnvSecret>>();\n\n/**\n * Gets or creates the secrets cache for a given scope.\n */\nfunction getSecretsCache(scope: Construct): Map<string, JaypieEnvSecret> {\n let cache = secretsByScope.get(scope);\n if (!cache) {\n cache = new Map<string, JaypieEnvSecret>();\n secretsByScope.set(scope, cache);\n }\n return cache;\n}\n\n/**\n * Gets an existing secret from the cache or creates a new one.\n * This ensures that multiple constructs within the same scope share secrets.\n */\nfunction getOrCreateSecret(\n scope: Construct,\n envKey: string,\n props?: Omit<JaypieEnvSecretProps, \"envKey\">,\n): JaypieEnvSecret {\n const cache = getSecretsCache(scope);\n const existingSecret = cache.get(envKey);\n\n if (existingSecret) {\n return existingSecret;\n }\n\n // Create new secret - JaypieEnvSecret's smart constructor handles envKey detection\n const secret = new JaypieEnvSecret(scope, envKey, {\n ...props,\n envKey,\n });\n cache.set(envKey, secret);\n return secret;\n}\n\n/**\n * Resolves secrets input to an array of JaypieEnvSecret instances.\n *\n * When an item is already a JaypieEnvSecret, it's passed through as-is.\n * When an item is a string, a JaypieEnvSecret is created (or reused from cache)\n * with the string as the envKey.\n *\n * Secrets are cached per scope to avoid creating duplicate secrets when\n * multiple constructs in the same scope reference the same secret.\n *\n * @example\n * // JaypieEnvSecret instances pass through\n * const secret = new JaypieEnvSecret(scope, \"MySecret\", { envKey: \"MY_KEY\" });\n * resolveSecrets(scope, [secret])\n * // => [secret]\n *\n * @example\n * // Strings create JaypieEnvSecret instances\n * resolveSecrets(scope, [\"AUTH0_SECRET\", \"MONGODB_URI\"])\n * // => [JaypieEnvSecret(envKey: \"AUTH0_SECRET\"), JaypieEnvSecret(envKey: \"MONGODB_URI\")]\n *\n * @example\n * // Mixed input\n * const existingSecret = new JaypieEnvSecret(scope, \"Existing\", { envKey: \"EXISTING\" });\n * resolveSecrets(scope, [existingSecret, \"NEW_SECRET\"])\n * // => [existingSecret, JaypieEnvSecret(envKey: \"NEW_SECRET\")]\n *\n * @example\n * // Secrets are shared across calls with the same scope\n * const secrets1 = resolveSecrets(scope, [\"SHARED_SECRET\"]);\n * const secrets2 = resolveSecrets(scope, [\"SHARED_SECRET\"]);\n * // secrets1[0] === secrets2[0] (same instance)\n */\nexport function resolveSecrets(\n scope: Construct,\n secrets?: SecretsArrayItem[],\n): JaypieEnvSecret[] {\n if (!secrets || secrets.length === 0) {\n return [];\n }\n\n return secrets.map((item) => {\n if (typeof item === \"string\") {\n return getOrCreateSecret(scope, item);\n }\n // Already a JaypieEnvSecret instance\n return item;\n });\n}\n\n/**\n * Clears the secrets cache for a given scope.\n * Primarily useful for testing.\n */\nexport function clearSecretsCache(scope: Construct): void {\n secretsByScope.delete(scope);\n}\n\n/**\n * Clears all secrets caches.\n * Primarily useful for testing.\n */\nexport function clearAllSecretsCaches(): void {\n // WeakMap doesn't have a clear() method, so we create a new one\n // This relies on the module being reloaded or the function being called\n // between test runs. For testing, use clearSecretsCache(scope) instead.\n}\n","import { Construct } from \"constructs\";\nimport { RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as apiGateway from \"aws-cdk-lib/aws-apigateway\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\nexport interface JaypieApiGatewayProps extends apiGateway.LambdaRestApiProps {\n certificate?: boolean | acm.ICertificate;\n /**\n * The domain name for the API Gateway.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"api.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @example\n * // Direct string\n * host: \"api.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { subdomain: \"api\" }\n */\n host?: string | HostConfig;\n name?: string;\n roleTag?: string;\n zone?: string | route53.IHostedZone;\n}\n\nexport class JaypieApiGateway extends Construct implements apiGateway.IRestApi {\n private readonly _api: apiGateway.LambdaRestApi;\n private readonly _certificate?: acm.ICertificate;\n private readonly _domainName?: apiGateway.DomainName;\n private readonly _host?: string;\n\n constructor(scope: Construct, id: string, props: JaypieApiGatewayProps) {\n super(scope, id);\n\n const {\n certificate = true,\n handler,\n host: propsHost,\n name,\n roleTag = CDK.ROLE.API,\n zone: propsZone,\n } = props;\n\n // Determine zone from props or environment\n let zone = propsZone;\n if (!zone && process.env.CDK_ENV_API_HOSTED_ZONE) {\n zone = process.env.CDK_ENV_API_HOSTED_ZONE;\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n host = envHostname(propsHost);\n } else if (process.env.CDK_ENV_API_HOST_NAME) {\n host = process.env.CDK_ENV_API_HOST_NAME;\n } else if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n process.env.CDK_ENV_API_HOSTED_ZONE\n ) {\n host = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE,\n );\n }\n\n const apiGatewayName = name || constructEnvName(\"ApiGateway\");\n const apiDomainName = constructEnvName(\"ApiDomainName\");\n\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n certificateToUse = resolveCertificate(this, {\n certificate,\n domainName: host,\n roleTag: CDK.ROLE.HOSTING,\n zone: hostedZone,\n });\n\n this._certificate = certificateToUse;\n this._host = host;\n }\n\n const {\n // * `...lambdaRestApiProps` cannot be moved to the first const destructuring because it needs to exclude the custom properties first.\n // Ignore the variables we already assigned to other properties\n /* eslint-disable @typescript-eslint/no-unused-vars */\n certificate: _certificate,\n host: _host,\n name: _name,\n roleTag: _roleTag,\n zone: _zone,\n handler: _handler,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...lambdaRestApiProps\n } = props;\n\n this._api = new apiGateway.LambdaRestApi(this, apiGatewayName, {\n handler,\n ...lambdaRestApiProps,\n });\n Tags.of(this._api).add(CDK.TAG.ROLE, roleTag);\n\n if (host && certificateToUse && hostedZone) {\n this._domainName = this._api.addDomainName(apiDomainName, {\n domainName: host,\n certificate: certificateToUse,\n });\n Tags.of(this._domainName).add(CDK.TAG.ROLE, roleTag);\n\n const record = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayDomain(this._domainName),\n ),\n zone: hostedZone,\n });\n Tags.of(record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n }\n\n public get api(): apiGateway.LambdaRestApi {\n return this._api;\n }\n\n public get url(): string {\n return this._api.url;\n }\n\n public get certificateArn(): string | undefined {\n return this._certificate?.certificateArn;\n }\n\n public get domainName(): string | undefined {\n return this._domainName?.domainName;\n }\n\n public get host(): string | undefined {\n return this._host;\n }\n\n public get restApiId(): string {\n return this._api.restApiId;\n }\n\n public get restApiName(): string {\n return this._api.restApiName;\n }\n\n public get restApiRootResourceId(): string {\n return this._api.restApiRootResourceId;\n }\n\n public get deploymentStage(): apiGateway.Stage {\n return this._api.deploymentStage;\n }\n\n public get domainNameAliasDomainName(): string | undefined {\n return this._domainName?.domainNameAliasDomainName;\n }\n\n public get domainNameAliasHostedZoneId(): string | undefined {\n return this._domainName?.domainNameAliasHostedZoneId;\n }\n\n public get root(): apiGateway.IResource {\n return this._api.root;\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this._api.stack;\n }\n\n public arnForExecuteApi(\n method?: string,\n path?: string,\n stage?: string,\n ): string {\n return this._api.arnForExecuteApi(method, path, stage);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metric(metricName, props);\n }\n\n public metricCacheHitCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCacheHitCount(props);\n }\n\n public metricCacheMissCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCacheMissCount(props);\n }\n\n public metricClientError(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricClientError(props);\n }\n\n public metricCount(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricCount(props);\n }\n\n public metricIntegrationLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricIntegrationLatency(props);\n }\n\n public metricLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricLatency(props);\n }\n\n public metricServerError(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._api.metricServerError(props);\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._api.applyRemovalPolicy(policy);\n }\n\n public get restApiRef(): apiGateway.RestApiReference {\n return {\n restApiId: this._api.restApiId,\n };\n }\n}\n","import { Stack, StackProps } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { constructStackName, constructTagger } from \"./helpers\";\n\nexport interface JaypieStackProps extends StackProps {\n key?: string;\n}\n\nexport class JaypieStack extends Stack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key, ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n // Handle env\n stackProps.env = {\n account: process.env.CDK_DEFAULT_ACCOUNT,\n region: process.env.CDK_DEFAULT_REGION,\n ...stackProps.env,\n };\n\n super(scope, id, stackProps);\n\n // Apply tags\n constructTagger(this, { name: stackProps.stackName });\n }\n}\n","import { Construct } from \"constructs\";\nimport { JaypieStack, JaypieStackProps } from \"./JaypieStack\";\nimport { constructStackName } from \"./helpers\";\n\nexport class JaypieAppStack extends JaypieStack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key = \"app\", ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n super(scope, id, { key, ...stackProps });\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Stack, RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as cloudwatch from \"aws-cdk-lib/aws-cloudwatch\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport * as ec2 from \"aws-cdk-lib/aws-ec2\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as logs from \"aws-cdk-lib/aws-logs\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { CDK } from \"./constants\";\nimport {\n addDatadogLayers,\n EnvironmentInput,\n jaypieLambdaEnv,\n resolveEnvironment,\n resolveParamsAndSecrets,\n resolveSecrets,\n SecretsArrayItem,\n} from \"./helpers/index.js\";\n\nexport interface JaypieLambdaProps {\n allowAllOutbound?: boolean;\n allowPublicSubnet?: boolean;\n architecture?: lambda.Architecture;\n code: lambda.Code | string;\n datadogApiKeyArn?: string;\n deadLetterQueue?: import(\"aws-cdk-lib/aws-sqs\").IQueue;\n deadLetterQueueEnabled?: boolean;\n deadLetterTopic?: import(\"aws-cdk-lib/aws-sns\").ITopic;\n description?: string;\n /**\n * DynamoDB tables to grant read/write access to the Lambda function.\n * Each table is granted read/write access and if exactly one table is provided,\n * the DYNAMODB_TABLE_NAME environment variable is set to the table name.\n */\n tables?: dynamodb.ITable[];\n /**\n * Environment variables for the Lambda function.\n *\n * Supports both legacy object syntax and new array syntax:\n * - Object: { KEY: \"value\" } - directly sets environment variables\n * - Array: [\"KEY1\", \"KEY2\", { KEY3: \"value\" }]\n * - Strings: lookup value from process.env\n * - Objects: merge key-value pairs directly\n */\n environment?: EnvironmentInput;\n envSecrets?: { [key: string]: secretsmanager.ISecret };\n ephemeralStorageSize?: import(\"aws-cdk-lib\").Size;\n filesystem?: lambda.FileSystem;\n handler: string;\n initialPolicy?: iam.PolicyStatement[];\n layers?: lambda.ILayerVersion[];\n logGroup?: logs.ILogGroup;\n logRetention?: logs.RetentionDays | number;\n maxEventAge?: Duration;\n memorySize?: number;\n paramsAndSecrets?: lambda.ParamsAndSecretsLayerVersion | boolean;\n paramsAndSecretsOptions?: {\n cacheSize?: number;\n logLevel?: lambda.ParamsAndSecretsLogLevel;\n parameterStoreTtl?: Duration;\n secretsManagerTtl?: Duration;\n };\n profiling?: boolean;\n profilingGroup?: import(\"aws-cdk-lib/aws-codeguruprofiler\").IProfilingGroup;\n provisionedConcurrentExecutions?: number;\n reservedConcurrentExecutions?: number;\n retryAttempts?: number;\n roleTag?: string;\n runtime?: lambda.Runtime;\n runtimeManagementMode?: lambda.RuntimeManagementMode;\n /**\n * Secrets to make available to the Lambda function.\n *\n * Supports both JaypieEnvSecret instances and strings:\n * - JaypieEnvSecret: used directly\n * - String: creates a JaypieEnvSecret with the string as envKey\n * (reuses existing secrets within the same scope)\n */\n secrets?: SecretsArrayItem[];\n securityGroups?: ec2.ISecurityGroup[];\n timeout?: Duration | number;\n tracing?: lambda.Tracing;\n vendorTag?: string;\n vpc?: ec2.IVpc;\n vpcSubnets?: ec2.SubnetSelection;\n}\n\nexport class JaypieLambda extends Construct implements lambda.IFunction {\n private readonly _lambda: lambda.Function;\n private readonly _provisioned?: lambda.Alias;\n private readonly _reference: lambda.IFunction;\n\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id);\n\n const {\n allowAllOutbound,\n allowPublicSubnet,\n architecture = lambda.Architecture.X86_64,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n tables = [],\n environment: environmentInput,\n envSecrets = {},\n ephemeralStorageSize,\n filesystem,\n handler = \"index.handler\",\n initialPolicy,\n layers = [],\n logGroup,\n logRetention = CDK.LAMBDA.LOG_RETENTION,\n maxEventAge,\n memorySize = CDK.LAMBDA.MEMORY_SIZE,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag = CDK.ROLE.PROCESSING,\n runtime = new lambda.Runtime(\"nodejs24.x\", lambda.RuntimeFamily.NODEJS, {\n supportsInlineCode: true,\n }),\n runtimeManagementMode,\n secrets: secretsInput = [],\n securityGroups,\n timeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n tracing,\n vendorTag,\n vpc,\n vpcSubnets,\n } = props;\n\n // Resolve environment from array or object syntax\n const initialEnvironment = resolveEnvironment(environmentInput);\n\n // Get base environment with defaults\n const environment = jaypieLambdaEnv({ initialEnvironment });\n\n // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)\n const secrets = resolveSecrets(scope, secretsInput);\n\n const codeAsset =\n typeof code === \"string\" ? lambda.Code.fromAsset(code) : code;\n\n // Create a working copy of layers\n const resolvedLayers = [...layers];\n\n // Process secrets environment variables\n const secretsEnvironment = Object.entries(envSecrets).reduce(\n (acc, [key, secret]) => ({\n ...acc,\n [`SECRET_${key}`]: secret.secretName,\n }),\n {},\n );\n\n // Process JaypieEnvSecret array\n const jaypieSecretsEnvironment = secrets.reduce<{ [key: string]: string }>(\n (acc, secret) => {\n if (secret.envKey) {\n return {\n ...acc,\n [`SECRET_${secret.envKey}`]: secret.secretName,\n };\n }\n return acc;\n },\n {},\n );\n\n // Add ParamsAndSecrets layer if configured\n const resolvedParamsAndSecrets = resolveParamsAndSecrets({\n paramsAndSecrets,\n options: paramsAndSecretsOptions,\n });\n\n // Create LogGroup if not provided\n const resolvedLogGroup =\n logGroup ??\n new logs.LogGroup(this, \"LogGroup\", {\n retention: logRetention as logs.RetentionDays,\n removalPolicy: RemovalPolicy.DESTROY,\n });\n\n // Create Lambda Function\n this._lambda = new lambda.Function(this, \"Function\", {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n code: codeAsset,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment: {\n ...environment,\n ...secretsEnvironment,\n ...jaypieSecretsEnvironment,\n },\n ephemeralStorageSize,\n filesystem,\n handler,\n initialPolicy,\n layers: resolvedLayers,\n logGroup: resolvedLogGroup,\n maxEventAge,\n memorySize,\n paramsAndSecrets: resolvedParamsAndSecrets,\n profiling,\n profilingGroup,\n reservedConcurrentExecutions,\n retryAttempts,\n runtime,\n runtimeManagementMode,\n securityGroups,\n timeout:\n typeof timeout === \"number\" ? Duration.seconds(timeout) : timeout,\n tracing,\n vpc,\n vpcSubnets,\n // Enable auto-publishing of versions when using provisioned concurrency\n currentVersionOptions:\n provisionedConcurrentExecutions !== undefined\n ? {\n removalPolicy: RemovalPolicy.RETAIN,\n description: \"Auto-published version for provisioned concurrency\",\n // Don't set provisioned concurrency here - it will be set on the alias\n }\n : undefined,\n });\n\n addDatadogLayers(this._lambda, { datadogApiKeyArn });\n\n // Grant secret read permissions\n Object.values(envSecrets).forEach((secret) => {\n secret.grantRead(this._lambda);\n });\n\n // Grant read permissions for JaypieEnvSecrets\n secrets.forEach((secret) => {\n secret.grantRead(this._lambda);\n });\n\n // Grant read/write permissions for DynamoDB tables\n tables.forEach((table) => {\n table.grantReadWriteData(this._lambda);\n });\n\n // Add table name to environment if there's exactly one table\n if (tables.length === 1) {\n this._lambda.addEnvironment(\"DYNAMODB_TABLE_NAME\", tables[0].tableName);\n }\n\n // Configure provisioned concurrency if specified\n if (provisionedConcurrentExecutions !== undefined) {\n // Use currentVersion which is auto-published with proper configuration\n const version = this._lambda.currentVersion;\n\n // Create alias for provisioned concurrency\n this._provisioned = new lambda.Alias(this, \"ProvisionedAlias\", {\n aliasName: \"provisioned\",\n version,\n provisionedConcurrentExecutions,\n });\n\n // Add explicit dependencies to ensure proper creation order\n this._provisioned.node.addDependency(version);\n }\n\n if (roleTag) {\n Tags.of(this._lambda).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._lambda).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Assign _reference based on provisioned state\n this._reference =\n this._provisioned !== undefined ? this._provisioned : this._lambda;\n }\n\n // Public accessors\n public get lambda(): lambda.Function {\n return this._lambda;\n }\n\n public get provisioned(): lambda.Alias | undefined {\n return this._provisioned;\n }\n\n public get reference(): lambda.IFunction {\n return this._reference;\n }\n\n // IFunction implementation\n public get functionArn(): string {\n return this._reference.functionArn;\n }\n\n public get functionName(): string {\n return this._reference.functionName;\n }\n\n public get grantPrincipal(): iam.IPrincipal {\n return this._reference.grantPrincipal;\n }\n\n public get role(): iam.IRole | undefined {\n return this._reference.role;\n }\n\n public get architecture(): lambda.Architecture {\n return this._reference.architecture;\n }\n\n public get connections(): import(\"aws-cdk-lib/aws-ec2\").Connections {\n return this._reference.connections;\n }\n\n public get isBoundToVpc(): boolean {\n return this._reference.isBoundToVpc;\n }\n\n public get latestVersion(): lambda.IVersion {\n return this._reference.latestVersion;\n }\n\n public get permissionsNode(): import(\"constructs\").Node {\n return this._reference.permissionsNode;\n }\n\n public get resourceArnsForGrantInvoke(): string[] {\n return this._reference.resourceArnsForGrantInvoke;\n }\n\n public get functionRef(): lambda.FunctionReference {\n return {\n functionArn: this._reference.functionArn,\n functionName: this._reference.functionName,\n };\n }\n\n public addEventSource(source: lambda.IEventSource): void {\n this._reference.addEventSource(source);\n }\n\n public addEventSourceMapping(\n id: string,\n options: lambda.EventSourceMappingOptions,\n ): lambda.EventSourceMapping {\n return this._reference.addEventSourceMapping(id, options);\n }\n\n public addFunctionUrl(\n options?: lambda.FunctionUrlOptions,\n ): lambda.FunctionUrl {\n return this._reference.addFunctionUrl(options);\n }\n\n public addPermission(id: string, permission: lambda.Permission): void {\n this._reference.addPermission(id, permission);\n }\n\n public addToRolePolicy(statement: iam.PolicyStatement): void {\n this._reference.addToRolePolicy(statement);\n }\n\n public configureAsyncInvoke(options: lambda.EventInvokeConfigOptions): void {\n this._reference.configureAsyncInvoke(options);\n }\n\n public grantInvoke(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvoke(grantee);\n }\n\n public grantInvokeCompositePrincipal(\n compositePrincipal: iam.CompositePrincipal,\n ): iam.Grant[] {\n return this._reference.grantInvokeCompositePrincipal(compositePrincipal);\n }\n\n public grantInvokeUrl(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvokeUrl(grantee);\n }\n\n public grantInvokeLatestVersion(grantee: iam.IGrantable): iam.Grant {\n return this._reference.grantInvokeLatestVersion(grantee);\n }\n\n public grantInvokeVersion(\n grantee: iam.IGrantable,\n version: lambda.IVersion,\n ): iam.Grant {\n return this._reference.grantInvokeVersion(grantee, version);\n }\n\n public metric(\n metricName: string,\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._reference.metric(metricName, props);\n }\n\n public metricDuration(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricDuration(props);\n }\n\n public metricErrors(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricErrors(props);\n }\n\n public metricInvocations(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._reference.metricInvocations(props);\n }\n\n public metricThrottles(props?: cloudwatch.MetricOptions): cloudwatch.Metric {\n return this._reference.metricThrottles(props);\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this._reference.stack;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._reference.applyRemovalPolicy(policy);\n }\n\n public addEnvironment(key: string, value: string): void {\n this._lambda.addEnvironment(key, value);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Tags, Stack, RemovalPolicy } from \"aws-cdk-lib\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as sqs from \"aws-cdk-lib/aws-sqs\";\nimport { CDK } from \"./constants\";\nimport * as lambdaEventSources from \"aws-cdk-lib/aws-lambda-event-sources\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as cloudwatch from \"aws-cdk-lib/aws-cloudwatch\";\nimport * as kms from \"aws-cdk-lib/aws-kms\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\nexport interface JaypieQueuedLambdaProps extends JaypieLambdaProps {\n batchSize?: number;\n fifo?: boolean;\n visibilityTimeout?: Duration | number;\n}\n\nexport class JaypieQueuedLambda\n extends Construct\n implements lambda.IFunction, sqs.IQueue\n{\n private readonly _queue: sqs.Queue;\n private readonly _lambdaConstruct: JaypieLambda;\n\n constructor(scope: Construct, id: string, props: JaypieQueuedLambdaProps) {\n super(scope, id);\n\n const {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n batchSize = 1,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment = {},\n envSecrets = {},\n ephemeralStorageSize,\n fifo = true,\n filesystem,\n handler = \"index.handler\",\n initialPolicy,\n layers = [],\n logGroup,\n logRetention = CDK.LAMBDA.LOG_RETENTION,\n maxEventAge,\n memorySize = CDK.LAMBDA.MEMORY_SIZE,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag,\n runtime = new lambda.Runtime(\"nodejs24.x\", lambda.RuntimeFamily.NODEJS, {\n supportsInlineCode: true,\n }),\n runtimeManagementMode,\n secrets = [],\n securityGroups,\n timeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n tracing,\n vendorTag,\n visibilityTimeout = Duration.seconds(CDK.DURATION.LAMBDA_WORKER),\n vpc,\n vpcSubnets,\n } = props;\n\n // Create SQS Queue\n this._queue = new sqs.Queue(this, \"Queue\", {\n fifo,\n visibilityTimeout:\n typeof visibilityTimeout === \"number\"\n ? Duration.seconds(visibilityTimeout)\n : visibilityTimeout,\n });\n if (roleTag) {\n Tags.of(this._queue).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._queue).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Create Lambda with JaypieLambda\n this._lambdaConstruct = new JaypieLambda(this, \"Function\", {\n allowAllOutbound,\n allowPublicSubnet,\n architecture,\n code,\n datadogApiKeyArn,\n deadLetterQueue,\n deadLetterQueueEnabled,\n deadLetterTopic,\n description,\n environment: {\n ...environment,\n CDK_ENV_QUEUE_URL: this._queue.queueUrl,\n },\n envSecrets,\n ephemeralStorageSize,\n filesystem,\n handler,\n initialPolicy,\n layers,\n logGroup,\n logRetention,\n maxEventAge,\n memorySize,\n paramsAndSecrets,\n paramsAndSecretsOptions,\n profiling,\n profilingGroup,\n provisionedConcurrentExecutions,\n reservedConcurrentExecutions,\n retryAttempts,\n roleTag,\n runtime,\n runtimeManagementMode,\n secrets,\n securityGroups,\n timeout,\n tracing,\n vendorTag,\n vpc,\n vpcSubnets,\n });\n\n // Set up queue and lambda integration\n this._queue.grantConsumeMessages(this._lambdaConstruct);\n this._queue.grantSendMessages(this._lambdaConstruct);\n this._lambdaConstruct.addEventSource(\n new lambdaEventSources.SqsEventSource(this._queue, {\n batchSize,\n }),\n );\n }\n\n // Public accessors\n public get queue(): sqs.Queue {\n return this._queue;\n }\n\n public get lambda(): lambda.Function {\n return this._lambdaConstruct.lambda;\n }\n\n // IFunction implementation\n public get functionArn(): string {\n return this._lambdaConstruct.functionArn;\n }\n\n public get functionName(): string {\n return this._lambdaConstruct.functionName;\n }\n\n public get grantPrincipal(): import(\"aws-cdk-lib/aws-iam\").IPrincipal {\n return this._lambdaConstruct.grantPrincipal;\n }\n\n public get role(): import(\"aws-cdk-lib/aws-iam\").IRole | undefined {\n return this._lambdaConstruct.role;\n }\n\n public get architecture(): lambda.Architecture {\n return this._lambdaConstruct.architecture;\n }\n\n public get connections(): import(\"aws-cdk-lib/aws-ec2\").Connections {\n return this._lambdaConstruct.connections;\n }\n\n public get isBoundToVpc(): boolean {\n return this._lambdaConstruct.isBoundToVpc;\n }\n\n public get latestVersion(): lambda.IVersion {\n return this._lambdaConstruct.latestVersion;\n }\n\n public get permissionsNode(): import(\"constructs\").Node {\n return this._lambdaConstruct.permissionsNode;\n }\n\n public get resourceArnsForGrantInvoke(): string[] {\n return this._lambdaConstruct.resourceArnsForGrantInvoke;\n }\n\n public get functionRef(): lambda.FunctionReference {\n return this._lambdaConstruct.functionRef;\n }\n\n public addEventSource(source: lambda.IEventSource): void {\n this._lambdaConstruct.addEventSource(source);\n }\n\n public addEventSourceMapping(\n id: string,\n options: lambda.EventSourceMappingOptions,\n ): lambda.EventSourceMapping {\n return this._lambdaConstruct.addEventSourceMapping(id, options);\n }\n\n public addFunctionUrl(\n options?: lambda.FunctionUrlOptions,\n ): lambda.FunctionUrl {\n return this._lambdaConstruct.addFunctionUrl(options);\n }\n\n public addPermission(id: string, permission: lambda.Permission): void {\n this._lambdaConstruct.addPermission(id, permission);\n }\n\n public addToRolePolicy(\n statement: import(\"aws-cdk-lib/aws-iam\").PolicyStatement,\n ): void {\n this._lambdaConstruct.addToRolePolicy(statement);\n }\n\n public configureAsyncInvoke(options: lambda.EventInvokeConfigOptions): void {\n this._lambdaConstruct.configureAsyncInvoke(options);\n }\n\n public grantInvoke(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._lambdaConstruct.grantInvoke(grantee);\n }\n\n public grantInvokeCompositePrincipal(\n compositePrincipal: import(\"aws-cdk-lib/aws-iam\").CompositePrincipal,\n ): import(\"aws-cdk-lib/aws-iam\").Grant[] {\n return this._lambdaConstruct.grantInvokeCompositePrincipal(\n compositePrincipal,\n );\n }\n\n public grantInvokeUrl(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._lambdaConstruct.grantInvokeUrl(grantee);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metric(metricName, props);\n }\n\n public metricDuration(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricDuration(props);\n }\n\n public metricErrors(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricErrors(props);\n }\n\n public metricInvocations(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricInvocations(props);\n }\n\n public metricThrottles(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._lambdaConstruct.metricThrottles(props);\n }\n\n // Additional IFunction implementation\n public grantInvokeLatestVersion(grantee: iam.IGrantable): iam.Grant {\n return this._lambdaConstruct.grantInvokeLatestVersion(grantee);\n }\n\n public grantInvokeVersion(\n grantee: iam.IGrantable,\n version: lambda.Version,\n ): iam.Grant {\n return this._lambdaConstruct.grantInvokeVersion(grantee, version);\n }\n\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._lambdaConstruct.applyRemovalPolicy(policy);\n this._queue.applyRemovalPolicy(policy);\n }\n\n // IQueue implementation\n public get queueRef() {\n return {\n queueUrl: this._queue.queueUrl,\n queueArn: this._queue.queueArn,\n };\n }\n\n public get fifo(): boolean {\n return this._queue.fifo;\n }\n\n public get queueArn(): string {\n return this._queue.queueArn;\n }\n\n public get queueName(): string {\n return this._queue.queueName;\n }\n\n public get queueUrl(): string {\n return this._queue.queueUrl;\n }\n\n public get encryptionMasterKey(): kms.IKey | undefined {\n return this._queue.encryptionMasterKey;\n }\n\n public addToResourcePolicy(\n statement: iam.PolicyStatement,\n ): iam.AddToResourcePolicyResult {\n return this._queue.addToResourcePolicy(statement);\n }\n\n public grant(grantee: iam.IGrantable, ...actions: string[]): iam.Grant {\n return this._queue.grant(grantee, ...actions);\n }\n\n public grantConsumeMessages(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantConsumeMessages(grantee);\n }\n\n public grantPurge(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantPurge(grantee);\n }\n\n public grantSendMessages(grantee: iam.IGrantable): iam.Grant {\n return this._queue.grantSendMessages(grantee);\n }\n\n // Queue metrics\n public metricApproximateAgeOfOldestMessage(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateAgeOfOldestMessage(props);\n }\n\n public metricApproximateNumberOfMessagesDelayed(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesDelayed(props);\n }\n\n public metricApproximateNumberOfMessagesNotVisible(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesNotVisible(props);\n }\n\n public metricApproximateNumberOfMessagesVisible(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricApproximateNumberOfMessagesVisible(props);\n }\n\n public metricNumberOfEmptyReceives(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfEmptyReceives(props);\n }\n\n public metricNumberOfMessagesDeleted(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesDeleted(props);\n }\n\n public metricNumberOfMessagesReceived(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesReceived(props);\n }\n\n public metricNumberOfMessagesSent(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricNumberOfMessagesSent(props);\n }\n\n public metricSentMessageSize(\n props?: cloudwatch.MetricOptions,\n ): cloudwatch.Metric {\n return this._queue.metricSentMessageSize(props);\n }\n\n public addEnvironment(key: string, value: string): void {\n this._lambdaConstruct.addEnvironment(key, value);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Tags, RemovalPolicy } from \"aws-cdk-lib\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport * as s3n from \"aws-cdk-lib/aws-s3-notifications\";\nimport { CDK } from \"./constants\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport {\n JaypieQueuedLambda,\n JaypieQueuedLambdaProps,\n} from \"./JaypieQueuedLambda.js\";\n\nexport interface JaypieBucketQueuedLambdaProps extends JaypieQueuedLambdaProps {\n bucketName?: string;\n bucketOptions?: s3.BucketProps;\n}\n\nexport class JaypieBucketQueuedLambda\n extends JaypieQueuedLambda\n implements s3.IBucket\n{\n private readonly _bucket: s3.Bucket;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieBucketQueuedLambdaProps,\n ) {\n props.fifo = false; // S3 event notifications are not supported for FIFO queues\n super(scope, id, props);\n\n const { bucketName, roleTag, vendorTag, bucketOptions = {} } = props;\n\n // Create S3 Bucket\n this._bucket = new s3.Bucket(this, \"Bucket\", {\n bucketName: bucketOptions.bucketName || bucketName,\n removalPolicy: bucketOptions.removalPolicy || RemovalPolicy.RETAIN,\n ...bucketOptions,\n });\n\n // Add tags to bucket\n if (roleTag) {\n Tags.of(this._bucket).add(CDK.TAG.ROLE, roleTag);\n }\n if (vendorTag) {\n Tags.of(this._bucket).add(CDK.TAG.VENDOR, vendorTag);\n }\n\n // Add an event notification from the bucket to the queue\n this._bucket.addEventNotification(\n s3.EventType.OBJECT_CREATED,\n new s3n.SqsDestination(this.queue),\n );\n\n // Grant the lambda access to the bucket\n this._bucket.grantReadWrite(this);\n\n // Add environment variable for bucket name\n this.lambda.addEnvironment(\"CDK_ENV_BUCKET_NAME\", this._bucket.bucketName);\n }\n\n // Public accessors\n public get bucket(): s3.Bucket {\n return this._bucket;\n }\n\n // IBucket implementation\n public get bucketArn(): string {\n return this._bucket.bucketArn;\n }\n\n public get bucketDomainName(): string {\n return this._bucket.bucketDomainName;\n }\n\n public get bucketDualStackDomainName(): string {\n return this._bucket.bucketDualStackDomainName;\n }\n\n public get bucketName(): string {\n return this._bucket.bucketName;\n }\n\n public get bucketRegionalDomainName(): string {\n return this._bucket.bucketRegionalDomainName;\n }\n\n public get bucketWebsiteDomainName(): string {\n return this._bucket.bucketWebsiteDomainName;\n }\n\n public get bucketWebsiteUrl(): string {\n return this._bucket.bucketWebsiteUrl;\n }\n\n public get encryptionKey(): undefined | import(\"aws-cdk-lib/aws-kms\").IKey {\n return this._bucket.encryptionKey;\n }\n\n public get isWebsite(): boolean {\n return this._bucket.isWebsite || false;\n }\n\n public get policy(): s3.BucketPolicy | undefined {\n return this._bucket.policy;\n }\n\n public addEventNotification(\n event: s3.EventType,\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addEventNotification(event, dest, ...filters);\n }\n\n public addObjectCreatedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addObjectCreatedNotification(dest, ...filters);\n }\n\n public addObjectRemovedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this._bucket.addObjectRemovedNotification(dest, ...filters);\n }\n\n public addToResourcePolicy(\n permission: iam.PolicyStatement,\n ): iam.AddToResourcePolicyResult {\n return this._bucket.addToResourcePolicy(permission);\n }\n\n public arnForObjects(objectKeyPattern: string): string {\n return this._bucket.arnForObjects(objectKeyPattern);\n }\n\n public enableEventBridgeNotification(): void {\n this._bucket.enableEventBridgeNotification();\n }\n\n public grantDelete(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantDelete(grantee, objectsKeyPattern);\n }\n\n public grantPublicAccess(\n keyPrefix?: string,\n ...allowedActions: string[]\n ): iam.Grant {\n return this._bucket.grantPublicAccess(keyPrefix, ...allowedActions);\n }\n\n public grantPut(grantee: iam.IGrantable, objectsKeyPattern?: any): iam.Grant {\n return this._bucket.grantPut(grantee, objectsKeyPattern);\n }\n\n public grantPutAcl(\n grantee: iam.IGrantable,\n objectsKeyPattern?: string,\n ): iam.Grant {\n return this._bucket.grantPutAcl(grantee, objectsKeyPattern);\n }\n\n public grantRead(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantRead(grantee, objectsKeyPattern);\n }\n\n public grantReadWrite(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantReadWrite(grantee, objectsKeyPattern);\n }\n\n public grantWrite(\n grantee: iam.IGrantable,\n objectsKeyPattern?: any,\n ): iam.Grant {\n return this._bucket.grantWrite(grantee, objectsKeyPattern);\n }\n\n public onCloudTrailEvent(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailEvent(id, options);\n }\n\n public onCloudTrailPutObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailPutObject(id, options);\n }\n\n public onCloudTrailWriteObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): import(\"aws-cdk-lib/aws-events\").Rule {\n return this._bucket.onCloudTrailWriteObject(id, options);\n }\n\n public s3UrlForObject(key?: string): string {\n return this._bucket.s3UrlForObject(key);\n }\n\n public transferAccelerationUrlForObject(\n key?: string,\n options?: s3.TransferAccelerationUrlOptions,\n ): string {\n return this._bucket.transferAccelerationUrlForObject(key, options);\n }\n\n public urlForObject(key?: string): string {\n return this._bucket.urlForObject(key);\n }\n\n public virtualHostedUrlForObject(\n key?: string,\n options?: s3.VirtualHostedStyleUrlOptions,\n ): string {\n return this._bucket.virtualHostedUrlForObject(key, options);\n }\n\n public grantReplicationPermission(\n identity: iam.IGrantable,\n props: any,\n ): iam.Grant {\n return this._bucket.grantReplicationPermission(identity, props);\n }\n\n public addReplicationPolicy(policy: any): void {\n this._bucket.addReplicationPolicy(policy);\n }\n\n public get bucketRef(): s3.BucketReference {\n return {\n bucketArn: this._bucket.bucketArn,\n bucketName: this._bucket.bucketName,\n };\n }\n\n // Override applyRemovalPolicy to apply to all resources\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n super.applyRemovalPolicy(policy);\n this._bucket.applyRemovalPolicy(policy);\n }\n}\n","import { CfnOutput, Fn, RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport {\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\n// Check if environment is a consumer (personal/ephemeral builds import from sandbox)\nfunction checkEnvIsConsumer(env = process.env): boolean {\n return (\n env.PROJECT_ENV === CDK.ENV.PERSONAL ||\n !!env.CDK_ENV_PERSONAL ||\n env.PROJECT_ENV === \"ephemeral\" ||\n !!env.CDK_ENV_EPHEMERAL\n );\n}\n\n// Check if environment is a provider (sandbox exports for consumers)\nfunction checkEnvIsProvider(env = process.env): boolean {\n return env.PROJECT_ENV === CDK.ENV.SANDBOX;\n}\n\n// Sanitize export name to only allow alphanumeric, colons, and hyphens\nfunction cleanName(name: string): string {\n return name.replace(/[^a-zA-Z0-9:-]/g, \"\");\n}\n\n// Generate export name based on environment\nfunction exportEnvName(name: string, env = process.env): string {\n const projectKey = env.PROJECT_KEY || \"default\";\n let rawName;\n if (checkEnvIsProvider(env)) {\n rawName = `env-${env.PROJECT_ENV}-${projectKey}-cert-${name}`;\n } else if (checkEnvIsConsumer(env)) {\n rawName = `env-${CDK.ENV.SANDBOX}-${projectKey}-cert-${name}`;\n } else {\n rawName = `env-${env.PROJECT_ENV || \"default\"}-${projectKey}-cert-${name}`;\n }\n return cleanName(rawName);\n}\n\n// Resolve domain name from props or environment (called before super)\nfunction resolveDomainNameFromProps(\n props?: JaypieCertificateProps,\n): string | undefined {\n if (props?.domainName) {\n return props.domainName;\n }\n if (process.env.CDK_ENV_API_HOST_NAME) {\n return process.env.CDK_ENV_API_HOST_NAME;\n }\n if (process.env.CDK_ENV_API_SUBDOMAIN) {\n return mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n return undefined;\n}\n\n// Sanitize domain for construct ID\nfunction sanitizeDomain(domain: string): string {\n return domain.replace(/\\./g, \"-\");\n}\n\nexport interface JaypieCertificateProps {\n /**\n * Import certificate from a provider stack instead of creating one.\n * When true, imports the certificate ARN via CloudFormation export.\n * @default false\n */\n consumer?: boolean;\n /**\n * The domain name for the certificate.\n * @default Derived from CDK_ENV_API_HOST_NAME or CDK_ENV_API_SUBDOMAIN + CDK_ENV_API_HOSTED_ZONE\n */\n domainName?: string;\n /**\n * Export name override for cross-stack sharing.\n * Only used when provider is true.\n * @default Generated from environment and domain\n */\n export?: string;\n /**\n * Construct ID override. When not provided, ID is auto-generated from domain.\n * Use this to align with certificates created by other constructs.\n * @default Auto-generated as \"JaypieCert-{sanitized-domain}\"\n */\n id?: string;\n /**\n * Export certificate ARN for other stacks to import.\n * When true, creates a CloudFormation export that consumer stacks can import.\n * @default false\n */\n provider?: boolean;\n /**\n * Role tag for tagging the certificate.\n * @default CDK.ROLE.API\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS validation.\n * @default CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone;\n}\n\n/**\n * A standalone certificate construct that can be shared across constructs.\n *\n * Key feature: Uses the same `resolveCertificate()` helper as JaypieDistribution,\n * JaypieApiGateway, etc. This means:\n * - Certificates are created at the stack level and cached by domain\n * - You can \"take over\" a certificate from another construct by using the same domain\n * - Swapping between JaypieDistribution and JaypieApiGateway won't recreate certs\n *\n * Supports flexible constructor signatures:\n * - `new JaypieCertificate(scope)` - uses environment defaults\n * - `new JaypieCertificate(scope, props)` - ID auto-generated from domain\n * - `new JaypieCertificate(scope, id, props)` - explicit ID\n *\n * @example\n * // Minimal - uses environment variables for domain/zone\n * const cert = new JaypieCertificate(this);\n *\n * @example\n * // With options - ID auto-generated as \"JaypieCert-api-example-com\"\n * const cert = new JaypieCertificate(this, {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Explicit ID - useful when you need a specific construct ID\n * const cert = new JaypieCertificate(this, \"MyApiCert\", {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Take over from JaypieDistribution (uses same ID format)\n * // After removing JaypieDistribution with certificate: true\n * const cert = new JaypieCertificate(this, {\n * domainName: \"api.example.com\",\n * zone: \"example.com\",\n * });\n *\n * @example\n * // Optional: Provider/consumer pattern for cross-stack sharing\n * // In sandbox stack (explicitly export):\n * new JaypieCertificate(this, { provider: true });\n *\n * // In personal build (explicitly import):\n * new JaypieCertificate(this, { consumer: true });\n */\nexport class JaypieCertificate extends Construct implements acm.ICertificate {\n public readonly certificate: acm.ICertificate;\n public readonly certificateArn: string;\n public readonly domainName: string;\n\n /**\n * Create a certificate with environment defaults.\n */\n constructor(scope: Construct);\n /**\n * Create a certificate with options (ID auto-generated from domain).\n */\n constructor(scope: Construct, props: JaypieCertificateProps);\n /**\n * Create a certificate with explicit ID.\n */\n constructor(scope: Construct, id: string, props?: JaypieCertificateProps);\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieCertificateProps,\n maybeProps?: JaypieCertificateProps,\n ) {\n // Resolve constructor arguments\n let id: string;\n let props: JaypieCertificateProps;\n\n if (typeof idOrProps === \"string\") {\n // (scope, id, props) pattern\n id = idOrProps;\n props = maybeProps || {};\n } else if (typeof idOrProps === \"object\" && idOrProps !== null) {\n // (scope, props) pattern - auto-generate id\n props = idOrProps;\n const domainName = resolveDomainNameFromProps(props);\n if (domainName) {\n // Use \"JaypieCert-\" prefix to avoid collision with internal certificate\n id = props.id || `JaypieCert-${sanitizeDomain(domainName)}`;\n } else {\n id = props.id || \"JaypieCert\";\n }\n } else {\n // (scope) pattern - no id, no props\n props = {};\n const domainName = resolveDomainNameFromProps(props);\n if (domainName) {\n id = `JaypieCert-${sanitizeDomain(domainName)}`;\n } else {\n id = \"JaypieCert\";\n }\n }\n\n super(scope, id);\n\n const {\n consumer = false,\n domainName: propsDomainName,\n export: exportParam,\n provider = false,\n roleTag = CDK.ROLE.API,\n zone: propsZone,\n } = props;\n\n // Validate environment variables\n if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_API_SUBDOMAIN)\n ) {\n throw new Error(\"CDK_ENV_API_SUBDOMAIN is not a valid subdomain\");\n }\n\n if (\n process.env.CDK_ENV_API_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_API_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_API_HOSTED_ZONE is not a valid hostname\");\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_HOSTED_ZONE is not a valid hostname\");\n }\n\n // Determine domain name from props or environment\n let domainName = propsDomainName;\n if (!domainName) {\n if (process.env.CDK_ENV_API_HOST_NAME) {\n domainName = process.env.CDK_ENV_API_HOST_NAME;\n } else if (process.env.CDK_ENV_API_SUBDOMAIN) {\n domainName = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n }\n\n if (!domainName) {\n throw new Error(\n \"domainName is required for JaypieCertificate (or set CDK_ENV_API_HOST_NAME / CDK_ENV_API_SUBDOMAIN)\",\n );\n }\n\n if (!isValidHostname(domainName)) {\n throw new Error(\"domainName is not a valid hostname\");\n }\n\n this.domainName = domainName;\n\n // Determine zone from props or environment\n const zone =\n propsZone ||\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE;\n\n // Generate export name\n const sanitizedDomain = domainName.replace(/\\./g, \"-\");\n const exportName = exportParam\n ? cleanName(exportParam)\n : exportEnvName(sanitizedDomain);\n\n if (consumer) {\n // Import certificate ARN from provider stack\n const certificateArn = Fn.importValue(exportName);\n this.certificate = acm.Certificate.fromCertificateArn(\n this,\n \"ImportedCertificate\",\n certificateArn,\n );\n this.certificateArn = certificateArn;\n\n new CfnOutput(this, \"ConsumedCertificateArn\", {\n value: this.certificateArn,\n });\n } else {\n // Create or get cached certificate at stack level\n if (!zone) {\n throw new Error(\n \"zone is required for JaypieCertificate when not consuming (or set CDK_ENV_API_HOSTED_ZONE / CDK_ENV_HOSTED_ZONE)\",\n );\n }\n\n const hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create at stack level (enables sharing)\n const cert = resolveCertificate(this, {\n certificate: true,\n domainName,\n roleTag,\n zone: hostedZone,\n });\n\n if (!cert) {\n throw new Error(\"Failed to create certificate\");\n }\n\n this.certificate = cert;\n this.certificateArn = cert.certificateArn;\n\n if (provider) {\n new CfnOutput(this, \"ProvidedCertificateArn\", {\n value: this.certificateArn,\n exportName,\n });\n } else {\n new CfnOutput(this, \"CertificateArn\", {\n value: this.certificateArn,\n });\n }\n }\n }\n\n // IResource implementation\n public get stack(): Stack {\n return Stack.of(this);\n }\n\n public get env(): { account: string; region: string } {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this.certificate.applyRemovalPolicy(policy);\n }\n\n // ICertificate implementation\n public get certificateRef(): acm.CertificateReference {\n return this.certificate.certificateRef;\n }\n\n public metricDaysToExpiry(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this.certificate.metricDaysToExpiry(props);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Policy, PolicyStatement, Role } from \"aws-cdk-lib/aws-iam\";\nimport { Bucket, BucketProps, IBucket } from \"aws-cdk-lib/aws-s3\";\nimport { Construct } from \"constructs\";\n\nexport interface JaypieDatadogBucketProps extends BucketProps {\n /**\n * Optional construct ID\n * @default \"JaypieDatadogBucket\"\n */\n id?: string;\n\n /**\n * The scope to use when creating the S3 bucket\n * @default this (the construct itself)\n */\n bucketScope?: Construct;\n\n /**\n * The ID to use for the S3 bucket construct\n * @default \"DatadogArchiveBucket\"\n */\n bucketId?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to grant Datadog role access to this bucket\n * Uses CDK_ENV_DATADOG_ROLE_ARN if set\n * @default true\n */\n grantDatadogAccess?: boolean;\n}\n\nexport class JaypieDatadogBucket extends Construct {\n public readonly bucket: IBucket;\n public readonly policy?: Policy;\n\n /**\n * Create a new S3 bucket for Datadog log archiving with automatic IAM permissions\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieDatadogBucketProps,\n propsOrUndefined?: JaypieDatadogBucketProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieDatadogBucketProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"JaypieDatadogBucket\";\n }\n\n super(scope, id);\n\n // Extract Jaypie-specific options\n\n const {\n bucketId = \"DatadogArchiveBucket\",\n bucketScope,\n grantDatadogAccess = true,\n project,\n service = CDK.SERVICE.DATADOG,\n ...bucketProps\n } = props;\n\n // Create the bucket using bucketScope (defaults to this) and bucketId\n const effectiveBucketScope = bucketScope || this;\n this.bucket = new Bucket(effectiveBucketScope, bucketId, bucketProps);\n\n // Add tags to bucket\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Grant Datadog role access to bucket if enabled\n if (grantDatadogAccess) {\n this.policy = this.grantDatadogRoleBucketAccess({ project, service });\n }\n }\n\n /**\n * Grants the Datadog IAM role access to this bucket\n *\n * Checks for CDK_ENV_DATADOG_ROLE_ARN environment variable.\n * If found, creates a custom policy with:\n * - s3:ListBucket on bucket\n * - s3:GetObject and s3:PutObject on bucket/*\n *\n * @param options - Configuration options\n * @returns The created Policy, or undefined if CDK_ENV_DATADOG_ROLE_ARN is not set\n */\n private grantDatadogRoleBucketAccess(options?: {\n project?: string;\n service?: string;\n }): Policy | undefined {\n const datadogRoleArn = process.env.CDK_ENV_DATADOG_ROLE_ARN;\n\n // Early return if no Datadog role ARN is configured\n if (!datadogRoleArn) {\n return undefined;\n }\n\n const { project, service = CDK.SERVICE.DATADOG } = options || {};\n\n // Lookup the Datadog role\n const datadogRole = Role.fromRoleArn(this, \"DatadogRole\", datadogRoleArn);\n\n // Build policy statements for bucket access\n const statements: PolicyStatement[] = [\n // Allow list bucket\n new PolicyStatement({\n actions: [\"s3:ListBucket\"],\n resources: [this.bucket.bucketArn],\n }),\n // Allow read and write to the bucket\n new PolicyStatement({\n actions: [\"s3:GetObject\", \"s3:PutObject\"],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n ];\n\n // Create the custom policy\n const datadogBucketPolicy = new Policy(this, \"DatadogBucketPolicy\", {\n roles: [datadogRole],\n statements,\n });\n\n // Add tags\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(datadogBucketPolicy).add(CDK.TAG.PROJECT, project);\n }\n\n return datadogBucketPolicy;\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { CfnStack } from \"aws-cdk-lib\";\nimport { Rule, RuleTargetInput } from \"aws-cdk-lib/aws-events\";\nimport { LambdaFunction } from \"aws-cdk-lib/aws-events-targets\";\nimport { IFunction } from \"aws-cdk-lib/aws-lambda\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nimport { extendDatadogRole } from \"./helpers/extendDatadogRole\";\n\nconst DATADOG_FORWARDER_TEMPLATE_URL =\n \"https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml\";\nconst DEFAULT_RESERVED_CONCURRENCY = \"10\";\n\nexport interface JaypieDatadogForwarderProps {\n /**\n * Optional construct ID\n * @default \"DatadogForwarder\"\n */\n id?: string;\n\n /**\n * Datadog API key\n * @default process.env.CDK_ENV_DATADOG_API_KEY\n */\n datadogApiKey?: string;\n\n /**\n * Account identifier for Datadog tags\n * @default process.env.CDK_ENV_ACCOUNT\n */\n account?: string;\n\n /**\n * Reserved concurrency for the forwarder Lambda\n * Must be a string as required by the CloudFormation template\n * @default \"10\"\n */\n reservedConcurrency?: string;\n\n /**\n * Additional Datadog tags (comma-separated)\n * Will be appended to account tag\n */\n additionalTags?: string;\n\n /**\n * The service tag value\n * @default CDK.VENDOR.DATADOG\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to create CloudFormation events rule\n * @default true\n */\n enableCloudFormationEvents?: boolean;\n\n /**\n * Whether to extend Datadog role with custom permissions\n * Uses CDK_ENV_DATADOG_ROLE_ARN if set\n * @default true\n */\n enableRoleExtension?: boolean;\n\n /**\n * Whether to create CloudFormation output for forwarder ARN\n * @default true\n */\n createOutput?: boolean;\n\n /**\n * Custom export name for the forwarder ARN output\n * @default CDK.IMPORT.DATADOG_LOG_FORWARDER\n */\n exportName?: string;\n\n /**\n * URL to Datadog forwarder CloudFormation template\n * @default \"https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml\"\n */\n templateUrl?: string;\n}\n\nexport class JaypieDatadogForwarder extends Construct {\n public readonly cfnStack: CfnStack;\n public readonly forwarderFunction: IFunction;\n public readonly eventsRule?: Rule;\n\n /**\n * Create a new Datadog forwarder with CloudFormation nested stack\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieDatadogForwarderProps,\n propsOrUndefined?: JaypieDatadogForwarderProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieDatadogForwarderProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n id = props.id || \"DatadogForwarder\";\n }\n\n super(scope, id);\n\n // Resolve options with defaults\n const {\n account = process.env.CDK_ENV_ACCOUNT,\n additionalTags,\n createOutput = true,\n datadogApiKey = process.env.CDK_ENV_DATADOG_API_KEY,\n enableCloudFormationEvents = true,\n enableRoleExtension = true,\n exportName = CDK.IMPORT.DATADOG_LOG_FORWARDER,\n project,\n reservedConcurrency = DEFAULT_RESERVED_CONCURRENCY,\n service = CDK.VENDOR.DATADOG,\n templateUrl = DATADOG_FORWARDER_TEMPLATE_URL,\n } = props;\n\n // Validate required parameters\n if (!datadogApiKey) {\n throw new Error(\n \"Datadog API key is required. Provide via datadogApiKey prop or CDK_ENV_DATADOG_API_KEY environment variable.\",\n );\n }\n\n // Build Datadog tags\n let ddTags = account ? `account:${account}` : \"\";\n if (additionalTags) {\n ddTags = ddTags ? `${ddTags},${additionalTags}` : additionalTags;\n }\n\n // Deploy Datadog CloudFormation stack\n this.cfnStack = new CfnStack(this, \"Stack\", {\n parameters: {\n DdApiKey: datadogApiKey,\n DdTags: ddTags,\n ReservedConcurrency: reservedConcurrency,\n },\n templateUrl,\n });\n\n // Add tags to stack\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(this.cfnStack).add(CDK.TAG.PROJECT, project);\n }\n\n // Extract forwarder function from stack outputs\n this.forwarderFunction = lambda.Function.fromFunctionArn(\n this,\n \"Function\",\n this.cfnStack.getAtt(\"Outputs.DatadogForwarderArn\").toString(),\n );\n\n // Extend Datadog role with custom permissions if enabled\n if (enableRoleExtension) {\n extendDatadogRole(this, { project, service });\n }\n\n // Create CloudFormation events rule if enabled\n if (enableCloudFormationEvents) {\n this.eventsRule = new Rule(this, \"CloudFormationEventsRule\", {\n eventPattern: {\n source: [\"aws.cloudformation\"],\n },\n targets: [\n new LambdaFunction(this.forwarderFunction, {\n event: RuleTargetInput.fromEventPath(\"$\"),\n }),\n ],\n });\n\n // Add tags to events rule\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.VENDOR, CDK.VENDOR.DATADOG);\n if (project) {\n cdk.Tags.of(this.eventsRule).add(CDK.TAG.PROJECT, project);\n }\n }\n\n // Create CloudFormation output if enabled\n if (createOutput) {\n new cdk.CfnOutput(this, \"ForwarderArnOutput\", {\n description: \"Datadog Log Forwarder Lambda ARN\",\n exportName,\n value: this.cfnStack.getAtt(\"Outputs.DatadogForwarderArn\").toString(),\n });\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieDatadogSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"MongoConnectionString\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"DATADOG_API_KEY\",\n roleTag: CDK.ROLE.MONITORING,\n vendorTag: CDK.VENDOR.DATADOG,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { Duration, Fn, RemovalPolicy, Stack, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as cloudfront from \"aws-cdk-lib/aws-cloudfront\";\nimport * as origins from \"aws-cdk-lib/aws-cloudfront-origins\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-s3-notifications\";\nimport { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieDistributionProps extends Omit<\n cloudfront.DistributionProps,\n \"certificate\" | \"defaultBehavior\" | \"logBucket\"\n> {\n /**\n * SSL certificate for the CloudFront distribution\n * @default true (creates a new certificate)\n */\n certificate?: boolean | acm.ICertificate;\n /**\n * Override default behavior (optional if handler is provided)\n */\n defaultBehavior?: cloudfront.BehaviorOptions;\n /**\n * Log destination configuration for CloudFront access logs\n * - LambdaDestination: Use a specific Lambda destination for S3 notifications\n * - true: Use Datadog forwarder for S3 notifications (default)\n * - false: Disable S3 notifications (logging still occurs if logBucket is set)\n * @default true\n */\n destination?: LambdaDestination | boolean;\n /**\n * External log bucket for CloudFront access logs.\n * - IBucket: Use existing bucket directly\n * - string: Bucket name to import\n * - { exportName: string }: CloudFormation export name to import\n * - true: Use account logging bucket (CDK.IMPORT.LOG_BUCKET)\n * @default undefined (creates new bucket if destination !== false)\n */\n logBucket?: s3.IBucket | string | { exportName: string } | true;\n /**\n * The origin handler - can be an IOrigin, IFunctionUrl, or IFunction\n * If IFunction, a FunctionUrl will be created with auth NONE\n */\n handler?: cloudfront.IOrigin | lambda.IFunctionUrl | lambda.IFunction;\n /**\n * The domain name for the distribution.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"api.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @default mergeDomain(CDK_ENV_API_SUBDOMAIN, CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE)\n *\n * @example\n * // Direct string\n * host: \"api.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { subdomain: \"api\" }\n */\n host?: string | HostConfig;\n /**\n * Enable response streaming for Lambda Function URLs.\n * Use with createLambdaStreamHandler for SSE/streaming responses.\n * @default false\n */\n streaming?: boolean;\n /**\n * Origin read timeout - how long CloudFront waits for a response from the origin.\n * This is the maximum time allowed for the origin to respond.\n * @default CDK.DURATION.CLOUDFRONT_API (120 seconds)\n * @max Duration.seconds(120)\n */\n originReadTimeout?: Duration;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS records\n * @default CDK_ENV_API_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone;\n}\n\nexport class JaypieDistribution\n extends Construct\n implements cloudfront.IDistribution\n{\n public readonly certificate?: acm.ICertificate;\n public readonly distribution: cloudfront.Distribution;\n public readonly distributionArn: string;\n public readonly distributionDomainName: string;\n public readonly distributionId: string;\n public readonly domainName: string;\n public readonly functionUrl?: lambda.FunctionUrl;\n public readonly host?: string;\n public readonly logBucket?: s3.IBucket;\n\n constructor(scope: Construct, id: string, props: JaypieDistributionProps) {\n super(scope, id);\n\n const {\n certificate: certificateProp = true,\n defaultBehavior: propsDefaultBehavior,\n destination: destinationProp = true,\n handler,\n host: propsHost,\n logBucket: logBucketProp,\n originReadTimeout = Duration.seconds(CDK.DURATION.CLOUDFRONT_API),\n roleTag = CDK.ROLE.API,\n streaming = false,\n zone: propsZone,\n ...distributionProps\n } = props;\n\n // Validate environment variables\n if (\n process.env.CDK_ENV_API_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_API_SUBDOMAIN)\n ) {\n throw new Error(\"CDK_ENV_API_SUBDOMAIN is not a valid subdomain\");\n }\n\n if (\n process.env.CDK_ENV_API_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_API_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_API_HOSTED_ZONE is not a valid hostname\");\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new Error(\"CDK_ENV_HOSTED_ZONE is not a valid hostname\");\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n try {\n host = envHostname(propsHost);\n } catch {\n host = undefined;\n }\n } else {\n try {\n if (process.env.CDK_ENV_API_HOST_NAME) {\n host = process.env.CDK_ENV_API_HOST_NAME;\n } else if (process.env.CDK_ENV_API_SUBDOMAIN) {\n host = mergeDomain(\n process.env.CDK_ENV_API_SUBDOMAIN,\n process.env.CDK_ENV_API_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n }\n } catch {\n host = undefined;\n }\n }\n\n if (host && !isValidHostname(host)) {\n throw new Error(\"Host is not a valid hostname\");\n }\n\n this.host = host;\n\n // Determine zone from props or environment\n const zone = propsZone || process.env.CDK_ENV_HOSTED_ZONE;\n\n // Resolve the origin from handler\n // Check order matters: IFunctionUrl before IOrigin (FunctionUrl also has bind method)\n // IFunction before IFunctionUrl (IFunction doesn't have functionUrlId)\n let origin: cloudfront.IOrigin | undefined;\n if (handler) {\n const resolvedInvokeMode = streaming\n ? lambda.InvokeMode.RESPONSE_STREAM\n : lambda.InvokeMode.BUFFERED;\n\n if (this.isIFunction(handler)) {\n // Create FunctionUrl for the Lambda function\n const functionUrl = new lambda.FunctionUrl(this, \"FunctionUrl\", {\n function: handler,\n authType: lambda.FunctionUrlAuthType.NONE,\n invokeMode: resolvedInvokeMode,\n });\n this.functionUrl = functionUrl;\n origin = new origins.FunctionUrlOrigin(functionUrl, {\n readTimeout: originReadTimeout,\n });\n } else if (this.isIFunctionUrl(handler)) {\n origin = new origins.FunctionUrlOrigin(handler, {\n readTimeout: originReadTimeout,\n });\n } else if (this.isIOrigin(handler)) {\n origin = handler;\n }\n }\n\n // Build default behavior\n let defaultBehavior: cloudfront.BehaviorOptions;\n if (propsDefaultBehavior) {\n defaultBehavior = propsDefaultBehavior;\n } else if (origin) {\n defaultBehavior = {\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n origin,\n originRequestPolicy:\n cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,\n viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n };\n } else {\n throw new Error(\n \"Either handler or defaultBehavior must be provided to JaypieDistribution\",\n );\n }\n\n // Resolve hosted zone and certificate\n // Only resolve zone when we need it (for certificate or DNS)\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone && certificateProp !== false) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n certificateToUse = resolveCertificate(this, {\n certificate: certificateProp,\n domainName: host,\n roleTag,\n zone: hostedZone,\n });\n\n this.certificate = certificateToUse;\n }\n\n // Resolve or create log bucket\n let logBucket: s3.IBucket | undefined;\n const isExternalBucket = logBucketProp !== undefined;\n\n if (logBucketProp !== undefined) {\n // Use external bucket\n logBucket = this.resolveLogBucket(logBucketProp);\n } else if (destinationProp !== false) {\n // Create new bucket (original behavior)\n const createdBucket = new s3.Bucket(this, constructEnvName(\"LogBucket\"), {\n autoDeleteObjects: true,\n lifecycleRules: [\n {\n expiration: Duration.days(90),\n transitions: [\n {\n storageClass: s3.StorageClass.INFREQUENT_ACCESS,\n transitionAfter: Duration.days(30),\n },\n ],\n },\n ],\n objectOwnership: s3.ObjectOwnership.OBJECT_WRITER,\n removalPolicy: RemovalPolicy.DESTROY,\n });\n Tags.of(createdBucket).add(CDK.TAG.ROLE, CDK.ROLE.STORAGE);\n logBucket = createdBucket;\n }\n\n // Add S3 notifications if we have a bucket and destination is not false\n if (logBucket && destinationProp !== false && !isExternalBucket) {\n // Only add notifications to buckets we created (not external buckets)\n const lambdaDestination =\n destinationProp === true\n ? new LambdaDestination(resolveDatadogForwarderFunction(this))\n : destinationProp;\n\n (logBucket as s3.Bucket).addEventNotification(\n s3.EventType.OBJECT_CREATED,\n lambdaDestination,\n );\n }\n\n this.logBucket = logBucket;\n\n // Create the CloudFront distribution\n this.distribution = new cloudfront.Distribution(\n this,\n constructEnvName(\"Distribution\"),\n {\n defaultBehavior,\n ...(host && certificateToUse\n ? {\n certificate: certificateToUse,\n domainNames: [host],\n }\n : {}),\n ...(logBucket\n ? {\n enableLogging: true,\n logBucket,\n logFilePrefix: \"cloudfront-logs/\",\n }\n : {}),\n ...distributionProps,\n },\n );\n Tags.of(this.distribution).add(CDK.TAG.ROLE, roleTag);\n\n this.distributionArn = `arn:aws:cloudfront::${Stack.of(this).account}:distribution/${this.distribution.distributionId}`;\n this.distributionDomainName = this.distribution.distributionDomainName;\n this.distributionId = this.distribution.distributionId;\n this.domainName = this.distribution.domainName;\n\n // Create DNS records if we have host and zone\n if (host && hostedZone) {\n const aRecord = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(aRecord).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n\n const aaaaRecord = new route53.AaaaRecord(this, \"AaaaAliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(aaaaRecord).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n }\n\n // Type guards for handler types\n private isIOrigin(handler: unknown): handler is cloudfront.IOrigin {\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"bind\" in handler &&\n typeof (handler as cloudfront.IOrigin).bind === \"function\"\n );\n }\n\n private isIFunctionUrl(handler: unknown): handler is lambda.IFunctionUrl {\n // FunctionUrl has 'url' property which is the function URL string\n // IFunction does not have 'url' property\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"url\" in handler &&\n \"functionArn\" in handler\n );\n }\n\n private isIFunction(handler: unknown): handler is lambda.IFunction {\n // IFunction has functionArn and functionName but NOT 'url'\n // (FunctionUrl also has functionArn but also has 'url')\n return (\n typeof handler === \"object\" &&\n handler !== null &&\n \"functionArn\" in handler &&\n \"functionName\" in handler &&\n !(\"url\" in handler)\n );\n }\n\n private isExportNameObject(value: unknown): value is { exportName: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"exportName\" in value &&\n typeof (value as { exportName: string }).exportName === \"string\"\n );\n }\n\n private resolveLogBucket(\n logBucketProp: s3.IBucket | string | { exportName: string } | true,\n ): s3.IBucket {\n // true = use account logging bucket\n if (logBucketProp === true) {\n const bucketName = Fn.importValue(CDK.IMPORT.LOG_BUCKET);\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", bucketName);\n }\n\n // { exportName: string } = import from CloudFormation export\n if (this.isExportNameObject(logBucketProp)) {\n const bucketName = Fn.importValue(logBucketProp.exportName);\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", bucketName);\n }\n\n // string = bucket name\n if (typeof logBucketProp === \"string\") {\n return s3.Bucket.fromBucketName(this, \"ImportedLogBucket\", logBucketProp);\n }\n\n // IBucket = use directly\n return logBucketProp;\n }\n\n // Implement IDistribution interface\n public get env() {\n return {\n account: Stack.of(this).account,\n region: Stack.of(this).region,\n };\n }\n\n public get stack(): Stack {\n return this.distribution.stack;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this.distribution.applyRemovalPolicy(policy);\n }\n\n public grant(\n identity: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this.distribution.grant(identity, ...actions);\n }\n\n public grantCreateInvalidation(\n identity: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this.distribution.grantCreateInvalidation(identity);\n }\n\n public get distributionRef(): cloudfront.DistributionReference {\n return {\n distributionId: this.distribution.distributionId,\n };\n }\n}\n","import * as cdk from \"aws-cdk-lib\";\nimport {\n ARecord,\n CnameRecord,\n IHostedZone,\n MxRecord,\n NsRecord,\n RecordTarget,\n TxtRecord,\n} from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\nimport { resolveHostedZone } from \"./helpers/resolveHostedZone\";\n\nexport interface JaypieDnsRecordProps {\n /**\n * Optional comment to add to the DNS record\n */\n comment?: string;\n /**\n * Optional record name (subdomain). If not provided, creates record at zone apex\n */\n recordName?: string;\n /**\n * Time to live for the DNS record\n * @default CDK.DNS.CONFIG.TTL (5 minutes)\n */\n ttl?: cdk.Duration;\n /**\n * The DNS record type (A, CNAME, MX, NS, TXT)\n */\n type: string;\n /**\n * Values for the DNS record. Format depends on record type:\n * - A: Array of IPv4 addresses (e.g., [\"1.2.3.4\", \"5.6.7.8\"])\n * - CNAME: Single domain name as first element (e.g., [\"example.com\"])\n * - MX: Array of objects with priority and hostName (e.g., [{priority: 10, hostName: \"mail.example.com\"}])\n * - NS: Array of name server addresses (e.g., [\"ns1.example.com\", \"ns2.example.com\"])\n * - TXT: Array of text values (e.g., [\"v=spf1 include:example.com ~all\"])\n */\n values: string[] | Array<{ hostName: string; priority: number }>;\n /**\n * The hosted zone where the record will be created.\n * Can be either:\n * - A string (zone name) - will lookup the hosted zone by domain name\n * - An IHostedZone object - will use the provided zone directly\n */\n zone: string | IHostedZone;\n}\n\nexport class JaypieDnsRecord extends Construct {\n public readonly record:\n | ARecord\n | CnameRecord\n | MxRecord\n | NsRecord\n | TxtRecord;\n\n constructor(scope: Construct, id: string, props: JaypieDnsRecordProps) {\n super(scope, id);\n\n const { comment, recordName, type, values } = props;\n const ttl = props.ttl || cdk.Duration.seconds(CDK.DNS.CONFIG.TTL);\n\n // Resolve the hosted zone (supports both string and IHostedZone)\n const zone = resolveHostedZone(scope, {\n name: `${id}HostedZone`,\n zone: props.zone,\n });\n\n // Common properties for all record types\n const baseProps = {\n comment,\n recordName,\n ttl,\n zone,\n };\n\n // Create the appropriate record based on type\n switch (type) {\n case CDK.DNS.RECORD.A: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"A record requires at least one IP address\",\n );\n }\n this.record = new ARecord(this, \"Record\", {\n ...baseProps,\n target: RecordTarget.fromIpAddresses(...(values as string[])),\n });\n break;\n }\n\n case CDK.DNS.RECORD.CNAME: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\"CNAME record requires a domain name\");\n }\n this.record = new CnameRecord(this, \"Record\", {\n ...baseProps,\n domainName: (values as string[])[0],\n });\n break;\n }\n\n case CDK.DNS.RECORD.MX: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"MX record requires at least one mail server\",\n );\n }\n this.record = new MxRecord(this, \"Record\", {\n ...baseProps,\n values: values as Array<{ hostName: string; priority: number }>,\n });\n break;\n }\n\n case CDK.DNS.RECORD.NS: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"NS record requires at least one name server\",\n );\n }\n this.record = new NsRecord(this, \"Record\", {\n ...baseProps,\n values: values as string[],\n });\n break;\n }\n\n case CDK.DNS.RECORD.TXT: {\n if (!Array.isArray(values) || values.length === 0) {\n throw new ConfigurationError(\n \"TXT record requires at least one value\",\n );\n }\n this.record = new TxtRecord(this, \"Record\", {\n ...baseProps,\n values: values as string[],\n });\n break;\n }\n\n default:\n throw new ConfigurationError(\n `Unsupported DNS record type: ${type}. Supported types: A, CNAME, MX, NS, TXT`,\n );\n }\n\n // Add standard tags to the DNS record\n cdk.Tags.of(this.record).add(CDK.TAG.SERVICE, CDK.SERVICE.INFRASTRUCTURE);\n cdk.Tags.of(this.record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n }\n}\n","import { Construct } from \"constructs\";\nimport { RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\n\nimport {\n DEFAULT_INDEXES,\n DEFAULT_SORT_KEY,\n generateIndexName,\n type IndexDefinition,\n} from \"@jaypie/fabric\";\n\nimport { CDK } from \"./constants\";\nimport { isProductionEnv } from \"./helpers/isEnv\";\n\n//\n//\n// Constants\n//\n\n/** Composite key separator used in GSI partition keys */\nconst SEPARATOR = \"#\";\n\n//\n//\n// Helper Functions\n//\n\n/**\n * Convert IndexDefinition[] from @jaypie/fabric to CDK GlobalSecondaryIndexPropsV2[]\n *\n * @param indexes - Array of IndexDefinition from @jaypie/fabric\n * @returns Array of CDK GlobalSecondaryIndexPropsV2\n */\nfunction indexesToGsi(\n indexes: IndexDefinition[],\n): dynamodb.GlobalSecondaryIndexPropsV2[] {\n return indexes.map((index) => {\n // Generate index name from pk fields if not provided\n const indexName = index.name ?? generateIndexName(index.pk);\n\n // Sort key defaults to [\"sequence\"] if not provided\n const skFields = index.sk ?? DEFAULT_SORT_KEY;\n\n return {\n indexName,\n partitionKey: {\n name: indexName,\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.ALL,\n sortKey:\n skFields.length === 1 && skFields[0] === \"sequence\"\n ? { name: \"sequence\", type: dynamodb.AttributeType.NUMBER }\n : {\n name: skFields.join(SEPARATOR),\n type: dynamodb.AttributeType.STRING,\n },\n };\n });\n}\n\n//\n//\n// Types\n//\n\nexport interface JaypieDynamoDbProps extends Omit<\n dynamodb.TablePropsV2,\n \"globalSecondaryIndexes\" | \"partitionKey\" | \"sortKey\"\n> {\n /**\n * Configure GSIs for the table using @jaypie/fabric IndexDefinition format.\n * - `undefined`: No GSIs (default)\n * - Array of IndexDefinition: Use the specified indexes\n *\n * Use `JaypieDynamoDb.DEFAULT_INDEXES` for the standard Jaypie GSIs.\n *\n * @example\n * // No GSIs (default)\n * new JaypieDynamoDb(this, \"myTable\");\n *\n * @example\n * // With default Jaypie indexes\n * new JaypieDynamoDb(this, \"myTable\", {\n * indexes: JaypieDynamoDb.DEFAULT_INDEXES,\n * });\n *\n * @example\n * // With custom indexes\n * new JaypieDynamoDb(this, \"myTable\", {\n * indexes: [\n * { pk: [\"scope\", \"model\"], sk: [\"sequence\"] },\n * { pk: [\"scope\", \"model\", \"type\"], sk: [\"sequence\"], sparse: true },\n * ],\n * });\n */\n indexes?: IndexDefinition[];\n /**\n * Partition key attribute definition.\n * @default { name: \"model\", type: AttributeType.STRING }\n */\n partitionKey?: dynamodb.Attribute;\n /**\n * Optional project identifier for tagging\n */\n project?: string;\n /**\n * Optional role tag for the table\n */\n roleTag?: string;\n /**\n * Optional service identifier for tagging\n */\n service?: string;\n /**\n * Sort key attribute definition.\n * @default { name: \"id\", type: AttributeType.STRING }\n */\n sortKey?: dynamodb.Attribute;\n /**\n * Optional vendor tag for the table\n */\n vendorTag?: string;\n}\n\n//\n//\n// Main\n//\n\n/**\n * DynamoDB table with Jaypie single-table design patterns.\n *\n * Creates a table with:\n * - Partition key: `model` (String)\n * - Sort key: `id` (String)\n * - Billing: PAY_PER_REQUEST (on-demand)\n * - Removal policy: RETAIN in production, DESTROY otherwise\n * - No GSIs by default (use `indexes` prop to add them)\n * - Table name: CDK-generated (includes stack name and unique suffix)\n *\n * @example\n * // Shorthand: construct id is \"JaypieDynamoDb-myApp\", table name is CDK-generated\n * const table = new JaypieDynamoDb(this, \"myApp\");\n *\n * @example\n * // With default Jaypie indexes\n * const table = new JaypieDynamoDb(this, \"myApp\", {\n * indexes: JaypieDynamoDb.DEFAULT_INDEXES,\n * });\n *\n * @example\n * // With explicit table name (overrides CDK-generated name)\n * const table = new JaypieDynamoDb(this, \"MyTable\", {\n * tableName: \"custom-table-name\",\n * indexes: [\n * { pk: [\"scope\", \"model\"] },\n * { pk: [\"scope\", \"model\", \"type\"], sparse: true },\n * ],\n * });\n */\nexport class JaypieDynamoDb extends Construct implements dynamodb.ITableV2 {\n /**\n * Default Jaypie GSI definitions from @jaypie/fabric.\n * Pass to `indexes` prop to create all standard GSIs.\n */\n public static readonly DEFAULT_INDEXES = DEFAULT_INDEXES;\n\n private readonly _table: dynamodb.TableV2;\n\n constructor(scope: Construct, id: string, props: JaypieDynamoDbProps = {}) {\n // Determine if this is shorthand usage: new JaypieDynamoDb(this, \"myApp\")\n // In shorthand, construct id is prefixed for clarity; tableName left undefined\n // so CDK generates it with stack prefix (e.g., cdk-sponsor-project-env-nonce-app-JaypieDynamoDb-myApp-Table-XXXXX)\n const isShorthand = !props.tableName && !id.includes(\"-\");\n const constructId = isShorthand ? `JaypieDynamoDb-${id}` : id;\n\n super(scope, constructId);\n\n const {\n billing = dynamodb.Billing.onDemand(),\n indexes,\n partitionKey = {\n name: \"model\",\n type: dynamodb.AttributeType.STRING,\n },\n project,\n removalPolicy = isProductionEnv()\n ? RemovalPolicy.RETAIN\n : RemovalPolicy.DESTROY,\n roleTag = CDK.ROLE.STORAGE,\n service,\n sortKey = { name: \"id\", type: dynamodb.AttributeType.STRING },\n vendorTag,\n ...restProps\n } = props;\n\n // Convert IndexDefinition[] to CDK GSI props\n const globalSecondaryIndexes = indexes ? indexesToGsi(indexes) : undefined;\n\n this._table = new dynamodb.TableV2(this, \"Table\", {\n billing,\n globalSecondaryIndexes,\n partitionKey,\n removalPolicy,\n sortKey,\n ...restProps,\n });\n\n // Apply tags\n if (project) {\n Tags.of(this._table).add(CDK.TAG.PROJECT, project);\n }\n Tags.of(this._table).add(CDK.TAG.ROLE, roleTag);\n if (service) {\n Tags.of(this._table).add(CDK.TAG.SERVICE, service);\n }\n if (vendorTag) {\n Tags.of(this._table).add(CDK.TAG.VENDOR, vendorTag);\n }\n }\n\n //\n //\n // Public accessors\n //\n\n /**\n * The underlying DynamoDB TableV2 construct\n */\n public get table(): dynamodb.TableV2 {\n return this._table;\n }\n\n //\n //\n // ITableV2 implementation\n //\n\n public get env() {\n return this._table.env;\n }\n\n public get stack() {\n return this._table.stack;\n }\n\n public get tableArn(): string {\n return this._table.tableArn;\n }\n\n public get tableId(): string | undefined {\n return this._table.tableId;\n }\n\n public get tableName(): string {\n return this._table.tableName;\n }\n\n public get tableRef(): dynamodb.TableReference {\n return this._table.tableRef;\n }\n\n public get tableStreamArn(): string | undefined {\n return this._table.tableStreamArn;\n }\n\n public get encryptionKey(): import(\"aws-cdk-lib/aws-kms\").IKey | undefined {\n return this._table.encryptionKey;\n }\n\n public applyRemovalPolicy(policy: RemovalPolicy): void {\n this._table.applyRemovalPolicy(policy);\n }\n\n public grant(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grant(grantee, ...actions);\n }\n\n public grantFullAccess(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantFullAccess(grantee);\n }\n\n public grantReadData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantReadData(grantee);\n }\n\n public grantReadWriteData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantReadWriteData(grantee);\n }\n\n public grantStream(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ...actions: string[]\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantStream(grantee, ...actions);\n }\n\n public grantStreamRead(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantStreamRead(grantee);\n }\n\n public grantTableListStreams(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantTableListStreams(grantee);\n }\n\n public grantWriteData(\n grantee: import(\"aws-cdk-lib/aws-iam\").IGrantable,\n ): import(\"aws-cdk-lib/aws-iam\").Grant {\n return this._table.grantWriteData(grantee);\n }\n\n public metric(\n metricName: string,\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metric(metricName, props);\n }\n\n public metricConditionalCheckFailedRequests(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConditionalCheckFailedRequests(props);\n }\n\n public metricConsumedReadCapacityUnits(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConsumedReadCapacityUnits(props);\n }\n\n public metricConsumedWriteCapacityUnits(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricConsumedWriteCapacityUnits(props);\n }\n\n public metricSuccessfulRequestLatency(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricSuccessfulRequestLatency(props);\n }\n\n public metricSystemErrorsForOperations(\n props?: dynamodb.SystemErrorsForOperationsMetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").IMetric {\n return this._table.metricSystemErrorsForOperations(props);\n }\n\n public metricThrottledRequests(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricThrottledRequests(props);\n }\n\n public metricThrottledRequestsForOperations(\n props?: dynamodb.OperationsMetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").IMetric {\n return this._table.metricThrottledRequestsForOperations(props);\n }\n\n public metricUserErrors(\n props?: import(\"aws-cdk-lib/aws-cloudwatch\").MetricOptions,\n ): import(\"aws-cdk-lib/aws-cloudwatch\").Metric {\n return this._table.metricUserErrors(props);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Rule, RuleProps, RuleTargetInput } from \"aws-cdk-lib/aws-events\";\nimport { LambdaFunction } from \"aws-cdk-lib/aws-events-targets\";\nimport { IFunction } from \"aws-cdk-lib/aws-lambda\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieEventsRuleProps extends Omit<RuleProps, \"targets\"> {\n /**\n * Optional construct ID\n * @default Generated from source or \"EventsRule\"\n */\n id?: string;\n\n /**\n * Event source(s) to match\n * @default undefined\n */\n source?: string | string[];\n\n /**\n * Lambda function to target\n * Can be:\n * - An IFunction instance\n * - undefined (will resolve Datadog forwarder)\n * @default Resolves Datadog forwarder via resolveDatadogForwarderFunction\n */\n targetFunction?: IFunction;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.DATADOG\n */\n service?: string;\n\n /**\n * The vendor tag value\n * @default CDK.VENDOR.DATADOG\n */\n vendor?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n}\n\nexport class JaypieEventsRule extends Construct {\n public readonly rule: Rule;\n public readonly targetFunction: IFunction;\n\n /**\n * Create a new EventBridge rule that targets a Lambda function\n */\n constructor(\n scope: Construct,\n idOrSourceOrProps?: string | JaypieEventsRuleProps,\n propsOrUndefined?: JaypieEventsRuleProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieEventsRuleProps;\n let id: string;\n\n if (typeof idOrSourceOrProps === \"string\") {\n // Check if it looks like an AWS source (starts with \"aws.\")\n if (idOrSourceOrProps.startsWith(\"aws.\")) {\n // First param is source, second is props\n props = propsOrUndefined || {};\n props.source = idOrSourceOrProps;\n // Generate ID from source\n const sourceName = idOrSourceOrProps\n .replace(\"aws.\", \"\")\n .split(\".\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n id = props.id || `${sourceName}EventsRule`;\n } else {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrSourceOrProps;\n }\n } else {\n // First param is props\n props = idOrSourceOrProps || {};\n if (props.source) {\n const sourceName =\n typeof props.source === \"string\"\n ? props.source\n .replace(\"aws.\", \"\")\n .split(\".\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\")\n : \"Events\";\n id = props.id || `${sourceName}EventsRule`;\n } else {\n id = props.id || \"EventsRule\";\n }\n }\n\n super(scope, id);\n\n // Extract Jaypie-specific options\n\n const {\n id: _id,\n project,\n service = CDK.SERVICE.DATADOG,\n source,\n targetFunction,\n vendor = CDK.VENDOR.DATADOG,\n ...ruleProps\n } = props;\n\n // Resolve target function\n this.targetFunction =\n targetFunction || resolveDatadogForwarderFunction(scope);\n\n // Build event pattern if source is specified\n const eventPattern = source\n ? {\n ...ruleProps.eventPattern,\n source: Array.isArray(source) ? source : [source],\n }\n : ruleProps.eventPattern;\n\n // Build rule props\n const finalRuleProps: RuleProps = {\n ...ruleProps,\n eventPattern,\n targets: [\n new LambdaFunction(this.targetFunction, {\n event: RuleTargetInput.fromEventPath(\"$\"),\n }),\n ],\n };\n\n // Create the rule\n this.rule = new Rule(this, \"Rule\", finalRuleProps);\n\n // Add tags\n cdk.Tags.of(this.rule).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n cdk.Tags.of(this.rule).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.rule).add(CDK.TAG.VENDOR, vendor);\n if (project) {\n cdk.Tags.of(this.rule).add(CDK.TAG.PROJECT, project);\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration } from \"aws-cdk-lib\";\nimport { CDK } from \"./constants\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\nexport class JaypieExpressLambda extends JaypieLambda {\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id, {\n timeout: Duration.seconds(CDK.DURATION.EXPRESS_API),\n roleTag: CDK.ROLE.API,\n ...props,\n });\n }\n}\n","import { CfnOutput, Duration, Fn, Stack, Tags } from \"aws-cdk-lib\";\nimport {\n Effect,\n FederatedPrincipal,\n PolicyStatement,\n Role,\n} from \"aws-cdk-lib/aws-iam\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\nexport interface JaypieGitHubDeployRoleProps {\n oidcProviderArn?: string;\n output?: boolean | string;\n repoRestriction?: string;\n}\n\nexport class JaypieGitHubDeployRole extends Construct {\n private readonly _role: Role;\n\n constructor(\n scope: Construct,\n id: string = \"GitHubDeployRole\",\n props: JaypieGitHubDeployRoleProps = {},\n ) {\n super(scope, id);\n\n const {\n oidcProviderArn = Fn.importValue(CDK.IMPORT.OIDC_PROVIDER),\n output = true,\n repoRestriction: propsRepoRestriction,\n } = props;\n\n // Extract account ID from the scope\n const accountId = Stack.of(this).account;\n\n // Resolve repoRestriction from props or environment variables\n let repoRestriction = propsRepoRestriction;\n if (!repoRestriction) {\n const envRepo = process.env.CDK_ENV_REPO || process.env.PROJECT_REPO;\n if (!envRepo) {\n throw new ConfigurationError(\n \"No repoRestriction provided. Set repoRestriction prop, CDK_ENV_REPO, or PROJECT_REPO environment variable\",\n );\n }\n // Extract organization from owner/repo format and create org-wide restriction\n const organization = envRepo.split(\"/\")[0];\n repoRestriction = `repo:${organization}/*:*`;\n }\n\n // Create the IAM role\n this._role = new Role(this, \"GitHubActionsRole\", {\n assumedBy: new FederatedPrincipal(\n oidcProviderArn,\n {\n StringLike: {\n \"token.actions.githubusercontent.com:sub\": repoRestriction,\n },\n },\n \"sts:AssumeRoleWithWebIdentity\",\n ),\n maxSessionDuration: Duration.hours(1),\n path: \"/\",\n });\n Tags.of(this._role).add(CDK.TAG.ROLE, CDK.ROLE.DEPLOY);\n\n // Allow the role to access the GitHub OIDC provider\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\"sts:AssumeRoleWithWebIdentity\"],\n resources: [`arn:aws:iam::${accountId}:oidc-provider/*`],\n }),\n );\n\n // Allow the role to deploy CDK apps\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\n \"cloudformation:CreateStack\",\n \"cloudformation:DeleteStack\",\n \"cloudformation:DescribeStackEvents\",\n \"cloudformation:DescribeStackResource\",\n \"cloudformation:DescribeStackResources\",\n \"cloudformation:DescribeStacks\",\n \"cloudformation:GetTemplate\",\n \"cloudformation:SetStackPolicy\",\n \"cloudformation:UpdateStack\",\n \"cloudformation:ValidateTemplate\",\n \"iam:PassRole\",\n \"route53:ListHostedZones*\",\n \"s3:GetObject\",\n \"s3:ListBucket\",\n ],\n effect: Effect.ALLOW,\n resources: [\"*\"],\n }),\n );\n\n this._role.addToPolicy(\n new PolicyStatement({\n actions: [\"iam:PassRole\", \"sts:AssumeRole\"],\n effect: Effect.ALLOW,\n resources: [\n \"arn:aws:iam::*:role/cdk-hnb659fds-deploy-role-*\",\n \"arn:aws:iam::*:role/cdk-hnb659fds-file-publishing-*\",\n \"arn:aws:iam::*:role/cdk-readOnlyRole\",\n ],\n }),\n );\n\n // Export the ARN of the role\n if (output !== false) {\n const outputId =\n typeof output === \"string\" ? output : \"GitHubActionsRoleArn\";\n new CfnOutput(this, outputId, {\n value: this._role.roleArn,\n });\n }\n }\n\n public get role(): Role {\n return this._role;\n }\n\n public get roleArn(): string {\n return this._role.roleArn;\n }\n\n public get roleName(): string {\n return this._role.roleName;\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { ServicePrincipal } from \"aws-cdk-lib/aws-iam\";\nimport {\n FilterPattern,\n ILogGroup,\n LogGroup,\n RetentionDays,\n} from \"aws-cdk-lib/aws-logs\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-logs-destinations\";\nimport { HostedZone, IHostedZone } from \"aws-cdk-lib/aws-route53\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogLoggingDestination } from \"./helpers/resolveDatadogLoggingDestination\";\nimport { JaypieDnsRecord, JaypieDnsRecordProps } from \"./JaypieDnsRecord\";\n\nconst SERVICE = {\n ROUTE53: \"route53.amazonaws.com\",\n} as const;\n\n/**\n * Check if a string is a valid hostname\n */\nfunction isValidHostname(str: string): boolean {\n // Check if it contains a dot and matches hostname pattern\n if (!str.includes(\".\")) return false;\n\n // Basic hostname validation: alphanumeric, hyphens, dots\n // Each label must start and end with alphanumeric\n const hostnameRegex = /^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,}$/i;\n return hostnameRegex.test(str);\n}\n\n/**\n * DNS record configuration for JaypieHostedZone\n * Omits 'zone' since it will be automatically set to the created hosted zone\n */\nexport interface JaypieHostedZoneRecordProps extends Omit<\n JaypieDnsRecordProps,\n \"zone\"\n> {\n /**\n * Optional ID for the DNS record construct\n * @default Generated from record type and name\n */\n id?: string;\n}\n\ninterface JaypieHostedZoneProps {\n /**\n * Optional construct ID\n * @default `${zoneName}-HostedZone`\n */\n id?: string;\n /**\n * The domain name for the hosted zone\n */\n zoneName: string;\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n /**\n * Optional project tag value\n */\n project?: string;\n /**\n * Log destination configuration\n * - LambdaDestination: Use a specific Lambda destination\n * - true: Use Datadog logging destination (default)\n * - false: Do not use a destination\n * @default true\n */\n destination?: LambdaDestination | boolean;\n /**\n * Optional DNS records to create for this hosted zone\n * Each record will be created as a JaypieDnsRecord construct\n */\n records?: JaypieHostedZoneRecordProps[];\n}\n\nexport class JaypieHostedZone extends Construct {\n public readonly hostedZone: IHostedZone;\n public readonly logGroup: ILogGroup;\n public readonly dnsRecords: JaypieDnsRecord[];\n\n /**\n * Create a new hosted zone with query logging and optional DNS records\n */\n constructor(\n scope: Construct,\n idOrProps: string | JaypieHostedZoneProps,\n propsOrRecords?: JaypieHostedZoneProps | JaypieHostedZoneRecordProps[],\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieHostedZoneProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // If it's a valid hostname, treat it as zoneName\n if (isValidHostname(idOrProps)) {\n // Third param can be props object or records array\n if (Array.isArray(propsOrRecords)) {\n props = { zoneName: idOrProps, records: propsOrRecords };\n } else {\n props = propsOrRecords || { zoneName: idOrProps };\n // Set zoneName if not already set\n if (!props.zoneName) {\n props = { ...props, zoneName: idOrProps };\n }\n }\n // Use id from props if provided, otherwise derive from zoneName\n id = props.id || `${idOrProps}-HostedZone`;\n } else {\n // Otherwise treat it as an explicit id\n props = propsOrRecords as JaypieHostedZoneProps;\n id = idOrProps;\n }\n } else {\n // idOrProps is props\n props = idOrProps;\n id = props.id || `${props.zoneName}-HostedZone`;\n }\n\n super(scope, id);\n\n const { zoneName, project } = props;\n const destination = props.destination ?? true;\n const service = props.service || CDK.SERVICE.INFRASTRUCTURE;\n\n // Create the log group\n this.logGroup = new LogGroup(this, \"LogGroup\", {\n logGroupName: process.env.PROJECT_NONCE\n ? `/aws/route53/${zoneName}-${process.env.PROJECT_NONCE}`\n : `/aws/route53/${zoneName}`,\n retention: RetentionDays.ONE_WEEK,\n });\n\n // Add tags\n cdk.Tags.of(this.logGroup).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.logGroup).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n if (project) {\n cdk.Tags.of(this.logGroup).add(CDK.TAG.PROJECT, project);\n }\n\n // Grant Route 53 permissions to write to the log group\n this.logGroup.grantWrite(new ServicePrincipal(SERVICE.ROUTE53));\n\n // Add destination based on configuration\n if (destination !== false) {\n const lambdaDestination =\n destination === true\n ? resolveDatadogLoggingDestination(scope)\n : destination;\n\n this.logGroup.addSubscriptionFilter(\"DatadogLambdaDestination\", {\n destination: lambdaDestination,\n filterPattern: FilterPattern.allEvents(),\n });\n }\n\n // Create the hosted zone\n this.hostedZone = new HostedZone(this, \"HostedZone\", {\n queryLogsLogGroupArn: this.logGroup.logGroupArn,\n zoneName,\n });\n\n // Add tags\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n if (project) {\n cdk.Tags.of(this.hostedZone).add(CDK.TAG.PROJECT, project);\n }\n\n // Create DNS records if provided\n this.dnsRecords = [];\n if (props.records) {\n props.records.forEach((recordConfig, index) => {\n const { id, ...recordProps } = recordConfig;\n // Generate a default ID if not provided\n const recordId =\n id ||\n `${recordProps.type}${recordProps.recordName ? `-${recordProps.recordName}` : \"\"}-${index}`;\n\n const dnsRecord = new JaypieDnsRecord(this, recordId, {\n ...recordProps,\n zone: this.hostedZone,\n });\n\n this.dnsRecords.push(dnsRecord);\n });\n }\n }\n}\n","import { Tags } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { JaypieStack, JaypieStackProps } from \"./JaypieStack\";\nimport { constructStackName } from \"./helpers\";\n\nconst CDK = {\n TAG: {\n STACK_SHA: \"stackSha\",\n },\n};\n\nexport class JaypieInfrastructureStack extends JaypieStack {\n constructor(scope: Construct, id: string, props: JaypieStackProps = {}) {\n const { key = \"infra\", ...stackProps } = props;\n\n // Handle stackName\n if (!stackProps.stackName) {\n stackProps.stackName = constructStackName(key);\n }\n\n super(scope, id, { key, ...stackProps });\n\n // Add infrastructure-specific tag\n if (process.env.CDK_ENV_INFRASTRUCTURE_STACK_SHA) {\n Tags.of(this).add(\n CDK.TAG.STACK_SHA,\n process.env.CDK_ENV_INFRASTRUCTURE_STACK_SHA,\n );\n }\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieMongoDbSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"MongoConnectionString\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"MONGODB_URI\",\n roleTag: CDK.ROLE.STORAGE,\n vendorTag: CDK.VENDOR.MONGODB,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport { IHostedZone } from \"aws-cdk-lib/aws-route53\";\nimport * as secretsmanager from \"aws-cdk-lib/aws-secretsmanager\";\nimport { Nextjs } from \"cdk-nextjs-standalone\";\nimport { Construct } from \"constructs\";\nimport * as path from \"path\";\n\nimport {\n addDatadogLayers,\n envHostname,\n EnvironmentInput,\n HostConfig,\n jaypieLambdaEnv,\n resolveEnvironment,\n resolveHostedZone,\n resolveParamsAndSecrets,\n resolveSecrets,\n SecretsArrayItem,\n} from \"./helpers\";\n\n/**\n * @deprecated Use HostConfig instead. This alias is kept for backwards compatibility.\n */\nexport type DomainNameConfig = HostConfig;\n\nexport interface JaypieNextjsProps {\n datadogApiKeyArn?: string;\n /**\n * Domain name for the Next.js application.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name\n * - Object: passed to envHostname() to construct the domain name\n * - { component, domain, env, subdomain }\n *\n * To deploy without a domain (CloudFront URL only), set domainProps: false\n */\n domainName?: string | DomainNameConfig;\n /**\n * Set to false to deploy without a custom domain.\n * When false, the application will only be accessible via CloudFront URL.\n * This overrides any domainName configuration.\n */\n domainProps?: false;\n /**\n * DynamoDB tables to grant read/write access to the Next.js server function.\n * Each table is granted read/write access and if exactly one table is provided,\n * the DYNAMODB_TABLE_NAME environment variable is set to the table name.\n */\n tables?: dynamodb.ITable[];\n /**\n * Environment variables for the Next.js application.\n *\n * Supports both legacy object syntax and new array syntax:\n * - Object: { KEY: \"value\" } - directly sets environment variables\n * - Array: [\"KEY1\", \"KEY2\", { KEY3: \"value\" }]\n * - Strings: lookup value from process.env\n * - Objects: merge key-value pairs directly\n */\n environment?: EnvironmentInput;\n envSecrets?: { [key: string]: secretsmanager.ISecret };\n hostedZone?: IHostedZone | string;\n nextjsPath?: string;\n /**\n * Secrets to make available to the Next.js application.\n *\n * Supports both JaypieEnvSecret instances and strings:\n * - JaypieEnvSecret: used directly\n * - String: creates a JaypieEnvSecret with the string as envKey\n * (reuses existing secrets within the same scope)\n */\n secrets?: SecretsArrayItem[];\n}\n\nexport class JaypieNextJs extends Construct {\n private readonly _nextjs: Nextjs;\n public readonly domainName?: string;\n\n constructor(scope: Construct, id: string, props?: JaypieNextjsProps) {\n super(scope, id);\n\n // Determine if we should use a custom domain\n const useDomain = props?.domainProps !== false;\n\n // Resolve domain name only if using a custom domain\n const domainName = useDomain\n ? typeof props?.domainName === \"string\"\n ? props.domainName\n : envHostname(props?.domainName)\n : undefined;\n this.domainName = domainName;\n\n // Use domain name or construct ID for cache policy naming\n const cachePolicyIdentifier = domainName\n ? domainName.replace(/\\./g, \"-\").replace(/[^a-zA-Z0-9]/g, \"_\")\n : id.replace(/[^a-zA-Z0-9]/g, \"_\");\n\n // Resolve environment from array or object syntax\n const environment = resolveEnvironment(props?.environment);\n const envSecrets = props?.envSecrets || {};\n const nextjsPath = props?.nextjsPath?.startsWith(\"..\")\n ? path.join(process.cwd(), props.nextjsPath)\n : props?.nextjsPath || path.join(process.cwd(), \"..\", \"nextjs\");\n const paramsAndSecrets = resolveParamsAndSecrets();\n\n // Resolve secrets from mixed array (strings and JaypieEnvSecret instances)\n const secrets = resolveSecrets(scope, props?.secrets);\n\n // Process secrets environment variables\n const secretsEnvironment = Object.entries(envSecrets).reduce(\n (acc, [key, secret]) => ({\n ...acc,\n [`SECRET_${key}`]: secret.secretName,\n }),\n {},\n );\n\n // Process JaypieEnvSecret array\n const jaypieSecretsEnvironment = secrets.reduce<{ [key: string]: string }>(\n (acc, secret) => {\n if (secret.envKey) {\n return {\n ...acc,\n [`SECRET_${secret.envKey}`]: secret.secretName,\n };\n }\n return acc;\n },\n {},\n );\n\n // Process NEXT_PUBLIC_ environment variables\n const nextPublicEnv = Object.entries(process.env).reduce(\n (acc, [key, value]) => {\n if (key.startsWith(\"NEXT_PUBLIC_\") && value) {\n return {\n ...acc,\n [key]: value,\n };\n }\n return acc;\n },\n {},\n );\n\n const nextjs = new Nextjs(this, \"NextJsApp\", {\n nextjsPath,\n // Only configure custom domain if useDomain is true\n ...(useDomain &&\n domainName && {\n domainProps: {\n domainName,\n hostedZone: resolveHostedZone(this, {\n zone: props?.hostedZone,\n }),\n },\n }),\n environment: {\n ...jaypieLambdaEnv(),\n ...environment,\n ...secretsEnvironment,\n ...jaypieSecretsEnvironment,\n ...nextPublicEnv,\n // NEXT_PUBLIC_SITE_URL will be set after construct creation for CloudFront URL\n ...(domainName && { NEXT_PUBLIC_SITE_URL: `https://${domainName}` }),\n },\n overrides: {\n nextjsDistribution: {\n imageCachePolicyProps: {\n cachePolicyName: `NextJsImageCachePolicy-${cachePolicyIdentifier}`,\n },\n serverCachePolicyProps: {\n cachePolicyName: `NextJsServerCachePolicy-${cachePolicyIdentifier}`,\n },\n },\n nextjsImage: {\n functionProps: {\n paramsAndSecrets,\n },\n },\n nextjsServer: {\n functionProps: {\n paramsAndSecrets,\n },\n },\n },\n });\n\n // Set NEXT_PUBLIC_SITE_URL to CloudFront URL when no custom domain\n if (!domainName) {\n nextjs.serverFunction.lambdaFunction.addEnvironment(\n \"NEXT_PUBLIC_SITE_URL\",\n `https://${nextjs.distribution.distributionDomain}`,\n );\n }\n\n addDatadogLayers(nextjs.imageOptimizationFunction);\n addDatadogLayers(nextjs.serverFunction.lambdaFunction);\n\n // Grant secret read permissions\n Object.values(envSecrets).forEach((secret) => {\n secret.grantRead(nextjs.serverFunction.lambdaFunction);\n });\n\n // Grant read permissions for JaypieEnvSecrets\n secrets.forEach((secret) => {\n secret.grantRead(nextjs.serverFunction.lambdaFunction);\n });\n\n // Grant read/write permissions for DynamoDB tables\n const tables = props?.tables || [];\n tables.forEach((table) => {\n table.grantReadWriteData(nextjs.serverFunction.lambdaFunction);\n });\n\n // Add table name to environment if there's exactly one table\n if (tables.length === 1) {\n nextjs.serverFunction.lambdaFunction.addEnvironment(\n \"DYNAMODB_TABLE_NAME\",\n tables[0].tableName,\n );\n }\n\n // Store reference to nextjs for property exposure\n this._nextjs = nextjs;\n }\n\n // Expose Nextjs construct properties\n\n /** S3 bucket for static assets */\n public get bucket() {\n return this._nextjs.bucket;\n }\n\n /** CloudFront distribution */\n public get distribution() {\n return this._nextjs.distribution;\n }\n\n /** Route53 domain configuration */\n public get domain() {\n return this._nextjs.domain;\n }\n\n /** Image optimization Lambda function */\n public get imageOptimizationFunction() {\n return this._nextjs.imageOptimizationFunction;\n }\n\n /** Image optimization Lambda function URL */\n public get imageOptimizationLambdaFunctionUrl() {\n return this._nextjs.imageOptimizationLambdaFunctionUrl;\n }\n\n /** Server Lambda function URL */\n public get lambdaFunctionUrl() {\n return this._nextjs.lambdaFunctionUrl;\n }\n\n /** Next.js build output */\n public get nextBuild() {\n return this._nextjs.nextBuild;\n }\n\n /** ISR revalidation configuration */\n public get revalidation() {\n return this._nextjs.revalidation;\n }\n\n /** Next.js server function */\n public get serverFunction() {\n return this._nextjs.serverFunction;\n }\n\n /** Static assets configuration */\n public get staticAssets() {\n return this._nextjs.staticAssets;\n }\n\n /** CloudFront distribution URL */\n public get url() {\n return this._nextjs.url;\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieOpenAiSecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"OpenAiApiKey\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"OPENAI_API_KEY\",\n roleTag: CDK.ROLE.PROCESSING,\n vendorTag: CDK.VENDOR.OPENAI,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { CDK } from \"./constants\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { Effect, PolicyStatement, ServicePrincipal } from \"aws-cdk-lib/aws-iam\";\nimport {\n EventType,\n Bucket,\n BucketAccessControl,\n IBucket,\n StorageClass,\n} from \"aws-cdk-lib/aws-s3\";\nimport { LambdaDestination } from \"aws-cdk-lib/aws-s3-notifications\";\nimport { ReadWriteType, Trail } from \"aws-cdk-lib/aws-cloudtrail\";\nimport { Construct } from \"constructs\";\n\nimport { resolveDatadogForwarderFunction } from \"./helpers/resolveDatadogForwarderFunction\";\n\nexport interface JaypieOrganizationTrailProps {\n /**\n * Optional construct ID\n * @default Generated from trail name\n */\n id?: string;\n\n /**\n * The name of the CloudTrail trail\n * @default Uses PROJECT_NONCE: `organization-cloudtrail-${PROJECT_NONCE}`\n */\n trailName?: string;\n\n /**\n * The name of the S3 bucket for CloudTrail logs\n * @default Uses PROJECT_NONCE: `organization-cloudtrail-${PROJECT_NONCE}`\n */\n bucketName?: string;\n\n /**\n * The service tag value\n * @default CDK.SERVICE.INFRASTRUCTURE\n */\n service?: string;\n\n /**\n * Optional project tag value\n */\n project?: string;\n\n /**\n * Whether to enable file validation for the trail\n * @default false\n */\n enableFileValidation?: boolean;\n\n /**\n * Number of days before logs expire\n * @default 365\n */\n expirationDays?: number;\n\n /**\n * Number of days before transitioning to INFREQUENT_ACCESS storage\n * @default 30\n */\n infrequentAccessTransitionDays?: number;\n\n /**\n * Number of days before transitioning to GLACIER storage\n * @default 180\n */\n glacierTransitionDays?: number;\n\n /**\n * Whether to send S3 notifications to Datadog forwarder\n * @default true\n */\n enableDatadogNotifications?: boolean;\n}\n\nexport class JaypieOrganizationTrail extends Construct {\n public readonly bucket: IBucket;\n public readonly trail: Trail;\n\n /**\n * Create a new organization CloudTrail with S3 bucket and lifecycle policies\n */\n constructor(\n scope: Construct,\n idOrProps?: string | JaypieOrganizationTrailProps,\n propsOrUndefined?: JaypieOrganizationTrailProps,\n ) {\n // Handle overloaded constructor signatures\n let props: JaypieOrganizationTrailProps;\n let id: string;\n\n if (typeof idOrProps === \"string\") {\n // First param is ID, second is props\n props = propsOrUndefined || {};\n id = idOrProps;\n } else {\n // First param is props\n props = idOrProps || {};\n const defaultName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\";\n id = props.id || `${props.trailName || defaultName}-Trail`;\n }\n\n super(scope, id);\n\n // Resolve options with defaults\n const {\n bucketName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\",\n enableDatadogNotifications = true,\n enableFileValidation = false,\n expirationDays = 365,\n glacierTransitionDays = 180,\n infrequentAccessTransitionDays = 30,\n project,\n service = CDK.SERVICE.INFRASTRUCTURE,\n trailName = process.env.PROJECT_NONCE\n ? `organization-cloudtrail-${process.env.PROJECT_NONCE}`\n : \"organization-cloudtrail\",\n } = props;\n\n // Create the S3 bucket for CloudTrail logs\n this.bucket = new Bucket(this, \"Bucket\", {\n accessControl: BucketAccessControl.LOG_DELIVERY_WRITE,\n bucketName,\n lifecycleRules: [\n {\n expiration: cdk.Duration.days(expirationDays),\n transitions: [\n {\n storageClass: StorageClass.INFREQUENT_ACCESS,\n transitionAfter: cdk.Duration.days(\n infrequentAccessTransitionDays,\n ),\n },\n {\n storageClass: StorageClass.GLACIER,\n transitionAfter: cdk.Duration.days(glacierTransitionDays),\n },\n ],\n },\n ],\n });\n\n // Add CloudTrail bucket policies\n this.bucket.addToResourcePolicy(\n new PolicyStatement({\n actions: [\"s3:GetBucketAcl\"],\n effect: Effect.ALLOW,\n principals: [new ServicePrincipal(\"cloudtrail.amazonaws.com\")],\n resources: [this.bucket.bucketArn],\n }),\n );\n\n this.bucket.addToResourcePolicy(\n new PolicyStatement({\n actions: [\"s3:PutObject\"],\n conditions: {\n StringEquals: {\n \"s3:x-amz-acl\": \"bucket-owner-full-control\",\n },\n },\n effect: Effect.ALLOW,\n principals: [new ServicePrincipal(\"cloudtrail.amazonaws.com\")],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n );\n\n // Add tags to bucket\n cdk.Tags.of(this.bucket).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.bucket).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.bucket).add(CDK.TAG.PROJECT, project);\n }\n\n // Add Datadog notifications if enabled\n if (enableDatadogNotifications) {\n const datadogForwarderFunction = resolveDatadogForwarderFunction(scope);\n this.bucket.addEventNotification(\n EventType.OBJECT_CREATED,\n new LambdaDestination(datadogForwarderFunction),\n );\n }\n\n // Create the organization trail\n this.trail = new Trail(this, \"Trail\", {\n bucket: this.bucket,\n enableFileValidation,\n isOrganizationTrail: true,\n managementEvents: ReadWriteType.ALL,\n trailName,\n });\n\n // Add tags to trail\n cdk.Tags.of(this.trail).add(CDK.TAG.SERVICE, service);\n cdk.Tags.of(this.trail).add(CDK.TAG.ROLE, CDK.ROLE.MONITORING);\n if (project) {\n cdk.Tags.of(this.trail).add(CDK.TAG.PROJECT, project);\n }\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, Tags } from \"aws-cdk-lib\";\nimport { CfnAssignment, CfnPermissionSet } from \"aws-cdk-lib/aws-sso\";\nimport { ManagedPolicy } from \"aws-cdk-lib/aws-iam\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\n/**\n * Mapping of account IDs to permission set names\n * Key: AWS account ID\n * Value: Array of permission set names to assign to this account\n */\nexport interface AccountAssignments {\n [accountId: string]: string[];\n}\n\n/**\n * Properties for the JaypieSsoPermissions construct\n */\nexport interface JaypieSsoPermissionsProps {\n /**\n * ARN of the IAM Identity Center instance\n * If not provided, falls back to CDK_ENV_IAM_IDENTITY_CENTER_ARN\n * If neither is set, SSO setup will be skipped\n */\n iamIdentityCenterArn?: string;\n\n /**\n * Google Workspace group GUID for administrators\n * Example: \"b4c8b438-4031-7000-782d-5046945fb956\"\n */\n administratorGroupId?: string;\n\n /**\n * Google Workspace group GUID for analysts\n * Example: \"2488f4e8-d061-708e-abe1-c315f0e30005\"\n */\n analystGroupId?: string;\n\n /**\n * Google Workspace group GUID for developers\n * Example: \"b438a4f8-e0e1-707c-c6e8-21841daf9ad1\"\n */\n developerGroupId?: string;\n\n /**\n * Account assignments for administrator group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Administrator\", \"Analyst\"],\n * \"381492033431\": [\"Administrator\"],\n * }\n */\n administratorAccountAssignments?: AccountAssignments;\n\n /**\n * Account assignments for analyst group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Analyst\"],\n * \"381492033431\": [\"Analyst\"],\n * }\n */\n analystAccountAssignments?: AccountAssignments;\n\n /**\n * Account assignments for developer group\n * Maps account IDs to arrays of permission set names\n * Example:\n * {\n * \"211125635435\": [\"Developer\"],\n * }\n */\n developerAccountAssignments?: AccountAssignments;\n}\n\n/**\n * JaypieSsoPermissions Construct\n *\n * Creates and manages AWS IAM Identity Center (SSO) permission sets and assignments\n *\n * @example\n * const permissionSets = new JaypieSsoPermissions(this, \"PermissionSets\", {\n * iamIdentityCenterArn: \"arn:aws:sso:::instance/...\",\n * administratorGroupId: \"b4c8b438-4031-7000-782d-5046945fb956\",\n * analystGroupId: \"2488f4e8-d061-708e-abe1-c315f0e30005\",\n * developerGroupId: \"b438a4f8-e0e1-707c-c6e8-21841daf9ad1\",\n * administratorAccountAssignments: {\n * \"211125635435\": [\"Administrator\", \"Analyst\", \"Developer\"],\n * \"381492033431\": [\"Administrator\", \"Analyst\"],\n * },\n * analystAccountAssignments: {\n * \"211125635435\": [\"Analyst\", \"Developer\"],\n * \"381492033431\": [],\n * },\n * developerAccountAssignments: {\n * \"211125635435\": [\"Analyst\", \"Developer\"],\n * \"381492033431\": [],\n * },\n * });\n */\nexport class JaypieSsoPermissions extends Construct {\n public readonly administratorPermissionSet?: CfnPermissionSet;\n public readonly analystPermissionSet?: CfnPermissionSet;\n public readonly developerPermissionSet?: CfnPermissionSet;\n\n constructor(scope: Construct, id: string, props: JaypieSsoPermissionsProps) {\n super(scope, id);\n\n const {\n iamIdentityCenterArn: iamIdentityCenterArnProp,\n administratorGroupId,\n analystGroupId,\n developerGroupId,\n administratorAccountAssignments,\n analystAccountAssignments,\n developerAccountAssignments,\n } = props;\n\n const iamIdentityCenterArn =\n iamIdentityCenterArnProp || process.env.CDK_ENV_IAM_IDENTITY_CENTER_ARN;\n\n if (!iamIdentityCenterArn) {\n // If no IAM Identity Center ARN provided, skip SSO setup\n return;\n }\n\n //\n // Permission Sets\n //\n\n this.administratorPermissionSet = new CfnPermissionSet(\n this,\n \"AdministratorPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Administrator\",\n\n // Optional\n description: \"Unrestricted access\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"aws-portal:ViewUsage\",\n \"aws-portal:ViewBilling\",\n \"budgets:*\",\n \"cur:DescribeReportDefinitions\",\n \"cur:PutReportDefinition\",\n \"cur:DeleteReportDefinition\",\n \"cur:ModifyReportDefinition\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AdministratorAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ],\n sessionDuration: Duration.hours(1).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n this.analystPermissionSet = new CfnPermissionSet(\n this,\n \"AnalystPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Analyst\",\n\n // Optional\n description: \"Read-only access; may expand to limited write access\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"aws-portal:ViewUsage\",\n \"aws-portal:ViewBilling\",\n \"budgets:Describe*\",\n \"budgets:View*\",\n \"ce:Get*\",\n \"ce:List*\",\n \"cloudformation:Describe*\",\n \"cloudformation:Get*\",\n \"cloudformation:List*\",\n \"cloudwatch:BatchGet*\",\n \"cloudwatch:Get*\",\n \"cloudwatch:List*\",\n \"cost-optimization-hub:Get*\",\n \"cost-optimization-hub:List*\",\n \"ec2:Describe*\",\n \"ec2:Get*\",\n \"ec2:List*\",\n \"ec2:Search*\",\n \"iam:Get*\",\n \"iam:List*\",\n \"iam:PassRole\",\n \"lambda:Get*\",\n \"lambda:List*\",\n \"logs:Describe*\",\n \"logs:Get*\",\n \"logs:List*\",\n \"pipes:Describe*\",\n \"pipes:List*\",\n \"s3:Get*\",\n \"s3:List*\",\n \"secretsmanager:GetRandomPassword\",\n \"secretsmanager:GetResourcePolicy\",\n \"secretsmanager:List*\",\n \"securityhub:Describe*\",\n \"securityhub:Get*\",\n \"securityhub:List*\",\n \"servicecatalog:Describe*\",\n \"sns:Get*\",\n \"sns:List*\",\n \"sqs:Get*\",\n \"sqs:List*\",\n \"states:Describe*\",\n \"states:Get*\",\n \"states:List*\",\n \"tag:*\",\n \"uxc:*\",\n \"xray:*\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AmazonQDeveloperAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\"ReadOnlyAccess\")\n .managedPolicyArn,\n ],\n sessionDuration: Duration.hours(12).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n this.developerPermissionSet = new CfnPermissionSet(\n this,\n \"DeveloperPermissionSet\",\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n name: \"Developer\",\n\n // Optional\n description: \"Administrative access with limited restrictions\",\n inlinePolicy: {\n Version: \"2012-10-17\",\n Statement: [\n {\n Effect: \"Allow\",\n Action: [\n \"budgets:*\",\n \"ce:*\",\n \"cloudformation:*\",\n \"cloudwatch:*\",\n \"cost-optimization-hub:*\",\n \"ec2:*\",\n \"iam:Get*\",\n \"iam:List*\",\n \"iam:PassRole\",\n \"lambda:*\",\n \"logs:*\",\n \"pipes:*\",\n \"s3:*\",\n \"secretsmanager:*\",\n \"securityhub:*\",\n \"servicecatalog:*\",\n \"sns:*\",\n \"sqs:*\",\n \"states:*\",\n \"tag:*\",\n \"uxc:*\",\n \"xray:*\",\n ],\n Resource: \"*\",\n },\n ],\n },\n managedPolicies: [\n ManagedPolicy.fromAwsManagedPolicyName(\"AmazonQDeveloperAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"AWSManagementConsoleBasicUserAccess\",\n ).managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\"ReadOnlyAccess\")\n .managedPolicyArn,\n ManagedPolicy.fromAwsManagedPolicyName(\n \"job-function/SystemAdministrator\",\n ).managedPolicyArn,\n ],\n sessionDuration: Duration.hours(4).toIsoString(),\n tags: [\n {\n key: CDK.TAG.SERVICE,\n value: CDK.SERVICE.SSO,\n },\n {\n key: CDK.TAG.ROLE,\n value: CDK.ROLE.SECURITY,\n },\n ],\n },\n );\n\n // Map permission set names to their ARNs and labels\n const permissionSetMap: Record<string, { arn: string; label: string }> = {\n Administrator: {\n arn: this.administratorPermissionSet.attrPermissionSetArn,\n label: \"Administrator\",\n },\n Analyst: {\n arn: this.analystPermissionSet.attrPermissionSetArn,\n label: \"Analyst\",\n },\n Developer: {\n arn: this.developerPermissionSet.attrPermissionSetArn,\n label: \"Developer\",\n },\n };\n\n //\n // Assignments\n //\n\n // Helper function to create assignments for a group\n const createAssignments = (\n groupId: string | undefined,\n accountAssignments: AccountAssignments | undefined,\n ) => {\n if (!groupId || !accountAssignments) {\n return; // Skip if group ID or assignments not provided\n }\n\n Object.keys(accountAssignments).forEach((accountId) => {\n const permissionSetNames = accountAssignments[accountId];\n\n permissionSetNames.forEach((permissionSetName) => {\n const permissionSet = permissionSetMap[permissionSetName];\n\n if (!permissionSet) {\n throw new ConfigurationError(\n `Unknown permission set: ${permissionSetName}. Valid options: ${Object.keys(permissionSetMap).join(\", \")}`,\n );\n }\n\n const accountAssignment = new CfnAssignment(\n this,\n `AccountAssignment-${accountId}-${permissionSet.label}Role-${groupId}Group`,\n {\n // Required\n instanceArn: iamIdentityCenterArn,\n permissionSetArn: permissionSet.arn,\n principalId: groupId,\n principalType: CDK.PRINCIPAL_TYPE.GROUP,\n targetId: accountId,\n targetType: CDK.TARGET_TYPE.AWS_ACCOUNT,\n },\n );\n Tags.of(accountAssignment).add(CDK.TAG.SERVICE, CDK.SERVICE.SSO);\n Tags.of(accountAssignment).add(CDK.TAG.ROLE, CDK.ROLE.SECURITY);\n });\n });\n };\n\n // Create assignments for each group\n createAssignments(administratorGroupId, administratorAccountAssignments);\n createAssignments(analystGroupId, analystAccountAssignments);\n createAssignments(developerGroupId, developerAccountAssignments);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Stack, Tags } from \"aws-cdk-lib\";\nimport { CfnApplication } from \"aws-cdk-lib/aws-sam\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\n\n//\n//\n// Constants\n//\n\nconst DEFAULT_APPLICATION_ID =\n \"arn:aws:serverlessrepo:us-east-2:004480582608:applications/SSOSync\";\nconst DEFAULT_APPLICATION_VERSION = \"2.3.3\";\nconst DEFAULT_GOOGLE_GROUP_MATCH = \"name:AWS*\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieSsoSyncApplicationProps {\n googleAdminEmail?: string;\n googleAdminEmailEnvKey?: string;\n googleCredentials?: string;\n googleCredentialsEnvKey?: string;\n googleGroupMatch?: string;\n googleGroupMatchEnvKey?: string;\n identityStoreId?: string;\n identityStoreIdEnvKey?: string;\n scimEndpointAccessToken?: string;\n scimEndpointAccessTokenEnvKey?: string;\n scimEndpointUrl?: string;\n scimEndpointUrlEnvKey?: string;\n semanticVersion?: string;\n semanticVersionEnvKey?: string;\n ssoSyncApplicationId?: string;\n tags?: { [key: string]: string };\n}\n\n//\n//\n// Class\n//\n\nexport class JaypieSsoSyncApplication extends Construct {\n private readonly _application: CfnApplication;\n\n constructor(\n scope: Construct,\n id = \"SsoSyncApplication\",\n props: JaypieSsoSyncApplicationProps = {},\n ) {\n super(scope, id);\n\n const {\n googleAdminEmail,\n googleAdminEmailEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_ADMIN_EMAIL\",\n googleCredentials,\n googleCredentialsEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_CREDENTIALS\",\n googleGroupMatch,\n googleGroupMatchEnvKey = \"CDK_ENV_SSOSYNC_GOOGLE_GROUP_MATCH\",\n identityStoreId,\n identityStoreIdEnvKey = \"CDK_ENV_SSOSYNC_IDENTITY_STORE_ID\",\n scimEndpointAccessToken,\n scimEndpointAccessTokenEnvKey = \"CDK_ENV_SCIM_ENDPOINT_ACCESS_TOKEN\",\n scimEndpointUrl,\n scimEndpointUrlEnvKey = \"CDK_ENV_SSOSYNC_SCIM_ENDPOINT_URL\",\n semanticVersion,\n semanticVersionEnvKey = \"CDK_ENV_SSOSYNC_SEMANTIC_VERSION\",\n ssoSyncApplicationId = DEFAULT_APPLICATION_ID,\n tags,\n } = props;\n\n // Resolve all values from props or environment variables\n const resolvedGoogleAdminEmail =\n googleAdminEmail || process.env[googleAdminEmailEnvKey];\n const resolvedGoogleCredentials =\n googleCredentials || process.env[googleCredentialsEnvKey];\n const resolvedGoogleGroupMatch =\n googleGroupMatch ||\n process.env[googleGroupMatchEnvKey] ||\n DEFAULT_GOOGLE_GROUP_MATCH;\n const resolvedIdentityStoreId =\n identityStoreId || process.env[identityStoreIdEnvKey];\n const resolvedScimEndpointAccessToken =\n scimEndpointAccessToken || process.env[scimEndpointAccessTokenEnvKey];\n const resolvedScimEndpointUrl =\n scimEndpointUrl || process.env[scimEndpointUrlEnvKey];\n const resolvedSemanticVersion =\n semanticVersion ||\n process.env[semanticVersionEnvKey] ||\n DEFAULT_APPLICATION_VERSION;\n\n // Validate required parameters\n const missingParams: string[] = [];\n\n if (!resolvedGoogleAdminEmail) {\n missingParams.push(\n `googleAdminEmail or ${googleAdminEmailEnvKey} environment variable`,\n );\n }\n if (!resolvedGoogleCredentials) {\n missingParams.push(\n `googleCredentials or ${googleCredentialsEnvKey} environment variable`,\n );\n }\n if (!resolvedIdentityStoreId) {\n missingParams.push(\n `identityStoreId or ${identityStoreIdEnvKey} environment variable`,\n );\n }\n if (!resolvedScimEndpointAccessToken) {\n missingParams.push(\n `scimEndpointAccessToken or ${scimEndpointAccessTokenEnvKey} environment variable`,\n );\n }\n if (!resolvedScimEndpointUrl) {\n missingParams.push(\n `scimEndpointUrl or ${scimEndpointUrlEnvKey} environment variable`,\n );\n }\n\n if (missingParams.length > 0) {\n throw new ConfigurationError(\n `JaypieSsoSyncApplication missing required configuration: ${missingParams.join(\", \")}`,\n );\n }\n\n // Create the SSO Sync Application\n // Type assertion is safe because we validated all required values above\n this._application = new CfnApplication(this, \"Application\", {\n location: {\n applicationId: ssoSyncApplicationId,\n semanticVersion: resolvedSemanticVersion,\n },\n parameters: {\n GoogleAdminEmail: resolvedGoogleAdminEmail!,\n GoogleCredentials: resolvedGoogleCredentials!,\n GoogleGroupMatch: resolvedGoogleGroupMatch,\n IdentityStoreID: resolvedIdentityStoreId!,\n Region: Stack.of(this).region,\n SCIMEndpointAccessToken: resolvedScimEndpointAccessToken!,\n SCIMEndpointUrl: resolvedScimEndpointUrl!,\n },\n });\n\n // Add tags\n const defaultTags = {\n [CDK.TAG.ROLE]: CDK.ROLE.SECURITY,\n };\n\n const allTags = { ...defaultTags, ...tags };\n Object.entries(allTags).forEach(([key, value]) => {\n Tags.of(this._application).add(key, value);\n });\n }\n\n public get application(): CfnApplication {\n return this._application;\n }\n}\n","import {\n CfnOutput,\n Duration,\n Fn,\n RemovalPolicy,\n Stack,\n Tags,\n} from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as cloudfront from \"aws-cdk-lib/aws-cloudfront\";\nimport * as origins from \"aws-cdk-lib/aws-cloudfront-origins\";\nimport {\n AddToResourcePolicyResult,\n Effect,\n FederatedPrincipal,\n Role,\n PolicyStatement,\n} from \"aws-cdk-lib/aws-iam\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport * as kms from \"aws-cdk-lib/aws-kms\";\nimport { Construct } from \"constructs\";\nimport { ConfigurationError } from \"@jaypie/errors\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n isProductionEnv,\n isValidHostname,\n isValidSubdomain,\n mergeDomain,\n resolveCertificate,\n} from \"./helpers\";\nimport { JaypieHostedZone } from \"./JaypieHostedZone\";\n\nexport interface JaypieWebDeploymentBucketProps extends s3.BucketProps {\n /**\n * SSL certificate for the CloudFront distribution\n * @default true (creates a new certificate)\n */\n certificate?: boolean | acm.ICertificate;\n /**\n * The domain name for the website\n * @default mergeDomain(CDK_ENV_WEB_SUBDOMAIN, CDK_ENV_WEB_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE)\n */\n host?: string;\n /**\n * Optional bucket name\n */\n name?: string;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n /**\n * The hosted zone for DNS records\n * @default CDK_ENV_WEB_HOSTED_ZONE || CDK_ENV_HOSTED_ZONE\n */\n zone?: string | route53.IHostedZone | JaypieHostedZone;\n}\n\nexport class JaypieWebDeploymentBucket extends Construct implements s3.IBucket {\n public readonly bucket: s3.Bucket;\n public readonly bucketArn: string;\n public readonly bucketDomainName: string;\n public readonly bucketDualStackDomainName: string;\n public readonly bucketName: string;\n public readonly bucketRegionalDomainName: string;\n public readonly bucketWebsiteDomainName: string;\n public readonly bucketWebsiteUrl: string;\n public readonly encryptionKey?: kms.IKey;\n public readonly isWebsite?: boolean;\n public readonly notificationsHandlerRole?: string;\n public readonly policy?: s3.BucketPolicy;\n public readonly deployRoleArn?: string;\n public readonly distributionDomainName?: string;\n public readonly certificate?: acm.ICertificate;\n public readonly distribution?: cloudfront.Distribution;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieWebDeploymentBucketProps = {},\n ) {\n super(scope, id);\n\n const roleTag = props.roleTag || CDK.ROLE.HOSTING;\n\n // Environment variable validation\n if (\n process.env.CDK_ENV_WEB_SUBDOMAIN &&\n !isValidSubdomain(process.env.CDK_ENV_WEB_SUBDOMAIN)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_WEB_SUBDOMAIN is not a valid subdomain\",\n );\n }\n\n if (\n process.env.CDK_ENV_WEB_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_WEB_HOSTED_ZONE)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_WEB_HOSTED_ZONE is not a valid hostname\",\n );\n }\n\n if (\n process.env.CDK_ENV_HOSTED_ZONE &&\n !isValidHostname(process.env.CDK_ENV_HOSTED_ZONE)\n ) {\n throw new ConfigurationError(\n \"CDK_ENV_HOSTED_ZONE is not a valid hostname\",\n );\n }\n\n // Determine host from props or environment\n let host = props.host;\n if (!host) {\n try {\n host =\n process.env.CDK_ENV_WEB_HOST ||\n mergeDomain(\n process.env.CDK_ENV_WEB_SUBDOMAIN || \"\",\n process.env.CDK_ENV_WEB_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE ||\n \"\",\n );\n } catch {\n host = undefined;\n }\n }\n\n if (host && !isValidHostname(host)) {\n throw new ConfigurationError(\"Host is not a valid hostname\");\n }\n\n // Determine zone from props or environment\n const zone =\n props.zone ||\n process.env.CDK_ENV_WEB_HOSTED_ZONE ||\n process.env.CDK_ENV_HOSTED_ZONE;\n\n // Create the S3 bucket\n this.bucket = new s3.Bucket(this, \"DestinationBucket\", {\n accessControl: s3.BucketAccessControl.BUCKET_OWNER_FULL_CONTROL,\n autoDeleteObjects: true,\n blockPublicAccess: s3.BlockPublicAccess.BLOCK_ACLS_ONLY,\n bucketName: props.name || constructEnvName(\"web\"),\n publicReadAccess: true,\n removalPolicy: RemovalPolicy.DESTROY,\n versioned: false,\n websiteErrorDocument: \"index.html\",\n websiteIndexDocument: \"index.html\",\n ...props,\n });\n\n // Delegate IBucket properties to the bucket\n this.bucketArn = this.bucket.bucketArn;\n this.bucketDomainName = this.bucket.bucketDomainName;\n this.bucketDualStackDomainName = this.bucket.bucketDualStackDomainName;\n this.bucketName = this.bucket.bucketName;\n this.bucketRegionalDomainName = this.bucket.bucketRegionalDomainName;\n this.bucketWebsiteDomainName = this.bucket.bucketWebsiteDomainName;\n this.bucketWebsiteUrl = this.bucket.bucketWebsiteUrl;\n this.encryptionKey = this.bucket.encryptionKey;\n this.isWebsite = this.bucket.isWebsite;\n this.notificationsHandlerRole = undefined;\n this.policy = this.bucket.policy;\n\n Tags.of(this.bucket).add(CDK.TAG.ROLE, roleTag);\n\n // Create deployment role if repository is configured\n let repo: string | undefined;\n if (process.env.CDK_ENV_REPO) {\n repo = `repo:${process.env.CDK_ENV_REPO}:*`;\n }\n\n if (repo) {\n const bucketDeployRole = new Role(this, \"DestinationBucketDeployRole\", {\n assumedBy: new FederatedPrincipal(\n Fn.importValue(CDK.IMPORT.OIDC_PROVIDER),\n {\n StringLike: {\n \"token.actions.githubusercontent.com:sub\": repo,\n },\n },\n \"sts:AssumeRoleWithWebIdentity\",\n ),\n maxSessionDuration: Duration.hours(1),\n });\n Tags.of(bucketDeployRole).add(CDK.TAG.ROLE, CDK.ROLE.DEPLOY);\n\n // Allow the role to write to the bucket\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:ListObjectsV2\",\n \"s3:PutObject\",\n ],\n resources: [`${this.bucket.bucketArn}/*`],\n }),\n );\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n effect: Effect.ALLOW,\n actions: [\"s3:ListBucket\"],\n resources: [this.bucket.bucketArn],\n }),\n );\n\n // Allow the role to describe the current stack\n const stack = Stack.of(this);\n bucketDeployRole.addToPolicy(\n new PolicyStatement({\n actions: [\"cloudformation:DescribeStacks\"],\n effect: Effect.ALLOW,\n resources: [\n `arn:aws:cloudformation:${stack.region}:${stack.account}:stack/${stack.stackName}/*`,\n ],\n }),\n );\n\n this.deployRoleArn = bucketDeployRole.roleArn;\n\n // Output the deploy role ARN\n new CfnOutput(this, \"DestinationBucketDeployRoleArn\", {\n value: bucketDeployRole.roleArn,\n });\n\n // Output the bucket name for workflows\n new CfnOutput(this, \"DestinationBucketName\", {\n value: this.bucket.bucketName,\n });\n }\n\n // Create CloudFront distribution and certificate if host and zone are provided\n if (host && zone) {\n let hostedZone: route53.IHostedZone;\n if (typeof zone === \"string\") {\n hostedZone = route53.HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: zone,\n });\n } else if (zone instanceof JaypieHostedZone) {\n hostedZone = zone.hostedZone;\n } else {\n hostedZone = zone;\n }\n\n // Use resolveCertificate to create certificate at stack level (enables reuse when swapping constructs)\n this.certificate = resolveCertificate(this, {\n certificate: props.certificate,\n domainName: host,\n roleTag,\n zone: hostedZone,\n });\n\n if (this.certificate) {\n new CfnOutput(this, \"CertificateArn\", {\n value: this.certificate.certificateArn,\n });\n }\n\n // Create CloudFront distribution\n this.distribution = new cloudfront.Distribution(this, \"Distribution\", {\n defaultBehavior: {\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n origin: new origins.S3StaticWebsiteOrigin(this.bucket),\n viewerProtocolPolicy:\n cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n },\n certificate: this.certificate,\n domainNames: [host],\n });\n Tags.of(this.distribution).add(CDK.TAG.ROLE, roleTag);\n\n // If this is production, enable caching on everything but index.html\n if (isProductionEnv()) {\n this.distribution.addBehavior(\n \"/*\",\n new origins.S3StaticWebsiteOrigin(this.bucket),\n {\n viewerProtocolPolicy:\n cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED,\n },\n );\n }\n\n // Create DNS record\n const record = new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.CloudFrontTarget(this.distribution),\n ),\n zone: hostedZone,\n });\n Tags.of(record).add(CDK.TAG.ROLE, CDK.ROLE.NETWORKING);\n\n this.distributionDomainName = this.distribution.distributionDomainName;\n\n // Output the distribution ID for cache invalidation\n new CfnOutput(this, \"DistributionId\", {\n value: this.distribution.distributionId,\n });\n }\n }\n\n // Implement remaining IBucket methods by delegating to the bucket\n addEventNotification(\n event: s3.EventType,\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addEventNotification(event, dest, ...filters);\n }\n\n addObjectCreatedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addObjectCreatedNotification(dest, ...filters);\n }\n\n addObjectRemovedNotification(\n dest: s3.IBucketNotificationDestination,\n ...filters: s3.NotificationKeyFilter[]\n ): void {\n this.bucket.addObjectRemovedNotification(dest, ...filters);\n }\n\n addToResourcePolicy(permission: PolicyStatement): AddToResourcePolicyResult {\n return this.bucket.addToResourcePolicy(permission);\n }\n\n arnForObjects(keyPattern: string): string {\n return this.bucket.arnForObjects(keyPattern);\n }\n\n grantDelete(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantDelete(identity, objectsKeyPattern);\n }\n\n grantPublicAccess(allowedActions: string, keyPrefix?: string): any {\n return keyPrefix\n ? this.bucket.grantPublicAccess(allowedActions, keyPrefix)\n : this.bucket.grantPublicAccess(allowedActions);\n }\n\n grantPut(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantPut(identity, objectsKeyPattern);\n }\n\n grantPutAcl(identity: any, objectsKeyPattern?: string): any {\n return this.bucket.grantPutAcl(identity, objectsKeyPattern);\n }\n\n grantRead(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantRead(identity, objectsKeyPattern);\n }\n\n grantReadWrite(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantReadWrite(identity, objectsKeyPattern);\n }\n\n grantWrite(identity: any, objectsKeyPattern?: any): any {\n return this.bucket.grantWrite(identity, objectsKeyPattern);\n }\n\n grantReplicationPermission(identity: any, props: any): any {\n return this.bucket.grantReplicationPermission(identity, props);\n }\n\n s3UrlForObject(key?: string): string {\n return this.bucket.s3UrlForObject(key);\n }\n\n urlForObject(key?: string): string {\n return this.bucket.urlForObject(key);\n }\n\n virtualHostedUrlForObject(\n key?: string,\n options?: s3.VirtualHostedStyleUrlOptions,\n ): string {\n return this.bucket.virtualHostedUrlForObject(key, options);\n }\n\n transferAccelerationUrlForObject(key?: string): string {\n return this.bucket.transferAccelerationUrlForObject(key);\n }\n\n onCloudTrailEvent(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailEvent(id, options);\n }\n\n onCloudTrailPutObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailPutObject(id, options);\n }\n\n onCloudTrailWriteObject(\n id: string,\n options?: s3.OnCloudTrailBucketEventOptions,\n ): any {\n return this.bucket.onCloudTrailWriteObject(id, options);\n }\n\n addCorsRule(rule: s3.CorsRule): void {\n this.bucket.addCorsRule(rule);\n }\n\n addInventory(inventory: s3.Inventory): void {\n this.bucket.addInventory(inventory);\n }\n\n addLifecycleRule(rule: s3.LifecycleRule): void {\n this.bucket.addLifecycleRule(rule);\n }\n\n addMetric(metric: s3.BucketMetrics): void {\n this.bucket.addMetric(metric);\n }\n\n enableEventBridgeNotification(): void {\n this.bucket.enableEventBridgeNotification();\n }\n\n addReplicationPolicy(policy: any): void {\n this.bucket.addReplicationPolicy(policy);\n }\n\n get stack(): any {\n return this.bucket.stack;\n }\n\n get env(): any {\n return this.bucket.env;\n }\n\n applyRemovalPolicy(policy: RemovalPolicy): void {\n this.bucket.applyRemovalPolicy(policy);\n }\n\n get bucketRef(): s3.BucketReference {\n return {\n bucketArn: this.bucket.bucketArn,\n bucketName: this.bucket.bucketName,\n };\n }\n}\n","import { Construct } from \"constructs\";\n\nimport { CDK } from \"./constants\";\nimport { constructEnvName, envHostname } from \"./helpers\";\nimport {\n JaypieWebDeploymentBucket,\n JaypieWebDeploymentBucketProps,\n} from \"./JaypieWebDeploymentBucket\";\n\nexport interface JaypieStaticWebBucketProps extends Omit<\n JaypieWebDeploymentBucketProps,\n \"host\" | \"name\" | \"roleTag\"\n> {\n /**\n * The domain name for the website\n * @default envHostname({ subdomain: \"static\" })\n */\n host?: string;\n /**\n * Optional bucket name\n * @default constructEnvName(\"static\")\n */\n name?: string;\n /**\n * Role tag for tagging resources\n * @default CDK.ROLE.HOSTING\n */\n roleTag?: string;\n}\n\nexport class JaypieStaticWebBucket extends JaypieWebDeploymentBucket {\n constructor(\n scope: Construct,\n id?: string | JaypieStaticWebBucketProps,\n props: JaypieStaticWebBucketProps = {},\n ) {\n // Handle overloaded signatures: (scope), (scope, props), (scope, id, props)\n let resolvedId: string;\n let resolvedProps: JaypieStaticWebBucketProps;\n\n if (typeof id === \"string\") {\n resolvedId = id;\n resolvedProps = props;\n } else if (typeof id === \"object\") {\n resolvedId = \"JaypieStaticWebBucket\";\n resolvedProps = id;\n } else {\n resolvedId = \"JaypieStaticWebBucket\";\n resolvedProps = props;\n }\n\n const host = resolvedProps.host ?? envHostname({ subdomain: \"static\" });\n const name = resolvedProps.name ?? constructEnvName(\"static\");\n const roleTag = resolvedProps.roleTag ?? CDK.ROLE.HOSTING;\n // Only use default zone if zone is not explicitly provided (including undefined)\n const zone =\n \"zone\" in resolvedProps\n ? resolvedProps.zone\n : process.env.CDK_ENV_DOMAIN || process.env.CDK_ENV_HOSTED_ZONE;\n\n super(scope, resolvedId, {\n ...resolvedProps,\n host,\n name,\n roleTag,\n zone,\n });\n }\n}\n","import { Construct } from \"constructs\";\nimport { CDK } from \"./constants\";\nimport { JaypieEnvSecret, JaypieEnvSecretProps } from \"./JaypieEnvSecret\";\n\nexport class JaypieTraceSigningKeySecret extends JaypieEnvSecret {\n constructor(\n scope: Construct,\n id = \"TraceSigningKey\",\n props?: JaypieEnvSecretProps,\n ) {\n const defaultProps: JaypieEnvSecretProps = {\n envKey: \"TRACE_SIGNING_KEY\",\n roleTag: CDK.ROLE.API,\n vendorTag: CDK.VENDOR.KNOWTRACE,\n ...props,\n };\n\n super(scope, id, defaultProps);\n }\n}\n","import { Construct } from \"constructs\";\nimport { RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as acm from \"aws-cdk-lib/aws-certificatemanager\";\nimport * as apigatewayv2 from \"aws-cdk-lib/aws-apigatewayv2\";\nimport * as apigatewayv2Integrations from \"aws-cdk-lib/aws-apigatewayv2-integrations\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\nimport * as logs from \"aws-cdk-lib/aws-logs\";\nimport * as route53 from \"aws-cdk-lib/aws-route53\";\nimport * as route53Targets from \"aws-cdk-lib/aws-route53-targets\";\n\nimport { CDK } from \"./constants\";\nimport {\n constructEnvName,\n envHostname,\n HostConfig,\n mergeDomain,\n resolveCertificate,\n resolveHostedZone,\n} from \"./helpers\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieWebSocketProps {\n /**\n * Certificate configuration.\n * - true: Create certificate at stack level (default, reusable)\n * - false: No certificate (use regional endpoint)\n * - ICertificate: Use provided certificate\n * - string: Import certificate from ARN\n */\n certificate?: boolean | acm.ICertificate | string;\n\n /**\n * Lambda handler for $connect route (connection established).\n * Use this to validate connections (e.g., auth tokens) and store connection IDs.\n */\n connect?: lambda.IFunction;\n\n /**\n * Lambda handler for $default route (catches unmatched messages).\n * Use this as the main message handler.\n */\n default?: lambda.IFunction;\n\n /**\n * Lambda handler for $disconnect route (connection closed).\n * Use this to clean up connection IDs from storage.\n */\n disconnect?: lambda.IFunction;\n\n /**\n * Single Lambda handler for all routes.\n * Alternative to providing separate connect/disconnect/default handlers.\n * The handler receives routeKey in the context to determine which route was invoked.\n */\n handler?: lambda.IFunction;\n\n /**\n * The domain name for the WebSocket API.\n *\n * Supports both string and config object:\n * - String: used directly as the domain name (e.g., \"ws.example.com\")\n * - Object: passed to envHostname() to construct the domain name\n * - { subdomain, domain, env, component }\n *\n * @example\n * // Direct string\n * host: \"ws.example.com\"\n *\n * @example\n * // Config object - resolves using envHostname()\n * host: { component: \"ws\" }\n */\n host?: string | HostConfig;\n\n /**\n * Log retention for WebSocket API access logs.\n * @default logs.RetentionDays.THREE_MONTHS\n */\n logRetention?: logs.RetentionDays;\n\n /**\n * Construct name (used for resource naming).\n */\n name?: string;\n\n /**\n * Role tag for tagging resources.\n * @default CDK.ROLE.API\n */\n roleTag?: string;\n\n /**\n * Additional named routes beyond $connect, $disconnect, and $default.\n * Keys are route keys (e.g., \"sendMessage\", \"subscribe\").\n */\n routes?: Record<string, lambda.IFunction>;\n\n /**\n * Stage name for the WebSocket API.\n * @default \"production\"\n */\n stageName?: string;\n\n /**\n * Route53 hosted zone for DNS records.\n * - string: Zone domain name (looked up or imported)\n * - IHostedZone: Use provided hosted zone\n */\n zone?: string | route53.IHostedZone;\n}\n\n//\n//\n// Main\n//\n\nexport class JaypieWebSocket extends Construct {\n private readonly _api: apigatewayv2.WebSocketApi;\n private readonly _certificate?: acm.ICertificate;\n private readonly _domainName?: apigatewayv2.DomainName;\n private readonly _host?: string;\n private readonly _stage: apigatewayv2.WebSocketStage;\n\n constructor(scope: Construct, id: string, props: JaypieWebSocketProps = {}) {\n super(scope, id);\n\n const {\n certificate = true,\n connect,\n default: defaultHandler,\n disconnect,\n handler,\n host: propsHost,\n logRetention = logs.RetentionDays.THREE_MONTHS,\n name,\n roleTag = CDK.ROLE.API,\n routes = {},\n stageName = \"production\",\n zone: propsZone,\n } = props;\n\n // Validate: either handler OR individual handlers, not both\n const hasIndividualHandlers = connect || disconnect || defaultHandler;\n if (handler && hasIndividualHandlers) {\n throw new Error(\n \"Cannot specify both 'handler' and individual route handlers (connect/disconnect/default)\",\n );\n }\n\n // Determine zone from props or environment\n let zone = propsZone;\n if (!zone && process.env.CDK_ENV_HOSTED_ZONE) {\n zone = process.env.CDK_ENV_HOSTED_ZONE;\n }\n\n // Determine host from props or environment\n let host: string | undefined;\n if (typeof propsHost === \"string\") {\n host = propsHost;\n } else if (typeof propsHost === \"object\") {\n // Resolve host from HostConfig using envHostname()\n host = envHostname(propsHost);\n } else if (process.env.CDK_ENV_WS_HOST_NAME) {\n host = process.env.CDK_ENV_WS_HOST_NAME;\n } else if (\n process.env.CDK_ENV_WS_SUBDOMAIN &&\n process.env.CDK_ENV_HOSTED_ZONE\n ) {\n host = mergeDomain(\n process.env.CDK_ENV_WS_SUBDOMAIN,\n process.env.CDK_ENV_HOSTED_ZONE,\n );\n }\n\n const apiName = name || constructEnvName(\"WebSocket\");\n\n // Create WebSocket API\n this._api = new apigatewayv2.WebSocketApi(this, \"Api\", {\n apiName,\n });\n Tags.of(this._api).add(CDK.TAG.ROLE, roleTag);\n\n // Add routes with Lambda integrations\n const connectHandler = handler || connect;\n const disconnectHandler = handler || disconnect;\n const defaultRouteHandler = handler || defaultHandler;\n\n if (connectHandler) {\n this._api.addRoute(\"$connect\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"ConnectIntegration\",\n connectHandler,\n ),\n });\n }\n\n if (disconnectHandler) {\n this._api.addRoute(\"$disconnect\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"DisconnectIntegration\",\n disconnectHandler,\n ),\n });\n }\n\n if (defaultRouteHandler) {\n this._api.addRoute(\"$default\", {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n \"DefaultIntegration\",\n defaultRouteHandler,\n ),\n });\n }\n\n // Add custom routes\n for (const [routeKey, routeHandler] of Object.entries(routes)) {\n this._api.addRoute(routeKey, {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n `${routeKey}Integration`,\n routeHandler,\n ),\n });\n }\n\n // Create log group for access logs\n // Note: logGroup is created for future use when API Gateway v2 WebSocket\n // access logging is fully supported in CDK\n new logs.LogGroup(this, \"AccessLogs\", {\n removalPolicy: RemovalPolicy.DESTROY,\n retention: logRetention,\n });\n\n // Create stage\n this._stage = new apigatewayv2.WebSocketStage(this, \"Stage\", {\n autoDeploy: true,\n stageName,\n webSocketApi: this._api,\n });\n Tags.of(this._stage).add(CDK.TAG.ROLE, roleTag);\n\n // Set up custom domain if host and zone are provided\n let hostedZone: route53.IHostedZone | undefined;\n let certificateToUse: acm.ICertificate | undefined;\n\n if (host && zone) {\n hostedZone = resolveHostedZone(this, { zone });\n\n // Use resolveCertificate to create certificate at stack level (enables reuse)\n certificateToUse = resolveCertificate(this, {\n certificate,\n domainName: host,\n roleTag: CDK.ROLE.HOSTING,\n zone: hostedZone,\n });\n\n this._certificate = certificateToUse;\n this._host = host;\n\n if (certificateToUse) {\n // Create custom domain\n this._domainName = new apigatewayv2.DomainName(this, \"DomainName\", {\n certificate: certificateToUse,\n domainName: host,\n });\n Tags.of(this._domainName).add(CDK.TAG.ROLE, roleTag);\n\n // Map domain to stage\n new apigatewayv2.ApiMapping(this, \"ApiMapping\", {\n api: this._api,\n domainName: this._domainName,\n stage: this._stage,\n });\n\n // Create DNS record\n new route53.ARecord(this, \"AliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayv2DomainProperties(\n this._domainName.regionalDomainName,\n this._domainName.regionalHostedZoneId,\n ),\n ),\n zone: hostedZone,\n });\n\n // Also create AAAA record for IPv6\n new route53.AaaaRecord(this, \"AaaaAliasRecord\", {\n recordName: host,\n target: route53.RecordTarget.fromAlias(\n new route53Targets.ApiGatewayv2DomainProperties(\n this._domainName.regionalDomainName,\n this._domainName.regionalHostedZoneId,\n ),\n ),\n zone: hostedZone,\n });\n }\n }\n\n // Grant all handlers permission to manage connections\n const allHandlers = new Set<lambda.IFunction>();\n if (connectHandler) allHandlers.add(connectHandler);\n if (disconnectHandler) allHandlers.add(disconnectHandler);\n if (defaultRouteHandler) allHandlers.add(defaultRouteHandler);\n Object.values(routes).forEach((h) => allHandlers.add(h));\n\n for (const lambdaHandler of allHandlers) {\n this.grantManageConnections(lambdaHandler);\n }\n }\n\n //\n //\n // Public accessors\n //\n\n public get api(): apigatewayv2.WebSocketApi {\n return this._api;\n }\n\n public get apiId(): string {\n return this._api.apiId;\n }\n\n public get certificate(): acm.ICertificate | undefined {\n return this._certificate;\n }\n\n public get domainName(): string | undefined {\n return this._domainName?.name;\n }\n\n /**\n * The WebSocket endpoint URL.\n * Uses custom domain if configured, otherwise returns the default stage URL.\n */\n public get endpoint(): string {\n if (this._host) {\n return `wss://${this._host}`;\n }\n return this._stage.url;\n }\n\n public get host(): string | undefined {\n return this._host;\n }\n\n public get stage(): apigatewayv2.WebSocketStage {\n return this._stage;\n }\n\n /**\n * The callback URL for API Gateway Management API.\n * Use this URL to send messages to connected clients.\n */\n public get callbackUrl(): string {\n if (this._host) {\n return `https://${this._host}`;\n }\n // Extract callback URL from stage URL\n // Stage URL: wss://abc123.execute-api.us-east-1.amazonaws.com/production\n // Callback URL: https://abc123.execute-api.us-east-1.amazonaws.com/production\n return this._stage.url.replace(\"wss://\", \"https://\");\n }\n\n //\n //\n // Public methods\n //\n\n /**\n * Grant a Lambda function permission to manage WebSocket connections\n * (post messages to connections, get connection info, delete connections).\n */\n public grantManageConnections(grantee: lambda.IFunction): iam.Grant {\n // Use the CDK's built-in grantManageConnections which properly grants\n // permissions for all @connections methods (POST, GET, DELETE) across all stages\n return this._api.grantManageConnections(grantee);\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration } from \"aws-cdk-lib\";\n\nimport { CDK } from \"./constants\";\nimport { JaypieLambda, JaypieLambdaProps } from \"./JaypieLambda.js\";\n\n/**\n * JaypieWebSocketLambda - A Lambda function optimized for WebSocket handlers.\n *\n * Provides sensible defaults for WebSocket event handling:\n * - 30 second timeout (same as API handlers)\n * - API role tag\n *\n * @example\n * ```typescript\n * const handler = new JaypieWebSocketLambda(this, \"ChatHandler\", {\n * code: \"dist/handlers\",\n * handler: \"chat.handler\",\n * secrets: [\"MONGODB_URI\"],\n * });\n *\n * new JaypieWebSocket(this, \"Chat\", {\n * host: \"ws.example.com\",\n * handler,\n * });\n * ```\n */\nexport class JaypieWebSocketLambda extends JaypieLambda {\n constructor(scope: Construct, id: string, props: JaypieLambdaProps) {\n super(scope, id, {\n roleTag: CDK.ROLE.API,\n timeout: Duration.seconds(CDK.DURATION.EXPRESS_API),\n ...props,\n });\n }\n}\n","import { Construct } from \"constructs\";\nimport { Duration, RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as lambda from \"aws-cdk-lib/aws-lambda\";\n\nimport { CDK } from \"./constants\";\nimport { constructEnvName } from \"./helpers\";\n\n//\n//\n// Types\n//\n\nexport interface JaypieWebSocketTableProps {\n /**\n * Explicit table name. If not provided, uses CDK-generated name.\n */\n tableName?: string;\n\n /**\n * Time-to-live duration for connections.\n * Connections will be automatically deleted after this duration.\n * @default Duration.hours(24)\n */\n ttl?: Duration;\n\n /**\n * Whether to create a GSI for looking up connections by user ID.\n * @default false\n */\n userIndex?: boolean;\n\n /**\n * Role tag for tagging resources.\n * @default CDK.ROLE.STORAGE\n */\n roleTag?: string;\n}\n\n//\n//\n// Main\n//\n\n/**\n * JaypieWebSocketTable - DynamoDB table for storing WebSocket connection IDs.\n *\n * Provides a simple table structure for tracking active WebSocket connections:\n * - Partition key: connectionId (String)\n * - TTL attribute: expiresAt (for automatic cleanup)\n * - Optional GSI: userId-index (for looking up connections by user)\n *\n * @example\n * ```typescript\n * const connectionTable = new JaypieWebSocketTable(this, \"Connections\");\n *\n * const ws = new JaypieWebSocket(this, \"Chat\", {\n * host: \"ws.example.com\",\n * handler: chatHandler,\n * });\n *\n * // Grant Lambda access to the table\n * connectionTable.grantReadWriteData(chatHandler);\n *\n * // Pass table name to Lambda\n * chatHandler.addEnvironment(\"CONNECTION_TABLE\", connectionTable.tableName);\n * ```\n *\n * @example\n * // With user index for looking up all connections for a user\n * const connectionTable = new JaypieWebSocketTable(this, \"Connections\", {\n * userIndex: true,\n * ttl: Duration.hours(12),\n * });\n */\nexport class JaypieWebSocketTable extends Construct {\n private readonly _table: dynamodb.TableV2;\n private readonly _ttlDuration: Duration;\n\n constructor(\n scope: Construct,\n id: string,\n props: JaypieWebSocketTableProps = {},\n ) {\n super(scope, id);\n\n const {\n roleTag = CDK.ROLE.STORAGE,\n tableName,\n ttl = Duration.hours(24),\n userIndex = false,\n } = props;\n\n this._ttlDuration = ttl;\n\n // Build global secondary indexes\n const globalSecondaryIndexes: dynamodb.GlobalSecondaryIndexPropsV2[] = [];\n\n if (userIndex) {\n globalSecondaryIndexes.push({\n indexName: \"userId-index\",\n partitionKey: { name: \"userId\", type: dynamodb.AttributeType.STRING },\n sortKey: { name: \"connectedAt\", type: dynamodb.AttributeType.STRING },\n });\n }\n\n // Create the table\n this._table = new dynamodb.TableV2(this, \"Table\", {\n billing: dynamodb.Billing.onDemand(),\n globalSecondaryIndexes:\n globalSecondaryIndexes.length > 0 ? globalSecondaryIndexes : undefined,\n partitionKey: {\n name: \"connectionId\",\n type: dynamodb.AttributeType.STRING,\n },\n removalPolicy: RemovalPolicy.DESTROY,\n tableName: tableName || constructEnvName(\"WebSocketConnections\"),\n timeToLiveAttribute: \"expiresAt\",\n });\n\n Tags.of(this._table).add(CDK.TAG.ROLE, roleTag);\n }\n\n //\n //\n // Public accessors\n //\n\n /**\n * The underlying DynamoDB TableV2 construct.\n */\n public get table(): dynamodb.TableV2 {\n return this._table;\n }\n\n /**\n * The name of the DynamoDB table.\n */\n public get tableName(): string {\n return this._table.tableName;\n }\n\n /**\n * The ARN of the DynamoDB table.\n */\n public get tableArn(): string {\n return this._table.tableArn;\n }\n\n /**\n * TTL duration for connections in seconds.\n * Use this to calculate expiresAt when storing connections.\n */\n public get ttlSeconds(): number {\n return this._ttlDuration.toSeconds();\n }\n\n //\n //\n // Grant methods\n //\n\n /**\n * Grant read permissions to the table.\n */\n public grantReadData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantReadData(grantee);\n }\n\n /**\n * Grant write permissions to the table.\n */\n public grantWriteData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantWriteData(grantee);\n }\n\n /**\n * Grant read and write permissions to the table.\n */\n public grantReadWriteData(grantee: iam.IGrantable): iam.Grant {\n return this._table.grantReadWriteData(grantee);\n }\n\n //\n //\n // Convenience methods\n //\n\n /**\n * Add the table name to a Lambda function's environment variables.\n * Also grants read/write access to the table.\n */\n public connectLambda(\n lambdaFunction: lambda.IFunction,\n options: { envKey?: string; readOnly?: boolean } = {},\n ): void {\n const { envKey = \"CONNECTION_TABLE\", readOnly = false } = options;\n\n // Add environment variable\n if (\"addEnvironment\" in lambdaFunction) {\n (lambdaFunction as lambda.Function).addEnvironment(\n envKey,\n this.tableName,\n );\n }\n\n // Grant permissions\n if (readOnly) {\n this.grantReadData(lambdaFunction.grantPrincipal);\n } else {\n this.grantReadWriteData(lambdaFunction.grantPrincipal);\n }\n }\n}\n"],"names":["CDK","Construct","Bucket","BucketAccessControl","cdk","StorageClass","secretsmanager","DatadogLambda","Tags","ConfigurationError","Role","PolicyStatement","Policy","acm","Stack","validPart","isValidHostname","DEFAULT_FUNCTION_NAME","lambda","logDestinations","route53","checkEnvIsConsumer","checkEnvIsProvider","cleanName","exportEnvName","Fn","CfnOutput","SecretValue","apiGateway","route53Targets","Duration","logs","RemovalPolicy","sqs","lambdaEventSources","s3","s3n","CfnStack","Rule","LambdaFunction","RuleTargetInput","origins","cloudfront","LambdaDestination","ARecord","RecordTarget","CnameRecord","MxRecord","NsRecord","TxtRecord","generateIndexName","DEFAULT_SORT_KEY","dynamodb","DEFAULT_INDEXES","FederatedPrincipal","Effect","LogGroup","RetentionDays","ServicePrincipal","FilterPattern","HostedZone","path","Nextjs","EventType","Trail","ReadWriteType","CfnPermissionSet","ManagedPolicy","CfnAssignment","CfnApplication","apigatewayv2","apigatewayv2Integrations"],"mappings":"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"}