@codedrifters/constructs 0.0.8 → 0.0.9
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/lib/index.d.mts +107 -0
- package/lib/index.d.ts +107 -2
- package/lib/index.js +371 -16
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +387 -0
- package/lib/index.mjs.map +1 -0
- package/package.json +5 -4
- package/lib/s3/index.d.ts +0 -1
- package/lib/s3/index.js +0 -18
- package/lib/s3/private-bucket.d.ts +0 -7
- package/lib/s3/private-bucket.js +0 -22
- package/lib/static-hosting/index.d.ts +0 -2
- package/lib/static-hosting/index.js +0 -19
- package/lib/static-hosting/static-content.d.ts +0 -49
- package/lib/static-hosting/static-content.js +0 -52
- package/lib/static-hosting/static-hosting.d.ts +0 -49
- package/lib/static-hosting/static-hosting.js +0 -176
- package/lib/static-hosting/static-hosting.viewer-request-handler.d.ts +0 -35
- package/lib/static-hosting/static-hosting.viewer-request-handler.js +0 -76
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { StackProps } from "aws-cdk-lib";
|
|
2
|
-
import { HostedZoneAttributes } from "aws-cdk-lib/aws-route53";
|
|
3
|
-
import { Construct } from "constructs";
|
|
4
|
-
import { PrivateBucketProps } from "../s3/private-bucket";
|
|
5
|
-
export interface StaticDomainProps {
|
|
6
|
-
/**
|
|
7
|
-
* The base domain (ie: codedrifters.com)
|
|
8
|
-
*/
|
|
9
|
-
readonly baseDomain: string;
|
|
10
|
-
/**
|
|
11
|
-
* Hosted zone ID for the base domain.
|
|
12
|
-
*/
|
|
13
|
-
readonly hostedZoneAttributes: HostedZoneAttributes;
|
|
14
|
-
}
|
|
15
|
-
export interface StaticHostingProps extends StackProps {
|
|
16
|
-
/**
|
|
17
|
-
* Short description used in various places for traceability.
|
|
18
|
-
*/
|
|
19
|
-
readonly description?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Values used to connect a domain name to the cloudfront distribution. If not
|
|
22
|
-
* supplied, cloudfront doesn't use a custom domain.
|
|
23
|
-
*/
|
|
24
|
-
readonly staticDomainProps?: StaticDomainProps;
|
|
25
|
-
/**
|
|
26
|
-
* Parameter name to use when storing the static hosting bucket's ARN.
|
|
27
|
-
* This is needed in other later steps when deploying hosted content to S3.
|
|
28
|
-
*/
|
|
29
|
-
readonly bucketArnParamName?: string;
|
|
30
|
-
/**
|
|
31
|
-
* Parameter name to use when storing the CloudFront Distribution Domain Name.
|
|
32
|
-
*/
|
|
33
|
-
readonly distributionDomainParamName?: string;
|
|
34
|
-
/**
|
|
35
|
-
* Parameter name to use when storing the CloudFront Distribution ID.
|
|
36
|
-
*/
|
|
37
|
-
readonly distributionIDParamName?: string;
|
|
38
|
-
/**
|
|
39
|
-
* Props to pass to the private S3 bucket.
|
|
40
|
-
*/
|
|
41
|
-
readonly privateBucketProps?: PrivateBucketProps;
|
|
42
|
-
}
|
|
43
|
-
export declare class StaticHosting extends Construct {
|
|
44
|
-
/**
|
|
45
|
-
* Full domain name used as basis for hosting.
|
|
46
|
-
*/
|
|
47
|
-
readonly fullDomain: string;
|
|
48
|
-
constructor(scope: Construct, id: string, props?: StaticHostingProps);
|
|
49
|
-
}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StaticHosting = void 0;
|
|
4
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
-
const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
|
|
6
|
-
const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
|
|
7
|
-
const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
|
|
8
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
9
|
-
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
|
|
10
|
-
const aws_logs_1 = require("aws-cdk-lib/aws-logs");
|
|
11
|
-
const aws_route53_1 = require("aws-cdk-lib/aws-route53");
|
|
12
|
-
const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
|
|
13
|
-
const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
|
|
14
|
-
const constructs_1 = require("constructs");
|
|
15
|
-
const private_bucket_1 = require("../s3/private-bucket");
|
|
16
|
-
class StaticHosting extends constructs_1.Construct {
|
|
17
|
-
constructor(scope, id, props = {}) {
|
|
18
|
-
super(scope, id);
|
|
19
|
-
/***************************************************************************
|
|
20
|
-
*
|
|
21
|
-
* Initial Setup
|
|
22
|
-
*
|
|
23
|
-
* Set some defaults, build domain information.
|
|
24
|
-
*
|
|
25
|
-
**************************************************************************/
|
|
26
|
-
const { bucketArnParamName, distributionDomainParamName, distributionIDParamName, staticDomainProps, privateBucketProps, } = {
|
|
27
|
-
bucketArnParamName: "/STATIC_WEBSITE/BUCKET_ARN",
|
|
28
|
-
distributionDomainParamName: "/STATIC_WEBSITE/DISTRIBUTION_DOMAIN",
|
|
29
|
-
distributionIDParamName: "/STATIC_WEBSITE/DISTRIBUTION_ID",
|
|
30
|
-
...props,
|
|
31
|
-
};
|
|
32
|
-
const { baseDomain, hostedZoneAttributes } = staticDomainProps ?? {};
|
|
33
|
-
/***************************************************************************
|
|
34
|
-
*
|
|
35
|
-
* PRIVATE BUCKET
|
|
36
|
-
*
|
|
37
|
-
* A bucket to store the files within.
|
|
38
|
-
* Save ARN for later deploys.
|
|
39
|
-
*
|
|
40
|
-
**************************************************************************/
|
|
41
|
-
const bucket = new private_bucket_1.PrivateBucket(this, "static-hosting-bucket", privateBucketProps);
|
|
42
|
-
/***************************************************************************
|
|
43
|
-
*
|
|
44
|
-
* DNS & Wildcard Certificate
|
|
45
|
-
*
|
|
46
|
-
* If a zone Id as passed in, find the hosted zone and create a wildcard
|
|
47
|
-
* certificate for the domain.
|
|
48
|
-
*
|
|
49
|
-
**************************************************************************/
|
|
50
|
-
let zone;
|
|
51
|
-
let certificate;
|
|
52
|
-
if (hostedZoneAttributes && baseDomain) {
|
|
53
|
-
zone = aws_route53_1.HostedZone.fromHostedZoneAttributes(this, "zone", hostedZoneAttributes);
|
|
54
|
-
certificate = new aws_certificatemanager_1.Certificate(this, "wildcard-certificate", {
|
|
55
|
-
domainName: `*.${baseDomain}`,
|
|
56
|
-
subjectAlternativeNames: [baseDomain],
|
|
57
|
-
validation: aws_certificatemanager_1.CertificateValidation.fromDnsMultiZone({
|
|
58
|
-
[`*.${baseDomain}`]: zone,
|
|
59
|
-
[baseDomain]: zone,
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/******************************************************************************
|
|
64
|
-
*
|
|
65
|
-
* LAMBDA@EDGE FUNCTION
|
|
66
|
-
*
|
|
67
|
-
* This handles rewriting the path from domain name.
|
|
68
|
-
*
|
|
69
|
-
*****************************************************************************/
|
|
70
|
-
const handler = new aws_lambda_nodejs_1.NodejsFunction(this, "viewer-request-handler", {
|
|
71
|
-
memorySize: 128,
|
|
72
|
-
runtime: aws_lambda_1.Runtime.NODEJS_24_X,
|
|
73
|
-
logGroup: new aws_logs_1.LogGroup(this, "viewer-request-handler-log-group", {
|
|
74
|
-
retention: aws_logs_1.RetentionDays.ONE_MONTH,
|
|
75
|
-
}),
|
|
76
|
-
});
|
|
77
|
-
/******************************************************************************
|
|
78
|
-
*
|
|
79
|
-
* CLOUDFRONT CONFIG
|
|
80
|
-
*
|
|
81
|
-
* Setup a CloudFront Distribution for the bucket.
|
|
82
|
-
*
|
|
83
|
-
*****************************************************************************/
|
|
84
|
-
const cachePolicy = new aws_cloudfront_1.CachePolicy(this, "cloudfront-policy", {
|
|
85
|
-
comment: "Relatively conservative TTL policy.",
|
|
86
|
-
maxTtl: aws_cdk_lib_1.Duration.seconds(300),
|
|
87
|
-
minTtl: aws_cdk_lib_1.Duration.seconds(0),
|
|
88
|
-
defaultTtl: aws_cdk_lib_1.Duration.seconds(60),
|
|
89
|
-
headerBehavior: aws_cloudfront_1.CacheHeaderBehavior.none(),
|
|
90
|
-
queryStringBehavior: aws_cloudfront_1.CacheQueryStringBehavior.none(),
|
|
91
|
-
cookieBehavior: aws_cloudfront_1.CacheCookieBehavior.none(),
|
|
92
|
-
enableAcceptEncodingGzip: true,
|
|
93
|
-
enableAcceptEncodingBrotli: true,
|
|
94
|
-
});
|
|
95
|
-
const oac = new aws_cloudfront_1.S3OriginAccessControl(this, "MyOAC", {
|
|
96
|
-
signing: aws_cloudfront_1.Signing.SIGV4_NO_OVERRIDE,
|
|
97
|
-
});
|
|
98
|
-
const origin = aws_cloudfront_origins_1.S3BucketOrigin.withOriginAccessControl(bucket, {
|
|
99
|
-
originAccessControl: oac,
|
|
100
|
-
originAccessLevels: [aws_cloudfront_1.AccessLevel.READ],
|
|
101
|
-
});
|
|
102
|
-
const distribution = new aws_cloudfront_1.Distribution(this, "cloudfront-distribution", {
|
|
103
|
-
comment: `Distribution for ${props.description ?? id}`,
|
|
104
|
-
/**
|
|
105
|
-
* Only if domain was supplied
|
|
106
|
-
*/
|
|
107
|
-
...(certificate && baseDomain
|
|
108
|
-
? {
|
|
109
|
-
certificate,
|
|
110
|
-
domainNames: [baseDomain, `*.${baseDomain}`],
|
|
111
|
-
}
|
|
112
|
-
: {}),
|
|
113
|
-
defaultBehavior: {
|
|
114
|
-
origin,
|
|
115
|
-
viewerProtocolPolicy: aws_cloudfront_1.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
116
|
-
cachePolicy,
|
|
117
|
-
allowedMethods: aws_cloudfront_1.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
|
|
118
|
-
edgeLambdas: [
|
|
119
|
-
{
|
|
120
|
-
functionVersion: handler.currentVersion,
|
|
121
|
-
eventType: aws_cloudfront_1.LambdaEdgeEventType.VIEWER_REQUEST,
|
|
122
|
-
},
|
|
123
|
-
],
|
|
124
|
-
},
|
|
125
|
-
defaultRootObject: "index.html",
|
|
126
|
-
});
|
|
127
|
-
/**
|
|
128
|
-
* We finally have enough information to set the full domain.
|
|
129
|
-
*/
|
|
130
|
-
this.fullDomain =
|
|
131
|
-
certificate && baseDomain ? baseDomain : distribution.domainName;
|
|
132
|
-
/***************************************************************************
|
|
133
|
-
*
|
|
134
|
-
* DNS ENTRY
|
|
135
|
-
*
|
|
136
|
-
* Link cloudfront to both the root fulldomain and all possible subdomains.
|
|
137
|
-
*
|
|
138
|
-
**************************************************************************/
|
|
139
|
-
if (zone) {
|
|
140
|
-
new aws_route53_1.ARecord(this, "root-dns-entry", {
|
|
141
|
-
zone,
|
|
142
|
-
recordName: baseDomain ? baseDomain : "",
|
|
143
|
-
target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(distribution)),
|
|
144
|
-
});
|
|
145
|
-
new aws_route53_1.ARecord(this, "wc-dns-entry", {
|
|
146
|
-
zone,
|
|
147
|
-
recordName: baseDomain ? `*.${baseDomain}` : "*",
|
|
148
|
-
target: aws_route53_1.RecordTarget.fromAlias(new aws_route53_targets_1.CloudFrontTarget(distribution)),
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
/***************************************************************************
|
|
152
|
-
*
|
|
153
|
-
* EXPORTS
|
|
154
|
-
*
|
|
155
|
-
* Used by content uploader later.
|
|
156
|
-
*
|
|
157
|
-
**************************************************************************/
|
|
158
|
-
new aws_ssm_1.StringParameter(this, "dist-domain", {
|
|
159
|
-
description: `GENERATED DO NOT CHANGE - CloudFront Distribution Details (${props.description ?? id}).`,
|
|
160
|
-
parameterName: distributionDomainParamName,
|
|
161
|
-
stringValue: distribution.domainName,
|
|
162
|
-
});
|
|
163
|
-
new aws_ssm_1.StringParameter(this, "dist-id", {
|
|
164
|
-
description: `GENERATED DO NOT CHANGE - CloudFront Distribution Details (${props.description ?? id}).`,
|
|
165
|
-
parameterName: distributionIDParamName,
|
|
166
|
-
stringValue: distribution.distributionId,
|
|
167
|
-
});
|
|
168
|
-
new aws_ssm_1.StringParameter(this, "bucket-arn", {
|
|
169
|
-
description: `GENERATED DO NOT CHANGE - S3 Bucket ARN for (${props.description ?? id}).`,
|
|
170
|
-
parameterName: bucketArnParamName,
|
|
171
|
-
stringValue: bucket.bucketArn,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
exports.StaticHosting = StaticHosting;
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWhvc3RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhdGljLWhvc3Rpbmcvc3RhdGljLWhvc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQW1EO0FBQ25ELCtFQUc0QztBQUM1QywrREFZb0M7QUFDcEMsK0VBQW9FO0FBQ3BFLHVEQUFpRDtBQUNqRCxxRUFBK0Q7QUFDL0QsbURBQStEO0FBQy9ELHlEQU1pQztBQUNqQyx5RUFBbUU7QUFDbkUsaURBQXNEO0FBQ3RELDJDQUF1QztBQUN2Qyx5REFBeUU7QUFnRHpFLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBTTFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNEIsRUFBRTtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCOzs7Ozs7b0ZBTTRFO1FBRTVFLE1BQU0sRUFDSixrQkFBa0IsRUFDbEIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsa0JBQWtCLEdBQ25CLEdBQUc7WUFDRixrQkFBa0IsRUFBRSw0QkFBNEI7WUFDaEQsMkJBQTJCLEVBQUUscUNBQXFDO1lBQ2xFLHVCQUF1QixFQUFFLGlDQUFpQztZQUMxRCxHQUFHLEtBQUs7U0FDVCxDQUFDO1FBRUYsTUFBTSxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLGlCQUFpQixJQUFJLEVBQUUsQ0FBQztRQUVyRTs7Ozs7OztvRkFPNEU7UUFFNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSw4QkFBYSxDQUM5QixJQUFJLEVBQ0osdUJBQXVCLEVBQ3ZCLGtCQUFrQixDQUNuQixDQUFDO1FBRUY7Ozs7Ozs7b0ZBTzRFO1FBRTVFLElBQUksSUFBNkIsQ0FBQztRQUNsQyxJQUFJLFdBQW9DLENBQUM7UUFFekMsSUFBSSxvQkFBb0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEdBQUcsd0JBQVUsQ0FBQyx3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WUFDdEMsV0FBVyxFQUFFLGdEQUFnRCxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUUsSUFBSTtZQUN4RixhQUFhLEVBQUUsa0JBQWtCO1lBQ2pDLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUztTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6TUQsc0NBeU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIENlcnRpZmljYXRlLFxuICBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIENhY2hlQ29va2llQmVoYXZpb3IsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gIERpc3RyaWJ1dGlvbixcbiAgTGFtYmRhRWRnZUV2ZW50VHlwZSxcbiAgUzNPcmlnaW5BY2Nlc3NDb250cm9sLFxuICBTaWduaW5nLFxuICBWaWV3ZXJQcm90b2NvbFBvbGljeSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBTM0J1Y2tldE9yaWdpbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtcbiAgQVJlY29yZCxcbiAgSG9zdGVkWm9uZSxcbiAgSG9zdGVkWm9uZUF0dHJpYnV0ZXMsXG4gIElIb3N0ZWRab25lLFxuICBSZWNvcmRUYXJnZXQsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHsgQ2xvdWRGcm9udFRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQgeyBTdHJpbmdQYXJhbWV0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNzbVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFByaXZhdGVCdWNrZXQsIFByaXZhdGVCdWNrZXRQcm9wcyB9IGZyb20gXCIuLi9zMy9wcml2YXRlLWJ1Y2tldFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0RvbWFpblByb3BzIHtcbiAgLyoqXG4gICAqICBUaGUgYmFzZSBkb21haW4gKGllOiBjb2RlZHJpZnRlcnMuY29tKVxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZURvbWFpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3N0ZWQgem9uZSBJRCBmb3IgdGhlIGJhc2UgZG9tYWluLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZUF0dHJpYnV0ZXM6IEhvc3RlZFpvbmVBdHRyaWJ1dGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0hvc3RpbmdQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICAvKipcbiAgICogU2hvcnQgZGVzY3JpcHRpb24gdXNlZCBpbiB2YXJpb3VzIHBsYWNlcyBmb3IgdHJhY2VhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlcyB1c2VkIHRvIGNvbm5lY3QgYSBkb21haW4gbmFtZSB0byB0aGUgY2xvdWRmcm9udCBkaXN0cmlidXRpb24uIElmIG5vdFxuICAgKiBzdXBwbGllZCwgY2xvdWRmcm9udCBkb2Vzbid0IHVzZSBhIGN1c3RvbSBkb21haW4uXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNEb21haW5Qcm9wcz86IFN0YXRpY0RvbWFpblByb3BzO1xuXG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBzdGF0aWMgaG9zdGluZyBidWNrZXQncyBBUk4uXG4gICAqIFRoaXMgaXMgbmVlZGVkIGluIG90aGVyIGxhdGVyIHN0ZXBzIHdoZW4gZGVwbG95aW5nIGhvc3RlZCBjb250ZW50IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0QXJuUGFyYW1OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXJhbWV0ZXIgbmFtZSB0byB1c2Ugd2hlbiBzdG9yaW5nIHRoZSBDbG91ZEZyb250IERpc3RyaWJ1dGlvbiBEb21haW4gTmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbkRvbWFpblBhcmFtTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGFyYW1ldGVyIG5hbWUgdG8gdXNlIHdoZW4gc3RvcmluZyB0aGUgQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gSUQuXG4gICAqL1xuICByZWFkb25seSBkaXN0cmlidXRpb25JRFBhcmFtTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUHJvcHMgdG8gcGFzcyB0byB0aGUgcHJpdmF0ZSBTMyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlQnVja2V0UHJvcHM/OiBQcml2YXRlQnVja2V0UHJvcHM7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0aWNIb3N0aW5nIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEZ1bGwgZG9tYWluIG5hbWUgdXNlZCBhcyBiYXNpcyBmb3IgaG9zdGluZy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmdWxsRG9tYWluOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YXRpY0hvc3RpbmdQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqIEluaXRpYWwgU2V0dXBcbiAgICAgKlxuICAgICAqIFNldCBzb21lIGRlZmF1bHRzLCBidWlsZCBkb21haW4gaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCB7XG4gICAgICBidWNrZXRBcm5QYXJhbU5hbWUsXG4gICAgICBkaXN0cmlidXRpb25Eb21haW5QYXJhbU5hbWUsXG4gICAgICBkaXN0cmlidXRpb25JRFBhcmFtTmFtZSxcbiAgICAgIHN0YXRpY0RvbWFpblByb3BzLFxuICAgICAgcHJpdmF0ZUJ1Y2tldFByb3BzLFxuICAgIH0gPSB7XG4gICAgICBidWNrZXRBcm5QYXJhbU5hbWU6IFwiL1NUQVRJQ19XRUJTSVRFL0JVQ0tFVF9BUk5cIixcbiAgICAgIGRpc3RyaWJ1dGlvbkRvbWFpblBhcmFtTmFtZTogXCIvU1RBVElDX1dFQlNJVEUvRElTVFJJQlVUSU9OX0RPTUFJTlwiLFxuICAgICAgZGlzdHJpYnV0aW9uSURQYXJhbU5hbWU6IFwiL1NUQVRJQ19XRUJTSVRFL0RJU1RSSUJVVElPTl9JRFwiLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgYmFzZURvbWFpbiwgaG9zdGVkWm9uZUF0dHJpYnV0ZXMgfSA9IHN0YXRpY0RvbWFpblByb3BzID8/IHt9O1xuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogUFJJVkFURSBCVUNLRVRcbiAgICAgKlxuICAgICAqIEEgYnVja2V0IHRvIHN0b3JlIHRoZSBmaWxlcyB3aXRoaW4uXG4gICAgICogU2F2ZSBBUk4gZm9yIGxhdGVyIGRlcGxveXMuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBidWNrZXQgPSBuZXcgUHJpdmF0ZUJ1Y2tldChcbiAgICAgIHRoaXMsXG4gICAgICBcInN0YXRpYy1ob3N0aW5nLWJ1Y2tldFwiLFxuICAgICAgcHJpdmF0ZUJ1Y2tldFByb3BzLFxuICAgICk7XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBETlMgJiBXaWxkY2FyZCBDZXJ0aWZpY2F0ZVxuICAgICAqXG4gICAgICogSWYgYSB6b25lIElkIGFzIHBhc3NlZCBpbiwgZmluZCB0aGUgaG9zdGVkIHpvbmUgYW5kIGNyZWF0ZSBhIHdpbGRjYXJkXG4gICAgICogY2VydGlmaWNhdGUgZm9yIHRoZSBkb21haW4uXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBsZXQgem9uZTogSUhvc3RlZFpvbmUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChob3N0ZWRab25lQXR0cmlidXRlcyAmJiBiYXNlRG9tYWluKSB7XG4gICAgICB6b25lID0gSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXMoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiem9uZVwiLFxuICAgICAgICBob3N0ZWRab25lQXR0cmlidXRlcyxcbiAgICAgICk7XG4gICAgICBjZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZSh0aGlzLCBcIndpbGRjYXJkLWNlcnRpZmljYXRlXCIsIHtcbiAgICAgICAgZG9tYWluTmFtZTogYCouJHtiYXNlRG9tYWlufWAsXG4gICAgICAgIHN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzOiBbYmFzZURvbWFpbl0sXG4gICAgICAgIHZhbGlkYXRpb246IENlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zTXVsdGlab25lKHtcbiAgICAgICAgICBbYCouJHtiYXNlRG9tYWlufWBdOiB6b25lLFxuICAgICAgICAgIFtiYXNlRG9tYWluXTogem9uZSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBMQU1CREFARURHRSBGVU5DVElPTlxuICAgICAqXG4gICAgICogVGhpcyBoYW5kbGVzIHJld3JpdGluZyB0aGUgcGF0aCBmcm9tIGRvbWFpbiBuYW1lLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcInZpZXdlci1yZXF1ZXN0LWhhbmRsZXJcIiwge1xuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjRfWCxcbiAgICAgIGxvZ0dyb3VwOiBuZXcgTG9nR3JvdXAodGhpcywgXCJ2aWV3ZXItcmVxdWVzdC1oYW5kbGVyLWxvZy1ncm91cFwiLCB7XG4gICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqICBDTE9VREZST05UIENPTkZJR1xuICAgICAqXG4gICAgICogIFNldHVwIGEgQ2xvdWRGcm9udCBEaXN0cmlidXRpb24gZm9yIHRoZSBidWNrZXQuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBjb25zdCBjYWNoZVBvbGljeSA9IG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcImNsb3VkZnJvbnQtcG9saWN5XCIsIHtcbiAgICAgIGNvbW1lbnQ6IFwiUmVsYXRpdmVseSBjb25zZXJ2YXRpdmUgVFRMIHBvbGljeS5cIixcbiAgICAgIG1heFR0bDogRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvci5ub25lKCksXG4gICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBvYWMgPSBuZXcgUzNPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMsIFwiTXlPQUNcIiwge1xuICAgICAgc2lnbmluZzogU2lnbmluZy5TSUdWNF9OT19PVkVSUklERSxcbiAgICB9KTtcbiAgICBjb25zdCBvcmlnaW4gPSBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChidWNrZXQsIHtcbiAgICAgIG9yaWdpbkFjY2Vzc0NvbnRyb2w6IG9hYyxcbiAgICAgIG9yaWdpbkFjY2Vzc0xldmVsczogW0FjY2Vzc0xldmVsLlJFQURdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBcImNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIGNvbW1lbnQ6IGBEaXN0cmlidXRpb24gZm9yICR7cHJvcHMuZGVzY3JpcHRpb24gPz8gaWR9YCxcblxuICAgICAgLyoqXG4gICAgICAgKiBPbmx5IGlmIGRvbWFpbiB3YXMgc3VwcGxpZWRcbiAgICAgICAqL1xuICAgICAgLi4uKGNlcnRpZmljYXRlICYmIGJhc2VEb21haW5cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZSxcbiAgICAgICAgICAgIGRvbWFpbk5hbWVzOiBbYmFzZURvbWFpbiwgYCouJHtiYXNlRG9tYWlufWBdLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG5cbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBvcmlnaW4sXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgY2FjaGVQb2xpY3ksXG4gICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICBlZGdlTGFtYmRhczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogaGFuZGxlci5jdXJyZW50VmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50VHlwZTogTGFtYmRhRWRnZUV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRSb290T2JqZWN0OiBcImluZGV4Lmh0bWxcIixcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFdlIGZpbmFsbHkgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc2V0IHRoZSBmdWxsIGRvbWFpbi5cbiAgICAgKi9cbiAgICB0aGlzLmZ1bGxEb21haW4gPVxuICAgICAgY2VydGlmaWNhdGUgJiYgYmFzZURvbWFpbiA/IGJhc2VEb21haW4gOiBkaXN0cmlidXRpb24uZG9tYWluTmFtZTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgKlxuICAgICAqICBETlMgRU5UUllcbiAgICAgKlxuICAgICAqIExpbmsgY2xvdWRmcm9udCB0byBib3RoIHRoZSByb290IGZ1bGxkb21haW4gYW5kIGFsbCBwb3NzaWJsZSBzdWJkb21haW5zLlxuICAgICAqXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgaWYgKHpvbmUpIHtcbiAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIFwicm9vdC1kbnMtZW50cnlcIiwge1xuICAgICAgICB6b25lLFxuICAgICAgICByZWNvcmROYW1lOiBiYXNlRG9tYWluID8gYmFzZURvbWFpbiA6IFwiXCIsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldChkaXN0cmlidXRpb24pKSxcbiAgICAgIH0pO1xuXG4gICAgICBuZXcgQVJlY29yZCh0aGlzLCBcIndjLWRucy1lbnRyeVwiLCB7XG4gICAgICAgIHpvbmUsXG4gICAgICAgIHJlY29yZE5hbWU6IGJhc2VEb21haW4gPyBgKi4ke2Jhc2VEb21haW59YCA6IFwiKlwiLFxuICAgICAgICB0YXJnZXQ6IFJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IENsb3VkRnJvbnRUYXJnZXQoZGlzdHJpYnV0aW9uKSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICpcbiAgICAgKiBFWFBPUlRTXG4gICAgICpcbiAgICAgKiBVc2VkIGJ5IGNvbnRlbnQgdXBsb2FkZXIgbGF0ZXIuXG4gICAgICpcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBuZXcgU3RyaW5nUGFyYW1ldGVyKHRoaXMsIFwiZGlzdC1kb21haW5cIiwge1xuICAgICAgZGVzY3JpcHRpb246IGBHRU5FUkFURUQgRE8gTk9UIENIQU5HRSAtIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIERldGFpbHMgKCR7cHJvcHMuZGVzY3JpcHRpb24gPz8gaWR9KS5gLFxuICAgICAgcGFyYW1ldGVyTmFtZTogZGlzdHJpYnV0aW9uRG9tYWluUGFyYW1OYW1lLFxuICAgICAgc3RyaW5nVmFsdWU6IGRpc3RyaWJ1dGlvbi5kb21haW5OYW1lLFxuICAgIH0pO1xuXG4gICAgbmV3IFN0cmluZ1BhcmFtZXRlcih0aGlzLCBcImRpc3QtaWRcIiwge1xuICAgICAgZGVzY3JpcHRpb246IGBHRU5FUkFURUQgRE8gTk9UIENIQU5HRSAtIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uIERldGFpbHMgKCR7cHJvcHMuZGVzY3JpcHRpb24gPz8gaWR9KS5gLFxuICAgICAgcGFyYW1ldGVyTmFtZTogZGlzdHJpYnV0aW9uSURQYXJhbU5hbWUsXG4gICAgICBzdHJpbmdWYWx1ZTogZGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbklkLFxuICAgIH0pO1xuXG4gICAgbmV3IFN0cmluZ1BhcmFtZXRlcih0aGlzLCBcImJ1Y2tldC1hcm5cIiwge1xuICAgICAgZGVzY3JpcHRpb246IGBHRU5FUkFURUQgRE8gTk9UIENIQU5HRSAtIFMzIEJ1Y2tldCBBUk4gZm9yICgke3Byb3BzLmRlc2NyaXB0aW9uID8/IGlkfSkuYCxcbiAgICAgIHBhcmFtZXRlck5hbWU6IGJ1Y2tldEFyblBhcmFtTmFtZSxcbiAgICAgIHN0cmluZ1ZhbHVlOiBidWNrZXQuYnVja2V0QXJuLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { CloudFrontRequest, CloudFrontRequestEvent } from "aws-lambda";
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* Viewer Request Handler
|
|
5
|
-
*
|
|
6
|
-
* Handles requests at the CloudFront viewer request stage.
|
|
7
|
-
*
|
|
8
|
-
* - Logs the request
|
|
9
|
-
* - Adds default document if needed
|
|
10
|
-
* - Prepends folder with domain
|
|
11
|
-
*
|
|
12
|
-
* @param event CloudFrontRequestEvent
|
|
13
|
-
* @returns CloudFrontRequest
|
|
14
|
-
*/
|
|
15
|
-
export declare const handler: (event: CloudFrontRequestEvent) => Promise<CloudFrontRequest>;
|
|
16
|
-
/**
|
|
17
|
-
* This is a helper used in the main handler. It's split into it's own export
|
|
18
|
-
* to make testing easier.
|
|
19
|
-
*
|
|
20
|
-
* Adds default document to request URI if needed.
|
|
21
|
-
*
|
|
22
|
-
* @param request
|
|
23
|
-
* @returns
|
|
24
|
-
*/
|
|
25
|
-
export declare const addDefaultDocument: (request: CloudFrontRequest) => CloudFrontRequest;
|
|
26
|
-
/**
|
|
27
|
-
* This is a helper used in the main handler. It's split into it's own export
|
|
28
|
-
* to make testing easier.
|
|
29
|
-
*
|
|
30
|
-
* Adds domain folder to request URI.
|
|
31
|
-
*
|
|
32
|
-
* @param request
|
|
33
|
-
* @returns
|
|
34
|
-
*/
|
|
35
|
-
export declare const addDomainFolder: (request: CloudFrontRequest) => CloudFrontRequest;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.addDomainFolder = exports.addDefaultDocument = exports.handler = void 0;
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
* Viewer Request Handler
|
|
7
|
-
*
|
|
8
|
-
* Handles requests at the CloudFront viewer request stage.
|
|
9
|
-
*
|
|
10
|
-
* - Logs the request
|
|
11
|
-
* - Adds default document if needed
|
|
12
|
-
* - Prepends folder with domain
|
|
13
|
-
*
|
|
14
|
-
* @param event CloudFrontRequestEvent
|
|
15
|
-
* @returns CloudFrontRequest
|
|
16
|
-
*/
|
|
17
|
-
const handler = async (event) => {
|
|
18
|
-
// log request
|
|
19
|
-
if (process.env.JEST_WORKER_ID === undefined) {
|
|
20
|
-
console.log("Request Event: ", JSON.stringify(event, null, 2));
|
|
21
|
-
}
|
|
22
|
-
let request = event.Records[0].cf.request;
|
|
23
|
-
// add index if needed
|
|
24
|
-
request = (0, exports.addDefaultDocument)(request);
|
|
25
|
-
// prepend folder with domain
|
|
26
|
-
request = (0, exports.addDomainFolder)(request);
|
|
27
|
-
if (process.env.JEST_WORKER_ID === undefined) {
|
|
28
|
-
console.log("Resulting Request: ", JSON.stringify(request, null, 2));
|
|
29
|
-
}
|
|
30
|
-
// return body
|
|
31
|
-
return request;
|
|
32
|
-
};
|
|
33
|
-
exports.handler = handler;
|
|
34
|
-
/**
|
|
35
|
-
* This is a helper used in the main handler. It's split into it's own export
|
|
36
|
-
* to make testing easier.
|
|
37
|
-
*
|
|
38
|
-
* Adds default document to request URI if needed.
|
|
39
|
-
*
|
|
40
|
-
* @param request
|
|
41
|
-
* @returns
|
|
42
|
-
*/
|
|
43
|
-
const addDefaultDocument = (request) => {
|
|
44
|
-
if (request.uri !== "/") {
|
|
45
|
-
let paths = request.uri.split("/");
|
|
46
|
-
let lastPath = paths[paths.length - 1];
|
|
47
|
-
let isFile = lastPath.split(".").length > 1;
|
|
48
|
-
if (!isFile) {
|
|
49
|
-
if (lastPath != "") {
|
|
50
|
-
request.uri += "/";
|
|
51
|
-
}
|
|
52
|
-
request.uri += "index.html";
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
request.uri = "/index.html";
|
|
57
|
-
}
|
|
58
|
-
return request;
|
|
59
|
-
};
|
|
60
|
-
exports.addDefaultDocument = addDefaultDocument;
|
|
61
|
-
/**
|
|
62
|
-
* This is a helper used in the main handler. It's split into it's own export
|
|
63
|
-
* to make testing easier.
|
|
64
|
-
*
|
|
65
|
-
* Adds domain folder to request URI.
|
|
66
|
-
*
|
|
67
|
-
* @param request
|
|
68
|
-
* @returns
|
|
69
|
-
*/
|
|
70
|
-
const addDomainFolder = (request) => {
|
|
71
|
-
const hostHeader = request.headers.host[0].value;
|
|
72
|
-
request.uri = `/${hostHeader}${request.uri}`;
|
|
73
|
-
return request;
|
|
74
|
-
};
|
|
75
|
-
exports.addDomainFolder = addDomainFolder;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWhvc3Rpbmcudmlld2VyLXJlcXVlc3QtaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0aWMtaG9zdGluZy9zdGF0aWMtaG9zdGluZy52aWV3ZXItcmVxdWVzdC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNJLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBNkIsRUFDRCxFQUFFO0lBQzlCLGNBQWM7SUFDZCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUUxQyxzQkFBc0I7SUFDdEIsT0FBTyxHQUFHLElBQUEsMEJBQWtCLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFFdEMsNkJBQTZCO0lBQzdCLE9BQU8sR0FBRyxJQUFBLHVCQUFlLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxjQUFjO0lBQ2QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBdEJXLFFBQUEsT0FBTyxXQXNCbEI7QUFFRjs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUEwQixFQUFFLEVBQUU7SUFDL0QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFqQlcsUUFBQSxrQkFBa0Isc0JBaUI3QjtBQUVGOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUEwQixFQUFFLEVBQUU7SUFDNUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2pELE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzdDLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUpXLFFBQUEsZUFBZSxtQkFJMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbG91ZEZyb250UmVxdWVzdCwgQ2xvdWRGcm9udFJlcXVlc3RFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5cbi8qKlxuICpcbiAqIFZpZXdlciBSZXF1ZXN0IEhhbmRsZXJcbiAqXG4gKiBIYW5kbGVzIHJlcXVlc3RzIGF0IHRoZSBDbG91ZEZyb250IHZpZXdlciByZXF1ZXN0IHN0YWdlLlxuICpcbiAqIC0gTG9ncyB0aGUgcmVxdWVzdFxuICogLSBBZGRzIGRlZmF1bHQgZG9jdW1lbnQgaWYgbmVlZGVkXG4gKiAtIFByZXBlbmRzIGZvbGRlciB3aXRoIGRvbWFpblxuICpcbiAqIEBwYXJhbSBldmVudCBDbG91ZEZyb250UmVxdWVzdEV2ZW50XG4gKiBAcmV0dXJucyBDbG91ZEZyb250UmVxdWVzdFxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IENsb3VkRnJvbnRSZXF1ZXN0RXZlbnQsXG4pOiBQcm9taXNlPENsb3VkRnJvbnRSZXF1ZXN0PiA9PiB7XG4gIC8vIGxvZyByZXF1ZXN0XG4gIGlmIChwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5sb2coXCJSZXF1ZXN0IEV2ZW50OiBcIiwgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGxldCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXS5jZi5yZXF1ZXN0O1xuXG4gIC8vIGFkZCBpbmRleCBpZiBuZWVkZWRcbiAgcmVxdWVzdCA9IGFkZERlZmF1bHREb2N1bWVudChyZXF1ZXN0KTtcblxuICAvLyBwcmVwZW5kIGZvbGRlciB3aXRoIGRvbWFpblxuICByZXF1ZXN0ID0gYWRkRG9tYWluRm9sZGVyKHJlcXVlc3QpO1xuXG4gIGlmIChwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5sb2coXCJSZXN1bHRpbmcgUmVxdWVzdDogXCIsIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QsIG51bGwsIDIpKTtcbiAgfVxuXG4gIC8vIHJldHVybiBib2R5XG4gIHJldHVybiByZXF1ZXN0O1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIHVzZWQgaW4gdGhlIG1haW4gaGFuZGxlci4gSXQncyBzcGxpdCBpbnRvIGl0J3Mgb3duIGV4cG9ydFxuICogdG8gbWFrZSB0ZXN0aW5nIGVhc2llci5cbiAqXG4gKiBBZGRzIGRlZmF1bHQgZG9jdW1lbnQgdG8gcmVxdWVzdCBVUkkgaWYgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgYWRkRGVmYXVsdERvY3VtZW50ID0gKHJlcXVlc3Q6IENsb3VkRnJvbnRSZXF1ZXN0KSA9PiB7XG4gIGlmIChyZXF1ZXN0LnVyaSAhPT0gXCIvXCIpIHtcbiAgICBsZXQgcGF0aHMgPSByZXF1ZXN0LnVyaS5zcGxpdChcIi9cIik7XG4gICAgbGV0IGxhc3RQYXRoID0gcGF0aHNbcGF0aHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IGlzRmlsZSA9IGxhc3RQYXRoLnNwbGl0KFwiLlwiKS5sZW5ndGggPiAxO1xuXG4gICAgaWYgKCFpc0ZpbGUpIHtcbiAgICAgIGlmIChsYXN0UGF0aCAhPSBcIlwiKSB7XG4gICAgICAgIHJlcXVlc3QudXJpICs9IFwiL1wiO1xuICAgICAgfVxuICAgICAgcmVxdWVzdC51cmkgKz0gXCJpbmRleC5odG1sXCI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcXVlc3QudXJpID0gXCIvaW5kZXguaHRtbFwiO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3Q7XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgdXNlZCBpbiB0aGUgbWFpbiBoYW5kbGVyLiBJdCdzIHNwbGl0IGludG8gaXQncyBvd24gZXhwb3J0XG4gKiB0byBtYWtlIHRlc3RpbmcgZWFzaWVyLlxuICpcbiAqIEFkZHMgZG9tYWluIGZvbGRlciB0byByZXF1ZXN0IFVSSS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERvbWFpbkZvbGRlciA9IChyZXF1ZXN0OiBDbG91ZEZyb250UmVxdWVzdCkgPT4ge1xuICBjb25zdCBob3N0SGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzLmhvc3RbMF0udmFsdWU7XG4gIHJlcXVlc3QudXJpID0gYC8ke2hvc3RIZWFkZXJ9JHtyZXF1ZXN0LnVyaX1gO1xuICByZXR1cm4gcmVxdWVzdDtcbn07XG4iXX0=
|