cdk-nextjs 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.jsii +120 -88
  2. package/API.md +60 -38
  3. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +1 -1
  4. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +18 -8
  5. package/assets/lambdas/assets-deployment/assets-deployment.lambda/patch-fetch.js +1 -0
  6. package/docs/breaking-changes.md +12 -0
  7. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +5 -0
  8. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
  9. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +7 -7
  10. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  11. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +16 -8
  12. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +12 -1
  13. package/lib/lambdas/assets-deployment/fs-to-s3.js +16 -3
  14. package/lib/nextjs-assets-deployment.d.ts +7 -4
  15. package/lib/nextjs-assets-deployment.js +3 -2
  16. package/lib/nextjs-build/nextjs-build.js +1 -1
  17. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  18. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  19. package/lib/nextjs-distribution.d.ts +9 -15
  20. package/lib/nextjs-distribution.js +15 -84
  21. package/lib/nextjs-file-system.js +1 -1
  22. package/lib/nextjs-invalidation.js +1 -1
  23. package/lib/nextjs-revalidation.js +1 -1
  24. package/lib/nextjs-static-assets.js +1 -1
  25. package/lib/nextjs-vpc.js +1 -1
  26. package/lib/root-constructs/nextjs-global-containers.js +5 -4
  27. package/lib/root-constructs/nextjs-global-functions.js +5 -5
  28. package/lib/root-constructs/nextjs-regional-containers.js +4 -3
  29. package/package.json +4 -7
  30. package/assets/lambdas/sign-fn-url/sign-fn-url.edge-lambda/index.js +0 -2024
  31. package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +0 -13
  32. package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +0 -23
  33. package/lib/lambdas/sign-fn-url/sign-fn-url.edge-lambda.d.ts +0 -9
  34. package/lib/lambdas/sign-fn-url/sign-fn-url.edge-lambda.js +0 -35
  35. package/lib/lambdas/sign-fn-url/sign-request.d.ts +0 -28
  36. package/lib/lambdas/sign-fn-url/sign-request.js +0 -119
  37. package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +0 -1
  38. package/lib/lambdas/sign-fn-url/sign-request.test.js +0 -129
