@inizioevoke/aws-cdk-helpers 1.0.1 → 1.0.3

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 (45) hide show
  1. package/dist/constructs/certificatemanager.d.ts +13 -0
  2. package/dist/constructs/certificatemanager.js +19 -0
  3. package/dist/constructs/cloudfront.d.ts +44 -0
  4. package/dist/constructs/cloudfront.js +78 -0
  5. package/dist/constructs/codebuild.d.ts +26 -0
  6. package/dist/constructs/codebuild.js +76 -0
  7. package/dist/constructs/codepipeline.d.ts +30 -0
  8. package/dist/constructs/codepipeline.js +58 -0
  9. package/dist/constructs/route53.d.ts +14 -0
  10. package/dist/constructs/route53.js +24 -0
  11. package/dist/constructs/s3.d.ts +12 -0
  12. package/dist/constructs/s3.js +17 -0
  13. package/dist/constructs/waf.d.ts +21 -0
  14. package/dist/constructs/waf.js +86 -0
  15. package/dist/lib/utils.d.ts +5 -0
  16. package/dist/lib/utils.js +19 -0
  17. package/dist/stacks/web-static-serverless/codepipeline-stack.d.ts +17 -0
  18. package/dist/stacks/web-static-serverless/codepipeline-stack.js +28 -0
  19. package/dist/stacks/web-static-serverless/web-global-stack.d.ts +33 -0
  20. package/dist/stacks/web-static-serverless/web-global-stack.js +85 -0
  21. package/dist/stages/str8r-clm-stage.d.ts +17 -0
  22. package/dist/stages/str8r-clm-stage.js +39 -0
  23. package/dist/stages/web-static-serverless-stage.d.ts +17 -0
  24. package/dist/stages/web-static-serverless-stage.js +39 -0
  25. package/package.json +11 -1
  26. package/{constructs → src/constructs}/certificatemanager.ts +1 -1
  27. package/{constructs → src/constructs}/cloudfront.ts +4 -2
  28. package/{constructs → src/constructs}/codebuild.ts +1 -1
  29. package/{constructs → src/constructs}/codepipeline.ts +2 -2
  30. package/{constructs → src/constructs}/s3.ts +1 -1
  31. package/{constructs → src/constructs}/waf.ts +2 -2
  32. package/{stacks → src/stacks}/web-static-serverless/codepipeline-stack.ts +2 -2
  33. package/{stacks → src/stacks}/web-static-serverless/web-global-stack.ts +6 -6
  34. package/{stages → src/stages}/str8r-clm-stage.ts +3 -3
  35. package/{stages → src/stages}/web-static-serverless-stage.ts +3 -3
  36. package/src/templates/cffn-default-doc-basic-auth.js +148 -0
  37. package/src/templates/cffn-default-doc.js +125 -0
  38. package/tasks/clean.js +7 -0
  39. package/tasks/copy-templates.js +13 -0
  40. package/tsconfig.json +4 -1
  41. /package/{templates → dist/templates}/cffn-default-doc-basic-auth.js +0 -0
  42. /package/{templates → dist/templates}/cffn-default-doc.js +0 -0
  43. /package/{constructs → src/constructs}/route53.ts +0 -0
  44. /package/{lib → src/lib}/types.d.ts +0 -0
  45. /package/{lib → src/lib}/utils.ts +0 -0
