cdk-simplewebsite-deploy 2.2.0 → 2.2.1

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
@@ -8777,7 +8777,7 @@
8777
8777
  },
8778
8778
  "name": "cdk-simplewebsite-deploy",
8779
8779
  "readme": {
8780
- "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 v2 construct library for deploying a single-page website with S3, CloudFront, Route 53, and ACM. `CreateCloudfrontSite` is the recommended construct because it uses a private S3 origin with CloudFront Origin Access Control (OAC), while `CreateBasicSite` is deprecated because it creates a public S3 website endpoint.\n\n## Installation and Usage\n\n### [CreateCloudfrontSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createcloudfrontsite)\n#### Creates a website using a private S3 bucket, a CloudFront distribution, and DNS records 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 Constructs;\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 com.thonbecker.simplewebsitedeploy.CreateCloudfrontSite;\nimport software.amazon.awscdk.Stack;\nimport software.amazon.awscdk.StackProps;\nimport software.constructs.Construct;\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 .websiteFolder(\"./src/build\")\n .indexDoc(\"index.html\")\n .hostedZone(\"example.com\")\n .subDomain(\"www.example.com\")\n .build();\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 CreateCloudfrontSite\nfrom constructs import Construct\n\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 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### [CreateBasicSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createbasicsite)\n#### Deprecated. Creates a website using public S3 website endpoints with a domain hosted in Route 53.\nUse `CreateCloudfrontSite` for new sites. `CreateBasicSite` configures public bucket access so Route 53 can alias directly to the S3 website endpoint.\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 Constructs;\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 com.thonbecker.simplewebsitedeploy.CreateBasicSite;\nimport software.amazon.awscdk.Stack;\nimport software.amazon.awscdk.StackProps;\nimport software.constructs.Construct;\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 .websiteFolder(\"./src/build\")\n .indexDoc(\"index.html\")\n .hostedZone(\"example.com\")\n .build();\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\n## 🚀 Enhanced Features\n\nThe `CreateCloudfrontSite` construct includes optional advanced features for 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### Origin Access Levels\nGrant additional OAC permissions to the website bucket. This can be useful when you need CloudFront to distinguish missing objects from access-denied responses.\n\n```typescript\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\n\nnew CreateCloudfrontSite(this, 'website-with-list-access', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n originAccessLevels: [\n cloudfront.AccessLevel.READ,\n cloudfront.AccessLevel.LIST,\n ],\n});\n```\n\n### CloudFront Function Associations\nAttach CloudFront Functions to the default behavior for lightweight viewer request or viewer response logic.\n\n```typescript\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\n\nconst rewriteFunction = new cloudfront.Function(this, 'RewriteFunction', {\n code: cloudfront.FunctionCode.fromInline(\n 'function handler(event) { return event.request; }',\n ),\n});\n\nnew CreateCloudfrontSite(this, 'website-with-function', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n functionAssociations: [\n {\n eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,\n function: rewriteFunction,\n },\n ],\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 const rewriteFunction = new cloudfront.Function(this, 'RewriteFunction', {\n code: cloudfront.FunctionCode.fromInline(\n 'function handler(event) { return event.request; }',\n ),\n });\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 originAccessLevels: [\n cloudfront.AccessLevel.READ,\n cloudfront.AccessLevel.LIST,\n ],\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 // Edge Logic\n functionAssociations: [\n {\n eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,\n function: rewriteFunction,\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- **Configurable OAC Permissions**: Optional origin access levels for the website bucket\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- **CloudFront Functions**: Optional viewer request and response function associations\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"
8780
+ "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 v2 construct library for deploying a single-page website with S3, CloudFront, Route 53, and ACM. `CreateCloudfrontSite` is the recommended construct because it uses a private S3 origin with CloudFront Origin Access Control (OAC), while `CreateBasicSite` is deprecated because it creates a public S3 website endpoint.\n\n## Installation and Usage\n\n### [CreateCloudfrontSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createcloudfrontsite)\n#### Creates a website using a private S3 bucket, a CloudFront distribution, and DNS records 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##### 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 com.thonbecker.simplewebsitedeploy.CreateCloudfrontSite;\nimport software.amazon.awscdk.Stack;\nimport software.amazon.awscdk.StackProps;\nimport software.constructs.Construct;\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 .websiteFolder(\"./src/build\")\n .indexDoc(\"index.html\")\n .hostedZone(\"example.com\")\n .subDomain(\"www.example.com\")\n .build();\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 CreateCloudfrontSite\nfrom constructs import Construct\n\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 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### [CreateBasicSite](https://github.com/snappetal/cdk-simplewebsite-deploy/blob/main/API.md#cdk-cloudfront-deploy-createbasicsite)\n#### Deprecated. Creates a website using public S3 website endpoints with a domain hosted in Route 53.\nUse `CreateCloudfrontSite` for new sites. `CreateBasicSite` configures public bucket access so Route 53 can alias directly to the S3 website endpoint.\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##### 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 com.thonbecker.simplewebsitedeploy.CreateBasicSite;\nimport software.amazon.awscdk.Stack;\nimport software.amazon.awscdk.StackProps;\nimport software.constructs.Construct;\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 .websiteFolder(\"./src/build\")\n .indexDoc(\"index.html\")\n .hostedZone(\"example.com\")\n .build();\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\n## 🚀 Enhanced Features\n\nThe `CreateCloudfrontSite` construct includes optional advanced features for 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### Origin Access Levels\nGrant additional OAC permissions to the website bucket. This can be useful when you need CloudFront to distinguish missing objects from access-denied responses.\n\n```typescript\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\n\nnew CreateCloudfrontSite(this, 'website-with-list-access', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n originAccessLevels: [\n cloudfront.AccessLevel.READ,\n cloudfront.AccessLevel.LIST,\n ],\n});\n```\n\n### CloudFront Function Associations\nAttach CloudFront Functions to the default behavior for lightweight viewer request or viewer response logic.\n\n```typescript\nimport * as cloudfront from 'aws-cdk-lib/aws-cloudfront';\n\nconst rewriteFunction = new cloudfront.Function(this, 'RewriteFunction', {\n code: cloudfront.FunctionCode.fromInline(\n 'function handler(event) { return event.request; }',\n ),\n});\n\nnew CreateCloudfrontSite(this, 'website-with-function', {\n websiteFolder: './src/dist',\n indexDoc: 'index.html',\n hostedZone: 'example.com',\n functionAssociations: [\n {\n eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,\n function: rewriteFunction,\n },\n ],\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 const rewriteFunction = new cloudfront.Function(this, 'RewriteFunction', {\n code: cloudfront.FunctionCode.fromInline(\n 'function handler(event) { return event.request; }',\n ),\n });\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 originAccessLevels: [\n cloudfront.AccessLevel.READ,\n cloudfront.AccessLevel.LIST,\n ],\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 // Edge Logic\n functionAssociations: [\n {\n eventType: cloudfront.FunctionEventType.VIEWER_REQUEST,\n function: rewriteFunction,\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- **Configurable OAC Permissions**: Optional origin access levels for the website bucket\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- **CloudFront Functions**: Optional viewer request and response function associations\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, and Java\n\n## License\n\nDistributed under the [Apache-2.0](./LICENSE) license.\n"
8781
8781
  },
