cdk-nextjs 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.jsii +13811 -0
  2. package/.prettierrc +0 -0
  3. package/API.md +9694 -0
  4. package/LICENSE +202 -0
  5. package/README.md +137 -0
  6. package/THIRD-PARTY-LICENSES.md +31 -0
  7. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +18 -0
  8. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +8831 -0
  9. package/assets/lambdas/revalidate/revalidate.lambda/index.js +67 -0
  10. package/assets/lambdas/sign-fn-url/sign-fn-url.lambda/index.js +2002 -0
  11. package/examples/README.md +14 -0
  12. package/lib/common.d.ts +23 -0
  13. package/lib/common.js +28 -0
  14. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.d.ts +106 -0
  15. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.js +3 -0
  16. package/lib/generated-structs/OptionalCloudFrontFunctionProps.d.ts +43 -0
  17. package/lib/generated-structs/OptionalCloudFrontFunctionProps.js +3 -0
  18. package/lib/generated-structs/OptionalClusterProps.d.ts +49 -0
  19. package/lib/generated-structs/OptionalClusterProps.js +3 -0
  20. package/lib/generated-structs/OptionalDistributionProps.d.ts +155 -0
  21. package/lib/generated-structs/OptionalDistributionProps.js +3 -0
  22. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +124 -0
  23. package/lib/generated-structs/OptionalDockerImageAssetProps.js +3 -0
  24. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +399 -0
  25. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +3 -0
  26. package/lib/generated-structs/OptionalEdgeFunctionProps.d.ts +428 -0
  27. package/lib/generated-structs/OptionalEdgeFunctionProps.js +3 -0
  28. package/lib/generated-structs/OptionalFunctionProps.d.ts +422 -0
  29. package/lib/generated-structs/OptionalFunctionProps.js +3 -0
  30. package/lib/generated-structs/OptionalFunctionUrlProps.d.ts +30 -0
  31. package/lib/generated-structs/OptionalFunctionUrlProps.js +3 -0
  32. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +45 -0
  33. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +3 -0
  34. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +30 -0
  35. package/lib/generated-structs/OptionalNextjsBuildProps.js +3 -0
  36. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +43 -0
  37. package/lib/generated-structs/OptionalNextjsContainersProps.js +3 -0
  38. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +50 -0
  39. package/lib/generated-structs/OptionalNextjsDistributionProps.js +3 -0
  40. package/lib/generated-structs/OptionalNextjsFileSystemProps.d.ts +15 -0
  41. package/lib/generated-structs/OptionalNextjsFileSystemProps.js +3 -0
  42. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +17 -0
  43. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +3 -0
  44. package/lib/generated-structs/OptionalNextjsVpcProps.d.ts +21 -0
  45. package/lib/generated-structs/OptionalNextjsVpcProps.js +3 -0
  46. package/lib/generated-structs/OptionalS3OriginProps.d.ts +64 -0
  47. package/lib/generated-structs/OptionalS3OriginProps.js +3 -0
  48. package/lib/generated-structs/OptionalVpcProps.d.ts +224 -0
  49. package/lib/generated-structs/OptionalVpcProps.js +3 -0
  50. package/lib/index.d.ts +35 -0
  51. package/lib/index.js +32 -0
  52. package/lib/lambdas/assets-deployment/assets-deployment-function.d.ts +13 -0
  53. package/lib/lambdas/assets-deployment/assets-deployment-function.js +23 -0
  54. package/lib/lambdas/assets-deployment/assets-deployment.lambda.d.ts +2 -0
  55. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +62 -0
  56. package/lib/lambdas/assets-deployment/common.d.ts +8 -0
  57. package/lib/lambdas/assets-deployment/common.js +32 -0
  58. package/lib/lambdas/assets-deployment/fs-to-fs.d.ts +2 -0
  59. package/lib/lambdas/assets-deployment/fs-to-fs.js +9 -0
  60. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +2 -0
  61. package/lib/lambdas/assets-deployment/fs-to-s3.js +45 -0
  62. package/lib/lambdas/assets-deployment/prune-s3.d.ts +15 -0
  63. package/lib/lambdas/assets-deployment/prune-s3.js +42 -0
  64. package/lib/lambdas/assets-deployment/s3.d.ts +2 -0
  65. package/lib/lambdas/assets-deployment/s3.js +7 -0
  66. package/lib/lambdas/assets-deployment/utils.d.ts +18 -0
  67. package/lib/lambdas/assets-deployment/utils.js +35 -0
  68. package/lib/lambdas/revalidate/revalidate-function.d.ts +13 -0
  69. package/lib/lambdas/revalidate/revalidate-function.js +23 -0
  70. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +2 -0
  71. package/lib/lambdas/revalidate/revalidate.lambda.js +53 -0
  72. package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +13 -0
  73. package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +23 -0
  74. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.d.ts +9 -0
  75. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.js +35 -0
  76. package/lib/lambdas/sign-fn-url/sign-request.d.ts +28 -0
  77. package/lib/lambdas/sign-fn-url/sign-request.js +119 -0
  78. package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +1 -0
  79. package/lib/lambdas/sign-fn-url/sign-request.test.js +129 -0
  80. package/lib/nextjs-assets-deployment.d.ts +116 -0
  81. package/lib/nextjs-assets-deployment.js +93 -0
  82. package/lib/nextjs-build/add-cache-handler.d.ts +1 -0
  83. package/lib/nextjs-build/add-cache-handler.js +23 -0
  84. package/lib/nextjs-build/add-cache-handler.mjs +18 -0
  85. package/lib/nextjs-build/builder.Dockerfile +29 -0
  86. package/lib/nextjs-build/cache-handler.cjs +21513 -0
  87. package/lib/nextjs-build/cache-handler.d.ts +6 -0
  88. package/lib/nextjs-build/cache-handler.js +22 -0
  89. package/lib/nextjs-build/global-containers.Dockerfile +45 -0
  90. package/lib/nextjs-build/global-functions.Dockerfile +46 -0
  91. package/lib/nextjs-build/nextjs-build.d.ts +150 -0
  92. package/lib/nextjs-build/nextjs-build.js +220 -0
  93. package/lib/nextjs-build/regional-containers.Dockerfile +45 -0
  94. package/lib/nextjs-build/symlink-full-route-cache.d.ts +1 -0
  95. package/lib/nextjs-build/symlink-full-route-cache.js +37 -0
  96. package/lib/nextjs-build/symlink-full-route-cache.mjs +23 -0
  97. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +8 -0
  98. package/lib/nextjs-compute/nextjs-compute-base-props.js +3 -0
  99. package/lib/nextjs-compute/nextjs-containers.d.ts +43 -0
  100. package/lib/nextjs-compute/nextjs-containers.js +149 -0
  101. package/lib/nextjs-compute/nextjs-functions.d.ts +23 -0
  102. package/lib/nextjs-compute/nextjs-functions.js +57 -0
  103. package/lib/nextjs-distribution.d.ts +120 -0
  104. package/lib/nextjs-distribution.js +362 -0
  105. package/lib/nextjs-file-system.d.ts +42 -0
  106. package/lib/nextjs-file-system.js +74 -0
  107. package/lib/nextjs-invalidation.d.ts +19 -0
  108. package/lib/nextjs-invalidation.js +52 -0
  109. package/lib/nextjs-revalidation.d.ts +30 -0
  110. package/lib/nextjs-revalidation.js +65 -0
  111. package/lib/nextjs-static-assets.d.ts +21 -0
  112. package/lib/nextjs-static-assets.js +32 -0
  113. package/lib/nextjs-vpc.d.ts +42 -0
  114. package/lib/nextjs-vpc.js +64 -0
  115. package/lib/root-constructs/nextjs-base-overrides.d.ts +26 -0
  116. package/lib/root-constructs/nextjs-base-overrides.js +3 -0
  117. package/lib/root-constructs/nextjs-base-props.d.ts +56 -0
  118. package/lib/root-constructs/nextjs-base-props.js +3 -0
  119. package/lib/root-constructs/nextjs-global-containers.d.ts +74 -0
  120. package/lib/root-constructs/nextjs-global-containers.js +125 -0
  121. package/lib/root-constructs/nextjs-global-functions.d.ts +76 -0
  122. package/lib/root-constructs/nextjs-global-functions.js +131 -0
  123. package/lib/root-constructs/nextjs-regional-containers.d.ts +43 -0
  124. package/lib/root-constructs/nextjs-regional-containers.js +92 -0
  125. package/package.json +165 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsInvalidation = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