@@ -0,0 +1,13 @@
1
+ import { Construct } from 'constructs';
2
+ import { Certificate } from "aws-cdk-lib/aws-certificatemanager";
3
+ import { IHostedZone } from "aws-cdk-lib/aws-route53";
4
+ export interface SSLCertificateProps {
5
+ hostedZone: IHostedZone;
6
+ domainName: string;
7
+ destroy?: boolean;
8
+ tags?: Record<string, string>;
9
+ }
10
+ export declare class SSLCertificate extends Construct {
11
+ readonly certificate: Certificate;
12
+ constructor(scope: Construct, id: string, props: SSLCertificateProps);
13
+ }
@@ -0,0 +1,19 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
2
+ import { Construct } from 'constructs';
3
+ import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager";
4
+ import { tagResource } from "../lib/utils.js";
5
+ export class SSLCertificate extends Construct {
6
+ certificate;
7
+ constructor(scope, id, props) {
8
+ super(scope, id);
9
+ this.certificate = new Certificate(this, `Certificate-${props.domainName}`, {
10
+ domainName: props.domainName,
11
+ validation: CertificateValidation.fromDns(props.hostedZone),
12
+ });
13
+ tagResource(this.certificate, props.tags);
14
+ if (typeof props.destroy == 'boolean') {
15
+ this.certificate.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
16
+ }
17
+ }
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydGlmaWNhdGVtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY2VydGlmaWNhdGVtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFeEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUzlDLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUMzQixXQUFXLENBQWM7SUFFekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLGVBQWUsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQzFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixVQUFVLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7U0FDNUQsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BHLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENlcnRpZmljYXRlLCBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgSUhvc3RlZFpvbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IHRhZ1Jlc291cmNlIH0gZnJvbSBcIi4uL2xpYi91dGlscy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNTTENlcnRpZmljYXRlUHJvcHMge1xuICBob3N0ZWRab25lOiBJSG9zdGVkWm9uZTtcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBkZXN0cm95PzogYm9vbGVhbjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBTU0xDZXJ0aWZpY2F0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNTTENlcnRpZmljYXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IG5ldyBDZXJ0aWZpY2F0ZSh0aGlzLCBgQ2VydGlmaWNhdGUtJHtwcm9wcy5kb21haW5OYW1lfWAsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICB2YWxpZGF0aW9uOiBDZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhwcm9wcy5ob3N0ZWRab25lKSxcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmNlcnRpZmljYXRlLCBwcm9wcy50YWdzKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmNlcnRpZmljYXRlLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,44 @@
1
+ import { Construct } from 'constructs';
2
+ import { ICertificate } from 'aws-cdk-lib/aws-certificatemanager';
3
+ import { BehaviorOptions, Distribution, Function } from 'aws-cdk-lib/aws-cloudfront';
4
+ import type { IResourceProps } from '../lib/types.js';
5
+ export interface CloudFrontDistributionProps extends IResourceProps {
6
+ domainName: string;
7
+ description?: string;
8
+ defaultBehavior: BehaviorOptions;
9
+ additionalBehaviors?: Record<string, BehaviorOptions>;
10
+ priceClass?: 'PRICE_CLASS_ALL' | 'PRICE_CLASS_100' | 'PRICE_CLASS_200' | 'NOT_PROD' | 'PROD';
11
+ certificate: ICertificate;
12
+ webAclId?: string;
13
+ }
14
+ export declare class CloudFrontDistribution extends Construct {
15
+ readonly distribution: Distribution;
16
+ constructor(scope: Construct, id: string, props: CloudFrontDistributionProps);
17
+ }
18
+ export type CloudFrontFunctionRedirectPaths = Record<string, string | [string, 301 | 302]>;
19
+ export interface CloudFrontFunctionRedirects {
20
+ trailingSlash?: boolean;
21
+ defaultDocument?: string;
22
+ redirectDefaultDocument?: boolean;
23
+ paths?: CloudFrontFunctionRedirectPaths;
24
+ }
25
+ export interface DefaultDocFunctionProps extends IResourceProps {
26
+ functionName?: string;
27
+ defaultDocument?: string;
28
+ redirects?: CloudFrontFunctionRedirects;
29
+ }
30
+ export interface BasicAuthDefaultDocFunctionProps extends DefaultDocFunctionProps {
31
+ user: string;
32
+ password: string;
33
+ }
34
+ export interface CloudFrontFunctionProps extends IResourceProps {
35
+ code: string;
36
+ functionName?: string;
37
+ runtime?: 'JS_1_0' | 'JS_2_0';
38
+ }
39
+ export declare class CloudFrontFunction extends Construct {
40
+ readonly fn: Function;
41
+ constructor(scope: Construct, id: string, props: CloudFrontFunctionProps);
42
+ static createDefaultDoc(scope: Construct, id: string, props: DefaultDocFunctionProps): CloudFrontFunction;
43
+ static createBasicAuthDefaultDoc(scope: Construct, id: string, props: BasicAuthDefaultDocFunctionProps): CloudFrontFunction;
44
+ }
@@ -0,0 +1,78 @@
1
+ import { resolve } from 'node:path';
2
+ import { readFileSync } from 'node:fs';
3
+ import { Buffer } from 'node:buffer';
4
+ import { RemovalPolicy } from "aws-cdk-lib";
5
+ import { Construct } from 'constructs';
6
+ import { Distribution, Function, FunctionCode, FunctionRuntime, PriceClass } from 'aws-cdk-lib/aws-cloudfront';
7
+ import { tagResource } from '../lib/utils.js';
8
+ const __dirname = import.meta.dirname;
9
+ export class CloudFrontDistribution extends Construct {
10
+ distribution;
11
+ constructor(scope, id, props) {
12
+ super(scope, id);
13
+ let priceClass = PriceClass.PRICE_CLASS_ALL;
14
+ switch (props.priceClass) {
15
+ case 'NOT_PROD':
16
+ case 'PRICE_CLASS_100':
17
+ priceClass = PriceClass.PRICE_CLASS_100;
18
+ break;
19
+ case 'PRICE_CLASS_200':
20
+ priceClass = PriceClass.PRICE_CLASS_200;
21
+ break;
22
+ }
23
+ this.distribution = new Distribution(this, `${id}|CloudFrontDistribution`, {
24
+ comment: props.description,
25
+ defaultBehavior: props.defaultBehavior,
26
+ additionalBehaviors: props.additionalBehaviors,
27
+ domainNames: [props.domainName],
28
+ certificate: props.certificate,
29
+ priceClass,
30
+ webAclId: props.webAclId
31
+ });
32
+ tagResource(this.distribution, props.tags);
33
+ if (typeof props.destroy == 'boolean') {
34
+ this.distribution.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
35
+ }
36
+ }
37
+ }
38
+ export class CloudFrontFunction extends Construct {
39
+ fn;
40
+ constructor(scope, id, props) {
41
+ super(scope, id);
42
+ this.fn = new Function(this, 'CloudFrontFunction', {
43
+ functionName: props.functionName,
44
+ runtime: FunctionRuntime[props.runtime ?? 'JS_2_0'],
45
+ code: FunctionCode.fromInline(props.code)
46
+ });
47
+ tagResource(this.fn, props.tags);
48
+ if (typeof props.destroy == 'boolean') {
49
+ this.fn.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
50
+ }
51
+ }
52
+ static createDefaultDoc(scope, id, props) {
53
+ const code = readFileSync(resolve(__dirname, '../templates/cffn-default-doc.js'), 'utf8')
54
+ .replace('__DEFAULT_DOCUMENT__', props.defaultDocument ?? 'index.html')
55
+ .replace('__REDIRECTS__', props.redirects?.paths ? JSON.stringify(props.redirects?.paths) : 'null')
56
+ .replace('__TRAILING_SLASH__', props.redirects?.trailingSlash?.toString() ?? 'null')
57
+ .replace('__REDIR_DEF_DOC__', props.redirects?.redirectDefaultDocument?.toString() ?? 'false');
58
+ return new CloudFrontFunction(scope, 'DefaultDocFunction', {
59
+ functionName: props.functionName,
60
+ runtime: 'JS_2_0',
61
+ code
62
+ });
63
+ }
64
+ static createBasicAuthDefaultDoc(scope, id, props) {
65
+ const code = readFileSync(resolve(__dirname, '../templates/cffn-default-doc-basic-auth.js'), 'utf8')
66
+ .replace('__DEFAULT_DOCUMENT__', props.defaultDocument ?? 'index.html')
67
+ .replace('__CREDENTIALS__', Buffer.from(`${props.user}:${props.password}`).toString('base64'))
68
+ .replace('__REDIRECTS__', props.redirects?.paths ? JSON.stringify(props.redirects?.paths) : 'null')
69
+ .replace('__TRAILING_SLASH__', props.redirects?.trailingSlash?.toString() ?? 'null')
70
+ .replace('__REDIR_DEF_DOC__', props.redirects?.redirectDefaultDocument?.toString() ?? 'false');
71
+ return new CloudFrontFunction(scope, 'BasicAuthDefaultDocFunction', {
72
+ functionName: props.functionName,
73
+ runtime: 'JS_2_0',
74
+ code
75
+ });
76
+ }
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL2Nsb3VkZnJvbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE9BQU8sRUFBbUIsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQXFCLGVBQWUsRUFBVyxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1SixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFXdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFNBQVM7SUFDbkMsWUFBWSxDQUFlO0lBRTNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQzVDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssaUJBQWlCO2dCQUNwQixVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztnQkFDeEMsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFH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eUIsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUNwRyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSw2Q0FBNkMsQ0FBQyxFQUFFLE1BQU0sQ0FBQzthQUNqRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGVBQWUsSUFBSSxZQUFZLENBQUM7YUFDdEUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM3RixPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUNuRyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksTUFBTSxDQUFDO2FBQ25GLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDO1FBRWpHLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7WUFDbEUsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLElBQUk7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnbm9kZTpidWZmZXInO1xuaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJQ2VydGlmaWNhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCB7IEJlaGF2aW9yT3B0aW9ucywgRGlzdHJpYnV0aW9uLCBGdW5jdGlvbiwgRnVuY3Rpb25Db2RlLCBGdW5jdGlvbkV2ZW50VHlwZSwgRnVuY3Rpb25SdW50aW1lLCBJT3JpZ2luLCBQcmljZUNsYXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tICcuLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4uL2xpYi90eXBlcy5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGltcG9ydC5tZXRhLmRpcm5hbWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzIGV4dGVuZHMgSVJlc291cmNlUHJvcHMge1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBkZWZhdWx0QmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucztcbiAgYWRkaXRpb25hbEJlaGF2aW9ycz86IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz47XG4gIHByaWNlQ2xhc3M/OiAnUFJJQ0VfQ0xBU1NfQUxMJyB8ICdQUklDRV9DTEFTU18xMDAnIHwgJ1BSSUNFX0NMQVNTXzIwMCcgfCAnTk9UX1BST0QnIHwgJ1BST0QnO1xuICBjZXJ0aWZpY2F0ZTogSUNlcnRpZmljYXRlO1xuICB3ZWJBY2xJZD86IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250RGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250RGlzdHJpYnV0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTDtcbiAgICBzd2l0Y2ggKHByb3BzLnByaWNlQ2xhc3MpIHtcbiAgICAgIGNhc2UgJ05PVF9QUk9EJzpcbiAgICAgIGNhc2UgJ1BSSUNFX0NMQVNTXzEwMCc6XG4gICAgICAgIHByaWNlQ2xhc3MgPSBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUklDRV9DTEFTU18yMDAnOlxuICAgICAgICBwcmljZUNsYXNzID0gUHJpY2VDbGFzcy5QUklDRV9DTEFTU18yMDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBgJHtpZH18Q2xvdWRGcm9udERpc3RyaWJ1dGlvbmAsIHtcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiBwcm9wcy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiBwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzLFxuICAgICAgZG9tYWluTmFtZXM6IFtwcm9wcy5kb21haW5OYW1lXSxcbiAgICAgIGNlcnRpZmljYXRlOiBwcm9wcy5jZXJ0aWZpY2F0ZSxcbiAgICAgIHByaWNlQ2xhc3MsXG4gICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsSWRcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmRpc3RyaWJ1dGlvbiwgcHJvcHMudGFncyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0UGF0aHMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBbc3RyaW5nLCAzMDF8MzAyXT47IFxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRGdW5jdGlvblJlZGlyZWN0cyB7XG4gIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICBkZWZhdWx0RG9jdW1lbnQ/OiBzdHJpbmc7XG4gIHJlZGlyZWN0RGVmYXVsdERvY3VtZW50PzogYm9vbGVhbjtcbiAgcGF0aHM/OiBDbG91ZEZyb250RnVuY3Rpb25SZWRpcmVjdFBhdGhzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHREb2NGdW5jdGlvblByb3BzIGV4dGVuZHMgSVJlc291cmNlUHJvcHMge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGRlZmF1bHREb2N1bWVudD86IHN0cmluZztcbiAgcmVkaXJlY3RzPzogQ2xvdWRGcm9udEZ1bmN0aW9uUmVkaXJlY3RzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2ljQXV0aERlZmF1bHREb2NGdW5jdGlvblByb3BzIGV4dGVuZHMgRGVmYXVsdERvY0Z1bmN0aW9uUHJvcHMge1xuICB1c2VyOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGcm9udEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBJUmVzb3VyY2VQcm9wcyB7XG4gIGNvZGU6IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICBydW50aW1lPzogJ0pTXzFfMCcgfCAnSlNfMl8wJztcbn1cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250RnVuY3Rpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgZm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250RnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbG91ZEZyb250RnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIHJ1bnRpbWU6IEZ1bmN0aW9uUnVudGltZVtwcm9wcy5ydW50aW1lID8/ICdKU18yXzAnXSxcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKHByb3BzLmNvZGUpXG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5mbiwgcHJvcHMudGFncyk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmZuLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEZWZhdWx0RG9jKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEZWZhdWx0RG9jRnVuY3Rpb25Qcm9wcykge1xuICAgIGNvbnN0IGNvZGUgPSByZWFkRmlsZVN5bmMocmVzb2x2ZShfX2Rpcm5hbWUsICcuLi90ZW1wbGF0ZXMvY2Zmbi1kZWZhdWx0LWRvYy5qcycpLCAndXRmOCcpXG4gICAgICAucmVwbGFjZSgnX19ERUZBVUxUX0RPQ1VNRU5UX18nLCBwcm9wcy5kZWZhdWx0RG9jdW1lbnQgPz8gJ2luZGV4Lmh0bWwnKVxuICAgICAgLnJlcGxhY2UoJ19fUkVESVJFQ1RTX18nLCBwcm9wcy5yZWRpcmVjdHM/LnBhdGhzID8gSlNPTi5zdHJpbmdpZnkocHJvcHMucmVkaXJlY3RzPy5wYXRocyApIDogJ251bGwnKVxuICAgICAgLnJlcGxhY2UoJ19fVFJBSUxJTkdfU0xBU0hfXycsIHByb3BzLnJlZGlyZWN0cz8udHJhaWxpbmdTbGFzaD8udG9TdHJpbmcoKSA/PyAnbnVsbCcpXG4gICAgICAucmVwbGFjZSgnX19SRURJUl9ERUZfRE9DX18nLCBwcm9wcy5yZWRpcmVjdHM/LnJlZGlyZWN0RGVmYXVsdERvY3VtZW50Py50b1N0cmluZygpID8/ICdmYWxzZScpO1xuXG4gICAgcmV0dXJuIG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc2NvcGUsICdEZWZhdWx0RG9jRnVuY3Rpb24nLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIHJ1bnRpbWU6ICdKU18yXzAnLFxuICAgICAgY29kZVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUJhc2ljQXV0aERlZmF1bHREb2Moc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhc2ljQXV0aERlZmF1bHREb2NGdW5jdGlvblByb3BzKSB7XG4gICAgY29uc3QgY29kZSA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKF9fZGlybmFtZSwgJy4uL3RlbXBsYXRlcy9jZmZuLWRlZmF1bHQtZG9jLWJhc2ljLWF1dGguanMnKSwgJ3V0ZjgnKVxuICAgICAgLnJlcGxhY2UoJ19fREVGQVVMVF9ET0NVTUVOVF9fJywgcHJvcHMuZGVmYXVsdERvY3VtZW50ID8/ICdpbmRleC5odG1sJylcbiAgICAgIC5yZXBsYWNlKCdfX0NSRURFTlRJQUxTX18nLCBCdWZmZXIuZnJvbShgJHtwcm9wcy51c2VyfToke3Byb3BzLnBhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKSlcbiAgICAgIC5yZXBsYWNlKCdfX1JFRElSRUNUU19fJywgcHJvcHMucmVkaXJlY3RzPy5wYXRocyA/IEpTT04uc3RyaW5naWZ5KHByb3BzLnJlZGlyZWN0cz8ucGF0aHMgKSA6ICdudWxsJylcbiAgICAgIC5yZXBsYWNlKCdfX1RSQUlMSU5HX1NMQVNIX18nLCBwcm9wcy5yZWRpcmVjdHM/LnRyYWlsaW5nU2xhc2g/LnRvU3RyaW5nKCkgPz8gJ251bGwnKVxuICAgICAgLnJlcGxhY2UoJ19fUkVESVJfREVGX0RPQ19fJywgcHJvcHMucmVkaXJlY3RzPy5yZWRpcmVjdERlZmF1bHREb2N1bWVudD8udG9TdHJpbmcoKSA/PyAnZmFsc2UnKTtcbiAgICBcbiAgICByZXR1cm4gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihzY29wZSwgJ0Jhc2ljQXV0aERlZmF1bHREb2NGdW5jdGlvbicsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMuZnVuY3Rpb25OYW1lLFxuICAgICAgcnVudGltZTogJ0pTXzJfMCcsXG4gICAgICBjb2RlXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { Construct } from 'constructs';
2
+ import { BuildEnvironmentVariableType, IBuildImage, PipelineProject } from 'aws-cdk-lib/aws-codebuild';
3
+ export type EnvironmentVariables = Record<string, {
4
+ value: any;
5
+ type?: BuildEnvironmentVariableType;
6
+ }>;
7
+ export interface EcrBuildImage {
8
+ repository: string;
9
+ tag: string;
10
+ }
11
+ export interface CodeBuildPipelineProjectProps {
12
+ projectName?: string;
13
+ buildSpec?: string | object;
14
+ buildImage?: ('STANDARD_5_0' | 'STANDARD_6_0' | 'STANDARD_7_0') | IBuildImage;
15
+ ecrBuildImage?: EcrBuildImage;
16
+ computeType?: ('SMALL' | 'MEDIUM' | 'LARGE' | 'X_LARGE' | 'X2_LARGE') | string;
17
+ environmentVariables?: EnvironmentVariables;
18
+ cloudFrontDistributionArn?: string;
19
+ s3BucketName?: string;
20
+ destroy?: boolean;
21
+ tags?: Record<string, string>;
22
+ }
23
+ export declare class CodeBuildPipelineProject extends Construct {
24
+ readonly project: PipelineProject;
25
+ constructor(scope: Construct, id: string, props: CodeBuildPipelineProjectProps);
26
+ }
@@ -0,0 +1,76 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
2
+ import { Construct } from 'constructs';
3
+ import { BuildSpec, ComputeType, LinuxBuildImage, PipelineProject } from 'aws-cdk-lib/aws-codebuild';
4
+ import { Repository } from "aws-cdk-lib/aws-ecr";
5
+ import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
6
+ import { Bucket } from 'aws-cdk-lib/aws-s3';
7
+ import { tagResource } from "../lib/utils.js";
8
+ export class CodeBuildPipelineProject extends Construct {
9
+ project;
10
+ constructor(scope, id, props) {
11
+ super(scope, id);
12
+ if (!props.environmentVariables) {
13
+ props.environmentVariables = {};
14
+ }
15
+ if (props.cloudFrontDistributionArn && !props.environmentVariables.CLOUDFRONT_DISTRIBUTION_ID) {
16
+ props.environmentVariables.CLOUDFRONT_DISTRIBUTION_ID = {
17
+ value: props.cloudFrontDistributionArn.split('/').pop()
18
+ };
19
+ }
20
+ if (props.s3BucketName && !props.environmentVariables.S3_BUCKET_NAME) {
21
+ props.environmentVariables.S3_BUCKET_NAME = {
22
+ value: props.s3BucketName
23
+ };
24
+ }
25
+ let buildImage = undefined;
26
+ if (props.ecrBuildImage) {
27
+ const repository = props.ecrBuildImage.repository.startsWith('arn:aws') ?
28
+ Repository.fromRepositoryArn(this, 'EcrRepository', props.ecrBuildImage.repository) :
29
+ Repository.fromRepositoryName(this, 'EcrRepository', props.ecrBuildImage.repository);
30
+ buildImage = LinuxBuildImage.fromEcrRepository(repository, props.ecrBuildImage.tag);
31
+ }
32
+ else if (props.buildImage) {
33
+ if (typeof props.buildImage == 'string') {
34
+ buildImage = LinuxBuildImage[props.buildImage ?? 'STANDARD_7_0'];
35
+ }
36
+ else {
37
+ buildImage = props.buildImage;
38
+ }
39
+ }
40
+ this.project = new PipelineProject(this, 'CodeBuildPipelineProjectProps', {
41
+ projectName: props.projectName,
42
+ buildSpec: props.buildSpec ? typeof props.buildSpec == 'object' ? BuildSpec.fromObjectToYaml(props.buildSpec) : BuildSpec.fromSourceFilename(props.buildSpec ?? 'buildspec.yml') : undefined,
43
+ environment: {
44
+ buildImage: buildImage ?? LinuxBuildImage.STANDARD_7_0,
45
+ computeType: ComputeType[props.computeType ?? 'SMALL'],
46
+ environmentVariables: props.environmentVariables
47
+ }
48
+ });
49
+ tagResource(this.project, props.tags);
50
+ if (typeof props.destroy == 'boolean') {
51
+ this.project.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
52
+ }
53
+ // Add CloudWatch log permissions
54
+ this.project.addToRolePolicy(new PolicyStatement({
55
+ actions: [
56
+ 'logs:CreateLogGroup',
57
+ 'logs:CreateLogStream',
58
+ 'logs:PutLogEvents'
59
+ ],
60
+ resources: [this.project.projectArn]
61
+ }));
62
+ // Allow the project to create an invalidation
63
+ if (props.cloudFrontDistributionArn) {
64
+ this.project.addToRolePolicy(new PolicyStatement({
65
+ actions: ['cloudfront:CreateInvalidation'],
66
+ resources: [props.cloudFrontDistributionArn]
67
+ }));
68
+ }
69
+ // Allow the project to sync files to S3
70
+ if (props.s3BucketName) {
71
+ const s3Bucket = Bucket.fromBucketName(this, 'S3BucketByName', props.s3BucketName);
72
+ s3Bucket.grantReadWrite(this.project);
73
+ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQWdDLFNBQVMsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBVyxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFCOUMsTUFBTSxPQUFPLHdCQUF5QixTQUFRLFNBQVM7SUFDckMsT0FBTyxDQUFrQjtJQUV6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9DO1FBQzVFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLHlCQUF5QixJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDOUYsS0FBSyxDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixHQUFHO2dCQUN0RCxLQUFLLEVBQUUsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7YUFDeEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FB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LElBQUksZUFBZSxDQUFDO2dCQUMvQyxPQUFPLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztnQkFDMUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDO2FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVELHdDQUF3QztRQUN4QyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkYsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSwgQnVpbGRTcGVjLCBDb21wdXRlVHlwZSwgSUJ1aWxkSW1hZ2UsIExpbnV4QnVpbGRJbWFnZSwgUGlwZWxpbmVQcm9qZWN0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQnVja2V0LCBJQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcblxuaW1wb3J0IHsgdGFnUmVzb3VyY2UgfSBmcm9tIFwiLi4vbGliL3V0aWxzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50VmFyaWFibGVzID0gUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogYW55LCB0eXBlPzogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSB9PjtcblxuZXhwb3J0IGludGVyZmFjZSBFY3JCdWlsZEltYWdlIHtcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICB0YWc6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMge1xuICBwcm9qZWN0TmFtZT86IHN0cmluZztcbiAgYnVpbGRTcGVjPzogc3RyaW5nIHwgb2JqZWN0O1xuICBidWlsZEltYWdlPzogKCdTVEFOREFSRF81XzAnIHwgJ1NUQU5EQVJEXzZfMCcgfCAnU1RBTkRBUkRfN18wJykgfCBJQnVpbGRJbWFnZTtcbiAgZWNyQnVpbGRJbWFnZT86IEVjckJ1aWxkSW1hZ2UsXG4gIGNvbXB1dGVUeXBlPzogKCdTTUFMTCcgfCAnTUVESVVNJyB8ICdMQVJHRScgfCAnWF9MQVJHRScgfCAnWDJfTEFSR0UnKSB8IHN0cmluZztcbiAgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiBFbnZpcm9ubWVudFZhcmlhYmxlcztcbiAgY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybj86IHN0cmluZztcbiAgczNCdWNrZXROYW1lPzogc3RyaW5nO1xuICBkZXN0cm95PzogYm9vbGVhbjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBDb2RlQnVpbGRQaXBlbGluZVByb2plY3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdDogUGlwZWxpbmVQcm9qZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb2RlQnVpbGRQaXBlbGluZVByb2plY3RQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHt9O1xuICAgIH1cbiAgICBpZiAocHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybiAmJiAhcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXMuQ0xPVURGUk9OVF9ESVNUUklCVVRJT05fSUQpIHtcbiAgICAgIHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLkNMT1VERlJPTlRfRElTVFJJQlVUSU9OX0lEID0ge1xuICAgICAgICB2YWx1ZTogcHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybi5zcGxpdCgnLycpLnBvcCgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zM0J1Y2tldE5hbWUgJiYgIXByb3BzLmVudmlyb25tZW50VmFyaWFibGVzLlMzX0JVQ0tFVF9OQU1FKSB7XG4gICAgICBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcy5TM19CVUNLRVRfTkFNRSA9IHtcbiAgICAgICAgdmFsdWU6IHByb3BzLnMzQnVja2V0TmFtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgYnVpbGRJbWFnZTogSUJ1aWxkSW1hZ2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLmVjckJ1aWxkSW1hZ2UpIHtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnYXJuOmF3cycpID8gXG4gICAgICAgIFJlcG9zaXRvcnkuZnJvbVJlcG9zaXRvcnlBcm4odGhpcywgJ0VjclJlcG9zaXRvcnknLCBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkpIDpcbiAgICAgICAgUmVwb3NpdG9yeS5mcm9tUmVwb3NpdG9yeU5hbWUodGhpcywgJ0VjclJlcG9zaXRvcnknLCBwcm9wcy5lY3JCdWlsZEltYWdlLnJlcG9zaXRvcnkpO1xuICAgICAgYnVpbGRJbWFnZSA9IExpbnV4QnVpbGRJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeShyZXBvc2l0b3J5LCBwcm9wcy5lY3JCdWlsZEltYWdlLnRhZyk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5idWlsZEltYWdlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmJ1aWxkSW1hZ2UgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgYnVpbGRJbWFnZSA9IExpbnV4QnVpbGRJbWFnZVtwcm9wcy5idWlsZEltYWdlID8/ICdTVEFOREFSRF83XzAnXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVpbGRJbWFnZSA9IHByb3BzLmJ1aWxkSW1hZ2UgYXMgSUJ1aWxkSW1hZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0ID0gbmV3IFBpcGVsaW5lUHJvamVjdCh0aGlzLCAnQ29kZUJ1aWxkUGlwZWxpbmVQcm9qZWN0UHJvcHMnLCB7XG4gICAgICBwcm9qZWN0TmFtZTogcHJvcHMucHJvamVjdE5hbWUsXG4gICAgICBidWlsZFNwZWM6IHByb3BzLmJ1aWxkU3BlYyA/IHR5cGVvZiBwcm9wcy5idWlsZFNwZWMgPT0gJ29iamVjdCcgPyBCdWlsZFNwZWMuZnJvbU9iamVjdFRvWWFtbChwcm9wcy5idWlsZFNwZWMpIDogQnVpbGRTcGVjLmZyb21Tb3VyY2VGaWxlbmFtZShwcm9wcy5idWlsZFNwZWMgPz8gJ2J1aWxkc3BlYy55bWwnKSA6IHVuZGVmaW5lZCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IGJ1aWxkSW1hZ2UgPz8gTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzdfMCxcbiAgICAgICAgY29tcHV0ZVR5cGU6IENvbXB1dGVUeXBlW3Byb3BzLmNvbXB1dGVUeXBlIGFzIChrZXlvZiB0eXBlb2YgQ29tcHV0ZVR5cGUgfCB1bmRlZmluZWQpID8/ICdTTUFMTCddLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcHJvcHMuZW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLnByb2plY3QsIHByb3BzLnRhZ3MpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZGVzdHJveSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMucHJvamVjdC5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgQ2xvdWRXYXRjaCBsb2cgcGVybWlzc2lvbnNcbiAgICB0aGlzLnByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogW1xuICAgICAgICAnbG9nczpDcmVhdGVMb2dHcm91cCcsXG4gICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICdsb2dzOlB1dExvZ0V2ZW50cydcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLnByb2plY3QucHJvamVjdEFybl1cbiAgICB9KSk7XG5cbiAgICAvLyBBbGxvdyB0aGUgcHJvamVjdCB0byBjcmVhdGUgYW4gaW52YWxpZGF0aW9uXG4gICAgaWYgKHByb3BzLmNsb3VkRnJvbnREaXN0cmlidXRpb25Bcm4pIHtcbiAgICAgIHRoaXMucHJvamVjdC5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnY2xvdWRmcm9udDpDcmVhdGVJbnZhbGlkYXRpb24nXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuY2xvdWRGcm9udERpc3RyaWJ1dGlvbkFybl1cbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgcHJvamVjdCB0byBzeW5jIGZpbGVzIHRvIFMzXG4gICAgaWYgKHByb3BzLnMzQnVja2V0TmFtZSkge1xuICAgICAgY29uc3QgczNCdWNrZXQgPSBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUodGhpcywgJ1MzQnVja2V0QnlOYW1lJywgcHJvcHMuczNCdWNrZXROYW1lKTtcbiAgICAgIHMzQnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMucHJvamVjdCk7XG4gICAgfVxuICB9XG59Il19
@@ -0,0 +1,30 @@
1
+ import { Construct } from 'constructs';
2
+ import { IProject } from "aws-cdk-lib/aws-codebuild";
3
+ import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
4
+ import { Bucket } from 'aws-cdk-lib/aws-s3';
5
+ import type { EnvironmentVariables } from './codebuild.js';
6
+ export interface AddSourceStageParams {
7
+ stageName?: string;
8
+ codestarConnectionArn: string;
9
+ repoOwner: string;
10
+ repo: string;
11
+ branch: string;
12
+ }
13
+ export interface AddBuildStageParams {
14
+ stageName?: string;
15
+ codeBuildProject: IProject;
16
+ sourceArtifact: Artifact;
17
+ environmentVariables?: EnvironmentVariables;
18
+ }
19
+ export interface CodePipelineProjectProps {
20
+ pipelineName?: string;
21
+ destroy?: boolean;
22
+ tags?: Record<string, string>;
23
+ }
24
+ export declare class CodePipelineProject extends Construct {
25
+ readonly s3Bucket: Bucket;
26
+ readonly pipeline: Pipeline;
27
+ constructor(scope: Construct, id: string, props: CodePipelineProjectProps);
28
+ addSourceStage(params: AddSourceStageParams): Artifact;
29
+ addBuildStage(params: AddBuildStageParams): void;
30
+ }
@@ -0,0 +1,58 @@
1
+ import { RemovalPolicy, PhysicalName } from "aws-cdk-lib";
2
+ import { Construct } from 'constructs';
3
+ import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
4
+ import { CodeBuildAction, CodeStarConnectionsSourceAction } from "aws-cdk-lib/aws-codepipeline-actions";
5
+ import { Bucket } from 'aws-cdk-lib/aws-s3';
6
+ import { tagResource } from "../lib/utils.js";
7
+ export class CodePipelineProject extends Construct {
8
+ s3Bucket;
9
+ pipeline;
10
+ constructor(scope, id, props) {
11
+ super(scope, id);
12
+ this.s3Bucket = new Bucket(this, 'CodePipelineArtifactBucket', {
13
+ bucketName: PhysicalName.GENERATE_IF_NEEDED,
14
+ removalPolicy: props.destroy !== undefined ? props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN : undefined,
15
+ autoDeleteObjects: props.destroy === true ? true : undefined
16
+ });
17
+ tagResource(this.s3Bucket, props.tags);
18
+ this.pipeline = new Pipeline(this, 'CodePipelineProject', {
19
+ pipelineName: props.pipelineName,
20
+ artifactBucket: this.s3Bucket
21
+ });
22
+ tagResource(this.pipeline, props.tags);
23
+ if (typeof props.destroy == 'boolean') {
24
+ this.pipeline.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
25
+ }
26
+ }
27
+ addSourceStage(params) {
28
+ const artifact = new Artifact();
29
+ this.pipeline.addStage({
30
+ stageName: params.stageName ?? 'Source',
31
+ actions: [
32
+ new CodeStarConnectionsSourceAction({
33
+ actionName: params.stageName ?? 'Source',
34
+ output: artifact,
35
+ connectionArn: params.codestarConnectionArn,
36
+ owner: params.repoOwner,
37
+ repo: params.repo,
38
+ branch: params.branch
39
+ })
40
+ ]
41
+ });
42
+ return artifact;
43
+ }
44
+ addBuildStage(params) {
45
+ this.pipeline.addStage({
46
+ stageName: params.stageName ?? 'Build',
47
+ actions: [
48
+ new CodeBuildAction({
49
+ actionName: params.stageName ?? 'Build',
50
+ project: params.codeBuildProject,
51
+ input: params.sourceArtifact,
52
+ environmentVariables: params.environmentVariables
53
+ })
54
+ ]
55
+ });
56
+ }
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXBpcGVsaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvY29kZXBpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFCOUMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLFNBQVM7SUFDaEMsUUFBUSxDQUFTO0lBQ2pCLFFBQVEsQ0FBVztJQUVuQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7WUFDN0QsVUFBVSxFQUFFLFlBQVksQ0FBQyxrQkFBa0I7WUFDM0MsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3JILGlCQUFpQixFQUFFLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDN0QsQ0FBQyxDQUFDO1FBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ3hELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pHLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQTRCO1FBQ3pDLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDckIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUTtZQUN2QyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSwrQkFBK0IsQ0FBQztvQkFDbEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksUUFBUTtvQkFDeEMsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLGFBQWEsRUFBRSxNQUFNLENBQUMscUJBQXFCO29CQUMzQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVM7b0JBQ3ZCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2lCQUN0QixDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQTJCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3JCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxJQUFJLE9BQU87WUFDdEMsT0FBTyxFQUFFO2dCQUNQLElBQUksZUFBZSxDQUFDO29CQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsSUFBSSxPQUFPO29CQUN2QyxPQUFPLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtvQkFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjO29CQUM1QixvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO2lCQUNsRCxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBQaHlzaWNhbE5hbWUgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSVByb2plY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZFwiO1xuaW1wb3J0IHsgQXJ0aWZhY3QsIFBpcGVsaW5lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIjtcbmltcG9ydCB7IENvZGVCdWlsZEFjdGlvbiwgQ29kZVN0YXJDb25uZWN0aW9uc1NvdXJjZUFjdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lLWFjdGlvbnNcIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5cbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICcuL2NvZGVidWlsZC5qcyc7XG5pbXBvcnQgeyB0YWdSZXNvdXJjZSB9IGZyb20gXCIuLi9saWIvdXRpbHMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBZGRTb3VyY2VTdGFnZVBhcmFtcyB7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgY29kZXN0YXJDb25uZWN0aW9uQXJuOiBzdHJpbmc7XG4gIHJlcG9Pd25lcjogc3RyaW5nO1xuICByZXBvOiBzdHJpbmc7XG4gIGJyYW5jaDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBZGRCdWlsZFN0YWdlUGFyYW1zIHtcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBjb2RlQnVpbGRQcm9qZWN0OiBJUHJvamVjdDtcbiAgc291cmNlQXJ0aWZhY3Q6IEFydGlmYWN0O1xuICBlbnZpcm9ubWVudFZhcmlhYmxlcz86IEVudmlyb25tZW50VmFyaWFibGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVQaXBlbGluZVByb2plY3RQcm9wcyB7XG4gIHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgZGVzdHJveT86IGJvb2xlYW47XG4gIHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuZXhwb3J0IGNsYXNzIENvZGVQaXBlbGluZVByb2plY3QgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgczNCdWNrZXQ6IEJ1Y2tldDtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBQaXBlbGluZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ29kZVBpcGVsaW5lUHJvamVjdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuczNCdWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsICdDb2RlUGlwZWxpbmVBcnRpZmFjdEJ1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IFBoeXNpY2FsTmFtZS5HRU5FUkFURV9JRl9ORUVERUQsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZXN0cm95ICE9PSB1bmRlZmluZWQgPyBwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4gOiB1bmRlZmluZWQsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogcHJvcHMuZGVzdHJveSA9PT0gdHJ1ZSA/IHRydWUgOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLnMzQnVja2V0LCBwcm9wcy50YWdzKTtcblxuICAgIHRoaXMucGlwZWxpbmUgPSBuZXcgUGlwZWxpbmUodGhpcywgJ0NvZGVQaXBlbGluZVByb2plY3QnLCB7XG4gICAgICBwaXBlbGluZU5hbWU6IHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgIGFydGlmYWN0QnVja2V0OiB0aGlzLnMzQnVja2V0XG4gICAgfSk7XG5cbiAgICB0YWdSZXNvdXJjZSh0aGlzLnBpcGVsaW5lLCBwcm9wcy50YWdzKTtcbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc3Ryb3kgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLnBpcGVsaW5lLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH1cbiAgfVxuXG4gIGFkZFNvdXJjZVN0YWdlKHBhcmFtczogQWRkU291cmNlU3RhZ2VQYXJhbXMpOiBBcnRpZmFjdCB7XG4gICAgY29uc3QgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3QoKTtcbiAgICB0aGlzLnBpcGVsaW5lLmFkZFN0YWdlKHtcbiAgICAgIHN0YWdlTmFtZTogcGFyYW1zLnN0YWdlTmFtZSA/PyAnU291cmNlJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IENvZGVTdGFyQ29ubmVjdGlvbnNTb3VyY2VBY3Rpb24oe1xuICAgICAgICAgIGFjdGlvbk5hbWU6IHBhcmFtcy5zdGFnZU5hbWUgPz8gJ1NvdXJjZScsXG4gICAgICAgICAgb3V0cHV0OiBhcnRpZmFjdCxcbiAgICAgICAgICBjb25uZWN0aW9uQXJuOiBwYXJhbXMuY29kZXN0YXJDb25uZWN0aW9uQXJuLFxuICAgICAgICAgIG93bmVyOiBwYXJhbXMucmVwb093bmVyLFxuICAgICAgICAgIHJlcG86IHBhcmFtcy5yZXBvLFxuICAgICAgICAgIGJyYW5jaDogcGFyYW1zLmJyYW5jaFxuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuICAgIHJldHVybiBhcnRpZmFjdDtcbiAgfVxuXG4gIGFkZEJ1aWxkU3RhZ2UocGFyYW1zOiBBZGRCdWlsZFN0YWdlUGFyYW1zKSB7XG4gICAgdGhpcy5waXBlbGluZS5hZGRTdGFnZSh7XG4gICAgICBzdGFnZU5hbWU6IHBhcmFtcy5zdGFnZU5hbWUgPz8gJ0J1aWxkJyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgbmV3IENvZGVCdWlsZEFjdGlvbih7XG4gICAgICAgICAgYWN0aW9uTmFtZTogcGFyYW1zLnN0YWdlTmFtZSA/PyAnQnVpbGQnLFxuICAgICAgICAgIHByb2plY3Q6IHBhcmFtcy5jb2RlQnVpbGRQcm9qZWN0LFxuICAgICAgICAgIGlucHV0OiBwYXJhbXMuc291cmNlQXJ0aWZhY3QsXG4gICAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHBhcmFtcy5lbnZpcm9ubWVudFZhcmlhYmxlc1xuICAgICAgICB9KVxuICAgICAgXVxuICAgIH0pO1xuICB9XG59Il19
@@ -0,0 +1,14 @@
1
+ import { IDistribution } from "aws-cdk-lib/aws-cloudfront";
2
+ import { ARecord, AaaaRecord, IHostedZone } from "aws-cdk-lib/aws-route53";
3
+ import { Construct } from "constructs";
4
+ export interface CloudFrontAliasProps {
5
+ hostedZone: IHostedZone;
6
+ domainName: string;
7
+ distribution: IDistribution;
8
+ }
9
+ export declare class CloudFrontAlias extends Construct {
10
+ readonly aRecord: ARecord;
11
+ readonly aaaaRecord: AaaaRecord;
12
+ constructor(scope: Construct, id: string, props: CloudFrontAliasProps);
13
+ }
14
+ export declare function getHostedZone(scope: Construct, id: string, domainName: string): IHostedZone;
@@ -0,0 +1,24 @@
1
+ import { ARecord, AaaaRecord, HostedZone, RecordTarget } from "aws-cdk-lib/aws-route53";
2
+ import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets";
3
+ import { Construct } from "constructs";
4
+ export class CloudFrontAlias extends Construct {
5
+ aRecord;
6
+ aaaaRecord;
7
+ constructor(scope, id, props) {
8
+ super(scope, id);
9
+ this.aRecord = new ARecord(this, `ARecord-${props.domainName}`, {
10
+ zone: props.hostedZone,
11
+ target: RecordTarget.fromAlias(new CloudFrontTarget(props.distribution)),
12
+ recordName: props.domainName
13
+ });
14
+ this.aaaaRecord = new AaaaRecord(this, `AaaaRecord-${props.domainName}`, {
15
+ zone: props.hostedZone,
16
+ target: RecordTarget.fromAlias(new CloudFrontTarget(props.distribution)),
17
+ recordName: props.domainName
18
+ });
19
+ }
20
+ }
21
+ export function getHostedZone(scope, id, domainName) {
22
+ return HostedZone.fromLookup(scope, `getHostedZone-${domainName}`, { domainName });
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGU1My5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdHJ1Y3RzL3JvdXRlNTMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFlLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFPdkMsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQUM1QixPQUFPLENBQVU7SUFDakIsVUFBVSxDQUFhO0lBRXZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLEtBQUssQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUM5RCxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDdEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDeEUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzdCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLGNBQWMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3ZFLElBQUksRUFBRSxLQUFLLENBQUMsVUFBVTtZQUN0QixNQUFNLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxVQUFrQjtJQUM1RSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLGlCQUFpQixVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDckYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IEFSZWNvcmQsIEFhYWFSZWNvcmQsIEhvc3RlZFpvbmUsIElIb3N0ZWRab25lLCBSZWNvcmRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7IENsb3VkRnJvbnRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250QWxpYXNQcm9wcyB7XG4gIGhvc3RlZFpvbmU6IElIb3N0ZWRab25lO1xuICBkb21haW5OYW1lOiBzdHJpbmc7XG4gIGRpc3RyaWJ1dGlvbjogSURpc3RyaWJ1dGlvbjsgXG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udEFsaWFzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFSZWNvcmQ6IEFSZWNvcmQ7XG4gIHB1YmxpYyByZWFkb25seSBhYWFhUmVjb3JkOiBBYWFhUmVjb3JkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbG91ZEZyb250QWxpYXNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFSZWNvcmQgPSBuZXcgQVJlY29yZCh0aGlzLCBgQVJlY29yZC0ke3Byb3BzLmRvbWFpbk5hbWV9YCwge1xuICAgICAgem9uZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldChwcm9wcy5kaXN0cmlidXRpb24pKSxcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbk5hbWVcbiAgICB9KTtcblxuICAgIHRoaXMuYWFhYVJlY29yZCA9IG5ldyBBYWFhUmVjb3JkKHRoaXMsIGBBYWFhUmVjb3JkLSR7cHJvcHMuZG9tYWluTmFtZX1gLCB7XG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHByb3BzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluTmFtZVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb3N0ZWRab25lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGRvbWFpbk5hbWU6IHN0cmluZykge1xuICByZXR1cm4gSG9zdGVkWm9uZS5mcm9tTG9va3VwKHNjb3BlLCBgZ2V0SG9zdGVkWm9uZS0ke2RvbWFpbk5hbWV9YCwgeyBkb21haW5OYW1lIH0pO1xufSJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Construct } from 'constructs';
2
+ import { Bucket } from 'aws-cdk-lib/aws-s3';
3
+ export interface S3BucketProps {
4
+ /** The name of the S3 bucket */
5
+ bucketName?: string;
6
+ destroy?: boolean;
7
+ tags?: Record<string, string>;
8
+ }
9
+ export declare class S3Bucket extends Construct {
10
+ readonly bucket: Bucket;
11
+ constructor(scope: Construct, id: string, props: S3BucketProps);
12
+ }
@@ -0,0 +1,17 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
2
+ import { Construct } from 'constructs';
3
+ import { Bucket } from 'aws-cdk-lib/aws-s3';
4
+ import { tagResource } from '../lib/utils.js';
5
+ export class S3Bucket extends Construct {
6
+ bucket;
7
+ constructor(scope, id, props) {
8
+ super(scope, id);
9
+ this.bucket = new Bucket(this, 'S3Bucket', {
10
+ bucketName: props.bucketName,
11
+ removalPolicy: props.destroy !== undefined ? props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN : undefined,
12
+ autoDeleteObjects: props.destroy === true ? true : undefined
13
+ });
14
+ tagResource(this.bucket, props.tags);
15
+ }
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVM5QyxNQUFNLE9BQU8sUUFBUyxTQUFRLFNBQVM7SUFDckIsTUFBTSxDQUFTO0lBRS9CLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDekMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNySCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQzdELENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyB0YWdSZXNvdXJjZSB9IGZyb20gJy4uL2xpYi91dGlscy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNCdWNrZXRQcm9wcyB7XG4gIC8qKiBUaGUgbmFtZSBvZiB0aGUgUzMgYnVja2V0ICovXG4gIGJ1Y2tldE5hbWU/OiBzdHJpbmc7XG4gIGRlc3Ryb3k/OiBib29sZWFuO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGNsYXNzIFMzQnVja2V0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldDogQnVja2V0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTM0J1Y2tldFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCAnUzNCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMuZGVzdHJveSAhPT0gdW5kZWZpbmVkID8gcHJvcHMuZGVzdHJveSA/IFJlbW92YWxQb2xpY3kuREVTVFJPWSA6IFJlbW92YWxQb2xpY3kuUkVUQUlOIDogdW5kZWZpbmVkLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHByb3BzLmRlc3Ryb3kgPT09IHRydWUgPyB0cnVlIDogdW5kZWZpbmVkXG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5idWNrZXQsIHByb3BzLnRhZ3MpO1xuICB9XG59Il19
@@ -0,0 +1,21 @@
1
+ import { Construct } from 'constructs';
2
+ import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
3
+ import type { IResourceProps } from '../lib/types.js';
4
+ export type WebAclManagedRule = 'AWSManagedRulesAmazonIpReputationList' | 'AWSManagedRulesAnonymousIpList' | 'AWSManagedRulesCommonRuleSet' | 'AWSManagedRulesKnownBadInputsRuleSet' | 'AWSManagedRulesSQLiRuleSet';
5
+ export interface CloudFrontWebAclProps extends IResourceProps {
6
+ name: string;
7
+ managedRules?: (WebAclManagedRule & string)[];
8
+ }
9
+ export declare class CloudFrontWebAcl extends Construct {
10
+ readonly acl: CfnWebACL;
11
+ constructor(scope: Construct, id: string, props: CloudFrontWebAclProps);
12
+ }
13
+ export interface ApiGatewayWebAclProps extends IResourceProps {
14
+ name: string;
15
+ aclScope?: 'CLOUDFRONT' | 'REGIONAL';
16
+ managedRules?: (WebAclManagedRule & string)[];
17
+ }
18
+ export declare class ApiGatewayWebAcl extends Construct {
19
+ readonly acl: CfnWebACL;
20
+ constructor(scope: Construct, id: string, props: ApiGatewayWebAclProps);
21
+ }
@@ -0,0 +1,86 @@
1
+ import { RemovalPolicy } from "aws-cdk-lib";
2
+ import { Construct } from 'constructs';
3
+ import { CfnWebACL } from 'aws-cdk-lib/aws-wafv2';
4
+ import { cleanResourceName, tagResource } from '../lib/utils.js';
5
+ export class CloudFrontWebAcl extends Construct {
6
+ acl;
7
+ constructor(scope, id, props) {
8
+ super(scope, id);
9
+ props.name = cleanResourceName(props.name);
10
+ if (!props.managedRules) {
11
+ props.managedRules = [
12
+ 'AWSManagedRulesAmazonIpReputationList',
13
+ 'AWSManagedRulesAnonymousIpList',
14
+ 'AWSManagedRulesCommonRuleSet',
15
+ 'AWSManagedRulesKnownBadInputsRuleSet'
16
+ ];
17
+ }
18
+ this.acl = new CfnWebACL(this, 'CloudFrontWebAcl', {
19
+ scope: 'CLOUDFRONT',
20
+ name: props.name,
21
+ defaultAction: { allow: {} },
22
+ visibilityConfig: {
23
+ cloudWatchMetricsEnabled: true,
24
+ sampledRequestsEnabled: true,
25
+ metricName: `${props.name}-metrics`
26
+ },
27
+ rules: transformManagedRules(props.managedRules)
28
+ });
29
+ tagResource(this.acl, props.tags);
30
+ if (typeof props.destroy == 'boolean') {
31
+ this.acl.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
32
+ }
33
+ }
34
+ }
35
+ export class ApiGatewayWebAcl extends Construct {
36
+ acl;
37
+ constructor(scope, id, props) {
38
+ super(scope, id);
39
+ props.name = cleanResourceName(props.name);
40
+ if (!props.managedRules) {
41
+ props.managedRules = [
42
+ 'AWSManagedRulesAmazonIpReputationList',
43
+ 'AWSManagedRulesAnonymousIpList',
44
+ 'AWSManagedRulesCommonRuleSet',
45
+ 'AWSManagedRulesKnownBadInputsRuleSet',
46
+ 'AWSManagedRulesSQLiRuleSet'
47
+ ];
48
+ }
49
+ this.acl = new CfnWebACL(this, 'ApiGatewayWebAcl', {
50
+ scope: props.aclScope ?? 'REGIONAL',
51
+ name: props.name,
52
+ defaultAction: { allow: {} },
53
+ visibilityConfig: {
54
+ cloudWatchMetricsEnabled: true,
55
+ sampledRequestsEnabled: true,
56
+ metricName: `${props.name}-metrics`
57
+ },
58
+ rules: transformManagedRules(props.managedRules)
59
+ });
60
+ tagResource(this.acl, props.tags);
61
+ if (typeof props.destroy == 'boolean') {
62
+ this.acl.applyRemovalPolicy(props.destroy ? RemovalPolicy.DESTROY : RemovalPolicy.RETAIN);
63
+ }
64
+ }
65
+ }
66
+ function transformManagedRules(rules) {
67
+ return rules.map((ruleName, i) => {
68
+ return {
69
+ name: `AWS-${ruleName}`,
70
+ priority: i,
71
+ statement: {
72
+ managedRuleGroupStatement: {
73
+ name: ruleName,
74
+ vendorName: 'AWS'
75
+ }
76
+ },
77
+ overrideAction: { none: {} },
78
+ visibilityConfig: {
79
+ cloudWatchMetricsEnabled: true,
80
+ sampledRequestsEnabled: true,
81
+ metricName: `AWS-${ruleName}`
82
+ }
83
+ };
84
+ });
85
+ }
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvd2FmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBY2pFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBQzdCLEdBQUcsQ0FBWTtJQUUvQixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTRCO1FBQ3BFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsS0FBSyxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsWUFBWSxHQUFHO2dCQUNuQix1Q0FBdUM7Z0JBQ3ZDLGdDQUFnQztnQkFDaEMsOEJBQThCO2dCQUM5QixzQ0FBc0M7YUFDdkMsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNqRCxLQUFLLEVBQUUsWUFBWTtZQUNuQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUM1QixnQkFBZ0IsRUFBRTtnQkFDaEIsd0JBQXdCLEVBQUUsSUFBSTtnQkFDOUIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksVUFBVTthQUNwQztZQUNELEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1NBQ2pELENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBT0QsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFDN0IsR0FBRyxDQUFZO0lBQy9CLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixLQUFLLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUc7Z0JBQ25CLHVDQUF1QztnQkFDdkMsZ0NBQWdDO2dCQUNoQyw4QkFBOEI7Z0JBQzlCLHNDQUFzQztnQkFDdEMsNEJBQTRCO2FBQzdCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDakQsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksVUFBVTtZQUNuQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUM1QixnQkFBZ0IsRUFBRTtnQkFDaEIsd0JBQXdCLEVBQUUsSUFBSTtnQkFDOUIsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksVUFBVTthQUNwQztZQUNELEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1NBQ2pELENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBR0QsU0FBUyxxQkFBcUIsQ0FBQyxLQUFxQztJQUNsRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDL0IsT0FBTztZQUNMLElBQUksRUFBRSxPQUFPLFFBQVEsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRTtnQkFDVCx5QkFBeUIsRUFBRTtvQkFDekIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsVUFBVSxFQUFFLEtBQUs7aUJBQ2xCO2FBQ0Y7WUFDRCxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQzVCLGdCQUFnQixFQUFFO2dCQUNoQix3QkFBd0IsRUFBRSxJQUFJO2dCQUM5QixzQkFBc0IsRUFBRSxJQUFJO2dCQUM1QixVQUFVLEVBQUUsT0FBTyxRQUFRLEVBQUU7YUFDOUI7U0FDd0IsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IENmbldlYkFDTCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy13YWZ2Mic7XG5pbXBvcnQgeyBjbGVhblJlc291cmNlTmFtZSwgdGFnUmVzb3VyY2UgfSBmcm9tICcuLi9saWIvdXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4uL2xpYi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFdlYkFjbE1hbmFnZWRSdWxlID0gXG4gICdBV1NNYW5hZ2VkUnVsZXNBbWF6b25JcFJlcHV0YXRpb25MaXN0JyB8XG4gICdBV1NNYW5hZ2VkUnVsZXNBbm9ueW1vdXNJcExpc3QnIHxcbiAgJ0FXU01hbmFnZWRSdWxlc0NvbW1vblJ1bGVTZXQnIHxcbiAgJ0FXU01hbmFnZWRSdWxlc0tub3duQmFkSW5wdXRzUnVsZVNldCcgfFxuICAnQVdTTWFuYWdlZFJ1bGVzU1FMaVJ1bGVTZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRnJvbnRXZWJBY2xQcm9wcyBleHRlbmRzIElSZXNvdXJjZVByb3BzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBtYW5hZ2VkUnVsZXM/OiAoV2ViQWNsTWFuYWdlZFJ1bGUgJiBzdHJpbmcpW107XG59XG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udFdlYkFjbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhY2w6IENmbldlYkFDTDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udFdlYkFjbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHByb3BzLm5hbWUgPSBjbGVhblJlc291cmNlTmFtZShwcm9wcy5uYW1lKTtcblxuICAgIGlmICghcHJvcHMubWFuYWdlZFJ1bGVzKSB7XG4gICAgICBwcm9wcy5tYW5hZ2VkUnVsZXMgPSBbXG4gICAgICAgICdBV1NNYW5hZ2VkUnVsZXNBbWF6b25JcFJlcHV0YXRpb25MaXN0JyxcbiAgICAgICAgJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICdBV1NNYW5hZ2VkUnVsZXNDb21tb25SdWxlU2V0JyxcbiAgICAgICAgJ0FXU01hbmFnZWRSdWxlc0tub3duQmFkSW5wdXRzUnVsZVNldCdcbiAgICAgIF07XG4gICAgfVxuXG4gICAgdGhpcy5hY2wgPSBuZXcgQ2ZuV2ViQUNMKHRoaXMsICdDbG91ZEZyb250V2ViQWNsJywge1xuICAgICAgc2NvcGU6ICdDTE9VREZST05UJyxcbiAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICBkZWZhdWx0QWN0aW9uOiB7IGFsbG93OiB7fSB9LFxuICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIG1ldHJpY05hbWU6IGAke3Byb3BzLm5hbWV9LW1ldHJpY3NgXG4gICAgICB9LFxuICAgICAgcnVsZXM6IHRyYW5zZm9ybU1hbmFnZWRSdWxlcyhwcm9wcy5tYW5hZ2VkUnVsZXMpXG4gICAgfSk7XG4gICAgdGFnUmVzb3VyY2UodGhpcy5hY2wsIHByb3BzLnRhZ3MpO1xuICAgIGlmICh0eXBlb2YgcHJvcHMuZGVzdHJveSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuYWNsLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcy5kZXN0cm95ID8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZIDogUmVtb3ZhbFBvbGljeS5SRVRBSU4pO1xuICAgIH0gXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlHYXRld2F5V2ViQWNsUHJvcHMgZXh0ZW5kcyBJUmVzb3VyY2VQcm9wcyB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWNsU2NvcGU/OiAnQ0xPVURGUk9OVCcgfCAnUkVHSU9OQUwnO1xuICBtYW5hZ2VkUnVsZXM/OiAoV2ViQWNsTWFuYWdlZFJ1bGUgJiBzdHJpbmcpW107XG59XG5leHBvcnQgY2xhc3MgQXBpR2F0ZXdheVdlYkFjbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhY2w6IENmbldlYkFDTDtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFwaUdhdGV3YXlXZWJBY2xQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBwcm9wcy5uYW1lID0gY2xlYW5SZXNvdXJjZU5hbWUocHJvcHMubmFtZSk7XG5cbiAgICBpZiAoIXByb3BzLm1hbmFnZWRSdWxlcykge1xuICAgICAgcHJvcHMubWFuYWdlZFJ1bGVzID0gW1xuICAgICAgICAnQVdTTWFuYWdlZFJ1bGVzQW1hem9uSXBSZXB1dGF0aW9uTGlzdCcsXG4gICAgICAgICdBV1NNYW5hZ2VkUnVsZXNBbm9ueW1vdXNJcExpc3QnLFxuICAgICAgICAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCcsXG4gICAgICAgICdBV1NNYW5hZ2VkUnVsZXNLbm93bkJhZElucHV0c1J1bGVTZXQnLFxuICAgICAgICAnQVdTTWFuYWdlZFJ1bGVzU1FMaVJ1bGVTZXQnXG4gICAgICBdO1xuICAgIH1cblxuICAgIHRoaXMuYWNsID0gbmV3IENmbldlYkFDTCh0aGlzLCAnQXBpR2F0ZXdheVdlYkFjbCcsIHtcbiAgICAgIHNjb3BlOiBwcm9wcy5hY2xTY29wZSA/PyAnUkVHSU9OQUwnLFxuICAgICAgbmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGRlZmF1bHRBY3Rpb246IHsgYWxsb3c6IHt9IH0sXG4gICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbWV0cmljTmFtZTogYCR7cHJvcHMubmFtZX0tbWV0cmljc2BcbiAgICAgIH0sXG4gICAgICBydWxlczogdHJhbnNmb3JtTWFuYWdlZFJ1bGVzKHByb3BzLm1hbmFnZWRSdWxlcylcbiAgICB9KTtcbiAgICB0YWdSZXNvdXJjZSh0aGlzLmFjbCwgcHJvcHMudGFncyk7XG4gICAgaWYgKHR5cGVvZiBwcm9wcy5kZXN0cm95ID09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5hY2wuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLmRlc3Ryb3kgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTik7XG4gICAgfSBcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU1hbmFnZWRSdWxlcyhydWxlczogKFdlYkFjbE1hbmFnZWRSdWxlIHwgc3RyaW5nKVtdKTogQ2ZuV2ViQUNMLlJ1bGVQcm9wZXJ0eVtdIHtcbiAgcmV0dXJuIHJ1bGVzLm1hcCgocnVsZU5hbWUsIGkpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogYEFXUy0ke3J1bGVOYW1lfWAsXG4gICAgICBwcmlvcml0eTogaSxcbiAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgbmFtZTogcnVsZU5hbWUsXG4gICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUydcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG92ZXJyaWRlQWN0aW9uOiB7IG5vbmU6IHt9IH0sXG4gICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7IFxuICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIG1ldHJpY05hbWU6IGBBV1MtJHtydWxlTmFtZX1gXG4gICAgICB9XG4gICAgfSBhcyBDZm5XZWJBQ0wuUnVsZVByb3BlcnR5O1xuICB9KTtcbn0iXX0=
@@ -0,0 +1,5 @@
1
+ import { IConstruct } from 'constructs';
2
+ export declare function domainAsId(domain: string): string;
3
+ export declare function cleanResourceName(name: string): string;
4
+ export declare function tagResource(resource: IConstruct, tags?: Record<string, string>): void;
5
+ export declare function mergeTags(...tags: (Record<string, string> | null | undefined)[]): Record<string, string>;