cdk-nextjs 0.3.10 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.jsii +1316 -781
  2. package/API.md +1067 -532
  3. package/README.md +4 -5
  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 +68 -57
  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/examples/README.md +2 -2
  10. package/lib/constants.d.ts +32 -0
  11. package/lib/constants.js +38 -0
  12. package/lib/generated-structs/OptionalCustomResourceProps.d.ts +104 -0
  13. package/lib/generated-structs/OptionalCustomResourceProps.js +3 -0
  14. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +21 -0
  15. package/lib/generated-structs/OptionalDockerImageAssetProps.js +1 -1
  16. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +9 -3
  17. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
  18. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +1 -1
  19. package/lib/generated-structs/OptionalNextjsBuildProps.js +1 -1
  20. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +3 -3
  21. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  22. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +42 -0
  23. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +3 -0
  24. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +41 -0
  25. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +4 -0
  26. package/lib/index.d.ts +6 -5
  27. package/lib/index.js +6 -8
  28. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +5 -23
  29. package/lib/lambdas/assets-deployment/fs-to-fs.js +18 -3
  30. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +8 -2
  31. package/lib/lambdas/assets-deployment/fs-to-s3.js +15 -9
  32. package/lib/lambdas/post-deploy/create-invalidation.d.ts +2 -0
  33. package/lib/lambdas/post-deploy/create-invalidation.js +19 -0
  34. package/lib/lambdas/post-deploy/post-deploy-function.d.ts +13 -0
  35. package/lib/lambdas/post-deploy/post-deploy-function.js +22 -0
  36. package/lib/lambdas/post-deploy/post-deploy.lambda.d.ts +9 -0
  37. package/lib/lambdas/post-deploy/post-deploy.lambda.js +56 -0
  38. package/lib/lambdas/post-deploy/prune-fs.d.ts +10 -0
  39. package/lib/lambdas/post-deploy/prune-fs.js +33 -0
  40. package/lib/lambdas/post-deploy/prune-s3.d.ts +15 -0
  41. package/lib/lambdas/post-deploy/prune-s3.js +101 -0
  42. package/lib/lambdas/utils.js +35 -0
  43. package/lib/nextjs-assets-deployment.d.ts +20 -51
  44. package/lib/nextjs-assets-deployment.js +32 -26
  45. package/lib/nextjs-build/builder.Dockerfile +12 -8
  46. package/lib/nextjs-build/cdk-nextjs-cache-handler.cjs +63 -0
  47. package/lib/nextjs-build/cdk-nextjs-cache-handler.d.ts +21 -0
  48. package/lib/nextjs-build/cdk-nextjs-cache-handler.js +49 -0
  49. package/lib/nextjs-build/global-containers.Dockerfile +29 -19
  50. package/lib/nextjs-build/global-functions.Dockerfile +30 -24
  51. package/lib/nextjs-build/nextjs-build.d.ts +51 -26
  52. package/lib/nextjs-build/nextjs-build.js +108 -88
  53. package/lib/nextjs-build/regional-containers.Dockerfile +30 -20
  54. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +0 -1
  55. package/lib/nextjs-compute/nextjs-compute-base-props.js +1 -1
  56. package/lib/nextjs-compute/nextjs-containers.d.ts +2 -1
  57. package/lib/nextjs-compute/nextjs-containers.js +7 -5
  58. package/lib/nextjs-compute/nextjs-functions.d.ts +1 -0
  59. package/lib/nextjs-compute/nextjs-functions.js +8 -11
  60. package/lib/nextjs-distribution.d.ts +1 -1
  61. package/lib/nextjs-distribution.js +5 -8
  62. package/lib/nextjs-file-system.js +1 -1
  63. package/lib/nextjs-post-deploy.d.ts +101 -0
  64. package/lib/nextjs-post-deploy.js +78 -0
  65. package/lib/nextjs-static-assets.js +1 -1
  66. package/lib/nextjs-vpc.d.ts +1 -1
  67. package/lib/nextjs-vpc.js +4 -4
  68. package/lib/root-constructs/nextjs-base-overrides.d.ts +4 -0
  69. package/lib/root-constructs/nextjs-base-overrides.js +1 -1
  70. package/lib/root-constructs/nextjs-base-props.d.ts +15 -7
  71. package/lib/root-constructs/nextjs-base-props.js +1 -1
  72. package/lib/root-constructs/nextjs-global-containers.d.ts +8 -8
  73. package/lib/root-constructs/nextjs-global-containers.js +26 -15
  74. package/lib/root-constructs/nextjs-global-functions.d.ts +8 -11
  75. package/lib/root-constructs/nextjs-global-functions.js +26 -25
  76. package/lib/root-constructs/nextjs-regional-containers.d.ts +8 -0
  77. package/lib/root-constructs/nextjs-regional-containers.js +26 -9
  78. package/lib/utils/get-architecture.d.ts +2 -0
  79. package/lib/utils/get-architecture.js +8 -0
  80. package/lib/utils/handle-deprecated-properties.d.ts +7 -0
  81. package/lib/utils/handle-deprecated-properties.js +14 -0
  82. package/package.json +17 -19
  83. package/assets/lambdas/revalidate/revalidate.lambda/index.js +0 -67
  84. package/lib/common.d.ts +0 -25
  85. package/lib/common.js +0 -30
  86. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +0 -11
  87. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +0 -3
  88. package/lib/lambdas/assets-deployment/prune-s3.d.ts +0 -15
  89. package/lib/lambdas/assets-deployment/prune-s3.js +0 -42
  90. package/lib/lambdas/assets-deployment/s3.d.ts +0 -2
  91. package/lib/lambdas/assets-deployment/s3.js +0 -7
  92. package/lib/lambdas/assets-deployment/utils.js +0 -35
  93. package/lib/lambdas/revalidate/revalidate-function.d.ts +0 -13
  94. package/lib/lambdas/revalidate/revalidate-function.js +0 -22
  95. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +0 -2
  96. package/lib/lambdas/revalidate/revalidate.lambda.js +0 -53
  97. package/lib/nextjs-build/add-cache-handler.d.ts +0 -1
  98. package/lib/nextjs-build/add-cache-handler.js +0 -23
  99. package/lib/nextjs-build/add-cache-handler.mjs +0 -18
  100. package/lib/nextjs-build/cache-handler.cjs +0 -21878
  101. package/lib/nextjs-build/cache-handler.d.ts +0 -6
  102. package/lib/nextjs-build/cache-handler.js +0 -26
  103. package/lib/nextjs-invalidation.d.ts +0 -19
  104. package/lib/nextjs-invalidation.js +0 -52
  105. package/lib/nextjs-revalidation.d.ts +0 -30
  106. package/lib/nextjs-revalidation.js +0 -65
  107. /package/lib/lambdas/{assets-deployment/utils.d.ts → utils.d.ts} +0 -0
