cdk-nextjs 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.jsii +13811 -0
  2. package/.prettierrc +0 -0
  3. package/API.md +9694 -0
  4. package/LICENSE +202 -0
  5. package/README.md +137 -0
  6. package/THIRD-PARTY-LICENSES.md +31 -0
  7. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +18 -0
  8. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +8831 -0
  9. package/assets/lambdas/revalidate/revalidate.lambda/index.js +67 -0
  10. package/assets/lambdas/sign-fn-url/sign-fn-url.lambda/index.js +2002 -0
  11. package/examples/README.md +14 -0
  12. package/lib/common.d.ts +23 -0
  13. package/lib/common.js +28 -0
  14. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.d.ts +106 -0
  15. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.js +3 -0
  16. package/lib/generated-structs/OptionalCloudFrontFunctionProps.d.ts +43 -0
  17. package/lib/generated-structs/OptionalCloudFrontFunctionProps.js +3 -0
  18. package/lib/generated-structs/OptionalClusterProps.d.ts +49 -0
  19. package/lib/generated-structs/OptionalClusterProps.js +3 -0
  20. package/lib/generated-structs/OptionalDistributionProps.d.ts +155 -0
  21. package/lib/generated-structs/OptionalDistributionProps.js +3 -0
  22. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +124 -0
  23. package/lib/generated-structs/OptionalDockerImageAssetProps.js +3 -0
  24. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +399 -0
  25. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +3 -0
  26. package/lib/generated-structs/OptionalEdgeFunctionProps.d.ts +428 -0
  27. package/lib/generated-structs/OptionalEdgeFunctionProps.js +3 -0
  28. package/lib/generated-structs/OptionalFunctionProps.d.ts +422 -0
  29. package/lib/generated-structs/OptionalFunctionProps.js +3 -0
  30. package/lib/generated-structs/OptionalFunctionUrlProps.d.ts +30 -0
  31. package/lib/generated-structs/OptionalFunctionUrlProps.js +3 -0
  32. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +45 -0
  33. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +3 -0
  34. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +30 -0
  35. package/lib/generated-structs/OptionalNextjsBuildProps.js +3 -0
  36. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +43 -0
  37. package/lib/generated-structs/OptionalNextjsContainersProps.js +3 -0
  38. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +50 -0
  39. package/lib/generated-structs/OptionalNextjsDistributionProps.js +3 -0
  40. package/lib/generated-structs/OptionalNextjsFileSystemProps.d.ts +15 -0
  41. package/lib/generated-structs/OptionalNextjsFileSystemProps.js +3 -0
  42. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +17 -0
  43. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +3 -0
  44. package/lib/generated-structs/OptionalNextjsVpcProps.d.ts +21 -0
  45. package/lib/generated-structs/OptionalNextjsVpcProps.js +3 -0
  46. package/lib/generated-structs/OptionalS3OriginProps.d.ts +64 -0
  47. package/lib/generated-structs/OptionalS3OriginProps.js +3 -0
  48. package/lib/generated-structs/OptionalVpcProps.d.ts +224 -0
  49. package/lib/generated-structs/OptionalVpcProps.js +3 -0
  50. package/lib/index.d.ts +35 -0
  51. package/lib/index.js +32 -0
  52. package/lib/lambdas/assets-deployment/assets-deployment-function.d.ts +13 -0
  53. package/lib/lambdas/assets-deployment/assets-deployment-function.js +23 -0
  54. package/lib/lambdas/assets-deployment/assets-deployment.lambda.d.ts +2 -0
  55. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +62 -0
  56. package/lib/lambdas/assets-deployment/common.d.ts +8 -0
  57. package/lib/lambdas/assets-deployment/common.js +32 -0
  58. package/lib/lambdas/assets-deployment/fs-to-fs.d.ts +2 -0
  59. package/lib/lambdas/assets-deployment/fs-to-fs.js +9 -0
  60. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +2 -0
  61. package/lib/lambdas/assets-deployment/fs-to-s3.js +45 -0
  62. package/lib/lambdas/assets-deployment/prune-s3.d.ts +15 -0
  63. package/lib/lambdas/assets-deployment/prune-s3.js +42 -0
  64. package/lib/lambdas/assets-deployment/s3.d.ts +2 -0
  65. package/lib/lambdas/assets-deployment/s3.js +7 -0
  66. package/lib/lambdas/assets-deployment/utils.d.ts +18 -0
  67. package/lib/lambdas/assets-deployment/utils.js +35 -0
  68. package/lib/lambdas/revalidate/revalidate-function.d.ts +13 -0
  69. package/lib/lambdas/revalidate/revalidate-function.js +23 -0
  70. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +2 -0
  71. package/lib/lambdas/revalidate/revalidate.lambda.js +53 -0
  72. package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +13 -0
  73. package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +23 -0
  74. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.d.ts +9 -0
  75. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.js +35 -0
  76. package/lib/lambdas/sign-fn-url/sign-request.d.ts +28 -0
  77. package/lib/lambdas/sign-fn-url/sign-request.js +119 -0
  78. package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +1 -0
  79. package/lib/lambdas/sign-fn-url/sign-request.test.js +129 -0
  80. package/lib/nextjs-assets-deployment.d.ts +116 -0
  81. package/lib/nextjs-assets-deployment.js +93 -0
  82. package/lib/nextjs-build/add-cache-handler.d.ts +1 -0
  83. package/lib/nextjs-build/add-cache-handler.js +23 -0
  84. package/lib/nextjs-build/add-cache-handler.mjs +18 -0
  85. package/lib/nextjs-build/builder.Dockerfile +29 -0
  86. package/lib/nextjs-build/cache-handler.cjs +21513 -0
  87. package/lib/nextjs-build/cache-handler.d.ts +6 -0
  88. package/lib/nextjs-build/cache-handler.js +22 -0
  89. package/lib/nextjs-build/global-containers.Dockerfile +45 -0
  90. package/lib/nextjs-build/global-functions.Dockerfile +46 -0
  91. package/lib/nextjs-build/nextjs-build.d.ts +150 -0
  92. package/lib/nextjs-build/nextjs-build.js +220 -0
  93. package/lib/nextjs-build/regional-containers.Dockerfile +45 -0
  94. package/lib/nextjs-build/symlink-full-route-cache.d.ts +1 -0
  95. package/lib/nextjs-build/symlink-full-route-cache.js +37 -0
  96. package/lib/nextjs-build/symlink-full-route-cache.mjs +23 -0
  97. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +8 -0
  98. package/lib/nextjs-compute/nextjs-compute-base-props.js +3 -0
  99. package/lib/nextjs-compute/nextjs-containers.d.ts +43 -0
  100. package/lib/nextjs-compute/nextjs-containers.js +149 -0
  101. package/lib/nextjs-compute/nextjs-functions.d.ts +23 -0
  102. package/lib/nextjs-compute/nextjs-functions.js +57 -0
  103. package/lib/nextjs-distribution.d.ts +120 -0
  104. package/lib/nextjs-distribution.js +362 -0
  105. package/lib/nextjs-file-system.d.ts +42 -0
  106. package/lib/nextjs-file-system.js +74 -0
  107. package/lib/nextjs-invalidation.d.ts +19 -0
  108. package/lib/nextjs-invalidation.js +52 -0
  109. package/lib/nextjs-revalidation.d.ts +30 -0
  110. package/lib/nextjs-revalidation.js +65 -0
  111. package/lib/nextjs-static-assets.d.ts +21 -0
  112. package/lib/nextjs-static-assets.js +32 -0
  113. package/lib/nextjs-vpc.d.ts +42 -0
  114. package/lib/nextjs-vpc.js +64 -0
  115. package/lib/root-constructs/nextjs-base-overrides.d.ts +26 -0
  116. package/lib/root-constructs/nextjs-base-overrides.js +3 -0
  117. package/lib/root-constructs/nextjs-base-props.d.ts +56 -0
  118. package/lib/root-constructs/nextjs-base-props.js +3 -0
  119. package/lib/root-constructs/nextjs-global-containers.d.ts +74 -0
  120. package/lib/root-constructs/nextjs-global-containers.js +125 -0
  121. package/lib/root-constructs/nextjs-global-functions.d.ts +76 -0
  122. package/lib/root-constructs/nextjs-global-functions.js +131 -0
  123. package/lib/root-constructs/nextjs-regional-containers.d.ts +43 -0
  124. package/lib/root-constructs/nextjs-regional-containers.js +92 -0
  125. package/package.json +165 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signRequest = signRequest;