8782
8782
  "repository": {
8783
8783
  "type": "git",
@@ -8785,10 +8785,6 @@
8785
8785
  },
8786
8786
  "schema": "jsii/0.10.0",
8787
8787
  "targets": {
8788
- "dotnet": {
8789
- "namespace": "ThonBecker.CDK.SimpleWebsiteDeploy",
8790
- "packageId": "ThonBecker.CDK.SimpleWebsiteDeploy"
8791
- },
8792
8788
  "java": {
8793
8789
  "maven": {
8794
8790
  "artifactId": "cdk-simplewebsite-deploy",
@@ -9301,6 +9297,6 @@
9301
9297
  "symbolId": "src/cdk-simplewebsite-deploy:CreateCloudfrontSite"
9302
9298
  }
9303
9299
  },
9304
- "version": "2.2.0",
9305
- "fingerprint": "yeQd9tA91lp4f+nTG6wJw9QoxrhxpRgg0wScW2ntHWg="
9300
+ "version": "2.2.1",
9301
+ "fingerprint": "/KRQjRbnbig0EafOxFlK8hUjkZp9j6i3AloaIi6Xgg8="
9306
9302
  }
package/README.md CHANGED
@@ -31,32 +31,6 @@ export class PipelineStack extends cdk.Stack {
31
31
  }
32
32
  }
