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.
- package/.jsii +13811 -0
- package/.prettierrc +0 -0
- package/API.md +9694 -0
- package/LICENSE +202 -0
- package/README.md +137 -0
- package/THIRD-PARTY-LICENSES.md +31 -0
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +18 -0
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +8831 -0
- package/assets/lambdas/revalidate/revalidate.lambda/index.js +67 -0
- package/assets/lambdas/sign-fn-url/sign-fn-url.lambda/index.js +2002 -0
- package/examples/README.md +14 -0
- package/lib/common.d.ts +23 -0
- package/lib/common.js +28 -0
- package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.d.ts +106 -0
- package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.js +3 -0
- package/lib/generated-structs/OptionalCloudFrontFunctionProps.d.ts +43 -0
- package/lib/generated-structs/OptionalCloudFrontFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalClusterProps.d.ts +49 -0
- package/lib/generated-structs/OptionalClusterProps.js +3 -0
- package/lib/generated-structs/OptionalDistributionProps.d.ts +155 -0
- package/lib/generated-structs/OptionalDistributionProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +124 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +399 -0
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalEdgeFunctionProps.d.ts +428 -0
- package/lib/generated-structs/OptionalEdgeFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalFunctionProps.d.ts +422 -0
- package/lib/generated-structs/OptionalFunctionProps.js +3 -0
- package/lib/generated-structs/OptionalFunctionUrlProps.d.ts +30 -0
- package/lib/generated-structs/OptionalFunctionUrlProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +45 -0
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +30 -0
- package/lib/generated-structs/OptionalNextjsBuildProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +43 -0
- package/lib/generated-structs/OptionalNextjsContainersProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +50 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsFileSystemProps.d.ts +15 -0
- package/lib/generated-structs/OptionalNextjsFileSystemProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +17 -0
- package/lib/generated-structs/OptionalNextjsInvalidationProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsVpcProps.d.ts +21 -0
- package/lib/generated-structs/OptionalNextjsVpcProps.js +3 -0
- package/lib/generated-structs/OptionalS3OriginProps.d.ts +64 -0
- package/lib/generated-structs/OptionalS3OriginProps.js +3 -0
- package/lib/generated-structs/OptionalVpcProps.d.ts +224 -0
- package/lib/generated-structs/OptionalVpcProps.js +3 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.js +32 -0
- package/lib/lambdas/assets-deployment/assets-deployment-function.d.ts +13 -0
- package/lib/lambdas/assets-deployment/assets-deployment-function.js +23 -0
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.d.ts +2 -0
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +62 -0
- package/lib/lambdas/assets-deployment/common.d.ts +8 -0
- package/lib/lambdas/assets-deployment/common.js +32 -0
- package/lib/lambdas/assets-deployment/fs-to-fs.d.ts +2 -0
- package/lib/lambdas/assets-deployment/fs-to-fs.js +9 -0
- package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +2 -0
- package/lib/lambdas/assets-deployment/fs-to-s3.js +45 -0
- package/lib/lambdas/assets-deployment/prune-s3.d.ts +15 -0
- package/lib/lambdas/assets-deployment/prune-s3.js +42 -0
- package/lib/lambdas/assets-deployment/s3.d.ts +2 -0
- package/lib/lambdas/assets-deployment/s3.js +7 -0
- package/lib/lambdas/assets-deployment/utils.d.ts +18 -0
- package/lib/lambdas/assets-deployment/utils.js +35 -0
- package/lib/lambdas/revalidate/revalidate-function.d.ts +13 -0
- package/lib/lambdas/revalidate/revalidate-function.js +23 -0
- package/lib/lambdas/revalidate/revalidate.lambda.d.ts +2 -0
- package/lib/lambdas/revalidate/revalidate.lambda.js +53 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +13 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +23 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.d.ts +9 -0
- package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.js +35 -0
- package/lib/lambdas/sign-fn-url/sign-request.d.ts +28 -0
- package/lib/lambdas/sign-fn-url/sign-request.js +119 -0
- package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +1 -0
- package/lib/lambdas/sign-fn-url/sign-request.test.js +129 -0
- package/lib/nextjs-assets-deployment.d.ts +116 -0
- package/lib/nextjs-assets-deployment.js +93 -0
- package/lib/nextjs-build/add-cache-handler.d.ts +1 -0
- package/lib/nextjs-build/add-cache-handler.js +23 -0
- package/lib/nextjs-build/add-cache-handler.mjs +18 -0
- package/lib/nextjs-build/builder.Dockerfile +29 -0
- package/lib/nextjs-build/cache-handler.cjs +21513 -0
- package/lib/nextjs-build/cache-handler.d.ts +6 -0
- package/lib/nextjs-build/cache-handler.js +22 -0
- package/lib/nextjs-build/global-containers.Dockerfile +45 -0
- package/lib/nextjs-build/global-functions.Dockerfile +46 -0
- package/lib/nextjs-build/nextjs-build.d.ts +150 -0
- package/lib/nextjs-build/nextjs-build.js +220 -0
- package/lib/nextjs-build/regional-containers.Dockerfile +45 -0
- package/lib/nextjs-build/symlink-full-route-cache.d.ts +1 -0
- package/lib/nextjs-build/symlink-full-route-cache.js +37 -0
- package/lib/nextjs-build/symlink-full-route-cache.mjs +23 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +8 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.js +3 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +43 -0
- package/lib/nextjs-compute/nextjs-containers.js +149 -0
- package/lib/nextjs-compute/nextjs-functions.d.ts +23 -0
- package/lib/nextjs-compute/nextjs-functions.js +57 -0
- package/lib/nextjs-distribution.d.ts +120 -0
- package/lib/nextjs-distribution.js +362 -0
- package/lib/nextjs-file-system.d.ts +42 -0
- package/lib/nextjs-file-system.js +74 -0
- package/lib/nextjs-invalidation.d.ts +19 -0
- package/lib/nextjs-invalidation.js +52 -0
- package/lib/nextjs-revalidation.d.ts +30 -0
- package/lib/nextjs-revalidation.js +65 -0
- package/lib/nextjs-static-assets.d.ts +21 -0
- package/lib/nextjs-static-assets.js +32 -0
- package/lib/nextjs-vpc.d.ts +42 -0
- package/lib/nextjs-vpc.js +64 -0
- package/lib/root-constructs/nextjs-base-overrides.d.ts +26 -0
- package/lib/root-constructs/nextjs-base-overrides.js +3 -0
- package/lib/root-constructs/nextjs-base-props.d.ts +56 -0
- package/lib/root-constructs/nextjs-base-props.js +3 -0
- package/lib/root-constructs/nextjs-global-containers.d.ts +74 -0
- package/lib/root-constructs/nextjs-global-containers.js +125 -0
- package/lib/root-constructs/nextjs-global-functions.d.ts +76 -0
- package/lib/root-constructs/nextjs-global-functions.js +131 -0
- package/lib/root-constructs/nextjs-regional-containers.d.ts +43 -0
- package/lib/root-constructs/nextjs-regional-containers.js +92 -0
- 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,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,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,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,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 {};
|