@@ -0,0 +1,15 @@
1
+ interface PruneS3Props {
2
+ bucketName: string;
3
+ currentBuildId: string;
4
+ /**
5
+ * Time to live in milliseconds.
6
+ */
7
+ msTtl: number;
8
+ }
9
+ /**
10
+ * Given `bucketName`, `currentBuildId`, and `msTtl`, list all objects
11
+ * in the bucket and delete any that 1/ do not have a metadata key of "next-build-id"
12
+ * and value of `currentBuildId` and 2/ were created more than `msTtl` ago
13
+ */
14
+ export declare function pruneS3(props: PruneS3Props): Promise<void>;
15
+ export {};
@@ -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,23 +4,30 @@ 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 {
14
18
  readonly accessPoint: AccessPoint;
15
19
  /**
16
- * @see {@link NextjsBuild.buildImageDigest}
20
+ * Prefix to the URI path the app will be served at.
21
+ * @example "/my-base-path"
17
22
  */
18
- readonly buildImageDigest: string;
23
+ readonly basePath?: string;
24
+ readonly buildId: string;
19
25
  /**
20
- * @see {@link NextjsBuild.containerMountPathForEfs}
26
+ * @see {@link NextjsBuild.buildImageDigest}
21
27
  */
22
- readonly containerMountPathForEfs: NextjsBuild["containerMountPathForEfs"];
28
+ readonly buildImageDigest: string;
23
29
  /**
30
+ * If true, logs details in custom resource lambda
24
31
  * @default true
25
32
  */
26
33
  readonly debug?: boolean;
@@ -28,9 +35,9 @@ export interface NextjsAssetsDeploymentProps {
28
35
  readonly nextjsType: NextjsType;
29
36
  readonly overrides?: NextjsAssetDeploymentOverrides;
30
37
  /**
31
- * @see {@link NextjsBaseProps.relativePathToWorkspace}
38
+ * @see {@link NextjsBaseProps.relativePathToPackage}
32
39
  */
33
- readonly relativePathToWorkspace?: string;
40
+ readonly relativePathToPackage?: string;
34
41
  /**
35
42
  * Required for `NextjsType.GlobalFunctions` and `NextjsType.GlobalContainers`
36
43
  */
@@ -53,53 +60,19 @@ export interface FsToFsAction {
53
60
  type: "fs-to-fs";
54
61
  sourcePath: string;
55
62
  destinationPath: string;
63
+ includeExtensions?: string[];
56
64
  }
57
65
  /**
58
66
  * @internal
59
67
  */
60
- export interface PruneS3Action {
61
- type: "prune-s3";
68
+ export interface StaticAssetsCustomResourceProperties {
69
+ actions: (FsToS3Action | FsToFsAction)[];
70
+ buildId: string;
62
71
  /**
63
- * The minimum previous deployment count to prune
64
- * @default 3
65
- */
66
- minPreviousDeployCountToPrune: number;
67
- /**
68
- * The minimum previous deployment date to prune
69
- * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
70
- */
71
- minPreviousDeployDateToPrune: string;
72
- bucketName: string;
73
- bucketPrefix?: string;
74
- }
75
- /**
76
- * @internal
77
- */
78
- export interface PruneFsAction {
79
- type: "prune-fs";
80
- /**
81
- * The minimum previous deployment count to prune
82
- * @default 3
83
- */
84
- minPreviousDeployCountToPrune: number;
85
- /**
86
- * The minimum previous deployment date to prune
87
- * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
88
- */
89
- minPreviousDeployDateToPrune: string;
90
- directory: string;
91
- }
92
- /**
93
- * @internal
94
- */
95
- export interface CustomResourceProperties {
96
- actions: (FsToS3Action | FsToFsAction | PruneS3Action | PruneFsAction)[];
97
- /**
98
- * {@link NextjsAssetDeploymentProps.builderImageDigest}
72
+ * @see {@link NextjsBuild.buildImageDigest}
99
73
  */
100
74
  buildImageDigest: string;
101
75
  imageCachePath: string;
102
- prerenderManifestPath: string;
103
76
  nextjsType: NextjsType;
104
77
  }
105
78
  /**
@@ -108,10 +81,6 @@ export interface CustomResourceProperties {
108
81
  export declare class NextjsAssetsDeployment extends Construct {
109
82
  customResource: CustomResource;
110
83
  dockerImageFunction: DockerImageFunction;
111
- /**
112
- * Only used for `NextjsGlobalFunctions`
113
- */
114
- previewModeId: string;
115
84
  private props;
116
85
  constructor(scope: Construct, id: string, props: NextjsAssetsDeploymentProps);
117
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,
@@ -48,55 +41,68 @@ class NextjsAssetsDeployment extends constructs_1.Construct {
48
41
  const root = "/app";
49
42
  const actions = [];
50
43
  if (this.props.staticAssetsBucket?.bucketName) {
44
+ // Prepare the destination key prefix with basePath when available
45
+ const staticKeyPrefix = this.props.basePath
46
+ ? `${this.props.basePath.replace(/^\//, "")}/_next/static`
47
+ : "_next/static";
51
48
  actions.push(
52
49
  // static files
53
50
  {
54
51
  type: "fs-to-s3",
55
- sourcePath: (0, posix_1.join)(root, ".next", "static"),
52
+ sourcePath: (0, posix_1.join)(root, constants_1.STATIC_PATH),
56
53
  destinationBucketName: this.props.staticAssetsBucket.bucketName,
57
- destinationKeyPrefix: "_next/static",
54
+ destinationKeyPrefix: staticKeyPrefix,
58
55
  },
59
56
  // public directory to s3 for CloudFront -> S3
60
57
  {
61
58
  type: "fs-to-s3",
62
- sourcePath: (0, posix_1.join)(root, "public"),
59
+ sourcePath: (0, posix_1.join)(root, constants_1.PUBLIC_PATH),
63
60
  destinationBucketName: this.props.staticAssetsBucket.bucketName,
64
61
  });
65
62
  }
66
63
  actions.push(
67
- // 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
68
65
  {
69
66
  type: "fs-to-fs",
70
- sourcePath: (0, posix_1.join)(root, ".next", "cache", "fetch-cache"),
71
- 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"],
72
73
  },
73
- // 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
74
77
  {
75
78
  type: "fs-to-fs",
76
- sourcePath: (0, posix_1.join)(root, ".next", "standalone", this.props.relativePathToWorkspace || "", ".next", "server", "app"),
77
- 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),
78
81
  },
79
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
80
84
  {
81
85
  type: "fs-to-fs",
82
- sourcePath: (0, posix_1.join)(root, "public"),
83
- 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),
84
88
  });
85
89
  const properties = {
86
90
  actions,
91
+ buildId: this.props.buildId,
92
+ // ensures this CR runs each time new builder image
87
93
  buildImageDigest: this.props.buildImageDigest,
88
- 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),
89
95
  nextjsType: this.props.nextjsType,
90
- prerenderManifestPath: (0, posix_1.join)(root, ".next", "prerender-manifest.json"),
91
96
  };
92
97
  return new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
93
98
  properties,
94
99
  resourceType: "Custom::NextjsAssetsDeployment",
95
100
  serviceToken: this.dockerImageFunction.functionArn,
101
+ ...this.props.overrides?.customResourceProps,
96
102
  });