+ const custom_resources_1 = require("aws-cdk-lib/custom-resources");
9
+ const constructs_1 = require("constructs");
10
+ class NextjsInvalidation extends constructs_1.Construct {
11
+ constructor(scope, id, props) {
12
+ super(scope, id);
13
+ const awsSdkCall = {
14
+ // make `physicalResourceId` change each time to invalidate CloudFront
15
+ // distribution on each change
16
+ physicalResourceId: custom_resources_1.PhysicalResourceId.of(`${props.distribution.distributionId}-${Date.now()}`),
17
+ action: "CreateInvalidationCommand",
18
+ service: "@aws-sdk/client-cloudfront",
19
+ parameters: {
20
+ DistributionId: props.distribution.distributionId,
21
+ InvalidationBatch: {
22
+ CallerReference: new Date().toISOString(),
23
+ Paths: {
24
+ Quantity: 1,
25
+ Items: ["/*"],
26
+ },
27
+ },
28
+ },
29
+ };
30
+ new custom_resources_1.AwsCustomResource(this, "AwsCR", {
31
+ onCreate: awsSdkCall,
32
+ onUpdate: awsSdkCall,
33
+ policy: custom_resources_1.AwsCustomResourcePolicy.fromStatements([
34
+ new aws_iam_1.PolicyStatement({
35
+ actions: ["cloudfront:CreateInvalidation"],
36
+ resources: [
37
+ aws_cdk_lib_1.Stack.of(this).formatArn({
38
+ resource: `distribution/${props.distribution.distributionId}`,
39
+ service: "cloudfront",
40
+ region: "",
41
+ }),
42
+ ],
43
+ }),
44
+ ]),
45
+ ...props.overrides?.awsCustomResourceProps,
46
+ });
47
+ }
48
+ }
49
+ exports.NextjsInvalidation = NextjsInvalidation;
50
+ _a = JSII_RTTI_SYMBOL_1;
51
+ NextjsInvalidation[_a] = { fqn: "cdk-nextjs.NextjsInvalidation", version: "0.0.0" };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWludmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtaW52YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQW9DO0FBRXBDLGlEQUFzRDtBQUN0RCxtRUFNc0M7QUFDdEMsMkNBQXVDO0FBaUJ2QyxNQUFhLGtCQUFtQixTQUFRLHNCQUFTO0lBQy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBZTtZQUM3QixzRUFBc0U7WUFDdEUsOEJBQThCO1lBQzlCLGtCQUFrQixFQUFFLHFDQUFrQixDQUFDLEVBQUUsQ0FDdkMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDckQ7WUFDRCxNQUFNLEVBQUUsMkJBQTJCO1lBQ25DLE9BQU8sRUFBRSw0QkFBNEI7WUFDckMsVUFBVSxFQUFFO2dCQUNWLGNBQWMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWM7Z0JBQ2pELGlCQUFpQixFQUFFO29CQUNqQixlQUFlLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7b0JBQ3pDLEtBQUssRUFBRTt3QkFDTCxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7cUJBQ2Q7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7UUFDRixJQUFJLG9DQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDbkMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsTUFBTSxFQUFFLDBDQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0MsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFO3dCQUNULG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDdkIsUUFBUSxFQUFFLGdCQUFnQixLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRTs0QkFDN0QsT0FBTyxFQUFFLFlBQVk7NEJBQ3JCLE1BQU0sRUFBRSxFQUFFO3lCQUNYLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQzthQUNILENBQUM7WUFDRixHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdkNILGdEQXdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJRGlzdHJpYnV0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgQXdzQ3VzdG9tUmVzb3VyY2UsXG4gIEF3c1Nka0NhbGwsXG4gIEF3c0N1c3RvbVJlc291cmNlUG9saWN5LFxuICBQaHlzaWNhbFJlc291cmNlSWQsXG4gIEF3c0N1c3RvbVJlc291cmNlUHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IGF3c0N1c3RvbVJlc291cmNlUHJvcHM/OiBBd3NDdXN0b21SZXNvdXJjZVByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0ludmFsaWRhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogSURpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNJbnZhbGlkYXRpb25PdmVycmlkZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNJbnZhbGlkYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzSW52YWxpZGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IGF3c1Nka0NhbGw6IEF3c1Nka0NhbGwgPSB7XG4gICAgICAvLyBtYWtlIGBwaHlzaWNhbFJlc291cmNlSWRgIGNoYW5nZSBlYWNoIHRpbWUgdG8gaW52YWxpZGF0ZSBDbG91ZEZyb250XG4gICAgICAvLyBkaXN0cmlidXRpb24gb24gZWFjaCBjaGFuZ2VcbiAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICBgJHtwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWR9LSR7RGF0ZS5ub3coKX1gLFxuICAgICAgKSxcbiAgICAgIGFjdGlvbjogXCJDcmVhdGVJbnZhbGlkYXRpb25Db21tYW5kXCIsXG4gICAgICBzZXJ2aWNlOiBcIkBhd3Mtc2RrL2NsaWVudC1jbG91ZGZyb250XCIsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIERpc3RyaWJ1dGlvbklkOiBwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWQsXG4gICAgICAgIEludmFsaWRhdGlvbkJhdGNoOiB7XG4gICAgICAgICAgQ2FsbGVyUmVmZXJlbmNlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgUGF0aHM6IHtcbiAgICAgICAgICAgIFF1YW50aXR5OiAxLFxuICAgICAgICAgICAgSXRlbXM6IFtcIi8qXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiQXdzQ1JcIiwge1xuICAgICAgb25DcmVhdGU6IGF3c1Nka0NhbGwsXG4gICAgICBvblVwZGF0ZTogYXdzU2RrQ2FsbCxcbiAgICAgIHBvbGljeTogQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXCJjbG91ZGZyb250OkNyZWF0ZUludmFsaWRhdGlvblwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgICAgICAgIHJlc291cmNlOiBgZGlzdHJpYnV0aW9uLyR7cHJvcHMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkfWAsXG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwiY2xvdWRmcm9udFwiLFxuICAgICAgICAgICAgICByZWdpb246IFwiXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIF0pLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVzPy5hd3NDdXN0b21SZXNvdXJjZVByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import { Function as LambdaFunction } from "aws-cdk-lib/aws-lambda";
2
+ import { SqsEventSourceProps } from "aws-cdk-lib/aws-lambda-event-sources";
3
+ import { Queue, QueueProps } from "aws-cdk-lib/aws-sqs";
4
+ import { Construct } from "constructs";
5
+ import { OptionalFunctionProps } from "./generated-structs/OptionalFunctionProps";
6
+ export interface NextjsRevalidationOverrides {
7
+ readonly queueProps?: QueueProps;
8
+ readonly functionProps?: OptionalFunctionProps;
9
+ readonly sqsEventSourceProps?: SqsEventSourceProps;
10
+ }
11
+ export interface NextjsRevalidationProps {
12
+ readonly fn: LambdaFunction;
13
+ readonly overrides?: NextjsRevalidationOverrides;
14
+ readonly previewModeId: string;
15
+ }
16
+ /**
17
+ * [On-Demand Revalidation](https://nextjs.org/docs/app/building-your-application/caching#on-demand-revalidation)
18
+ * (i.e. `revalidateTag`, `revlidatePath`) doesn't work by default in Lambda
19
+ * environment because it tries to run every request completes when Lambda
20
+ * spins down. Therefore, we use a SQS Queue and Lambda function to run
21
+ * revalidation async.
22
+ */
23
+ export declare class NextjsRevalidation extends Construct {
24
+ queue: Queue;
25
+ fn: LambdaFunction;
26
+ private props;
27
+ constructor(scope: Construct, id: string, props: NextjsRevalidationProps);
28
+ private createQueue;
29
+ private createFunction;
30
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsRevalidation = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
+ const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
9
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
10
+ const constructs_1 = require("constructs");
11
+ const revalidate_function_1 = require("./lambdas/revalidate/revalidate-function");
12
+ /**
13
+ * [On-Demand Revalidation](https://nextjs.org/docs/app/building-your-application/caching#on-demand-revalidation)
14
+ * (i.e. `revalidateTag`, `revlidatePath`) doesn't work by default in Lambda
15
+ * environment because it tries to run every request completes when Lambda
16
+ * spins down. Therefore, we use a SQS Queue and Lambda function to run
17
+ * revalidation async.
18
+ */
19
+ class NextjsRevalidation extends constructs_1.Construct {
20
+ constructor(scope, id, props) {
21
+ super(scope, id);
22
+ this.props = props;
23
+ this.queue = this.createQueue();
24
+ this.fn = this.createFunction();
25
+ }
26
+ createQueue() {
27
+ const queue = new aws_sqs_1.Queue(this, "Queue", {
28
+ fifo: true,
29
+ contentBasedDeduplication: true,
30
+ ...this.props.overrides?.queueProps,
31
+ });
32
+ // https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-least-privilege-policy.html
33
+ queue.addToResourcePolicy(new aws_iam_1.PolicyStatement({
34
+ sid: "DenyUnsecureTransport",
35
+ actions: ["sqs:*"],
36
+ effect: aws_iam_1.Effect.DENY,
37
+ principals: [new aws_iam_1.AnyPrincipal()],
38
+ resources: [queue.queueArn],
39
+ conditions: {
40
+ Bool: { "aws:SecureTransport": "false" },
41
+ },
42
+ }));
43
+ // Allow server to send messages to the queue
44
+ queue.grantSendMessages(this.props.fn);
45
+ this.props.fn.addEnvironment("CDK_NEXTJS_QUEUE_URL", queue.queueUrl);
46
+ return queue;
47
+ }
48
+ createFunction() {
49
+ const fn = new revalidate_function_1.RevalidateFunction(this, "Fn", {
50
+ environment: {
51
+ PREVIEW_MODE_ID: this.props.previewModeId,
52
+ },
53
+ timeout: aws_cdk_lib_1.Duration.seconds(20),
54
+ ...this.props.overrides?.functionProps,
55
+ });
56
+ fn.addEventSource(new aws_lambda_event_sources_1.SqsEventSource(this.queue, {
57
+ ...this.props.overrides?.sqsEventSourceProps,
58
+ }));
59
+ return fn;
60
+ }
61
+ }
62
+ exports.NextjsRevalidation = NextjsRevalidation;
63
+ _a = JSII_RTTI_SYMBOL_1;
64
+ NextjsRevalidation[_a] = { fqn: "cdk-nextjs.NextjsRevalidation", version: "0.0.0" };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJldmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtcmV2YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUE0RTtBQUU1RSxtRkFHOEM7QUFDOUMsaURBQXdEO0FBQ3hELDJDQUF1QztBQUV2QyxrRkFBOEU7QUFjOUU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQU0vQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUNyQyxJQUFJLEVBQUUsSUFBSTtZQUNWLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVO1NBQ3BDLENBQUMsQ0FBQztRQUNILDZHQUE2RztRQUM3RyxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLElBQUkseUJBQWUsQ0FBQztZQUNsQixHQUFHLEVBQUUsdUJBQXVCO1lBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxJQUFJO1lBQ25CLFVBQVUsRUFBRSxDQUFDLElBQUksc0JBQVksRUFBRSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDM0IsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRTthQUN6QztTQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0YsNkNBQTZDO1FBQzdDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDNUMsV0FBVyxFQUFFO2dCQUNYLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDMUM7WUFDRCxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYTtTQUN2QyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsY0FBYyxDQUNmLElBQUkseUNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsbUJBQW1CO1NBQzdDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOztBQXBESCxnREFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQW55UHJpbmNpcGFsLCBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICBTcXNFdmVudFNvdXJjZSxcbiAgU3FzRXZlbnRTb3VyY2VQcm9wcyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlc1wiO1xuaW1wb3J0IHsgUXVldWUsIFF1ZXVlUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgUmV2YWxpZGF0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4vbGFtYmRhcy9yZXZhbGlkYXRlL3JldmFsaWRhdGUtZnVuY3Rpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNSZXZhbGlkYXRpb25PdmVycmlkZXMge1xuICByZWFkb25seSBxdWV1ZVByb3BzPzogUXVldWVQcm9wcztcbiAgcmVhZG9ubHkgZnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcztcbiAgcmVhZG9ubHkgc3FzRXZlbnRTb3VyY2VQcm9wcz86IFNxc0V2ZW50U291cmNlUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmV2YWxpZGF0aW9uUHJvcHMge1xuICByZWFkb25seSBmbjogTGFtYmRhRnVuY3Rpb247XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1JldmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgcHJldmlld01vZGVJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFtPbi1EZW1hbmQgUmV2YWxpZGF0aW9uXShodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI29uLWRlbWFuZC1yZXZhbGlkYXRpb24pXG4gKiAoaS5lLiBgcmV2YWxpZGF0ZVRhZ2AsIGByZXZsaWRhdGVQYXRoYCkgZG9lc24ndCB3b3JrIGJ5IGRlZmF1bHQgaW4gTGFtYmRhXG4gKiBlbnZpcm9ubWVudCBiZWNhdXNlIGl0IHRyaWVzIHRvIHJ1biBldmVyeSByZXF1ZXN0IGNvbXBsZXRlcyB3aGVuIExhbWJkYVxuICogc3BpbnMgZG93bi4gVGhlcmVmb3JlLCB3ZSB1c2UgYSBTUVMgUXVldWUgYW5kIExhbWJkYSBmdW5jdGlvbiB0byBydW5cbiAqIHJldmFsaWRhdGlvbiBhc3luYy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JldmFsaWRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHF1ZXVlOiBRdWV1ZTtcbiAgZm46IExhbWJkYUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc1JldmFsaWRhdGlvblByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMucXVldWUgPSB0aGlzLmNyZWF0ZVF1ZXVlKCk7XG4gICAgdGhpcy5mbiA9IHRoaXMuY3JlYXRlRnVuY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUodGhpcywgXCJRdWV1ZVwiLCB7XG4gICAgICBmaWZvOiB0cnVlLFxuICAgICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogdHJ1ZSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5xdWV1ZVByb3BzLFxuICAgIH0pO1xuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L1NRU0RldmVsb3Blckd1aWRlL3Nxcy1sZWFzdC1wcml2aWxlZ2UtcG9saWN5Lmh0bWxcbiAgICBxdWV1ZS5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogXCJEZW55VW5zZWN1cmVUcmFuc3BvcnRcIixcbiAgICAgICAgYWN0aW9uczogW1wic3FzOipcIl0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkRFTlksXG4gICAgICAgIHByaW5jaXBhbHM6IFtuZXcgQW55UHJpbmNpcGFsKCldLFxuICAgICAgICByZXNvdXJjZXM6IFtxdWV1ZS5xdWV1ZUFybl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBCb29sOiB7IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiOiBcImZhbHNlXCIgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQWxsb3cgc2VydmVyIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlXG4gICAgcXVldWUuZ3JhbnRTZW5kTWVzc2FnZXModGhpcy5wcm9wcy5mbik7XG4gICAgdGhpcy5wcm9wcy5mbi5hZGRFbnZpcm9ubWVudChcIkNES19ORVhUSlNfUVVFVUVfVVJMXCIsIHF1ZXVlLnF1ZXVlVXJsKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGZuID0gbmV3IFJldmFsaWRhdGVGdW5jdGlvbih0aGlzLCBcIkZuXCIsIHtcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBSRVZJRVdfTU9ERV9JRDogdGhpcy5wcm9wcy5wcmV2aWV3TW9kZUlkLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmZ1bmN0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgZm4uYWRkRXZlbnRTb3VyY2UoXG4gICAgICBuZXcgU3FzRXZlbnRTb3VyY2UodGhpcy5xdWV1ZSwge1xuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uc3FzRXZlbnRTb3VyY2VQcm9wcyxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,21 @@
1
+ import { Bucket, BucketProps } from "aws-cdk-lib/aws-s3";
2
+ import { Construct } from "constructs";
3
+ export interface NextjsStaticAssetsOverrides {
4
+ readonly bucketProps?: BucketProps;
5
+ }
6
+ export interface NextjsStaticAssetsProps {
7
+ readonly overrides?: NextjsStaticAssetsOverrides;
8
+ /**
9
+ * Required if `NextjsType.REGIONAL_CONTAINERS`
10
+ */
11
+ readonly vpcId?: string;
12
+ }
13
+ /**
14
+ * Creates S3 Bucket for public and _next/static assets.
15
+ */
16
+ export declare class NextjsStaticAssets extends Construct {
17
+ bucket: Bucket;
18
+ private props;
19
+ constructor(scope: Construct, id: string, props: NextjsStaticAssetsProps);
20
+ private createBucket;
21
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsStaticAssets = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
8
+ const constructs_1 = require("constructs");
9
+ /**
10
+ * Creates S3 Bucket for public and _next/static assets.
11
+ */
12
+ class NextjsStaticAssets extends constructs_1.Construct {
13
+ constructor(scope, id, props) {
14
+ super(scope, id);
15
+ this.props = props;
16
+ this.bucket = this.createBucket();
17
+ }
18
+ createBucket() {
19
+ return new aws_s3_1.Bucket(this, "Bucket", {
20
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
21
+ autoDeleteObjects: true,
22
+ enforceSSL: true,
23
+ blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
24
+ encryption: aws_s3_1.BucketEncryption.S3_MANAGED,
25
+ ...this.props.overrides?.bucketProps,
26
+ });
27
+ }
28
+ }
29
+ exports.NextjsStaticAssets = NextjsStaticAssets;
30
+ _a = JSII_RTTI_SYMBOL_1;
31
+ NextjsStaticAssets[_a] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.0.0" };
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV4dGpzLXN0YXRpYy1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsK0NBSzRCO0FBQzVCLDJDQUF1QztBQWN2Qzs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFLL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNoQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztZQUM5QyxVQUFVLEVBQUUseUJBQWdCLENBQUMsVUFBVTtZQUN2QyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVc7U0FDckMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwQkgsZ0RBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQmxvY2tQdWJsaWNBY2Nlc3MsXG4gIEJ1Y2tldCxcbiAgQnVja2V0RW5jcnlwdGlvbixcbiAgQnVja2V0UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgYnVja2V0UHJvcHM/OiBCdWNrZXRQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyB7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1N0YXRpY0Fzc2V0c092ZXJyaWRlcztcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNgXG4gICAqL1xuICByZWFkb25seSB2cGNJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIFMzIEJ1Y2tldCBmb3IgcHVibGljIGFuZCBfbmV4dC9zdGF0aWMgYXNzZXRzLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzU3RhdGljQXNzZXRzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgYnVja2V0OiBCdWNrZXQ7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzU3RhdGljQXNzZXRzUHJvcHM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5idWNrZXQgPSB0aGlzLmNyZWF0ZUJ1Y2tldCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdWNrZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBCdWNrZXQodGhpcywgXCJCdWNrZXRcIiwge1xuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5idWNrZXRQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,42 @@
1
+ import { IVpc } from "aws-cdk-lib/aws-ec2";
2
+ import { Construct } from "constructs";
3
+ import { NextjsType } from "./common";
4
+ import { OptionalVpcProps } from "./generated-structs/OptionalVpcProps";
5
+ export interface NextjsVpcOverrides {
6
+ readonly vpcProps?: OptionalVpcProps;
7
+ }
8
+ export interface NextjsVpcProps {
9
+ readonly nextjsType: NextjsType;
10
+ /**
11
+ * Override any construct.
12
+ */
13
+ readonly overrides?: NextjsVpcOverrides;
14
+ /**
15
+ * Bring your own VPC.
16
+ */
17
+ readonly vpc?: IVpc;
18
+ }
19
+ export declare class NextjsVpc extends Construct {
20
+ vpc: IVpc;
21
+ private props;
22
+ constructor(scope: Construct, id: string, props: NextjsVpcProps);
23
+ /**
24
+ * cdk-nextjs requires a VPC because of the use of EFS. The Next.js containers
25
+ * or functions can be placed in "private with egress" subnets or "private isolated"
26
+ * subnets. "Private with egress" subnets allow for outbound traffic to the internet
27
+ * but require a NAT Gateway which costs $65/month for 2 AZs. "Private isolated"
28
+ * subnets do not require a NAT Gateway therefore they are used by default.
29
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#subnet-types
30
+ */
31
+ private createVpc;
32
+ /**
33
+ * Best practice is to use VPC endpoints between VPC and serverless resources
34
+ * so that traffic does not go over public internet.
35
+ *
36
+ * While gateway endpoints are free, interface endpoints (use PrivateLink)
37
+ * cost ~$7/month/az.
38
+ *
39
+ * @see https://www.alexdebrie.com/posts/aws-lambda-vpc/#set-up-a-vpc-endpoint-for-your-aws-service
40
+ */
41
+ private createVpcEndpoints;
42
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsVpc = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
7
+ const constructs_1 = require("constructs");
8
+ const common_1 = require("./common");
9
+ class NextjsVpc extends constructs_1.Construct {
10
+ constructor(scope, id, props) {
11
+ super(scope, id);
12
+ this.props = props;
13
+ if (props.vpc) {
14
+ this.vpc = props.vpc;
15
+ }
16
+ else {
17
+ this.vpc = props.vpc ?? this.createVpc();
18
+ this.createVpcEndpoints();
19
+ }
20
+ }
21
+ /**
22
+ * cdk-nextjs requires a VPC because of the use of EFS. The Next.js containers
23
+ * or functions can be placed in "private with egress" subnets or "private isolated"
24
+ * subnets. "Private with egress" subnets allow for outbound traffic to the internet
25
+ * but require a NAT Gateway which costs $65/month for 2 AZs. "Private isolated"
26
+ * subnets do not require a NAT Gateway therefore they are used by default.
27
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2-readme.html#subnet-types
28
+ */
29
+ createVpc() {
30
+ return new aws_ec2_1.Vpc(this, "Vpc", {
31
+ maxAzs: 2, // might want 3 in production
32
+ subnetConfiguration: [
33
+ { name: "Public", subnetType: aws_ec2_1.SubnetType.PUBLIC },
34
+ // PrivateWithEgress subnet uses NAT Gateway which costs $32/az/month
35
+ {
36
+ name: "PrivateWithEgress",
37
+ subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS,
38
+ },
39
+ { name: "PrivateIsolated", subnetType: aws_ec2_1.SubnetType.PRIVATE_ISOLATED },
40
+ ],
41
+ ...this.props.overrides?.vpcProps,
42
+ });
43
+ }
44
+ /**
45
+ * Best practice is to use VPC endpoints between VPC and serverless resources
46
+ * so that traffic does not go over public internet.
47
+ *
48
+ * While gateway endpoints are free, interface endpoints (use PrivateLink)
49
+ * cost ~$7/month/az.
50
+ *
51
+ * @see https://www.alexdebrie.com/posts/aws-lambda-vpc/#set-up-a-vpc-endpoint-for-your-aws-service
52
+ */
53
+ createVpcEndpoints() {
54
+ if (this.props.nextjsType === common_1.NextjsType.GLOBAL_FUNCTIONS) {
55
+ this.vpc.addInterfaceEndpoint("SqsInterfaceEndpoint", {
56
+ service: aws_ec2_1.InterfaceVpcEndpointAwsService.SQS,
57
+ });
58
+ }
59
+ }
60
+ }
61
+ exports.NextjsVpc = NextjsVpc;
62
+ _a = JSII_RTTI_SYMBOL_1;
63
+ NextjsVpc[_a] = { fqn: "cdk-nextjs.NextjsVpc", version: "0.0.0" };
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXZwYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtdnBjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBSzZCO0FBQzdCLDJDQUF1QztBQUN2QyxxQ0FBc0M7QUFtQnRDLE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBS3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssU0FBUztRQUNmLE9BQU8sSUFBSSxhQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUMxQixNQUFNLEVBQUUsQ0FBQyxFQUFFLDZCQUE2QjtZQUN4QyxtQkFBbUIsRUFBRTtnQkFDbkIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxvQkFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDakQscUVBQXFFO2dCQUNyRTtvQkFDRSxJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixVQUFVLEVBQUUsb0JBQVUsQ0FBQyxtQkFBbUI7aUJBQzNDO2dCQUNELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxvQkFBVSxDQUFDLGdCQUFnQixFQUFFO2FBQ3JFO1lBQ0QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxRQUFRO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLG1CQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixFQUFFO2dCQUNwRCxPQUFPLEVBQUUsd0NBQThCLENBQUMsR0FBRzthQUM1QyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzs7QUF2REgsOEJBd0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLFxuICBJVnBjLFxuICBTdWJuZXRUeXBlLFxuICBWcGMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxWcGNQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsVnBjUHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNWcGNPdmVycmlkZXMge1xuICByZWFkb25seSB2cGNQcm9wcz86IE9wdGlvbmFsVnBjUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzVnBjUHJvcHMge1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgYW55IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1ZwY092ZXJyaWRlcztcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNWcGMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICB2cGM6IElWcGM7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzVnBjUHJvcHM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc1ZwY1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgdGhpcy52cGMgPSBwcm9wcy52cGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnBjID0gcHJvcHMudnBjID8/IHRoaXMuY3JlYXRlVnBjKCk7XG4gICAgICB0aGlzLmNyZWF0ZVZwY0VuZHBvaW50cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjZGstbmV4dGpzIHJlcXVpcmVzIGEgVlBDIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiBFRlMuIFRoZSBOZXh0LmpzIGNvbnRhaW5lcnNcbiAgICogb3IgZnVuY3Rpb25zIGNhbiBiZSBwbGFjZWQgaW4gXCJwcml2YXRlIHdpdGggZWdyZXNzXCIgc3VibmV0cyBvciBcInByaXZhdGUgaXNvbGF0ZWRcIlxuICAgKiBzdWJuZXRzLiBcIlByaXZhdGUgd2l0aCBlZ3Jlc3NcIiBzdWJuZXRzIGFsbG93IGZvciBvdXRib3VuZCB0cmFmZmljIHRvIHRoZSBpbnRlcm5ldFxuICAgKiBidXQgcmVxdWlyZSBhIE5BVCBHYXRld2F5IHdoaWNoIGNvc3RzICQ2NS9tb250aCBmb3IgMiBBWnMuIFwiUHJpdmF0ZSBpc29sYXRlZFwiXG4gICAqIHN1Ym5ldHMgZG8gbm90IHJlcXVpcmUgYSBOQVQgR2F0ZXdheSB0aGVyZWZvcmUgdGhleSBhcmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YyL2RvY3MvYXdzLWNkay1saWIuYXdzX2VjMi1yZWFkbWUuaHRtbCNzdWJuZXQtdHlwZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVnBjKCkge1xuICAgIHJldHVybiBuZXcgVnBjKHRoaXMsIFwiVnBjXCIsIHtcbiAgICAgIG1heEF6czogMiwgLy8gbWlnaHQgd2FudCAzIGluIHByb2R1Y3Rpb25cbiAgICAgIHN1Ym5ldENvbmZpZ3VyYXRpb246IFtcbiAgICAgICAgeyBuYW1lOiBcIlB1YmxpY1wiLCBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQyB9LFxuICAgICAgICAvLyBQcml2YXRlV2l0aEVncmVzcyBzdWJuZXQgdXNlcyBOQVQgR2F0ZXdheSB3aGljaCBjb3N0cyAkMzIvYXovbW9udGhcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiUHJpdmF0ZVdpdGhFZ3Jlc3NcIixcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MsXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogXCJQcml2YXRlSXNvbGF0ZWRcIiwgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVEIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnZwY1Byb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlc3QgcHJhY3RpY2UgaXMgdG8gdXNlIFZQQyBlbmRwb2ludHMgYmV0d2VlbiBWUEMgYW5kIHNlcnZlcmxlc3MgcmVzb3VyY2VzXG4gICAqIHNvIHRoYXQgdHJhZmZpYyBkb2VzIG5vdCBnbyBvdmVyIHB1YmxpYyBpbnRlcm5ldC5cbiAgICpcbiAgICogV2hpbGUgZ2F0ZXdheSBlbmRwb2ludHMgYXJlIGZyZWUsIGludGVyZmFjZSBlbmRwb2ludHMgKHVzZSBQcml2YXRlTGluaylcbiAgICogY29zdCB+JDcvbW9udGgvYXouXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuYWxleGRlYnJpZS5jb20vcG9zdHMvYXdzLWxhbWJkYS12cGMvI3NldC11cC1hLXZwYy1lbmRwb2ludC1mb3IteW91ci1hd3Mtc2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVWcGNFbmRwb2ludHMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzLnZwYy5hZGRJbnRlcmZhY2VFbmRwb2ludChcIlNxc0ludGVyZmFjZUVuZHBvaW50XCIsIHtcbiAgICAgICAgc2VydmljZTogSW50ZXJmYWNlVnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlNRUyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,26 @@
1
+ import { OptionalNextjsAssetsDeploymentProps } from "../generated-structs/OptionalNextjsAssetsDeploymentProps";
2
+ import { OptionalNextjsBuildProps } from "../generated-structs/OptionalNextjsBuildProps";
3
+ import { OptionalNextjsFileSystemProps } from "../generated-structs/OptionalNextjsFileSystemProps";
4
+ import { OptionalNextjsVpcProps } from "../generated-structs/OptionalNextjsVpcProps";
5
+ import { NextjsAssetDeploymentOverrides } from "../nextjs-assets-deployment";
6
+ import { NextjsBuildOverrides } from "../nextjs-build/nextjs-build";
7
+ import { NextjsFileSystemOverrides } from "../nextjs-file-system";
8
+ import { NextjsVpcOverrides } from "../nextjs-vpc";
9
+ /**
10
+ * Base overrides for the props passed to constructs within root/top-level Next.js constructs
11
+ */
12
+ export interface BaseNextjsConstructOverrides {
13
+ readonly nextjsBuildProps?: OptionalNextjsBuildProps;
14
+ readonly nextjsVpcProps?: OptionalNextjsVpcProps;
15
+ readonly nextjsFileSystemProps?: OptionalNextjsFileSystemProps;
16
+ readonly nextjsAssetsDeploymentProps?: OptionalNextjsAssetsDeploymentProps;
17
+ }
18
+ /**
19
+ * Base overrides for constructs shared between all root/top-level Next.js constructs.
20
+ */
21
+ export interface BaseNextjsOverrides {
22
+ readonly nextjsBuild?: NextjsBuildOverrides;
23
+ readonly nextjsFileSystem?: NextjsFileSystemOverrides;
24
+ readonly nextjsVpc?: NextjsVpcOverrides;
25
+ readonly nextjsAssetsDeployment?: NextjsAssetDeploymentOverrides;
26
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2Utb3ZlcnJpZGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1vdmVycmlkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0J1aWxkUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0ZpbGVTeXN0ZW1Qcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0ZpbGVTeXN0ZW1Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNWcGNQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc1ZwY1Byb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNBc3NldERlcGxveW1lbnRPdmVycmlkZXMgfSBmcm9tIFwiLi4vbmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBOZXh0anNCdWlsZE92ZXJyaWRlcyB9IGZyb20gXCIuLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNGaWxlU3lzdGVtT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy1maWxlLXN5c3RlbVwiO1xuaW1wb3J0IHsgTmV4dGpzVnBjT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy12cGNcIjtcblxuLyoqXG4gKiBCYXNlIG92ZXJyaWRlcyBmb3IgdGhlIHByb3BzIHBhc3NlZCB0byBjb25zdHJ1Y3RzIHdpdGhpbiByb290L3RvcC1sZXZlbCBOZXh0LmpzIGNvbnN0cnVjdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQnVpbGRQcm9wcz86IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzVnBjUHJvcHM/OiBPcHRpb25hbE5leHRqc1ZwY1Byb3BzO1xuICByZWFkb25seSBuZXh0anNGaWxlU3lzdGVtUHJvcHM/OiBPcHRpb25hbE5leHRqc0ZpbGVTeXN0ZW1Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzPzogT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHM7XG59XG5cbi8qKlxuICogQmFzZSBvdmVycmlkZXMgZm9yIGNvbnN0cnVjdHMgc2hhcmVkIGJldHdlZW4gYWxsIHJvb3QvdG9wLWxldmVsIE5leHQuanMgY29uc3RydWN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlTmV4dGpzT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQnVpbGQ/OiBOZXh0anNCdWlsZE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzRmlsZVN5c3RlbT86IE5leHRqc0ZpbGVTeXN0ZW1PdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1ZwYz86IE5leHRqc1ZwY092ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQXNzZXRzRGVwbG95bWVudD86IE5leHRqc0Fzc2V0RGVwbG95bWVudE92ZXJyaWRlcztcbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ export interface NextjsBaseProps {
2
+ /**
3
+ * Command to generate optimized version of your Next.js app in container;
4
+ * @default "npm run build"
5
+ */
6
+ readonly buildCommand?: string;
7
+ /**
8
+ * [Build context](https://docs.docker.com/build/building/context/) for
9
+ * `docker build`. This directory should contain your lockfile (i.e.
10
+ * pnpm-lock.yaml) for your Next.js app. If you're not in a monorepo, then
11
+ * this will be the same directory as your Next.js app. If you are in a
12
+ * monorepo, then this value should be the root of your monorepo. You then
13
+ * must pass the relative path to your Next.js app via {@link NextjsBaseProps.relativePathToWorkspace}
14
+ * @example fileURLToPath(new URL("../ui", import.meta.url))
15
+ * @example fileURLToPath(new URL("../..", import.meta.url)) (monorepo)
16
+ */
17
+ readonly buildContext: string;
18
+ /**
19
+ * Path to API Route Handler that returns HTTP 200 to ensure compute health.
20
+ * @example "/api/health"
21
+ * @example
22
+ * // api/health/route.ts
23
+ * import { NextResponse } from "next/server";
24
+ *
25
+ * export function GET() {
26
+ * return NextResponse.json("");
27
+ * }
28
+ */
29
+ readonly healthCheckPath: string;
30
+ /**
31
+ * Use this if building in monorepo. This is the relative path from
32
+ * {@link NextjsBaseProps.buildContext} or root workspace to nested workspace
33
+ * containing Next.js app. See example below:
34
+ *
35
+ * Let's say you have a monorepo with the following folder structure:
36
+ * - my-monorepo/
37
+ * - packages/
38
+ * - ui/
39
+ * - package.json (nested)
40
+ * - package.json (root)
41
+ *
42
+ * And your Next.js app directory is the ui folder. Then you would set {@link NextjsBaseProps.buildContext}
43
+ * to `"/absolute/path/to/my-monorepo"` and {@link NextjsBaseProps.relativePathToWorkspace}
44
+ * to `"./packages/ui"`.
45
+ *
46
+ * Note, setting {@link NextjsBaseProps.buildContext} to the root of your
47
+ * monorepo will invalidate container runtime (i.e. docker) build cache when any file is
48
+ * changed in your monorepo. This is slows down deployments. Checkout how you
49
+ * can use [turbo](https://turbo.build/) in [Deploying with Docker Guide](https://turbo.build/repo/docs/handbook/deploying-with-docker)
50
+ * to achieve better build caching. It's as easy as running
51
+ * `turbo prune my-app --docker` - no config file required.
52
+ *
53
+ * @example "./packages/ui"
54
+ */
55
+ readonly relativePathToWorkspace?: string;
56
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtcHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBDb21tYW5kIHRvIGdlbmVyYXRlIG9wdGltaXplZCB2ZXJzaW9uIG9mIHlvdXIgTmV4dC5qcyBhcHAgaW4gY29udGFpbmVyO1xuICAgKiBAZGVmYXVsdCBcIm5wbSBydW4gYnVpbGRcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kPzogc3RyaW5nO1xuICAvKipcbiAgICogW0J1aWxkIGNvbnRleHRdKGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2J1aWxkL2J1aWxkaW5nL2NvbnRleHQvKSBmb3JcbiAgICogYGRvY2tlciBidWlsZGAuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHlvdXIgbG9ja2ZpbGUgKGkuZS5cbiAgICogcG5wbS1sb2NrLnlhbWwpIGZvciB5b3VyIE5leHQuanMgYXBwLiBJZiB5b3UncmUgbm90IGluIGEgbW9ub3JlcG8sIHRoZW5cbiAgICogdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIE5leHQuanMgYXBwLiBJZiB5b3UgYXJlIGluIGFcbiAgICogbW9ub3JlcG8sIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlIHJvb3Qgb2YgeW91ciBtb25vcmVwby4gWW91IHRoZW5cbiAgICogbXVzdCBwYXNzIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHlvdXIgTmV4dC5qcyBhcHAgdmlhIHtAbGluayBOZXh0anNCYXNlUHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2V9XG4gICAqICBAZXhhbXBsZSBmaWxlVVJMVG9QYXRoKG5ldyBVUkwoXCIuLi91aVwiLCBpbXBvcnQubWV0YS51cmwpKVxuICAgKiAgQGV4YW1wbGUgZmlsZVVSTFRvUGF0aChuZXcgVVJMKFwiLi4vLi5cIiwgaW1wb3J0Lm1ldGEudXJsKSkgKG1vbm9yZXBvKVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb250ZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIEFQSSBSb3V0ZSBIYW5kbGVyIHRoYXQgcmV0dXJucyBIVFRQIDIwMCB0byBlbnN1cmUgY29tcHV0ZSBoZWFsdGguXG4gICAqIEBleGFtcGxlIFwiL2FwaS9oZWFsdGhcIlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBhcGkvaGVhbHRoL3JvdXRlLnRzXG4gICAqIGltcG9ydCB7IE5leHRSZXNwb25zZSB9IGZyb20gXCJuZXh0L3NlcnZlclwiO1xuICAgKlxuICAgKiBleHBvcnQgZnVuY3Rpb24gR0VUKCkge1xuICAgKiAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbihcIlwiKTtcbiAgICogfVxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoQ2hlY2tQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBpZiBidWlsZGluZyBpbiBtb25vcmVwby4gVGhpcyBpcyB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tXG4gICAqIHtAbGluayBOZXh0anNCYXNlUHJvcHMuYnVpbGRDb250ZXh0fSBvciByb290IHdvcmtzcGFjZSB0byBuZXN0ZWQgd29ya3NwYWNlXG4gICAqIGNvbnRhaW5pbmcgTmV4dC5qcyBhcHAuIFNlZSBleGFtcGxlIGJlbG93OlxuICAgKlxuICAgKiBMZXQncyBzYXkgeW91IGhhdmUgYSBtb25vcmVwbyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9sZGVyIHN0cnVjdHVyZTpcbiAgICogLSBteS1tb25vcmVwby9cbiAgICogICAtIHBhY2thZ2VzL1xuICAgKiAgICAgLSB1aS9cbiAgICogICAgICAgLSBwYWNrYWdlLmpzb24gKG5lc3RlZClcbiAgICogICAtIHBhY2thZ2UuanNvbiAocm9vdClcbiAgICpcbiAgICogQW5kIHlvdXIgTmV4dC5qcyBhcHAgZGlyZWN0b3J5IGlzIHRoZSB1aSBmb2xkZXIuIFRoZW4geW91IHdvdWxkIHNldCB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLmJ1aWxkQ29udGV4dH1cbiAgICogdG8gYFwiL2Fic29sdXRlL3BhdGgvdG8vbXktbW9ub3JlcG9cImAgYW5kIHtAbGluayBOZXh0anNCYXNlUHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2V9XG4gICAqIHRvIGBcIi4vcGFja2FnZXMvdWlcImAuXG4gICAqXG4gICAqIE5vdGUsIHNldHRpbmcge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5idWlsZENvbnRleHR9IHRvIHRoZSByb290IG9mIHlvdXJcbiAgICogbW9ub3JlcG8gd2lsbCBpbnZhbGlkYXRlIGNvbnRhaW5lciBydW50aW1lIChpLmUuIGRvY2tlcikgYnVpbGQgY2FjaGUgd2hlbiBhbnkgZmlsZSBpc1xuICAgKiBjaGFuZ2VkIGluIHlvdXIgbW9ub3JlcG8uIFRoaXMgaXMgc2xvd3MgZG93biBkZXBsb3ltZW50cy4gQ2hlY2tvdXQgaG93IHlvdVxuICAgKiBjYW4gdXNlIFt0dXJib10oaHR0cHM6Ly90dXJiby5idWlsZC8pIGluIFtEZXBsb3lpbmcgd2l0aCBEb2NrZXIgR3VpZGVdKGh0dHBzOi8vdHVyYm8uYnVpbGQvcmVwby9kb2NzL2hhbmRib29rL2RlcGxveWluZy13aXRoLWRvY2tlcilcbiAgICogdG8gYWNoaWV2ZSBiZXR0ZXIgYnVpbGQgY2FjaGluZy4gSXQncyBhcyBlYXN5IGFzIHJ1bm5pbmdcbiAgICogYHR1cmJvIHBydW5lIG15LWFwcCAtLWRvY2tlcmAgLSBubyBjb25maWcgZmlsZSByZXF1aXJlZC5cbiAgICpcbiAgICogQGV4YW1wbGUgXCIuL3BhY2thZ2VzL3VpXCJcbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aFRvV29ya3NwYWNlPzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,74 @@
1
+ import { Distribution } from "aws-cdk-lib/aws-cloudfront";
2
+ import { Construct } from "constructs";
3
+ import { BaseNextjsConstructOverrides, BaseNextjsOverrides } from "./nextjs-base-overrides";
4
+ import { NextjsBaseProps } from "./nextjs-base-props";
5
+ import { OptionalNextjsContainersProps } from "../generated-structs/OptionalNextjsContainersProps";
6
+ import { OptionalNextjsDistributionProps } from "../generated-structs/OptionalNextjsDistributionProps";
7
+ import { OptionalNextjsInvalidationProps } from "../generated-structs/OptionalNextjsInvalidationProps";
8
+ import { NextjsAssetsDeployment } from "../nextjs-assets-deployment";
9
+ import { NextjsBuild } from "../nextjs-build/nextjs-build";
10
+ import { NextjsContainers, NextjsContainersOverrides } from "../nextjs-compute/nextjs-containers";
11
+ import { NextjsDistribution, NextjsDistributionOverrides } from "../nextjs-distribution";
12
+ import { NextjsFileSystem } from "../nextjs-file-system";
13
+ import { NextjsInvalidation, NextjsInvalidationOverrides } from "../nextjs-invalidation";
14
+ import { NextjsRevalidationProps } from "../nextjs-revalidation";
15
+ import { NextjsStaticAssets, NextjsStaticAssetsOverrides, NextjsStaticAssetsProps } from "../nextjs-static-assets";
16
+ import { NextjsVpc } from "../nextjs-vpc";
17
+ export interface NextjsGlobalContainersConstructOverrides extends BaseNextjsConstructOverrides {
18
+ readonly nextjsContainersProps?: OptionalNextjsContainersProps;
19
+ readonly nextjsDistributionProps?: OptionalNextjsDistributionProps;
20
+ readonly nextjsRevalidationProps?: NextjsRevalidationProps;
21
+ readonly nextjsStaticAssetsProps?: NextjsStaticAssetsProps;
22
+ readonly nextjsInvalidationProps?: OptionalNextjsInvalidationProps;
23
+ }
24
+ export interface NextjsGlobalContainersOverrides extends BaseNextjsOverrides {
25
+ readonly nextjsGlobalContainers?: NextjsGlobalContainersConstructOverrides;
26
+ readonly nextjsContainers?: NextjsContainersOverrides;
27
+ readonly nextjsDistribution?: NextjsDistributionOverrides;
28
+ readonly nextjsInvalidation?: NextjsInvalidationOverrides;
29
+ readonly nextjsStaticAssets?: NextjsStaticAssetsOverrides;
30
+ }
31
+ export interface NextjsGlobalContainersProps extends NextjsBaseProps {
32
+ /**
33
+ * Prefix to the URI path the app will be served at. Especially useful when
34
+ * passing in your own `distribution`.
35
+ * @example "/my-base-path"
36
+ */
37
+ readonly basePath?: string;
38
+ /**
39
+ * Bring your own distribution. Can be used with `basePath` to host multiple
40
+ * apps on the same CloudFront distribution.
41
+ */
42
+ readonly distribution?: Distribution;
43
+ /**
44
+ * Override props of any construct.
45
+ */
46
+ readonly overrides?: NextjsGlobalContainersOverrides;
47
+ }
48
+ /**
49
+ * Deploy Next.js globally distributed with containers. Uses [CloudFront
50
+ * Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
51
+ * as Content Delivery Network (CDN) for global distribution and [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html)
52
+ * for containers.
53
+ */
54
+ export declare class NextjsGlobalContainers extends Construct {
55
+ nextjsBuild: NextjsBuild;
56
+ nextjsStaticAssets: NextjsStaticAssets;
57
+ nextjsVpc: NextjsVpc;
58
+ nextjsFileSystem: NextjsFileSystem;
59
+ nextjsAssetsDeployment: NextjsAssetsDeployment;
60
+ nextjsContainers: NextjsContainers;
61
+ nextjsDistribution: NextjsDistribution;
62
+ nextjsInvalidation: NextjsInvalidation;
63
+ private nextjsType;
64
+ private props;
65
+ constructor(scope: Construct, id: string, props: NextjsGlobalContainersProps);
66
+ private createNextjsBuild;
67
+ private createNextjsStaticAssets;
68
+ private createVpc;
69
+ private createNextjsFileSystem;
70
+ private createNextjsAssetsDeployment;
71
+ private createNextjsContainers;
72
+ private createNextjsDistribution;
73
+ private createNextjsInvalidation;
74
+ }