@jaypie/constructs 1.2.1 → 1.2.3

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,9 +1,10 @@
1
1
  import { Construct } from "constructs";
2
2
  import { Duration, Stack, RemovalPolicy } from "aws-cdk-lib";
3
- import * as lambda from "aws-cdk-lib/aws-lambda";
4
3
  import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
4
+ import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
5
5
  import * as ec2 from "aws-cdk-lib/aws-ec2";
6
6
  import * as iam from "aws-cdk-lib/aws-iam";
7
+ import * as lambda from "aws-cdk-lib/aws-lambda";
7
8
  import * as logs from "aws-cdk-lib/aws-logs";
8
9
  import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
9
10
  import { EnvironmentInput, SecretsArrayItem } from "./helpers/index.js";
@@ -17,6 +18,10 @@ export interface JaypieLambdaProps {
17
18
  deadLetterQueueEnabled?: boolean;
18
19
  deadLetterTopic?: import("aws-cdk-lib/aws-sns").ITopic;
19
20
  description?: string;
21
+ /**
22
+ * DynamoDB tables to grant read/write access to the Lambda function.
23
+ */
24
+ dynamoTables?: dynamodb.ITable[];
20
25
  /**
21
26
  * Environment variables for the Lambda function.
22
27
  *
@@ -1,10 +1,29 @@
1
+ import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
1
2
  import { IHostedZone } from "aws-cdk-lib/aws-route53";
2
3
  import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
3
4
  import { Construct } from "constructs";
4
5
  import { EnvironmentInput, SecretsArrayItem } from "./helpers";
6
+ export interface DomainNameConfig {
7
+ component?: string;
8
+ domain?: string;
9
+ env?: string;
10
+ subdomain?: string;
11
+ }
5
12
  export interface JaypieNextjsProps {
6
13
  datadogApiKeyArn?: string;
7
- domainName?: string;
14
+ /**
15
+ * Domain name for the Next.js application.
16
+ *
17
+ * Supports both string and config object:
18
+ * - String: used directly as the domain name
19
+ * - Object: passed to envHostname() to construct the domain name
20
+ * - { component, domain, env, subdomain }
21
+ */
22
+ domainName?: string | DomainNameConfig;
23
+ /**
24
+ * DynamoDB tables to grant read/write access to the Next.js server function.
25
+ */
26
+ dynamoTables?: dynamodb.ITable[];
8
27
  /**
9
28
  * Environment variables for the Next.js application.
10
29
  *
@@ -31,6 +50,29 @@ export interface JaypieNextjsProps {
31
50
  secrets?: SecretsArrayItem[];
32
51
  }
33
52
  export declare class JaypieNextJs extends Construct {
53
+ private readonly _nextjs;
34
54
  readonly domainName: string;
35
55
  constructor(scope: Construct, id: string, props?: JaypieNextjsProps);
56
+ /** S3 bucket for static assets */
57
+ get bucket(): import("aws-cdk-lib/aws-s3").IBucket;
58
+ /** CloudFront distribution */
59
+ get distribution(): import("cdk-nextjs-standalone").NextjsDistribution;
60
+ /** Route53 domain configuration */
61
+ get domain(): import("cdk-nextjs-standalone").NextjsDomain | undefined;
62
+ /** Image optimization Lambda function */
63
+ get imageOptimizationFunction(): import("cdk-nextjs-standalone").NextjsImage;
64
+ /** Image optimization Lambda function URL */
65
+ get imageOptimizationLambdaFunctionUrl(): import("aws-cdk-lib/aws-lambda").FunctionUrl;
66
+ /** Server Lambda function URL */
67
+ get lambdaFunctionUrl(): import("aws-cdk-lib/aws-lambda").FunctionUrl;
68
+ /** Next.js build output */
69
+ get nextBuild(): import("cdk-nextjs-standalone").NextjsBuild;
70
+ /** ISR revalidation configuration */
71
+ get revalidation(): import("cdk-nextjs-standalone").NextjsRevalidation;
72
+ /** Next.js server function */
73
+ get serverFunction(): import("cdk-nextjs-standalone").NextjsServer;
74
+ /** Static assets configuration */
75
+ get staticAssets(): import("cdk-nextjs-standalone").NextjsStaticAssets;
76
+ /** CloudFront distribution URL */
77
+ get url(): string;
36
78
  }