97
103
  }
98
104
  }
99
105
  exports.NextjsAssetsDeployment = NextjsAssetsDeployment;
100
106
  _a = JSII_RTTI_SYMBOL_1;
101
- NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.3.10" };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBS2dDO0FBRWhDLDJDQUF1QztBQUN2QyxxQ0FNa0I7QUF3R2xCOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQVVuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksWUFBWSxHQUE2QixTQUFTLENBQUM7UUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVk7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2hDLFVBQVUs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Q0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQ25DLHdCQUFlLENBQ2hCO1lBQ0QsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUNqQyxxQkFBcUIsRUFBRSxJQUFBLFlBQUksRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixDQUFDO1NBQ3RFLENBQUM7UUFDRixPQUFPLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDaEQsVUFBVTtZQUNWLFlBQVksRUFBRSxnQ0FBZ0M7WUFDOUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeEhILHdEQXlIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IEFjY2Vzc1BvaW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lZnNcIjtcbmltcG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgRG9ja2VySW1hZ2VDb2RlLFxuICBEb2NrZXJJbWFnZUZ1bmN0aW9uLFxuICBGaWxlU3lzdGVtLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIERBVEFfQ0FDSEVfRElSLFxuICBGVUxMX1JPVVRFX0NBQ0hFX0RJUixcbiAgSU1BR0VfQ0FDSEVfRElSLFxuICBOZXh0anNUeXBlLFxuICBQVUJMSUNfRElSLFxufSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzPzogT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQnVpbGQuYnVpbGRJbWFnZURpZ2VzdH1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmNvbnRhaW5lck1vdW50UGF0aEZvckVmc31cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lck1vdW50UGF0aEZvckVmczogTmV4dGpzQnVpbGRbXCJjb250YWluZXJNb3VudFBhdGhGb3JFZnNcIl07XG4gIC8qKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlOyAvLyBUT0RPOiByZW1vdmUgYW5kIGJ1aWxkIGZyb20gY29tbW9uIGJ1aWxkZXIgYmFzZT9cbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBmb3IgYE5leHRqc1R5cGUuR2xvYmFsRnVuY3Rpb25zYCBhbmQgYE5leHRqc1R5cGUuR2xvYmFsQ29udGFpbmVyc2BcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldD86IEJ1Y2tldDtcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9TM0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tczNcIjtcbiAgZGVzdGluYXRpb25CdWNrZXROYW1lOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uS2V5UHJlZml4Pzogc3RyaW5nO1xuICBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9Gc0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tZnNcIjtcbiAgc291cmNlUGF0aDogc3RyaW5nO1xuICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJ1bmVTM0FjdGlvbiB7XG4gIHR5cGU6IFwicHJ1bmUtczNcIjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgY291bnQgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lDb3VudFRvUHJ1bmU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgZGF0ZSB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldE1vbnRoKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSAtIDEpKVxuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lEYXRlVG9QcnVuZTogc3RyaW5nO1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIGJ1Y2tldFByZWZpeD86IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJ1bmVGc0FjdGlvbiB7XG4gIHR5cGU6IFwicHJ1bmUtZnNcIjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgY291bnQgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lDb3VudFRvUHJ1bmU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgZGF0ZSB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldE1vbnRoKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSAtIDEpKVxuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lEYXRlVG9QcnVuZTogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMge1xuICBhY3Rpb25zOiAoRnNUb1MzQWN0aW9uIHwgRnNUb0ZzQWN0aW9uIHwgUHJ1bmVTM0FjdGlvbiB8IFBydW5lRnNBY3Rpb24pW107XG4gIC8qKlxuICAgKiB7QGxpbmsgTmV4dGpzQXNzZXREZXBsb3ltZW50UHJvcHMuYnVpbGRlckltYWdlRGlnZXN0fVxuICAgKi9cbiAgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICBpbWFnZUNhY2hlUGF0aDogc3RyaW5nO1xuICBwcmVyZW5kZXJNYW5pZmVzdFBhdGg6IHN0cmluZztcbiAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbn1cblxuLyoqXG4gKiBEZXBsb3lzIHN0YXRpYyBhc3NldHMgdG8gUzMgYW5kIGNhY2hlIGFzc2V0cyB0byBFRlMgaW4gTGFtYmRhIEN1c3RvbSBSZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0Fzc2V0c0RlcGxveW1lbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjdXN0b21SZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2U7XG4gIGRvY2tlckltYWdlRnVuY3Rpb246IERvY2tlckltYWdlRnVuY3Rpb247XG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgZm9yIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgXG4gICAqL1xuICBwcmV2aWV3TW9kZUlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRvY2tlckltYWdlRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uKCk7XG4gICAgdGhpcy5jdXN0b21SZXNvdXJjZSA9IHRoaXMuY3JlYXRlQ3VzdG9tUmVzb3VyY2UoKTtcbiAgICB0aGlzLnByZXZpZXdNb2RlSWQgPSB0aGlzLmN1c3RvbVJlc291cmNlLmdldEF0dFN0cmluZyhcInByZXZpZXdNb2RlSWRcIik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uKCkge1xuICAgIGxldCBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSBcIng2NFwiKSB7XG4gICAgICBhcmNoaXRlY3R1cmUgPSBBcmNoaXRlY3R1cmUuWDg2XzY0O1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSBcImFybTY0XCIpIHtcbiAgICAgIGFyY2hpdGVjdHVyZSA9IEFyY2hpdGVjdHVyZS5BUk1fNjQ7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gbmV3IERvY2tlckltYWdlRnVuY3Rpb24odGhpcywgXCJGblwiLCB7XG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBjb2RlOiB0aGlzLnByb3BzLmRvY2tlckltYWdlQ29kZSxcbiAgICAgIG1lbW9yeVNpemU6IDIwNDgsXG4gICAgICBmaWxlc3lzdGVtOiBGaWxlU3lzdGVtLmZyb21FZnNBY2Nlc3NQb2ludChcbiAgICAgICAgdGhpcy5wcm9wcy5hY2Nlc3NQb2ludCxcbiAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICApLFxuICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLmRlYnVnICE9PSBmYWxzZSkge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQoXCJERUJVR1wiLCBcIjFcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldCkge1xuICAgICAgdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUN1c3RvbVJlc291cmNlKCkge1xuICAgIGNvbnN0IHJvb3QgPSBcIi9hcHBcIjtcbiAgICBjb25zdCBhY3Rpb25zOiBDdXN0b21SZXNvdXJjZVByb3BlcnRpZXNbXCJhY3Rpb25zXCJdID0gW107XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0Py5idWNrZXROYW1lKSB7XG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIC8vIHN0YXRpYyBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IFwiX25leHQvc3RhdGljXCIsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHB1YmxpYyBkaXJlY3RvcnkgdG8gczMgZm9yIENsb3VkRnJvbnQgLT4gUzNcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZnMtdG8tczNcIixcbiAgICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwicHVibGljXCIpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGlvbnMucHVzaChcbiAgICAgIC8vIGRhdGEgY2FjaGUgLSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI2RhdGEtY2FjaGVcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwiLm5leHRcIiwgXCJjYWNoZVwiLCBcImZldGNoLWNhY2hlXCIpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4oXG4gICAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgICAgREFUQV9DQUNIRV9ESVIsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgLy8gZnVsbCByb3V0ZSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZnVsbC1yb3V0ZS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4oXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBcIi5uZXh0XCIsXG4gICAgICAgICAgXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSB8fCBcIlwiLFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInNlcnZlclwiLFxuICAgICAgICAgIFwiYXBwXCIsXG4gICAgICAgICksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgICBGVUxMX1JPVVRFX0NBQ0hFX0RJUixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAvLyBwdWJsaWMgZGlyZWN0b3J5IHRvIEVGUyBmb3IgbmVlZGVkIG9wdGltaXppbmcgaW1hZ2VzIGluIHB1YmxpYyBkaXJlY3RvcnlcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwicHVibGljXCIpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4odGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsIFBVQkxJQ19ESVIpLFxuICAgICAgfSxcbiAgICAgIC8vIGltYWdlcyBhcmUgb3B0aW1pemVkIGF0IHJ1bnRpbWUgc28gbm90aGluZyB0byBkZXBsb3lcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IEN1c3RvbVJlc291cmNlUHJvcGVydGllcyA9IHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBidWlsZEltYWdlRGlnZXN0OiB0aGlzLnByb3BzLmJ1aWxkSW1hZ2VEaWdlc3QsXG4gICAgICBpbWFnZUNhY2hlUGF0aDogam9pbihcbiAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICksXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLnByb3BzLm5leHRqc1R5cGUsXG4gICAgICBwcmVyZW5kZXJNYW5pZmVzdFBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInByZXJlbmRlci1tYW5pZmVzdC5qc29uXCIpLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIkN1c3RvbVJlc291cmNlXCIsIHtcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpOZXh0anNBc3NldHNEZXBsb3ltZW50XCIsXG4gICAgICBzZXJ2aWNlVG9rZW46IHRoaXMuZG9ja2VySW1hZ2VGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICB9KTtcbiAgfVxufVxuIl19
107
+ NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.4.0" };
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
+ }