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,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ const fs_1 = require("fs");
5
+ const fs_to_fs_1 = require("./fs-to-fs");
6
+ const fs_to_s3_1 = require("./fs-to-s3");
7
+ const prune_s3_1 = require("./prune-s3");
8
+ const utils_1 = require("./utils");
9
+ const handler = async (event, context) => {
10
+ (0, utils_1.debug)({ event });
11
+ let responseStatus = utils_1.CfnResponseStatus.Failed;
12
+ let previewModeId = "";
13
+ try {
14
+ const props = event.ResourceProperties;
15
+ if (event.RequestType === "Create" || event.RequestType === "Update") {
16
+ const { actions } = props;
17
+ for (const action of actions) {
18
+ if (action.type === "fs-to-fs") {
19
+ (0, fs_to_fs_1.fsToFs)(action);
20
+ }
21
+ else if (action.type === "fs-to-s3") {
22
+ await (0, fs_to_s3_1.fsToS3)(action);
23
+ }
24
+ else if (action.type === "prune-s3") {
25
+ await (0, prune_s3_1.pruneS3)(action);
26
+ }
27
+ }
28
+ initImageCache(props.imageCachePath);
29
+ previewModeId = getPreviewModeId(props.prerenderManifestPath);
30
+ responseStatus = utils_1.CfnResponseStatus.Success;
31
+ }
32
+ else {
33
+ responseStatus = utils_1.CfnResponseStatus.Success;
34
+ }
35
+ }
36
+ catch (err) {
37
+ console.error(err);
38
+ throw err;
39
+ }
40
+ await (0, utils_1.cfnResponse)({
41
+ event,
42
+ context,
43
+ responseStatus,
44
+ responseData: { previewModeId },
45
+ });
46
+ };
47
+ exports.handler = handler;
48
+ function initImageCache(imageCachePath) {
49
+ if (imageCachePath && !(0, fs_1.existsSync)(imageCachePath)) {
50
+ // only runs first time
51
+ (0, fs_1.mkdirSync)(imageCachePath);
52
+ }
53
+ }
54
+ /**
55
+ * Only need preview mode id for `NextjsGlobalFunctions`, but easy to get
56
+ * so we do it each time.
57
+ */
58
+ function getPreviewModeId(prerenderManifestPath) {
59
+ const prerenderManifest = JSON.parse((0, fs_1.readFileSync)(prerenderManifestPath, { encoding: "utf-8" }));
60
+ return prerenderManifest.preview.previewModeId;
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvYXNzZXRzLWRlcGxveW1lbnQvYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUF5RDtBQUV6RCx5Q0FBb0M7QUFDcEMseUNBQW9DO0FBQ3BDLHlDQUFxQztBQUNyQyxtQ0FBZ0U7QUFPekQsTUFBTSxPQUFPLEdBQXdDLEtBQUssRUFDL0QsS0FBSyxFQUNMLE9BQU8sRUFDUCxFQUFFO0lBQ0YsSUFBQSxhQUFLLEVBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLElBQUksY0FBYyxHQUFHLHlCQUFpQixDQUFDLE1BQU0sQ0FBQztJQUM5QyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGtCQUFtQyxDQUFDO1FBQ3hELElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQzFCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDL0IsSUFBQSxpQkFBTSxFQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqQixDQUFDO3FCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxJQUFBLGlCQUFNLEVBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7cUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUN0QyxNQUFNLElBQUEsa0JBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztZQUNILENBQUM7WUFDRCxjQUFjLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM5RCxjQUFjLEdBQUcseUJBQWlCLENBQUMsT0FBTyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxHQUFHLHlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUNELE1BQU0sSUFBQSxtQkFBVyxFQUFDO1FBQ2hCLEtBQUs7UUFDTCxPQUFPO1FBQ1AsY0FBYztRQUNkLFlBQVksRUFBRSxFQUFFLGFBQWEsRUFBRTtLQUNoQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFwQ1csUUFBQSxPQUFPLFdBb0NsQjtBQUVGLFNBQVMsY0FBYyxDQUFDLGNBQXNCO0lBQzVDLElBQUksY0FBYyxJQUFJLENBQUMsSUFBQSxlQUFVLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNsRCx1QkFBdUI7UUFDdkIsSUFBQSxjQUFTLEVBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUIsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLHFCQUE2QjtJQUNyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQ2xDLElBQUEsaUJBQVksRUFBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUMzRCxDQUFDO0lBQ0YsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBmc1RvRnMgfSBmcm9tIFwiLi9mcy10by1mc1wiO1xuaW1wb3J0IHsgZnNUb1MzIH0gZnJvbSBcIi4vZnMtdG8tczNcIjtcbmltcG9ydCB7IHBydW5lUzMgfSBmcm9tIFwiLi9wcnVuZS1zM1wiO1xuaW1wb3J0IHsgY2ZuUmVzcG9uc2UsIENmblJlc3BvbnNlU3RhdHVzLCBkZWJ1ZyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEN1c3RvbVJlc291cmNlUHJvcGVydGllcyB9IGZyb20gXCIuLi8uLi9uZXh0anMtYXNzZXRzLWRlcGxveW1lbnRcIjtcblxudHlwZSBSZXNvdXJjZVByb3BzID0gQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzICYge1xuICBTZXJ2aWNlVG9rZW46IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQsXG4gIGNvbnRleHQsXG4pID0+IHtcbiAgZGVidWcoeyBldmVudCB9KTtcbiAgbGV0IHJlc3BvbnNlU3RhdHVzID0gQ2ZuUmVzcG9uc2VTdGF0dXMuRmFpbGVkO1xuICBsZXQgcHJldmlld01vZGVJZCA9IFwiXCI7XG4gIHRyeSB7XG4gICAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVzb3VyY2VQcm9wcztcbiAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiQ3JlYXRlXCIgfHwgZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiVXBkYXRlXCIpIHtcbiAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gcHJvcHM7XG4gICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJmcy10by1mc1wiKSB7XG4gICAgICAgICAgZnNUb0ZzKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09IFwiZnMtdG8tczNcIikge1xuICAgICAgICAgIGF3YWl0IGZzVG9TMyhhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSBcInBydW5lLXMzXCIpIHtcbiAgICAgICAgICBhd2FpdCBwcnVuZVMzKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluaXRJbWFnZUNhY2hlKHByb3BzLmltYWdlQ2FjaGVQYXRoKTtcbiAgICAgIHByZXZpZXdNb2RlSWQgPSBnZXRQcmV2aWV3TW9kZUlkKHByb3BzLnByZXJlbmRlck1hbmlmZXN0UGF0aCk7XG4gICAgICByZXNwb25zZVN0YXR1cyA9IENmblJlc3BvbnNlU3RhdHVzLlN1Y2Nlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlU3RhdHVzID0gQ2ZuUmVzcG9uc2VTdGF0dXMuU3VjY2VzcztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgYXdhaXQgY2ZuUmVzcG9uc2Uoe1xuICAgIGV2ZW50LFxuICAgIGNvbnRleHQsXG4gICAgcmVzcG9uc2VTdGF0dXMsXG4gICAgcmVzcG9uc2VEYXRhOiB7IHByZXZpZXdNb2RlSWQgfSxcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBpbml0SW1hZ2VDYWNoZShpbWFnZUNhY2hlUGF0aDogc3RyaW5nKSB7XG4gIGlmIChpbWFnZUNhY2hlUGF0aCAmJiAhZXhpc3RzU3luYyhpbWFnZUNhY2hlUGF0aCkpIHtcbiAgICAvLyBvbmx5IHJ1bnMgZmlyc3QgdGltZVxuICAgIG1rZGlyU3luYyhpbWFnZUNhY2hlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPbmx5IG5lZWQgcHJldmlldyBtb2RlIGlkIGZvciBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYCwgYnV0IGVhc3kgdG8gZ2V0XG4gKiBzbyB3ZSBkbyBpdCBlYWNoIHRpbWUuXG4gKi9cbmZ1bmN0aW9uIGdldFByZXZpZXdNb2RlSWQocHJlcmVuZGVyTWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcmVyZW5kZXJNYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgcmVhZEZpbGVTeW5jKHByZXJlbmRlck1hbmlmZXN0UGF0aCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pLFxuICApO1xuICByZXR1cm4gcHJlcmVuZGVyTWFuaWZlc3QucHJldmlldy5wcmV2aWV3TW9kZUlkO1xufVxuIl19
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Given path of directory, returns array of all file paths within directory
3
+ */
4
+ export declare function listFilePaths(dirPath: string): string[];
5
+ /**
6
+ * Helper for batching requests
7
+ */
8
+ export declare function chunkArray(array: string[], chunkSize: number): AsyncGenerator<string[], void, unknown>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listFilePaths = listFilePaths;
4
+ exports.chunkArray = chunkArray;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ /**
8
+ * Given path of directory, returns array of all file paths within directory
9
+ */
10
+ function listFilePaths(dirPath) {
11
+ const filePaths = [];
12
+ const directory = (0, node_fs_1.readdirSync)(dirPath, { withFileTypes: true });
13
+ for (const d of directory) {
14
+ const filePath = (0, node_path_1.resolve)(dirPath, d.name);
15
+ if (d.isDirectory()) {
16
+ filePaths.push(...listFilePaths(filePath));
17
+ }
18
+ else {
19
+ filePaths.push(filePath);
20
+ }
21
+ }
22
+ return filePaths;
23
+ }
24
+ /**
25
+ * Helper for batching requests
26
+ */
27
+ async function* chunkArray(array, chunkSize) {
28
+ for (let i = 0; i < array.length; i += chunkSize) {
29
+ yield array.slice(i, i + chunkSize);
30
+ }
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvYXNzZXRzLWRlcGxveW1lbnQvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsc0NBWUM7QUFLRCxnQ0FJQztBQTNCRCxxQ0FBc0M7QUFDdEMseUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLE9BQWU7SUFDM0MsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUEscUJBQVcsRUFBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNoRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUEsbUJBQU8sRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQWUsRUFBRSxTQUFpQjtJQUNsRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakQsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vKipcbiAqIEdpdmVuIHBhdGggb2YgZGlyZWN0b3J5LCByZXR1cm5zIGFycmF5IG9mIGFsbCBmaWxlIHBhdGhzIHdpdGhpbiBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RGaWxlUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRpcmVjdG9yeSA9IHJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkIG9mIGRpcmVjdG9yeSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZShkaXJQYXRoLCBkLm5hbWUpO1xuICAgIGlmIChkLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZpbGVQYXRocy5wdXNoKC4uLmxpc3RGaWxlUGF0aHMoZmlsZVBhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsZVBhdGhzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgYmF0Y2hpbmcgcmVxdWVzdHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBjaHVua0FycmF5KGFycmF5OiBzdHJpbmdbXSwgY2h1bmtTaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkgKz0gY2h1bmtTaXplKSB7XG4gICAgeWllbGQgYXJyYXkuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { FsToFsAction } from "../../nextjs-assets-deployment";
2
+ export declare function fsToFs(props: FsToFsAction): void;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fsToFs = fsToFs;
4
+ const node_fs_1 = require("node:fs");
5
+ function fsToFs(props) {
6
+ const { sourcePath, destinationPath } = props;
7
+ (0, node_fs_1.cpSync)(sourcePath, destinationPath, { recursive: true });
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdG8tZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9mcy10by1mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLHdCQUdDO0FBTkQscUNBQWlDO0FBR2pDLFNBQWdCLE1BQU0sQ0FBQyxLQUFtQjtJQUN4QyxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUM5QyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgRnNUb0ZzQWN0aW9uIH0gZnJvbSBcIi4uLy4uL25leHRqcy1hc3NldHMtZGVwbG95bWVudFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZnNUb0ZzKHByb3BzOiBGc1RvRnNBY3Rpb24pIHtcbiAgY29uc3QgeyBzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGggfSA9IHByb3BzO1xuICBjcFN5bmMoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import type { FsToS3Action } from "../../nextjs-assets-deployment";
2
+ export declare function fsToS3(props: FsToS3Action): Promise<void>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fsToS3 = fsToS3;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ // eslint-disable-next-line import/no-extraneous-dependencies
7
+ const client_s3_1 = require("@aws-sdk/client-s3");
8
+ // eslint-disable-next-line import/no-extraneous-dependencies
9
+ const mime = require("mime-types");
10
+ const common_1 = require("./common");
11
+ const s3_1 = require("./s3");
12
+ const utils_1 = require("./utils");
13
+ async function fsToS3(props) {
14
+ const { destinationBucketName, destinationKeyPrefix, sourcePath } = props;
15
+ const sourceFilePaths = (0, common_1.listFilePaths)(sourcePath);
16
+ for await (const filePathChunk of (0, common_1.chunkArray)(sourceFilePaths, 100)) {
17
+ const putObjectInputs = filePathChunk.map((path) => {
18
+ const contentType = mime.lookup(path) || undefined;
19
+ const key = createS3Key({
20
+ keyPrefix: destinationKeyPrefix,
21
+ path,
22
+ basePath: sourcePath,
23
+ });
24
+ return {
25
+ Body: (0, node_fs_1.createReadStream)(path),
26
+ Bucket: destinationBucketName,
27
+ ContentType: contentType,
28
+ Key: key,
29
+ };
30
+ });
31
+ (0, utils_1.debug)({ putObjectInputs });
32
+ await Promise.all(putObjectInputs.map((input) => s3_1.s3.send(new client_s3_1.PutObjectCommand(input))));
33
+ }
34
+ }
35
+ /**
36
+ * Create S3 Key given local path
37
+ */
38
+ function createS3Key({ keyPrefix, path, basePath }) {
39
+ const objectKeyParts = [];
40
+ if (keyPrefix)
41
+ objectKeyParts.push(keyPrefix);
42
+ objectKeyParts.push((0, node_path_1.relative)(basePath, path));
43
+ return (0, node_path_1.join)(...objectKeyParts);
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdG8tczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9mcy10by1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVdBLHdCQXlCQztBQXBDRCxxQ0FBMkM7QUFDM0MseUNBQTJDO0FBQzNDLDZEQUE2RDtBQUM3RCxrREFBNkU7QUFDN0UsNkRBQTZEO0FBQzdELG1DQUFtQztBQUNuQyxxQ0FBcUQ7QUFDckQsNkJBQTBCO0FBQzFCLG1DQUFnQztBQUd6QixLQUFLLFVBQVUsTUFBTSxDQUFDLEtBQW1CO0lBQzlDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDMUUsTUFBTSxlQUFlLEdBQUcsSUFBQSxzQkFBYSxFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSyxFQUFFLE1BQU0sYUFBYSxJQUFJLElBQUEsbUJBQVUsRUFBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBNEIsYUFBYSxDQUFDLEdBQUcsQ0FDaEUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQ25ELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQztnQkFDdEIsU0FBUyxFQUFFLG9CQUFvQjtnQkFDL0IsSUFBSTtnQkFDSixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFBLDBCQUFnQixFQUFDLElBQUksQ0FBQztnQkFDNUIsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxHQUFHO2FBQ1QsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBQSxhQUFLLEVBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFFLENBQUMsSUFBSSxDQUFDLElBQUksNEJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFPRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQW9CO0lBQ2xFLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUNwQyxJQUFJLFNBQVM7UUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBQSxvQkFBUSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sSUFBQSxnQkFBSSxFQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0gfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBQdXRPYmplY3RDb21tYW5kLCBQdXRPYmplY3RDb21tYW5kSW5wdXQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgKiBhcyBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyBjaHVua0FycmF5LCBsaXN0RmlsZVBhdGhzIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyBzMyB9IGZyb20gXCIuL3MzXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEZzVG9TM0FjdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtYXNzZXRzLWRlcGxveW1lbnRcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZzVG9TMyhwcm9wczogRnNUb1MzQWN0aW9uKSB7XG4gIGNvbnN0IHsgZGVzdGluYXRpb25CdWNrZXROYW1lLCBkZXN0aW5hdGlvbktleVByZWZpeCwgc291cmNlUGF0aCB9ID0gcHJvcHM7XG4gIGNvbnN0IHNvdXJjZUZpbGVQYXRocyA9IGxpc3RGaWxlUGF0aHMoc291cmNlUGF0aCk7XG4gIGZvciBhd2FpdCAoY29uc3QgZmlsZVBhdGhDaHVuayBvZiBjaHVua0FycmF5KHNvdXJjZUZpbGVQYXRocywgMTAwKSkge1xuICAgIGNvbnN0IHB1dE9iamVjdElucHV0czogUHV0T2JqZWN0Q29tbWFuZElucHV0W10gPSBmaWxlUGF0aENodW5rLm1hcChcbiAgICAgIChwYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gbWltZS5sb29rdXAocGF0aCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBrZXkgPSBjcmVhdGVTM0tleSh7XG4gICAgICAgICAga2V5UHJlZml4OiBkZXN0aW5hdGlvbktleVByZWZpeCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGJhc2VQYXRoOiBzb3VyY2VQYXRoLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBCb2R5OiBjcmVhdGVSZWFkU3RyZWFtKHBhdGgpLFxuICAgICAgICAgIEJ1Y2tldDogZGVzdGluYXRpb25CdWNrZXROYW1lLFxuICAgICAgICAgIENvbnRlbnRUeXBlOiBjb250ZW50VHlwZSxcbiAgICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBkZWJ1Zyh7IHB1dE9iamVjdElucHV0cyB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHB1dE9iamVjdElucHV0cy5tYXAoKGlucHV0KSA9PiBzMy5zZW5kKG5ldyBQdXRPYmplY3RDb21tYW5kKGlucHV0KSkpLFxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENyZWF0ZVMzS2V5UHJvcHMge1xuICBrZXlQcmVmaXg/OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgYmFzZVBhdGg6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlYXRlIFMzIEtleSBnaXZlbiBsb2NhbCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVMzS2V5KHsga2V5UHJlZml4LCBwYXRoLCBiYXNlUGF0aCB9OiBDcmVhdGVTM0tleVByb3BzKSB7XG4gIGNvbnN0IG9iamVjdEtleVBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoa2V5UHJlZml4KSBvYmplY3RLZXlQYXJ0cy5wdXNoKGtleVByZWZpeCk7XG4gIG9iamVjdEtleVBhcnRzLnB1c2gocmVsYXRpdmUoYmFzZVBhdGgsIHBhdGgpKTtcbiAgcmV0dXJuIGpvaW4oLi4ub2JqZWN0S2V5UGFydHMpO1xufVxuIl19
@@ -0,0 +1,15 @@
1
+ import type { PruneS3Action } from "../../nextjs-assets-deployment";
2
+ /**
3
+ * Safely removes assets that were deployed > 1 deployment ago AND were deployed
4
+ * greater than a month ago. Those values should be configurable.
5
+ */
6
+ export declare function pruneS3(props: PruneS3Action): Promise<void>;
7
+ interface ListObjectKeysProps {
8
+ bucketName: string;
9
+ keyPrefix?: string;
10
+ }
11
+ /**
12
+ * List all object keys in bucket
13
+ */
14
+ export declare function listObjectKeys({ bucketName, keyPrefix, }: ListObjectKeysProps): Promise<string[]>;
15
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pruneS3 = pruneS3;
4
+ exports.listObjectKeys = listObjectKeys;
5
+ // eslint-disable-next-line import/no-extraneous-dependencies
6
+ const client_s3_1 = require("@aws-sdk/client-s3");
7
+ const s3_1 = require("./s3");
8
+ /**
9
+ * Safely removes assets that were deployed > 1 deployment ago AND were deployed
10
+ * greater than a month ago. Those values should be configurable.
11
+ */
12
+ async function pruneS3(props) {
13
+ props;
14
+ }
15
+ /**
16
+ * List all object keys in bucket
17
+ */
18
+ async function listObjectKeys({ bucketName, keyPrefix, }) {
19
+ const oldObjectKeys = [];
20
+ let nextToken = undefined;
21
+ do {
22
+ const cmd = {
23
+ Bucket: bucketName,
24
+ Prefix: keyPrefix,
25
+ };
26
+ if (nextToken) {
27
+ cmd.ContinuationToken = nextToken;
28
+ }
29
+ const res = await s3_1.s3.send(new client_s3_1.ListObjectsV2Command(cmd));
30
+ const contents = res.Contents;
31
+ nextToken = res.NextContinuationToken;
32
+ if (contents?.length) {
33
+ for (const { Key: key } of contents) {
34
+ if (key) {
35
+ oldObjectKeys.push(key);
36
+ }
37
+ }
38
+ }
39
+ } while (nextToken);
40
+ return oldObjectKeys;
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9wcnVuZS1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDBCQUVDO0FBVUQsd0NBMEJDO0FBbERELDZEQUE2RDtBQUM3RCxrREFHNEI7QUFDNUIsNkJBQTBCO0FBRzFCOzs7R0FHRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBb0I7SUFDaEQsS0FBSyxDQUFDO0FBQ1IsQ0FBQztBQU9EOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FBQyxFQUNuQyxVQUFVLEVBQ1YsU0FBUyxHQUNXO0lBQ3BCLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNuQyxJQUFJLFNBQVMsR0FBdUIsU0FBUyxDQUFDO0lBQzlDLEdBQUcsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUE4QjtZQUNyQyxNQUFNLEVBQUUsVUFBVTtZQUNsQixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLEdBQUcsQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sT0FBRSxDQUFDLElBQUksQ0FBQyxJQUFJLGdDQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUM5QixTQUFTLEdBQUcsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ3RDLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDUixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLFFBQVEsU0FBUyxFQUFFO0lBQ3BCLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQge1xuICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgTGlzdE9iamVjdHNWMkNvbW1hbmRJbnB1dCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgczMgfSBmcm9tIFwiLi9zM1wiO1xuaW1wb3J0IHR5cGUgeyBQcnVuZVMzQWN0aW9uIH0gZnJvbSBcIi4uLy4uL25leHRqcy1hc3NldHMtZGVwbG95bWVudFwiO1xuXG4vKipcbiAqIFNhZmVseSByZW1vdmVzIGFzc2V0cyB0aGF0IHdlcmUgZGVwbG95ZWQgPiAxIGRlcGxveW1lbnQgYWdvIEFORCB3ZXJlIGRlcGxveWVkXG4gKiBncmVhdGVyIHRoYW4gYSBtb250aCBhZ28uIFRob3NlIHZhbHVlcyBzaG91bGQgYmUgY29uZmlndXJhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJ1bmVTMyhwcm9wczogUHJ1bmVTM0FjdGlvbikge1xuICBwcm9wcztcbn1cblxuaW50ZXJmYWNlIExpc3RPYmplY3RLZXlzUHJvcHMge1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIGtleVByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBvYmplY3Qga2V5cyBpbiBidWNrZXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RPYmplY3RLZXlzKHtcbiAgYnVja2V0TmFtZSxcbiAga2V5UHJlZml4LFxufTogTGlzdE9iamVjdEtleXNQcm9wcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgb2xkT2JqZWN0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBkbyB7XG4gICAgY29uc3QgY21kOiBMaXN0T2JqZWN0c1YyQ29tbWFuZElucHV0ID0ge1xuICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgUHJlZml4OiBrZXlQcmVmaXgsXG4gICAgfTtcbiAgICBpZiAobmV4dFRva2VuKSB7XG4gICAgICBjbWQuQ29udGludWF0aW9uVG9rZW4gPSBuZXh0VG9rZW47XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKGNtZCkpO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzLkNvbnRlbnRzO1xuICAgIG5leHRUb2tlbiA9IHJlcy5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgaWYgKGNvbnRlbnRzPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgeyBLZXk6IGtleSB9IG9mIGNvbnRlbnRzKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICBvbGRPYmplY3RLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAobmV4dFRva2VuKTtcbiAgcmV0dXJuIG9sZE9iamVjdEtleXM7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { S3Client } from "@aws-sdk/client-s3";
2
+ export declare const s3: S3Client;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.s3 = void 0;
4
+ // eslint-disable-next-line import/no-extraneous-dependencies
5
+ const client_s3_1 = require("@aws-sdk/client-s3");
6
+ exports.s3 = new client_s3_1.S3Client({});
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2REFBNkQ7QUFDN0Qsa0RBQThDO0FBRWpDLFFBQUEsRUFBRSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuXG5leHBvcnQgY29uc3QgczMgPSBuZXcgUzNDbGllbnQoe30pO1xuIl19
@@ -0,0 +1,18 @@
1
+ import type { CloudFormationCustomResourceHandler } from "aws-lambda";
2
+ export declare enum CfnResponseStatus {
3
+ Success = "SUCCESS",
4
+ Failed = "FAILED"
5
+ }
6
+ interface CfnResponseProps {
7
+ event: Parameters<CloudFormationCustomResourceHandler>[0];
8
+ context: Parameters<CloudFormationCustomResourceHandler>[1];
9
+ responseStatus: CfnResponseStatus;
10
+ responseData?: Record<string, string>;
11
+ physicalResourceId?: string;
12
+ }
13
+ /**
14
+ * Inspired by: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html
15
+ */
16
+ export declare function cfnResponse(props: CfnResponseProps): Promise<Response>;
17
+ export declare function debug(value: unknown): void;
18
+ export {};
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQkEsa0NBaUJDO0FBRUQsc0JBRUM7QUFyQ0QsSUFBWSxpQkFHWDtBQUhELFdBQVksaUJBQWlCO0lBQzNCLHdDQUFtQixDQUFBO0lBQ25CLHNDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFIVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQUc1QjtBQVVEOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQXVCO0lBQ2pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxjQUFjO1FBQzVCLE1BQU0sRUFDSiw0Q0FBNEM7WUFDNUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBQzdCLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWE7UUFDM0UsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTztRQUM1QixTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTO1FBQ2hDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCO1FBQ2hELElBQUksRUFBRSxLQUFLLENBQUMsWUFBWTtLQUN6QixDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUNwQyxNQUFNLEVBQUUsS0FBSztRQUNiLElBQUk7UUFDSixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7S0FDMUUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxLQUFjO0lBQ2xDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5cbmV4cG9ydCBlbnVtIENmblJlc3BvbnNlU3RhdHVzIHtcbiAgU3VjY2VzcyA9IFwiU1VDQ0VTU1wiLFxuICBGYWlsZWQgPSBcIkZBSUxFRFwiLFxufVxuXG5pbnRlcmZhY2UgQ2ZuUmVzcG9uc2VQcm9wcyB7XG4gIGV2ZW50OiBQYXJhbWV0ZXJzPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VIYW5kbGVyPlswXTtcbiAgY29udGV4dDogUGFyYW1ldGVyczxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlcj5bMV07XG4gIHJlc3BvbnNlU3RhdHVzOiBDZm5SZXNwb25zZVN0YXR1cztcbiAgcmVzcG9uc2VEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGh5c2ljYWxSZXNvdXJjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluc3BpcmVkIGJ5OiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9jZm4tbGFtYmRhLWZ1bmN0aW9uLWNvZGUtY2ZucmVzcG9uc2Vtb2R1bGUuaHRtbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2ZuUmVzcG9uc2UocHJvcHM6IENmblJlc3BvbnNlUHJvcHMpIHtcbiAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBTdGF0dXM6IHByb3BzLnJlc3BvbnNlU3RhdHVzLFxuICAgIFJlYXNvbjpcbiAgICAgIFwiU2VlIHRoZSBkZXRhaWxzIGluIENsb3VkV2F0Y2ggTG9nIFN0cmVhbTogXCIgK1xuICAgICAgcHJvcHMuY29udGV4dC5sb2dTdHJlYW1OYW1lLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcHJvcHMucGh5c2ljYWxSZXNvdXJjZUlkIHx8IHByb3BzLmNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICBTdGFja0lkOiBwcm9wcy5ldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogcHJvcHMuZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBwcm9wcy5ldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBEYXRhOiBwcm9wcy5yZXNwb25zZURhdGEsXG4gIH0pO1xuICByZXR1cm4gZmV0Y2gocHJvcHMuZXZlbnQuUmVzcG9uc2VVUkwsIHtcbiAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiXCIsIFwiY29udGVudC1sZW5ndGhcIjogYm9keS5sZW5ndGgudG9TdHJpbmcoKSB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmIChwcm9jZXNzLmVudi5ERUJVRykgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpKTtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for RevalidateFunction
5
+ */
6
+ export interface RevalidateFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/revalidate/revalidate.
10
+ */
11
+ export declare class RevalidateFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: RevalidateFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RevalidateFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.ts and run "pnpm dlx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/revalidate/revalidate.
9
+ */
10
+ class RevalidateFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/revalidate/revalidate.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs20.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../../assets/lambdas/revalidate/revalidate.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.RevalidateFunction = RevalidateFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2YWxpZGF0ZS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYW1iZGFzL3JldmFsaWRhdGUvcmV2YWxpZGF0ZS1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRkFBa0Y7QUFDbEYsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDckQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSw2Q0FBNkM7WUFDMUQsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNEQUFzRCxDQUFDLENBQUM7U0FDMUcsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCxnREFXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcInBucG0gZGx4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBSZXZhbGlkYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZhbGlkYXRlRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL2xhbWJkYXMvcmV2YWxpZGF0ZS9yZXZhbGlkYXRlLlxuICovXG5leHBvcnQgY2xhc3MgUmV2YWxpZGF0ZUZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBSZXZhbGlkYXRlRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvbGFtYmRhcy9yZXZhbGlkYXRlL3JldmFsaWRhdGUubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMyMC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL2xhbWJkYXMvcmV2YWxpZGF0ZS9yZXZhbGlkYXRlLmxhbWJkYScpKSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KCdBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRCcsICcxJywgeyByZW1vdmVJbkVkZ2U6IHRydWUgfSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,2 @@
1
+ import { SQSHandler } from "aws-lambda";
2
+ export declare const handler: SQSHandler;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ const handler = async (event, context) => {
5
+ console.log({ event });
6
+ context;
7
+ const batchItemFailures = [];
8
+ try {
9
+ for (const record of event.Records) {
10
+ const url = record.body;
11
+ const previewModeId = process.env.PREVIEW_MODE_ID;
12
+ if (!url)
13
+ throw new Error("Missing url");
14
+ if (!previewModeId)
15
+ throw new Error("Missing previewModeId");
16
+ // see: https://github.com/sst/open-next/blob/ab844db7a21a056155992ccf0bdf9b835362cd19/packages/open-next/src/adapters/revalidate.ts#L43
17
+ // Make a HEAD request to the page to revalidate it.
18
+ // - HEAD request is used b/c it's not necessary to make a GET request
19
+ // and have CloudFront cache the request. This is because the request
20
+ // does not have real life headers and the cache won't be used anyway.
21
+ // - "previewModeId" is used to ensure the page is revalidated in a
22
+ // blocking way in lambda
23
+ // https://github.com/vercel/next.js/blob/1088b3f682cbe411be2d1edc502f8a090e36dee4/packages/next/src/server/api-utils/node.ts#L353
24
+ try {
25
+ const res = await fetch(url, {
26
+ method: "HEAD",
27
+ headers: {
28
+ "x-prerender-revalidate": previewModeId,
29
+ "x-isr": "1",
30
+ },
31
+ });
32
+ const xNextjsCacheHeader = res.headers.get("x-nextjs-cache");
33
+ if (!res.ok || xNextjsCacheHeader !== "REVALIDATED") {
34
+ throw new Error(`Response code: ${res.status}, x-nextjs-cache: ${xNextjsCacheHeader}`);
35
+ }
36
+ }
37
+ catch (err) {
38
+ batchItemFailures.push({
39
+ itemIdentifier: record.messageId,
40
+ });
41
+ }
42
+ }
43
+ }
44
+ catch (err) {
45
+ console.error(err);
46
+ throw err;
47
+ }
48
+ return {
49
+ batchItemFailures,
50
+ };
51
+ };
52
+ exports.handler = handler;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2YWxpZGF0ZS5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9yZXZhbGlkYXRlL3JldmFsaWRhdGUubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdPLE1BQU0sT0FBTyxHQUFlLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDO0lBQ1IsTUFBTSxpQkFBaUIsR0FBMEIsRUFBRSxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDeEIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDbEQsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsYUFBYTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDN0Qsd0lBQXdJO1lBQ3hJLG9EQUFvRDtZQUNwRCxzRUFBc0U7WUFDdEUsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxtRUFBbUU7WUFDbkUsMkJBQTJCO1lBQzNCLG9JQUFvSTtZQUNwSSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUMzQixNQUFNLEVBQUUsTUFBTTtvQkFDZCxPQUFPLEVBQUU7d0JBQ1Asd0JBQXdCLEVBQUUsYUFBYTt3QkFDdkMsT0FBTyxFQUFFLEdBQUc7cUJBQ2I7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksa0JBQWtCLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQ2Isa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLHFCQUFxQixrQkFBa0IsRUFBRSxDQUN0RSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ3JCLGNBQWMsRUFBRSxNQUFNLENBQUMsU0FBUztpQkFDakMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTztRQUNMLGlCQUFpQjtLQUNsQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBN0NXLFFBQUEsT0FBTyxXQTZDbEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBTUVNCYXRjaEl0ZW1GYWlsdXJlLCBTUVNIYW5kbGVyIH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXI6IFNRU0hhbmRsZXIgPSBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcbiAgY29udGV4dDtcbiAgY29uc3QgYmF0Y2hJdGVtRmFpbHVyZXM6IFNRU0JhdGNoSXRlbUZhaWx1cmVbXSA9IFtdO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV2ZW50LlJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHVybCA9IHJlY29yZC5ib2R5O1xuICAgICAgY29uc3QgcHJldmlld01vZGVJZCA9IHByb2Nlc3MuZW52LlBSRVZJRVdfTU9ERV9JRDtcbiAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHVybFwiKTtcbiAgICAgIGlmICghcHJldmlld01vZGVJZCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBwcmV2aWV3TW9kZUlkXCIpO1xuICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vc3N0L29wZW4tbmV4dC9ibG9iL2FiODQ0ZGI3YTIxYTA1NjE1NTk5MmNjZjBiZGY5YjgzNTM2MmNkMTkvcGFja2FnZXMvb3Blbi1uZXh0L3NyYy9hZGFwdGVycy9yZXZhbGlkYXRlLnRzI0w0M1xuICAgICAgLy8gTWFrZSBhIEhFQUQgcmVxdWVzdCB0byB0aGUgcGFnZSB0byByZXZhbGlkYXRlIGl0LlxuICAgICAgLy8gLSBIRUFEIHJlcXVlc3QgaXMgdXNlZCBiL2MgaXQncyBub3QgbmVjZXNzYXJ5IHRvIG1ha2UgYSBHRVQgcmVxdWVzdFxuICAgICAgLy8gICBhbmQgaGF2ZSBDbG91ZEZyb250IGNhY2hlIHRoZSByZXF1ZXN0LiBUaGlzIGlzIGJlY2F1c2UgdGhlIHJlcXVlc3RcbiAgICAgIC8vICAgZG9lcyBub3QgaGF2ZSByZWFsIGxpZmUgaGVhZGVycyBhbmQgdGhlIGNhY2hlIHdvbid0IGJlIHVzZWQgYW55d2F5LlxuICAgICAgLy8gLSBcInByZXZpZXdNb2RlSWRcIiBpcyB1c2VkIHRvIGVuc3VyZSB0aGUgcGFnZSBpcyByZXZhbGlkYXRlZCBpbiBhXG4gICAgICAvLyAgIGJsb2NraW5nIHdheSBpbiBsYW1iZGFcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL2Jsb2IvMTA4OGIzZjY4MmNiZTQxMWJlMmQxZWRjNTAyZjhhMDkwZTM2ZGVlNC9wYWNrYWdlcy9uZXh0L3NyYy9zZXJ2ZXIvYXBpLXV0aWxzL25vZGUudHMjTDM1M1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIkhFQURcIixcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIngtcHJlcmVuZGVyLXJldmFsaWRhdGVcIjogcHJldmlld01vZGVJZCxcbiAgICAgICAgICAgIFwieC1pc3JcIjogXCIxXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHhOZXh0anNDYWNoZUhlYWRlciA9IHJlcy5oZWFkZXJzLmdldChcIngtbmV4dGpzLWNhY2hlXCIpO1xuICAgICAgICBpZiAoIXJlcy5vayB8fCB4TmV4dGpzQ2FjaGVIZWFkZXIgIT09IFwiUkVWQUxJREFURURcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBSZXNwb25zZSBjb2RlOiAke3Jlcy5zdGF0dXN9LCB4LW5leHRqcy1jYWNoZTogJHt4TmV4dGpzQ2FjaGVIZWFkZXJ9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgYmF0Y2hJdGVtRmFpbHVyZXMucHVzaCh7XG4gICAgICAgICAgaXRlbUlkZW50aWZpZXI6IHJlY29yZC5tZXNzYWdlSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJhdGNoSXRlbUZhaWx1cmVzLFxuICB9O1xufTtcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for SignFnUrlFunction
5
+ */
6
+ export interface SignFnUrlFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/sign-fn-url/sign-fn-url.
10
+ */
11
+ export declare class SignFnUrlFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: SignFnUrlFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SignFnUrlFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.ts and run "pnpm dlx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/sign-fn-url/sign-fn-url.
9
+ */
10
+ class SignFnUrlFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/sign-fn-url/sign-fn-url.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs20.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../../assets/lambdas/sign-fn-url/sign-fn-url.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.SignFnUrlFunction = SignFnUrlFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1mbi11cmwtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLWZuLXVybC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRkFBa0Y7QUFDbEYsNkJBQTZCO0FBQzdCLGlEQUFpRDtBQVNqRDs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDcEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSwrQ0FBK0M7WUFDNUQsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdEQUF3RCxDQUFDLENBQUM7U0FDNUcsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCw4Q0FXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcInBucG0gZGx4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBTaWduRm5VcmxGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25GblVybEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb25PcHRpb25zIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9sYW1iZGFzL3NpZ24tZm4tdXJsL3NpZ24tZm4tdXJsLlxuICovXG5leHBvcnQgY2xhc3MgU2lnbkZuVXJsRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFNpZ25GblVybEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1mbi11cmwubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMyMC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1mbi11cmwubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,9 @@
1
+ import type { CloudFrontRequestHandler } from "aws-lambda";
2
+ /**
3
+ * This Lambda@Edge handler fixes s3 requests, fixes the host header, and
4
+ * signs requests as they're destined for Lambda Function URL that requires
5
+ * IAM Auth.
6
+ *
7
+ * This can be deleted/removed when CloudFront OAC Lambda supports POST requests.
8
+ */
9
+ export declare const handler: CloudFrontRequestHandler;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ const sign_request_1 = require("./sign-request");
5
+ const debug = true;
6
+ /**
7
+ * This Lambda@Edge handler fixes s3 requests, fixes the host header, and
8
+ * signs requests as they're destined for Lambda Function URL that requires
9
+ * IAM Auth.
10
+ *
11
+ * This can be deleted/removed when CloudFront OAC Lambda supports POST requests.
12
+ */
13
+ const handler = async (event) => {
14
+ const request = event.Records[0]?.cf.request;
15
+ if (!request)
16
+ throw new Error("request missing");
17
+ if (debug)
18
+ console.log("input request", JSON.stringify(request, null, 2));
19
+ escapeQuerystring(request);
20
+ await (0, sign_request_1.signRequest)(request);
21
+ if (debug)
22
+ console.log("output request", JSON.stringify(request), null, 2);
23
+ return request;
24
+ };
25
+ exports.handler = handler;
26
+ /**
27
+ * Lambda URL will reject query parameters with brackets so we need to encode
28
+ * https://github.dev/pwrdrvr/lambda-url-signing/blob/main/packages/edge-to-origin/src/translate-request.ts#L19-L31
29
+ */
30
+ function escapeQuerystring(request) {
31
+ request.querystring = request.querystring
32
+ .replace(/\[/g, "%5B")
33
+ .replace(/]/g, "%5D");
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1mbi11cmwubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1mbi11cmwubGFtYmRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGlEQUE2QztBQUU3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUM7QUFFbkI7Ozs7OztHQU1HO0FBQ0ksTUFBTSxPQUFPLEdBQTZCLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtJQUMvRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDN0MsSUFBSSxDQUFDLE9BQU87UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsSUFBSSxLQUFLO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsTUFBTSxJQUFBLDBCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0IsSUFBSSxLQUFLO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRSxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFWVyxRQUFBLE9BQU8sV0FVbEI7QUFFRjs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQTBCO0lBQ25ELE9BQU8sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVc7U0FDdEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZyb250UmVxdWVzdCwgQ2xvdWRGcm9udFJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IHNpZ25SZXF1ZXN0IH0gZnJvbSBcIi4vc2lnbi1yZXF1ZXN0XCI7XG5cbmNvbnN0IGRlYnVnID0gdHJ1ZTtcblxuLyoqXG4gKiBUaGlzIExhbWJkYUBFZGdlIGhhbmRsZXIgZml4ZXMgczMgcmVxdWVzdHMsIGZpeGVzIHRoZSBob3N0IGhlYWRlciwgYW5kXG4gKiBzaWducyByZXF1ZXN0cyBhcyB0aGV5J3JlIGRlc3RpbmVkIGZvciBMYW1iZGEgRnVuY3Rpb24gVVJMIHRoYXQgcmVxdWlyZXNcbiAqIElBTSBBdXRoLlxuICpcbiAqIFRoaXMgY2FuIGJlIGRlbGV0ZWQvcmVtb3ZlZCB3aGVuIENsb3VkRnJvbnQgT0FDIExhbWJkYSBzdXBwb3J0cyBQT1NUIHJlcXVlc3RzLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlcjogQ2xvdWRGcm9udFJlcXVlc3RIYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBldmVudC5SZWNvcmRzWzBdPy5jZi5yZXF1ZXN0O1xuICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcInJlcXVlc3QgbWlzc2luZ1wiKTtcbiAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZyhcImlucHV0IHJlcXVlc3RcIiwgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCwgbnVsbCwgMikpO1xuXG4gIGVzY2FwZVF1ZXJ5c3RyaW5nKHJlcXVlc3QpO1xuICBhd2FpdCBzaWduUmVxdWVzdChyZXF1ZXN0KTtcblxuICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKFwib3V0cHV0IHJlcXVlc3RcIiwgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksIG51bGwsIDIpO1xuICByZXR1cm4gcmVxdWVzdDtcbn07XG5cbi8qKlxuICogTGFtYmRhIFVSTCB3aWxsIHJlamVjdCBxdWVyeSBwYXJhbWV0ZXJzIHdpdGggYnJhY2tldHMgc28gd2UgbmVlZCB0byBlbmNvZGVcbiAqIGh0dHBzOi8vZ2l0aHViLmRldi9wd3JkcnZyL2xhbWJkYS11cmwtc2lnbmluZy9ibG9iL21haW4vcGFja2FnZXMvZWRnZS10by1vcmlnaW4vc3JjL3RyYW5zbGF0ZS1yZXF1ZXN0LnRzI0wxOS1MMzFcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUXVlcnlzdHJpbmcocmVxdWVzdDogQ2xvdWRGcm9udFJlcXVlc3QpIHtcbiAgcmVxdWVzdC5xdWVyeXN0cmluZyA9IHJlcXVlc3QucXVlcnlzdHJpbmdcbiAgICAucmVwbGFjZSgvXFxbL2csIFwiJTVCXCIpXG4gICAgLnJlcGxhY2UoL10vZywgXCIlNURcIik7XG59XG4iXX0=
@@ -0,0 +1,28 @@
1
+ import type { CloudFrontHeaders, CloudFrontRequest } from "aws-lambda";
2
+ /**
3
+ * Enables use of IAM_AUTH on Lambda Function URL
4
+ * @link https://medium.com/@dario_26152/restrict-access-to-lambda-functionurl-to-cloudfront-using-aws-iam-988583834705
5
+ */
6
+ export declare function signRequest(request: CloudFrontRequest): Promise<void>;
7
+ export declare function getRegionFromLambdaUrl(url: string): string;
8
+ /**
9
+ * Bag or Map used for HeaderBag or QueryStringParameterBag for `sigv4.sign()`
10
+ */
11
+ type Bag = Record<string, string>;
12
+ /**
13
+ * Converts CloudFront headers (can have array of header values) to simple
14
+ * header bag (object) required by `sigv4.sign`
15
+ *
16
+ * NOTE: only includes headers allowed by origin policy to prevent signature
17
+ * mismatch
18
+ */
19
+ export declare function cfHeadersToHeaderBag(headers: CloudFrontHeaders): Bag;
20
+ /**
21
+ * Converts simple header bag (object) to CloudFront headers
22
+ */
23
+ export declare function headerBagToCfHeaders(headerBag: Bag): CloudFrontHeaders;
24
+ /**
25
+ * Converts CloudFront querystring to QueryParamaterBag for IAM Sig V4
26
+ */
27
+ export declare function queryStringToQueryParamBag(querystring: string): Bag;
28
+ export {};