33
33
  ```
34
- ##### C#
35
- ```console
36
- dotnet add package ThonBecker.CDK.SimpleWebsiteDeploy
37
- ```
38
- ```cs
39
- using Amazon.CDK;
40
- using Constructs;
41
- using ThonBecker.CDK.SimpleWebsiteDeploy;
42
-
43
- namespace SimpleWebsiteDeploy
44
- {
45
- public class PipelineStack : Stack
46
- {
47
- internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
48
- {
49
- new CreateCloudfrontSite(scope, "test-website", new CloudfrontSiteConfiguration()
50
- {
51
- WebsiteFolder = "./src/build",
52
- IndexDoc = "index.html",
53
- HostedZone = "example.com",
54
- SubDomain = "www.example.com",
55
- });
56
- }
57
- }
58
- }
59
- ```
60
34
  ##### Java
61
35
  ```xml
62
36
  <dependency>
@@ -135,31 +109,6 @@ export class PipelineStack extends cdk.Stack {
135
109
  }
136
110
  }
137
111
  ```
138
- ##### C#
139
- ```console
140
- dotnet add package ThonBecker.CDK.SimpleWebsiteDeploy
141
- ```
142
- ```cs
143
- using Amazon.CDK;
144
- using Constructs;
145
- using ThonBecker.CDK.SimpleWebsiteDeploy;
146
-
147
- namespace SimpleWebsiteDeploy
148
- {
149
- public class PipelineStack : Stack
150
- {
151
- internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
152
- {
153
- new CreateBasicSite(scope, "test-website", new BasicSiteConfiguration()
154
- {
155
- WebsiteFolder = "./src/build",
156
- IndexDoc = "index.html",
157
- HostedZone = "example.com",
158
- });
159
- }
160
- }
161
- }
162
- ```
163
112
  ##### Java
164
113
  ```xml
165
114
  <dependency>
