@wolsok/spa-cdk-stack 1.0.15 → 1.0.19
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/package.json +7 -3
- package/src/index.js +3 -0
- package/src/index.js.map +1 -0
- package/src/lib/spa/spa.construct.d.ts +33 -0
- package/src/lib/spa/spa.construct.js +180 -0
- package/src/lib/spa/spa.construct.js.map +1 -0
- package/src/lib/utils/envOrDie.d.ts +1 -0
- package/src/lib/utils/envOrDie.js +9 -0
- package/src/lib/utils/envOrDie.js.map +1 -0
- package/eslint.config.mjs +0 -40
- package/extra-assets-path/asset.json +0 -3
- package/project.json +0 -25
- package/src/lib/__snapshots__/stack-spa.spec.ts.snap +0 -3230
- package/src/lib/spa/spa.construct.ts +0 -310
- package/src/lib/stack-spa.spec.ts +0 -121
- package/src/lib/utils/envOrDie.ts +0 -8
- package/test-build-path/index.html +0 -15
- package/test-build-path/test-javascript-asset.js +0 -0
- package/tsconfig.json +0 -23
- package/tsconfig.lib.json +0 -10
- package/tsconfig.spec.json +0 -26
- package/vite.config.ts +0 -30
- /package/src/{index.ts → index.d.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wolsok/spa-cdk-stack",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.19",
|
|
4
|
+
"repository": "https://github.com/WolfSoko/wol-sok-mono/tree/main/libs/public/spa-cdk-stack",
|
|
4
5
|
"dependencies": {
|
|
5
6
|
"tslib": "^2.3.0",
|
|
6
7
|
"aws-cdk-lib": "^2.146.0",
|
|
@@ -10,5 +11,8 @@
|
|
|
10
11
|
"typings": "./src/index.d.ts",
|
|
11
12
|
"publishConfig": {
|
|
12
13
|
"access": "public"
|
|
13
|
-
}
|
|
14
|
-
|
|
14
|
+
},
|
|
15
|
+
"types": "./src/index.d.ts",
|
|
16
|
+
"module": "./src/index.js",
|
|
17
|
+
"type": "module"
|
|
18
|
+
}
|
package/src/index.js
ADDED
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/public/spa-cdk-stack/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RemovalPolicy } from 'aws-cdk-lib';
|
|
2
|
+
import { CacheControl, ISource } from 'aws-cdk-lib/aws-s3-deployment';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
export interface SpaProps {
|
|
5
|
+
domainName: string;
|
|
6
|
+
buildOutputPath: string;
|
|
7
|
+
bucketRemovalPolicy?: RemovalPolicy;
|
|
8
|
+
extraAllowedOrigins?: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* SPA infrastructure, which deploys spa content to an S3 bucket.
|
|
12
|
+
*
|
|
13
|
+
* The spa redirects from HTTP to HTTPS, uses a CloudFront distribution,
|
|
14
|
+
* Route53 alias record,
|
|
15
|
+
* and ACM certificate.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SpaConstruct extends Construct {
|
|
18
|
+
private readonly spaName;
|
|
19
|
+
private bucketDeployments;
|
|
20
|
+
private readonly bucket;
|
|
21
|
+
private readonly distribution;
|
|
22
|
+
constructor(parent: Construct, spaName: string, props: SpaProps);
|
|
23
|
+
/**
|
|
24
|
+
* Add some additional assets to the bucket of the SPA
|
|
25
|
+
*/
|
|
26
|
+
addExtraAssets(assets: ISource[], cacheControl?: CacheControl, contentType?: string): void;
|
|
27
|
+
private createBucket;
|
|
28
|
+
private createCertificate;
|
|
29
|
+
private createDistribution;
|
|
30
|
+
private createARecord;
|
|
31
|
+
private createBucketDeployment;
|
|
32
|
+
private extractDomains;
|
|
33
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { CfnOutput, Duration, RemovalPolicy } from 'aws-cdk-lib';
|
|
2
|
+
import { Certificate, CertificateValidation, } from 'aws-cdk-lib/aws-certificatemanager';
|
|
3
|
+
import { AllowedMethods, Distribution, HttpVersion, ResponseHeadersPolicy, SecurityPolicyProtocol, ViewerProtocolPolicy, } from 'aws-cdk-lib/aws-cloudfront';
|
|
4
|
+
import { S3BucketOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
|
|
5
|
+
import { ARecord, HostedZone, RecordTarget, } from 'aws-cdk-lib/aws-route53';
|
|
6
|
+
import { CloudFrontTarget } from 'aws-cdk-lib/aws-route53-targets';
|
|
7
|
+
import { BlockPublicAccess, Bucket } from 'aws-cdk-lib/aws-s3';
|
|
8
|
+
import { BucketDeployment, CacheControl, Source, } from 'aws-cdk-lib/aws-s3-deployment';
|
|
9
|
+
import { Construct } from 'constructs';
|
|
10
|
+
const defaultBucketRemovalPolicy = RemovalPolicy.DESTROY;
|
|
11
|
+
/**
|
|
12
|
+
* SPA infrastructure, which deploys spa content to an S3 bucket.
|
|
13
|
+
*
|
|
14
|
+
* The spa redirects from HTTP to HTTPS, uses a CloudFront distribution,
|
|
15
|
+
* Route53 alias record,
|
|
16
|
+
* and ACM certificate.
|
|
17
|
+
*/
|
|
18
|
+
export class SpaConstruct extends Construct {
|
|
19
|
+
constructor(parent, spaName, props) {
|
|
20
|
+
super(parent, spaName);
|
|
21
|
+
this.spaName = spaName;
|
|
22
|
+
this.bucketDeployments = [];
|
|
23
|
+
const removalPolicy = props.bucketRemovalPolicy ?? defaultBucketRemovalPolicy;
|
|
24
|
+
const { buildOutputPath, extraAllowedOrigins } = props;
|
|
25
|
+
const { mainDomain, siteDomain } = this.extractDomains(props.domainName);
|
|
26
|
+
const zone = HostedZone.fromLookup(this, spaName, {
|
|
27
|
+
privateZone: false,
|
|
28
|
+
domainName: mainDomain,
|
|
29
|
+
});
|
|
30
|
+
new CfnOutput(this, `${spaName}-Site:`, { value: 'https://' + siteDomain });
|
|
31
|
+
let certificate;
|
|
32
|
+
if (mainDomain === siteDomain) {
|
|
33
|
+
certificate = this.createCertificate(zone, mainDomain);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
certificate = this.createCertificate(zone, mainDomain, siteDomain);
|
|
37
|
+
}
|
|
38
|
+
this.bucket = this.createBucket(siteDomain, removalPolicy);
|
|
39
|
+
this.distribution = this.createDistribution(siteDomain, certificate, this.bucket, extraAllowedOrigins);
|
|
40
|
+
this.createARecord(siteDomain, this.distribution, zone);
|
|
41
|
+
const indexAsset = Source.asset(buildOutputPath, {
|
|
42
|
+
// glob ignore all but index.html
|
|
43
|
+
exclude: ['**', '!index.html'],
|
|
44
|
+
});
|
|
45
|
+
this.bucketDeployments.push(this.createBucketDeployment([indexAsset], CacheControl.noCache(), true, this.bucket, this.distribution));
|
|
46
|
+
const deploymentAssets = Source.asset(buildOutputPath, {
|
|
47
|
+
exclude: ['index.html'],
|
|
48
|
+
});
|
|
49
|
+
this.bucketDeployments.push(this.createBucketDeployment([deploymentAssets], CacheControl.maxAge(Duration.days(365)), false, this.bucket, this.distribution));
|
|
50
|
+
// Make sure that the index.html is deployed last, as it's needed to
|
|
51
|
+
// serve the SPA so chain the deployments
|
|
52
|
+
this.bucketDeployments[1].node.addDependency(this.bucketDeployments[0]);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Add some additional assets to the bucket of the SPA
|
|
56
|
+
*/
|
|
57
|
+
addExtraAssets(assets, cacheControl = CacheControl.maxAge(Duration.days(365)), contentType) {
|
|
58
|
+
const extraAssetsDeployment = this.createBucketDeployment(assets, cacheControl, false, this.bucket, this.distribution, contentType);
|
|
59
|
+
const latestDeployment = this.bucketDeployments.at(-1);
|
|
60
|
+
if (latestDeployment) {
|
|
61
|
+
extraAssetsDeployment.node.addDependency(latestDeployment);
|
|
62
|
+
}
|
|
63
|
+
this.bucketDeployments.push(extraAssetsDeployment);
|
|
64
|
+
}
|
|
65
|
+
createBucket(siteDomain, removalPolicy = RemovalPolicy.DESTROY) {
|
|
66
|
+
// Content bucket
|
|
67
|
+
const siteBucket = new Bucket(this, `Bucket`, {
|
|
68
|
+
websiteIndexDocument: 'index.html',
|
|
69
|
+
websiteErrorDocument: 'index.html',
|
|
70
|
+
bucketName: `${siteDomain}-spa-data`,
|
|
71
|
+
publicReadAccess: false,
|
|
72
|
+
blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
|
|
73
|
+
/**
|
|
74
|
+
* The default removal policy is RETAIN, which means that cdk destroy will not attempt to delete
|
|
75
|
+
* the new bucket, and it will remain in your account until manually deleted. By setting the policy to
|
|
76
|
+
* DESTROY, cdk destroy will attempt to delete the bucket, but will error if the bucket is not empty.
|
|
77
|
+
*/
|
|
78
|
+
removalPolicy: removalPolicy,
|
|
79
|
+
/**
|
|
80
|
+
* For sample purposes only, if you create an S3 bucket then populate it, stack destruction fails. This
|
|
81
|
+
* setting will enable full cleanup of the demo.
|
|
82
|
+
*/
|
|
83
|
+
autoDeleteObjects: removalPolicy === RemovalPolicy.DESTROY, // Danger not recommended for production code
|
|
84
|
+
});
|
|
85
|
+
new CfnOutput(this, `${siteDomain}-Bucket`, {
|
|
86
|
+
value: siteBucket.bucketName,
|
|
87
|
+
});
|
|
88
|
+
return siteBucket;
|
|
89
|
+
}
|
|
90
|
+
createCertificate(zone, ...domainNames) {
|
|
91
|
+
const [mainDomain, ...restofDomains] = domainNames;
|
|
92
|
+
// TLS certificate
|
|
93
|
+
const certificate = new Certificate(this, 'Certificate', {
|
|
94
|
+
validation: CertificateValidation.fromDns(zone),
|
|
95
|
+
domainName: mainDomain,
|
|
96
|
+
subjectAlternativeNames: restofDomains,
|
|
97
|
+
});
|
|
98
|
+
new CfnOutput(this, `${this.spaName}-sCertificate`, {
|
|
99
|
+
value: certificate.certificateArn,
|
|
100
|
+
});
|
|
101
|
+
return certificate;
|
|
102
|
+
}
|
|
103
|
+
createDistribution(siteDomain, certificate, siteBucket, allowedOrigins = []) {
|
|
104
|
+
const responseHeadersPolicy = new ResponseHeadersPolicy(this, 'ResponseHeadersPolicy', {
|
|
105
|
+
corsBehavior: {
|
|
106
|
+
accessControlAllowCredentials: false,
|
|
107
|
+
accessControlAllowOrigins: [
|
|
108
|
+
...allowedOrigins,
|
|
109
|
+
'https://' + siteDomain,
|
|
110
|
+
'http://localhost',
|
|
111
|
+
'http://127.0.0.1',
|
|
112
|
+
],
|
|
113
|
+
accessControlAllowMethods: ['GET', 'HEAD', 'OPTIONS'],
|
|
114
|
+
accessControlAllowHeaders: ['*'],
|
|
115
|
+
originOverride: true,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
// CloudFront distribution that provides HTTPS
|
|
119
|
+
const distribution = new Distribution(this, 'Distribution', {
|
|
120
|
+
certificate: certificate,
|
|
121
|
+
defaultRootObject: 'index.html',
|
|
122
|
+
domainNames: [siteDomain],
|
|
123
|
+
httpVersion: HttpVersion.HTTP2_AND_3,
|
|
124
|
+
minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2021,
|
|
125
|
+
errorResponses: [
|
|
126
|
+
{
|
|
127
|
+
httpStatus: 403,
|
|
128
|
+
responseHttpStatus: 200,
|
|
129
|
+
responsePagePath: '/index.html',
|
|
130
|
+
ttl: Duration.minutes(30),
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
defaultBehavior: {
|
|
134
|
+
responseHeadersPolicy,
|
|
135
|
+
origin: S3BucketOrigin.withOriginAccessControl(siteBucket),
|
|
136
|
+
compress: true,
|
|
137
|
+
allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
|
|
138
|
+
viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
new CfnOutput(this, `${this.spaName}-DistributionId`, {
|
|
142
|
+
value: distribution.distributionId,
|
|
143
|
+
});
|
|
144
|
+
return distribution;
|
|
145
|
+
}
|
|
146
|
+
createARecord(siteDomain, distribution, zone) {
|
|
147
|
+
// Route53 alias record for the CloudFront distribution
|
|
148
|
+
new ARecord(this, 'SiteAliasRecord', {
|
|
149
|
+
recordName: siteDomain,
|
|
150
|
+
target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)),
|
|
151
|
+
zone,
|
|
152
|
+
});
|
|
153
|
+
new CfnOutput(this, `${this.spaName}-ARecord`, { value: siteDomain });
|
|
154
|
+
}
|
|
155
|
+
createBucketDeployment(sources, cacheControl = CacheControl.maxAge(Duration.days(365)), prune, destinationBucket, distribution, contentType) {
|
|
156
|
+
// Deploy site contents to S3 spaBucket
|
|
157
|
+
return new BucketDeployment(this, 'DeployWithInvalidation' + (this.bucketDeployments.length + 1), {
|
|
158
|
+
sources,
|
|
159
|
+
destinationBucket,
|
|
160
|
+
distribution,
|
|
161
|
+
prune,
|
|
162
|
+
memoryLimit: 1024,
|
|
163
|
+
distributionPaths: ['/*'],
|
|
164
|
+
cacheControl: [cacheControl],
|
|
165
|
+
...(contentType ? { contentType } : {}),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
extractDomains(domainName) {
|
|
169
|
+
// extract main domain
|
|
170
|
+
const siteDomain = domainName;
|
|
171
|
+
const mainDomain = domainName.split('.').slice(-2).join('.');
|
|
172
|
+
const subDomainWildcard = mainDomain === siteDomain ? mainDomain : `*.${mainDomain}`;
|
|
173
|
+
// inform user about domain handling
|
|
174
|
+
if (mainDomain !== siteDomain) {
|
|
175
|
+
console.warn(`The domain ${siteDomain} is not a top level domain. The certificate will be created for *.${mainDomain}`);
|
|
176
|
+
}
|
|
177
|
+
return { siteDomain, mainDomain, subDomainWildcard };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=spa.construct.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spa.construct.js","sourceRoot":"","sources":["../../../../../../../libs/public/spa-cdk-stack/src/lib/spa/spa.construct.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function envOrDie(key: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envOrDie.js","sourceRoot":"","sources":["../../../../../../../libs/public/spa-cdk-stack/src/lib/utils/envOrDie.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,cAAc,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/eslint.config.mjs
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { FlatCompat } from '@eslint/eslintrc';
|
|
2
|
-
import baseConfig from '../../../eslint.base.config.mjs';
|
|
3
|
-
import js from '@eslint/js';
|
|
4
|
-
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import { dirname } from 'node:path';
|
|
7
|
-
|
|
8
|
-
// Convert import.meta.url to a file path
|
|
9
|
-
const filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const compat = new FlatCompat({
|
|
11
|
-
baseDirectory: dirname(filename),
|
|
12
|
-
recommendedConfig: js.configs.recommended,
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export default [
|
|
16
|
-
...baseConfig,
|
|
17
|
-
{
|
|
18
|
-
files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
|
|
19
|
-
rules: {},
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
files: ['**/*.ts', '**/*.tsx'],
|
|
23
|
-
rules: {},
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
files: ['**/*.js', '**/*.jsx'],
|
|
27
|
-
rules: {},
|
|
28
|
-
},
|
|
29
|
-
...compat.config({ parser: 'jsonc-eslint-parser' }).map((config) => ({
|
|
30
|
-
...config,
|
|
31
|
-
files: ['**/*.json'],
|
|
32
|
-
rules: {
|
|
33
|
-
...config.rules,
|
|
34
|
-
'@nx/dependency-checks': [
|
|
35
|
-
'error',
|
|
36
|
-
{ ignoredFiles: ['{projectRoot}/vite.config.{js,ts,mjs,mts}'] },
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
})),
|
|
40
|
-
];
|
package/project.json
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "spa-cdk-stack",
|
|
3
|
-
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
-
"sourceRoot": "libs/public/spa-cdk-stack/src",
|
|
5
|
-
"projectType": "library",
|
|
6
|
-
"tags": ["infra-shared", "published"],
|
|
7
|
-
"targets": {
|
|
8
|
-
"build": {
|
|
9
|
-
"executor": "@nx/js:tsc",
|
|
10
|
-
"outputs": ["{options.outputPath}"],
|
|
11
|
-
"options": {
|
|
12
|
-
"outputPath": "dist/libs/public/spa-cdk-stack",
|
|
13
|
-
"main": "libs/public/spa-cdk-stack/src/index.ts",
|
|
14
|
-
"tsConfig": "libs/public/spa-cdk-stack/tsconfig.lib.json",
|
|
15
|
-
"assets": ["libs/public/spa-cdk-stack/*.md"]
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"test": {
|
|
19
|
-
"executor": "@nx/vitest:test",
|
|
20
|
-
"options": {
|
|
21
|
-
"configFile": "libs/public/spa-cdk-stack/vite.config.ts"
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|