@wolsok/spa-cdk-stack 1.0.15 → 1.0.18

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 CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@wolsok/spa-cdk-stack",
3
- "version": "1.0.15",
3
+ "version": "1.0.18",
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
@@ -0,0 +1,3 @@
1
+ export * from './lib/spa/spa.construct';
2
+ export * from './lib/utils/envOrDie';
3
+ //# sourceMappingURL=index.js.map
@@ -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,9 @@
1
+ export function envOrDie(key) {
2
+ const value = process.env[key];
3
+ if (!value) {
4
+ console.error(`Environment variable ${key} is required`);
5
+ process.exit(1);
6
+ }
7
+ return value;
8
+ }
9
+ //# sourceMappingURL=envOrDie.js.map
@@ -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
- ];
@@ -1,3 +0,0 @@
1
- {
2
- "someFancyJSON": 1
3
- }
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
- }