@@ -442,7 +391,7 @@ export class AdvancedWebsiteStack extends cdk.Stack {
442
391
  - **Backward Compatible**: All existing configurations continue to work
443
392
  - **Type Safe**: Full TypeScript support with comprehensive interfaces
444
393
  - **CDK v2 Ready**: Built for the latest AWS CDK version
445
- - **Multi-Language**: Support for TypeScript, Python, Java, and C#
394
+ - **Multi-Language**: Support for TypeScript, Python, and Java
446
395
 
447
396
  ## License
448
397
 
@@ -63,7 +63,7 @@ class CreateBasicSite extends constructs_1.Construct {
63
63
  }
64
64
  exports.CreateBasicSite = CreateBasicSite;
65
65
  _a = JSII_RTTI_SYMBOL_1;
66
- CreateBasicSite[_a] = { fqn: "cdk-simplewebsite-deploy.CreateBasicSite", version: "2.2.0" };
66
+ CreateBasicSite[_a] = { fqn: "cdk-simplewebsite-deploy.CreateBasicSite", version: "2.2.1" };
67
67
  class CreateCloudfrontSite extends constructs_1.Construct {
68
68
  constructor(scope, id, props) {
69
69
  super(scope, id);
@@ -209,5 +209,5 @@ class CreateCloudfrontSite extends constructs_1.Construct {
209
209
  }
210
210
  exports.CreateCloudfrontSite = CreateCloudfrontSite;
211
211
  _b = JSII_RTTI_SYMBOL_1;
212
- CreateCloudfrontSite[_b] = { fqn: "cdk-simplewebsite-deploy.CreateCloudfrontSite", version: "2.2.0" };
212
+ CreateCloudfrontSite[_b] = { fqn: "cdk-simplewebsite-deploy.CreateCloudfrontSite", version: "2.2.1" };
213
213
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXNpbXBsZXdlYnNpdGUtZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nkay1zaW1wbGV3ZWJzaXRlLWRlcGxveS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFzRDtBQUN0RCwwREFBMEQ7QUFDMUQseURBQXlEO0FBQ3pELDhEQUE4RDtBQUM5RCxtREFBbUQ7QUFDbkQsMkRBQTJEO0FBQzNELHlDQUF5QztBQUN6QywwREFBMEQ7QUFDMUQsMkNBQXVDO0FBNkd2Qzs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUM1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FDcEQsSUFBSSxFQUNKLG1CQUFtQixFQUNuQjtZQUNFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtTQUM3QixDQUNGLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FDekMsS0FBSyxFQUNMLHVCQUF1QixFQUN2QjtZQUNFLFVBQVUsRUFBRSxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDckMsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUNwQyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGVBQWUsRUFBRTtnQkFDZixRQUFRLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzFCLFFBQVEsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSTthQUNuQztTQUNGLENBQ0YsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFO1lBQzFELFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixhQUFhLEVBQUUsMkJBQWEsQ0FB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QyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FDMUM7YUFDRixDQUFDLENBQUM7WUFFSCw0Q0FBNEM7WUFDNUMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsMkJBQTJCLEVBQUU7b0JBQ3pELElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUztvQkFDM0IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNwQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FDMUM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOztBQTFLSCxvREEyS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgb3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM2RlcGxveSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXNpY1NpdGVDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExvY2FsIHBhdGggdG8gdGhlIHdlYnNpdGUgZm9sZGVyIHlvdSB3YW50IHRvIGRlcGxveSBvbiBTMy5cbiAgICovXG4gIHJlYWRvbmx5IHdlYnNpdGVGb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBkb2N1bWVudCBvZiB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4RG9jOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgZG9jdW1lbnQgb2YgdGhlIHdlYnNpdGUuXG4gICAqIEBkZWZhdWx0IC0gTm8gZXJyb3IgZG9jdW1lbnQuXG4gICAqL1xuICByZWFkb25seSBlcnJvckRvYz86IHN0cmluZztcbiAgLyoqXG4gICAqIEhvc3RlZCBab25lIHVzZWQgdG8gY3JlYXRlIHRoZSBETlMgcmVjb3JkIGZvciB0aGUgd2Vic2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3RlZFpvbmU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250U2l0ZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTG9jYWwgcGF0aCB0byB0aGUgd2Vic2l0ZSBmb2xkZXIgeW91IHdhbnQgdG8gZGVwbG95IG9uIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Vic2l0ZUZvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGluZGV4IGRvY3VtZW50IG9mIHRoZSB3ZWJzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXhEb2M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlcnJvciBkb2N1bWVudCBvZiB0aGUgd2Vic2l0ZS5cbiAgICogQGRlZmF1bHQgLSBObyBlcnJvciBkb2N1bWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yRG9jPzogc3RyaW5nO1xuICAvKipcbiAgICogSG9zdGVkIFpvbmUgdXNlZCB0byBjcmVhdGUgdGhlIEROUyByZWNvcmQgZm9yIHRoZSB3ZWJzaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdGVkWm9uZTogc3RyaW5nO1xuICAvKipcbiAgICogVXNlZCB0byBkZXBsb3kgYSBDbG91ZGZyb250IHNpdGUgd2l0aCBhIHNpbmdsZSBkb21haW4uIGUuZy4gc2FtcGxlLmV4YW1wbGUuY29tXG4gICAqIElmIHlvdSBpbmNsdWRlIGEgdmFsdWUgZm9yIGJvdGggZG9tYWluIGFuZCBzdWJEb21haW4sXG4gICAqIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHZhbHVlXG4gICAqL1xuICByZWFkb25seSBkb21haW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3ViZG9tYWluIG5hbWUgeW91IHdhbnQgdG8gZGVwbG95LiBlLmcuIHd3dy5leGFtcGxlLmNvbVxuICAgKiBJZiB5b3UgaW5jbHVkZSBhIHZhbHVlIGZvciBib3RoIGRvbWFpbiBhbmQgc3ViRG9tYWluLFxuICAgKiBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB2YWx1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3ViRG9tYWluPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHByaWNlIGNsYXNzIGRldGVybWluZXMgaG93IG1hbnkgZWRnZSBsb2NhdGlvbnMgQ2xvdWRGcm9udCB3aWxsIHVzZSBmb3IgeW91ciBkaXN0cmlidXRpb24uXG4gICAqIEBkZWZhdWx0IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLlxuICAgKiBAc2VlIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vY2xvdWRmcm9udC9wcmljaW5nLy5cbiAgICovXG4gIHJlYWRvbmx5IHByaWNlQ2xhc3M/OiBjbG91ZGZyb250LlByaWNlQ2xhc3M7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWNoZSBiZWhhdmlvcnMgZm9yIGRpZmZlcmVudCBwYXRoIHBhdHRlcm5zLlxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgY2FjaGUgYmVoYXZpb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEJlaGF2aW9ycz86IFJlY29yZDxzdHJpbmcsIGNsb3VkZnJvbnQuQmVoYXZpb3JPcHRpb25zPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgQ2xvdWRGcm9udCBPcmlnaW4gQWNjZXNzIENvbnRyb2wgZm9yIHRoZSB3ZWJzaXRlIGJ1Y2tldC5cbiAgICogQGRlZmF1bHQgW2Nsb3VkZnJvbnQuQWNjZXNzTGV2ZWwuUkVBRF1cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkFjY2Vzc0xldmVscz86IGNsb3VkZnJvbnQuQWNjZXNzTGV2ZWxbXTtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRnVuY3Rpb25zIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgKiBAZGVmYXVsdCAtIE5vIENsb3VkRnJvbnQgRnVuY3Rpb24gYXNzb2NpYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Bc3NvY2lhdGlvbnM/OiBjbG91ZGZyb250LkZ1bmN0aW9uQXNzb2NpYXRpb25bXTtcbiAgLyoqXG4gICAqIEVuYWJsZSByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBmb3Igc2VjdXJpdHkgaGVhZGVycy5cbiAgICogQGRlZmF1bHQgZmFsc2UgLSBObyBzZWN1cml0eSBoZWFkZXJzIHBvbGljeSBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlU2VjdXJpdHlIZWFkZXJzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuYWJsZSBJUHY2IHN1cHBvcnQgd2l0aCBBQUFBIHJlY29yZHMuXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gTm8gSVB2NiBzdXBwb3J0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlSXB2Nj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgcmVzcG9uc2VzIGZvciBkaWZmZXJlbnQgSFRUUCBzdGF0dXMgY29kZXMuXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBlcnJvciByZXNwb25zZXMgYmFzZWQgb24gZXJyb3JEb2Mgc2V0dGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUVycm9yUmVzcG9uc2VzPzogY2xvdWRmcm9udC5FcnJvclJlc3BvbnNlW107XG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRGcm9udCBhY2Nlc3MgbG9nZ2luZy5cbiAgICogQGRlZmF1bHQgZmFsc2UgLSBObyBhY2Nlc3MgbG9nZ2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUxvZ2dpbmc/OiBib29sZWFuO1xuICAvKipcbiAgICogUzMgYnVja2V0IGZvciBDbG91ZEZyb250IGFjY2VzcyBsb2dzLiBJZiBub3QgcHJvdmlkZWQgYW5kIGxvZ2dpbmcgaXMgZW5hYmxlZCwgYSBuZXcgYnVja2V0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogQGRlZmF1bHQgLSBOZXcgYnVja2V0IGNyZWF0ZWQgaWYgbG9nZ2luZyBpcyBlbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nc0J1Y2tldD86IHMzLklCdWNrZXQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBXQUYgV2ViIEFDTCBBUk4gZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKiBAZGVmYXVsdCAtIE5vIFdBRiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdlYkFjbElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBDcmVhdGVDbG91ZGZyb250U2l0ZSBpbnN0ZWFkLiBDcmVhdGVCYXNpY1NpdGUgY29uZmlndXJlcyBhIHB1YmxpYyBTMyB3ZWJzaXRlIGVuZHBvaW50LlxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlQmFzaWNTaXRlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhc2ljU2l0ZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaG9zdGVkWm9uZUxvb2t1cCA9IHJvdXRlNTMuSG9zdGVkWm9uZS5mcm9tTG9va3VwKFxuICAgICAgdGhpcyxcbiAgICAgICdXZWJzaXRlSG9zdGVkWm9uZScsXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCB3ZWJzaXRlUmVkaXJlY3RCdWNrZXQgPSBuZXcgczMuQnVja2V0KFxuICAgICAgc2NvcGUsXG4gICAgICAnV2Vic2l0ZVJlZGlyZWN0QnVja2V0JyxcbiAgICAgIHtcbiAgICAgICAgYnVja2V0TmFtZTogYHd3dy4ke3Byb3BzLmhvc3RlZFpvbmV9YCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgd2Vic2l0ZVJlZGlyZWN0OiB7XG4gICAgICAgICAgaG9zdE5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICAgICAgcHJvdG9jb2w6IHMzLlJlZGlyZWN0UHJvdG9jb2wuSFRUUCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHdlYnNpdGVCdWNrZXQgPSBuZXcgczMuQnVja2V0KHNjb3BlLCAnV2Vic2l0ZUJ1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIHdlYnNpdGVJbmRleERvY3VtZW50OiBwcm9wcy5pbmRleERvYyxcbiAgICAgIHdlYnNpdGVFcnJvckRvY3VtZW50OiBwcm9wcy5lcnJvckRvYyxcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2Vzczoge1xuICAgICAgICBibG9ja1B1YmxpY1BvbGljeTogZmFsc2UsXG4gICAgICAgIGJsb2NrUHVibGljQWNsczogZmFsc2UsXG4gICAgICAgIGlnbm9yZVB1YmxpY0FjbHM6IGZhbHNlLFxuICAgICAgICByZXN0cmljdFB1YmxpY0J1Y2tldHM6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICB9KTtcblxuICAgIG5ldyBzM2RlcGxveS5CdWNrZXREZXBsb3ltZW50KHNjb3BlLCAnV2Vic2l0ZURlcGxveScsIHtcbiAgICAgIHNvdXJjZXM6IFtzM2RlcGxveS5Tb3VyY2UuYXNzZXQocHJvcHMud2Vic2l0ZUZvbGRlcildLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHdlYnNpdGVCdWNrZXQsXG4gICAgfSk7XG5cbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHNjb3BlLCAnV2Vic2l0ZUFsaWFzJywge1xuICAgICAgem9uZTogaG9zdGVkWm9uZUxvb2t1cCxcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHRhcmdldHMuQnVja2V0V2Vic2l0ZVRhcmdldCh3ZWJzaXRlQnVja2V0KSxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHNjb3BlLCAnV2Vic2l0ZVJlZGlyZWN0QWxpYXMnLCB7XG4gICAgICB6b25lOiBob3N0ZWRab25lTG9va3VwLFxuICAgICAgcmVjb3JkTmFtZTogYHd3dy4ke3Byb3BzLmhvc3RlZFpvbmV9YCxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgdGFyZ2V0cy5CdWNrZXRXZWJzaXRlVGFyZ2V0KHdlYnNpdGVSZWRpcmVjdEJ1Y2tldCksXG4gICAgICApLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVDbG91ZGZyb250U2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ2xvdWRmcm9udFNpdGVDb25maWd1cmF0aW9uLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzLmRvbWFpbiAmJiBwcm9wcy5zdWJEb21haW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0RvbWFpbiBhbmQgc3ViIGRvbWFpbiBwYXJhbWV0ZXJzIGNhbm5vdCBib3RoIGJlIGRlZmluZWQnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBob3N0ZWRab25lTG9va3VwID0gcm91dGU1My5Ib3N0ZWRab25lLmZyb21Mb29rdXAoXG4gICAgICB0aGlzLFxuICAgICAgJ1dlYnNpdGVIb3N0ZWRab25lJyxcbiAgICAgIHtcbiAgICAgICAgZG9tYWluTmFtZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFVzZSBjdXN0b20gZXJyb3IgcmVzcG9uc2VzIGlmIHByb3ZpZGVkLCBvdGhlcndpc2UgdXNlIGRlZmF1bHQgbG9naWNcbiAgICBjb25zdCBlcnJvclJlc3BvbnNlczogY2xvdWRmcm9udC5FcnJvclJlc3BvbnNlW10gPSBwcm9wcy5jdXN0b21FcnJvclJlc3BvbnNlcyB8fCBbXTtcbiAgICBpZiAoIXByb3BzLmN1c3RvbUVycm9yUmVzcG9uc2VzKSB7XG4gICAgICBpZiAocHJvcHMuZXJyb3JEb2MpIHtcbiAgICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaHR0cFN0YXR1czogNDA0LFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IGAvJHtwcm9wcy5lcnJvckRvY31gLFxuICAgICAgICB9KTtcbiAgICAgICAgZXJyb3JSZXNwb25zZXMucHVzaCh7XG4gICAgICAgICAgaHR0cFN0YXR1czogNDAzLFxuICAgICAgICAgIHJlc3BvbnNlUGFnZVBhdGg6IGAvJHtwcm9wcy5lcnJvckRvY31gLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIGh0dHBTdGF0dXM6IDQwNCxcbiAgICAgICAgICByZXNwb25zZUh0dHBTdGF0dXM6IDIwMCxcbiAgICAgICAgICByZXNwb25zZVBhZ2VQYXRoOiBgLyR7cHJvcHMuaW5kZXhEb2N9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGVycm9yUmVzcG9uc2VzLnB1c2goe1xuICAgICAgICAgIGh0dHBTdGF0dXM6IDQwMyxcbiAgICAgICAgICByZXNwb25zZUh0dHBTdGF0dXM6IDIwMCxcbiAgICAgICAgICByZXNwb25zZVBhZ2VQYXRoOiBgLyR7cHJvcHMuaW5kZXhEb2N9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViamVjdEFsdGVybmF0aXZlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHByb3BzLmRvbWFpbikgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMucHVzaChwcm9wcy5kb21haW4pO1xuICAgIGlmIChwcm9wcy5zdWJEb21haW4pIHN1YmplY3RBbHRlcm5hdGl2ZU5hbWVzLnB1c2gocHJvcHMuc3ViRG9tYWluKTtcblxuICAgIGNvbnN0IHdlYnNpdGVDZXJ0ID0gbmV3IGFjbS5DZXJ0aWZpY2F0ZSh0aGlzLCAnV2Vic2l0ZUNlcnQnLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMsXG4gICAgICB2YWxpZGF0aW9uOiBhY20uQ2VydGlmaWNhdGVWYWxpZGF0aW9uLmZyb21EbnMoaG9zdGVkWm9uZUxvb2t1cCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB3ZWJzaXRlQnVja2V0ID0gbmV3IHMzLkJ1Y2tldChzY29wZSwgJ1dlYnNpdGVCdWNrZXQnLCB7XG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRvbWFpbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChwcm9wcy5kb21haW4pIHtcbiAgICAgIGRvbWFpbk5hbWVzLnB1c2gocHJvcHMuZG9tYWluKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tYWluTmFtZXMucHVzaChwcm9wcy5ob3N0ZWRab25lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuc3ViRG9tYWluKSBkb21haW5OYW1lcy5wdXNoKHByb3BzLnN1YkRvbWFpbik7XG5cbiAgICAvLyBDcmVhdGUgYWNjZXNzIGxvZ3MgYnVja2V0IGlmIGxvZ2dpbmcgaXMgZW5hYmxlZCBidXQgbm8gYnVja2V0IHByb3ZpZGVkXG4gICAgY29uc3QgbG9nc0J1Y2tldCA9IHByb3BzLmVuYWJsZUxvZ2dpbmdcbiAgICAgID8gKHByb3BzLmxvZ3NCdWNrZXQgfHwgbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQWNjZXNzTG9nc0J1Y2tldCcsIHtcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgZW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgfSkpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBzZWN1cml0eSBoZWFkZXJzIHBvbGljeSBpZiBlbmFibGVkXG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzUG9saWN5ID0gcHJvcHMuZW5hYmxlU2VjdXJpdHlIZWFkZXJzXG4gICAgICA/IG5ldyBjbG91ZGZyb250LlJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCAnU2VjdXJpdHlIZWFkZXJzUG9saWN5Jywge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjoge1xuICAgICAgICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgICAgIGZyYW1lT3B0aW9uczogeyBmcmFtZU9wdGlvbjogY2xvdWRmcm9udC5IZWFkZXJzRnJhbWVPcHRpb24uREVOWSwgb3ZlcnJpZGU6IHRydWUgfSxcbiAgICAgICAgICByZWZlcnJlclBvbGljeTogeyByZWZlcnJlclBvbGljeTogY2xvdWRmcm9udC5IZWFkZXJzUmVmZXJyZXJQb2xpY3kuU1RSSUNUX09SSUdJTl9XSEVOX0NST1NTX09SSUdJTiwgb3ZlcnJpZGU6IHRydWUgfSxcbiAgICAgICAgICBzdHJpY3RUcmFuc3BvcnRTZWN1cml0eToge1xuICAgICAgICAgICAgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb24uc2Vjb25kcygzMTUzNjAwMCksXG4gICAgICAgICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgICAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHhzc1Byb3RlY3Rpb246IHsgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlLCBvdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgd2Vic2l0ZURpc3QgPSBuZXcgY2xvdWRmcm9udC5EaXN0cmlidXRpb24oc2NvcGUsICdXZWJzaXRlRGlzdCcsIHtcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBvcmlnaW46IG9yaWdpbnMuUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2wod2Vic2l0ZUJ1Y2tldCwge1xuICAgICAgICAgIG9yaWdpbkFjY2Vzc0xldmVsczogcHJvcHMub3JpZ2luQWNjZXNzTGV2ZWxzLFxuICAgICAgICB9KSxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNsb3VkZnJvbnQuQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNsb3VkZnJvbnQuVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIGNhY2hlUG9saWN5OiBjbG91ZGZyb250LkNhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiBjbG91ZGZyb250Lk9yaWdpblJlcXVlc3RQb2xpY3kuQ09SU19TM19PUklHSU4sXG4gICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHByb3BzLmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMsXG4gICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBjbG91ZGZyb250LlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjbG91ZGZyb250Lkh0dHBWZXJzaW9uLkhUVFAyX0FORF8zLFxuICAgICAgcHJpY2VDbGFzczogcHJvcHMucHJpY2VDbGFzcyA/PyBjbG91ZGZyb250LlByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLFxuICAgICAgZXJyb3JSZXNwb25zZXMsXG4gICAgICBkZWZhdWx0Um9vdE9iamVjdDogcHJvcHMuaW5kZXhEb2MsXG4gICAgICBkb21haW5OYW1lcyxcbiAgICAgIGNlcnRpZmljYXRlOiB3ZWJzaXRlQ2VydCxcbiAgICAgIGxvZ0J1Y2tldDogbG9nc0J1Y2tldCxcbiAgICAgIGxvZ0luY2x1ZGVzQ29va2llczogZmFsc2UsXG4gICAgICB3ZWJBY2xJZDogcHJvcHMud2ViQWNsSWQsXG4gICAgfSk7XG5cbiAgICBuZXcgczNkZXBsb3kuQnVja2V0RGVwbG95bWVudChzY29wZSwgJ1dlYnNpdGVEZXBsb3knLCB7XG4gICAgICBzb3VyY2VzOiBbczNkZXBsb3kuU291cmNlLmFzc2V0KHByb3BzLndlYnNpdGVGb2xkZXIpXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB3ZWJzaXRlQnVja2V0LFxuICAgICAgZGlzdHJpYnV0aW9uOiB3ZWJzaXRlRGlzdCxcbiAgICB9KTtcblxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQoc2NvcGUsICdXZWJzaXRlRG9tYWluQWxpYXMnLCB7XG4gICAgICB6b25lOiBob3N0ZWRab25lTG9va3VwLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluID8gcHJvcHMuZG9tYWluIDogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgdGFyZ2V0cy5DbG91ZEZyb250VGFyZ2V0KHdlYnNpdGVEaXN0KSxcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgSVB2NiBzdXBwb3J0IGlmIGVuYWJsZWRcbiAgICBpZiAocHJvcHMuZW5hYmxlSXB2Nikge1xuICAgICAgbmV3IHJvdXRlNTMuQWFhYVJlY29yZChzY29wZSwgJ1dlYnNpdGVEb21haW5BbGlhc0lwdjYnLCB7XG4gICAgICAgIHpvbmU6IGhvc3RlZFpvbmVMb29rdXAsXG4gICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbiA/IHByb3BzLmRvbWFpbiA6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyB0YXJnZXRzLkNsb3VkRnJvbnRUYXJnZXQod2Vic2l0ZURpc3QpLFxuICAgICAgICApLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnN1YkRvbWFpbikge1xuICAgICAgbmV3IHJvdXRlNTMuQVJlY29yZChzY29wZSwgJ1dlYnNpdGVTdWJEb21haW5BbGlhcycsIHtcbiAgICAgICAgem9uZTogaG9zdGVkWm9uZUxvb2t1cCxcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuc3ViRG9tYWluLFxuICAgICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgICBuZXcgdGFyZ2V0cy5DbG91ZEZyb250VGFyZ2V0KHdlYnNpdGVEaXN0KSxcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgSVB2NiBzdXBwb3J0IGZvciBzdWJkb21haW4gaWYgZW5hYmxlZFxuICAgICAgaWYgKHByb3BzLmVuYWJsZUlwdjYpIHtcbiAgICAgICAgbmV3IHJvdXRlNTMuQWFhYVJlY29yZChzY29wZSwgJ1dlYnNpdGVTdWJEb21haW5BbGlhc0lwdjYnLCB7XG4gICAgICAgICAgem9uZTogaG9zdGVkWm9uZUxvb2t1cCxcbiAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5zdWJEb21haW4sXG4gICAgICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgICAgICBuZXcgdGFyZ2V0cy5DbG91ZEZyb250VGFyZ2V0KHdlYnNpdGVEaXN0KSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -17,7 +17,6 @@
17
17
  "eslint": "npx projen eslint",
18
18
  "package": "npx projen package",
19
19
  "package-all": "npx projen package-all",
20
- "package:dotnet": "npx projen package:dotnet",
21
20
  "package:java": "npx projen package:java",
22
21
  "package:js": "npx projen package:js",
23
22
  "package:python": "npx projen package:python",
@@ -79,7 +78,7 @@
79
78
  "publishConfig": {
80
79
  "access": "public"
81
80
  },
82
- "version": "2.2.0",
81
+ "version": "2.2.1",
83
82
  "jest": {
84
83
  "coverageProvider": "v8",
85
84
  "testMatch": [
@@ -136,10 +135,6 @@
136
135
  "python": {
137
136
  "distName": "cdk-simplewebsite-deploy",
138
137
  "module": "cdk_simplewebsite_deploy"
139
- },
140
- "dotnet": {
141
- "namespace": "ThonBecker.CDK.SimpleWebsiteDeploy",
142
- "packageId": "ThonBecker.CDK.SimpleWebsiteDeploy"
143
138
  }
144
139
  },
145
140
  "tsc": {