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.
Files changed (106) hide show
  1. package/.jsii +1248 -748
  2. package/API.md +1033 -531
  3. package/README.md +1 -2
  4. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +12 -8
  5. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +67 -56
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +246 -0
  7. package/docs/breaking-changes.md +9 -0
  8. package/docs/notes.md +170 -20
  9. package/lib/constants.d.ts +32 -0
  10. package/lib/constants.js +38 -0
  11. package/lib/generated-structs/OptionalCustomResourceProps.d.ts +104 -0
  12. package/lib/generated-structs/OptionalCustomResourceProps.js +3 -0
  13. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +21 -0
  14. package/lib/generated-structs/OptionalDockerImageAssetProps.js +1 -1
  15. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +4 -3
  16. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
  17. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +1 -1
  18. package/lib/generated-structs/OptionalNextjsBuildProps.js +1 -1
  19. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +3 -3
  20. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  21. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +42 -0
  22. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +3 -0
  23. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +41 -0
  24. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +4 -0
  25. package/lib/index.d.ts +6 -5
  26. package/lib/index.js +6 -8
  27. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +5 -23
  28. package/lib/lambdas/assets-deployment/fs-to-fs.js +18 -3
  29. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +8 -2
  30. package/lib/lambdas/assets-deployment/fs-to-s3.js +14 -8
  31. package/lib/lambdas/post-deploy/create-invalidation.d.ts +2 -0
  32. package/lib/lambdas/post-deploy/create-invalidation.js +19 -0
  33. package/lib/lambdas/post-deploy/post-deploy-function.d.ts +13 -0
  34. package/lib/lambdas/post-deploy/post-deploy-function.js +22 -0
  35. package/lib/lambdas/post-deploy/post-deploy.lambda.d.ts +9 -0
  36. package/lib/lambdas/post-deploy/post-deploy.lambda.js +56 -0
  37. package/lib/lambdas/post-deploy/prune-fs.d.ts +10 -0
  38. package/lib/lambdas/post-deploy/prune-fs.js +33 -0
  39. package/lib/lambdas/post-deploy/prune-s3.d.ts +15 -0
  40. package/lib/lambdas/post-deploy/prune-s3.js +101 -0
  41. package/lib/lambdas/utils.js +35 -0
  42. package/lib/nextjs-assets-deployment.d.ts +15 -51
  43. package/lib/nextjs-assets-deployment.js +27 -25
  44. package/lib/nextjs-build/builder.Dockerfile +12 -8
  45. package/lib/nextjs-build/cdk-nextjs-cache-handler.cjs +63 -0
  46. package/lib/nextjs-build/cdk-nextjs-cache-handler.d.ts +21 -0
  47. package/lib/nextjs-build/cdk-nextjs-cache-handler.js +49 -0
  48. package/lib/nextjs-build/global-containers.Dockerfile +29 -19
  49. package/lib/nextjs-build/global-functions.Dockerfile +30 -24
  50. package/lib/nextjs-build/nextjs-build.d.ts +51 -26
  51. package/lib/nextjs-build/nextjs-build.js +108 -88
  52. package/lib/nextjs-build/regional-containers.Dockerfile +30 -20
  53. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +0 -1
  54. package/lib/nextjs-compute/nextjs-compute-base-props.js +1 -1
  55. package/lib/nextjs-compute/nextjs-containers.d.ts +2 -1
  56. package/lib/nextjs-compute/nextjs-containers.js +7 -5
  57. package/lib/nextjs-compute/nextjs-functions.d.ts +1 -0
  58. package/lib/nextjs-compute/nextjs-functions.js +8 -11
  59. package/lib/nextjs-distribution.d.ts +1 -1
  60. package/lib/nextjs-distribution.js +4 -4
  61. package/lib/nextjs-file-system.js +1 -1
  62. package/lib/nextjs-post-deploy.d.ts +101 -0
  63. package/lib/nextjs-post-deploy.js +78 -0
  64. package/lib/nextjs-static-assets.js +1 -1
  65. package/lib/nextjs-vpc.d.ts +1 -1
  66. package/lib/nextjs-vpc.js +4 -4
  67. package/lib/root-constructs/nextjs-base-overrides.d.ts +4 -0
  68. package/lib/root-constructs/nextjs-base-overrides.js +1 -1
  69. package/lib/root-constructs/nextjs-base-props.d.ts +15 -7
  70. package/lib/root-constructs/nextjs-base-props.js +1 -1
  71. package/lib/root-constructs/nextjs-global-containers.d.ts +8 -8
  72. package/lib/root-constructs/nextjs-global-containers.js +25 -15
  73. package/lib/root-constructs/nextjs-global-functions.d.ts +8 -11
  74. package/lib/root-constructs/nextjs-global-functions.js +25 -25
  75. package/lib/root-constructs/nextjs-regional-containers.d.ts +8 -0
  76. package/lib/root-constructs/nextjs-regional-containers.js +26 -9
  77. package/lib/utils/get-architecture.d.ts +2 -0
  78. package/lib/utils/get-architecture.js +8 -0
  79. package/lib/utils/handle-deprecated-properties.d.ts +7 -0
  80. package/lib/utils/handle-deprecated-properties.js +14 -0
  81. package/package.json +17 -19
  82. package/assets/lambdas/revalidate/revalidate.lambda/index.js +0 -67
  83. package/lib/common.d.ts +0 -25
  84. package/lib/common.js +0 -30
  85. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +0 -11
  86. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +0 -3
  87. package/lib/lambdas/assets-deployment/prune-s3.d.ts +0 -15
  88. package/lib/lambdas/assets-deployment/prune-s3.js +0 -42
  89. package/lib/lambdas/assets-deployment/s3.d.ts +0 -2
  90. package/lib/lambdas/assets-deployment/s3.js +0 -7
  91. package/lib/lambdas/assets-deployment/utils.js +0 -35
  92. package/lib/lambdas/revalidate/revalidate-function.d.ts +0 -13
  93. package/lib/lambdas/revalidate/revalidate-function.js +0 -22
  94. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +0 -2
  95. package/lib/lambdas/revalidate/revalidate.lambda.js +0 -53
  96. package/lib/nextjs-build/add-cache-handler.d.ts +0 -1
  97. package/lib/nextjs-build/add-cache-handler.js +0 -23
  98. package/lib/nextjs-build/add-cache-handler.mjs +0 -18
  99. package/lib/nextjs-build/cache-handler.cjs +0 -21878
  100. package/lib/nextjs-build/cache-handler.d.ts +0 -6
  101. package/lib/nextjs-build/cache-handler.js +0 -26
  102. package/lib/nextjs-invalidation.d.ts +0 -19
  103. package/lib/nextjs-invalidation.js +0 -52
  104. package/lib/nextjs-revalidation.d.ts +0 -30
  105. package/lib/nextjs-revalidation.js +0 -65
  106. /package/lib/lambdas/{assets-deployment/utils.d.ts → utils.d.ts} +0 -0
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneS3 = pruneS3;
4
+ // eslint-disable-next-line import/no-extraneous-dependencies
5
+ const client_s3_1 = require("@aws-sdk/client-s3");
6
+ const utils_1 = require("../utils");
7
+ const s3Client = new client_s3_1.S3Client();
8
+ // Maximum number of concurrent operations
9
+ const MAX_CONCURRENT_OPERATIONS = 50;
10
+ /**
11
+ * Given `bucketName`, `currentBuildId`, and `msTtl`, list all objects
12
+ * in the bucket and delete any that 1/ do not have a metadata key of "next-build-id"
13
+ * and value of `currentBuildId` and 2/ were created more than `msTtl` ago
14
+ */
15
+ async function pruneS3(props) {
16
+ const { bucketName, currentBuildId, msTtl } = props;
17
+ const cutoffDate = new Date(Date.now() - msTtl);
18
+ const objectsToDelete = [];
19
+ let continuationToken = undefined;
20
+ let listObjectsCount = 0;
21
+ do {
22
+ // List objects in the bucket
23
+ const listObjectsV2Input = {
24
+ Bucket: bucketName,
25
+ ContinuationToken: continuationToken,
26
+ };
27
+ const listResponse = await s3Client.send(new client_s3_1.ListObjectsV2Command(listObjectsV2Input));
28
+ if (!listResponse.Contents || listResponse.Contents.length === 0) {
29
+ break;
30
+ }
31
+ // Filter out objects without keys
32
+ const oldObjects = listResponse.Contents.filter((obj) => {
33
+ const lastModified = obj.LastModified || new Date();
34
+ return obj.Key && lastModified < cutoffDate;
35
+ });
36
+ (0, utils_1.debug)(`Checking old objects metadata to determine pruning: ${oldObjects.map((o) => o.Key)}`);
37
+ // Process objects in parallel with controlled concurrency
38
+ const checkResults = await processBatch(oldObjects, MAX_CONCURRENT_OPERATIONS, async (object) => {
39
+ if (!object.Key)
40
+ return null;
41
+ try {
42
+ const headResponse = await s3Client.send(new client_s3_1.HeadObjectCommand({
43
+ Bucket: bucketName,
44
+ Key: object.Key,
45
+ }));
46
+ const objectBuildId = headResponse.Metadata?.["next-build-id"];
47
+ // Return the key if it should be deleted
48
+ if (objectBuildId !== currentBuildId) {
49
+ return { Key: object.Key };
50
+ }
51
+ }
52
+ catch (error) {
53
+ console.error(`Error checking object ${object.Key}:`, error);
54
+ }
55
+ return null;
56
+ });
57
+ // Add valid objects to delete list
58
+ objectsToDelete.push(...checkResults.filter(Boolean));
59
+ if (listResponse.NextContinuationToken) {
60
+ continuationToken = listResponse.NextContinuationToken;
61
+ }
62
+ listObjectsCount++;
63
+ // assume less than 100K objects (100 * 1K objects per ListObjectsV2Command = 100K)
64
+ } while (continuationToken && listObjectsCount <= 100);
65
+ // Delete objects in parallel batches (respecting S3's 1000 objects per request limit)
66
+ if (objectsToDelete.length > 0) {
67
+ const deleteBatches = [];
68
+ for (let i = 0; i < objectsToDelete.length; i += 1000) {
69
+ const batch = objectsToDelete.slice(i, i + 1000);
70
+ deleteBatches.push(batch);
71
+ }
72
+ await processBatch(deleteBatches, 5, // Process up to 5 delete batches in parallel
73
+ async (batch) => {
74
+ try {
75
+ (0, utils_1.debug)(`Deleting objects: ${batch.map((b) => b.Key)} from ${bucketName}`);
76
+ await s3Client.send(new client_s3_1.DeleteObjectsCommand({
77
+ Bucket: bucketName,
78
+ Delete: { Objects: batch },
79
+ }));
80
+ (0, utils_1.debug)(`Deleted ${batch.length} objects from ${bucketName}`);
81
+ }
82
+ catch (error) {
83
+ console.error("Error deleting objects:", error);
84
+ }
85
+ });
86
+ }
87
+ (0, utils_1.debug)(`Pruning complete. Deleted ${objectsToDelete.length} objects from ${bucketName}`);
88
+ }
89
+ /**
90
+ * Process objects in batches to avoid overwhelming the system
91
+ */
92
+ async function processBatch(items, batchSize, processFn) {
93
+ const results = [];
94
+ for (let i = 0; i < items.length; i += batchSize) {
95
+ const batch = items.slice(i, i + batchSize);
96
+ const batchResults = await Promise.all(batch.map(processFn));
97
+ results.push(...batchResults);
98
+ }
99
+ return results;
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9wb3N0LWRlcGxveS9wcnVuZS1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTRCQSwwQkEyR0M7QUF2SUQsNkRBQTZEO0FBQzdELGtEQU00QjtBQUM1QixvQ0FBaUM7QUFFakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxvQkFBUSxFQUFFLENBQUM7QUFDaEMsMENBQTBDO0FBQzFDLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBV3JDOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQW1CO0lBQy9DLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQztJQUVwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxlQUFlLEdBQXNCLEVBQUUsQ0FBQztJQUU5QyxJQUFJLGlCQUFpQixHQUF1QixTQUFTLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFekIsR0FBRyxDQUFDO1FBQ0YsNkJBQTZCO1FBQzdCLE1BQU0sa0JBQWtCLEdBQThCO1lBQ3BELE1BQU0sRUFBRSxVQUFVO1lBQ2xCLGlCQUFpQixFQUFFLGlCQUFpQjtTQUNyQyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUN0QyxJQUFJLGdDQUFvQixDQUFDLGtCQUFrQixDQUFDLENBQzdDLENBQUM7UUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxNQUFNO1FBQ1IsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsUUFBUSxD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QUssRUFBRTtpQkFDM0IsQ0FBQyxDQUNILENBQUM7Z0JBQ0YsSUFBQSxhQUFLLEVBQUMsV0FBVyxLQUFLLENBQUMsTUFBTSxpQkFBaUIsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFBLGFBQUssRUFDSCw2QkFBNkIsZUFBZSxDQUFDLE1BQU0saUJBQWlCLFVBQVUsRUFBRSxDQUNqRixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFlBQVksQ0FDekIsS0FBVSxFQUNWLFNBQWlCLEVBQ2pCLFNBQWtDO0lBRWxDLE1BQU0sT0FBTyxHQUFRLEVBQUUsQ0FBQztJQUV4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHtcbiAgUzNDbGllbnQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICBEZWxldGVPYmplY3RzQ29tbWFuZCxcbiAgSGVhZE9iamVjdENvbW1hbmQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kSW5wdXQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmNvbnN0IHMzQ2xpZW50ID0gbmV3IFMzQ2xpZW50KCk7XG4vLyBNYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG9wZXJhdGlvbnNcbmNvbnN0IE1BWF9DT05DVVJSRU5UX09QRVJBVElPTlMgPSA1MDtcblxuaW50ZXJmYWNlIFBydW5lUzNQcm9wcyB7XG4gIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgY3VycmVudEJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWUgdG8gbGl2ZSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBtc1R0bDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEdpdmVuIGBidWNrZXROYW1lYCwgYGN1cnJlbnRCdWlsZElkYCwgYW5kIGBtc1R0bGAsIGxpc3QgYWxsIG9iamVjdHNcbiAqIGluIHRoZSBidWNrZXQgYW5kIGRlbGV0ZSBhbnkgdGhhdCAxLyBkbyBub3QgaGF2ZSBhIG1ldGFkYXRhIGtleSBvZiBcIm5leHQtYnVpbGQtaWRcIlxuICogYW5kIHZhbHVlIG9mIGBjdXJyZW50QnVpbGRJZGAgYW5kIDIvIHdlcmUgY3JlYXRlZCBtb3JlIHRoYW4gYG1zVHRsYCBhZ29cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBydW5lUzMocHJvcHM6IFBydW5lUzNQcm9wcykge1xuICBjb25zdCB7IGJ1Y2tldE5hbWUsIGN1cnJlbnRCdWlsZElkLCBtc1R0bCB9ID0gcHJvcHM7XG5cbiAgY29uc3QgY3V0b2ZmRGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBtc1R0bCk7XG4gIGNvbnN0IG9iamVjdHNUb0RlbGV0ZTogeyBLZXk6IHN0cmluZyB9W10gPSBbXTtcblxuICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgbGV0IGxpc3RPYmplY3RzQ291bnQgPSAwO1xuXG4gIGRvIHtcbiAgICAvLyBMaXN0IG9iamVjdHMgaW4gdGhlIGJ1Y2tldFxuICAgIGNvbnN0IGxpc3RPYmplY3RzVjJJbnB1dDogTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCA9IHtcbiAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICB9O1xuICAgIGNvbnN0IGxpc3RSZXNwb25zZSA9IGF3YWl0IHMzQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQobGlzdE9iamVjdHNWMklucHV0KSxcbiAgICApO1xuXG4gICAgaWYgKCFsaXN0UmVzcG9uc2UuQ29udGVudHMgfHwgbGlzdFJlc3BvbnNlLkNvbnRlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBvYmplY3RzIHdpdGhvdXQga2V5c1xuICAgIGNvbnN0IG9sZE9iamVjdHMgPSBsaXN0UmVzcG9uc2UuQ29udGVudHMuZmlsdGVyKChvYmopID0+IHtcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IG9iai5MYXN0TW9kaWZpZWQgfHwgbmV3IERhdGUoKTtcbiAgICAgIHJldHVybiBvYmouS2V5ICYmIGxhc3RNb2RpZmllZCA8IGN1dG9mZkRhdGU7XG4gICAgfSk7XG4gICAgZGVidWcoXG4gICAgICBgQ2hlY2tpbmcgb2xkIG9iamVjdHMgbWV0YWRhdGEgdG8gZGV0ZXJtaW5lIHBydW5pbmc6ICR7b2xkT2JqZWN0cy5tYXAoKG8pID0+IG8uS2V5KX1gLFxuICAgICk7XG5cbiAgICAvLyBQcm9jZXNzIG9iamVjdHMgaW4gcGFyYWxsZWwgd2l0aCBjb250cm9sbGVkIGNvbmN1cnJlbmN5XG4gICAgY29uc3QgY2hlY2tSZXN1bHRzID0gYXdhaXQgcHJvY2Vzc0JhdGNoKFxuICAgICAgb2xkT2JqZWN0cyxcbiAgICAgIE1BWF9DT05DVVJSRU5UX09QRVJBVElPTlMsXG4gICAgICBhc3luYyAob2JqZWN0KSA9PiB7XG4gICAgICAgIGlmICghb2JqZWN0LktleSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkUmVzcG9uc2UgPSBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IEhlYWRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICBLZXk6IG9iamVjdC5LZXksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgb2JqZWN0QnVpbGRJZCA9IGhlYWRSZXNwb25zZS5NZXRhZGF0YT8uW1wibmV4dC1idWlsZC1pZFwiXTtcblxuICAgICAgICAgIC8vIFJldHVybiB0aGUga2V5IGlmIGl0IHNob3VsZCBiZSBkZWxldGVkXG4gICAgICAgICAgaWYgKG9iamVjdEJ1aWxkSWQgIT09IGN1cnJlbnRCdWlsZElkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBLZXk6IG9iamVjdC5LZXkgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgY2hlY2tpbmcgb2JqZWN0ICR7b2JqZWN0LktleX06YCwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBBZGQgdmFsaWQgb2JqZWN0cyB0byBkZWxldGUgbGlzdFxuICAgIG9iamVjdHNUb0RlbGV0ZS5wdXNoKFxuICAgICAgLi4uKGNoZWNrUmVzdWx0cy5maWx0ZXIoQm9vbGVhbikgYXMgeyBLZXk6IHN0cmluZyB9W10pLFxuICAgICk7XG5cbiAgICBpZiAobGlzdFJlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbikge1xuICAgICAgY29udGludWF0aW9uVG9rZW4gPSBsaXN0UmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuICAgIH1cbiAgICBsaXN0T2JqZWN0c0NvdW50Kys7XG4gICAgLy8gYXNzdW1lIGxlc3MgdGhhbiAxMDBLIG9iamVjdHMgKDEwMCAqIDFLIG9iamVjdHMgcGVyIExpc3RPYmplY3RzVjJDb21tYW5kID0gMTAwSylcbiAgfSB3aGlsZSAoY29udGludWF0aW9uVG9rZW4gJiYgbGlzdE9iamVjdHNDb3VudCA8PSAxMDApO1xuXG4gIC8vIERlbGV0ZSBvYmplY3RzIGluIHBhcmFsbGVsIGJhdGNoZXMgKHJlc3BlY3RpbmcgUzMncyAxMDAwIG9iamVjdHMgcGVyIHJlcXVlc3QgbGltaXQpXG4gIGlmIChvYmplY3RzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlbGV0ZUJhdGNoZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0c1RvRGVsZXRlLmxlbmd0aDsgaSArPSAxMDAwKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IG9iamVjdHNUb0RlbGV0ZS5zbGljZShpLCBpICsgMTAwMCk7XG4gICAgICBkZWxldGVCYXRjaGVzLnB1c2goYmF0Y2gpO1xuICAgIH1cblxuICAgIGF3YWl0IHByb2Nlc3NCYXRjaChcbiAgICAgIGRlbGV0ZUJhdGNoZXMsXG4gICAgICA1LCAvLyBQcm9jZXNzIHVwIHRvIDUgZGVsZXRlIGJhdGNoZXMgaW4gcGFyYWxsZWxcbiAgICAgIGFzeW5jIChiYXRjaCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYERlbGV0aW5nIG9iamVjdHM6ICR7YmF0Y2gubWFwKChiKSA9PiBiLktleSl9IGZyb20gJHtidWNrZXROYW1lfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICBEZWxldGU6IHsgT2JqZWN0czogYmF0Y2ggfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZGVidWcoYERlbGV0ZWQgJHtiYXRjaC5sZW5ndGh9IG9iamVjdHMgZnJvbSAke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlbGV0aW5nIG9iamVjdHM6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgZGVidWcoXG4gICAgYFBydW5pbmcgY29tcGxldGUuIERlbGV0ZWQgJHtvYmplY3RzVG9EZWxldGUubGVuZ3RofSBvYmplY3RzIGZyb20gJHtidWNrZXROYW1lfWAsXG4gICk7XG59XG5cbi8qKlxuICogUHJvY2VzcyBvYmplY3RzIGluIGJhdGNoZXMgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIHRoZSBzeXN0ZW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoPFQsIFI+KFxuICBpdGVtczogVFtdLFxuICBiYXRjaFNpemU6IG51bWJlcixcbiAgcHJvY2Vzc0ZuOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxSPixcbik6IFByb21pc2U8UltdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgIGNvbnN0IGJhdGNoID0gaXRlbXMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2gubWFwKHByb2Nlc3NGbikpO1xuICAgIHJlc3VsdHMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CfnResponseStatus = void 0;
4
+ exports.cfnResponse = cfnResponse;
5
+ exports.debug = debug;
6
+ var CfnResponseStatus;
7
+ (function (CfnResponseStatus) {
8
+ CfnResponseStatus["Success"] = "SUCCESS";
9
+ CfnResponseStatus["Failed"] = "FAILED";
10
+ })(CfnResponseStatus || (exports.CfnResponseStatus = CfnResponseStatus = {}));
11
+ /**
12
+ * Inspired by: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html
13
+ */
14
+ function cfnResponse(props) {
15
+ const body = JSON.stringify({
16
+ Status: props.responseStatus,
17
+ Reason: "See the details in CloudWatch Log Stream: " +
18
+ props.context.logStreamName,
19
+ PhysicalResourceId: props.physicalResourceId || props.context.logStreamName,
20
+ StackId: props.event.StackId,
21
+ RequestId: props.event.RequestId,
22
+ LogicalResourceId: props.event.LogicalResourceId,
23
+ Data: props.responseData,
24
+ });
25
+ return fetch(props.event.ResponseURL, {
26
+ method: "PUT",
27
+ body,
28
+ headers: { "content-type": "", "content-length": body.length.toString() },
29
+ });
30
+ }
31
+ function debug(value) {
32
+ if (process.env.DEBUG)
33
+ console.log(JSON.stringify(value, null, 2));
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQkEsa0NBaUJDO0FBRUQsc0JBRUM7QUFyQ0QsSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQzNCLHdDQUFtQixDQUFBO0lBQ25CLHNDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFIVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQUc1QjtBQVVEOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQXVCO0lBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjO1FBQzVCLE1BQU0sRUFDSiw0Q0FBNEM7WUFDNUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQzdCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWE7UUFDM0UsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTztRQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTO1FBQ2hDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1FBQ2hELElBQUksRUFBRSxLQUFLLENBQUMsWUFBWTtLQUN6QixDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUNwQyxNQUFNLEVBQUUsS0FBSztRQUNiLElBQUk7UUFDSixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7S0FDMUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxLQUFjO0lBQ2xDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5cbmV4cG9ydCBlbnVtIENmblJlc3BvbnNlU3RhdHVzIHtcbiAgU3VjY2VzcyA9IFwiU1VDQ0VTU1wiLFxuICBGYWlsZWQgPSBcIkZBSUxFRFwiLFxufVxuXG5pbnRlcmZhY2UgQ2ZuUmVzcG9uc2VQcm9wcyB7XG4gIGV2ZW50OiBQYXJhbWV0ZXJzPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VIYW5kbGVyPlswXTtcbiAgY29udGV4dDogUGFyYW1ldGVyczxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlcj5bMV07XG4gIHJlc3BvbnNlU3RhdHVzOiBDZm5SZXNwb25zZVN0YXR1cztcbiAgcmVzcG9uc2VEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGh5c2ljYWxSZXNvdXJjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluc3BpcmVkIGJ5OiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9jZm4tbGFtYmRhLWZ1bmN0aW9uLWNvZGUtY2ZucmVzcG9uc2Vtb2R1bGUuaHRtbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2ZuUmVzcG9uc2UocHJvcHM6IENmblJlc3BvbnNlUHJvcHMpIHtcbiAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBTdGF0dXM6IHByb3BzLnJlc3BvbnNlU3RhdHVzLFxuICAgIFJlYXNvbjpcbiAgICAgIFwiU2VlIHRoZSBkZXRhaWxzIGluIENsb3VkV2F0Y2ggTG9nIFN0cmVhbTogXCIgK1xuICAgICAgcHJvcHMuY29udGV4dC5sb2dTdHJlYW1OYW1lLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcHJvcHMucGh5c2ljYWxSZXNvdXJjZUlkIHx8IHByb3BzLmNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICBTdGFja0lkOiBwcm9wcy5ldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogcHJvcHMuZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBwcm9wcy5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBEYXRhOiBwcm9wcy5yZXNwb25zZURhdGEsXG4gIH0pO1xuICByZXR1cm4gZmV0Y2gocHJvcHMuZXZlbnQuUmVzcG9uc2VVUkwsIHtcbiAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiXCIsIFwiY29udGVudC1sZW5ndGhcIjogYm9keS5sZW5ndGgudG9TdHJpbmcoKSB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmIChwcm9jZXNzLmVudi5ERUJVRykgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpKTtcbn1cbiJdfQ==
@@ -4,10 +4,14 @@ import { AccessPoint } from "aws-cdk-lib/aws-efs";
4
4
  import { DockerImageCode, DockerImageFunction } from "aws-cdk-lib/aws-lambda";
5
5
  import { Bucket } from "aws-cdk-lib/aws-s3";
6
6
  import { Construct } from "constructs";
7
- import { NextjsType } from "./common";
7
+ import { NextjsType } from "./constants";
8
+ import { OptionalCustomResourceProps } from "./generated-structs/OptionalCustomResourceProps";
8
9
  import { OptionalDockerImageFunctionProps } from "./generated-structs/OptionalDockerImageFunctionProps";
9
- import { NextjsBuild } from "./nextjs-build/nextjs-build";
10
10
  export interface NextjsAssetDeploymentOverrides {
11
+ /**
12
+ * Props that define the custom resource
13
+ */
14
+ readonly customResourceProps?: OptionalCustomResourceProps;
11
15
  readonly dockerImageFunctionProps?: OptionalDockerImageFunctionProps;
12
16
  }
13
17
  export interface NextjsAssetsDeploymentProps {
@@ -17,15 +21,13 @@ export interface NextjsAssetsDeploymentProps {
17
21
  * @example "/my-base-path"
18
22
  */
19
23
  readonly basePath?: string;
24
+ readonly buildId: string;
20
25
  /**
21
26
  * @see {@link NextjsBuild.buildImageDigest}
22
27
  */
23
28
  readonly buildImageDigest: string;
24
29
  /**
25
- * @see {@link NextjsBuild.containerMountPathForEfs}
26
- */
27
- readonly containerMountPathForEfs: NextjsBuild["containerMountPathForEfs"];
28
- /**
30
+ * If true, logs details in custom resource lambda
29
31
  * @default true
30
32
  */
31
33
  readonly debug?: boolean;
@@ -33,9 +35,9 @@ export interface NextjsAssetsDeploymentProps {
33
35
  readonly nextjsType: NextjsType;
34
36
  readonly overrides?: NextjsAssetDeploymentOverrides;
35
37
  /**
36
- * @see {@link NextjsBaseProps.relativePathToWorkspace}
38
+ * @see {@link NextjsBaseProps.relativePathToPackage}
37
39
  */
38
- readonly relativePathToWorkspace?: string;
40
+ readonly relativePathToPackage?: string;
39
41
  /**
40
42
  * Required for `NextjsType.GlobalFunctions` and `NextjsType.GlobalContainers`
41
43
  */
@@ -58,53 +60,19 @@ export interface FsToFsAction {
58
60
  type: "fs-to-fs";
59
61
  sourcePath: string;
60
62
  destinationPath: string;
63
+ includeExtensions?: string[];
61
64
  }
62
65
  /**
63
66
  * @internal
64
67
  */
65
- export interface PruneS3Action {
66
- type: "prune-s3";
67
- /**
68
- * The minimum previous deployment count to prune
69
- * @default 3
70
- */
71
- minPreviousDeployCountToPrune: number;
72
- /**
73
- * The minimum previous deployment date to prune
74
- * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
75
- */
76
- minPreviousDeployDateToPrune: string;
77
- bucketName: string;
78
- bucketPrefix?: string;
79
- }
80
- /**
81
- * @internal
82
- */
83
- export interface PruneFsAction {
84
- type: "prune-fs";
68
+ export interface StaticAssetsCustomResourceProperties {
69
+ actions: (FsToS3Action | FsToFsAction)[];
70
+ buildId: string;
85
71
  /**
86
- * The minimum previous deployment count to prune
87
- * @default 3
88
- */
89
- minPreviousDeployCountToPrune: number;
90
- /**
91
- * The minimum previous deployment date to prune
92
- * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
93
- */
94
- minPreviousDeployDateToPrune: string;
95
- directory: string;
96
- }
97
- /**
98
- * @internal
99
- */
100
- export interface CustomResourceProperties {
101
- actions: (FsToS3Action | FsToFsAction | PruneS3Action | PruneFsAction)[];
102
- /**
103
- * {@link NextjsAssetDeploymentProps.builderImageDigest}
72
+ * @see {@link NextjsBuild.buildImageDigest}
104
73
  */
105
74
  buildImageDigest: string;
106
75
  imageCachePath: string;
107
- prerenderManifestPath: string;
108
76
  nextjsType: NextjsType;
109
77
  }
110
78
  /**
@@ -113,10 +81,6 @@ export interface CustomResourceProperties {
113
81
  export declare class NextjsAssetsDeployment extends Construct {
114
82
  customResource: CustomResource;
115
83
  dockerImageFunction: DockerImageFunction;
116
- /**
117
- * Only used for `NextjsGlobalFunctions`
118
- */
119
- previewModeId: string;
120
84
  private props;
121
85
  constructor(scope: Construct, id: string, props: NextjsAssetsDeploymentProps);
122
86
  private createFunction;
@@ -7,7 +7,8 @@ const posix_1 = require("path/posix");
7
7
  const aws_cdk_lib_1 = require("aws-cdk-lib");
8
8
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
9
9
  const constructs_1 = require("constructs");
10
- const common_1 = require("./common");
10
+ const constants_1 = require("./constants");
11
+ const get_architecture_1 = require("./utils/get-architecture");
11
12
  /**
12
13
  * Deploys static assets to S3 and cache assets to EFS in Lambda Custom Resource.
13
14
  */
@@ -17,21 +18,13 @@ class NextjsAssetsDeployment extends constructs_1.Construct {
17
18
  this.props = props;
18
19
  this.dockerImageFunction = this.createFunction();
19
20
  this.customResource = this.createCustomResource();
20
- this.previewModeId = this.customResource.getAttString("previewModeId");
21
21
  }
22
22
  createFunction() {
23
- let architecture = undefined;
24
- if (process.arch === "x64") {
25
- architecture = aws_lambda_1.Architecture.X86_64;
26
- }
27
- else if (process.arch === "arm64") {
28
- architecture = aws_lambda_1.Architecture.ARM_64;
29
- }
30
23
  const fn = new aws_lambda_1.DockerImageFunction(this, "Fn", {
31
- architecture,
24
+ architecture: (0, get_architecture_1.getLambdaArchitecture)(),
32
25
  code: this.props.dockerImageCode,
33
26
  memorySize: 2048,
34
- filesystem: aws_lambda_1.FileSystem.fromEfsAccessPoint(this.props.accessPoint, this.props.containerMountPathForEfs),
27
+ filesystem: aws_lambda_1.FileSystem.fromEfsAccessPoint(this.props.accessPoint, constants_1.MOUNT_PATH),
35
28
  vpc: this.props.vpc,
36
29
  timeout: aws_cdk_lib_1.Duration.minutes(5),
37
30
  ...this.props.overrides?.dockerImageFunctionProps,
@@ -56,51 +49,60 @@ class NextjsAssetsDeployment extends constructs_1.Construct {
56
49
  // static files
57
50
  {
58
51
  type: "fs-to-s3",
59
- sourcePath: (0, posix_1.join)(root, ".next", "static"),
52
+ sourcePath: (0, posix_1.join)(root, constants_1.STATIC_PATH),
60
53
  destinationBucketName: this.props.staticAssetsBucket.bucketName,
61
54
  destinationKeyPrefix: staticKeyPrefix,
62
55
  },
63
56
  // public directory to s3 for CloudFront -> S3
64
57
  {
65
58
  type: "fs-to-s3",
66
- sourcePath: (0, posix_1.join)(root, "public"),
59
+ sourcePath: (0, posix_1.join)(root, constants_1.PUBLIC_PATH),
67
60
  destinationBucketName: this.props.staticAssetsBucket.bucketName,
68
61
  });
69
62
  }
70
63
  actions.push(
71
- // data cache - https://nextjs.org/docs/app/building-your-application/caching#data-cache
64
+ // full route cache - https://nextjs.org/docs/app/building-your-application/caching#full-route-cache
72
65
  {
73
66
  type: "fs-to-fs",
74
- sourcePath: (0, posix_1.join)(root, ".next", "cache", "fetch-cache"),
75
- destinationPath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.DATA_CACHE_DIR),
67
+ sourcePath: (0, posix_1.join)(root, ".next", "standalone", this.props.relativePathToPackage || "", constants_1.FULL_ROUTE_CACHE_PATH),
68
+ destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.FULL_ROUTE_CACHE_PATH),
69
+ // only files with these extensions are needed in EFS FileSystem cache
70
+ // since these files are the only ones updated by Next.js during runtime.
71
+ // other files like .js and .nft.json files are static per deployment
72
+ includeExtensions: ["body", "html", "rsc", "meta"],
76
73
  },
77
- // full route cache - https://nextjs.org/docs/app/building-your-application/caching#full-route-cache
74
+ // after `next build` data cache https://nextjs.org/docs/app/building-your-application/caching#data-cache
75
+ // exists at top level .next/cache so we need to copy into relativePathToPackage
76
+ // normalized path
78
77
  {
79
78
  type: "fs-to-fs",
80
- sourcePath: (0, posix_1.join)(root, ".next", "standalone", this.props.relativePathToWorkspace || "", ".next", "server", "app"),
81
- destinationPath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.FULL_ROUTE_CACHE_DIR),
79
+ sourcePath: (0, posix_1.join)(root, constants_1.DATA_CACHE_PATH),
80
+ destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.DATA_CACHE_PATH),
82
81
  },
83
82
  // public directory to EFS for needed optimizing images in public directory
83
+ // we don't load these into compute to save on image size
84
84
  {
85
85
  type: "fs-to-fs",
86
- sourcePath: (0, posix_1.join)(root, "public"),
87
- destinationPath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.PUBLIC_DIR),
86
+ sourcePath: (0, posix_1.join)(root, constants_1.PUBLIC_PATH),
87
+ destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.PUBLIC_PATH),
88
88
  });
89
89
  const properties = {
90
90
  actions,
91
+ buildId: this.props.buildId,
92
+ // ensures this CR runs each time new builder image
91
93
  buildImageDigest: this.props.buildImageDigest,
92
- imageCachePath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.IMAGE_CACHE_DIR),
94
+ imageCachePath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.IMAGE_CACHE_PATH),
93
95
  nextjsType: this.props.nextjsType,
94
- prerenderManifestPath: (0, posix_1.join)(root, ".next", "prerender-manifest.json"),
95
96
  };