4
+ exports.getRegionFromLambdaUrl = getRegionFromLambdaUrl;
5
+ exports.cfHeadersToHeaderBag = cfHeadersToHeaderBag;
6
+ exports.headerBagToCfHeaders = headerBagToCfHeaders;
7
+ exports.queryStringToQueryParamBag = queryStringToQueryParamBag;
8
+ // we bundle lambdas during build, so below dependencies actually don't need to be included in "dependencies"
9
+ // eslint-disable-next-line import/no-extraneous-dependencies
10
+ const sha256_js_1 = require("@aws-crypto/sha256-js");
11
+ // eslint-disable-next-line import/no-extraneous-dependencies
12
+ const signature_v4_1 = require("@smithy/signature-v4");
13
+ let sigv4;
14
+ /**
15
+ * Enables use of IAM_AUTH on Lambda Function URL
16
+ * @link https://medium.com/@dario_26152/restrict-access-to-lambda-functionurl-to-cloudfront-using-aws-iam-988583834705
17
+ */
18
+ async function signRequest(request) {
19
+ if (!sigv4) {
20
+ const region = getRegionFromLambdaUrl(request.origin?.custom?.domainName || "");
21
+ sigv4 = getSigV4(region);
22
+ }
23
+ // remove x-forwarded-for b/c it changes from hop to hop
24
+ delete request.headers["x-forwarded-for"];
25
+ const headerBag = cfHeadersToHeaderBag(request.headers);
26
+ const hostname = headerBag.host;
27
+ if (!hostname)
28
+ throw new Error("host header missing");
29
+ let body;
30
+ if (request.body?.data) {
31
+ body = Buffer.from(request.body.data, "base64").toString();
32
+ }
33
+ const params = queryStringToQueryParamBag(request.querystring);
34
+ const signed = await sigv4.sign({
35
+ method: request.method,
36
+ headers: headerBag,
37
+ hostname,
38
+ path: request.uri,
39
+ body,
40
+ query: params,
41
+ protocol: "https",
42
+ });
43
+ request.headers = headerBagToCfHeaders(signed.headers);
44
+ }
45
+ function getSigV4(region) {
46
+ const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
47
+ const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
48
+ const sessionToken = process.env.AWS_SESSION_TOKEN;
49
+ if (!region)
50
+ throw new Error("AWS_REGION missing");
51
+ if (!accessKeyId)
52
+ throw new Error("AWS_ACCESS_KEY_ID missing");
53
+ if (!secretAccessKey)
54
+ throw new Error("AWS_SECRET_ACCESS_KEY missing");
55
+ if (!sessionToken)
56
+ throw new Error("AWS_SESSION_TOKEN missing");
57
+ return new signature_v4_1.SignatureV4({
58
+ service: "lambda",
59
+ region,
60
+ credentials: {
61
+ accessKeyId,
62
+ secretAccessKey,
63
+ sessionToken,
64
+ },
65
+ sha256: sha256_js_1.Sha256,
66
+ });
67
+ }
68
+ function getRegionFromLambdaUrl(url) {
69
+ const region = url.split(".").at(2);
70
+ if (!region)
71
+ throw new Error("Region couldn't be extracted from Lambda Function URL");
72
+ return region;
73
+ }
74
+ /**
75
+ * Converts CloudFront headers (can have array of header values) to simple
76
+ * header bag (object) required by `sigv4.sign`
77
+ *
78
+ * NOTE: only includes headers allowed by origin policy to prevent signature
79
+ * mismatch
80
+ */
81
+ function cfHeadersToHeaderBag(headers) {
82
+ const headerBag = {};
83
+ // assume first header value is the best match
84
+ // headerKey is case insensitive whereas key (adjacent property value that is
85
+ // not destructured) is case sensitive. we arbitrarily use case insensitive key
86
+ for (const [headerKey, [headerObj]] of Object.entries(headers)) {
87
+ const value = headerObj?.value;
88
+ if (value) {
89
+ headerBag[headerKey] = value;
90
+ }
91
+ }
92
+ return headerBag;
93
+ }
94
+ /**
95
+ * Converts simple header bag (object) to CloudFront headers
96
+ */
97
+ function headerBagToCfHeaders(headerBag) {
98
+ const cfHeaders = {};
99
+ for (const [headerKey, value] of Object.entries(headerBag)) {
100
+ /*
101
+ When your Lambda function adds or modifies request headers and you don't include the header key field, Lambda@Edge automatically inserts a header key using the header name that you provide. Regardless of how you've formatted the header name, the header key that's inserted automatically is formatted with initial capitalization for each part, separated by hyphens (-).
102
+ See: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html
103
+ */
104
+ cfHeaders[headerKey] = [{ value }];
105
+ }
106
+ return cfHeaders;
107
+ }
108
+ /**
109
+ * Converts CloudFront querystring to QueryParamaterBag for IAM Sig V4
110
+ */
111
+ function queryStringToQueryParamBag(querystring) {
112
+ const oldParams = new URLSearchParams(querystring);
113
+ const newParams = {};
114
+ for (const [k, v] of oldParams) {
115
+ newParams[k] = v;
116
+ }
117
+ return newParams;
118
+ }
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsa0NBMkJDO0FBc0JELHdEQUtDO0FBYUQsb0RBWUM7QUFLRCxvREFVQztBQUtELGdFQU9DO0FBdkhELDZHQUE2RztBQUM3Ryw2REFBNkQ7QUFDN0QscURBQStDO0FBQy9DLDZEQUE2RDtBQUM3RCx1REFBbUQ7QUFHbkQsSUFBSSxLQUFrQixDQUFDO0FBRXZCOzs7R0FHRztBQUNJLEtBQUssVUFBVSxXQUFXLENBQUMsT0FBMEI7SUFDMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQ25DLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQ3pDLENBQUM7UUFDRixLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCx3REFBd0Q7SUFDeEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDaEMsSUFBSSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDdEQsSUFBSSxJQUF3QixDQUFDO0lBQzdCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lB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QUFDLFdBQW1CO0lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztJQUMxQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDL0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHdlIGJ1bmRsZSBsYW1iZGFzIGR1cmluZyBidWlsZCwgc28gYmVsb3cgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IGRvbid0IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gXCJkZXBlbmRlbmNpZXNcIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgU2hhMjU2IH0gZnJvbSBcIkBhd3MtY3J5cHRvL3NoYTI1Ni1qc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgU2lnbmF0dXJlVjQgfSBmcm9tIFwiQHNtaXRoeS9zaWduYXR1cmUtdjRcIjtcbmltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udEhlYWRlcnMsIENsb3VkRnJvbnRSZXF1ZXN0IH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcblxubGV0IHNpZ3Y0OiBTaWduYXR1cmVWNDtcblxuLyoqXG4gKiBFbmFibGVzIHVzZSBvZiBJQU1fQVVUSCBvbiBMYW1iZGEgRnVuY3Rpb24gVVJMXG4gKiBAbGluayBodHRwczovL21lZGl1bS5jb20vQGRhcmlvXzI2MTUyL3Jlc3RyaWN0LWFjY2Vzcy10by1sYW1iZGEtZnVuY3Rpb251cmwtdG8tY2xvdWRmcm9udC11c2luZy1hd3MtaWFtLTk4ODU4MzgzNDcwNVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblJlcXVlc3QocmVxdWVzdDogQ2xvdWRGcm9udFJlcXVlc3QpIHtcbiAgaWYgKCFzaWd2NCkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGdldFJlZ2lvbkZyb21MYW1iZGFVcmwoXG4gICAgICByZXF1ZXN0Lm9yaWdpbj8uY3VzdG9tPy5kb21haW5OYW1lIHx8IFwiXCIsXG4gICAgKTtcbiAgICBzaWd2NCA9IGdldFNpZ1Y0KHJlZ2lvbik7XG4gIH1cbiAgLy8gcmVtb3ZlIHgtZm9yd2FyZGVkLWZvciBiL2MgaXQgY2hhbmdlcyBmcm9tIGhvcCB0byBob3BcbiAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWZvclwiXTtcbiAgY29uc3QgaGVhZGVyQmFnID0gY2ZIZWFkZXJzVG9IZWFkZXJCYWcocmVxdWVzdC5oZWFkZXJzKTtcbiAgY29uc3QgaG9zdG5hbWUgPSBoZWFkZXJCYWcuaG9zdDtcbiAgaWYgKCFob3N0bmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiaG9zdCBoZWFkZXIgbWlzc2luZ1wiKTtcbiAgbGV0IGJvZHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVlc3QuYm9keT8uZGF0YSkge1xuICAgIGJvZHkgPSBCdWZmZXIuZnJvbShyZXF1ZXN0LmJvZHkuZGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBxdWVyeVN0cmluZ1RvUXVlcnlQYXJhbUJhZyhyZXF1ZXN0LnF1ZXJ5c3RyaW5nKTtcbiAgY29uc3Qgc2lnbmVkID0gYXdhaXQgc2lndjQuc2lnbih7XG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICBoZWFkZXJzOiBoZWFkZXJCYWcsXG4gICAgaG9zdG5hbWUsXG4gICAgcGF0aDogcmVxdWVzdC51cmksXG4gICAgYm9keSxcbiAgICBxdWVyeTogcGFyYW1zLFxuICAgIHByb3RvY29sOiBcImh0dHBzXCIsXG4gIH0pO1xuICByZXF1ZXN0LmhlYWRlcnMgPSBoZWFkZXJCYWdUb0NmSGVhZGVycyhzaWduZWQuaGVhZGVycyk7XG59XG5cbmZ1bmN0aW9uIGdldFNpZ1Y0KHJlZ2lvbjogc3RyaW5nKTogU2lnbmF0dXJlVjQge1xuICBjb25zdCBhY2Nlc3NLZXlJZCA9IHByb2Nlc3MuZW52LkFXU19BQ0NFU1NfS0VZX0lEO1xuICBjb25zdCBzZWNyZXRBY2Nlc3NLZXkgPSBwcm9jZXNzLmVudi5BV1NfU0VDUkVUX0FDQ0VTU19LRVk7XG4gIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHByb2Nlc3MuZW52LkFXU19TRVNTSU9OX1RPS0VOO1xuICBpZiAoIXJlZ2lvbikgdGhyb3cgbmV3IEVycm9yKFwiQVdTX1JFR0lPTiBtaXNzaW5nXCIpO1xuICBpZiAoIWFjY2Vzc0tleUlkKSB0aHJvdyBuZXcgRXJyb3IoXCJBV1NfQUNDRVNTX0tFWV9JRCBtaXNzaW5nXCIpO1xuICBpZiAoIXNlY3JldEFjY2Vzc0tleSkgdGhyb3cgbmV3IEVycm9yKFwiQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZIG1pc3NpbmdcIik7XG4gIGlmICghc2Vzc2lvblRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJBV1NfU0VTU0lPTl9UT0tFTiBtaXNzaW5nXCIpO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZVY0KHtcbiAgICBzZXJ2aWNlOiBcImxhbWJkYVwiLFxuICAgIHJlZ2lvbixcbiAgICBjcmVkZW50aWFsczoge1xuICAgICAgYWNjZXNzS2V5SWQsXG4gICAgICBzZWNyZXRBY2Nlc3NLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgfSxcbiAgICBzaGEyNTY6IFNoYTI1NixcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpb25Gcm9tTGFtYmRhVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaW9uID0gdXJsLnNwbGl0KFwiLlwiKS5hdCgyKTtcbiAgaWYgKCFyZWdpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVnaW9uIGNvdWxkbid0IGJlIGV4dHJhY3RlZCBmcm9tIExhbWJkYSBGdW5jdGlvbiBVUkxcIik7XG4gIHJldHVybiByZWdpb247XG59XG5cbi8qKlxuICogQmFnIG9yIE1hcCB1c2VkIGZvciBIZWFkZXJCYWcgb3IgUXVlcnlTdHJpbmdQYXJhbWV0ZXJCYWcgZm9yIGBzaWd2NC5zaWduKClgXG4gKi9cbnR5cGUgQmFnID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbi8qKlxuICogQ29udmVydHMgQ2xvdWRGcm9udCBoZWFkZXJzIChjYW4gaGF2ZSBhcnJheSBvZiBoZWFkZXIgdmFsdWVzKSB0byBzaW1wbGVcbiAqIGhlYWRlciBiYWcgKG9iamVjdCkgcmVxdWlyZWQgYnkgYHNpZ3Y0LnNpZ25gXG4gKlxuICogTk9URTogb25seSBpbmNsdWRlcyBoZWFkZXJzIGFsbG93ZWQgYnkgb3JpZ2luIHBvbGljeSB0byBwcmV2ZW50IHNpZ25hdHVyZVxuICogbWlzbWF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNmSGVhZGVyc1RvSGVhZGVyQmFnKGhlYWRlcnM6IENsb3VkRnJvbnRIZWFkZXJzKTogQmFnIHtcbiAgY29uc3QgaGVhZGVyQmFnOiBCYWcgPSB7fTtcbiAgLy8gYXNzdW1lIGZpcnN0IGhlYWRlciB2YWx1ZSBpcyB0aGUgYmVzdCBtYXRjaFxuICAvLyBoZWFkZXJLZXkgaXMgY2FzZSBpbnNlbnNpdGl2ZSB3aGVyZWFzIGtleSAoYWRqYWNlbnQgcHJvcGVydHkgdmFsdWUgdGhhdCBpc1xuICAvLyBub3QgZGVzdHJ1Y3R1cmVkKSBpcyBjYXNlIHNlbnNpdGl2ZS4gd2UgYXJiaXRyYXJpbHkgdXNlIGNhc2UgaW5zZW5zaXRpdmUga2V5XG4gIGZvciAoY29uc3QgW2hlYWRlcktleSwgW2hlYWRlck9ial1dIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBoZWFkZXJPYmo/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaGVhZGVyQmFnW2hlYWRlcktleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhlYWRlckJhZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBzaW1wbGUgaGVhZGVyIGJhZyAob2JqZWN0KSB0byBDbG91ZEZyb250IGhlYWRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlckJhZ1RvQ2ZIZWFkZXJzKGhlYWRlckJhZzogQmFnKTogQ2xvdWRGcm9udEhlYWRlcnMge1xuICBjb25zdCBjZkhlYWRlcnM6IENsb3VkRnJvbnRIZWFkZXJzID0ge307XG4gIGZvciAoY29uc3QgW2hlYWRlcktleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlckJhZykpIHtcbiAgICAvKlxuICAgICAgV2hlbiB5b3VyIExhbWJkYSBmdW5jdGlvbiBhZGRzIG9yIG1vZGlmaWVzIHJlcXVlc3QgaGVhZGVycyBhbmQgeW91IGRvbid0IGluY2x1ZGUgdGhlIGhlYWRlciBrZXkgZmllbGQsIExhbWJkYUBFZGdlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0cyBhIGhlYWRlciBrZXkgdXNpbmcgdGhlIGhlYWRlciBuYW1lIHRoYXQgeW91IHByb3ZpZGUuIFJlZ2FyZGxlc3Mgb2YgaG93IHlvdSd2ZSBmb3JtYXR0ZWQgdGhlIGhlYWRlciBuYW1lLCB0aGUgaGVhZGVyIGtleSB0aGF0J3MgaW5zZXJ0ZWQgYXV0b21hdGljYWxseSBpcyBmb3JtYXR0ZWQgd2l0aCBpbml0aWFsIGNhcGl0YWxpemF0aW9uIGZvciBlYWNoIHBhcnQsIHNlcGFyYXRlZCBieSBoeXBoZW5zICgtKS5cbiAgICAgIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2xhbWJkYS1ldmVudC1zdHJ1Y3R1cmUuaHRtbFxuICAgICovXG4gICAgY2ZIZWFkZXJzW2hlYWRlcktleV0gPSBbeyB2YWx1ZSB9XTtcbiAgfVxuICByZXR1cm4gY2ZIZWFkZXJzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIENsb3VkRnJvbnQgcXVlcnlzdHJpbmcgdG8gUXVlcnlQYXJhbWF0ZXJCYWcgZm9yIElBTSBTaWcgVjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nVG9RdWVyeVBhcmFtQmFnKHF1ZXJ5c3RyaW5nOiBzdHJpbmcpOiBCYWcge1xuICBjb25zdCBvbGRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5c3RyaW5nKTtcbiAgY29uc3QgbmV3UGFyYW1zOiBCYWcgPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2Ygb2xkUGFyYW1zKSB7XG4gICAgbmV3UGFyYW1zW2tdID0gdjtcbiAgfVxuICByZXR1cm4gbmV3UGFyYW1zO1xufVxuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sign_request_1 = require("./sign-request");
4
+ describe("LambdaOriginRequestIamAuth", () => {
5
+ test("signRequest should add x-amz headers", async () => {
6
+ // dummy AWS credentials
7
+ process.env = { ...process.env, ...getFakeAwsCreds() };
8
+ const event = getFakePageRequest();
9
+ const request = event.Records[0]?.cf.request;
10
+ if (!request)
11
+ throw new Error("Missing request");
12
+ await (0, sign_request_1.signRequest)(request);
13
+ const securityHeaders = [
14
+ "x-amz-date",
15
+ "x-amz-security-token",
16
+ "x-amz-content-sha256",
17
+ "authorization",
18
+ ];
19
+ const hasSignedHeaders = securityHeaders.every((h) => h in request.headers);
20
+ expect(hasSignedHeaders).toBe(true);
21
+ });
22
+ test("getRegionFromLambdaUrl should correctly get region", () => {
23
+ const event = getFakePageRequest();
24
+ const request = event.Records[0]?.cf.request;
25
+ if (!request)
26
+ throw new Error("Missing request");
27
+ const actual = (0, sign_request_1.getRegionFromLambdaUrl)(request.origin?.custom?.domainName || "");
28
+ expect(actual).toBe("us-east-1");
29
+ });
30
+ });
31
+ function getFakePageRequest() {
32
+ return {
33
+ Records: [
34
+ {
35
+ cf: {
36
+ config: {
37
+ distributionDomainName: "d6b8brjqfujeb.cloudfront.net",
38
+ distributionId: "EHX2SDUU61T7U",
39
+ eventType: "origin-request",
40
+ requestId: "",
41
+ },
42
+ request: {
43
+ clientIp: "1.1.1.1",
44
+ headers: {
45
+ host: [
46
+ {
47
+ key: "Host",
48
+ value: "d6b8brjqfujeb.cloudfront.net",
49
+ },
50
+ ],
51
+ "accept-language": [
52
+ {
53
+ key: "Accept-Language",
54
+ value: "en-US,en;q=0.9",
55
+ },
56
+ ],
57
+ referer: [
58
+ {
59
+ key: "Referer",
60
+ value: "https://d6b8brjqfujeb.cloudfront.net/some/path",
61
+ },
62
+ ],
63
+ "x-forwarded-for": [
64
+ {
65
+ key: "X-Forwarded-For",
66
+ value: "1.1.1.1",
67
+ },
68
+ ],
69
+ "user-agent": [
70
+ {
71
+ key: "User-Agent",
72
+ value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
73
+ },
74
+ ],
75
+ via: [
76
+ {
77
+ key: "Via",
78
+ value: "2.0 8bf94e29f889f8d0076c4502ae008b58.cloudfront.net (CloudFront)",
79
+ },
80
+ ],
81
+ "accept-encoding": [
82
+ {
83
+ key: "Accept-Encoding",
84
+ value: "br,gzip",
85
+ },
86
+ ],
87
+ "sec-ch-ua": [
88
+ {
89
+ key: "sec-ch-ua",
90
+ value: '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
91
+ },
92
+ ],
93
+ },
94
+ method: "GET",
95
+ querystring: "",
96
+ uri: "/some/path",
97
+ origin: {
98
+ custom: {
99
+ customHeaders: {},
100
+ domainName: "kjtbbx7u533q7p7n5font6gpci0phrng.lambda-url.us-east-1.on.aws",
101
+ keepaliveTimeout: 5,
102
+ path: "",
103
+ port: 443,
104
+ protocol: "https",
105
+ readTimeout: 30,
106
+ sslProtocols: ["TLSv1.2"],
107
+ },
108
+ },
109
+ body: {
110
+ action: "read-only",
111
+ data: "",
112
+ encoding: "base64",
113
+ inputTruncated: false,
114
+ },
115
+ },
116
+ },
117
+ },
118
+ ],
119
+ };
120
+ }
121
+ function getFakeAwsCreds() {
122
+ return {
123
+ AWS_REGION: "us-east-1",
124
+ AWS_ACCESS_KEY_ID: "AKIAIOSFODNN7EXAMPLE",
125
+ AWS_SECRET_ACCESS_KEY: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
126
+ AWS_SESSION_TOKEN: "ZQoJb3JpZ2luX2VjEFgaCXVzLWVhc3QtMSJGMEQCIHijzdTXh59aSe2hRfCWpFd2/jacPUC+8rCq3qBIiuG2AiAGX8jqld+p04nPYfuShi1lLN/Z1hEXG9QSNEmEFLTxGSqmAgiR//////////8BEAIaDDI2ODkxNDQ2NTIzMSIMrAMO5/GTvMgoG+chKvoB4f4V1TfkZiHOlmeMK6Ep58mav65A0WU3K9WPzdrJojnGqqTuS85zTlKhm3lfmMxCOtwS/OlOuiBQ1MZNlksK2je1FazgbXN46fNSi+iHiY9VfyRAd0wSLmXB8FFrCGsU92QOy/+deji0qIVadsjEyvBRxzQj5oIUI5sb74Yt7uNvka9fVZcT4s4IndYda0N7oZwIrApCuzzBMuoMAhabmgVrZTbiLmvOiFHS2XZWBySABdygqaIzfV7G4hjckvcXhtxpkw+HJUZTNzVUlspghzte1UG6VvIRV8ax3kWA3zqm8nA/1gHkl40DubJIXz1AJbg5Cps5moE1pjD7vNijBjqeAZh0Q/e0awIHnV4dXMfXUu5mWJ7Db9K1eUlSSL9FyiKeKd94HEdrbIrnPuIWVT/I/5RjNm7NgPYiqmpyx3fSpVcq9CKws0oEfBw6J9Hxk0IhV8yWFZYNMWIarUUZdmL9vVeJmFZmwyL4JjY1s/SZIU/oa8DtvkmP4RG4tTJfpyyhoKL0wJOevkYyoigNllBlLN59SZAT8CCADpN/B+sK",
127
+ };
128
+ }
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1yZXF1ZXN0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLXJlcXVlc3QudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUFxRTtBQUVyRSxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCx3QkFBd0I7UUFDeEIsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFBLDBCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsTUFBTSxlQUFlLEdBQUc7WUFDdEIsWUFBWTtZQUNaLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsZUFBZTtTQUNoQixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDOUQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxN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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZyb250UmVxdWVzdEV2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IGdldFJlZ2lvbkZyb21MYW1iZGFVcmwsIHNpZ25SZXF1ZXN0IH0gZnJvbSBcIi4vc2lnbi1yZXF1ZXN0XCI7XG5cbmRlc2NyaWJlKFwiTGFtYmRhT3JpZ2luUmVxdWVzdElhbUF1dGhcIiwgKCkgPT4ge1xuICB0ZXN0KFwic2lnblJlcXVlc3Qgc2hvdWxkIGFkZCB4LWFteiBoZWFkZXJzXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBkdW1teSBBV1MgY3JlZGVudGlhbHNcbiAgICBwcm9jZXNzLmVudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmdldEZha2VBd3NDcmVkcygpIH07XG4gICAgY29uc3QgZXZlbnQgPSBnZXRGYWtlUGFnZVJlcXVlc3QoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXT8uY2YucmVxdWVzdDtcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmVxdWVzdFwiKTtcbiAgICBhd2FpdCBzaWduUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCBzZWN1cml0eUhlYWRlcnMgPSBbXG4gICAgICBcIngtYW16LWRhdGVcIixcbiAgICAgIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbiAgICAgIFwieC1hbXotY29udGVudC1zaGEyNTZcIixcbiAgICAgIFwiYXV0aG9yaXphdGlvblwiLFxuICAgIF07XG4gICAgY29uc3QgaGFzU2lnbmVkSGVhZGVycyA9IHNlY3VyaXR5SGVhZGVycy5ldmVyeSgoaCkgPT4gaCBpbiByZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGV4cGVjdChoYXNTaWduZWRIZWFkZXJzKS50b0JlKHRydWUpO1xuICB9KTtcblxuICB0ZXN0KFwiZ2V0UmVnaW9uRnJvbUxhbWJkYVVybCBzaG91bGQgY29ycmVjdGx5IGdldCByZWdpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0gZ2V0RmFrZVBhZ2VSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LlJlY29yZHNbMF0/LmNmLnJlcXVlc3Q7XG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVlc3RcIik7XG4gICAgY29uc3QgYWN0dWFsID0gZ2V0UmVnaW9uRnJvbUxhbWJkYVVybChcbiAgICAgIHJlcXVlc3Qub3JpZ2luPy5jdXN0b20/LmRvbWFpbk5hbWUgfHwgXCJcIixcbiAgICApO1xuICAgIGV4cGVjdChhY3R1YWwpLnRvQmUoXCJ1cy1lYXN0LTFcIik7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIGdldEZha2VQYWdlUmVxdWVzdCgpOiBDbG91ZEZyb250UmVxdWVzdEV2ZW50IHtcbiAgcmV0dXJuIHtcbiAgICBSZWNvcmRzOiBbXG4gICAgICB7XG4gICAgICAgIGNmOiB7XG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICBkaXN0cmlidXRpb25Eb21haW5OYW1lOiBcImQ2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXRcIixcbiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbklkOiBcIkVIWDJTRFVVNjFUN1VcIixcbiAgICAgICAgICAgIGV2ZW50VHlwZTogXCJvcmlnaW4tcmVxdWVzdFwiLFxuICAgICAgICAgICAgcmVxdWVzdElkOiBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgY2xpZW50SXA6IFwiMS4xLjEuMVwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBob3N0OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkhvc3RcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImQ2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcImFjY2VwdC1sYW5ndWFnZVwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkFjY2VwdC1MYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiZW4tVVMsZW47cT0wLjlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWZlcmVyOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlJlZmVyZXJcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImh0dHBzOi8vZDZiOGJyanFmdWplYi5jbG91ZGZyb250Lm5ldC9zb21lL3BhdGhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcIngtZm9yd2FyZGVkLWZvclwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlgtRm9yd2FyZGVkLUZvclwiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiMS4xLjEuMVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFwidXNlci1hZ2VudFwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlVzZXItQWdlbnRcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTMuMC4wLjAgU2FmYXJpLzUzNy4zNlwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHZpYTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogXCJWaWFcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBcIjIuMCA4YmY5NGUyOWY4ODlmOGQwMDc2YzQ1MDJhZTAwOGI1OC5jbG91ZGZyb250Lm5ldCAoQ2xvdWRGcm9udClcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYnIsZ3ppcFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFwic2VjLWNoLXVhXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6IFwic2VjLWNoLXVhXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgJ1wiR29vZ2xlIENocm9tZVwiO3Y9XCIxMTNcIiwgXCJDaHJvbWl1bVwiO3Y9XCIxMTNcIiwgXCJOb3QtQS5CcmFuZFwiO3Y9XCIyNFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBcIlwiLFxuICAgICAgICAgICAgdXJpOiBcIi9zb21lL3BhdGhcIixcbiAgICAgICAgICAgIG9yaWdpbjoge1xuICAgICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgICBjdXN0b21IZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOlxuICAgICAgICAgICAgICAgICAgXCJranRiYng3dTUzM3E3cDduNWZvbnQ2Z3BjaTBwaHJuZy5sYW1iZGEtdXJsLnVzLWVhc3QtMS5vbi5hd3NcIixcbiAgICAgICAgICAgICAgICBrZWVwYWxpdmVUaW1lb3V0OiA1LFxuICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcG9ydDogNDQzLFxuICAgICAgICAgICAgICAgIHByb3RvY29sOiBcImh0dHBzXCIsXG4gICAgICAgICAgICAgICAgcmVhZFRpbWVvdXQ6IDMwLFxuICAgICAgICAgICAgICAgIHNzbFByb3RvY29sczogW1wiVExTdjEuMlwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGFjdGlvbjogXCJyZWFkLW9ubHlcIixcbiAgICAgICAgICAgICAgZGF0YTogXCJcIixcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgICAgICAgICAgIGlucHV0VHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RmFrZUF3c0NyZWRzKCkge1xuICByZXR1cm4ge1xuICAgIEFXU19SRUdJT046IFwidXMtZWFzdC0xXCIsXG4gICAgQVdTX0FDQ0VTU19LRVlfSUQ6IFwiQUtJQUlPU0ZPRE5ON0VYQU1QTEVcIixcbiAgICBBV1NfU0VDUkVUX0FDQ0VTU19LRVk6IFwid0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWVwiLFxuICAgIEFXU19TRVNTSU9OX1RPS0VOOlxuICAgICAgXCJaUW9KYjNKcFoybHVYMlZqRUZnYUNYVnpMV1ZoYzNRdE1TSkdNRVFDSUhpanpkVFhoNTlhU2UyaFJmQ1dwRmQyL2phY1BVQys4ckNxM3FCSWl1RzJBaUFHWDhqcWxkK3AwNG5QWWZ1U2hpMWxMTi9aMWhFWEc5UVNORW1FRkxUeEdTcW1BZ2lSLy8vLy8vLy8vLzhCRUFJYURESTJPRGt4TkRRMk5USXpNU0lNckFNTzUvR1R2TWdvRytjaEt2b0I0ZjRWMVRma1ppSE9sbWVNSzZFcDU4bWF2NjVBMFdVM0s5V1B6ZHJKb2puR3FxVHVTODV6VGxLaG0zbGZtTXhDT3R3Uy9PbE91aUJRMU1aTmxrc0syamUxRmF6Z2JYTjQ2Zk5TaStpSGlZOVZmeVJBZDB3U0xtWEI4RkZyQ0dzVTkyUU95LytkZWppMHFJVmFkc2pFeXZCUnh6UWo1b0lVSTVzYjc0WXQ3dU52a2E5ZlZaY1Q0czRJbmRZZGEwTjdvWndJckFwQ3V6ekJNdW9NQWhhYm1nVnJaVGJpTG12T2lGSFMyWFpXQnlTQUJkeWdxYUl6ZlY3RzRoamNrdmNYaHR4cGt3K0hKVVpUTnpWVWxzcGdoenRlMVVHNlZ2SVJWOGF4M2tXQTN6cW04bkEvMWdIa2w0MER1YkpJWHoxQUpiZzVDcHM1bW9FMXBqRDd2TmlqQmpxZUFaaDBRL2UwYXdJSG5WNGRYTWZYVXU1bVdKN0RiOUsxZVVsU1NMOUZ5aUtlS2Q5NEhFZHJiSXJuUHVJV1ZUL0kvNVJqTm03TmdQWWlxbXB5eDNmU3BWY3E5Q0t3czBvRWZCdzZKOUh4azBJaFY4eVdGWllOTVdJYXJVVVpkbUw5dlZlSm1GWm13eUw0SmpZMXMvU1pJVS9vYThEdHZrbVA0Ukc0dFRKZnB5eWhvS0wwd0pPZXZrWXlvaWdObGxCbExONTlTWkFUOENDQURwTi9CK3NLXCIsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,116 @@
1
+ import { CustomResource } from "aws-cdk-lib";
2
+ import { IVpc } from "aws-cdk-lib/aws-ec2";
3
+ import { AccessPoint } from "aws-cdk-lib/aws-efs";
4
+ import { DockerImageCode, DockerImageFunction } from "aws-cdk-lib/aws-lambda";
5
+ import { Bucket } from "aws-cdk-lib/aws-s3";
6
+ import { Construct } from "constructs";
7
+ import { OptionalDockerImageFunctionProps } from "./generated-structs/OptionalDockerImageFunctionProps";
8
+ import { NextjsBuild } from "./nextjs-build/nextjs-build";
9
+ export interface NextjsAssetDeploymentOverrides {
10
+ readonly dockerImageFunctionProps?: OptionalDockerImageFunctionProps;
11
+ }
12
+ export interface NextjsAssetsDeploymentProps {
13
+ readonly accessPoint: AccessPoint;
14
+ /**
15
+ * @see {@link NextjsBuild.buildImageDigest}
16
+ */
17
+ readonly buildImageDigest: string;
18
+ /**
19
+ * @default true
20
+ */
21
+ readonly debug?: boolean;
22
+ readonly dockerImageCode: DockerImageCode;
23
+ /**
24
+ * @see {@link NextjsBuild.containerMountPathForEfs}
25
+ */
26
+ readonly containerMountPathForEfs: NextjsBuild["containerMountPathForEfs"];
27
+ readonly overrides?: NextjsAssetDeploymentOverrides;
28
+ /**
29
+ * @see {@link NextjsBaseProps.relativePathToWorkspace}
30
+ */
31
+ readonly relativePathToWorkspace?: string;
32
+ /**
33
+ * Required for `NextjsType.GlobalFunctions` and `NextjsType.GlobalContainers`
34
+ */
35
+ readonly staticAssetsBucket?: Bucket;
36
+ readonly vpc: IVpc;
37
+ }
38
+ /**
39
+ * @internal
40
+ */
41
+ export interface FsToS3Action {
42
+ type: "fs-to-s3";
43
+ destinationBucketName: string;
44
+ destinationKeyPrefix?: string;
45
+ sourcePath: string;
46
+ }
47
+ /**
48
+ * @internal
49
+ */
50
+ export interface FsToFsAction {
51
+ type: "fs-to-fs";
52
+ sourcePath: string;
53
+ destinationPath: string;
54
+ }
55
+ /**
56
+ * @internal
57
+ */
58
+ export interface PruneS3Action {
59
+ type: "prune-s3";
60
+ /**
61
+ * The minimum previous deployment count to prune
62
+ * @default 3
63
+ */
64
+ minPreviousDeployCountToPrune: number;
65
+ /**
66
+ * The minimum previous deployment date to prune
67
+ * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
68
+ */
69
+ minPreviousDeployDateToPrune: string;
70
+ bucketName: string;
71
+ bucketPrefix?: string;
72
+ }
73
+ /**
74
+ * @internal
75
+ */
76
+ export interface PruneFsAction {
77
+ type: "prune-fs";
78
+ /**
79
+ * The minimum previous deployment count to prune
80
+ * @default 3
81
+ */
82
+ minPreviousDeployCountToPrune: number;
83
+ /**
84
+ * The minimum previous deployment date to prune
85
+ * @default new Date(new Date().setMonth(new Date().getMonth() - 1))
86
+ */
87
+ minPreviousDeployDateToPrune: string;
88
+ directory: string;
89
+ }
90
+ /**
91
+ * @internal
92
+ */
93
+ export interface CustomResourceProperties {
94
+ actions: (FsToS3Action | FsToFsAction | PruneS3Action | PruneFsAction)[];
95
+ /**
96
+ * {@link NextjsAssetDeploymentProps.builderImageDigest}
97
+ */
98
+ buildImageDigest: string;
99
+ imageCachePath: string;
100
+ prerenderManifestPath: string;
101
+ }
102
+ /**
103
+ * Deploys static assets to S3 and cache assets to EFS in Lambda Custom Resource.
104
+ */
105
+ export declare class NextjsAssetsDeployment extends Construct {
106
+ customResource: CustomResource;
107
+ dockerImageFunction: DockerImageFunction;
108
+ /**
109
+ * Only used for `NextjsGlobalFunctions`
110
+ */
111
+ previewModeId: string;
112
+ private props;
113
+ constructor(scope: Construct, id: string, props: NextjsAssetsDeploymentProps);
114
+ private createFunction;
115
+ private createCustomResource;
116
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsAssetsDeployment = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const posix_1 = require("path/posix");
7
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
8
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
9
+ const constructs_1 = require("constructs");
10
+ const common_1 = require("./common");
11
+ /**
12
+ * Deploys static assets to S3 and cache assets to EFS in Lambda Custom Resource.
13
+ */
14
+ class NextjsAssetsDeployment extends constructs_1.Construct {
15
+ constructor(scope, id, props) {
16
+ super(scope, id);
17
+ this.props = props;
18
+ this.dockerImageFunction = this.createFunction();
19
+ this.customResource = this.createCustomResource();
20
+ this.previewModeId = this.customResource.getAttString("previewModeId");
21
+ }
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
+ const fn = new aws_lambda_1.DockerImageFunction(this, "Fn", {
31
+ architecture,
32
+ code: this.props.dockerImageCode,
33
+ memorySize: 2048,
34
+ filesystem: aws_lambda_1.FileSystem.fromEfsAccessPoint(this.props.accessPoint, this.props.containerMountPathForEfs),
35
+ vpc: this.props.vpc,
36
+ timeout: aws_cdk_lib_1.Duration.minutes(5),
37
+ ...this.props.overrides?.dockerImageFunctionProps,
38
+ });
39
+ if (this.props.debug !== false) {
40
+ fn.addEnvironment("DEBUG", "1");
41
+ }
42
+ if (this.props.staticAssetsBucket) {
43
+ this.props.staticAssetsBucket.grantReadWrite(fn);
44
+ }
45
+ return fn;
46
+ }
47
+ createCustomResource() {
48
+ const root = "/app";
49
+ const actions = [];
50
+ if (this.props.staticAssetsBucket?.bucketName) {
51
+ actions.push({
52
+ type: "fs-to-s3",
53
+ sourcePath: (0, posix_1.join)(root, "public"),
54
+ destinationBucketName: this.props.staticAssetsBucket.bucketName,
55
+ },
56
+ // static files
57
+ {
58
+ type: "fs-to-s3",
59
+ sourcePath: (0, posix_1.join)(root, ".next", "static"),
60
+ destinationBucketName: this.props.staticAssetsBucket.bucketName,
61
+ destinationKeyPrefix: "_next/static",
62
+ });
63
+ }
64
+ actions.push(
65
+ // data cache - https://nextjs.org/docs/app/building-your-application/caching#data-cache
66
+ {
67
+ type: "fs-to-fs",
68
+ sourcePath: (0, posix_1.join)(root, ".next", "cache", "fetch-cache"),
69
+ destinationPath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.DATA_CACHE_DIR),
70
+ },
71
+ // full route cache - https://nextjs.org/docs/app/building-your-application/caching#full-route-cache
72
+ {
73
+ type: "fs-to-fs",
74
+ sourcePath: (0, posix_1.join)(root, ".next", "standalone", this.props.relativePathToWorkspace || "", ".next", "server", "app"),
75
+ destinationPath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.FULL_ROUTE_CACHE_DIR),
76
+ });
77
+ const properties = {
78
+ actions,
79
+ buildImageDigest: this.props.buildImageDigest,
80
+ imageCachePath: (0, posix_1.join)(this.props.containerMountPathForEfs, common_1.IMAGE_CACHE_DIR),
81
+ prerenderManifestPath: (0, posix_1.join)(root, ".next", "prerender-manifest.json"),
82
+ };
83
+ return new aws_cdk_lib_1.CustomResource(this, "CustomResource", {
84
+ properties,
85
+ resourceType: "Custom::NextjsAssetsDeployment",
86
+ serviceToken: this.dockerImageFunction.functionArn,
87
+ });
88
+ }
89
+ }
90
+ exports.NextjsAssetsDeployment = NextjsAssetsDeployment;
91
+ _a = JSII_RTTI_SYMBOL_1;
92
+ NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.0.0" };
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBS2dDO0FBRWhDLDJDQUF1QztBQUN2QyxxQ0FJa0I7QUFzR2xCOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQVVuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksWUFBWSxHQUE2QixTQUFTLENBQUM7UUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVk7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2hDLFVBQVUs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WSxFQUFFLGdDQUFnQztZQUM5QyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVc7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFoSEgsd0RBaUhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQWNjZXNzUG9pbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBEb2NrZXJJbWFnZUNvZGUsXG4gIERvY2tlckltYWdlRnVuY3Rpb24sXG4gIEZpbGVTeXN0ZW0sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgREFUQV9DQUNIRV9ESVIsXG4gIEZVTExfUk9VVEVfQ0FDSEVfRElSLFxuICBJTUFHRV9DQUNIRV9ESVIsXG59IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtcHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldERlcGxveW1lbnRPdmVycmlkZXMge1xuICByZWFkb25seSBkb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMge1xuICByZWFkb25seSBhY2Nlc3NQb2ludDogQWNjZXNzUG9pbnQ7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5idWlsZEltYWdlRGlnZXN0fVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU6IERvY2tlckltYWdlQ29kZTsgLy8gVE9ETzogcmVtb3ZlIGFuZCBidWlsZCBmcm9tIGNvbW1vbiBidWlsZGVyIGJhc2U/XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnN9XG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IE5leHRqc0J1aWxkW1wiY29udGFpbmVyTW91bnRQYXRoRm9yRWZzXCJdO1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNBc3NldERlcGxveW1lbnRPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2V9XG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGZvciBgTmV4dGpzVHlwZS5HbG9iYWxGdW5jdGlvbnNgIGFuZCBgTmV4dGpzVHlwZS5HbG9iYWxDb250YWluZXJzYFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0PzogQnVja2V0O1xuICByZWFkb25seSB2cGM6IElWcGM7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnNUb1MzQWN0aW9uIHtcbiAgdHlwZTogXCJmcy10by1zM1wiO1xuICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHN0cmluZztcbiAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg6IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnNUb0ZzQWN0aW9uIHtcbiAgdHlwZTogXCJmcy10by1mc1wiO1xuICBzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcnVuZVMzQWN0aW9uIHtcbiAgdHlwZTogXCJwcnVuZS1zM1wiO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gcHJldmlvdXMgZGVwbG95bWVudCBjb3VudCB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCAzXG4gICAqL1xuICBtaW5QcmV2aW91c0RlcGxveUNvdW50VG9QcnVuZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gcHJldmlvdXMgZGVwbG95bWVudCBkYXRlIHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IG5ldyBEYXRlKG5ldyBEYXRlKCkuc2V0TW9udGgobmV3IERhdGUoKS5nZXRNb250aCgpIC0gMSkpXG4gICAqL1xuICBtaW5QcmV2aW91c0RlcGxveURhdGVUb1BydW5lOiBzdHJpbmc7XG4gIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgYnVja2V0UHJlZml4Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcnVuZUZzQWN0aW9uIHtcbiAgdHlwZTogXCJwcnVuZS1mc1wiO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gcHJldmlvdXMgZGVwbG95bWVudCBjb3VudCB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCAzXG4gICAqL1xuICBtaW5QcmV2aW91c0RlcGxveUNvdW50VG9QcnVuZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gcHJldmlvdXMgZGVwbG95bWVudCBkYXRlIHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IG5ldyBEYXRlKG5ldyBEYXRlKCkuc2V0TW9udGgobmV3IERhdGUoKS5nZXRNb250aCgpIC0gMSkpXG4gICAqL1xuICBtaW5QcmV2aW91c0RlcGxveURhdGVUb1BydW5lOiBzdHJpbmc7XG4gIGRpcmVjdG9yeTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUHJvcGVydGllcyB7XG4gIGFjdGlvbnM6IChGc1RvUzNBY3Rpb24gfCBGc1RvRnNBY3Rpb24gfCBQcnVuZVMzQWN0aW9uIHwgUHJ1bmVGc0FjdGlvbilbXTtcbiAgLyoqXG4gICAqIHtAbGluayBOZXh0anNBc3NldERlcGxveW1lbnRQcm9wcy5idWlsZGVySW1hZ2VEaWdlc3R9XG4gICAqL1xuICBidWlsZEltYWdlRGlnZXN0OiBzdHJpbmc7XG4gIGltYWdlQ2FjaGVQYXRoOiBzdHJpbmc7XG4gIHByZXJlbmRlck1hbmlmZXN0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlcGxveXMgc3RhdGljIGFzc2V0cyB0byBTMyBhbmQgY2FjaGUgYXNzZXRzIHRvIEVGUyBpbiBMYW1iZGEgQ3VzdG9tIFJlc291cmNlLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXNzZXRzRGVwbG95bWVudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGN1c3RvbVJlc291cmNlOiBDdXN0b21SZXNvdXJjZTtcbiAgZG9ja2VySW1hZ2VGdW5jdGlvbjogRG9ja2VySW1hZ2VGdW5jdGlvbjtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBmb3IgYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2BcbiAgICovXG4gIHByZXZpZXdNb2RlSWQ6IHN0cmluZztcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG9ja2VySW1hZ2VGdW5jdGlvbiA9IHRoaXMuY3JlYXRlRnVuY3Rpb24oKTtcbiAgICB0aGlzLmN1c3RvbVJlc291cmNlID0gdGhpcy5jcmVhdGVDdXN0b21SZXNvdXJjZSgpO1xuICAgIHRoaXMucHJldmlld01vZGVJZCA9IHRoaXMuY3VzdG9tUmVzb3VyY2UuZ2V0QXR0U3RyaW5nKFwicHJldmlld01vZGVJZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb24oKSB7XG4gICAgbGV0IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChwcm9jZXNzLmFyY2ggPT09IFwieDY0XCIpIHtcbiAgICAgIGFyY2hpdGVjdHVyZSA9IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmFyY2ggPT09IFwiYXJtNjRcIikge1xuICAgICAgYXJjaGl0ZWN0dXJlID0gQXJjaGl0ZWN0dXJlLkFSTV82NDtcbiAgICB9XG4gICAgY29uc3QgZm4gPSBuZXcgRG9ja2VySW1hZ2VGdW5jdGlvbih0aGlzLCBcIkZuXCIsIHtcbiAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgIGNvZGU6IHRoaXMucHJvcHMuZG9ja2VySW1hZ2VDb2RlLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIGZpbGVzeXN0ZW06IEZpbGVTeXN0ZW0uZnJvbUVmc0FjY2Vzc1BvaW50KFxuICAgICAgICB0aGlzLnByb3BzLmFjY2Vzc1BvaW50LFxuICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICksXG4gICAgICB2cGM6IHRoaXMucHJvcHMudnBjLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5kb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMucHJvcHMuZGVidWcgIT09IGZhbHNlKSB7XG4gICAgICBmbi5hZGRFbnZpcm9ubWVudChcIkRFQlVHXCIsIFwiMVwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0KSB7XG4gICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudFJlYWRXcml0ZShmbik7XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3VzdG9tUmVzb3VyY2UoKSB7XG4gICAgY29uc3Qgcm9vdCA9IFwiL2FwcFwiO1xuICAgIGNvbnN0IGFjdGlvbnM6IEN1c3RvbVJlc291cmNlUHJvcGVydGllc1tcImFjdGlvbnNcIl0gPSBbXTtcbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQ/LmJ1Y2tldE5hbWUpIHtcbiAgICAgIGFjdGlvbnMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZnMtdG8tczNcIixcbiAgICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwicHVibGljXCIpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gc3RhdGljIGZpbGVzXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImZzLXRvLXMzXCIsXG4gICAgICAgICAgc291cmNlUGF0aDogam9pbihyb290LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJfbmV4dC9zdGF0aWNcIixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGlvbnMucHVzaChcbiAgICAgIC8vIGRhdGEgY2FjaGUgLSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI2RhdGEtY2FjaGVcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwiLm5leHRcIiwgXCJjYWNoZVwiLCBcImZldGNoLWNhY2hlXCIpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4oXG4gICAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgICAgREFUQV9DQUNIRV9ESVIsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgLy8gZnVsbCByb3V0ZSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZnVsbC1yb3V0ZS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4oXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBcIi5uZXh0XCIsXG4gICAgICAgICAgXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSB8fCBcIlwiLFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInNlcnZlclwiLFxuICAgICAgICAgIFwiYXBwXCIsXG4gICAgICAgICksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgICBGVUxMX1JPVVRFX0NBQ0hFX0RJUixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAvLyBpbWFnZXMgYXJlIG9wdGltaXplZCBhdCBydW50aW1lIHNvIG5vdGhpbmcgdG8gZGVwbG95XG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMgPSB7XG4gICAgICBhY3Rpb25zLFxuICAgICAgYnVpbGRJbWFnZURpZ2VzdDogdGhpcy5wcm9wcy5idWlsZEltYWdlRGlnZXN0LFxuICAgICAgaW1hZ2VDYWNoZVBhdGg6IGpvaW4oXG4gICAgICAgIHRoaXMucHJvcHMuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgICBJTUFHRV9DQUNIRV9ESVIsXG4gICAgICApLFxuICAgICAgcHJlcmVuZGVyTWFuaWZlc3RQYXRoOiBqb2luKHJvb3QsIFwiLm5leHRcIiwgXCJwcmVyZW5kZXItbWFuaWZlc3QuanNvblwiKSxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDdXN0b21SZXNvdXJjZVwiLCB7XG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6TmV4dGpzQXNzZXRzRGVwbG95bWVudFwiLFxuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmRvY2tlckltYWdlRnVuY3Rpb24uZnVuY3Rpb25Bcm4sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs_1 = require("fs");
4
+ /**
5
+ * For `NextjsGlobalFunctions`, adds custom [Cache Handler](https://nextjs.org/docs/app/api-reference/next-config-js/incrementalCacheHandlerPath)
6
+ * so that time-based revalidation works. In serverless environment, functions
7
+ * spin down after request is complete but Next.js depends upon compute to still
8
+ * be running for time-based revalidation to work properly so we need to perform
9
+ * work async and use SQS Queue to do so.
10
+ */
11
+ function addCacheHandler(requiredServerFilesPath) {
12
+ if (!(0, fs_1.existsSync)(requiredServerFilesPath)) {
13
+ throw new Error(`Could not find required server files path: ${requiredServerFilesPath}`);
14
+ }
15
+ const requiredServerFiles = JSON.parse((0, fs_1.readFileSync)(requiredServerFilesPath, {
16
+ encoding: "utf-8",
17
+ }));
18
+ requiredServerFiles.config.cacheHandler = "../cache-handler.cjs";
19
+ (0, fs_1.writeFileSync)(requiredServerFilesPath, JSON.stringify(requiredServerFiles));
20
+ }
21
+ const [requiredServerFilesPath] = process.argv.slice(2);
22
+ addCacheHandler(requiredServerFilesPath);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWNhY2hlLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV4dGpzLWJ1aWxkL2FkZC1jYWNoZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQTZEO0FBRTdEOzs7Ozs7R0FNRztBQUNILFNBQVMsZUFBZSxDQUFDLHVCQUErQjtJQUN0RCxJQUFJLENBQUMsSUFBQSxlQUFVLEVBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOENBQThDLHVCQUF1QixFQUFFLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNwQyxJQUFBLGlCQUFZLEVBQUMsdUJBQXVCLEVBQUU7UUFDcEMsUUFBUSxFQUFFLE9BQU87S0FDbEIsQ0FBQyxDQUNILENBQUM7SUFDRixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDO0lBQ2pFLElBQUEsa0JBQWEsRUFBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEQsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcblxuLyoqXG4gKiBGb3IgYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AsIGFkZHMgY3VzdG9tIFtDYWNoZSBIYW5kbGVyXShodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9uZXh0LWNvbmZpZy1qcy9pbmNyZW1lbnRhbENhY2hlSGFuZGxlclBhdGgpXG4gKiBzbyB0aGF0IHRpbWUtYmFzZWQgcmV2YWxpZGF0aW9uIHdvcmtzLiBJbiBzZXJ2ZXJsZXNzIGVudmlyb25tZW50LCBmdW5jdGlvbnNcbiAqIHNwaW4gZG93biBhZnRlciByZXF1ZXN0IGlzIGNvbXBsZXRlIGJ1dCBOZXh0LmpzIGRlcGVuZHMgdXBvbiBjb21wdXRlIHRvIHN0aWxsXG4gKiBiZSBydW5uaW5nIGZvciB0aW1lLWJhc2VkIHJldmFsaWRhdGlvbiB0byB3b3JrIHByb3Blcmx5IHNvIHdlIG5lZWQgdG8gcGVyZm9ybVxuICogd29yayBhc3luYyBhbmQgdXNlIFNRUyBRdWV1ZSB0byBkbyBzby5cbiAqL1xuZnVuY3Rpb24gYWRkQ2FjaGVIYW5kbGVyKHJlcXVpcmVkU2VydmVyRmlsZXNQYXRoOiBzdHJpbmcpIHtcbiAgaWYgKCFleGlzdHNTeW5jKHJlcXVpcmVkU2VydmVyRmlsZXNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZmluZCByZXF1aXJlZCBzZXJ2ZXIgZmlsZXMgcGF0aDogJHtyZXF1aXJlZFNlcnZlckZpbGVzUGF0aH1gLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVxdWlyZWRTZXJ2ZXJGaWxlcyA9IEpTT04ucGFyc2UoXG4gICAgcmVhZEZpbGVTeW5jKHJlcXVpcmVkU2VydmVyRmlsZXNQYXRoLCB7XG4gICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgIH0pLFxuICApO1xuICByZXF1aXJlZFNlcnZlckZpbGVzLmNvbmZpZy5jYWNoZUhhbmRsZXIgPSBcIi4uL2NhY2hlLWhhbmRsZXIuY2pzXCI7XG4gIHdyaXRlRmlsZVN5bmMocmVxdWlyZWRTZXJ2ZXJGaWxlc1BhdGgsIEpTT04uc3RyaW5naWZ5KHJlcXVpcmVkU2VydmVyRmlsZXMpKTtcbn1cblxuY29uc3QgW3JlcXVpcmVkU2VydmVyRmlsZXNQYXRoXSA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbmFkZENhY2hlSGFuZGxlcihyZXF1aXJlZFNlcnZlckZpbGVzUGF0aCk7XG4iXX0=
@@ -0,0 +1,18 @@
1
+ // src/nextjs-build/add-cache-handler.ts
2
+ import { existsSync, readFileSync, writeFileSync } from "fs";
3
+ function addCacheHandler(requiredServerFilesPath2) {
4
+ if (!existsSync(requiredServerFilesPath2)) {
5
+ throw new Error(
6
+ `Could not find required server files path: ${requiredServerFilesPath2}`
7
+ );
8
+ }
9
+ const requiredServerFiles = JSON.parse(
10
+ readFileSync(requiredServerFilesPath2, {
11
+ encoding: "utf-8"
12
+ })
13
+ );
14
+ requiredServerFiles.config.cacheHandler = "../cache-handler.cjs";
15
+ writeFileSync(requiredServerFilesPath2, JSON.stringify(requiredServerFiles));
16
+ }
17
+ var [requiredServerFilesPath] = process.argv.slice(2);
18
+ addCacheHandler(requiredServerFilesPath);
@@ -0,0 +1,29 @@
1
+ #checkov:skip=CKV_DOCKER_2: healthcheck not needed for local only container
2
+ #checkov:skip=CKV_DOCKER_3: user not required for local builder container
3
+ FROM public.ecr.aws/docker/library/node:20-alpine
4
+ # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
5
+ RUN apk add --no-cache libc6-compat
6
+ WORKDIR /app
7
+ # It's preferrable to only copy package.json's and lockfiles, install, and then
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.nextjsXX.nextjsBuildProps.builderImageProps.srcDockerfilePath`
11
+ # to optimize for their setup.
12
+ COPY . .
13
+ # Install dependencies based on the preferred package manager
14
+ RUN \
15
+ if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
16
+ elif [ -f package-lock.json ]; then npm ci; \
17
+ elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
18
+ else echo "Lockfile not found." && exit 1; \
19
+ fi
20
+ ARG BUILD_COMMAND
21
+ ARG RELATIVE_PATH_TO_WORKSPACE
22
+ RUN \
23
+ if [ -f ./cdk-nextjs-load-env-vars.sh ]; then \
24
+ chmod u+x ./cdk-nextjs-load-env-vars.sh && \
25
+ . ./cdk-nextjs-load-env-vars.sh; \
26
+ fi && \
27
+ cd $RELATIVE_PATH_TO_WORKSPACE && \
28
+ $BUILD_COMMAND
29
+ # TODO: remove unnecessary node_modules: https://github.com/sst/open-next/pull/242