cdk-nextjs 0.1.0 → 0.1.1
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.
- package/.jsii +13834 -0
- package/.prettierrc +0 -0
- package/API.md +9655 -0
- package/LICENSE +202 -0
- package/README.md +164 -2
- package/THIRD-PARTY-LICENSES.md +31 -0
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +18 -0
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +8833 -0
- package/assets/lambdas/revalidate/revalidate.lambda/index.js +67 -0
- package/assets/lambdas/sign-fn-url/sign-fn-url.edge-lambda/index.js +2024 -0
- package/docs/breaking-changes.md +8 -0
- package/docs/cdk-nextjs-NextjsGlobalContainers.png +0 -0
- package/docs/cdk-nextjs-NextjsGlobalFunctions.png +0 -0
- package/docs/cdk-nextjs-NextjsRegionalContainers.png +0 -0
- package/docs/cdk-nextjs.drawio +163 -0
- package/docs/notes.md +26 -0
- package/examples/README.md +15 -0
- package/lib/common.d.ts +23 -0
- package/lib/common.js +28 -0
- package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.d.ts +106 -0
- package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.js +3 -0
- package/lib/generated-structs/OptionalCloudFrontFunctionProps.d.ts +43 -0
- package/lib/generated-structs/OptionalCloudFrontFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalClusterProps.d.ts +62 -0
- package/lib/generated-structs/OptionalClusterProps.js +3 -0
- package/lib/generated-structs/OptionalDistributionProps.d.ts +155 -0
- package/lib/generated-structs/OptionalDistributionProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +124 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +399 -0
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalEdgeFunctionProps.d.ts +428 -0
- package/lib/generated-structs/OptionalEdgeFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalFunctionProps.d.ts +422 -0
- package/lib/generated-structs/OptionalFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalFunctionUrlProps.d.ts +30 -0
- package/lib/generated-structs/OptionalFunctionUrlProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +40 -0
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +26 -0
- package/lib/generated-structs/OptionalNextjsBuildProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +39 -0
- package/lib/generated-structs/OptionalNextjsContainersProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +45 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsFileSystemProps.d.ts +10 -0
- package/lib/generated-structs/OptionalNextjsFileSystemProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +11 -0
- package/lib/generated-structs/OptionalNextjsInvalidationProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsVpcProps.d.ts +16 -0
- package/lib/generated-structs/OptionalNextjsVpcProps.js +3 -0
- package/lib/generated-structs/OptionalS3OriginBucketWithOACProps.d.ts +70 -0
- package/lib/generated-structs/OptionalS3OriginBucketWithOACProps.js +3 -0
- package/lib/generated-structs/OptionalVpcProps.d.ts +224 -0
- package/lib/generated-structs/OptionalVpcProps.js +3 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.js +32 -0
- package/lib/lambdas/assets-deployment/assets-deployment-function.d.ts +13 -0
- package/lib/lambdas/assets-deployment/assets-deployment-function.js +22 -0
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.d.ts +2 -0
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +63 -0
- package/lib/lambdas/assets-deployment/common.d.ts +8 -0
- package/lib/lambdas/assets-deployment/common.js +32 -0
- package/lib/lambdas/assets-deployment/fs-to-fs.d.ts +2 -0
- package/lib/lambdas/assets-deployment/fs-to-fs.js +9 -0
- package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +2 -0
- package/lib/lambdas/assets-deployment/fs-to-s3.js +45 -0
- package/lib/lambdas/assets-deployment/prune-s3.d.ts +15 -0
- package/lib/lambdas/assets-deployment/prune-s3.js +42 -0
- package/lib/lambdas/assets-deployment/s3.d.ts +2 -0
- package/lib/lambdas/assets-deployment/s3.js +7 -0
- package/lib/lambdas/assets-deployment/utils.d.ts +18 -0
- package/lib/lambdas/assets-deployment/utils.js +35 -0
- package/lib/lambdas/revalidate/revalidate-function.d.ts +13 -0
- package/lib/lambdas/revalidate/revalidate-function.js +22 -0
- package/lib/lambdas/revalidate/revalidate.lambda.d.ts +2 -0
- package/lib/lambdas/revalidate/revalidate.lambda.js +53 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +13 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +23 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url.edge-lambda.d.ts +9 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url.edge-lambda.js +35 -0
- package/lib/lambdas/sign-fn-url/sign-request.d.ts +28 -0
- package/lib/lambdas/sign-fn-url/sign-request.js +119 -0
- package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +1 -0
- package/lib/lambdas/sign-fn-url/sign-request.test.js +129 -0
- package/lib/nextjs-assets-deployment.d.ts +116 -0
- package/lib/nextjs-assets-deployment.js +93 -0
- package/lib/nextjs-build/add-cache-handler.d.ts +1 -0
- package/lib/nextjs-build/add-cache-handler.js +23 -0
- package/lib/nextjs-build/add-cache-handler.mjs +18 -0
- package/lib/nextjs-build/builder.Dockerfile +25 -0
- package/lib/nextjs-build/cache-handler.cjs +21080 -0
- package/lib/nextjs-build/cache-handler.d.ts +6 -0
- package/lib/nextjs-build/cache-handler.js +22 -0
- package/lib/nextjs-build/global-containers.Dockerfile +45 -0
- package/lib/nextjs-build/global-functions.Dockerfile +46 -0
- package/lib/nextjs-build/nextjs-build.d.ts +150 -0
- package/lib/nextjs-build/nextjs-build.js +220 -0
- package/lib/nextjs-build/regional-containers.Dockerfile +45 -0
- package/lib/nextjs-build/symlink-full-route-cache.d.ts +1 -0
- package/lib/nextjs-build/symlink-full-route-cache.js +37 -0
- package/lib/nextjs-build/symlink-full-route-cache.mjs +23 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +8 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.js +3 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +43 -0
- package/lib/nextjs-compute/nextjs-containers.js +149 -0
- package/lib/nextjs-compute/nextjs-functions.d.ts +23 -0
- package/lib/nextjs-compute/nextjs-functions.js +57 -0
- package/lib/nextjs-distribution.d.ts +107 -0
- package/lib/nextjs-distribution.js +331 -0
- package/lib/nextjs-file-system.d.ts +42 -0
- package/lib/nextjs-file-system.js +74 -0
- package/lib/nextjs-invalidation.d.ts +19 -0
- package/lib/nextjs-invalidation.js +52 -0
- package/lib/nextjs-revalidation.d.ts +30 -0
- package/lib/nextjs-revalidation.js +65 -0
- package/lib/nextjs-static-assets.d.ts +21 -0
- package/lib/nextjs-static-assets.js +33 -0
- package/lib/nextjs-vpc.d.ts +42 -0
- package/lib/nextjs-vpc.js +64 -0
- package/lib/root-constructs/nextjs-base-overrides.d.ts +26 -0
- package/lib/root-constructs/nextjs-base-overrides.js +3 -0
- package/lib/root-constructs/nextjs-base-props.d.ts +56 -0
- package/lib/root-constructs/nextjs-base-props.js +3 -0
- package/lib/root-constructs/nextjs-global-containers.d.ts +74 -0
- package/lib/root-constructs/nextjs-global-containers.js +125 -0
- package/lib/root-constructs/nextjs-global-functions.d.ts +76 -0
- package/lib/root-constructs/nextjs-global-functions.js +131 -0
- package/lib/root-constructs/nextjs-regional-containers.d.ts +43 -0
- package/lib/root-constructs/nextjs-regional-containers.js +92 -0
- package/package.json +163 -2
- package/dist/index.js +0 -1
|
@@ -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.1.1" };
|
|
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,33 @@
|
|
|
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
|
+
minimumTLSVersion: 1.2,
|
|
26
|
+
...this.props.overrides?.bucketProps,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.NextjsStaticAssets = NextjsStaticAssets;
|
|
31
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
32
|
+
NextjsStaticAssets[_a] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.1.1" };
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV4dGpzLXN0YXRpYy1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsK0NBSzRCO0FBQzVCLDJDQUF1QztBQWN2Qzs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFLL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtZQUNoQyxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsVUFBVSxFQUFFLElBQUk7WUFDaEIsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztZQUM5QyxVQUFVLEVBQUUseUJBQWdCLENBQUMsVUFBVTtZQUN2QyxpQkFBaUIsRUFBRSxHQUFHO1lBQ3RCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVztTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXJCSCxnREFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBCbG9ja1B1YmxpY0FjY2VzcyxcbiAgQnVja2V0LFxuICBCdWNrZXRFbmNyeXB0aW9uLFxuICBCdWNrZXRQcm9wcyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNTdGF0aWNBc3NldHNPdmVycmlkZXMge1xuICByZWFkb25seSBidWNrZXRQcm9wcz86IEJ1Y2tldFByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzIHtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzO1xuICAvKipcbiAgICogUmVxdWlyZWQgaWYgYE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSU2BcbiAgICovXG4gIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgUzMgQnVja2V0IGZvciBwdWJsaWMgYW5kIF9uZXh0L3N0YXRpYyBhc3NldHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNTdGF0aWNBc3NldHMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBidWNrZXQ6IEJ1Y2tldDtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNTdGF0aWNBc3NldHNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzU3RhdGljQXNzZXRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmJ1Y2tldCA9IHRoaXMuY3JlYXRlQnVja2V0KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJ1Y2tldCgpIHtcbiAgICByZXR1cm4gbmV3IEJ1Y2tldCh0aGlzLCBcIkJ1Y2tldFwiLCB7XG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgbWluaW11bVRMU1ZlcnNpb246IDEuMixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5idWNrZXRQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -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.1.1" };
|
|
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
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NextjsGlobalContainers = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const constructs_1 = require("constructs");
|
|
7
|
+
const common_1 = require("../common");
|
|
8
|
+
const nextjs_assets_deployment_1 = require("../nextjs-assets-deployment");
|
|
9
|
+
const nextjs_build_1 = require("../nextjs-build/nextjs-build");
|
|
10
|
+
const nextjs_containers_1 = require("../nextjs-compute/nextjs-containers");
|
|
11
|
+
const nextjs_distribution_1 = require("../nextjs-distribution");
|
|
12
|
+
const nextjs_file_system_1 = require("../nextjs-file-system");
|
|
13
|
+
const nextjs_invalidation_1 = require("../nextjs-invalidation");
|
|
14
|
+
const nextjs_static_assets_1 = require("../nextjs-static-assets");
|
|
15
|
+
const nextjs_vpc_1 = require("../nextjs-vpc");
|
|
16
|
+
/**
|
|
17
|
+
* Deploy Next.js globally distributed with containers. Uses [CloudFront
|
|
18
|
+
* Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
|
|
19
|
+
* as Content Delivery Network (CDN) for global distribution and [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html)
|
|
20
|
+
* for containers.
|
|
21
|
+
*/
|
|
22
|
+
class NextjsGlobalContainers extends constructs_1.Construct {
|
|
23
|
+
constructor(scope, id, props) {
|
|
24
|
+
super(scope, id);
|
|
25
|
+
this.nextjsType = common_1.NextjsType.GLOBAL_CONTAINERS;
|
|
26
|
+
this.props = props;
|
|
27
|
+
this.nextjsBuild = this.createNextjsBuild();
|
|
28
|
+
this.nextjsStaticAssets = this.createNextjsStaticAssets();
|
|
29
|
+
this.nextjsVpc = this.createVpc();
|
|
30
|
+
this.nextjsFileSystem = this.createNextjsFileSystem();
|
|
31
|
+
this.nextjsAssetsDeployment = this.createNextjsAssetsDeployment();
|
|
32
|
+
this.nextjsContainers = this.createNextjsContainers();
|
|
33
|
+
this.nextjsFileSystem.allowCompute({
|
|
34
|
+
connections: this.nextjsContainers.albFargateService.service.connections,
|
|
35
|
+
role: this.nextjsContainers.albFargateService.taskDefinition.taskRole,
|
|
36
|
+
});
|
|
37
|
+
this.nextjsDistribution = this.createNextjsDistribution();
|
|
38
|
+
this.nextjsInvalidation = this.createNextjsInvalidation();
|
|
39
|
+
}
|
|
40
|
+
createNextjsBuild() {
|
|
41
|
+
return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
|
|
42
|
+
buildCommand: this.props.buildCommand,
|
|
43
|
+
buildContext: this.props.buildContext,
|
|
44
|
+
nextjsType: this.nextjsType,
|
|
45
|
+
relativePathToWorkspace: this.props.relativePathToWorkspace,
|
|
46
|
+
overrides: this.props.overrides?.nextjsBuild,
|
|
47
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsBuildProps,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
createNextjsStaticAssets() {
|
|
51
|
+
return new nextjs_static_assets_1.NextjsStaticAssets(this, "NextjsStaticAssets", {
|
|
52
|
+
overrides: this.props.overrides?.nextjsStaticAssets,
|
|
53
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsStaticAssetsProps,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
createVpc() {
|
|
57
|
+
return new nextjs_vpc_1.NextjsVpc(this, "NextjsVpc", {
|
|
58
|
+
nextjsType: this.nextjsType,
|
|
59
|
+
overrides: this.props.overrides?.nextjsVpc,
|
|
60
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsVpcProps,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
createNextjsFileSystem() {
|
|
64
|
+
return new nextjs_file_system_1.NextjsFileSystem(this, "NextjsFileSystem", {
|
|
65
|
+
vpc: this.nextjsVpc.vpc,
|
|
66
|
+
overrides: this.props.overrides?.nextjsFileSystem,
|
|
67
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsFileSystemProps,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
createNextjsAssetsDeployment() {
|
|
71
|
+
return new nextjs_assets_deployment_1.NextjsAssetsDeployment(this, "NextjsAssetsDeployment", {
|
|
72
|
+
accessPoint: this.nextjsFileSystem.accessPoint,
|
|
73
|
+
buildImageDigest: this.nextjsBuild.buildImageDigest,
|
|
74
|
+
dockerImageCode: this.nextjsBuild.imageForNextjsAssetsDeployment,
|
|
75
|
+
containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
|
|
76
|
+
overrides: this.props.overrides?.nextjsAssetsDeployment,
|
|
77
|
+
relativePathToWorkspace: this.props.relativePathToWorkspace,
|
|
78
|
+
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
79
|
+
vpc: this.nextjsVpc.vpc,
|
|
80
|
+
...this.props.overrides?.nextjsGlobalContainers
|
|
81
|
+
?.nextjsAssetsDeploymentProps,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
createNextjsContainers() {
|
|
85
|
+
if (!this.nextjsBuild.imageForNextjsContainers) {
|
|
86
|
+
throw new Error("nextjsBuild.dockerImageAsset is undefined");
|
|
87
|
+
}
|
|
88
|
+
return new nextjs_containers_1.NextjsContainers(this, "NextjsContainers", {
|
|
89
|
+
accessPoint: this.nextjsFileSystem.accessPoint,
|
|
90
|
+
containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
|
|
91
|
+
dockerImageAsset: this.nextjsBuild.imageForNextjsContainers,
|
|
92
|
+
fileSystem: this.nextjsFileSystem.fileSystem,
|
|
93
|
+
healthCheckPath: this.props.healthCheckPath,
|
|
94
|
+
nextjsType: this.nextjsType,
|
|
95
|
+
relativeEntrypointPath: this.nextjsBuild.relativePathToEntrypoint,
|
|
96
|
+
overrides: this.props.overrides?.nextjsContainers,
|
|
97
|
+
vpc: this.nextjsVpc.vpc,
|
|
98
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsContainersProps,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
createNextjsDistribution() {
|
|
102
|
+
return new nextjs_distribution_1.NextjsDistribution(this, "NextjsDistribution", {
|
|
103
|
+
assetsBucket: this.nextjsStaticAssets.bucket,
|
|
104
|
+
basePath: this.props.basePath,
|
|
105
|
+
certificate: this.nextjsContainers.albFargateService.certificate,
|
|
106
|
+
distribution: this.props.distribution,
|
|
107
|
+
dynamicUrl: this.nextjsContainers.url,
|
|
108
|
+
nextjsType: this.nextjsType,
|
|
109
|
+
overrides: this.props.overrides?.nextjsDistribution,
|
|
110
|
+
publicDirEntries: this.nextjsBuild.publicDirEntries,
|
|
111
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsDistributionProps,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
createNextjsInvalidation() {
|
|
115
|
+
return new nextjs_invalidation_1.NextjsInvalidation(this, "NextjsInvalidation", {
|
|
116
|
+
distribution: this.nextjsDistribution.distribution,
|
|
117
|
+
overrides: this.props.overrides?.nextjsInvalidation,
|
|
118
|
+
...this.props.overrides?.nextjsGlobalContainers?.nextjsInvalidationProps,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.NextjsGlobalContainers = NextjsGlobalContainers;
|
|
123
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
124
|
+
NextjsGlobalContainers[_a] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.1.1" };
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1jb250YWluZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtZ2xvYmFsLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwyQ0FBdUM7QUFNdkMsc0NBQXVDO0FBSXZDLDBFQUFxRTtBQUNyRSwrREFBMkQ7QUFDM0QsMkVBRzZDO0FBQzdDLGdFQUdnQztBQUNoQyw4REFBeUQ7QUFDekQsZ0VBR2dDO0FBRWhDLGtFQUlpQztBQUNqQyw4Q0FBMEM7QUFxQzFDOzs7OztHQUtHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQWFuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUlgsZUFBVSxHQUFHLG1CQUFVLENBQUMsaUJBQWlCLENBQUM7UUFTaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztZQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFD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QUMsVUFBVTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO1lBQ25ELGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO1lBQ25ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0I7UUFDOUIsT0FBTyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUN4RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVk7WUFDbEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGtCQUFrQjtZQUNuRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QjtTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxISCx3REFtSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBCYXNlTmV4dGpzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1vdmVycmlkZXNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuL25leHRqcy1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNJbnZhbGlkYXRpb25Qcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNBc3NldHNEZXBsb3ltZW50IH0gZnJvbSBcIi4uL25leHRqcy1hc3NldHMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQ29udGFpbmVycyxcbiAgTmV4dGpzQ29udGFpbmVyc092ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1jb250YWluZXJzXCI7XG5pbXBvcnQge1xuICBOZXh0anNEaXN0cmlidXRpb24sXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1kaXN0cmlidXRpb25cIjtcbmltcG9ydCB7IE5leHRqc0ZpbGVTeXN0ZW0gfSBmcm9tIFwiLi4vbmV4dGpzLWZpbGUtc3lzdGVtXCI7XG5pbXBvcnQge1xuICBOZXh0anNJbnZhbGlkYXRpb24sXG4gIE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1pbnZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE5leHRqc1JldmFsaWRhdGlvblByb3BzIH0gZnJvbSBcIi4uL25leHRqcy1yZXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQgeyBOZXh0anNWcGMgfSBmcm9tIFwiLi4vbmV4dGpzLXZwY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXNcbiAgZXh0ZW5kcyBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVyc1Byb3BzPzogT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvblByb3BzPzogT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzUmV2YWxpZGF0aW9uUHJvcHM/OiBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzUHJvcHM/OiBOZXh0anNTdGF0aWNBc3NldHNQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzSW52YWxpZGF0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXMgZXh0ZW5kcyBCYXNlTmV4dGpzT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzR2xvYmFsQ29udGFpbmVycz86IE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnM/OiBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNEaXN0cmlidXRpb24/OiBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0ludmFsaWRhdGlvbj86IE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzPzogTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW5cbiAgICogcGFzc2luZyBpbiB5b3VyIG93biBgZGlzdHJpYnV0aW9uYC5cbiAgICogQGV4YW1wbGUgXCIvbXktYmFzZS1wYXRoXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gZGlzdHJpYnV0aW9uLiBDYW4gYmUgdXNlZCB3aXRoIGBiYXNlUGF0aGAgdG8gaG9zdCBtdWx0aXBsZVxuICAgKiBhcHBzIG9uIHRoZSBzYW1lIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgb2YgYW55IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgZ2xvYmFsbHkgZGlzdHJpYnV0ZWQgd2l0aCBjb250YWluZXJzLiBVc2VzIFtDbG91ZEZyb250XG4gKiBEaXN0cmlidXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td29ya2luZy13aXRoLmh0bWwpXG4gKiBhcyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgKENETikgZm9yIGdsb2JhbCBkaXN0cmlidXRpb24gYW5kIFtBV1MgRmFyZ2F0ZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvQVdTX0ZhcmdhdGUuaHRtbClcbiAqIGZvciBjb250YWluZXJzLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzR2xvYmFsQ29udGFpbmVycyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIG5leHRqc0J1aWxkOiBOZXh0anNCdWlsZDtcbiAgbmV4dGpzU3RhdGljQXNzZXRzOiBOZXh0anNTdGF0aWNBc3NldHM7XG4gIG5leHRqc1ZwYzogTmV4dGpzVnBjO1xuICBuZXh0anNGaWxlU3lzdGVtOiBOZXh0anNGaWxlU3lzdGVtO1xuICBuZXh0anNBc3NldHNEZXBsb3ltZW50OiBOZXh0anNBc3NldHNEZXBsb3ltZW50O1xuICBuZXh0anNDb250YWluZXJzOiBOZXh0anNDb250YWluZXJzO1xuICBuZXh0anNEaXN0cmlidXRpb246IE5leHRqc0Rpc3RyaWJ1dGlvbjtcbiAgbmV4dGpzSW52YWxpZGF0aW9uOiBOZXh0anNJbnZhbGlkYXRpb247XG5cbiAgcHJpdmF0ZSBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSUztcbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzR2xvYmFsQ29udGFpbmVyc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzR2xvYmFsQ29udGFpbmVyc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLm5leHRqc0J1aWxkID0gdGhpcy5jcmVhdGVOZXh0anNCdWlsZCgpO1xuICAgIHRoaXMubmV4dGpzU3RhdGljQXNzZXRzID0gdGhpcy5jcmVhdGVOZXh0anNTdGF0aWNBc3NldHMoKTtcbiAgICB0aGlzLm5leHRqc1ZwYyA9IHRoaXMuY3JlYXRlVnBjKCk7XG4gICAgdGhpcy5uZXh0anNGaWxlU3lzdGVtID0gdGhpcy5jcmVhdGVOZXh0anNGaWxlU3lzdGVtKCk7XG4gICAgdGhpcy5uZXh0anNBc3NldHNEZXBsb3ltZW50ID0gdGhpcy5jcmVhdGVOZXh0anNBc3NldHNEZXBsb3ltZW50KCk7XG4gICAgdGhpcy5uZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVOZXh0anNDb250YWluZXJzKCk7XG4gICAgdGhpcy5uZXh0anNGaWxlU3lzdGVtLmFsbG93Q29tcHV0ZSh7XG4gICAgICBjb25uZWN0aW9uczogdGhpcy5uZXh0anNDb250YWluZXJzLmFsYkZhcmdhdGVTZXJ2aWNlLnNlcnZpY2UuY29ubmVjdGlvbnMsXG4gICAgICByb2xlOiB0aGlzLm5leHRqc0NvbnRhaW5lcnMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24udGFza1JvbGUsXG4gICAgfSk7XG4gICAgdGhpcy5uZXh0anNEaXN0cmlidXRpb24gPSB0aGlzLmNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpO1xuICAgIHRoaXMubmV4dGpzSW52YWxpZGF0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNJbnZhbGlkYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNCdWlsZCh0aGlzLCBcIk5leHRqc0J1aWxkXCIsIHtcbiAgICAgIGJ1aWxkQ29tbWFuZDogdGhpcy5wcm9wcy5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZENvbnRleHQ6IHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U6IHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNCdWlsZCxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNCdWlsZFByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzU3RhdGljQXNzZXRzKCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHRoaXMsIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZwYygpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1ZwYyh0aGlzLCBcIk5leHRqc1ZwY1wiLCB7XG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNWcGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsQ29udGFpbmVycz8ubmV4dGpzVnBjUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNGaWxlU3lzdGVtKCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzRmlsZVN5c3RlbSh0aGlzLCBcIk5leHRqc0ZpbGVTeXN0ZW1cIiwge1xuICAgICAgdnBjOiB0aGlzLm5leHRqc1ZwYy52cGMsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGaWxlU3lzdGVtLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbENvbnRhaW5lcnM/Lm5leHRqc0ZpbGVTeXN0ZW1Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNBc3NldHNEZXBsb3ltZW50KHRoaXMsIFwiTmV4dGpzQXNzZXRzRGVwbG95bWVudFwiLCB7XG4gICAgICBhY2Nlc3NQb2ludDogdGhpcy5uZXh0anNGaWxlU3lzdGVtLmFjY2Vzc1BvaW50LFxuICAgICAgYnVpbGRJbWFnZURpZ2VzdDogdGhpcy5uZXh0anNCdWlsZC5idWlsZEltYWdlRGlnZXN0LFxuICAgICAgZG9ja2VySW1hZ2VDb2RlOiB0aGlzLm5leHRqc0J1aWxkLmltYWdlRm9yTmV4dGpzQXNzZXRzRGVwbG95bWVudCxcbiAgICAgIGNvbnRhaW5lck1vdW50UGF0aEZvckVmczogdGhpcy5uZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNBc3NldHNEZXBsb3ltZW50LFxuICAgICAgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U6IHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UsXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHZwYzogdGhpcy5uZXh0anNWcGMudnBjLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbENvbnRhaW5lcnNcbiAgICAgICAgPy5uZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNDb250YWluZXJzKCkge1xuICAgIGlmICghdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5leHRqc0J1aWxkLmRvY2tlckltYWdlQXNzZXQgaXMgdW5kZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE5leHRqc0NvbnRhaW5lcnModGhpcywgXCJOZXh0anNDb250YWluZXJzXCIsIHtcbiAgICAgIGFjY2Vzc1BvaW50OiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uYWNjZXNzUG9pbnQsXG4gICAgICBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IHRoaXMubmV4dGpzQnVpbGQuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgZG9ja2VySW1hZ2VBc3NldDogdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMsXG4gICAgICBmaWxlU3lzdGVtOiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uZmlsZVN5c3RlbSxcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICByZWxhdGl2ZUVudHJ5cG9pbnRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnMsXG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJzUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNEaXN0cmlidXRpb24odGhpcywgXCJOZXh0anNEaXN0cmlidXRpb25cIiwge1xuICAgICAgYXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBiYXNlUGF0aDogdGhpcy5wcm9wcy5iYXNlUGF0aCxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLm5leHRqc0NvbnRhaW5lcnMuYWxiRmFyZ2F0ZVNlcnZpY2UuY2VydGlmaWNhdGUsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMucHJvcHMuZGlzdHJpYnV0aW9uLFxuICAgICAgZHluYW1pY1VybDogdGhpcy5uZXh0anNDb250YWluZXJzLnVybCxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0ludmFsaWRhdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0ludmFsaWRhdGlvbih0aGlzLCBcIk5leHRqc0ludmFsaWRhdGlvblwiLCB7XG4gICAgICBkaXN0cmlidXRpb246IHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0ludmFsaWRhdGlvbixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNJbnZhbGlkYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|