cdk-simplewebsite-deploy 2.0.98 → 2.1.0

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/.jsii CHANGED
@@ -3925,7 +3925,7 @@
3925
3925
  "stability": "stable"
3926
3926
  },
3927
3927
  "homepage": "https://github.com/SnapPetal/cdk-simplewebsite-deploy",
3928
- "jsiiVersion": "5.6.19 (build 73f2485)",
3928
+ "jsiiVersion": "5.8.18 (build f5c30fc)",
3929
3929
  "keywords": [
3930
3930
  "cdk"
3931
3931
  ],
@@ -3940,7 +3940,7 @@
3940
3940
  },
3941
3941
  "name": "cdk-simplewebsite-deploy",
3942
3942
  "readme": {
3943
- "markdown": "[![License](https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg)](https://opensource.org/licenses/Apache-2.0)\n![Build](https://github.com/SnapPetal/cdk-simplewebsite-deploy/workflows/build/badge.svg)\n![Release](https://github.com/SnapPetal/cdk-simplewebsite-deploy/workflows/release/badge.svg?branch=main)\n\n# cdk-simplewebsite-deploy\nThis is an AWS CDK Construct to simplify deploying a single-page website using either S3 buckets or CloudFront distributions.\n\n## Installation and Usage\n\n### [CreateBasicSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createbasicsite)\n#### Creates a simple website using S3 buckets with a domain hosted in Route 53.\n##### Typescript\n```console\nnpm install cdk-simplewebsite-deploy\n```\n```typescript\nimport * as cdk from '@aws-cdk/core';\nimport { CreateBasicSite } from 'cdk-simplewebsite-deploy';\n\nexport class PipelineStack extends cdk.Stack {\n constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {\n super(scope, id, props);\n\n new CreateBasicSite(stack, 'test-website', {\n websiteFolder: './src/build',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n });\n }\n}\n```\n##### C#\n```console\ndotnet add package ThonBecker.CDK.SimpleWebsiteDeploy\n```\n```cs\nusing Amazon.CDK;\nusing ThonBecker.CDK.SimpleWebsiteDeploy;\n\nnamespace SimpleWebsiteDeploy\n{\n public class PipelineStack : Stack\n {\n internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)\n {\n new CreateBasicSite(scope, \"test-website\", new BasicSiteConfiguration()\n {\n WebsiteFolder = \"./src/build\",\n IndexDoc = \"index.html\",\n HostedZone = \"example.com\",\n });\n }\n }\n}\n```\n##### Java\n```xml\n<dependency>\n\t<groupId>com.thonbecker.simplewebsitedeploy</groupId>\n\t<artifactId>cdk-simplewebsite-deploy</artifactId>\n\t<version>0.4.2</version>\n</dependency>\n```\n```java\npackage com.myorg;\n\nimport software.amazon.awscdk.core.Construct;\nimport software.amazon.awscdk.core.Stack;\nimport software.amazon.awscdk.core.StackProps;\nimport com.thonbecker.simplewebsitedeploy.CreateBasicSite;\n\npublic class MyProjectStack extends Stack {\n public MyProjectStack(final Construct scope, final String id) {\n this(scope, id, null);\n }\n\n public MyProjectStack(final Construct scope, final String id, final StackProps props) {\n super(scope, id, props);\n\n CreateBasicSite.Builder.create(this, \"test-website\")\n \t\t.websiteFolder(\"./src/build\")\n \t\t.indexDoc(\"index.html\")\n \t\t.hostedZone(\"example.com\");\n }\n}\n```\n##### Python\n```console\npip install cdk-simplewebsite-deploy\n```\n```python\nfrom aws_cdk import Stack\nfrom cdk_simplewebsite_deploy import CreateBasicSite\nfrom constructs import Construct\n\nclass MyProjectStack(Stack):\n\n def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n CreateBasicSite(self, 'test-website', website_folder='./src/build',\n index_doc='index.html',\n hosted_zone='example.com')\n```\n### [CreateCloudfrontSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createcloudfrontsite)\n#### Creates a simple website using a CloudFront distribution with a domain hosted in Route 53.\n##### Typescript\n```console\nnpm install cdk-simplewebsite-deploy\n```\n```typescript\nimport * as cdk from '@aws-cdk/core';\nimport { CreateCloudfrontSite } from 'cdk-simplewebsite-deploy';\n\nexport class PipelineStack extends cdk.Stack {\n constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {\n super(scope, id, props);\n\n new CreateCloudfrontSite(stack, 'test-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n subDomain: 'www.example.com',\n });\n }\n}\n```\n##### C#\n```console\ndotnet add package ThonBecker.CDK.SimpleWebsiteDeploy\n```\n```cs\nusing Amazon.CDK;\nusing ThonBecker.CDK.SimpleWebsiteDeploy;\n\nnamespace SimpleWebsiteDeploy\n{\n public class PipelineStack : Stack\n {\n internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)\n {\n new CreateCloudfrontSite(scope, \"test-website\", new CloudfrontSiteConfiguration()\n {\n WebsiteFolder = \"./src/build\",\n IndexDoc = \"index.html\",\n HostedZone = \"example.com\",\n SubDomain = \"www.example.com\",\n });\n }\n }\n}\n```\n##### Java\n```xml\n<dependency>\n\t<groupId>com.thonbecker.simplewebsitedeploy</groupId>\n\t<artifactId>cdk-simplewebsite-deploy</artifactId>\n\t<version>0.4.2</version>\n</dependency>\n```\n```java\npackage com.myorg;\n\nimport software.amazon.awscdk.core.Construct;\nimport software.amazon.awscdk.core.Stack;\nimport software.amazon.awscdk.core.StackProps;\nimport com.thonbecker.simplewebsitedeploy.CreateCloudfrontSite;\n\npublic class MyProjectStack extends Stack {\n public MyProjectStack(final Construct scope, final String id) {\n this(scope, id, null);\n }\n\n public MyProjectStack(final Construct scope, final String id, final StackProps props) {\n super(scope, id, props);\n\n CreateCloudfrontSite.Builder.create(this, \"test-website\")\n \t\t.websiteFolder(\"./src/build\")\n \t\t.indexDoc(\"index.html\")\n \t\t.hostedZone(\"example.com\")\n \t\t.subDomain(\"www.example.com\");\n }\n}\n```\n##### Python\n```console\npip install cdk-simplewebsite-deploy\n```\n```python\nfrom aws_cdk import core\nfrom cdk_simplewebsite_deploy import CreateCloudfrontSite\n\n\nclass MyProjectStack(core.Stack):\n\n def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n CreateCloudfrontSite(self, 'test-website', website_folder='./src/build',\n index_doc='index.html',\n hosted_zone='example.com',\n sub_domain='www.example.com')\n```\n\n## License\n\nDistributed under the [Apache-2.0](./LICENSE) license.\n"
3943
+ "markdown": "[![License](https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg)](https://opensource.org/licenses/Apache-2.0)\n![Build](https://github.com/SnapPetal/cdk-simplewebsite-deploy/workflows/build/badge.svg)\n![Release](https://github.com/SnapPetal/cdk-simplewebsite-deploy/workflows/release/badge.svg?branch=main)\n\n# cdk-simplewebsite-deploy\nThis is an AWS CDK Construct to simplify deploying a single-page website using either S3 buckets or CloudFront distributions with enhanced security, performance, and monitoring capabilities.\n\n## Installation and Usage\n\n### [CreateBasicSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createbasicsite)\n#### Creates a simple website using S3 buckets with a domain hosted in Route 53.\n##### Typescript\n```console\nyarn add cdk-simplewebsite-deploy\n```\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { CreateBasicSite } from 'cdk-simplewebsite-deploy';\nimport { Construct } from 'constructs';\n\nexport class PipelineStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props?: cdk.StackProps) {\n super(scope, id, props);\n\n new CreateBasicSite(this, 'test-website', {\n websiteFolder: './src/build',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n });\n }\n}\n```\n##### C#\n```console\ndotnet add package ThonBecker.CDK.SimpleWebsiteDeploy\n```\n```cs\nusing Amazon.CDK;\nusing ThonBecker.CDK.SimpleWebsiteDeploy;\n\nnamespace SimpleWebsiteDeploy\n{\n public class PipelineStack : Stack\n {\n internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)\n {\n new CreateBasicSite(scope, \"test-website\", new BasicSiteConfiguration()\n {\n WebsiteFolder = \"./src/build\",\n IndexDoc = \"index.html\",\n HostedZone = \"example.com\",\n });\n }\n }\n}\n```\n##### Java\n```xml\n<dependency>\n\t<groupId>com.thonbecker.simplewebsitedeploy</groupId>\n\t<artifactId>cdk-simplewebsite-deploy</artifactId>\n\t<version>0.4.2</version>\n</dependency>\n```\n```java\npackage com.myorg;\n\nimport software.amazon.awscdk.core.Construct;\nimport software.amazon.awscdk.core.Stack;\nimport software.amazon.awscdk.core.StackProps;\nimport com.thonbecker.simplewebsitedeploy.CreateBasicSite;\n\npublic class MyProjectStack extends Stack {\n public MyProjectStack(final Construct scope, final String id) {\n this(scope, id, null);\n }\n\n public MyProjectStack(final Construct scope, final String id, final StackProps props) {\n super(scope, id, props);\n\n CreateBasicSite.Builder.create(this, \"test-website\")\n \t\t.websiteFolder(\"./src/build\")\n \t\t.indexDoc(\"index.html\")\n \t\t.hostedZone(\"example.com\");\n }\n}\n```\n##### Python\n```console\npip install cdk-simplewebsite-deploy\n```\n```python\nfrom aws_cdk import Stack\nfrom cdk_simplewebsite_deploy import CreateBasicSite\nfrom constructs import Construct\n\nclass MyProjectStack(Stack):\n\n def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n CreateBasicSite(self, 'test-website', website_folder='./src/build',\n index_doc='index.html',\n hosted_zone='example.com')\n```\n### [CreateCloudfrontSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createcloudfrontsite)\n#### Creates a simple website using a CloudFront distribution with a domain hosted in Route 53.\n##### Typescript\n```console\nyarn add cdk-simplewebsite-deploy\n```\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport { CreateCloudfrontSite } from 'cdk-simplewebsite-deploy';\nimport { Construct } from 'constructs';\n\nexport class PipelineStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props?: cdk.StackProps) {\n super(scope, id, props);\n\n new CreateCloudfrontSite(this, 'test-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n subDomain: 'www.example.com',\n });\n }\n}\n```\n##### C#\n```console\ndotnet add package ThonBecker.CDK.SimpleWebsiteDeploy\n```\n```cs\nusing Amazon.CDK;\nusing ThonBecker.CDK.SimpleWebsiteDeploy;\n\nnamespace SimpleWebsiteDeploy\n{\n public class PipelineStack : Stack\n {\n internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)\n {\n new CreateCloudfrontSite(scope, \"test-website\", new CloudfrontSiteConfiguration()\n {\n WebsiteFolder = \"./src/build\",\n IndexDoc = \"index.html\",\n HostedZone = \"example.com\",\n SubDomain = \"www.example.com\",\n });\n }\n }\n}\n```\n##### Java\n```xml\n<dependency>\n\t<groupId>com.thonbecker.simplewebsitedeploy</groupId>\n\t<artifactId>cdk-simplewebsite-deploy</artifactId>\n\t<version>0.4.2</version>\n</dependency>\n```\n```java\npackage com.myorg;\n\nimport software.amazon.awscdk.core.Construct;\nimport software.amazon.awscdk.core.Stack;\nimport software.amazon.awscdk.core.StackProps;\nimport com.thonbecker.simplewebsitedeploy.CreateCloudfrontSite;\n\npublic class MyProjectStack extends Stack {\n public MyProjectStack(final Construct scope, final String id) {\n this(scope, id, null);\n }\n\n public MyProjectStack(final Construct scope, final String id, final StackProps props) {\n super(scope, id, props);\n\n CreateCloudfrontSite.Builder.create(this, \"test-website\")\n \t\t.websiteFolder(\"./src/build\")\n \t\t.indexDoc(\"index.html\")\n \t\t.hostedZone(\"example.com\")\n \t\t.subDomain(\"www.example.com\");\n }\n}\n```\n##### Python\n```console\npip install cdk-simplewebsite-deploy\n```\n```python\nfrom aws_cdk import core\nfrom cdk_simplewebsite_deploy import CreateCloudfrontSite\n\n\nclass MyProjectStack(core.Stack):\n\n def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:\n super().__init__(scope, construct_id, **kwargs)\n\n CreateCloudfrontSite(self, 'test-website', website_folder='./src/build',\n index_doc='index.html',\n hosted_zone='example.com',\n sub_domain='www.example.com')\n```\n\n## 🚀 Enhanced Features\n\nThe `CreateCloudfrontSite` construct now includes several optional advanced features for improved security, performance, and monitoring:\n\n### Security Headers\nEnable comprehensive security headers including HSTS, X-Frame-Options, Content-Type-Options, and XSS protection:\n\n```typescript\nnew CreateCloudfrontSite(this, 'secure-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n enableSecurityHeaders: true, // 🔒 Adds security headers\n});\n```\n\n### IPv6 Support\nEnable IPv6 connectivity with AAAA records:\n\n```typescript\nnew CreateCloudfrontSite(this, 'ipv6-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n enableIpv6: true, // 🌐 Adds AAAA records for IPv6\n});\n```\n\n### Access Logging\nEnable CloudFront access logging for analytics and monitoring:\n\n```typescript\nnew CreateCloudfrontSite(this, 'logged-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n enableLogging: true, // 📊 Enables access logging\n // logsBucket: myCustomBucket, // Optional: use existing bucket\n});\n```\n\n### WAF Integration\nIntegrate with AWS WAF for enhanced security:\n\n```typescript\nnew CreateCloudfrontSite(this, 'waf-protected-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n webAclId: 'arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/12345678-1234-1234-1234-123456789012', // 🛡️ WAF protection\n});\n```\n\n### Custom Cache Behaviors\nAdd custom cache behaviors for different content types:\n\n```typescript\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\n\nnew CreateCloudfrontSite(this, 'optimized-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n additionalBehaviors: {\n '/api/*': {\n origin: myApiOrigin,\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n },\n '/static/*': {\n cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED_FOR_UNCOMPRESSED_OBJECTS,\n },\n }, // ⚡ Custom caching strategies\n});\n```\n\n### Custom Error Responses\nDefine custom error handling:\n\n```typescript\nnew CreateCloudfrontSite(this, 'custom-errors-website', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n customErrorResponses: [\n {\n httpStatus: 404,\n responseHttpStatus: 200,\n responsePagePath: '/index.html', // SPA routing\n },\n {\n httpStatus: 403,\n responseHttpStatus: 200,\n responsePagePath: '/index.html',\n },\n ], // 🎯 Custom error handling\n});\n```\n\n### Complete Example with All Features\n```typescript\nimport * as cdk from 'aws-cdk-lib';\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\nimport { CreateCloudfrontSite } from 'cdk-simplewebsite-deploy';\nimport { Construct } from 'constructs';\n\nexport class AdvancedWebsiteStack extends cdk.Stack {\n constructor(scope: Construct, id: string, props?: cdk.StackProps) {\n super(scope, id, props);\n\n new CreateCloudfrontSite(this, 'advanced-website', {\n websiteFolder: './dist',\n indexDoc: 'index.html',\n errorDoc: 'error.html',\n hostedZone: 'example.com',\n subDomain: 'www.example.com',\n\n // Performance & Security\n priceClass: cloudfront.PriceClass.PRICE_CLASS_ALL,\n enableSecurityHeaders: true,\n enableIpv6: true,\n\n // Monitoring & Protection\n enableLogging: true,\n webAclId: 'arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/12345678-1234-1234-1234-123456789012',\n\n // Custom Behaviors\n additionalBehaviors: {\n '/api/*': {\n allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,\n cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,\n },\n },\n\n // SPA Error Handling\n customErrorResponses: [\n {\n httpStatus: 404,\n responseHttpStatus: 200,\n responsePagePath: '/index.html',\n },\n ],\n });\n }\n}\n```\n\n## 🎯 Key Benefits\n\n### 🔒 **Enhanced Security**\n- **Security Headers**: Automatic HSTS, X-Frame-Options, Content-Type-Options, and XSS protection\n- **WAF Integration**: Support for AWS WAF Web ACLs for advanced threat protection\n- **Origin Access Control**: Modern S3 bucket protection (replaces deprecated OAI)\n\n### ⚡ **Optimized Performance**\n- **Smart Caching**: Optimized cache policies for better performance\n- **HTTP/2 & HTTP/3**: Latest protocol support for faster loading\n- **Global Edge Locations**: Configurable price classes for worldwide distribution\n- **IPv6 Support**: Dual-stack networking for better connectivity\n\n### 📊 **Comprehensive Monitoring**\n- **Access Logging**: CloudFront access logs for analytics\n- **Custom Error Handling**: Flexible error response configuration\n- **SPA Support**: Built-in single-page application routing support\n\n### 🚀 **Developer Experience**\n- **Backward Compatible**: All existing configurations continue to work\n- **Type Safe**: Full TypeScript support with comprehensive interfaces\n- **CDK v2 Ready**: Built for the latest AWS CDK version\n- **Multi-Language**: Support for TypeScript, Python, Java, and C#\n\n## License\n\nDistributed under the [Apache-2.0](./LICENSE) license.\n"
3944
3944
  },