96
97
  return new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
97
98
  properties,
98
99
  resourceType: "Custom::NextjsAssetsDeployment",
99
100
  serviceToken: this.dockerImageFunction.functionArn,
101
+ ...this.props.overrides?.customResourceProps,
100
102
  });
101
103
  }
102
104
  }
103
105
  exports.NextjsAssetsDeployment = NextjsAssetsDeployment;
104
106
  _a = JSII_RTTI_SYMBOL_1;
105
- NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.3.11" };
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBS2dDO0FBRWhDLDJDQUF1QztBQUN2QyxxQ0FNa0I7QUE2R2xCOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQVVuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksWUFBWSxHQUE2QixTQUFTLENBQUM7UUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVk7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2hDLFVBQVUs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LElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsbUJBQVUsQ0FBQztTQUN2RSxDQUVGLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBNkI7WUFDM0MsT0FBTztZQUNQLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQzdDLGNBQWMsRUFBRSxJQUFBLFlBQUksRUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFDbkMsd0JBQWUsQ0FDaEI7WUFDRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLHFCQUFxQixFQUFFLElBQUEsWUFBSSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUseUJBQXlCLENBQUM7U0FDdEUsQ0FBQztRQUNGLE9BQU8sSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNoRCxVQUFVO1lBQ1YsWUFBWSxFQUFFLGdDQUFnQztZQUM5QyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVc7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3SEgsd0RBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQWNjZXNzUG9pbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBEb2NrZXJJbWFnZUNvZGUsXG4gIERvY2tlckltYWdlRnVuY3Rpb24sXG4gIEZpbGVTeXN0ZW0sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgREFUQV9DQUNIRV9ESVIsXG4gIEZVTExfUk9VVEVfQ0FDSEVfRElSLFxuICBJTUFHRV9DQUNIRV9ESVIsXG4gIE5leHRqc1R5cGUsXG4gIFBVQkxJQ19ESVIsXG59IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtcHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldERlcGxveW1lbnRPdmVycmlkZXMge1xuICByZWFkb25seSBkb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMge1xuICByZWFkb25seSBhY2Nlc3NQb2ludDogQWNjZXNzUG9pbnQ7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuXG4gICAqIEBleGFtcGxlIFwiL215LWJhc2UtcGF0aFwiXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmJ1aWxkSW1hZ2VEaWdlc3R9XG4gICAqL1xuICByZWFkb25seSBidWlsZEltYWdlRGlnZXN0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnN9XG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IE5leHRqc0J1aWxkW1wiY29udGFpbmVyTW91bnRQYXRoRm9yRWZzXCJdO1xuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU6IERvY2tlckltYWdlQ29kZTsgLy8gVE9ETzogcmVtb3ZlIGFuZCBidWlsZCBmcm9tIGNvbW1vbiBidWlsZGVyIGJhc2U/XG4gIHJlYWRvbmx5IG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Fzc2V0RGVwbG95bWVudE92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aFRvV29ya3NwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVxdWlyZWQgZm9yIGBOZXh0anNUeXBlLkdsb2JhbEZ1bmN0aW9uc2AgYW5kIGBOZXh0anNUeXBlLkdsb2JhbENvbnRhaW5lcnNgXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ/OiBCdWNrZXQ7XG4gIHJlYWRvbmx5IHZwYzogSVZwYztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGc1RvUzNBY3Rpb24ge1xuICB0eXBlOiBcImZzLXRvLXMzXCI7XG4gIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogc3RyaW5nO1xuICBkZXN0aW5hdGlvbktleVByZWZpeD86IHN0cmluZztcbiAgc291cmNlUGF0aDogc3RyaW5nO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGc1RvRnNBY3Rpb24ge1xuICB0eXBlOiBcImZzLXRvLWZzXCI7XG4gIHNvdXJjZVBhdGg6IHN0cmluZztcbiAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBydW5lUzNBY3Rpb24ge1xuICB0eXBlOiBcInBydW5lLXMzXCI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGNvdW50IHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95Q291bnRUb1BydW5lOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGRhdGUgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgbmV3IERhdGUobmV3IERhdGUoKS5zZXRNb250aChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgLSAxKSlcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95RGF0ZVRvUHJ1bmU6IHN0cmluZztcbiAgYnVja2V0TmFtZTogc3RyaW5nO1xuICBidWNrZXRQcmVmaXg/OiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBydW5lRnNBY3Rpb24ge1xuICB0eXBlOiBcInBydW5lLWZzXCI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGNvdW50IHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95Q291bnRUb1BydW5lOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGRhdGUgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgbmV3IERhdGUobmV3IERhdGUoKS5zZXRNb250aChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgLSAxKSlcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95RGF0ZVRvUHJ1bmU6IHN0cmluZztcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzIHtcbiAgYWN0aW9uczogKEZzVG9TM0FjdGlvbiB8IEZzVG9Gc0FjdGlvbiB8IFBydW5lUzNBY3Rpb24gfCBQcnVuZUZzQWN0aW9uKVtdO1xuICAvKipcbiAgICoge0BsaW5rIE5leHRqc0Fzc2V0RGVwbG95bWVudFByb3BzLmJ1aWxkZXJJbWFnZURpZ2VzdH1cbiAgICovXG4gIGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgaW1hZ2VDYWNoZVBhdGg6IHN0cmluZztcbiAgcHJlcmVuZGVyTWFuaWZlc3RQYXRoOiBzdHJpbmc7XG4gIG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG59XG5cbi8qKlxuICogRGVwbG95cyBzdGF0aWMgYXNzZXRzIHRvIFMzIGFuZCBjYWNoZSBhc3NldHMgdG8gRUZTIGluIExhbWJkYSBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNBc3NldHNEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY3VzdG9tUmVzb3VyY2U6IEN1c3RvbVJlc291cmNlO1xuICBkb2NrZXJJbWFnZUZ1bmN0aW9uOiBEb2NrZXJJbWFnZUZ1bmN0aW9uO1xuICAvKipcbiAgICogT25seSB1c2VkIGZvciBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYFxuICAgKi9cbiAgcHJldmlld01vZGVJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVGdW5jdGlvbigpO1xuICAgIHRoaXMuY3VzdG9tUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUN1c3RvbVJlc291cmNlKCk7XG4gICAgdGhpcy5wcmV2aWV3TW9kZUlkID0gdGhpcy5jdXN0b21SZXNvdXJjZS5nZXRBdHRTdHJpbmcoXCJwcmV2aWV3TW9kZUlkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbigpIHtcbiAgICBsZXQgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJ4NjRcIikge1xuICAgICAgYXJjaGl0ZWN0dXJlID0gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJhcm02NFwiKSB7XG4gICAgICBhcmNoaXRlY3R1cmUgPSBBcmNoaXRlY3R1cmUuQVJNXzY0O1xuICAgIH1cbiAgICBjb25zdCBmbiA9IG5ldyBEb2NrZXJJbWFnZUZ1bmN0aW9uKHRoaXMsIFwiRm5cIiwge1xuICAgICAgYXJjaGl0ZWN0dXJlLFxuICAgICAgY29kZTogdGhpcy5wcm9wcy5kb2NrZXJJbWFnZUNvZGUsXG4gICAgICBtZW1vcnlTaXplOiAyMDQ4LFxuICAgICAgZmlsZXN5c3RlbTogRmlsZVN5c3RlbS5mcm9tRWZzQWNjZXNzUG9pbnQoXG4gICAgICAgIHRoaXMucHJvcHMuYWNjZXNzUG9pbnQsXG4gICAgICAgIHRoaXMucHJvcHMuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgKSxcbiAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRvY2tlckltYWdlRnVuY3Rpb25Qcm9wcyxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5wcm9wcy5kZWJ1ZyAhPT0gZmFsc2UpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KFwiREVCVUdcIiwgXCIxXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQpIHtcbiAgICAgIHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZFdyaXRlKGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21SZXNvdXJjZSgpIHtcbiAgICBjb25zdCByb290ID0gXCIvYXBwXCI7XG4gICAgY29uc3QgYWN0aW9uczogQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1wiYWN0aW9uc1wiXSA9IFtdO1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldD8uYnVja2V0TmFtZSkge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgZGVzdGluYXRpb24ga2V5IHByZWZpeCB3aXRoIGJhc2VQYXRoIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjb25zdCBzdGF0aWNLZXlQcmVmaXggPSB0aGlzLnByb3BzLmJhc2VQYXRoXG4gICAgICAgID8gYCR7dGhpcy5wcm9wcy5iYXNlUGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIil9L19uZXh0L3N0YXRpY2BcbiAgICAgICAgOiBcIl9uZXh0L3N0YXRpY1wiO1xuXG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIC8vIHN0YXRpYyBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IHN0YXRpY0tleVByZWZpeCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gcHVibGljIGRpcmVjdG9yeSB0byBzMyBmb3IgQ2xvdWRGcm9udCAtPiBTM1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCJwdWJsaWNcIiksXG4gICAgICAgICAgZGVzdGluYXRpb25CdWNrZXROYW1lOiB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKFxuICAgICAgLy8gZGF0YSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZGF0YS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcImNhY2hlXCIsIFwiZmV0Y2gtY2FjaGVcIiksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAvLyBmdWxsIHJvdXRlIGNhY2hlIC0gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vY2FjaGluZyNmdWxsLXJvdXRlLWNhY2hlXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZnMtdG8tZnNcIixcbiAgICAgICAgc291cmNlUGF0aDogam9pbihcbiAgICAgICAgICByb290LFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB0aGlzLnByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlIHx8IFwiXCIsXG4gICAgICAgICAgXCIubmV4dFwiLFxuICAgICAgICAgIFwic2VydmVyXCIsXG4gICAgICAgICAgXCJhcHBcIixcbiAgICAgICAgKSxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBqb2luKFxuICAgICAgICAgIHRoaXMucHJvcHMuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgICAgIEZVTExfUk9VVEVfQ0FDSEVfRElSLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIC8vIHB1YmxpYyBkaXJlY3RvcnkgdG8gRUZTIGZvciBuZWVkZWQgb3B0aW1pemluZyBpbWFnZXMgaW4gcHVibGljIGRpcmVjdG9yeVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCJwdWJsaWNcIiksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbih0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcywgUFVCTElDX0RJUiksXG4gICAgICB9LFxuICAgICAgLy8gaW1hZ2VzIGFyZSBvcHRpbWl6ZWQgYXQgcnVudGltZSBzbyBub3RoaW5nIHRvIGRlcGxveVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydGllczogQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzID0ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIGJ1aWxkSW1hZ2VEaWdlc3Q6IHRoaXMucHJvcHMuYnVpbGRJbWFnZURpZ2VzdCxcbiAgICAgIGltYWdlQ2FjaGVQYXRoOiBqb2luKFxuICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgSU1BR0VfQ0FDSEVfRElSLFxuICAgICAgKSxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMucHJvcHMubmV4dGpzVHlwZSxcbiAgICAgIHByZXJlbmRlck1hbmlmZXN0UGF0aDogam9pbihyb290LCBcIi5uZXh0XCIsIFwicHJlcmVuZGVyLW1hbmlmZXN0Lmpzb25cIiksXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok5leHRqc0Fzc2V0c0RlcGxveW1lbnRcIixcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
107
+ NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.4.1" };
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBSWdDO0FBRWhDLDJDQUF1QztBQUN2QywyQ0FRcUI7QUFLckIsK0RBQWlFO0FBNEVqRTs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsc0JBQVM7SUFNbkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBa0M7UUFFbEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVksRUFBRSxJQUFBLHdDQUFxQixHQUFFO1lBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7WUFDaEMsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLHVCQUFVLENBQUMsa0JBQWtCLENBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUN0QixzQkFBVSxDQUNYO1lBQ0QsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNuQixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsd0JBQXdCO1NBQ2xELENBQUMsQ0FBQztRQUNILElBQUks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Z0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7WUFDN0MsY0FBYyxFQUFFLElBQUEsWUFBSSxFQUFDLHNCQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsNEJBQWdCLENBQUM7WUFDdEUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtTQUNsQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ2hELFVBQVU7WUFDVixZQUFZLEVBQUUsZ0NBQWdDO1lBQzlDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVztZQUNsRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLG1CQUFtQjtTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBISCx3REFxSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBBY2Nlc3NQb2ludCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWZzXCI7XG5pbXBvcnQge1xuICBEb2NrZXJJbWFnZUNvZGUsXG4gIERvY2tlckltYWdlRnVuY3Rpb24sXG4gIEZpbGVTeXN0ZW0sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgREFUQV9DQUNIRV9QQVRILFxuICBGVUxMX1JPVVRFX0NBQ0hFX1BBVEgsXG4gIElNQUdFX0NBQ0hFX1BBVEgsXG4gIE1PVU5UX1BBVEgsXG4gIE5leHRqc1R5cGUsXG4gIFBVQkxJQ19QQVRILFxuICBTVEFUSUNfUEFUSCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBnZXRMYW1iZGFBcmNoaXRlY3R1cmUgfSBmcm9tIFwiLi91dGlscy9nZXQtYXJjaGl0ZWN0dXJlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzIHtcbiAgLyoqXG4gICAqIFByb3BzIHRoYXQgZGVmaW5lIHRoZSBjdXN0b20gcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJlc291cmNlUHJvcHM/OiBPcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHM7XG4gIC8vIE5PVEU6IHdlIGRvbid0IG9mZmVyIG92ZXJyaWRpbmcgYGN1c3RvbVJlc291cmNlUHJvcGVydGllc2Agc2luY2UganNpaSBkb2Vzbid0IHN1cHBvcnQgdW5pb24gdHlwZXNcbiAgLy8gcmVhZG9ubHkgY3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzPzogT3B0aW9uYWxTdGF0aWNBc3NldHNDdXN0b21SZXNvdXJjZVByb3BlcnRpZXNcbiAgcmVhZG9ubHkgZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzPzogT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICAvKipcbiAgICogUHJlZml4IHRvIHRoZSBVUkkgcGF0aCB0aGUgYXBwIHdpbGwgYmUgc2VydmVkIGF0LlxuICAgKiBAZXhhbXBsZSBcIi9teS1iYXNlLXBhdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmJ1aWxkSW1hZ2VEaWdlc3R9XG4gICAqL1xuICByZWFkb25seSBidWlsZEltYWdlRGlnZXN0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBsb2dzIGRldGFpbHMgaW4gY3VzdG9tIHJlc291cmNlIGxhbWJkYVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlOyAvLyBUT0RPOiByZW1vdmUgYW5kIGJ1aWxkIGZyb20gY29tbW9uIGJ1aWxkZXIgYmFzZT9cbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnJlbGF0aXZlUGF0aFRvUGFja2FnZX1cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aFRvUGFja2FnZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGZvciBgTmV4dGpzVHlwZS5HbG9iYWxGdW5jdGlvbnNgIGFuZCBgTmV4dGpzVHlwZS5HbG9iYWxDb250YWluZXJzYFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0PzogQnVja2V0O1xuICByZWFkb25seSB2cGM6IElWcGM7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnNUb1MzQWN0aW9uIHtcbiAgdHlwZTogXCJmcy10by1zM1wiO1xuICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHN0cmluZztcbiAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg6IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnNUb0ZzQWN0aW9uIHtcbiAgdHlwZTogXCJmcy10by1mc1wiO1xuICBzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nO1xuICBpbmNsdWRlRXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0Fzc2V0c0N1c3RvbVJlc291cmNlUHJvcGVydGllcyB7XG4gIGFjdGlvbnM6IChGc1RvUzNBY3Rpb24gfCBGc1RvRnNBY3Rpb24pW107XG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmJ1aWxkSW1hZ2VEaWdlc3R9XG4gICAqL1xuICBidWlsZEltYWdlRGlnZXN0OiBzdHJpbmc7XG4gIGltYWdlQ2FjaGVQYXRoOiBzdHJpbmc7XG4gIG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG59XG5cbi8qKlxuICogRGVwbG95cyBzdGF0aWMgYXNzZXRzIHRvIFMzIGFuZCBjYWNoZSBhc3NldHMgdG8gRUZTIGluIExhbWJkYSBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNBc3NldHNEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY3VzdG9tUmVzb3VyY2U6IEN1c3RvbVJlc291cmNlO1xuICBkb2NrZXJJbWFnZUZ1bmN0aW9uOiBEb2NrZXJJbWFnZUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVGdW5jdGlvbigpO1xuICAgIHRoaXMuY3VzdG9tUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUN1c3RvbVJlc291cmNlKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IGZuID0gbmV3IERvY2tlckltYWdlRnVuY3Rpb24odGhpcywgXCJGblwiLCB7XG4gICAgICBhcmNoaXRlY3R1cmU6IGdldExhbWJkYUFyY2hpdGVjdHVyZSgpLFxuICAgICAgY29kZTogdGhpcy5wcm9wcy5kb2NrZXJJbWFnZUNvZGUsXG4gICAgICBtZW1vcnlTaXplOiAyMDQ4LFxuICAgICAgZmlsZXN5c3RlbTogRmlsZVN5c3RlbS5mcm9tRWZzQWNjZXNzUG9pbnQoXG4gICAgICAgIHRoaXMucHJvcHMuYWNjZXNzUG9pbnQsXG4gICAgICAgIE1PVU5UX1BBVEgsXG4gICAgICApLFxuICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLmRlYnVnICE9PSBmYWxzZSkge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQoXCJERUJVR1wiLCBcIjFcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldCkge1xuICAgICAgdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUN1c3RvbVJlc291cmNlKCkge1xuICAgIGNvbnN0IHJvb3QgPSBcIi9hcHBcIjtcbiAgICBjb25zdCBhY3Rpb25zOiBTdGF0aWNBc3NldHNDdXN0b21SZXNvdXJjZVByb3BlcnRpZXNbXCJhY3Rpb25zXCJdID0gW107XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0Py5idWNrZXROYW1lKSB7XG4gICAgICAvLyBQcmVwYXJlIHRoZSBkZXN0aW5hdGlvbiBrZXkgcHJlZml4IHdpdGggYmFzZVBhdGggd2hlbiBhdmFpbGFibGVcbiAgICAgIGNvbnN0IHN0YXRpY0tleVByZWZpeCA9IHRoaXMucHJvcHMuYmFzZVBhdGhcbiAgICAgICAgPyBgJHt0aGlzLnByb3BzLmJhc2VQYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKX0vX25leHQvc3RhdGljYFxuICAgICAgICA6IFwiX25leHQvc3RhdGljXCI7XG5cbiAgICAgIGFjdGlvbnMucHVzaChcbiAgICAgICAgLy8gc3RhdGljIGZpbGVzXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImZzLXRvLXMzXCIsXG4gICAgICAgICAgc291cmNlUGF0aDogam9pbihyb290LCBTVEFUSUNfUEFUSCksXG4gICAgICAgICAgZGVzdGluYXRpb25CdWNrZXROYW1lOiB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzdGF0aWNLZXlQcmVmaXgsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHB1YmxpYyBkaXJlY3RvcnkgdG8gczMgZm9yIENsb3VkRnJvbnQgLT4gUzNcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZnMtdG8tczNcIixcbiAgICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFBVQkxJQ19QQVRIKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBhY3Rpb25zLnB1c2goXG4gICAgICAvLyBmdWxsIHJvdXRlIGNhY2hlIC0gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vY2FjaGluZyNmdWxsLXJvdXRlLWNhY2hlXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZnMtdG8tZnNcIixcbiAgICAgICAgc291cmNlUGF0aDogam9pbihcbiAgICAgICAgICByb290LFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB0aGlzLnByb3BzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSB8fCBcIlwiLFxuICAgICAgICAgIEZVTExfUk9VVEVfQ0FDSEVfUEFUSCxcbiAgICAgICAgKSxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBqb2luKFxuICAgICAgICAgIE1PVU5UX1BBVEgsXG4gICAgICAgICAgdGhpcy5wcm9wcy5idWlsZElkLFxuICAgICAgICAgIEZVTExfUk9VVEVfQ0FDSEVfUEFUSCxcbiAgICAgICAgKSxcbiAgICAgICAgLy8gb25seSBmaWxlcyB3aXRoIHRoZXNlIGV4dGVuc2lvbnMgYXJlIG5lZWRlZCBpbiBFRlMgRmlsZVN5c3RlbSBjYWNoZVxuICAgICAgICAvLyBzaW5jZSB0aGVzZSBmaWxlcyBhcmUgdGhlIG9ubHkgb25lcyB1cGRhdGVkIGJ5IE5leHQuanMgZHVyaW5nIHJ1bnRpbWUuXG4gICAgICAgIC8vIG90aGVyIGZpbGVzIGxpa2UgLmpzIGFuZCAubmZ0Lmpzb24gZmlsZXMgYXJlIHN0YXRpYyBwZXIgZGVwbG95bWVudFxuICAgICAgICBpbmNsdWRlRXh0ZW5zaW9uczogW1wiYm9keVwiLCBcImh0bWxcIiwgXCJyc2NcIiwgXCJtZXRhXCJdLFxuICAgICAgfSxcbiAgICAgIC8vIGFmdGVyIGBuZXh0IGJ1aWxkYCBkYXRhIGNhY2hlIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZGF0YS1jYWNoZVxuICAgICAgLy8gZXhpc3RzIGF0IHRvcCBsZXZlbCAubmV4dC9jYWNoZSBzbyB3ZSBuZWVkIHRvIGNvcHkgaW50byByZWxhdGl2ZVBhdGhUb1BhY2thZ2VcbiAgICAgIC8vIG5vcm1hbGl6ZWQgcGF0aFxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgREFUQV9DQUNIRV9QQVRIKSxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBqb2luKE1PVU5UX1BBVEgsIHRoaXMucHJvcHMuYnVpbGRJZCwgREFUQV9DQUNIRV9QQVRIKSxcbiAgICAgIH0sXG4gICAgICAvLyBwdWJsaWMgZGlyZWN0b3J5IHRvIEVGUyBmb3IgbmVlZGVkIG9wdGltaXppbmcgaW1hZ2VzIGluIHB1YmxpYyBkaXJlY3RvcnlcbiAgICAgIC8vIHdlIGRvbid0IGxvYWQgdGhlc2UgaW50byBjb21wdXRlIHRvIHNhdmUgb24gaW1hZ2Ugc2l6ZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgUFVCTElDX1BBVEgpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4oTU9VTlRfUEFUSCwgdGhpcy5wcm9wcy5idWlsZElkLCBQVUJMSUNfUEFUSCksXG4gICAgICB9LFxuICAgICAgLy8gaW1hZ2VzIGFyZSBvcHRpbWl6ZWQgYXQgcnVudGltZSBzbyBub3RoaW5nIHRvIGRlcGxveVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydGllczogU3RhdGljQXNzZXRzQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzID0ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIGJ1aWxkSWQ6IHRoaXMucHJvcHMuYnVpbGRJZCxcbiAgICAgIC8vIGVuc3VyZXMgdGhpcyBDUiBydW5zIGVhY2ggdGltZSBuZXcgYnVpbGRlciBpbWFnZVxuICAgICAgYnVpbGRJbWFnZURpZ2VzdDogdGhpcy5wcm9wcy5idWlsZEltYWdlRGlnZXN0LFxuICAgICAgaW1hZ2VDYWNoZVBhdGg6IGpvaW4oTU9VTlRfUEFUSCwgdGhpcy5wcm9wcy5idWlsZElkLCBJTUFHRV9DQUNIRV9QQVRIKSxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMucHJvcHMubmV4dGpzVHlwZSxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6TmV4dGpzQXNzZXRzRGVwbG95bWVudFwiLFxuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmRvY2tlckltYWdlRnVuY3Rpb24uZnVuY3Rpb25Bcm4sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uY3VzdG9tUmVzb3VyY2VQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -6,9 +6,7 @@ RUN apk add --no-cache libc6-compat
6
6
  WORKDIR /app
