cdk-nextjs 0.3.11 → 0.4.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 +1248 -748
- package/API.md +1033 -531
- package/README.md +1 -2
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +12 -8
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +67 -56
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +246 -0
- package/docs/breaking-changes.md +9 -0
- package/docs/notes.md +170 -20
- package/lib/constants.d.ts +32 -0
- package/lib/constants.js +38 -0
- package/lib/generated-structs/OptionalCustomResourceProps.d.ts +104 -0
- package/lib/generated-structs/OptionalCustomResourceProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +21 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +4 -3
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +1 -1
- package/lib/generated-structs/OptionalNextjsBuildProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +3 -3
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +42 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +3 -0
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +41 -0
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +4 -0
- package/lib/index.d.ts +6 -5
- package/lib/index.js +6 -8
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +5 -23
- package/lib/lambdas/assets-deployment/fs-to-fs.js +18 -3
- package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +8 -2
- package/lib/lambdas/assets-deployment/fs-to-s3.js +14 -8
- package/lib/lambdas/post-deploy/create-invalidation.d.ts +2 -0
- package/lib/lambdas/post-deploy/create-invalidation.js +19 -0
- package/lib/lambdas/post-deploy/post-deploy-function.d.ts +13 -0
- package/lib/lambdas/post-deploy/post-deploy-function.js +22 -0
- package/lib/lambdas/post-deploy/post-deploy.lambda.d.ts +9 -0
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +56 -0
- package/lib/lambdas/post-deploy/prune-fs.d.ts +10 -0
- package/lib/lambdas/post-deploy/prune-fs.js +33 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +15 -0
- package/lib/lambdas/post-deploy/prune-s3.js +101 -0
- package/lib/lambdas/utils.js +35 -0
- package/lib/nextjs-assets-deployment.d.ts +15 -51
- package/lib/nextjs-assets-deployment.js +27 -25
- package/lib/nextjs-build/builder.Dockerfile +12 -8
- package/lib/nextjs-build/cdk-nextjs-cache-handler.cjs +63 -0
- package/lib/nextjs-build/cdk-nextjs-cache-handler.d.ts +21 -0
- package/lib/nextjs-build/cdk-nextjs-cache-handler.js +49 -0
- package/lib/nextjs-build/global-containers.Dockerfile +29 -19
- package/lib/nextjs-build/global-functions.Dockerfile +30 -24
- package/lib/nextjs-build/nextjs-build.d.ts +51 -26
- package/lib/nextjs-build/nextjs-build.js +108 -88
- package/lib/nextjs-build/regional-containers.Dockerfile +30 -20
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +0 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.d.ts +2 -1
- package/lib/nextjs-compute/nextjs-containers.js +7 -5
- package/lib/nextjs-compute/nextjs-functions.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.js +8 -11
- package/lib/nextjs-distribution.d.ts +1 -1
- package/lib/nextjs-distribution.js +4 -4
- package/lib/nextjs-file-system.js +1 -1
- package/lib/nextjs-post-deploy.d.ts +101 -0
- package/lib/nextjs-post-deploy.js +78 -0
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/nextjs-vpc.d.ts +1 -1
- package/lib/nextjs-vpc.js +4 -4
- package/lib/root-constructs/nextjs-base-overrides.d.ts +4 -0
- package/lib/root-constructs/nextjs-base-overrides.js +1 -1
- package/lib/root-constructs/nextjs-base-props.d.ts +15 -7
- package/lib/root-constructs/nextjs-base-props.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.d.ts +8 -8
- package/lib/root-constructs/nextjs-global-containers.js +25 -15
- package/lib/root-constructs/nextjs-global-functions.d.ts +8 -11
- package/lib/root-constructs/nextjs-global-functions.js +25 -25
- package/lib/root-constructs/nextjs-regional-containers.d.ts +8 -0
- package/lib/root-constructs/nextjs-regional-containers.js +26 -9
- package/lib/utils/get-architecture.d.ts +2 -0
- package/lib/utils/get-architecture.js +8 -0
- package/lib/utils/handle-deprecated-properties.d.ts +7 -0
- package/lib/utils/handle-deprecated-properties.js +14 -0
- package/package.json +17 -19
- package/assets/lambdas/revalidate/revalidate.lambda/index.js +0 -67
- package/lib/common.d.ts +0 -25
- package/lib/common.js +0 -30
- package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +0 -11
- package/lib/generated-structs/OptionalNextjsInvalidationProps.js +0 -3
- package/lib/lambdas/assets-deployment/prune-s3.d.ts +0 -15
- package/lib/lambdas/assets-deployment/prune-s3.js +0 -42
- package/lib/lambdas/assets-deployment/s3.d.ts +0 -2
- package/lib/lambdas/assets-deployment/s3.js +0 -7
- package/lib/lambdas/assets-deployment/utils.js +0 -35
- package/lib/lambdas/revalidate/revalidate-function.d.ts +0 -13
- package/lib/lambdas/revalidate/revalidate-function.js +0 -22
- package/lib/lambdas/revalidate/revalidate.lambda.d.ts +0 -2
- package/lib/lambdas/revalidate/revalidate.lambda.js +0 -53
- package/lib/nextjs-build/add-cache-handler.d.ts +0 -1
- package/lib/nextjs-build/add-cache-handler.js +0 -23
- package/lib/nextjs-build/add-cache-handler.mjs +0 -18
- package/lib/nextjs-build/cache-handler.cjs +0 -21878
- package/lib/nextjs-build/cache-handler.d.ts +0 -6
- package/lib/nextjs-build/cache-handler.js +0 -26
- package/lib/nextjs-invalidation.d.ts +0 -19
- package/lib/nextjs-invalidation.js +0 -52
- package/lib/nextjs-revalidation.d.ts +0 -30
- package/lib/nextjs-revalidation.js +0 -65
- /package/lib/lambdas/{assets-deployment/utils.d.ts → utils.d.ts} +0 -0
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import FileSystemCache from "next/dist/server/lib/incremental-cache/file-system-cache";
|
|
2
|
-
type RevalidateTagResponse = ReturnType<FileSystemCache["revalidateTag"]>;
|
|
3
|
-
export default class CacheHandler extends FileSystemCache {
|
|
4
|
-
revalidateTag(tag: string): RevalidateTagResponse;
|
|
5
|
-
}
|
|
6
|
-
export {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/*
|
|
4
|
-
This file is compiled as defined in .projenrc.ts to be used as Next.js
|
|
5
|
-
Custom Cache Handler. See: https://nextjs.org/docs/app/api-reference/next-config-js/incrementalCacheHandlerPath
|
|
6
|
-
*/
|
|
7
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
8
|
-
const client_sqs_1 = require("@aws-sdk/client-sqs");
|
|
9
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
|
-
const file_system_cache_1 = require("next/dist/server/lib/incremental-cache/file-system-cache");
|
|
11
|
-
const sqsClient = new client_sqs_1.SQSClient();
|
|
12
|
-
class CacheHandler extends file_system_cache_1.default {
|
|
13
|
-
async revalidateTag(tag) {
|
|
14
|
-
console.log({ tag });
|
|
15
|
-
console.log({ this: this });
|
|
16
|
-
await sqsClient.send(new client_sqs_1.SendMessageCommand({
|
|
17
|
-
QueueUrl: process.env.CDK_NEXTJS_QUEUE_URL,
|
|
18
|
-
MessageBody: tag,
|
|
19
|
-
// MessageGroupId: "", // do i need this?
|
|
20
|
-
}));
|
|
21
|
-
// put message in sqs queue if for full route cache
|
|
22
|
-
return super.revalidateTag(tag);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
exports.default = CacheHandler;
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXh0anMtYnVpbGQvY2FjaGUtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOzs7RUFHRTtBQUNGLDZEQUE2RDtBQUM3RCxvREFBb0U7QUFDcEUsNkRBQTZEO0FBQzdELGdHQUF1RjtBQUl2RixNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFTLEVBQUUsQ0FBQztBQUVsQyxNQUFxQixZQUFhLFNBQVEsMkJBQWU7SUFDdkQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ2xCLElBQUksK0JBQWtCLENBQUM7WUFDckIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CO1lBQzFDLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLHlDQUF5QztTQUMxQyxDQUFDLENBQ0gsQ0FBQztRQUNGLG1EQUFtRDtRQUNuRCxPQUFPLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBZEQsK0JBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYXMgZGVmaW5lZCBpbiAucHJvamVucmMudHMgdG8gYmUgdXNlZCBhcyBOZXh0LmpzXG4gIEN1c3RvbSBDYWNoZSBIYW5kbGVyLiBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL2luY3JlbWVudGFsQ2FjaGVIYW5kbGVyUGF0aFxuKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7IFNRU0NsaWVudCwgU2VuZE1lc3NhZ2VDb21tYW5kIH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zcXNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBGaWxlU3lzdGVtQ2FjaGUgZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlL2ZpbGUtc3lzdGVtLWNhY2hlXCI7XG5cbnR5cGUgUmV2YWxpZGF0ZVRhZ1Jlc3BvbnNlID0gUmV0dXJuVHlwZTxGaWxlU3lzdGVtQ2FjaGVbXCJyZXZhbGlkYXRlVGFnXCJdPjtcblxuY29uc3Qgc3FzQ2xpZW50ID0gbmV3IFNRU0NsaWVudCgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYWNoZUhhbmRsZXIgZXh0ZW5kcyBGaWxlU3lzdGVtQ2FjaGUge1xuICBhc3luYyByZXZhbGlkYXRlVGFnKHRhZzogc3RyaW5nKTogUmV2YWxpZGF0ZVRhZ1Jlc3BvbnNlIHtcbiAgICBjb25zb2xlLmxvZyh7IHRhZyB9KTtcbiAgICBjb25zb2xlLmxvZyh7IHRoaXM6IHRoaXMgfSk7XG4gICAgYXdhaXQgc3FzQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgU2VuZE1lc3NhZ2VDb21tYW5kKHtcbiAgICAgICAgUXVldWVVcmw6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfUVVFVUVfVVJMLFxuICAgICAgICBNZXNzYWdlQm9keTogdGFnLFxuICAgICAgICAvLyBNZXNzYWdlR3JvdXBJZDogXCJcIiwgLy8gZG8gaSBuZWVkIHRoaXM/XG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIHB1dCBtZXNzYWdlIGluIHNxcyBxdWV1ZSBpZiBmb3IgZnVsbCByb3V0ZSBjYWNoZVxuICAgIHJldHVybiBzdXBlci5yZXZhbGlkYXRlVGFnKHRhZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { IDistribution } from "aws-cdk-lib/aws-cloudfront";
|
|
2
|
-
import { AwsCustomResourceProps } from "aws-cdk-lib/custom-resources";
|
|
3
|
-
import { Construct } from "constructs";
|
|
4
|
-
export interface NextjsInvalidationOverrides {
|
|
5
|
-
readonly awsCustomResourceProps?: AwsCustomResourceProps;
|
|
6
|
-
}
|
|
7
|
-
export interface NextjsInvalidationProps {
|
|
8
|
-
/**
|
|
9
|
-
* CloudFront Distribution to invalidate
|
|
10
|
-
*/
|
|
11
|
-
readonly distribution: IDistribution;
|
|
12
|
-
/**
|
|
13
|
-
* Override props for every construct.
|
|
14
|
-
*/
|
|
15
|
-
readonly overrides?: NextjsInvalidationOverrides;
|
|
16
|
-
}
|
|
17
|
-
export declare class NextjsInvalidation extends Construct {
|
|
18
|
-
constructor(scope: Construct, id: string, props: NextjsInvalidationProps);
|
|
19
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
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.3.11" };
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWludmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtaW52YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQW9DO0FBRXBDLGlEQUFzRDtBQUN0RCxtRUFNc0M7QUFDdEMsMkNBQXVDO0FBaUJ2QyxNQUFhLGtCQUFtQixTQUFRLHNCQUFTO0lBQy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBZTtZQUM3QixzRUFBc0U7WUFDdEUsOEJBQThCO1lBQzlCLGtCQUFrQixFQUFFLHFDQUFrQixDQUFDLEVBQUUsQ0FDdkMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDckQ7WUFDRCxNQUFNLEVBQUUsMkJBQTJCO1lBQ25DLE9BQU8sRUFBRSw0QkFBNEI7WUFDckMsVUFBVSxFQUFFO2dCQUNWLGNBQWMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWM7Z0JBQ2pELGlCQUFpQixFQUFFO29CQUNqQixlQUFlLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7b0JBQ3pDLEtBQUssRUFBRTt3QkFDTCxRQUFRLEVBQUUsQ0FBQzt3QkFDWCxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7cUJBQ2Q7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7UUFDRixJQUFJLG9DQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDbkMsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsTUFBTSxFQUFFLDBDQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDN0MsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztvQkFDMUMsU0FBUyxFQUFFO3dCQUNULG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDdkIsUUFBUSxFQUFFLGdCQUFnQixLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRTs0QkFDN0QsT0FBTyxFQUFFLFlBQVk7NEJBQ3JCLE1BQU0sRUFBRSxFQUFFO3lCQUNYLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQzthQUNILENBQUM7WUFDRixHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdkNILGdEQXdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJRGlzdHJpYnV0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgQXdzQ3VzdG9tUmVzb3VyY2UsXG4gIEF3c1Nka0NhbGwsXG4gIEF3c0N1c3RvbVJlc291cmNlUG9saWN5LFxuICBQaHlzaWNhbFJlc291cmNlSWQsXG4gIEF3c0N1c3RvbVJlc291cmNlUHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IGF3c0N1c3RvbVJlc291cmNlUHJvcHM/OiBBd3NDdXN0b21SZXNvdXJjZVByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0ludmFsaWRhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIHRvIGludmFsaWRhdGVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogSURpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNJbnZhbGlkYXRpb25PdmVycmlkZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNJbnZhbGlkYXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzSW52YWxpZGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGNvbnN0IGF3c1Nka0NhbGw6IEF3c1Nka0NhbGwgPSB7XG4gICAgICAvLyBtYWtlIGBwaHlzaWNhbFJlc291cmNlSWRgIGNoYW5nZSBlYWNoIHRpbWUgdG8gaW52YWxpZGF0ZSBDbG91ZEZyb250XG4gICAgICAvLyBkaXN0cmlidXRpb24gb24gZWFjaCBjaGFuZ2VcbiAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICBgJHtwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWR9LSR7RGF0ZS5ub3coKX1gLFxuICAgICAgKSxcbiAgICAgIGFjdGlvbjogXCJDcmVhdGVJbnZhbGlkYXRpb25Db21tYW5kXCIsXG4gICAgICBzZXJ2aWNlOiBcIkBhd3Mtc2RrL2NsaWVudC1jbG91ZGZyb250XCIsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIERpc3RyaWJ1dGlvbklkOiBwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWQsXG4gICAgICAgIEludmFsaWRhdGlvbkJhdGNoOiB7XG4gICAgICAgICAgQ2FsbGVyUmVmZXJlbmNlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgUGF0aHM6IHtcbiAgICAgICAgICAgIFF1YW50aXR5OiAxLFxuICAgICAgICAgICAgSXRlbXM6IFtcIi8qXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiQXdzQ1JcIiwge1xuICAgICAgb25DcmVhdGU6IGF3c1Nka0NhbGwsXG4gICAgICBvblVwZGF0ZTogYXdzU2RrQ2FsbCxcbiAgICAgIHBvbGljeTogQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXCJjbG91ZGZyb250OkNyZWF0ZUludmFsaWRhdGlvblwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgICAgICAgIHJlc291cmNlOiBgZGlzdHJpYnV0aW9uLyR7cHJvcHMuZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkfWAsXG4gICAgICAgICAgICAgIHNlcnZpY2U6IFwiY2xvdWRmcm9udFwiLFxuICAgICAgICAgICAgICByZWdpb246IFwiXCIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIF0pLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVzPy5hd3NDdXN0b21SZXNvdXJjZVByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,30 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
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.3.11" };
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJldmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtcmV2YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLGlEQUE0RTtBQUU1RSxtRkFHOEM7QUFDOUMsaURBQXdEO0FBQ3hELDJDQUF1QztBQUV2QyxrRkFBOEU7QUFjOUU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQU0vQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUNyQyxJQUFJLEVBQUUsSUFBSTtZQUNWLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVO1NBQ3BDLENBQUMsQ0FBQztRQUNILDZHQUE2RztRQUM3RyxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLElBQUkseUJBQWUsQ0FBQztZQUNsQixHQUFHLEVBQUUsdUJBQXVCO1lBQzVCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxJQUFJO1lBQ25CLFVBQVUsRUFBRSxDQUFDLElBQUksc0JBQVksRUFBRSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDM0IsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRTthQUN6QztTQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0YsNkNBQTZDO1FBQzdDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDNUMsV0FBVyxFQUFFO2dCQUNYLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7YUFDMUM7WUFDRCxPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsYUFBYTtTQUN2QyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsY0FBYyxDQUNmLElBQUkseUNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsbUJBQW1CO1NBQzdDLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOztBQXBESCxnREFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQW55UHJpbmNpcGFsLCBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICBTcXNFdmVudFNvdXJjZSxcbiAgU3FzRXZlbnRTb3VyY2VQcm9wcyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlc1wiO1xuaW1wb3J0IHsgUXVldWUsIFF1ZXVlUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgUmV2YWxpZGF0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4vbGFtYmRhcy9yZXZhbGlkYXRlL3JldmFsaWRhdGUtZnVuY3Rpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNSZXZhbGlkYXRpb25PdmVycmlkZXMge1xuICByZWFkb25seSBxdWV1ZVByb3BzPzogUXVldWVQcm9wcztcbiAgcmVhZG9ubHkgZnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcztcbiAgcmVhZG9ubHkgc3FzRXZlbnRTb3VyY2VQcm9wcz86IFNxc0V2ZW50U291cmNlUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmV2YWxpZGF0aW9uUHJvcHMge1xuICByZWFkb25seSBmbjogTGFtYmRhRnVuY3Rpb247XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1JldmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgcHJldmlld01vZGVJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFtPbi1EZW1hbmQgUmV2YWxpZGF0aW9uXShodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI29uLWRlbWFuZC1yZXZhbGlkYXRpb24pXG4gKiAoaS5lLiBgcmV2YWxpZGF0ZVRhZ2AsIGByZXZsaWRhdGVQYXRoYCkgZG9lc24ndCB3b3JrIGJ5IGRlZmF1bHQgaW4gTGFtYmRhXG4gKiBlbnZpcm9ubWVudCBiZWNhdXNlIGl0IHRyaWVzIHRvIHJ1biBldmVyeSByZXF1ZXN0IGNvbXBsZXRlcyB3aGVuIExhbWJkYVxuICogc3BpbnMgZG93bi4gVGhlcmVmb3JlLCB3ZSB1c2UgYSBTUVMgUXVldWUgYW5kIExhbWJkYSBmdW5jdGlvbiB0byBydW5cbiAqIHJldmFsaWRhdGlvbiBhc3luYy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JldmFsaWRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHF1ZXVlOiBRdWV1ZTtcbiAgZm46IExhbWJkYUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc1JldmFsaWRhdGlvblByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMucXVldWUgPSB0aGlzLmNyZWF0ZVF1ZXVlKCk7XG4gICAgdGhpcy5mbiA9IHRoaXMuY3JlYXRlRnVuY3Rpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUodGhpcywgXCJRdWV1ZVwiLCB7XG4gICAgICBmaWZvOiB0cnVlLFxuICAgICAgY29udGVudEJhc2VkRGVkdXBsaWNhdGlvbjogdHJ1ZSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5xdWV1ZVByb3BzLFxuICAgIH0pO1xuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L1NRU0RldmVsb3Blckd1aWRlL3Nxcy1sZWFzdC1wcml2aWxlZ2UtcG9saWN5Lmh0bWxcbiAgICBxdWV1ZS5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogXCJEZW55VW5zZWN1cmVUcmFuc3BvcnRcIixcbiAgICAgICAgYWN0aW9uczogW1wic3FzOipcIl0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkRFTlksXG4gICAgICAgIHByaW5jaXBhbHM6IFtuZXcgQW55UHJpbmNpcGFsKCldLFxuICAgICAgICByZXNvdXJjZXM6IFtxdWV1ZS5xdWV1ZUFybl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBCb29sOiB7IFwiYXdzOlNlY3VyZVRyYW5zcG9ydFwiOiBcImZhbHNlXCIgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQWxsb3cgc2VydmVyIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlXG4gICAgcXVldWUuZ3JhbnRTZW5kTWVzc2FnZXModGhpcy5wcm9wcy5mbik7XG4gICAgdGhpcy5wcm9wcy5mbi5hZGRFbnZpcm9ubWVudChcIkNES19ORVhUSlNfUVVFVUVfVVJMXCIsIHF1ZXVlLnF1ZXVlVXJsKTtcbiAgICByZXR1cm4gcXVldWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGZuID0gbmV3IFJldmFsaWRhdGVGdW5jdGlvbih0aGlzLCBcIkZuXCIsIHtcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFBSRVZJRVdfTU9ERV9JRDogdGhpcy5wcm9wcy5wcmV2aWV3TW9kZUlkLFxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmZ1bmN0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgZm4uYWRkRXZlbnRTb3VyY2UoXG4gICAgICBuZXcgU3FzRXZlbnRTb3VyY2UodGhpcy5xdWV1ZSwge1xuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uc3FzRXZlbnRTb3VyY2VQcm9wcyxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGZuO1xuICB9XG59XG4iXX0=
|
|
File without changes
|