3945
3945
  "repository": {
3946
3946
  "type": "git",
@@ -3978,7 +3978,7 @@
3978
3978
  "kind": "interface",
3979
3979
  "locationInModule": {
3980
3980
  "filename": "src/cdk-simplewebsite-deploy.ts",
3981
- "line": 34
3981
+ "line": 11
3982
3982
  },
3983
3983
  "name": "BasicSiteConfiguration",
3984
3984
  "properties": [
@@ -3991,7 +3991,7 @@
3991
3991
  "immutable": true,
3992
3992
  "locationInModule": {
3993
3993
  "filename": "src/cdk-simplewebsite-deploy.ts",
3994
- "line": 51
3994
+ "line": 28
3995
3995
  },
3996
3996
  "name": "hostedZone",
3997
3997
  "type": {
@@ -4007,7 +4007,7 @@
4007
4007
  "immutable": true,
4008
4008
  "locationInModule": {
4009
4009
  "filename": "src/cdk-simplewebsite-deploy.ts",
4010
- "line": 42
4010
+ "line": 19
4011
4011
  },
4012
4012
  "name": "indexDoc",
4013
4013
  "type": {
@@ -4023,7 +4023,7 @@
4023
4023
  "immutable": true,
4024
4024
  "locationInModule": {
4025
4025
  "filename": "src/cdk-simplewebsite-deploy.ts",
4026
- "line": 38
4026
+ "line": 15
4027
4027
  },
4028
4028
  "name": "websiteFolder",
4029
4029
  "type": {
@@ -4040,7 +4040,7 @@
4040
4040
  "immutable": true,
4041
4041
  "locationInModule": {
4042
4042
  "filename": "src/cdk-simplewebsite-deploy.ts",
4043
- "line": 47
4043
+ "line": 24
4044
4044
  },
4045
4045
  "name": "errorDoc",
4046
4046
  "optional": true,
@@ -4061,7 +4061,7 @@
4061
4061
  "kind": "interface",
4062
4062
  "locationInModule": {
4063
4063
  "filename": "src/cdk-simplewebsite-deploy.ts",
4064
- "line": 54
4064
+ "line": 31
4065
4065
  },
4066
4066
  "name": "CloudfrontSiteConfiguration",
4067
4067
  "properties": [
@@ -4074,7 +4074,7 @@
4074
4074
  "immutable": true,
4075
4075
  "locationInModule": {
4076
4076
  "filename": "src/cdk-simplewebsite-deploy.ts",
4077
- "line": 71
4077
+ "line": 48
4078
4078
  },
4079
4079
  "name": "hostedZone",
4080
4080
  "type": {
@@ -4090,7 +4090,7 @@
4090
4090
  "immutable": true,
4091
4091
  "locationInModule": {
4092
4092
  "filename": "src/cdk-simplewebsite-deploy.ts",
4093
- "line": 62
4093
+ "line": 39
4094
4094
  },
4095
4095
  "name": "indexDoc",
4096
4096
  "type": {
@@ -4106,13 +4106,59 @@
4106
4106
  "immutable": true,
4107
4107
  "locationInModule": {
4108
4108
  "filename": "src/cdk-simplewebsite-deploy.ts",
4109
- "line": 58
4109
+ "line": 35
4110
4110
  },
4111
4111
  "name": "websiteFolder",
4112
4112
  "type": {
4113
4113
  "primitive": "string"
4114
4114
  }
4115
4115
  },
4116
+ {
4117
+ "abstract": true,
4118
+ "docs": {
4119
+ "default": "- No additional cache behaviors.",
4120
+ "stability": "stable",
4121
+ "summary": "Optional cache behaviors for different path patterns."
4122
+ },
4123
+ "immutable": true,
4124
+ "locationInModule": {
4125
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4126
+ "line": 75
4127
+ },
4128
+ "name": "additionalBehaviors",
4129
+ "optional": true,
4130
+ "type": {
4131
+ "collection": {
4132
+ "elementtype": {
4133
+ "fqn": "aws-cdk-lib.aws_cloudfront.BehaviorOptions"
4134
+ },
4135
+ "kind": "map"
4136
+ }
4137
+ }
4138
+ },
4139
+ {
4140
+ "abstract": true,
4141
+ "docs": {
4142
+ "default": "- Default error responses based on errorDoc setting.",
4143
+ "stability": "stable",
4144
+ "summary": "Custom error responses for different HTTP status codes."
4145
+ },
4146
+ "immutable": true,
4147
+ "locationInModule": {
4148
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4149
+ "line": 90
4150
+ },
4151
+ "name": "customErrorResponses",
4152
+ "optional": true,
4153
+ "type": {
4154
+ "collection": {
4155
+ "elementtype": {
4156
+ "fqn": "aws-cdk-lib.aws_cloudfront.ErrorResponse"
4157
+ },
4158
+ "kind": "array"
4159
+ }
4160
+ }
4161
+ },
4116
4162
  {
4117
4163
  "abstract": true,
4118
4164
  "docs": {
@@ -4124,7 +4170,7 @@
4124
4170
  "immutable": true,
4125
4171
  "locationInModule": {
4126
4172
  "filename": "src/cdk-simplewebsite-deploy.ts",
4127
- "line": 79
4173
+ "line": 56
4128
4174
  },
4129
4175
  "name": "domain",
4130
4176
  "optional": true,
@@ -4132,6 +4178,60 @@
4132
4178
  "primitive": "string"
4133
4179
  }
4134
4180
  },
4181
+ {
4182
+ "abstract": true,
4183
+ "docs": {
4184
+ "default": "false - No IPv6 support.",
4185
+ "stability": "stable",
4186
+ "summary": "Enable IPv6 support with AAAA records."
4187
+ },
4188
+ "immutable": true,
4189
+ "locationInModule": {
4190
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4191
+ "line": 85
4192
+ },
4193
+ "name": "enableIpv6",
4194
+ "optional": true,
4195
+ "type": {
4196
+ "primitive": "boolean"
4197
+ }
4198
+ },
4199
+ {
4200
+ "abstract": true,
4201
+ "docs": {
4202
+ "default": "false - No access logging.",
4203
+ "stability": "stable",
4204
+ "summary": "Enable CloudFront access logging."
4205
+ },
4206
+ "immutable": true,
4207
+ "locationInModule": {
4208
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4209
+ "line": 95
4210
+ },
4211
+ "name": "enableLogging",
4212
+ "optional": true,
4213
+ "type": {
4214
+ "primitive": "boolean"
4215
+ }
4216
+ },
4217
+ {
4218
+ "abstract": true,
4219
+ "docs": {
4220
+ "default": "false - No security headers policy applied.",
4221
+ "stability": "stable",
4222
+ "summary": "Enable response headers policy for security headers."
4223
+ },
4224
+ "immutable": true,
4225
+ "locationInModule": {
4226
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4227
+ "line": 80
4228
+ },
4229
+ "name": "enableSecurityHeaders",
4230
+ "optional": true,
4231
+ "type": {
4232
+ "primitive": "boolean"
4233
+ }
4234
+ },
4135
4235
  {
4136
4236
  "abstract": true,
4137
4237
  "docs": {
@@ -4142,7 +4242,7 @@
4142
4242
  "immutable": true,
4143
4243
  "locationInModule": {
4144
4244
  "filename": "src/cdk-simplewebsite-deploy.ts",
4145
- "line": 67
4245
+ "line": 44
4146
4246
  },
4147
4247
  "name": "errorDoc",
4148
4248
  "optional": true,
@@ -4150,6 +4250,25 @@
4150
4250
  "primitive": "string"
4151
4251
  }
4152
4252
  },
4253
+ {
4254
+ "abstract": true,
4255
+ "docs": {
4256
+ "default": "- New bucket created if logging is enabled.",
4257
+ "remarks": "If not provided and logging is enabled, a new bucket will be created.",
4258
+ "stability": "stable",
4259
+ "summary": "S3 bucket for CloudFront access logs."
4260
+ },
4261
+ "immutable": true,
4262
+ "locationInModule": {
4263
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4264
+ "line": 100
4265
+ },
4266
+ "name": "logsBucket",
4267
+ "optional": true,
4268
+ "type": {
4269
+ "fqn": "aws-cdk-lib.aws_s3.IBucket"
4270
+ }
4271
+ },
4153
4272
  {
4154
4273
  "abstract": true,
4155
4274
  "docs": {
@@ -4161,12 +4280,12 @@
4161
4280
  "immutable": true,
4162
4281
  "locationInModule": {
4163
4282
  "filename": "src/cdk-simplewebsite-deploy.ts",
4164
- "line": 93
4283
+ "line": 70
4165
4284
  },
4166
4285
  "name": "priceClass",
4167
4286
  "optional": true,
4168
4287
  "type": {
4169
- "fqn": "cdk-simplewebsite-deploy.PriceClass"
4288
+ "fqn": "aws-cdk-lib.aws_cloudfront.PriceClass"
4170
4289
  }
4171
4290
  },
4172
4291
  {
@@ -4180,13 +4299,31 @@
4180
4299
  "immutable": true,
4181
4300
  "locationInModule": {
4182
4301
  "filename": "src/cdk-simplewebsite-deploy.ts",
4183
- "line": 87
4302
+ "line": 64
4184
4303
  },
4185
4304
  "name": "subDomain",
4186
4305
  "optional": true,
4187
4306
  "type": {
4188
4307
  "primitive": "string"
4189
4308
  }
4309
+ },
4310
+ {
4311
+ "abstract": true,
4312
+ "docs": {
4313
+ "default": "- No WAF integration.",
4314
+ "stability": "stable",
4315
+ "summary": "Optional WAF Web ACL ARN for enhanced security."
4316
+ },
4317
+ "immutable": true,
4318
+ "locationInModule": {
4319
+ "filename": "src/cdk-simplewebsite-deploy.ts",
4320
+ "line": 105
4321
+ },
4322
+ "name": "webAclId",
4323
+ "optional": true,
4324
+ "type": {
4325
+ "primitive": "string"
4326
+ }
4190
4327
  }
4191
4328
  ],
4192
4329
  "symbolId": "src/cdk-simplewebsite-deploy:CloudfrontSiteConfiguration"
@@ -4204,7 +4341,7 @@
4204
4341
  },
4205
4342
  "locationInModule": {
4206
4343
  "filename": "src/cdk-simplewebsite-deploy.ts",
4207
- "line": 97
4344
+ "line": 109
4208
4345
  },
4209
4346
  "parameters": [
4210
4347
  {
@@ -4230,7 +4367,7 @@
4230
4367
  "kind": "class",
4231
4368
  "locationInModule": {
4232
4369
  "filename": "src/cdk-simplewebsite-deploy.ts",
4233
- "line": 96
4370
+ "line": 108
4234
4371
  },
4235
4372
  "name": "CreateBasicSite",
4236
4373
  "symbolId": "src/cdk-simplewebsite-deploy:CreateBasicSite"
@@ -4248,7 +4385,7 @@
4248
4385
  },
4249
4386
  "locationInModule": {
4250
4387
  "filename": "src/cdk-simplewebsite-deploy.ts",
4251
- "line": 162
4388
+ "line": 174
4252
4389
  },
4253
4390
  "parameters": [
4254
4391
  {
@@ -4274,49 +4411,12 @@
4274
4411
  "kind": "class",
4275
4412
  "locationInModule": {
4276
4413
  "filename": "src/cdk-simplewebsite-deploy.ts",
4277
- "line": 161
4414
+ "line": 173
4278
4415
  },
4279
4416
  "name": "CreateCloudfrontSite",
4280
4417
  "symbolId": "src/cdk-simplewebsite-deploy:CreateCloudfrontSite"
4281
- },
4282
- "cdk-simplewebsite-deploy.PriceClass": {
4283
- "assembly": "cdk-simplewebsite-deploy",
4284
- "docs": {
4285
- "stability": "stable"
4286
- },
4287
- "fqn": "cdk-simplewebsite-deploy.PriceClass",
4288
- "kind": "enum",
4289
- "locationInModule": {
4290
- "filename": "src/cdk-simplewebsite-deploy.ts",
4291
- "line": 13
4292
- },
4293
- "members": [
4294
- {
4295
- "docs": {
4296
- "stability": "stable",
4297
- "summary": "USA, Canada, Europe, & Israel."
4298
- },
4299
- "name": "PRICE_CLASS_100"
4300
- },
4301
- {
4302
- "docs": {
4303
- "stability": "stable",
4304
- "summary": "PRICE_CLASS_100 + South Africa, Kenya, Middle East, Japan, Singapore, South Korea, Taiwan, Hong Kong, & Philippines."
4305
- },
4306
- "name": "PRICE_CLASS_200"
4307
- },
4308
- {
4309
- "docs": {
4310
- "stability": "stable",
4311
- "summary": "All locations."
4312
- },
4313
- "name": "PRICE_CLASS_ALL"
4314
- }
4315
- ],
4316
- "name": "PriceClass",
4317
- "symbolId": "src/cdk-simplewebsite-deploy:PriceClass"
4318
4418
  }
4319
4419
  },
4320
- "version": "2.0.98",
4321
- "fingerprint": "YWZHf0sDn3b8+tXhRhBQBTS6d/J7YeAjnVeQ5AmPw0M="
4420
+ "version": "2.1.0",
4421
+ "fingerprint": "X8YFDSr3LphBuNynBi0VoZMy3MKor9DzbIVlqs7i2vc="
4322
4422
  }
package/API.md CHANGED
@@ -289,10 +289,17 @@ const cloudfrontSiteConfiguration: CloudfrontSiteConfiguration = { ... }
289
289
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.hostedZone">hostedZone</a></code> | <code>string</code> | Hosted Zone used to create the DNS record for the website. |
290
290
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.indexDoc">indexDoc</a></code> | <code>string</code> | The index document of the website. |
291
291
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.websiteFolder">websiteFolder</a></code> | <code>string</code> | Local path to the website folder you want to deploy on S3. |
292
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.additionalBehaviors">additionalBehaviors</a></code> | <code>{[ key: string ]: aws-cdk-lib.aws_cloudfront.BehaviorOptions}</code> | Optional cache behaviors for different path patterns. |
293
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.customErrorResponses">customErrorResponses</a></code> | <code>aws-cdk-lib.aws_cloudfront.ErrorResponse[]</code> | Custom error responses for different HTTP status codes. |
292
294
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.domain">domain</a></code> | <code>string</code> | Used to deploy a Cloudfront site with a single domain. |
295
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableIpv6">enableIpv6</a></code> | <code>boolean</code> | Enable IPv6 support with AAAA records. |
296
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableLogging">enableLogging</a></code> | <code>boolean</code> | Enable CloudFront access logging. |
297
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableSecurityHeaders">enableSecurityHeaders</a></code> | <code>boolean</code> | Enable response headers policy for security headers. |
293
298
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.errorDoc">errorDoc</a></code> | <code>string</code> | The error document of the website. |
294
- | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.priceClass">priceClass</a></code> | <code><a href="#cdk-simplewebsite-deploy.PriceClass">PriceClass</a></code> | The price class determines how many edge locations CloudFront will use for your distribution. |
299
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.logsBucket">logsBucket</a></code> | <code>aws-cdk-lib.aws_s3.IBucket</code> | S3 bucket for CloudFront access logs. |
300
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.priceClass">priceClass</a></code> | <code>aws-cdk-lib.aws_cloudfront.PriceClass</code> | The price class determines how many edge locations CloudFront will use for your distribution. |
295
301
  | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.subDomain">subDomain</a></code> | <code>string</code> | The subdomain name you want to deploy. |
302
+ | <code><a href="#cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.webAclId">webAclId</a></code> | <code>string</code> | Optional WAF Web ACL ARN for enhanced security. |
296
303
 
297
304
  ---
298
305
 
@@ -332,6 +339,32 @@ Local path to the website folder you want to deploy on S3.
332
339
 
333
340
  ---
334
341
 
342
+ ##### `additionalBehaviors`<sup>Optional</sup> <a name="additionalBehaviors" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.additionalBehaviors"></a>
343
+
344
+ ```typescript
345
+ public readonly additionalBehaviors: {[ key: string ]: BehaviorOptions};
346
+ ```
347
+
348
+ - *Type:* {[ key: string ]: aws-cdk-lib.aws_cloudfront.BehaviorOptions}
349
+ - *Default:* No additional cache behaviors.
350
+
351
+ Optional cache behaviors for different path patterns.
352
+
353
+ ---
354
+
355
+ ##### `customErrorResponses`<sup>Optional</sup> <a name="customErrorResponses" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.customErrorResponses"></a>
356
+
357
+ ```typescript
358
+ public readonly customErrorResponses: ErrorResponse[];
359
+ ```
360
+
361
+ - *Type:* aws-cdk-lib.aws_cloudfront.ErrorResponse[]
362
+ - *Default:* Default error responses based on errorDoc setting.
363
+
364
+ Custom error responses for different HTTP status codes.
365
+
366
+ ---
367
+
335
368
  ##### `domain`<sup>Optional</sup> <a name="domain" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.domain"></a>
336
369
 
337
370
  ```typescript
@@ -349,6 +382,45 @@ an error will be thrown.
349
382
 
350
383
  ---
351
384
 
385
+ ##### `enableIpv6`<sup>Optional</sup> <a name="enableIpv6" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableIpv6"></a>
386
+
387
+ ```typescript
388
+ public readonly enableIpv6: boolean;
389
+ ```
390
+
391
+ - *Type:* boolean
392
+ - *Default:* false - No IPv6 support.
393
+
394
+ Enable IPv6 support with AAAA records.
395
+
396
+ ---
397
+
398
+ ##### `enableLogging`<sup>Optional</sup> <a name="enableLogging" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableLogging"></a>
399
+
400
+ ```typescript
401
+ public readonly enableLogging: boolean;
402
+ ```
403
+
404
+ - *Type:* boolean
405
+ - *Default:* false - No access logging.
406
+
407
+ Enable CloudFront access logging.
408
+
409
+ ---
410
+
411
+ ##### `enableSecurityHeaders`<sup>Optional</sup> <a name="enableSecurityHeaders" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.enableSecurityHeaders"></a>
412
+
413
+ ```typescript
414
+ public readonly enableSecurityHeaders: boolean;
415
+ ```
416
+
417
+ - *Type:* boolean
418
+ - *Default:* false - No security headers policy applied.
419
+
420
+ Enable response headers policy for security headers.
421
+
422
+ ---
423
+
352
424
  ##### `errorDoc`<sup>Optional</sup> <a name="errorDoc" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.errorDoc"></a>
353
425
 
354
426
  ```typescript
@@ -362,13 +434,28 @@ The error document of the website.
362
434
 
363
435
  ---
364
436
 
437
+ ##### `logsBucket`<sup>Optional</sup> <a name="logsBucket" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.logsBucket"></a>
438
+
439
+ ```typescript
440
+ public readonly logsBucket: IBucket;
441
+ ```
442
+
443
+ - *Type:* aws-cdk-lib.aws_s3.IBucket
444
+ - *Default:* New bucket created if logging is enabled.
445
+
446
+ S3 bucket for CloudFront access logs.
447
+
448
+ If not provided and logging is enabled, a new bucket will be created.
449
+
450
+ ---
451
+
365
452
  ##### `priceClass`<sup>Optional</sup> <a name="priceClass" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.priceClass"></a>
366
453
 
367
454
  ```typescript
368
455
  public readonly priceClass: PriceClass;
369
456
  ```
370
457
 
371
- - *Type:* <a href="#cdk-simplewebsite-deploy.PriceClass">PriceClass</a>
458
+ - *Type:* aws-cdk-lib.aws_cloudfront.PriceClass
372
459
  - *Default:* PriceClass.PRICE_CLASS_100.
373
460
 
374
461
  The price class determines how many edge locations CloudFront will use for your distribution.
@@ -394,39 +481,18 @@ an error will be thrown.
394
481
 
395
482
  ---
396
483
 
484
+ ##### `webAclId`<sup>Optional</sup> <a name="webAclId" id="cdk-simplewebsite-deploy.CloudfrontSiteConfiguration.property.webAclId"></a>
397
485
 
486
+ ```typescript
487
+ public readonly webAclId: string;
488
+ ```
398
489
 
399
- ## Enums <a name="Enums" id="Enums"></a>
400
-
401
- ### PriceClass <a name="PriceClass" id="cdk-simplewebsite-deploy.PriceClass"></a>
402
-
403
- #### Members <a name="Members" id="Members"></a>
404
-
405
- | **Name** | **Description** |
406
- | --- | --- |
407
- | <code><a href="#cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_100">PRICE_CLASS_100</a></code> | USA, Canada, Europe, & Israel. |
408
- | <code><a href="#cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_200">PRICE_CLASS_200</a></code> | PRICE_CLASS_100 + South Africa, Kenya, Middle East, Japan, Singapore, South Korea, Taiwan, Hong Kong, & Philippines. |
409
- | <code><a href="#cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_ALL">PRICE_CLASS_ALL</a></code> | All locations. |
410
-
411
- ---
412
-
413
- ##### `PRICE_CLASS_100` <a name="PRICE_CLASS_100" id="cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_100"></a>
414
-
415
- USA, Canada, Europe, & Israel.
416
-
417
- ---
418
-
419
-
420
- ##### `PRICE_CLASS_200` <a name="PRICE_CLASS_200" id="cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_200"></a>
490
+ - *Type:* string
491
+ - *Default:* No WAF integration.
421
492
 
422
- PRICE_CLASS_100 + South Africa, Kenya, Middle East, Japan, Singapore, South Korea, Taiwan, Hong Kong, & Philippines.
493
+ Optional WAF Web ACL ARN for enhanced security.
423
494
 
424
495
  ---
425
496
 
426
497
 
427
- ##### `PRICE_CLASS_ALL` <a name="PRICE_CLASS_ALL" id="cdk-simplewebsite-deploy.PriceClass.PRICE_CLASS_ALL"></a>
428
-
429
- All locations.
430
-
431
- ---
432
498
 
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  ![Release](https://github.com/SnapPetal/cdk-simplewebsite-deploy/workflows/release/badge.svg?branch=main)
4
4
 
5
5
  # cdk-simplewebsite-deploy
6
- This is an AWS CDK Construct to simplify deploying a single-page website using either S3 buckets or CloudFront distributions.
6
+ This is an AWS CDK Construct to simplify deploying a single-page website using either S3 buckets or CloudFront distributions with enhanced security, performance, and monitoring capabilities.
7
7
 
8
8
  ## Installation and Usage
9
9
 
@@ -11,17 +11,18 @@ This is an AWS CDK Construct to simplify deploying a single-page website using e
11
11
  #### Creates a simple website using S3 buckets with a domain hosted in Route 53.
12
12
  ##### Typescript
13
13
  ```console
14
- npm install cdk-simplewebsite-deploy
14
+ yarn add cdk-simplewebsite-deploy
15
15
  ```
16
16
  ```typescript
17
- import * as cdk from '@aws-cdk/core';
17
+ import * as cdk from 'aws-cdk-lib';
18
18
  import { CreateBasicSite } from 'cdk-simplewebsite-deploy';
19
+ import { Construct } from 'constructs';
19
20
 
20
21
  export class PipelineStack extends cdk.Stack {
21
- constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
22
+ constructor(scope: Construct, id: string, props?: cdk.StackProps) {
22
23
  super(scope, id, props);
23
24
 
24
- new CreateBasicSite(stack, 'test-website', {
25
+ new CreateBasicSite(this, 'test-website', {
25
26
  websiteFolder: './src/build',
26
27
  indexDoc: 'index.html',
27
28
  hostedZone: 'example.com',
@@ -106,17 +107,18 @@ class MyProjectStack(Stack):
106
107
  #### Creates a simple website using a CloudFront distribution with a domain hosted in Route 53.
107
108
  ##### Typescript
108
109
  ```console
109
- npm install cdk-simplewebsite-deploy
110
+ yarn add cdk-simplewebsite-deploy
110
111
  ```
111
112
  ```typescript
112
- import * as cdk from '@aws-cdk/core';
113
+ import * as cdk from 'aws-cdk-lib';
113
114
  import { CreateCloudfrontSite } from 'cdk-simplewebsite-deploy';
115
+ import { Construct } from 'constructs';
114
116
 
115
117
  export class PipelineStack extends cdk.Stack {
116
- constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
118
+ constructor(scope: Construct, id: string, props?: cdk.StackProps) {
117
119
  super(scope, id, props);
118
120
 
119
- new CreateCloudfrontSite(stack, 'test-website', {
121
+ new CreateCloudfrontSite(this, 'test-website', {
120
122
  websiteFolder: './src/dist',
121
123
  indexDoc: 'index.html',
122
124
  hostedZone: 'example.com',
@@ -202,6 +204,177 @@ class MyProjectStack(core.Stack):
202
204
  sub_domain='www.example.com')
203
205
  ```
204
206
 
207
+ ## 🚀 Enhanced Features
208
+
209
+ The `CreateCloudfrontSite` construct now includes several optional advanced features for improved security, performance, and monitoring:
210
+
211
+ ### Security Headers
212
+ Enable comprehensive security headers including HSTS, X-Frame-Options, Content-Type-Options, and XSS protection:
213
+
214
+ ```typescript
215
+ new CreateCloudfrontSite(this, 'secure-website', {
216
+ websiteFolder: './src/dist',
217
+ indexDoc: 'index.html',
218
+ hostedZone: 'example.com',
219
+ enableSecurityHeaders: true, // 🔒 Adds security headers
220
+ });
221
+ ```
222
+
223
+ ### IPv6 Support
224
+ Enable IPv6 connectivity with AAAA records:
225
+
226
+ ```typescript
227
+ new CreateCloudfrontSite(this, 'ipv6-website', {
228
+ websiteFolder: './src/dist',
229
+ indexDoc: 'index.html',
230
+ hostedZone: 'example.com',
231
+ enableIpv6: true, // 🌐 Adds AAAA records for IPv6
232
+ });
233
+ ```
234
+
235
+ ### Access Logging
236
+ Enable CloudFront access logging for analytics and monitoring:
237
+
238
+ ```typescript
239
+ new CreateCloudfrontSite(this, 'logged-website', {
240
+ websiteFolder: './src/dist',
241
+ indexDoc: 'index.html',
242
+ hostedZone: 'example.com',
243
+ enableLogging: true, // 📊 Enables access logging
244
+ // logsBucket: myCustomBucket, // Optional: use existing bucket
245
+ });
246
+ ```
247
+
248
+ ### WAF Integration
249
+ Integrate with AWS WAF for enhanced security:
250
+
251
+ ```typescript
252
+ new CreateCloudfrontSite(this, 'waf-protected-website', {
253
+ websiteFolder: './src/dist',
254
+ indexDoc: 'index.html',
255
+ hostedZone: 'example.com',
256
+ webAclId: 'arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/12345678-1234-1234-1234-123456789012', // 🛡️ WAF protection
257
+ });
258
+ ```
259
+
260
+ ### Custom Cache Behaviors
261
+ Add custom cache behaviors for different content types:
262
+
263
+ ```typescript
264
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
265
+
266
+ new CreateCloudfrontSite(this, 'optimized-website', {
267
+ websiteFolder: './src/dist',
268
+ indexDoc: 'index.html',
269
+ hostedZone: 'example.com',
270
+ additionalBehaviors: {
271
+ '/api/*': {
272
+ origin: myApiOrigin,
273
+ allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
274
+ cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
275
+ },
276
+ '/static/*': {
277
+ cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED_FOR_UNCOMPRESSED_OBJECTS,
278
+ },
279
+ }, // ⚡ Custom caching strategies
280
+ });
281
+ ```
282
+
283
+ ### Custom Error Responses
284
+ Define custom error handling:
285
+
286
+ ```typescript
287
+ new CreateCloudfrontSite(this, 'custom-errors-website', {
288
+ websiteFolder: './src/dist',
289
+ indexDoc: 'index.html',
290
+ hostedZone: 'example.com',
291
+ customErrorResponses: [
292
+ {
293
+ httpStatus: 404,
294
+ responseHttpStatus: 200,
295
+ responsePagePath: '/index.html', // SPA routing
296
+ },
297
+ {
298
+ httpStatus: 403,
299
+ responseHttpStatus: 200,
300
+ responsePagePath: '/index.html',
301
+ },
302
+ ], // 🎯 Custom error handling
303
+ });
304
+ ```
305
+
306
+ ### Complete Example with All Features
307
+ ```typescript
308
+ import * as cdk from 'aws-cdk-lib';
309
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
310
+ import { CreateCloudfrontSite } from 'cdk-simplewebsite-deploy';
311
+ import { Construct } from 'constructs';
312
+
313
+ export class AdvancedWebsiteStack extends cdk.Stack {
314
+ constructor(scope: Construct, id: string, props?: cdk.StackProps) {
315
+ super(scope, id, props);
316
+
317
+ new CreateCloudfrontSite(this, 'advanced-website', {
318
+ websiteFolder: './dist',
319
+ indexDoc: 'index.html',
320
+ errorDoc: 'error.html',
321
+ hostedZone: 'example.com',
322
+ subDomain: 'www.example.com',
323
+
324
+ // Performance & Security
325
+ priceClass: cloudfront.PriceClass.PRICE_CLASS_ALL,
326
+ enableSecurityHeaders: true,
327
+ enableIpv6: true,
328
+
329
+ // Monitoring & Protection
330
+ enableLogging: true,
331
+ webAclId: 'arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/12345678-1234-1234-1234-123456789012',
332
+
333
+ // Custom Behaviors
334
+ additionalBehaviors: {
335
+ '/api/*': {
336
+ allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
337
+ cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
338
+ },
339
+ },
340
+
341
+ // SPA Error Handling
342
+ customErrorResponses: [
343
+ {
344
+ httpStatus: 404,
345
+ responseHttpStatus: 200,
346
+ responsePagePath: '/index.html',
347
+ },
348
+ ],
349
+ });
350
+ }
351
+ }
352
+ ```
353
+
354
+ ## 🎯 Key Benefits
355
+
356
+ ### 🔒 **Enhanced Security**
357
+ - **Security Headers**: Automatic HSTS, X-Frame-Options, Content-Type-Options, and XSS protection
358
+ - **WAF Integration**: Support for AWS WAF Web ACLs for advanced threat protection
359
+ - **Origin Access Control**: Modern S3 bucket protection (replaces deprecated OAI)
360
+
361
+ ### ⚡ **Optimized Performance**
362
+ - **Smart Caching**: Optimized cache policies for better performance
363
+ - **HTTP/2 & HTTP/3**: Latest protocol support for faster loading
364
+ - **Global Edge Locations**: Configurable price classes for worldwide distribution
365
+ - **IPv6 Support**: Dual-stack networking for better connectivity
366
+
367
+ ### 📊 **Comprehensive Monitoring**
368
+ - **Access Logging**: CloudFront access logs for analytics
369
+ - **Custom Error Handling**: Flexible error response configuration
370
+ - **SPA Support**: Built-in single-page application routing support
371
+
372
+ ### 🚀 **Developer Experience**
373
+ - **Backward Compatible**: All existing configurations continue to work
374
+ - **Type Safe**: Full TypeScript support with comprehensive interfaces
375
+ - **CDK v2 Ready**: Built for the latest AWS CDK version
376
+ - **Multi-Language**: Support for TypeScript, Python, Java, and C#
377
+
205
378
  ## License
206
379
 
207
380
  Distributed under the [Apache-2.0](./LICENSE) license.
@@ -1,24 +1,6 @@
1
+ import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
2
+ import * as s3 from 'aws-cdk-lib/aws-s3';
1
3
  import { Construct } from 'constructs';
2
- export declare enum PriceClass {
3
- /**
4
- * USA, Canada, Europe, & Israel.
5
- *
6
- * @stability stable
7
- */
8
- PRICE_CLASS_100 = "PriceClass_100",
9
- /**
10
- * PRICE_CLASS_100 + South Africa, Kenya, Middle East, Japan, Singapore, South Korea, Taiwan, Hong Kong, & Philippines.
11
- *
12
- * @stability stable
13
- */
14
- PRICE_CLASS_200 = "PriceClass_200",
15
- /**
16
- * All locations.
17
- *
18
- * @stability stable
19
- */
20
- PRICE_CLASS_ALL = "PriceClass_All"
21
- }
22
4
  export interface BasicSiteConfiguration {
23
5
  /**
24
6
  * Local path to the website folder you want to deploy on S3.
@@ -77,7 +59,42 @@ export interface CloudfrontSiteConfiguration {
77
59
  * @default PriceClass.PRICE_CLASS_100.
78
60
  * @see https://aws.amazon.com/cloudfront/pricing/.
79
61
  */
80
- readonly priceClass?: PriceClass;
62
+ readonly priceClass?: cloudfront.PriceClass;
63
+ /**
64
+ * Optional cache behaviors for different path patterns.
65
+ * @default - No additional cache behaviors.
66
+ */
67
+ readonly additionalBehaviors?: Record<string, cloudfront.BehaviorOptions>;
68
+ /**
69
+ * Enable response headers policy for security headers.
70
+ * @default false - No security headers policy applied.
71
+ */
72
+ readonly enableSecurityHeaders?: boolean;
73
+ /**
74
+ * Enable IPv6 support with AAAA records.
75
+ * @default false - No IPv6 support.
76
+ */
77
+ readonly enableIpv6?: boolean;
78
+ /**
79
+ * Custom error responses for different HTTP status codes.
80
+ * @default - Default error responses based on errorDoc setting.
81
+ */
82
+ readonly customErrorResponses?: cloudfront.ErrorResponse[];
83
+ /**
84
+ * Enable CloudFront access logging.
85
+ * @default false - No access logging.
86
+ */
87
+ readonly enableLogging?: boolean;
88
+ /**
89
+ * S3 bucket for CloudFront access logs. If not provided and logging is enabled, a new bucket will be created.
90
+ * @default - New bucket created if logging is enabled.
91
+ */
92
+ readonly logsBucket?: s3.IBucket;
93
+ /**
94
+ * Optional WAF Web ACL ARN for enhanced security.
95
+ * @default - No WAF integration.
96
+ */
97
+ readonly webAclId?: string;
81
98
  }
82
99
  export declare class CreateBasicSite extends Construct {
83
100
  constructor(scope: Construct, id: string, props: BasicSiteConfiguration);
@@ -60,7 +60,7 @@ class CreateBasicSite extends constructs_1.Construct {
60
60
  }
61
61
  exports.CreateBasicSite = CreateBasicSite;
62
62
  _a = JSII_RTTI_SYMBOL_1;
63
- CreateBasicSite[_a] = { fqn: "cdk-simplewebsite-deploy.CreateBasicSite", version: "2.0.98" };
63
+ CreateBasicSite[_a] = { fqn: "cdk-simplewebsite-deploy.CreateBasicSite", version: "2.1.0" };
64
64
  class CreateCloudfrontSite extends constructs_1.Construct {
65
65
  constructor(scope, id, props) {
66
66
  super(scope, id);
@@ -70,28 +70,31 @@ class CreateCloudfrontSite extends constructs_1.Construct {
70
70
  const hostedZoneLookup = route53.HostedZone.fromLookup(this, 'WebsiteHostedZone', {
71
71
  domainName: props.hostedZone,
72
72
  });
73
- const errorResponses = [];
74
- if (props.errorDoc) {
75
- errorResponses.push({
76
- httpStatus: 404,
77
- responsePagePath: `/${props.errorDoc}`,
78
- });
79
- errorResponses.push({
80
- httpStatus: 403,
81
- responsePagePath: `/${props.errorDoc}`,
82
- });
83
- }
84
- else {
85
- errorResponses.push({
86
- httpStatus: 404,
87
- responseHttpStatus: 200,
88
- responsePagePath: `/${props.indexDoc}`,
89
- });
90
- errorResponses.push({
91
- httpStatus: 403,
92
- responseHttpStatus: 200,
93
- responsePagePath: `/${props.indexDoc}`,
94
- });
73
+ // Use custom error responses if provided, otherwise use default logic
74
+ const errorResponses = props.customErrorResponses || [];
75
+ if (!props.customErrorResponses) {
76
+ if (props.errorDoc) {
77
+ errorResponses.push({
78
+ httpStatus: 404,
79
+ responsePagePath: `/${props.errorDoc}`,
80
+ });
81
+ errorResponses.push({
82
+ httpStatus: 403,
83
+ responsePagePath: `/${props.errorDoc}`,
84
+ });
85
+ }
86
+ else {
87
+ errorResponses.push({
88
+ httpStatus: 404,
89
+ responseHttpStatus: 200,
90
+ responsePagePath: `/${props.indexDoc}`,
91
+ });
92
+ errorResponses.push({
93
+ httpStatus: 403,
94
+ responseHttpStatus: 200,
95
+ responsePagePath: `/${props.indexDoc}`,
96
+ });
97
+ }
95
98
  }
96
99
  const subjectAlternativeNames = [];
97
100
  if (props.domain)
@@ -117,21 +120,51 @@ class CreateCloudfrontSite extends constructs_1.Construct {
117
120
  }
118
121
  if (props.subDomain)
119
122
  domainNames.push(props.subDomain);
123
+ // Create access logs bucket if logging is enabled but no bucket provided
124
+ const logsBucket = props.enableLogging
125
+ ? (props.logsBucket || new s3.Bucket(this, 'AccessLogsBucket', {
126
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
127
+ autoDeleteObjects: true,
128
+ encryption: s3.BucketEncryption.S3_MANAGED,
129
+ }))
130
+ : undefined;
131
+ // Create security headers policy if enabled
132
+ const responseHeadersPolicy = props.enableSecurityHeaders
133
+ ? new cloudfront.ResponseHeadersPolicy(this, 'SecurityHeadersPolicy', {
134
+ securityHeadersBehavior: {
135
+ contentTypeOptions: { override: true },
136
+ frameOptions: { frameOption: cloudfront.HeadersFrameOption.DENY, override: true },
137
+ referrerPolicy: { referrerPolicy: cloudfront.HeadersReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN, override: true },
138
+ strictTransportSecurity: {
139
+ accessControlMaxAge: aws_cdk_lib_1.Duration.seconds(31536000),
140
+ includeSubdomains: true,
141
+ preload: true,
142
+ override: true,
143
+ },
144
+ xssProtection: { protection: true, modeBlock: true, override: true },
145
+ },
146
+ })
147
+ : undefined;
120
148
  const websiteDist = new cloudfront.Distribution(scope, 'WebsiteDist', {
121
149
  defaultBehavior: {
122
150
  origin: origins.S3BucketOrigin.withOriginAccessControl(websiteBucket),
123
151
  allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
124
152
  viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
153
+ cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED,
154
+ originRequestPolicy: cloudfront.OriginRequestPolicy.CORS_S3_ORIGIN,
155
+ responseHeadersPolicy,
125
156
  },
157
+ additionalBehaviors: props.additionalBehaviors,
126
158
  minimumProtocolVersion: cloudfront.SecurityPolicyProtocol.TLS_V1_2_2021,
127
159
  httpVersion: cloudfront.HttpVersion.HTTP2_AND_3,
128
- priceClass: props.priceClass
129
- ? props.priceClass
130
- : cloudfront.PriceClass.PRICE_CLASS_100,
160
+ priceClass: props.priceClass ?? cloudfront.PriceClass.PRICE_CLASS_100,
131
161
  errorResponses,
132
162
  defaultRootObject: props.indexDoc,
133
163
  domainNames,
134
164
  certificate: websiteCert,
165
+ logBucket: logsBucket,
166
+ logIncludesCookies: false,
167
+ webAclId: props.webAclId,
135
168
  });
136
169
  new s3deploy.BucketDeployment(scope, 'WebsiteDeploy', {
137
170
  sources: [s3deploy.Source.asset(props.websiteFolder)],
@@ -143,16 +176,32 @@ class CreateCloudfrontSite extends constructs_1.Construct {
143
176
  recordName: props.domain ? props.domain : props.hostedZone,
144
177
  target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(websiteDist)),
145
178
  });
179
+ // Add IPv6 support if enabled
180
+ if (props.enableIpv6) {
181
+ new route53.AaaaRecord(scope, 'WebsiteDomainAliasIpv6', {
182
+ zone: hostedZoneLookup,
183
+ recordName: props.domain ? props.domain : props.hostedZone,
184
+ target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(websiteDist)),
185
+ });
186
+ }
146
187
  if (props.subDomain) {
147
188
  new route53.ARecord(scope, 'WebsiteSubDomainAlias', {
148
189
  zone: hostedZoneLookup,
149
190
  recordName: props.subDomain,
150
191
  target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(websiteDist)),
151
192
  });
193
+ // Add IPv6 support for subdomain if enabled
194
+ if (props.enableIpv6) {
195
+ new route53.AaaaRecord(scope, 'WebsiteSubDomainAliasIpv6', {
196
+ zone: hostedZoneLookup,
197
+ recordName: props.subDomain,
198
+ target: route53.RecordTarget.fromAlias(new targets.CloudFrontTarget(websiteDist)),
199
+ });
200
+ }
152
201
  }
153
202
  }
154
203
  }
155
204
  exports.CreateCloudfrontSite = CreateCloudfrontSite;
156
205
  _b = JSII_RTTI_SYMBOL_1;
157
- CreateCloudfrontSite[_b] = { fqn: "cdk-simplewebsite-deploy.CreateCloudfrontSite", version: "2.0.98" };
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXNpbXBsZXdlYnNpdGUtZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nkay1zaW1wbGV3ZWJzaXRlLWRlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE0QztBQUM1QywwREFBMEQ7QUFDMUQseURBQXlEO0FBQ3pELDhEQUE4RDtBQUM5RCxtREFBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QywwREFBMEQ7QUFDMUQsMkNBQXVDO0FBdUZ2QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFDNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQ3BELElBQUksRUFDSixtQkFBbUIsRUFDbkI7WUFDRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FDRixDQUFDO1FBRUYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQ3pDLEtBQUssRUFDTCx1QkFBdUIsRUFDdkI7WUFDRSxVQUFVLEVBQUUsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3JDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixlQUFlLEVBQUU7Z0JBQ2YsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUMxQixRQUFRLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUk7YUFDbkM7U0FDRixDQUNGLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUMxRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUNw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QyxDQUMxQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUU7Z0JBQ2xELElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNwQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FDMUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQzs7QUE5R0gsb0RBK0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVtb3ZhbFBvbGljeSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgb3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM2RlcGxveSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuaW50ZXJmYWNlIEVycm9yUmVzcG9uc2UgeyBodHRwU3RhdHVzOiBudW1iZXI7IHJlc3BvbnNlSHR0cFN0YXR1cz86IG51bWJlcjsgcmVzcG9uc2VQYWdlUGF0aDogc3RyaW5nIH1cblxuZXhwb3J0IGRlY2xhcmUgZW51bSBQcmljZUNsYXNzIHtcbiAgLyoqXG4gICAgICogVVNBLCBDYW5hZGEsIEV1cm9wZSwgJiBJc3JhZWwuXG4gICAgICpcbiAgICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgICAqL1xuICBQUklDRV9DTEFTU18xMDAgPSAnUHJpY2VDbGFzc18xMDAnLFxuICAvKipcbiAgICAgKiBQUklDRV9DTEFTU18xMDAgKyBTb3V0aCBBZnJpY2EsIEtlbnlhLCBNaWRkbGUgRWFzdCwgSmFwYW4sIFNpbmdhcG9yZSwgU291dGggS29yZWEsIFRhaXdhbiwgSG9uZyBLb25nLCAmIFBoaWxpcHBpbmVzLlxuICAgICAqXG4gICAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICAgKi9cbiAgUFJJQ0VfQ0xBU1NfMjAwID0gJ1ByaWNlQ2xhc3NfMjAwJyxcbiAgLyoqXG4gICAgICogQWxsIGxvY2F0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAgICovXG4gIFBSSUNFX0NMQVNTX0FMTCA9ICdQcmljZUNsYXNzX0FsbCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzaWNTaXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSB3ZWJzaXRlIGZvbGRlciB5b3Ugd2FudCB0byBkZXBsb3kgb24gUzMuXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlRm9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggZG9jdW1lbnQgb2YgdGhlIHdlYnNpdGUuXG4gICAqL1xuICByZWFkb25seSBpbmRleERvYzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGVycm9yIGRvY3VtZW50IG9mIHRoZSB3ZWJzaXRlLlxuICAgKiBAZGVmYXVsdCAtIE5vIGVycm9yIGRvY3VtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JEb2M/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3N0ZWQgWm9uZSB1c2VkIHRvIGNyZWF0ZSB0aGUgRE5TIHJlY29yZCBmb3IgdGhlIHdlYnNpdGUuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRmcm9udFNpdGVDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExvY2FsIHBhdGggdG8gdGhlIHdlYnNpdGUgZm9sZGVyIHlvdSB3YW50IHRvIGRlcGxveSBvbiBTMy5cbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVGb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBkb2N1bWVudCBvZiB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4RG9jOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgZG9jdW1lbnQgb2YgdGhlIHdlYnNpdGUuXG4gICAqIEBkZWZhdWx0IC0gTm8gZXJyb3IgZG9jdW1lbnQuXG4gICAqL1xuICByZWFkb25seSBlcnJvckRvYz86IHN0cmluZztcbiAgLyoqXG4gICAqIEhvc3RlZCBab25lIHVzZWQgdG8gY3JlYXRlIHRoZSBETlMgcmVjb3JkIGZvciB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IHN0cmluZztcbiAgLyoqXG4gICAqIFVzZWQgdG8gZGVwbG95IGEgQ2xvdWRmcm9udCBzaXRlIHdpdGggYSBzaW5nbGUgZG9tYWluLiBlLmcuIHNhbXBsZS5leGFtcGxlLmNvbVxuICAgKiBJZiB5b3UgaW5jbHVkZSBhIHZhbHVlIGZvciBib3RoIGRvbWFpbiBhbmQgc3ViRG9tYWluLFxuICAgKiBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1YmRvbWFpbiBuYW1lIHlvdSB3YW50IHRvIGRlcGxveS4gZS5nLiB3d3cuZXhhbXBsZS5jb21cbiAgICogSWYgeW91IGluY2x1ZGUgYSB2YWx1ZSBmb3IgYm90aCBkb21haW4gYW5kIHN1YkRvbWFpbixcbiAgICogYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHN1YkRvbWFpbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwcmljZSBjbGFzcyBkZXRlcm1pbmVzIGhvdyBtYW55IGVkZ2UgbG9jYXRpb25zIENsb3VkRnJvbnQgd2lsbCB1c2UgZm9yIHlvdXIgZGlzdHJpYnV0aW9uLlxuICAgKiBAZGVmYXVsdCBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMC5cbiAgICogQHNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL2Nsb3VkZnJvbnQvcHJpY2luZy8uXG4gICAqL1xuICByZWFkb25seSBwcmljZUNsYXNzPzogUHJpY2VDbGFzcztcbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUJhc2ljU2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYXNpY1NpdGVDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGhvc3RlZFpvbmVMb29rdXAgPSByb3V0ZTUzLkhvc3RlZFpvbmUuZnJvbUxvb2t1cChcbiAgICAgIHRoaXMsXG4gICAgICAnV2Vic2l0ZUhvc3RlZFpvbmUnLFxuICAgICAge1xuICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2Vic2l0ZVJlZGlyZWN0QnVja2V0ID0gbmV3IHMzLkJ1Y2tldChcbiAgICAgIHNjb3BlLFxuICAgICAgJ1dlYnNpdGVSZWRpcmVjdEJ1Y2tldCcsXG4gICAgICB7XG4gICAgICAgIGJ1Y2tldE5hbWU6IGB3d3cuJHtwcm9wcy5ob3N0ZWRab25lfWAsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIHdlYnNpdGVSZWRpcmVjdDoge1xuICAgICAgICAgIGhvc3ROYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgICAgIHByb3RvY29sOiBzMy5SZWRpcmVjdFByb3RvY29sLkhUVFAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3ZWJzaXRlQnVja2V0ID0gbmV3IHMzLkJ1Y2tldChzY29wZSwgJ1dlYnNpdGVCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMuaW5kZXhEb2MsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMuZXJyb3JEb2MsXG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHtcbiAgICAgICAgYmxvY2tQdWJsaWNQb2xpY3k6IGZhbHNlLFxuICAgICAgICBibG9ja1B1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICBpZ25vcmVQdWJsaWNBY2xzOiBmYWxzZSxcbiAgICAgICAgcmVzdHJpY3RQdWJsaWNCdWNrZXRzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgfSk7XG5cbiAgICBuZXcgczNkZXBsb3kuQnVja2V0RGVwbG95bWVudChzY29wZSwgJ1dlYnNpdGVEZXBsb3knLCB7XG4gICAgICBzb3VyY2VzOiBbczNkZXBsb3kuU291cmNlLmFzc2V0KHByb3BzLndlYnNpdGVGb2xkZXIpXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB3ZWJzaXRlQnVja2V0LFxuICAgIH0pO1xuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZChzY29wZSwgJ1dlYnNpdGVBbGlhcycsIHtcbiAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyB0YXJnZXRzLkJ1Y2tldFdlYnNpdGVUYXJnZXQod2Vic2l0ZUJ1Y2tldCksXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZChzY29wZSwgJ1dlYnNpdGVSZWRpcmVjdEFsaWFzJywge1xuICAgICAgem9uZTogaG9zdGVkWm9uZUxvb2t1cCxcbiAgICAgIHJlY29yZE5hbWU6IGB3d3cuJHtwcm9wcy5ob3N0ZWRab25lfWAsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHRhcmdldHMuQnVja2V0V2Vic2l0ZVRhcmdldCh3ZWJzaXRlUmVkaXJlY3RCdWNrZXQpLFxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlQ2xvdWRmcm9udFNpdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENsb3VkZnJvbnRTaXRlQ29uZmlndXJhdGlvbixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcy5kb21haW4gJiYgcHJvcHMuc3ViRG9tYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdEb21haW4gYW5kIHN1YiBkb21haW4gcGFyYW1ldGVycyBjYW5ub3QgYm90aCBiZSBkZWZpbmVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaG9zdGVkWm9uZUxvb2t1cCA9IHJvdXRlNTMuSG9zdGVkWm9uZS5mcm9tTG9va3VwKFxuICAgICAgdGhpcyxcbiAgICAgICdXZWJzaXRlSG9zdGVkWm9uZScsXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBlcnJvclJlc3BvbnNlczogRXJyb3JSZXNwb25zZVtdID0gW107XG4gICAgaWYgKHByb3BzLmVycm9yRG9jKSB7XG4gICAgICBlcnJvclJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgaHR0cFN0YXR1czogNDA0LFxuICAgICAgICByZXNwb25zZVBhZ2VQYXRoOiBgLyR7cHJvcHMuZXJyb3JEb2N9YCxcbiAgICAgIH0pO1xuICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgIGh0dHBTdGF0dXM6IDQwMyxcbiAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogYC8ke3Byb3BzLmVycm9yRG9jfWAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgIGh0dHBTdGF0dXM6IDQwNCxcbiAgICAgICAgcmVzcG9uc2VIdHRwU3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IGAvJHtwcm9wcy5pbmRleERvY31gLFxuICAgICAgfSk7XG4gICAgICBlcnJvclJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgaHR0cFN0YXR1czogNDAzLFxuICAgICAgICByZXNwb25zZUh0dHBTdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogYC8ke3Byb3BzLmluZGV4RG9jfWAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocHJvcHMuZG9tYWluKSBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcy5wdXNoKHByb3BzLmRvbWFpbik7XG4gICAgaWYgKHByb3BzLnN1YkRvbWFpbikgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMucHVzaChwcm9wcy5zdWJEb21haW4pO1xuXG4gICAgY29uc3Qgd2Vic2l0ZUNlcnQgPSBuZXcgYWNtLkNlcnRpZmljYXRlKHRoaXMsICdXZWJzaXRlQ2VydCcsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyxcbiAgICAgIHZhbGlkYXRpb246IGFjbS5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhob3N0ZWRab25lTG9va3VwKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdlYnNpdGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHNjb3BlLCAnV2Vic2l0ZUJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgIH0pO1xuXG4gICAgY29uc3QgZG9tYWluTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHByb3BzLmRvbWFpbikge1xuICAgICAgZG9tYWluTmFtZXMucHVzaChwcm9wcy5kb21haW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb21haW5OYW1lcy5wdXNoKHByb3BzLmhvc3RlZFpvbmUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zdWJEb21haW4pIGRvbWFpbk5hbWVzLnB1c2gocHJvcHMuc3ViRG9tYWluKTtcblxuICAgIGNvbnN0IHdlYnNpdGVEaXN0ID0gbmV3IGNsb3VkZnJvbnQuRGlzdHJpYnV0aW9uKHNjb3BlLCAnV2Vic2l0ZURpc3QnLCB7XG4gICAgICBkZWZhdWx0QmVoYXZpb3I6IHtcbiAgICAgICAgb3JpZ2luOiBvcmlnaW5zLlMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHdlYnNpdGVCdWNrZXQpLFxuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2xvdWRmcm9udC5BbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2xvdWRmcm9udC5WaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIH0sXG4gICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBjbG91ZGZyb250LlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjbG91ZGZyb250Lkh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgcHJpY2VDbGFzczogcHJvcHMucHJpY2VDbGFzc1xuICAgICAgICA/IHByb3BzLnByaWNlQ2xhc3NcbiAgICAgICAgOiBjbG91ZGZyb250LlByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLFxuICAgICAgZXJyb3JSZXNwb25zZXMsXG4gICAgICBkZWZhdWx0Um9vdE9iamVjdDogcHJvcHMuaW5kZXhEb2MsXG4gICAgICBkb21haW5OYW1lcyxcbiAgICAgIGNlcnRpZmljYXRlOiB3ZWJzaXRlQ2VydCxcbiAgICB9KTtcblxuICAgIG5ldyBzM2RlcGxveS5CdWNrZXREZXBsb3ltZW50KHNjb3BlLCAnV2Vic2l0ZURlcGxveScsIHtcbiAgICAgIHNvdXJjZXM6IFtzM2RlcGxveS5Tb3VyY2UuYXNzZXQocHJvcHMud2Vic2l0ZUZvbGRlcildLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHdlYnNpdGVCdWNrZXQsXG4gICAgICBkaXN0cmlidXRpb246IHdlYnNpdGVEaXN0LFxuICAgIH0pO1xuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZChzY29wZSwgJ1dlYnNpdGVEb21haW5BbGlhcycsIHtcbiAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4gPyBwcm9wcy5kb21haW4gOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyB0YXJnZXRzLkNsb3VkRnJvbnRUYXJnZXQod2Vic2l0ZURpc3QpLFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5zdWJEb21haW4pIHtcbiAgICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQoc2NvcGUsICdXZWJzaXRlU3ViRG9tYWluQWxpYXMnLCB7XG4gICAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICAgIHJlY29yZE5hbWU6IHByb3BzLnN1YkRvbWFpbixcbiAgICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgbmV3IHRhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh3ZWJzaXRlRGlzdCksXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
206
+ CreateCloudfrontSite[_b] = { fqn: "cdk-simplewebsite-deploy.CreateCloudfrontSite", version: "2.1.0" };
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXNpbXBsZXdlYnNpdGUtZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nkay1zaW1wbGV3ZWJzaXRlLWRlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFzRDtBQUN0RCwwREFBMEQ7QUFDMUQseURBQXlEO0FBQ3pELDhEQUE4RDtBQUM5RCxtREFBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QywwREFBMEQ7QUFDMUQsMkNBQXVDO0FBbUd2QyxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFDNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQ3BELElBQUksRUFDSixtQkFBbUIsRUFDbkI7WUFDRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FDRixDQUFDO1FBRUYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQ3pDLEtBQUssRUFDTCx1QkFBdUIsRUFDdkI7WUFDRSxVQUFVLEVBQUUsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3JDLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixlQUFlLEVBQUU7Z0JBQ2YsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVO2dCQUMxQixRQUFRLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUk7YUFDbkM7U0FDRixDQUNGLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRTtZQUMxRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUNw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QUFVLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRTtvQkFDekQsSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMzQixNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ3BDLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUMxQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBdktILG9EQXdLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3ksIER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgYWNtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBvcmlnaW5zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnMnO1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzZGVwbG95IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50JztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2ljU2l0ZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTG9jYWwgcGF0aCB0byB0aGUgd2Vic2l0ZSBmb2xkZXIgeW91IHdhbnQgdG8gZGVwbG95IG9uIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUZvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGluZGV4IGRvY3VtZW50IG9mIHRoZSB3ZWJzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhEb2M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlcnJvciBkb2N1bWVudCBvZiB0aGUgd2Vic2l0ZS5cbiAgICogQGRlZmF1bHQgLSBObyBlcnJvciBkb2N1bWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yRG9jPzogc3RyaW5nO1xuICAvKipcbiAgICogSG9zdGVkIFpvbmUgdXNlZCB0byBjcmVhdGUgdGhlIEROUyByZWNvcmQgZm9yIHRoZSB3ZWJzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkZnJvbnRTaXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBMb2NhbCBwYXRoIHRvIHRoZSB3ZWJzaXRlIGZvbGRlciB5b3Ugd2FudCB0byBkZXBsb3kgb24gUzMuXG4gICAqL1xuICByZWFkb25seSB3ZWJzaXRlRm9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggZG9jdW1lbnQgb2YgdGhlIHdlYnNpdGUuXG4gICAqL1xuICByZWFkb25seSBpbmRleERvYzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGVycm9yIGRvY3VtZW50IG9mIHRoZSB3ZWJzaXRlLlxuICAgKiBAZGVmYXVsdCAtIE5vIGVycm9yIGRvY3VtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JEb2M/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3N0ZWQgWm9uZSB1c2VkIHRvIGNyZWF0ZSB0aGUgRE5TIHJlY29yZCBmb3IgdGhlIHdlYnNpdGUuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRlcGxveSBhIENsb3VkZnJvbnQgc2l0ZSB3aXRoIGEgc2luZ2xlIGRvbWFpbi4gZS5nLiBzYW1wbGUuZXhhbXBsZS5jb21cbiAgICogSWYgeW91IGluY2x1ZGUgYSB2YWx1ZSBmb3IgYm90aCBkb21haW4gYW5kIHN1YkRvbWFpbixcbiAgICogYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzdWJkb21haW4gbmFtZSB5b3Ugd2FudCB0byBkZXBsb3kuIGUuZy4gd3d3LmV4YW1wbGUuY29tXG4gICAqIElmIHlvdSBpbmNsdWRlIGEgdmFsdWUgZm9yIGJvdGggZG9tYWluIGFuZCBzdWJEb21haW4sXG4gICAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBzdWJEb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcHJpY2UgY2xhc3MgZGV0ZXJtaW5lcyBob3cgbWFueSBlZGdlIGxvY2F0aW9ucyBDbG91ZEZyb250IHdpbGwgdXNlIGZvciB5b3VyIGRpc3RyaWJ1dGlvbi5cbiAgICogQGRlZmF1bHQgUHJpY2VDbGFzcy5QUklDRV9DTEFTU18xMDAuXG4gICAqIEBzZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9jbG91ZGZyb250L3ByaWNpbmcvLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJpY2VDbGFzcz86IGNsb3VkZnJvbnQuUHJpY2VDbGFzcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhY2hlIGJlaGF2aW9ycyBmb3IgZGlmZmVyZW50IHBhdGggcGF0dGVybnMuXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsQmVoYXZpb3JzPzogUmVjb3JkPHN0cmluZywgY2xvdWRmcm9udC5CZWhhdmlvck9wdGlvbnM+O1xuICAvKipcbiAgICogRW5hYmxlIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5IGZvciBzZWN1cml0eSBoZWFkZXJzLlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIE5vIHNlY3VyaXR5IGhlYWRlcnMgcG9saWN5IGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVTZWN1cml0eUhlYWRlcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIElQdjYgc3VwcG9ydCB3aXRoIEFBQUEgcmVjb3Jkcy5cbiAgICogQGRlZmF1bHQgZmFsc2UgLSBObyBJUHY2IHN1cHBvcnQuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVJcHY2PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciByZXNwb25zZXMgZm9yIGRpZmZlcmVudCBIVFRQIHN0YXR1cyBjb2Rlcy5cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGVycm9yIHJlc3BvbnNlcyBiYXNlZCBvbiBlcnJvckRvYyBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRXJyb3JSZXNwb25zZXM/OiBjbG91ZGZyb250LkVycm9yUmVzcG9uc2VbXTtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZEZyb250IGFjY2VzcyBsb2dnaW5nLlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIE5vIGFjY2VzcyBsb2dnaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlTG9nZ2luZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTMyBidWNrZXQgZm9yIENsb3VkRnJvbnQgYWNjZXNzIGxvZ3MuIElmIG5vdCBwcm92aWRlZCBhbmQgbG9nZ2luZyBpcyBlbmFibGVkLCBhIG5ldyBidWNrZXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAZGVmYXVsdCAtIE5ldyBidWNrZXQgY3JlYXRlZCBpZiBsb2dnaW5nIGlzIGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBsb2dzQnVja2V0PzogczMuSUJ1Y2tldDtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIFdBRiBXZWIgQUNMIEFSTiBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqIEBkZWZhdWx0IC0gTm8gV0FGIGludGVncmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd2ViQWNsSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVCYXNpY1NpdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFzaWNTaXRlQ29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob3N0ZWRab25lTG9va3VwID0gcm91dGU1My5Ib3N0ZWRab25lLmZyb21Mb29rdXAoXG4gICAgICB0aGlzLFxuICAgICAgJ1dlYnNpdGVIb3N0ZWRab25lJyxcbiAgICAgIHtcbiAgICAgICAgZG9tYWluTmFtZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHdlYnNpdGVSZWRpcmVjdEJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQoXG4gICAgICBzY29wZSxcbiAgICAgICdXZWJzaXRlUmVkaXJlY3RCdWNrZXQnLFxuICAgICAge1xuICAgICAgICBidWNrZXROYW1lOiBgd3d3LiR7cHJvcHMuaG9zdGVkWm9uZX1gLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB3ZWJzaXRlUmVkaXJlY3Q6IHtcbiAgICAgICAgICBob3N0TmFtZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgICAgICBwcm90b2NvbDogczMuUmVkaXJlY3RQcm90b2NvbC5IVFRQLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2Vic2l0ZUJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQoc2NvcGUsICdXZWJzaXRlQnVja2V0Jywge1xuICAgICAgYnVja2V0TmFtZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgd2Vic2l0ZUluZGV4RG9jdW1lbnQ6IHByb3BzLmluZGV4RG9jLFxuICAgICAgd2Vic2l0ZUVycm9yRG9jdW1lbnQ6IHByb3BzLmVycm9yRG9jLFxuICAgICAgcHVibGljUmVhZEFjY2VzczogdHJ1ZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiB7XG4gICAgICAgIGJsb2NrUHVibGljUG9saWN5OiBmYWxzZSxcbiAgICAgICAgYmxvY2tQdWJsaWNBY2xzOiBmYWxzZSxcbiAgICAgICAgaWdub3JlUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgIHJlc3RyaWN0UHVibGljQnVja2V0czogZmFsc2UsXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgIH0pO1xuXG4gICAgbmV3IHMzZGVwbG95LkJ1Y2tldERlcGxveW1lbnQoc2NvcGUsICdXZWJzaXRlRGVwbG95Jywge1xuICAgICAgc291cmNlczogW3MzZGVwbG95LlNvdXJjZS5hc3NldChwcm9wcy53ZWJzaXRlRm9sZGVyKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogd2Vic2l0ZUJ1Y2tldCxcbiAgICB9KTtcblxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQoc2NvcGUsICdXZWJzaXRlQWxpYXMnLCB7XG4gICAgICB6b25lOiBob3N0ZWRab25lTG9va3VwLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgdGFyZ2V0cy5CdWNrZXRXZWJzaXRlVGFyZ2V0KHdlYnNpdGVCdWNrZXQpLFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQoc2NvcGUsICdXZWJzaXRlUmVkaXJlY3RBbGlhcycsIHtcbiAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICByZWNvcmROYW1lOiBgd3d3LiR7cHJvcHMuaG9zdGVkWm9uZX1gLFxuICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyB0YXJnZXRzLkJ1Y2tldFdlYnNpdGVUYXJnZXQod2Vic2l0ZVJlZGlyZWN0QnVja2V0KSxcbiAgICAgICksXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUNsb3VkZnJvbnRTaXRlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDbG91ZGZyb250U2l0ZUNvbmZpZ3VyYXRpb24sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMuZG9tYWluICYmIHByb3BzLnN1YkRvbWFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRG9tYWluIGFuZCBzdWIgZG9tYWluIHBhcmFtZXRlcnMgY2Fubm90IGJvdGggYmUgZGVmaW5lZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGhvc3RlZFpvbmVMb29rdXAgPSByb3V0ZTUzLkhvc3RlZFpvbmUuZnJvbUxvb2t1cChcbiAgICAgIHRoaXMsXG4gICAgICAnV2Vic2l0ZUhvc3RlZFpvbmUnLFxuICAgICAge1xuICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gVXNlIGN1c3RvbSBlcnJvciByZXNwb25zZXMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCBsb2dpY1xuICAgIGNvbnN0IGVycm9yUmVzcG9uc2VzOiBjbG91ZGZyb250LkVycm9yUmVzcG9uc2VbXSA9IHByb3BzLmN1c3RvbUVycm9yUmVzcG9uc2VzIHx8IFtdO1xuICAgIGlmICghcHJvcHMuY3VzdG9tRXJyb3JSZXNwb25zZXMpIHtcbiAgICAgIGlmIChwcm9wcy5lcnJvckRvYykge1xuICAgICAgICBlcnJvclJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICBodHRwU3RhdHVzOiA0MDQsXG4gICAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogYC8ke3Byb3BzLmVycm9yRG9jfWAsXG4gICAgICAgIH0pO1xuICAgICAgICBlcnJvclJlc3BvbnNlcy5wdXNoKHtcbiAgICAgICAgICBodHRwU3RhdHVzOiA0MDMsXG4gICAgICAgICAgcmVzcG9uc2VQYWdlUGF0aDogYC8ke3Byb3BzLmVycm9yRG9jfWAsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaHR0cFN0YXR1czogNDA0LFxuICAgICAgICAgIHJlc3BvbnNlSHR0cFN0YXR1czogMjAwLFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IGAvJHtwcm9wcy5pbmRleERvY31gLFxuICAgICAgICB9KTtcbiAgICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaHR0cFN0YXR1czogNDAzLFxuICAgICAgICAgIHJlc3BvbnNlSHR0cFN0YXR1czogMjAwLFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IGAvJHtwcm9wcy5pbmRleERvY31gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAocHJvcHMuZG9tYWluKSBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcy5wdXNoKHByb3BzLmRvbWFpbik7XG4gICAgaWYgKHByb3BzLnN1YkRvbWFpbikgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMucHVzaChwcm9wcy5zdWJEb21haW4pO1xuXG4gICAgY29uc3Qgd2Vic2l0ZUNlcnQgPSBuZXcgYWNtLkNlcnRpZmljYXRlKHRoaXMsICdXZWJzaXRlQ2VydCcsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICBzdWJqZWN0QWx0ZXJuYXRpdmVOYW1lcyxcbiAgICAgIHZhbGlkYXRpb246IGFjbS5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhob3N0ZWRab25lTG9va3VwKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdlYnNpdGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHNjb3BlLCAnV2Vic2l0ZUJ1Y2tldCcsIHtcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgIH0pO1xuXG4gICAgY29uc3QgZG9tYWluTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHByb3BzLmRvbWFpbikge1xuICAgICAgZG9tYWluTmFtZXMucHVzaChwcm9wcy5kb21haW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb21haW5OYW1lcy5wdXNoKHByb3BzLmhvc3RlZFpvbmUpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zdWJEb21haW4pIGRvbWFpbk5hbWVzLnB1c2gocHJvcHMuc3ViRG9tYWluKTtcblxuICAgIC8vIENyZWF0ZSBhY2Nlc3MgbG9ncyBidWNrZXQgaWYgbG9nZ2luZyBpcyBlbmFibGVkIGJ1dCBubyBidWNrZXQgcHJvdmlkZWRcbiAgICBjb25zdCBsb2dzQnVja2V0ID0gcHJvcHMuZW5hYmxlTG9nZ2luZ1xuICAgICAgPyAocHJvcHMubG9nc0J1Y2tldCB8fCBuZXcgczMuQnVja2V0KHRoaXMsICdBY2Nlc3NMb2dzQnVja2V0Jywge1xuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICB9KSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIHNlY3VyaXR5IGhlYWRlcnMgcG9saWN5IGlmIGVuYWJsZWRcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBwcm9wcy5lbmFibGVTZWN1cml0eUhlYWRlcnNcbiAgICAgID8gbmV3IGNsb3VkZnJvbnQuUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsICdTZWN1cml0eUhlYWRlcnNQb2xpY3knLCB7XG4gICAgICAgIHNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiB7XG4gICAgICAgICAgY29udGVudFR5cGVPcHRpb25zOiB7IG92ZXJyaWRlOiB0cnVlIH0sXG4gICAgICAgICAgZnJhbWVPcHRpb25zOiB7IGZyYW1lT3B0aW9uOiBjbG91ZGZyb250LkhlYWRlcnNGcmFtZU9wdGlvbi5ERU5ZLCBvdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgICAgIHJlZmVycmVyUG9saWN5OiB7IHJlZmVycmVyUG9saWN5OiBjbG91ZGZyb250LkhlYWRlcnNSZWZlcnJlclBvbGljeS5TVFJJQ1RfT1JJR0lOX1dIRU5fQ1JPU1NfT1JJR0lOLCBvdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5zZWNvbmRzKDMxNTM2MDAwKSxcbiAgICAgICAgICAgIGluY2x1ZGVTdWJkb21haW5zOiB0cnVlLFxuICAgICAgICAgICAgcHJlbG9hZDogdHJ1ZSxcbiAgICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeHNzUHJvdGVjdGlvbjogeyBwcm90ZWN0aW9uOiB0cnVlLCBtb2RlQmxvY2s6IHRydWUsIG92ZXJyaWRlOiB0cnVlIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB3ZWJzaXRlRGlzdCA9IG5ldyBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbihzY29wZSwgJ1dlYnNpdGVEaXN0Jywge1xuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogb3JpZ2lucy5TM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh3ZWJzaXRlQnVja2V0KSxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNsb3VkZnJvbnQuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNsb3VkZnJvbnQuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIGNhY2hlUG9saWN5OiBjbG91ZGZyb250LkNhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBjbG91ZGZyb250Lk9yaWdpblJlcXVlc3RQb2xpY3kuQ09SU19TM19PUklHSU4sXG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsQmVoYXZpb3JzOiBwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzLFxuICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogY2xvdWRmcm9udC5TZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICBodHRwVmVyc2lvbjogY2xvdWRmcm9udC5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIHByaWNlQ2xhc3M6IHByb3BzLnByaWNlQ2xhc3MgPz8gY2xvdWRmcm9udC5QcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMCxcbiAgICAgIGVycm9yUmVzcG9uc2VzLFxuICAgICAgZGVmYXVsdFJvb3RPYmplY3Q6IHByb3BzLmluZGV4RG9jLFxuICAgICAgZG9tYWluTmFtZXMsXG4gICAgICBjZXJ0aWZpY2F0ZTogd2Vic2l0ZUNlcnQsXG4gICAgICBsb2dCdWNrZXQ6IGxvZ3NCdWNrZXQsXG4gICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IGZhbHNlLFxuICAgICAgd2ViQWNsSWQ6IHByb3BzLndlYkFjbElkLFxuICAgIH0pO1xuXG4gICAgbmV3IHMzZGVwbG95LkJ1Y2tldERlcGxveW1lbnQoc2NvcGUsICdXZWJzaXRlRGVwbG95Jywge1xuICAgICAgc291cmNlczogW3MzZGVwbG95LlNvdXJjZS5hc3NldChwcm9wcy53ZWJzaXRlRm9sZGVyKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogd2Vic2l0ZUJ1Y2tldCxcbiAgICAgIGRpc3RyaWJ1dGlvbjogd2Vic2l0ZURpc3QsXG4gICAgfSk7XG5cbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHNjb3BlLCAnV2Vic2l0ZURvbWFpbkFsaWFzJywge1xuICAgICAgem9uZTogaG9zdGVkWm9uZUxvb2t1cCxcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbiA/IHByb3BzLmRvbWFpbiA6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHRhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh3ZWJzaXRlRGlzdCksXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIElQdjYgc3VwcG9ydCBpZiBlbmFibGVkXG4gICAgaWYgKHByb3BzLmVuYWJsZUlwdjYpIHtcbiAgICAgIG5ldyByb3V0ZTUzLkFhYWFSZWNvcmQoc2NvcGUsICdXZWJzaXRlRG9tYWluQWxpYXNJcHY2Jywge1xuICAgICAgICB6b25lOiBob3N0ZWRab25lTG9va3VwLFxuICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4gPyBwcm9wcy5kb21haW4gOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICBuZXcgdGFyZ2V0cy5DbG91ZEZyb250VGFyZ2V0KHdlYnNpdGVEaXN0KSxcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5zdWJEb21haW4pIHtcbiAgICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQoc2NvcGUsICdXZWJzaXRlU3ViRG9tYWluQWxpYXMnLCB7XG4gICAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICAgIHJlY29yZE5hbWU6IHByb3BzLnN1YkRvbWFpbixcbiAgICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgbmV3IHRhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh3ZWJzaXRlRGlzdCksXG4gICAgICAgICksXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIElQdjYgc3VwcG9ydCBmb3Igc3ViZG9tYWluIGlmIGVuYWJsZWRcbiAgICAgIGlmIChwcm9wcy5lbmFibGVJcHY2KSB7XG4gICAgICAgIG5ldyByb3V0ZTUzLkFhYWFSZWNvcmQoc2NvcGUsICdXZWJzaXRlU3ViRG9tYWluQWxpYXNJcHY2Jywge1xuICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuc3ViRG9tYWluLFxuICAgICAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgICAgbmV3IHRhcmdldHMuQ2xvdWRGcm9udFRhcmdldCh3ZWJzaXRlRGlzdCksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -48,15 +48,15 @@
48
48
  "constructs": "10.0.5",
49
49
  "eslint": "^9",
50
50
  "eslint-import-resolver-typescript": "^2.7.1",
51
- "eslint-plugin-import": "^2.31.0",
51
+ "eslint-plugin-import": "^2.32.0",
52
52
  "jest": "^27",
53
53
  "jest-junit": "^16",
54
- "jsii": "~5.6.0",
55
- "jsii-diff": "^1.112.0",
54
+ "jsii": "~5.8.0",
55
+ "jsii-diff": "^1.114.1",
56
56
  "jsii-docgen": "^10.5.0",
57
- "jsii-pacmak": "^1.112.0",
58
- "jsii-rosetta": "~5.6.0",
59
- "projen": "^0.92.7",
57
+ "jsii-pacmak": "^1.114.1",
58
+ "jsii-rosetta": "~5.8.0",
59
+ "projen": "^0.96.2",
60
60
  "ts-jest": "^27",
61
61
  "typescript": "^4.9.5"
62
62
  },
@@ -72,7 +72,7 @@
72
72
  "publishConfig": {
73
73
  "access": "public"
74
74
  },
75
- "version": "2.0.98",
75
+ "version": "2.1.0",
76
76
  "jest": {
77
77
  "coverageProvider": "v8",
78
78
  "testMatch": [