7
7
  # It's preferrable to only copy package.json's and lockfiles, install, and then
8
8
  # copy the rest of the code to efficiently utilize build cache. We don't do that
9
- # here because it's highly customized based on a projects setup. We recommend
10
- # developers use `overrides.nextjs[GlobalFunctions].nextjsBuildProps.builderImageProps.srcDockerfilePath`
11
- # to optimize for their setup.
9
+ # here because it's highly customized based on a projects setup. See cdk-nextjs/examples/turbo.
12
10
  COPY . .
13
11
  # Install dependencies based on the preferred package manager
14
12
  RUN \
@@ -18,8 +16,14 @@ RUN \
18
16
  else echo "Lockfile not found." && exit 1; \
19
17
  fi
20
18
  ARG BUILD_COMMAND
21
- ARG RELATIVE_PATH_TO_WORKSPACE
22
- RUN if [ -f ./cdk-nextjs-load-env-vars.sh ]; then chmod u+x ./cdk-nextjs-load-env-vars.sh && . ./cdk-nextjs-load-env-vars.sh; fi
23
- RUN cd $RELATIVE_PATH_TO_WORKSPACE && $BUILD_COMMAND
24
- # after building, node_modules aren't needed anymore. this reduces image size by over 50mb
25
- RUN rm -rf node_modules
19
+ ARG RELATIVE_PATH_TO_PACKAGE
20
+ RUN cd $RELATIVE_PATH_TO_PACKAGE && {{INJECT_CDK_NEXTJS_BUILD_ENV_VARS}} $BUILD_COMMAND
21
+ RUN rm -rf node_modules && \
22
+ # remove pnpm cache if exists
23
+ command -v pnpm >/dev/null 2>&1 && rm -rf $(pnpm store path) || echo "pnpm not installed, skipping cache cleanup" && \
24
+ # .next/cache/webpack used to speed up builds on subsequent `next build`
25
+ rm -rf $RELATIVE_PATH_TO_PACKAGE/.next/cache/webpack && \
26
+ # .next/trace used for debugging purposes
27
+ rm $RELATIVE_PATH_TO_PACKAGE/.next/trace && \
28
+ # not needed since we use .next/server in standalone
29
+ rm -rf $RELATIVE_PATH_TO_PACKAGE/.next/server
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/nextjs-build/cdk-nextjs-cache-handler.ts
31
+ var cdk_nextjs_cache_handler_exports = {};
32
+ __export(cdk_nextjs_cache_handler_exports, {
33
+ default: () => CdkNextjsCacheHandler
34
+ });
35
+ module.exports = __toCommonJS(cdk_nextjs_cache_handler_exports);
36
+ var import_file_system_cache = __toESM(require("next/dist/server/lib/incremental-cache/file-system-cache"));
37
+
38
+ // src/constants.ts
39
+ var CACHE_PATH = ".next/cache";
40
+ var DATA_CACHE_PATH = `${CACHE_PATH}/fetch-cache`;
41
+ var IMAGE_CACHE_PATH = `${CACHE_PATH}/images`;
42
+ var SERVER_DIST_PATH = ".next/server";
43
+ var FULL_ROUTE_CACHE_PATH = `${SERVER_DIST_PATH}/app`;
44
+ var CDK_NEXTJS_SERVER_DIST_DIR_ENV_VAR_NAME = "CDK_NEXTJS_SERVER_DIST_DIR";
45
+
46
+ // src/nextjs-build/cdk-nextjs-cache-handler.ts
47
+ var CdkNextjsCacheHandler = class extends import_file_system_cache.default {
48
+ constructor(options) {
49
+ const cdkNextjsServerDistDir = process.env[CDK_NEXTJS_SERVER_DIST_DIR_ENV_VAR_NAME];
50
+ if (!cdkNextjsServerDistDir) {
51
+ throw new Error(
52
+ `${CDK_NEXTJS_SERVER_DIST_DIR_ENV_VAR_NAME} environment variable not set`
53
+ );
54
+ }
55
+ super({ ...options, serverDistDir: cdkNextjsServerDistDir });
56
+ }
57
+ get(cacheKey, ctx) {
58
+ return super.get(cacheKey, ctx);
59
+ }
60
+ set(pathname, data, ctx) {
61
+ return super.set(pathname, data, ctx);
62
+ }
63
+ };
@@ -0,0 +1,21 @@
1
+ import { CacheHandlerValue } from "next/dist/server/lib/incremental-cache";
2
+ import FileSystemCache from "next/dist/server/lib/incremental-cache/file-system-cache";
3
+ import { IncrementalCacheKindHint, IncrementalCacheValue } from "next/dist/server/response-cache";
4
+ export default class CdkNextjsCacheHandler extends FileSystemCache {
5
+ constructor(options: ConstructorParameters<typeof FileSystemCache>[0]);
6
+ get(cacheKey: string, ctx?: {
7
+ kindHint?: IncrementalCacheKindHint;
8
+ revalidate?: number | false;
9
+ fetchUrl?: string;
10
+ fetchIdx?: number;
11
+ tags?: string[];
12
+ softTags?: string[];
13
+ } | undefined): Promise<CacheHandlerValue | null>;
14
+ set(pathname: string, data: IncrementalCacheValue | null, ctx: {
15
+ revalidate?: number | false;
16
+ fetchCache?: boolean;
17
+ fetchUrl?: string;
18
+ fetchIdx?: number;
19
+ tags?: string[];
20
+ }): Promise<void>;
21
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // eslint-disable-next-line import/no-extraneous-dependencies
4
+ const file_system_cache_1 = require("next/dist/server/lib/incremental-cache/file-system-cache");
5
+ const constants_1 = require("../constants");
6
+ class CdkNextjsCacheHandler extends file_system_cache_1.default {
7
+ constructor(options) {
8
+ /**
9
+ * @example `/mnt/cdk-nextjs/{relativePathToPackage}/.next/server`
10
+ * This allows us to tell Next.js `FileSystemCache` to write .next/cache/fetch-cache
11
+ * data and .next/server/app/*.{html,rsc,meta,body} data to our EFS shared
12
+ * file system. Note, we cannot control where optimized images are cached
13
+ * through public Next.js APIs so we must symlink.
14
+ *
15
+ * Note, the `serverDistDir` defaults to current directory of the Next.js
16
+ * app but we cannot use this because 1/ we want to share cache between
17
+ * mutiple functions or containers via EFS mount 2/ lambda cannot write
18
+ * to disk (unless /tmp or EFS mount)
19
+ */
20
+ const cdkNextjsServerDistDir = process.env[constants_1.CDK_NEXTJS_SERVER_DIST_DIR_ENV_VAR_NAME];
21
+ if (!cdkNextjsServerDistDir) {
22
+ throw new Error(`${constants_1.CDK_NEXTJS_SERVER_DIST_DIR_ENV_VAR_NAME} environment variable not set`);
23
+ }
24
+ super({ ...options, serverDistDir: cdkNextjsServerDistDir });
25
+ }
26
+ get(cacheKey, ctx) {
27
+ // console.log(JSON.stringify({ cacheKey, ctx }, null, 2));
28
+ return super.get(cacheKey, ctx);
29
+ }
30
+ set(pathname, data, ctx) {
31
+ // console.log(
32
+ // JSON.stringify(
33
+ // {
34
+ // pathname,
35
+ // data:
36
+ // data?.kind === "PAGE"
37
+ // ? { ...data, pageData: "...", html: "..." }
38
+ // : data,
39
+ // ctx,
40
+ // },
41
+ // null,
42
+ // 2,
43
+ // ),
44
+ // );
45
+ return super.set(pathname, data, ctx);
46
+ }
47
+ }
48
+ exports.default = CdkNextjsCacheHandler;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW5leHRqcy1jYWNoZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9jZGstbmV4dGpzLWNhY2hlLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSw2REFBNkQ7QUFDN0QsZ0dBQXVGO0FBTXZGLDRDQUF1RTtBQUV2RSxNQUFxQixxQkFBc0IsU0FBUSwyQkFBZTtJQUNoRSxZQUFZLE9BQXlEO1FBQ25FOzs7Ozs7Ozs7OztXQVdHO1FBQ0gsTUFBTSxzQkFBc0IsR0FDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtREFBdUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxtREFBdUMsK0JBQStCLENBQzFFLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsR0FBRyxDQUNELFFBQWdCLEVBQ2hCLEdBU2E7UUFFYiwyREFBMkQ7UUFDM0QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsR0FBRyxDQUNELFFBQWdCLEVBQ2hCLElBQWtDLEVBQ2xDLEdBTUM7UUFFRCxlQUFlO1FBQ2Ysb0JBQW9CO1FBQ3BCLFFBQVE7UUFDUixrQkFBa0I7UUFDbEIsY0FBYztRQUNkLGdDQUFnQztRQUNoQyx3REFBd0Q7UUFDeEQsb0JBQW9CO1FBQ3BCLGFBQWE7UUFDYixTQUFTO1FBQ1QsWUFBWTtRQUNaLFNBQVM7UUFDVCxPQUFPO1FBQ1AsS0FBSztRQUNMLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQXBFRCx3Q0FvRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYXMgZGVmaW5lZCBpbiAucHJvamVucmMudHMgdG8gYmUgdXNlZCBhcyBOZXh0LmpzXG4gIEN1c3RvbSBDYWNoZSBIYW5kbGVyLiBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL2luY3JlbWVudGFsQ2FjaGVIYW5kbGVyUGF0aFxuKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7IENhY2hlSGFuZGxlclZhbHVlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgRmlsZVN5c3RlbUNhY2hlIGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pbmNyZW1lbnRhbC1jYWNoZS9maWxlLXN5c3RlbS1jYWNoZVwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHtcbiAgSW5jcmVtZW50YWxDYWNoZUtpbmRIaW50LFxuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQgeyBDREtfTkVYVEpTX1NFUlZFUl9ESVNUX0RJUl9FTlZfVkFSX05BTUUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENka05leHRqc0NhY2hlSGFuZGxlciBleHRlbmRzIEZpbGVTeXN0ZW1DYWNoZSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRmlsZVN5c3RlbUNhY2hlPlswXSkge1xuICAgIC8qKlxuICAgICAqIEBleGFtcGxlIGAvbW50L2Nkay1uZXh0anMve3JlbGF0aXZlUGF0aFRvUGFja2FnZX0vLm5leHQvc2VydmVyYFxuICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIHRlbGwgTmV4dC5qcyBgRmlsZVN5c3RlbUNhY2hlYCB0byB3cml0ZSAubmV4dC9jYWNoZS9mZXRjaC1jYWNoZVxuICAgICAqIGRhdGEgYW5kIC5uZXh0L3NlcnZlci9hcHAvKi57aHRtbCxyc2MsbWV0YSxib2R5fSBkYXRhIHRvIG91ciBFRlMgc2hhcmVkXG4gICAgICogZmlsZSBzeXN0ZW0uIE5vdGUsIHdlIGNhbm5vdCBjb250cm9sIHdoZXJlIG9wdGltaXplZCBpbWFnZXMgYXJlIGNhY2hlZFxuICAgICAqIHRocm91Z2ggcHVibGljIE5leHQuanMgQVBJcyBzbyB3ZSBtdXN0IHN5bWxpbmsuXG4gICAgICpcbiAgICAgKiBOb3RlLCB0aGUgYHNlcnZlckRpc3REaXJgIGRlZmF1bHRzIHRvIGN1cnJlbnQgZGlyZWN0b3J5IG9mIHRoZSBOZXh0LmpzXG4gICAgICogYXBwIGJ1dCB3ZSBjYW5ub3QgdXNlIHRoaXMgYmVjYXVzZSAxLyB3ZSB3YW50IHRvIHNoYXJlIGNhY2hlIGJldHdlZW5cbiAgICAgKiBtdXRpcGxlIGZ1bmN0aW9ucyBvciBjb250YWluZXJzIHZpYSBFRlMgbW91bnQgMi8gbGFtYmRhIGNhbm5vdCB3cml0ZVxuICAgICAqIHRvIGRpc2sgKHVubGVzcyAvdG1wIG9yIEVGUyBtb3VudClcbiAgICAgKi9cbiAgICBjb25zdCBjZGtOZXh0anNTZXJ2ZXJEaXN0RGlyID1cbiAgICAgIHByb2Nlc3MuZW52W0NES19ORVhUSlNfU0VSVkVSX0RJU1RfRElSX0VOVl9WQVJfTkFNRV07XG4gICAgaWYgKCFjZGtOZXh0anNTZXJ2ZXJEaXN0RGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0NES19ORVhUSlNfU0VSVkVSX0RJU1RfRElSX0VOVl9WQVJfTkFNRX0gZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldGAsXG4gICAgICApO1xuICAgIH1cbiAgICBzdXBlcih7IC4uLm9wdGlvbnMsIHNlcnZlckRpc3REaXI6IGNka05leHRqc1NlcnZlckRpc3REaXIgfSk7XG4gIH1cblxuICBnZXQoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICBjdHg/OlxuICAgICAgfCB7XG4gICAgICAgICAga2luZEhpbnQ/OiBJbmNyZW1lbnRhbENhY2hlS2luZEhpbnQ7XG4gICAgICAgICAgcmV2YWxpZGF0ZT86IG51bWJlciB8IGZhbHNlO1xuICAgICAgICAgIGZldGNoVXJsPzogc3RyaW5nO1xuICAgICAgICAgIGZldGNoSWR4PzogbnVtYmVyO1xuICAgICAgICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICAgICAgICBzb2Z0VGFncz86IHN0cmluZ1tdO1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxDYWNoZUhhbmRsZXJWYWx1ZSB8IG51bGw+IHtcbiAgICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGNhY2hlS2V5LCBjdHggfSwgbnVsbCwgMikpO1xuICAgIHJldHVybiBzdXBlci5nZXQoY2FjaGVLZXksIGN0eCk7XG4gIH1cblxuICBzZXQoXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgfCBudWxsLFxuICAgIGN0eDoge1xuICAgICAgcmV2YWxpZGF0ZT86IG51bWJlciB8IGZhbHNlO1xuICAgICAgZmV0Y2hDYWNoZT86IGJvb2xlYW47XG4gICAgICBmZXRjaFVybD86IHN0cmluZztcbiAgICAgIGZldGNoSWR4PzogbnVtYmVyO1xuICAgICAgdGFncz86IHN0cmluZ1tdO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgLy8gICAgIHtcbiAgICAvLyAgICAgICBwYXRobmFtZSxcbiAgICAvLyAgICAgICBkYXRhOlxuICAgIC8vICAgICAgICAgZGF0YT8ua2luZCA9PT0gXCJQQUdFXCJcbiAgICAvLyAgICAgICAgICAgPyB7IC4uLmRhdGEsIHBhZ2VEYXRhOiBcIi4uLlwiLCBodG1sOiBcIi4uLlwiIH1cbiAgICAvLyAgICAgICAgICAgOiBkYXRhLFxuICAgIC8vICAgICAgIGN0eCxcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgbnVsbCxcbiAgICAvLyAgICAgMixcbiAgICAvLyAgICksXG4gICAgLy8gKTtcbiAgICByZXR1cm4gc3VwZXIuc2V0KHBhdGhuYW1lLCBkYXRhLCBjdHgpO1xuICB9XG59XG4iXX0=