@@ -390,7 +390,8 @@ function envHostname({ component, domain, env, subdomain, } = {}) {
390
390
  throw new errors.ConfigurationError("No hostname `domain` provided. Set CDK_ENV_DOMAIN or CDK_ENV_HOSTED_ZONE to use environment domain");
391
391
  }
392
392
  const resolvedComponent = component === "@" || component === "" ? undefined : component;
393
- const resolvedSubdomain = subdomain || process.env.CDK_ENV_SUBDOMAIN;
393
+ const providedSubdomain = subdomain === "@" || subdomain === "" ? undefined : subdomain;
394
+ const resolvedSubdomain = providedSubdomain || process.env.CDK_ENV_SUBDOMAIN;
394
395
  const resolvedEnv = env || process.env.PROJECT_ENV;
395
396
  const filteredEnv = resolvedEnv === CDK$2.ENV.PRODUCTION ? undefined : resolvedEnv;
396
397
  const parts = [
@@ -1200,7 +1201,7 @@ class JaypieAppStack extends JaypieStack {
1200
1201
  class JaypieLambda extends constructs.Construct {
1201
1202
  constructor(scope, id, props) {
1202
1203
  super(scope, id);
1203
- const { allowAllOutbound, allowPublicSubnet, architecture = lambda__namespace.Architecture.X86_64, code, datadogApiKeyArn, deadLetterQueue, deadLetterQueueEnabled, deadLetterTopic, description, environment: environmentInput, envSecrets = {}, ephemeralStorageSize, filesystem, handler = "index.handler", initialPolicy, layers = [], logGroup, logRetention = CDK$2.LAMBDA.LOG_RETENTION, maxEventAge, memorySize = CDK$2.LAMBDA.MEMORY_SIZE, paramsAndSecrets, paramsAndSecretsOptions, profiling, profilingGroup, provisionedConcurrentExecutions, reservedConcurrentExecutions, retryAttempts, roleTag = CDK$2.ROLE.PROCESSING, runtime = new lambda__namespace.Runtime("nodejs24.x", lambda__namespace.RuntimeFamily.NODEJS, {
1204
+ const { allowAllOutbound, allowPublicSubnet, architecture = lambda__namespace.Architecture.X86_64, code, datadogApiKeyArn, deadLetterQueue, deadLetterQueueEnabled, deadLetterTopic, description, dynamoTables = [], environment: environmentInput, envSecrets = {}, ephemeralStorageSize, filesystem, handler = "index.handler", initialPolicy, layers = [], logGroup, logRetention = CDK$2.LAMBDA.LOG_RETENTION, maxEventAge, memorySize = CDK$2.LAMBDA.MEMORY_SIZE, paramsAndSecrets, paramsAndSecretsOptions, profiling, profilingGroup, provisionedConcurrentExecutions, reservedConcurrentExecutions, retryAttempts, roleTag = CDK$2.ROLE.PROCESSING, runtime = new lambda__namespace.Runtime("nodejs24.x", lambda__namespace.RuntimeFamily.NODEJS, {
1204
1205
  supportsInlineCode: true,
1205
1206
  }), runtimeManagementMode, secrets: secretsInput = [], securityGroups, timeout = cdk.Duration.seconds(CDK$2.DURATION.LAMBDA_WORKER), tracing, vendorTag, vpc, vpcSubnets, } = props;
1206
1207
  // Resolve environment from array or object syntax
@@ -1291,6 +1292,14 @@ class JaypieLambda extends constructs.Construct {
1291
1292
  secrets.forEach((secret) => {
1292
1293
  secret.grantRead(this._lambda);
1293
1294
  });
1295
+ // Grant read/write permissions for DynamoDB tables
1296
+ dynamoTables.forEach((table) => {
1297
+ table.grantReadWriteData(this._lambda);
1298
+ });
1299
+ // Add table name to environment if there's exactly one table
1300
+ if (dynamoTables.length === 1) {
1301
+ this._lambda.addEnvironment("CDK_ENV_DYNAMO_TABLE", dynamoTables[0].tableName);
1302
+ }
1294
1303
  // Configure provisioned concurrency if specified
1295
1304
  if (provisionedConcurrentExecutions !== undefined) {
1296
1305
  // Use currentVersion which is auto-published with proper configuration
@@ -2595,7 +2604,9 @@ class JaypieMongoDbSecret extends JaypieEnvSecret {
2595
2604
  class JaypieNextJs extends constructs.Construct {
2596
2605
  constructor(scope, id, props) {
2597
2606
  super(scope, id);
2598
- const domainName = props?.domainName || envHostname();
2607
+ const domainName = typeof props?.domainName === "string"
2608
+ ? props.domainName
2609
+ : envHostname(props?.domainName);
2599
2610
  this.domainName = domainName;
2600
2611
  const domainNameSanitized = domainName
2601
2612
  .replace(/\./g, "-")
@@ -2681,6 +2692,62 @@ class JaypieNextJs extends constructs.Construct {
2681
2692
  secrets.forEach((secret) => {
2682
2693
  secret.grantRead(nextjs.serverFunction.lambdaFunction);
2683
2694
  });
2695
+ // Grant read/write permissions for DynamoDB tables
2696
+ const dynamoTables = props?.dynamoTables || [];
2697
+ dynamoTables.forEach((table) => {
2698
+ table.grantReadWriteData(nextjs.serverFunction.lambdaFunction);
2699
+ });
2700
+ // Add table name to environment if there's exactly one table
2701
+ if (dynamoTables.length === 1) {
2702
+ nextjs.serverFunction.lambdaFunction.addEnvironment("CDK_ENV_DYNAMO_TABLE", dynamoTables[0].tableName);
2703
+ }
2704
+ // Store reference to nextjs for property exposure
2705
+ this._nextjs = nextjs;
2706
+ }
2707
+ // Expose Nextjs construct properties
2708
+ /** S3 bucket for static assets */
2709
+ get bucket() {
2710
+ return this._nextjs.bucket;
2711
+ }
2712
+ /** CloudFront distribution */
2713
+ get distribution() {
2714
+ return this._nextjs.distribution;
2715
+ }
2716
+ /** Route53 domain configuration */
2717
+ get domain() {
2718
+ return this._nextjs.domain;
2719
+ }
2720
+ /** Image optimization Lambda function */
2721
+ get imageOptimizationFunction() {
2722
+ return this._nextjs.imageOptimizationFunction;
2723
+ }
2724
+ /** Image optimization Lambda function URL */
2725
+ get imageOptimizationLambdaFunctionUrl() {
2726
+ return this._nextjs.imageOptimizationLambdaFunctionUrl;
2727
+ }
2728
+ /** Server Lambda function URL */
2729
+ get lambdaFunctionUrl() {
2730
+ return this._nextjs.lambdaFunctionUrl;
2731
+ }
2732
+ /** Next.js build output */
2733
+ get nextBuild() {
2734
+ return this._nextjs.nextBuild;
2735
+ }
2736
+ /** ISR revalidation configuration */
2737
+ get revalidation() {
2738
+ return this._nextjs.revalidation;
2739
+ }
2740
+ /** Next.js server function */
2741
+ get serverFunction() {
2742
+ return this._nextjs.serverFunction;
2743
+ }
2744
+ /** Static assets configuration */
2745
+ get staticAssets() {
2746
+ return this._nextjs.staticAssets;
2747
+ }
2748
+ /** CloudFront distribution URL */
2749
+ get url() {
2750
+ return this._nextjs.url;
2684
2751
  }
2685
2752
  }
2686
2753