@@ -1,13 +0,0 @@
1
- import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
2
- import { Construct } from 'constructs';
3
- /**
4
- * Props for SignFnUrlFunction
5
- */
6
- export interface SignFnUrlFunctionProps extends cloudfront.experimental.EdgeFunctionProps {
7
- }
8
- /**
9
- * An AWS Lambda function which executes src/lambdas/sign-fn-url/sign-fn-url.
10
- */
11
- export declare class SignFnUrlFunction extends cloudfront.experimental.EdgeFunction {
12
- constructor(scope: Construct, id: string, props?: SignFnUrlFunctionProps);
13
- }
@@ -1,23 +0,0 @@
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 cloudfront = require("aws-cdk-lib/aws-cloudfront");
7
- const lambda = require("aws-cdk-lib/aws-lambda");
8
- /**
9
- * An AWS Lambda function which executes src/lambdas/sign-fn-url/sign-fn-url.
10
- */
11
- class SignFnUrlFunction extends cloudfront.experimental.EdgeFunction {
12
- constructor(scope, id, props) {
13
- super(scope, id, {
14
- description: 'src/lambdas/sign-fn-url/sign-fn-url.edge-lambda.ts',
15
- ...props,
16
- runtime: new lambda.Runtime('nodejs22.x', lambda.RuntimeFamily.NODEJS),
17
- handler: 'index.handler',
18
- code: lambda.Code.fromAsset(path.join(__dirname, '../../../assets/lambdas/sign-fn-url/sign-fn-url.edge-lambda')),
19
- });
20
- }
21
- }
22
- exports.SignFnUrlFunction = SignFnUrlFunction;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1mbi11cmwtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLWZuLXVybC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrRkFBa0Y7QUFDbEYsNkJBQTZCO0FBQzdCLHlEQUF5RDtBQUN6RCxpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxZQUFZLENBQUMsWUFBWTtJQUN6RSxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLG9EQUFvRDtZQUNqRSxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkRBQTZELENBQUMsQ0FBQztTQUNqSCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFWRCw4Q0FVQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcInBucG0gZGx4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIFNpZ25GblVybEZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkZuVXJsRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGNsb3VkZnJvbnQuZXhwZXJpbWVudGFsLkVkZ2VGdW5jdGlvblByb3BzIHtcbn1cblxuLyoqXG4gKiBBbiBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIHNyYy9sYW1iZGFzL3NpZ24tZm4tdXJsL3NpZ24tZm4tdXJsLlxuICovXG5leHBvcnQgY2xhc3MgU2lnbkZuVXJsRnVuY3Rpb24gZXh0ZW5kcyBjbG91ZGZyb250LmV4cGVyaW1lbnRhbC5FZGdlRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFNpZ25GblVybEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1mbi11cmwuZWRnZS1sYW1iZGEudHMnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ25vZGVqczIyLngnLCBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi8uLi9hc3NldHMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLWZuLXVybC5lZGdlLWxhbWJkYScpKSxcbiAgICB9KTtcbiAgfVxufSJdfQ==
@@ -1,9 +0,0 @@
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;
@@ -1,35 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1mbi11cmwuZWRnZS1sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLWZuLXVybC5lZGdlLWxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpREFBNkM7QUFFN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRW5COzs7Ozs7R0FNRztBQUNJLE1BQU0sT0FBTyxHQUE2QixLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDL0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQzdDLElBQUksQ0FBQyxPQUFPO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pELElBQUksS0FBSztRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFFLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLE1BQU0sSUFBQSwwQkFBVyxFQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRTNCLElBQUksS0FBSztRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0UsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBVlcsUUFBQSxPQUFPLFdBVWxCO0FBRUY7OztHQUdHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxPQUEwQjtJQUNuRCxPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXO1NBQ3RDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udFJlcXVlc3QsIENsb3VkRnJvbnRSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBzaWduUmVxdWVzdCB9IGZyb20gXCIuL3NpZ24tcmVxdWVzdFwiO1xuXG5jb25zdCBkZWJ1ZyA9IHRydWU7XG5cbi8qKlxuICogVGhpcyBMYW1iZGFARWRnZSBoYW5kbGVyIGZpeGVzIHMzIHJlcXVlc3RzLCBmaXhlcyB0aGUgaG9zdCBoZWFkZXIsIGFuZFxuICogc2lnbnMgcmVxdWVzdHMgYXMgdGhleSdyZSBkZXN0aW5lZCBmb3IgTGFtYmRhIEZ1bmN0aW9uIFVSTCB0aGF0IHJlcXVpcmVzXG4gKiBJQU0gQXV0aC5cbiAqXG4gKiBUaGlzIGNhbiBiZSBkZWxldGVkL3JlbW92ZWQgd2hlbiBDbG91ZEZyb250IE9BQyBMYW1iZGEgc3VwcG9ydHMgUE9TVCByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXI6IENsb3VkRnJvbnRSZXF1ZXN0SGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zdCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXT8uY2YucmVxdWVzdDtcbiAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJyZXF1ZXN0IG1pc3NpbmdcIik7XG4gIGlmIChkZWJ1ZykgY29uc29sZS5sb2coXCJpbnB1dCByZXF1ZXN0XCIsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QsIG51bGwsIDIpKTtcblxuICBlc2NhcGVRdWVyeXN0cmluZyhyZXF1ZXN0KTtcbiAgYXdhaXQgc2lnblJlcXVlc3QocmVxdWVzdCk7XG5cbiAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZyhcIm91dHB1dCByZXF1ZXN0XCIsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpLCBudWxsLCAyKTtcbiAgcmV0dXJuIHJlcXVlc3Q7XG59O1xuXG4vKipcbiAqIExhbWJkYSBVUkwgd2lsbCByZWplY3QgcXVlcnkgcGFyYW1ldGVycyB3aXRoIGJyYWNrZXRzIHNvIHdlIG5lZWQgdG8gZW5jb2RlXG4gKiBodHRwczovL2dpdGh1Yi5kZXYvcHdyZHJ2ci9sYW1iZGEtdXJsLXNpZ25pbmcvYmxvYi9tYWluL3BhY2thZ2VzL2VkZ2UtdG8tb3JpZ2luL3NyYy90cmFuc2xhdGUtcmVxdWVzdC50cyNMMTktTDMxXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVF1ZXJ5c3RyaW5nKHJlcXVlc3Q6IENsb3VkRnJvbnRSZXF1ZXN0KSB7XG4gIHJlcXVlc3QucXVlcnlzdHJpbmcgPSByZXF1ZXN0LnF1ZXJ5c3RyaW5nXG4gICAgLnJlcGxhY2UoL1xcWy9nLCBcIiU1QlwiKVxuICAgIC5yZXBsYWNlKC9dL2csIFwiJTVEXCIpO1xufVxuIl19
@@ -1,28 +0,0 @@
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 {};
@@ -1,119 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.signRequest = signRequest;
4
- exports.getRegionFromLambdaUrl = getRegionFromLambdaUrl;
5
- exports.cfHeadersToHeaderBag = cfHeadersToHeaderBag;
6
- exports.headerBagToCfHeaders = headerBagToCfHeaders;
7
- exports.queryStringToQueryParamBag = queryStringToQueryParamBag;
8
- // we bundle lambdas during build, so below dependencies actually don't need to be included in "dependencies"
9
- // eslint-disable-next-line import/no-extraneous-dependencies
10
- const sha256_js_1 = require("@aws-crypto/sha256-js");
11
- // eslint-disable-next-line import/no-extraneous-dependencies
12
- const signature_v4_1 = require("@smithy/signature-v4");
13
- let sigv4;
14
- /**
15
- * Enables use of IAM_AUTH on Lambda Function URL
16
- * @link https://medium.com/@dario_26152/restrict-access-to-lambda-functionurl-to-cloudfront-using-aws-iam-988583834705
17
- */
18
- async function signRequest(request) {
19
- if (!sigv4) {
20
- const region = getRegionFromLambdaUrl(request.origin?.custom?.domainName || "");
21
- sigv4 = getSigV4(region);
22
- }
23
- // remove x-forwarded-for b/c it changes from hop to hop
24
- delete request.headers["x-forwarded-for"];
25
- const headerBag = cfHeadersToHeaderBag(request.headers);
26
- const hostname = headerBag.host;
27
- if (!hostname)
28
- throw new Error("host header missing");
29
- let body;
30
- if (request.body?.data) {
31
- body = Buffer.from(request.body.data, "base64").toString();
32
- }
33
- const params = queryStringToQueryParamBag(request.querystring);
34
- const signed = await sigv4.sign({
35
- method: request.method,
36
- headers: headerBag,
37
- hostname,
38
- path: request.uri,
39
- body,
40
- query: params,
41
- protocol: "https",
42
- });
43
- request.headers = headerBagToCfHeaders(signed.headers);
44
- }
45
- function getSigV4(region) {
46
- const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
47
- const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
48
- const sessionToken = process.env.AWS_SESSION_TOKEN;
49
- if (!region)
50
- throw new Error("AWS_REGION missing");
51
- if (!accessKeyId)
52
- throw new Error("AWS_ACCESS_KEY_ID missing");
53
- if (!secretAccessKey)
54
- throw new Error("AWS_SECRET_ACCESS_KEY missing");
55
- if (!sessionToken)
56
- throw new Error("AWS_SESSION_TOKEN missing");
57
- return new signature_v4_1.SignatureV4({
58
- service: "lambda",
59
- region,
60
- credentials: {
61
- accessKeyId,
62
- secretAccessKey,
63
- sessionToken,
64
- },
65
- sha256: sha256_js_1.Sha256,
66
- });
67
- }
68
- function getRegionFromLambdaUrl(url) {
69
- const region = url.split(".").at(2);
70
- if (!region)
71
- throw new Error("Region couldn't be extracted from Lambda Function URL");
72
- return region;
73
- }
74
- /**
75
- * Converts CloudFront headers (can have array of header values) to simple
76
- * header bag (object) required by `sigv4.sign`
77
- *
78
- * NOTE: only includes headers allowed by origin policy to prevent signature
79
- * mismatch
80
- */
81
- function cfHeadersToHeaderBag(headers) {
82
- const headerBag = {};
83
- // assume first header value is the best match
84
- // headerKey is case insensitive whereas key (adjacent property value that is
85
- // not destructured) is case sensitive. we arbitrarily use case insensitive key
86
- for (const [headerKey, [headerObj]] of Object.entries(headers)) {
87
- const value = headerObj?.value;
88
- if (value) {
89
- headerBag[headerKey] = value;
90
- }
91
- }
92
- return headerBag;
93
- }
94
- /**
95
- * Converts simple header bag (object) to CloudFront headers
96
- */
97
- function headerBagToCfHeaders(headerBag) {
98
- const cfHeaders = {};
99
- for (const [headerKey, value] of Object.entries(headerBag)) {
100
- /*
101
- When your Lambda function adds or modifies request headers and you don't include the header key field, Lambda@Edge automatically inserts a header key using the header name that you provide. Regardless of how you've formatted the header name, the header key that's inserted automatically is formatted with initial capitalization for each part, separated by hyphens (-).
102
- See: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html
103
- */
104
- cfHeaders[headerKey] = [{ value }];
105
- }
106
- return cfHeaders;
107
- }
108
- /**
109
- * Converts CloudFront querystring to QueryParamaterBag for IAM Sig V4
110
- */
111
- function queryStringToQueryParamBag(querystring) {
112
- const oldParams = new URLSearchParams(querystring);
113
- const newParams = {};
114
- for (const [k, v] of oldParams) {
115
- newParams[k] = v;
116
- }
117
- return newParams;
118
- }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvc2lnbi1mbi11cmwvc2lnbi1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBYUEsa0NBMkJDO0FBc0JELHdEQUtDO0FBYUQsb0RBWUM7QUFLRCxvREFVQztBQUtELGdFQU9DO0FBdkhELDZHQUE2RztBQUM3Ryw2REFBNkQ7QUFDN0QscURBQStDO0FBQy9DLDZEQUE2RDtBQUM3RCx1REFBbUQ7QUFHbkQsSUFBSSxLQUFrQixDQUFDO0FBRXZCOzs7R0FHRztBQUNJLEtBQUssVUFBVSxXQUFXLENBQUMsT0FBMEI7SUFDMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQ25DLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQ3pDLENBQUM7UUFDRixLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCx3REFBd0Q7SUFDeEQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDaEMsSUFBSSxDQUFDLFFBQVE7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDdEQsSUFBSSxJQUF3QixDQUFDO0lBQzdCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lB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QUFDLFdBQW1CO0lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztJQUMxQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDL0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHdlIGJ1bmRsZSBsYW1iZGFzIGR1cmluZyBidWlsZCwgc28gYmVsb3cgZGVwZW5kZW5jaWVzIGFjdHVhbGx5IGRvbid0IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4gXCJkZXBlbmRlbmNpZXNcIlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgU2hhMjU2IH0gZnJvbSBcIkBhd3MtY3J5cHRvL3NoYTI1Ni1qc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgU2lnbmF0dXJlVjQgfSBmcm9tIFwiQHNtaXRoeS9zaWduYXR1cmUtdjRcIjtcbmltcG9ydCB0eXBlIHsgQ2xvdWRGcm9udEhlYWRlcnMsIENsb3VkRnJvbnRSZXF1ZXN0IH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcblxubGV0IHNpZ3Y0OiBTaWduYXR1cmVWNDtcblxuLyoqXG4gKiBFbmFibGVzIHVzZSBvZiBJQU1fQVVUSCBvbiBMYW1iZGEgRnVuY3Rpb24gVVJMXG4gKiBAbGluayBodHRwczovL21lZGl1bS5jb20vQGRhcmlvXzI2MTUyL3Jlc3RyaWN0LWFjY2Vzcy10by1sYW1iZGEtZnVuY3Rpb251cmwtdG8tY2xvdWRmcm9udC11c2luZy1hd3MtaWFtLTk4ODU4MzgzNDcwNVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblJlcXVlc3QocmVxdWVzdDogQ2xvdWRGcm9udFJlcXVlc3QpIHtcbiAgaWYgKCFzaWd2NCkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IGdldFJlZ2lvbkZyb21MYW1iZGFVcmwoXG4gICAgICByZXF1ZXN0Lm9yaWdpbj8uY3VzdG9tPy5kb21haW5OYW1lIHx8IFwiXCIsXG4gICAgKTtcbiAgICBzaWd2NCA9IGdldFNpZ1Y0KHJlZ2lvbik7XG4gIH1cbiAgLy8gcmVtb3ZlIHgtZm9yd2FyZGVkLWZvciBiL2MgaXQgY2hhbmdlcyBmcm9tIGhvcCB0byBob3BcbiAgZGVsZXRlIHJlcXVlc3QuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWZvclwiXTtcbiAgY29uc3QgaGVhZGVyQmFnID0gY2ZIZWFkZXJzVG9IZWFkZXJCYWcocmVxdWVzdC5oZWFkZXJzKTtcbiAgY29uc3QgaG9zdG5hbWUgPSBoZWFkZXJCYWcuaG9zdDtcbiAgaWYgKCFob3N0bmFtZSkgdGhyb3cgbmV3IEVycm9yKFwiaG9zdCBoZWFkZXIgbWlzc2luZ1wiKTtcbiAgbGV0IGJvZHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHJlcXVlc3QuYm9keT8uZGF0YSkge1xuICAgIGJvZHkgPSBCdWZmZXIuZnJvbShyZXF1ZXN0LmJvZHkuZGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgfVxuICBjb25zdCBwYXJhbXMgPSBxdWVyeVN0cmluZ1RvUXVlcnlQYXJhbUJhZyhyZXF1ZXN0LnF1ZXJ5c3RyaW5nKTtcbiAgY29uc3Qgc2lnbmVkID0gYXdhaXQgc2lndjQuc2lnbih7XG4gICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICBoZWFkZXJzOiBoZWFkZXJCYWcsXG4gICAgaG9zdG5hbWUsXG4gICAgcGF0aDogcmVxdWVzdC51cmksXG4gICAgYm9keSxcbiAgICBxdWVyeTogcGFyYW1zLFxuICAgIHByb3RvY29sOiBcImh0dHBzXCIsXG4gIH0pO1xuICByZXF1ZXN0LmhlYWRlcnMgPSBoZWFkZXJCYWdUb0NmSGVhZGVycyhzaWduZWQuaGVhZGVycyk7XG59XG5cbmZ1bmN0aW9uIGdldFNpZ1Y0KHJlZ2lvbjogc3RyaW5nKTogU2lnbmF0dXJlVjQge1xuICBjb25zdCBhY2Nlc3NLZXlJZCA9IHByb2Nlc3MuZW52LkFXU19BQ0NFU1NfS0VZX0lEO1xuICBjb25zdCBzZWNyZXRBY2Nlc3NLZXkgPSBwcm9jZXNzLmVudi5BV1NfU0VDUkVUX0FDQ0VTU19LRVk7XG4gIGNvbnN0IHNlc3Npb25Ub2tlbiA9IHByb2Nlc3MuZW52LkFXU19TRVNTSU9OX1RPS0VOO1xuICBpZiAoIXJlZ2lvbikgdGhyb3cgbmV3IEVycm9yKFwiQVdTX1JFR0lPTiBtaXNzaW5nXCIpO1xuICBpZiAoIWFjY2Vzc0tleUlkKSB0aHJvdyBuZXcgRXJyb3IoXCJBV1NfQUNDRVNTX0tFWV9JRCBtaXNzaW5nXCIpO1xuICBpZiAoIXNlY3JldEFjY2Vzc0tleSkgdGhyb3cgbmV3IEVycm9yKFwiQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZIG1pc3NpbmdcIik7XG4gIGlmICghc2Vzc2lvblRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJBV1NfU0VTU0lPTl9UT0tFTiBtaXNzaW5nXCIpO1xuICByZXR1cm4gbmV3IFNpZ25hdHVyZVY0KHtcbiAgICBzZXJ2aWNlOiBcImxhbWJkYVwiLFxuICAgIHJlZ2lvbixcbiAgICBjcmVkZW50aWFsczoge1xuICAgICAgYWNjZXNzS2V5SWQsXG4gICAgICBzZWNyZXRBY2Nlc3NLZXksXG4gICAgICBzZXNzaW9uVG9rZW4sXG4gICAgfSxcbiAgICBzaGEyNTY6IFNoYTI1NixcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpb25Gcm9tTGFtYmRhVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaW9uID0gdXJsLnNwbGl0KFwiLlwiKS5hdCgyKTtcbiAgaWYgKCFyZWdpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVnaW9uIGNvdWxkbid0IGJlIGV4dHJhY3RlZCBmcm9tIExhbWJkYSBGdW5jdGlvbiBVUkxcIik7XG4gIHJldHVybiByZWdpb247XG59XG5cbi8qKlxuICogQmFnIG9yIE1hcCB1c2VkIGZvciBIZWFkZXJCYWcgb3IgUXVlcnlTdHJpbmdQYXJhbWV0ZXJCYWcgZm9yIGBzaWd2NC5zaWduKClgXG4gKi9cbnR5cGUgQmFnID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbi8qKlxuICogQ29udmVydHMgQ2xvdWRGcm9udCBoZWFkZXJzIChjYW4gaGF2ZSBhcnJheSBvZiBoZWFkZXIgdmFsdWVzKSB0byBzaW1wbGVcbiAqIGhlYWRlciBiYWcgKG9iamVjdCkgcmVxdWlyZWQgYnkgYHNpZ3Y0LnNpZ25gXG4gKlxuICogTk9URTogb25seSBpbmNsdWRlcyBoZWFkZXJzIGFsbG93ZWQgYnkgb3JpZ2luIHBvbGljeSB0byBwcmV2ZW50IHNpZ25hdHVyZVxuICogbWlzbWF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNmSGVhZGVyc1RvSGVhZGVyQmFnKGhlYWRlcnM6IENsb3VkRnJvbnRIZWFkZXJzKTogQmFnIHtcbiAgY29uc3QgaGVhZGVyQmFnOiBCYWcgPSB7fTtcbiAgLy8gYXNzdW1lIGZpcnN0IGhlYWRlciB2YWx1ZSBpcyB0aGUgYmVzdCBtYXRjaFxuICAvLyBoZWFkZXJLZXkgaXMgY2FzZSBpbnNlbnNpdGl2ZSB3aGVyZWFzIGtleSAoYWRqYWNlbnQgcHJvcGVydHkgdmFsdWUgdGhhdCBpc1xuICAvLyBub3QgZGVzdHJ1Y3R1cmVkKSBpcyBjYXNlIHNlbnNpdGl2ZS4gd2UgYXJiaXRyYXJpbHkgdXNlIGNhc2UgaW5zZW5zaXRpdmUga2V5XG4gIGZvciAoY29uc3QgW2hlYWRlcktleSwgW2hlYWRlck9ial1dIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBoZWFkZXJPYmo/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaGVhZGVyQmFnW2hlYWRlcktleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhlYWRlckJhZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBzaW1wbGUgaGVhZGVyIGJhZyAob2JqZWN0KSB0byBDbG91ZEZyb250IGhlYWRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlckJhZ1RvQ2ZIZWFkZXJzKGhlYWRlckJhZzogQmFnKTogQ2xvdWRGcm9udEhlYWRlcnMge1xuICBjb25zdCBjZkhlYWRlcnM6IENsb3VkRnJvbnRIZWFkZXJzID0ge307XG4gIGZvciAoY29uc3QgW2hlYWRlcktleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlckJhZykpIHtcbiAgICAvKlxuICAgICAgV2hlbiB5b3VyIExhbWJkYSBmdW5jdGlvbiBhZGRzIG9yIG1vZGlmaWVzIHJlcXVlc3QgaGVhZGVycyBhbmQgeW91IGRvbid0IGluY2x1ZGUgdGhlIGhlYWRlciBrZXkgZmllbGQsIExhbWJkYUBFZGdlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0cyBhIGhlYWRlciBrZXkgdXNpbmcgdGhlIGhlYWRlciBuYW1lIHRoYXQgeW91IHByb3ZpZGUuIFJlZ2FyZGxlc3Mgb2YgaG93IHlvdSd2ZSBmb3JtYXR0ZWQgdGhlIGhlYWRlciBuYW1lLCB0aGUgaGVhZGVyIGtleSB0aGF0J3MgaW5zZXJ0ZWQgYXV0b21hdGljYWxseSBpcyBmb3JtYXR0ZWQgd2l0aCBpbml0aWFsIGNhcGl0YWxpemF0aW9uIGZvciBlYWNoIHBhcnQsIHNlcGFyYXRlZCBieSBoeXBoZW5zICgtKS5cbiAgICAgIFNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2xhbWJkYS1ldmVudC1zdHJ1Y3R1cmUuaHRtbFxuICAgICovXG4gICAgY2ZIZWFkZXJzW2hlYWRlcktleV0gPSBbeyB2YWx1ZSB9XTtcbiAgfVxuICByZXR1cm4gY2ZIZWFkZXJzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIENsb3VkRnJvbnQgcXVlcnlzdHJpbmcgdG8gUXVlcnlQYXJhbWF0ZXJCYWcgZm9yIElBTSBTaWcgVjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U3RyaW5nVG9RdWVyeVBhcmFtQmFnKHF1ZXJ5c3RyaW5nOiBzdHJpbmcpOiBCYWcge1xuICBjb25zdCBvbGRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5c3RyaW5nKTtcbiAgY29uc3QgbmV3UGFyYW1zOiBCYWcgPSB7fTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2Ygb2xkUGFyYW1zKSB7XG4gICAgbmV3UGFyYW1zW2tdID0gdjtcbiAgfVxuICByZXR1cm4gbmV3UGFyYW1zO1xufVxuIl19
@@ -1 +0,0 @@
1
- export {};
@@ -1,129 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const sign_request_1 = require("./sign-request");
4
- describe("LambdaOriginRequestIamAuth", () => {
5
- test("signRequest should add x-amz headers", async () => {
6
- // dummy AWS credentials
7
- process.env = { ...process.env, ...getFakeAwsCreds() };
8
- const event = getFakePageRequest();
9
- const request = event.Records[0]?.cf.request;
10
- if (!request)
11
- throw new Error("Missing request");
12
- await (0, sign_request_1.signRequest)(request);
13
- const securityHeaders = [
14
- "x-amz-date",
15
- "x-amz-security-token",
16
- "x-amz-content-sha256",
17
- "authorization",
18
- ];
19
- const hasSignedHeaders = securityHeaders.every((h) => h in request.headers);
20
- expect(hasSignedHeaders).toBe(true);
21
- });
22
- test("getRegionFromLambdaUrl should correctly get region", () => {
23
- const event = getFakePageRequest();
24
- const request = event.Records[0]?.cf.request;
25
- if (!request)
26
- throw new Error("Missing request");
27
- const actual = (0, sign_request_1.getRegionFromLambdaUrl)(request.origin?.custom?.domainName || "");
28
- expect(actual).toBe("us-east-1");
29
- });
30
- });
31
- function getFakePageRequest() {
32
- return {
33
- Records: [
34
- {
35
- cf: {
36
- config: {
37
- distributionDomainName: "d6b8brjqfujeb.cloudfront.net",
38
- distributionId: "EHX2SDUU61T7U",
39
- eventType: "origin-request",
40
- requestId: "",
41
- },
42
- request: {
43
- clientIp: "1.1.1.1",
44
- headers: {
45
- host: [
46
- {
47
- key: "Host",
48
- value: "d6b8brjqfujeb.cloudfront.net",
49
- },
50
- ],
51
- "accept-language": [
52
- {
53
- key: "Accept-Language",
54
- value: "en-US,en;q=0.9",
55
- },
56
- ],
57
- referer: [
58
- {
59
- key: "Referer",
60
- value: "https://d6b8brjqfujeb.cloudfront.net/some/path",
61
- },
62
- ],
63
- "x-forwarded-for": [
64
- {
65
- key: "X-Forwarded-For",
66
- value: "1.1.1.1",
67
- },
68
- ],
69
- "user-agent": [
70
- {
71
- key: "User-Agent",
72
- value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
73
- },
74
- ],
75
- via: [
76
- {
77
- key: "Via",
78
- value: "2.0 8bf94e29f889f8d0076c4502ae008b58.cloudfront.net (CloudFront)",
79
- },
80
- ],
81
- "accept-encoding": [
82
- {
83
- key: "Accept-Encoding",
84
- value: "br,gzip",
85
- },
86
- ],
87
- "sec-ch-ua": [
88
- {
89
- key: "sec-ch-ua",
90
- value: '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
91
- },
92
- ],
93
- },
94
- method: "GET",
95
- querystring: "",
96
- uri: "/some/path",
97
- origin: {
98
- custom: {
99
- customHeaders: {},
100
- domainName: "kjtbbx7u533q7p7n5font6gpci0phrng.lambda-url.us-east-1.on.aws",
101
- keepaliveTimeout: 5,
102
- path: "",
103
- port: 443,
104
- protocol: "https",
105
- readTimeout: 30,
106
- sslProtocols: ["TLSv1.2"],
107
- },
108
- },
109
- body: {
110
- action: "read-only",
111
- data: "",
112
- encoding: "base64",
113
- inputTruncated: false,
114
- },
115
- },
116
- },
117
- },
118
- ],
119
- };
120
- }
121
- function getFakeAwsCreds() {
122
- return {
123
- AWS_REGION: "us-east-1",
124
- AWS_ACCESS_KEY_ID: "AKIAIOSFODNN7EXAMPLE",
125
- AWS_SECRET_ACCESS_KEY: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
126
- AWS_SESSION_TOKEN: "ZQoJb3JpZ2luX2VjEFgaCXVzLWVhc3QtMSJGMEQCIHijzdTXh59aSe2hRfCWpFd2/jacPUC+8rCq3qBIiuG2AiAGX8jqld+p04nPYfuShi1lLN/Z1hEXG9QSNEmEFLTxGSqmAgiR//////////8BEAIaDDI2ODkxNDQ2NTIzMSIMrAMO5/GTvMgoG+chKvoB4f4V1TfkZiHOlmeMK6Ep58mav65A0WU3K9WPzdrJojnGqqTuS85zTlKhm3lfmMxCOtwS/OlOuiBQ1MZNlksK2je1FazgbXN46fNSi+iHiY9VfyRAd0wSLmXB8FFrCGsU92QOy/+deji0qIVadsjEyvBRxzQj5oIUI5sb74Yt7uNvka9fVZcT4s4IndYda0N7oZwIrApCuzzBMuoMAhabmgVrZTbiLmvOiFHS2XZWBySABdygqaIzfV7G4hjckvcXhtxpkw+HJUZTNzVUlspghzte1UG6VvIRV8ax3kWA3zqm8nA/1gHkl40DubJIXz1AJbg5Cps5moE1pjD7vNijBjqeAZh0Q/e0awIHnV4dXMfXUu5mWJ7Db9K1eUlSSL9FyiKeKd94HEdrbIrnPuIWVT/I/5RjNm7NgPYiqmpyx3fSpVcq9CKws0oEfBw6J9Hxk0IhV8yWFZYNMWIarUUZdmL9vVeJmFZmwyL4JjY1s/SZIU/oa8DtvkmP4RG4tTJfpyyhoKL0wJOevkYyoigNllBlLN59SZAT8CCADpN/B+sK",
127
- };
128
- }
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1yZXF1ZXN0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9zaWduLWZuLXVybC9zaWduLXJlcXVlc3QudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUFxRTtBQUVyRSxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCx3QkFBd0I7UUFDeEIsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFBLDBCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsTUFBTSxlQUFlLEdBQUc7WUFDdEIsWUFBWTtZQUNaLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsZUFBZTtTQUNoQixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7UUFDOUQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxN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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZyb250UmVxdWVzdEV2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IGdldFJlZ2lvbkZyb21MYW1iZGFVcmwsIHNpZ25SZXF1ZXN0IH0gZnJvbSBcIi4vc2lnbi1yZXF1ZXN0XCI7XG5cbmRlc2NyaWJlKFwiTGFtYmRhT3JpZ2luUmVxdWVzdElhbUF1dGhcIiwgKCkgPT4ge1xuICB0ZXN0KFwic2lnblJlcXVlc3Qgc2hvdWxkIGFkZCB4LWFteiBoZWFkZXJzXCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBkdW1teSBBV1MgY3JlZGVudGlhbHNcbiAgICBwcm9jZXNzLmVudiA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmdldEZha2VBd3NDcmVkcygpIH07XG4gICAgY29uc3QgZXZlbnQgPSBnZXRGYWtlUGFnZVJlcXVlc3QoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXT8uY2YucmVxdWVzdDtcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgcmVxdWVzdFwiKTtcbiAgICBhd2FpdCBzaWduUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCBzZWN1cml0eUhlYWRlcnMgPSBbXG4gICAgICBcIngtYW16LWRhdGVcIixcbiAgICAgIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbiAgICAgIFwieC1hbXotY29udGVudC1zaGEyNTZcIixcbiAgICAgIFwiYXV0aG9yaXphdGlvblwiLFxuICAgIF07XG4gICAgY29uc3QgaGFzU2lnbmVkSGVhZGVycyA9IHNlY3VyaXR5SGVhZGVycy5ldmVyeSgoaCkgPT4gaCBpbiByZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGV4cGVjdChoYXNTaWduZWRIZWFkZXJzKS50b0JlKHRydWUpO1xuICB9KTtcblxuICB0ZXN0KFwiZ2V0UmVnaW9uRnJvbUxhbWJkYVVybCBzaG91bGQgY29ycmVjdGx5IGdldCByZWdpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0gZ2V0RmFrZVBhZ2VSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LlJlY29yZHNbMF0/LmNmLnJlcXVlc3Q7XG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHJlcXVlc3RcIik7XG4gICAgY29uc3QgYWN0dWFsID0gZ2V0UmVnaW9uRnJvbUxhbWJkYVVybChcbiAgICAgIHJlcXVlc3Qub3JpZ2luPy5jdXN0b20/LmRvbWFpbk5hbWUgfHwgXCJcIixcbiAgICApO1xuICAgIGV4cGVjdChhY3R1YWwpLnRvQmUoXCJ1cy1lYXN0LTFcIik7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIGdldEZha2VQYWdlUmVxdWVzdCgpOiBDbG91ZEZyb250UmVxdWVzdEV2ZW50IHtcbiAgcmV0dXJuIHtcbiAgICBSZWNvcmRzOiBbXG4gICAgICB7XG4gICAgICAgIGNmOiB7XG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICBkaXN0cmlidXRpb25Eb21haW5OYW1lOiBcImQ2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXRcIixcbiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbklkOiBcIkVIWDJTRFVVNjFUN1VcIixcbiAgICAgICAgICAgIGV2ZW50VHlwZTogXCJvcmlnaW4tcmVxdWVzdFwiLFxuICAgICAgICAgICAgcmVxdWVzdElkOiBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgY2xpZW50SXA6IFwiMS4xLjEuMVwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBob3N0OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkhvc3RcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImQ2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcImFjY2VwdC1sYW5ndWFnZVwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkFjY2VwdC1MYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiZW4tVVMsZW47cT0wLjlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZWZlcmVyOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlJlZmVyZXJcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImh0dHBzOi8vZDZiOGJyanFmdWplYi5jbG91ZGZyb250Lm5ldC9zb21lL3BhdGhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcIngtZm9yd2FyZGVkLWZvclwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlgtRm9yd2FyZGVkLUZvclwiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiMS4xLjEuMVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFwidXNlci1hZ2VudFwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIlVzZXItQWdlbnRcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTMuMC4wLjAgU2FmYXJpLzUzNy4zNlwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHZpYTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogXCJWaWFcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBcIjIuMCA4YmY5NGUyOWY4ODlmOGQwMDc2YzQ1MDJhZTAwOGI1OC5jbG91ZGZyb250Lm5ldCAoQ2xvdWRGcm9udClcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiYnIsZ3ppcFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFwic2VjLWNoLXVhXCI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6IFwic2VjLWNoLXVhXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgJ1wiR29vZ2xlIENocm9tZVwiO3Y9XCIxMTNcIiwgXCJDaHJvbWl1bVwiO3Y9XCIxMTNcIiwgXCJOb3QtQS5CcmFuZFwiO3Y9XCIyNFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBcIlwiLFxuICAgICAgICAgICAgdXJpOiBcIi9zb21lL3BhdGhcIixcbiAgICAgICAgICAgIG9yaWdpbjoge1xuICAgICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgICBjdXN0b21IZWFkZXJzOiB7fSxcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOlxuICAgICAgICAgICAgICAgICAgXCJranRiYng3dTUzM3E3cDduNWZvbnQ2Z3BjaTBwaHJuZy5sYW1iZGEtdXJsLnVzLWVhc3QtMS5vbi5hd3NcIixcbiAgICAgICAgICAgICAgICBrZWVwYWxpdmVUaW1lb3V0OiA1LFxuICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgcG9ydDogNDQzLFxuICAgICAgICAgICAgICAgIHByb3RvY29sOiBcImh0dHBzXCIsXG4gICAgICAgICAgICAgICAgcmVhZFRpbWVvdXQ6IDMwLFxuICAgICAgICAgICAgICAgIHNzbFByb3RvY29sczogW1wiVExTdjEuMlwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGFjdGlvbjogXCJyZWFkLW9ubHlcIixcbiAgICAgICAgICAgICAgZGF0YTogXCJcIixcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwiYmFzZTY0XCIsXG4gICAgICAgICAgICAgIGlucHV0VHJ1bmNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RmFrZUF3c0NyZWRzKCkge1xuICByZXR1cm4ge1xuICAgIEFXU19SRUdJT046IFwidXMtZWFzdC0xXCIsXG4gICAgQVdTX0FDQ0VTU19LRVlfSUQ6IFwiQUtJQUlPU0ZPRE5ON0VYQU1QTEVcIixcbiAgICBBV1NfU0VDUkVUX0FDQ0VTU19LRVk6IFwid0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWVwiLFxuICAgIEFXU19TRVNTSU9OX1RPS0VOOlxuICAgICAgXCJaUW9KYjNKcFoybHVYMlZqRUZnYUNYVnpMV1ZoYzNRdE1TSkdNRVFDSUhpanpkVFhoNTlhU2UyaFJmQ1dwRmQyL2phY1BVQys4ckNxM3FCSWl1RzJBaUFHWDhqcWxkK3AwNG5QWWZ1U2hpMWxMTi9aMWhFWEc5UVNORW1FRkxUeEdTcW1BZ2lSLy8vLy8vLy8vLzhCRUFJYURESTJPRGt4TkRRMk5USXpNU0lNckFNTzUvR1R2TWdvRytjaEt2b0I0ZjRWMVRma1ppSE9sbWVNSzZFcDU4bWF2NjVBMFdVM0s5V1B6ZHJKb2puR3FxVHVTODV6VGxLaG0zbGZtTXhDT3R3Uy9PbE91aUJRMU1aTmxrc0syamUxRmF6Z2JYTjQ2Zk5TaStpSGlZOVZmeVJBZDB3U0xtWEI4RkZyQ0dzVTkyUU95LytkZWppMHFJVmFkc2pFeXZCUnh6UWo1b0lVSTVzYjc0WXQ3dU52a2E5ZlZaY1Q0czRJbmRZZGEwTjdvWndJckFwQ3V6ekJNdW9NQWhhYm1nVnJaVGJpTG12T2lGSFMyWFpXQnlTQUJkeWdxYUl6ZlY3RzRoamNrdmNYaHR4cGt3K0hKVVpUTnpWVWxzcGdoenRlMVVHNlZ2SVJWOGF4M2tXQTN6cW04bkEvMWdIa2w0MER1YkpJWHoxQUpiZzVDcHM1bW9FMXBqRDd2TmlqQmpxZUFaaDBRL2UwYXdJSG5WNGRYTWZYVXU1bVdKN0RiOUsxZVVsU1NMOUZ5aUtlS2Q5NEhFZHJiSXJuUHVJV1ZUL0kvNVJqTm03TmdQWWlxbXB5eDNmU3BWY3E5Q0t3czBvRWZCdzZKOUh4azBJaFY4eVdGWllOTVdJYXJVVVpkbUw5dlZlSm1GWm13eUw0SmpZMXMvU1pJVS9vYThEdHZrbVA0Ukc0dFRKZnB5eWhvS0wwd0pPZXZrWXlvaWdObGxCbExONTlTWkFUOENDQURwTi9CK3NLXCIsXG4gIH07XG59XG4iXX0=