s3-secure-bucket 0.1.6 → 0.2.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
@@ -8455,7 +8455,7 @@
8455
8455
  },
8456
8456
  "name": "s3-secure-bucket",
8457
8457
  "readme": {
8458
- "markdown": "# S3 Secure Bucket (AWS CDK v2)\n\n[![GitHub](https://img.shields.io/github/license/gammarers-aws-cdk-resources/s3-secure-bucket?style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/blob/main/LICENSE)\n[![npm version](https://img.shields.io/npm/v/s3-secure-bucket?style=flat-square)](https://www.npmjs.com/package/s3-secure-bucket)\n[![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/gammarers-aws-cdk-resources/s3-secure-bucket/build.yml?branch=main&label=build&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/build.yml)\n[![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/gammarers-aws-cdk-resources/s3-secure-bucket/release.yml?branch=main&label=release&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gammarers-aws-cdk-resources/s3-secure-bucket?sort=semver&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)\n\nAn [AWS CDK](https://aws.amazon.com/cdk/) construct that defines an S3 bucket with security-focused defaults. It wraps the standard `s3.Bucket` and applies settings that follow AWS best practices, so you can create buckets without accidentally leaving them open or unencrypted. You can still override any option or use it as a drop-in replacement where a regular `s3.Bucket` is expected. For CDK pipeline artifact buckets or CloudFront origins, use the `bucketType` option so encryption and resource policies are set appropriately.\n\n## Features\n\n- Security-focused defaults for S3 buckets (private, block public access, enforce SSL)\n- Encryption enabled by default\n- Versioning enabled by default\n- Object ownership enforced by default (`BucketOwnerEnforced`)\n- `RemovalPolicy.RETAIN` by default (prevent accidental deletion)\n- Bucket-type presets via `bucketType` for common production use cases\n - `DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`: CDK pipeline artifact buckets with custom qualifier support\n - `CLOUDFRONT_ORIGIN_BUCKET`: CloudFront origin buckets using S3-managed encryption\n - `ACCESS_LOG_BUCKET`: Centralized access log buckets with minimal log-delivery permissions\n\n## Installation\n\n**npm**\n\n```shell\nnpm install s3-secure-bucket\n```\n\n**yarn**\n\n```shell\nyarn add s3-secure-bucket\n```\n\n## Usage\n\n### Default secure bucket\n\n```typescript\nimport { S3SecureBucket } from 's3-secure-bucket';\n\nconst bucket = new S3SecureBucket(stack, 'S3SecureBucket', {\n bucketName: 'example-secure-bucket',\n});\n```\n\n### Centralized access log bucket (ALB / CloudFront / S3)\n\n```typescript\nimport { S3SecureBucket, S3SecureBucketType } from 's3-secure-bucket';\n\nconst accessLogBucket = new S3SecureBucket(stack, 'AccessLogBucket', {\n bucketType: S3SecureBucketType.ACCESS_LOG_BUCKET,\n});\n```\n\n## Options\n\nThe `S3SecureBucket` constructor accepts `S3SecureBucketProps`. Since it extends `s3.BucketProps`, you can also use standard S3 bucket options such as `bucketName`, `versioned`, and `encryption`.\n\n### S3SecureBucket-specific options\n\n| Property | Type | Default | Description |\n| --- | --- | --- | --- |\n| `bucketType` | `S3SecureBucketType` | `S3SecureBucketType.DEFAULT_BUCKET` | Determines encryption and resource policy behavior. |\n\n### S3SecureBucketType values\n\n| Constant | Use case |\n| --- | --- |\n| `S3SecureBucketType.DEFAULT_BUCKET` | Default bucket when not using a custom qualifier |\n| `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access log bucket for ALB / CloudFront / S3 (RETAIN + minimal log-delivery permissions) |\n| `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (when using a custom qualifier) |\n| `S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET` | CloudFront origin bucket |\n\nSee [API.md](./API.md) for the full API reference.\n\n## Requirements\n\n- Node.js >= 20\n- AWS CDK v2 (`aws-cdk-lib`)\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
8458
+ "markdown": "# S3 Secure Bucket (AWS CDK v2)\n\n[![GitHub](https://img.shields.io/github/license/gammarers-aws-cdk-resources/s3-secure-bucket?style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/blob/main/LICENSE)\n[![npm version](https://img.shields.io/npm/v/s3-secure-bucket?style=flat-square)](https://www.npmjs.com/package/s3-secure-bucket)\n[![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/gammarers-aws-cdk-resources/s3-secure-bucket/build.yml?branch=main&label=build&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/build.yml)\n[![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/gammarers-aws-cdk-resources/s3-secure-bucket/release.yml?branch=main&label=release&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gammarers-aws-cdk-resources/s3-secure-bucket?sort=semver&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)\n\nAWS CDK v2 construct library: an [`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) with security-focused defaults (private ACLs, block public access, TLS-only access, encryption, versioning, `BucketOwnerEnforced`, `RemovalPolicy.RETAIN`). Use `bucketType` for pipeline artifacts, CloudFront origins, and centralized access logs so encryption and bucket policies match each workload.\n\n## Features\n\n- Private access, block public access, and deny insecure transport (`enforceSSL`)\n- **Default bucket**: KMS-managed encryption (`aws:kms`) unless overridden\n- **Log / origin types**: S3-managed encryption (`AES256`) for `ACCESS_LOG_BUCKET` and `CLOUDFRONT_ORIGIN_BUCKET`\n- Versioning on by default; object ownership `BucketOwnerEnforced` by default\n- `RemovalPolicy.RETAIN` on the bucket\n- **`bucketType` presets**\n - **`DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`**: optional `s3:*` grant for the CDK deploy role when using a **non-default** bootstrap qualifier\n - **`CLOUDFRONT_ORIGIN_BUCKET`**: S3-managed encryption for typical origin use\n - **`ACCESS_LOG_BUCKET`**: `s3:PutObject` on `AWSLogs/<account>/*` for ALB/NLB (`logdelivery.elasticloadbalancing.amazonaws.com` + regional **ELBv2 account** from `aws-cdk-lib/region-info` when known), CloudFront standard logging (`delivery.logs.amazonaws.com`), and S3 server access logging (`logging.s3.amazonaws.com`)\n- **`accessLogBucketPolicyDependable`** (access-log buckets only): use with `loadBalancer.node.addDependency(...)` so ALB/NLB access-log enablement runs after the bucket policy exists (avoids validation `PutObject` failures)\n\n## Installation\n\n**npm**\n\n```shell\nnpm install s3-secure-bucket\n```\n\n**yarn**\n\n```shell\nyarn add s3-secure-bucket\n```\n\n## Usage\n\n### Default secure bucket\n\n```typescript\nimport { Stack } from 'aws-cdk-lib';\nimport { S3SecureBucket } from 's3-secure-bucket';\n\ndeclare const stack: Stack;\n\nconst bucket = new S3SecureBucket(stack, 'S3SecureBucket', {\n bucketName: 'example-secure-bucket',\n});\n```\n\n### Centralized access log bucket (ALB / NLB / CloudFront / S3)\n\nFor `ACCESS_LOG_BUCKET`, the stack **`env.region` must be a concrete region** at synthesis time (not a token) so the regional ELBv2 log-delivery account ID can be resolved.\n\n```typescript\nimport { Stack } from 'aws-cdk-lib';\nimport { S3SecureBucket, S3SecureBucketType } from 's3-secure-bucket';\n\ndeclare const stack: Stack;\n\nconst accessLogBucket = new S3SecureBucket(stack, 'AccessLogBucket', {\n bucketType: S3SecureBucketType.ACCESS_LOG_BUCKET,\n});\n\n// After creating your load balancer (e.g. elbv2.ApplicationLoadBalancer), depend on the bucket policy\n// so ELB's validation PutObject runs after the policy exists:\n// loadBalancer.node.addDependency(accessLogBucket.accessLogBucketPolicyDependable!);\n```\n\nWire logging on the load balancer using your normal approach (for example L1 attributes or another construct). This library only configures the **bucket** and its **resource policy**.\n\n## Options\n\n`S3SecureBucket` accepts `S3SecureBucketProps`, which extends [`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html). Standard options such as `bucketName`, `versioned`, `encryption`, and `lifecycleRules` work as usual alongside the secure defaults.\n\n### Construct props (`S3SecureBucketProps`)\n\n| Property | Type | Default | Description |\n| --- | --- | --- | --- |\n| `bucketType` | `S3SecureBucketType` | `DEFAULT_BUCKET` | Selects encryption defaults and optional resource-policy statements. |\n| *(inherited)* | `s3.BucketProps` | — | All other `Bucket` properties are passed through (some receive overrides inside the construct). |\n\n### `S3SecureBucketType` values\n\n| Constant | Use case |\n| --- | --- |\n| `S3SecureBucketType.DEFAULT_BUCKET` | General-purpose secure bucket |\n| `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access logs (`AWSLogs/<account>/*` writers only) |\n| `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (custom bootstrap qualifier) |\n| `S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET` | CloudFront origin bucket |\n\n### Read-only: `accessLogBucketPolicyDependable`\n\n| Property | Type | When set | Description |\n| --- | --- | --- | --- |\n| `accessLogBucketPolicyDependable` | `IDependable \\| undefined` | `bucketType === ACCESS_LOG_BUCKET` | Depend on this from ALB/NLB so access-log configuration waits for the bucket policy resource. |\n\nSee [API.md](./API.md) for the full API reference.\n\n## Requirements\n\n- Node.js >= 20\n- Peer dependencies: `aws-cdk-lib` ^2.232.0, `constructs` ^10.5.1\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
8459
8459
  },
8460
8460
  "repository": {
8461
8461
  "type": "git",
@@ -8472,32 +8472,49 @@
8472
8472
  "assembly": "s3-secure-bucket",
8473
8473
  "base": "aws-cdk-lib.aws_s3.Bucket",
8474
8474
  "docs": {
8475
+ "custom": {
8476
+ "remarks": "- {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET }: may attach a deploy-role policy when a non-default bootstrap qualifier is present.\n- {@link S3SecureBucketType.ACCESS_LOG_BUCKET }: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET } and {@link S3SecureBucket#accessLogBucketPolicyDependable }."
8477
+ },
8478
+ "remarks": "KMS-managed by default otherwise).",
8475
8479
  "stability": "stable",
8476
- "summary": "An S3 bucket with secure defaults: private access, SSL enforced, public access blocked, and encryption required."
8480
+ "summary": "S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access, and encryption (S3-managed for log/origin types;"
8477
8481
  },
8478
8482
  "fqn": "s3-secure-bucket.S3SecureBucket",
8479
8483
  "initializer": {
8480
8484
  "docs": {
8481
- "stability": "stable"
8485
+ "custom": {
8486
+ "throws": "When `bucketType` is {@link S3SecureBucketType.ACCESS_LOG_BUCKET } and {@link Stack#region } is still\nunresolved at synthesis time (a token). Set an explicit `env.region` on the stack so the ELBv2\nlog-delivery account can be looked up."
8487
+ },
8488
+ "stability": "stable",
8489
+ "summary": "Creates a secure S3 bucket according to `bucketType` and merged `props`."
8482
8490
  },
8483
8491
  "locationInModule": {
8484
8492
  "filename": "src/index.ts",
8485
- "line": 49
8493
+ "line": 87
8486
8494
  },
8487
8495
  "parameters": [
8488
8496
  {
8497
+ "docs": {
8498
+ "summary": "- Parent construct, typically a {@link Stack}."
8499
+ },
8489
8500
  "name": "scope",
8490
8501
  "type": {
8491
8502
  "fqn": "constructs.Construct"
8492
8503
  }
8493
8504
  },
8494
8505
  {
8506
+ "docs": {
8507
+ "summary": "- Construct ID (stable logical ID segment)."
8508
+ },
8495
8509
  "name": "id",
8496
8510
  "type": {
8497
8511
  "primitive": "string"
8498
8512
  }
8499
8513
  },
8500
8514
  {
8515
+ "docs": {
8516
+ "summary": "- Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true)."
8517
+ },
8501
8518
  "name": "props",
8502
8519
  "optional": true,
8503
8520
  "type": {
@@ -8509,18 +8526,38 @@
8509
8526
  "kind": "class",
8510
8527
  "locationInModule": {
8511
8528
  "filename": "src/index.ts",
8512
- "line": 48
8529
+ "line": 65
8513
8530
  },
8514
8531
  "name": "S3SecureBucket",
8532
+ "properties": [
8533
+ {
8534
+ "docs": {
8535
+ "default": "undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET }.",
8536
+ "remarks": "Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.",
8537
+ "stability": "stable",
8538
+ "summary": "Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet)."
8539
+ },
8540
+ "immutable": true,
8541
+ "locationInModule": {
8542
+ "filename": "src/index.ts",
8543
+ "line": 75
8544
+ },
8545
+ "name": "accessLogBucketPolicyDependable",
8546
+ "optional": true,
8547
+ "type": {
8548
+ "fqn": "constructs.IDependable"
8549
+ }
8550
+ }
8551
+ ],
8515
8552
  "symbolId": "src/index:S3SecureBucket"
8516
8553
  },
8517
8554
  "s3-secure-bucket.S3SecureBucketProps": {
8518
8555
  "assembly": "s3-secure-bucket",
8519
8556
  "datatype": true,
8520
8557
  "docs": {
8521
- "remarks": "Extends `s3.BucketProps` with a bucket type for secure defaults.",
8558
+ "remarks": "Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.",
8522
8559
  "stability": "stable",
8523
- "summary": "Props for {@link S3SecureBucket}."
8560
+ "summary": "Construction properties for {@link S3SecureBucket}."
8524
8561
  },
8525
8562
  "fqn": "s3-secure-bucket.S3SecureBucketProps",
8526
8563
  "interfaces": [
@@ -8529,22 +8566,21 @@
8529
8566
  "kind": "interface",
8530
8567
  "locationInModule": {
8531
8568
  "filename": "src/index.ts",
8532
- "line": 36
8569
+ "line": 47
8533
8570
  },
8534
8571
  "name": "S3SecureBucketProps",
8535
8572
  "properties": [
8536
8573
  {
8537
8574
  "abstract": true,
8538
8575
  "docs": {
8539
- "default": "S3SecureBucketType.DEFAULT_BUCKET",
8540
- "remarks": "Determines encryption and resource policy behavior.",
8576
+ "default": "{@link S3SecureBucketType.DEFAULT_BUCKET }",
8541
8577
  "stability": "stable",
8542
- "summary": "The type of the bucket."
8578
+ "summary": "Selects encryption defaults and optional resource-policy statements."
8543
8579
  },
8544
8580
  "immutable": true,
8545
8581
  "locationInModule": {
8546
8582
  "filename": "src/index.ts",
8547
- "line": 42
8583
+ "line": 54
8548
8584
  },
8549
8585
  "name": "bucketType",
8550
8586
  "optional": true,
@@ -8556,6 +8592,6 @@
8556
8592
  "symbolId": "src/index:S3SecureBucketProps"
8557
8593
  }
8558
8594
  },
8559
- "version": "0.1.6",
8560
- "fingerprint": "0kEfMWeqRChTf87wSYgg0YgUuUKNes2RMuHCmJaDU2g="
8595
+ "version": "0.2.0",
8596
+ "fingerprint": "Ht6LYIYa0vvHfka5IN32G2kE8LjBCfliqaLDP8kYkQU="
8561
8597
  }
package/API.md CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  ### S3SecureBucket <a name="S3SecureBucket" id="s3-secure-bucket.S3SecureBucket"></a>
6
6
 
7
- An S3 bucket with secure defaults: private access, SSL enforced, public access blocked, and encryption required.
7
+ S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access, and encryption (S3-managed for log/origin types;
8
+
9
+ KMS-managed by default otherwise).
8
10
 
9
11
  #### Initializers <a name="Initializers" id="s3-secure-bucket.S3SecureBucket.Initializer"></a>
10
12
 
@@ -16,9 +18,9 @@ new S3SecureBucket(scope: Construct, id: string, props?: S3SecureBucketProps)
16
18
 
17
19
  | **Name** | **Type** | **Description** |
18
20
  | --- | --- | --- |
19
- | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
20
- | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
21
- | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> | *No description.* |
21
+ | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | - Parent construct, typically a {@link Stack}. |
22
+ | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.id">id</a></code> | <code>string</code> | - Construct ID (stable logical ID segment). |
23
+ | <code><a href="#s3-secure-bucket.S3SecureBucket.Initializer.parameter.props">props</a></code> | <code><a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a></code> | - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true). |
22
24
 
23
25
  ---
24
26
 
@@ -26,18 +28,24 @@ new S3SecureBucket(scope: Construct, id: string, props?: S3SecureBucketProps)
26
28
 
27
29
  - *Type:* constructs.Construct
28
30
 
31
+ Parent construct, typically a {@link Stack}.
32
+
29
33
  ---
30
34
 
31
35
  ##### `id`<sup>Required</sup> <a name="id" id="s3-secure-bucket.S3SecureBucket.Initializer.parameter.id"></a>
32
36
 
33
37
  - *Type:* string
34
38
 
39
+ Construct ID (stable logical ID segment).
40
+
35
41
  ---
36
42
 
37
43
  ##### `props`<sup>Optional</sup> <a name="props" id="s3-secure-bucket.S3SecureBucket.Initializer.parameter.props"></a>
38
44
 
39
45
  - *Type:* <a href="#s3-secure-bucket.S3SecureBucketProps">S3SecureBucketProps</a>
40
46
 
47
+ Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
48
+
41
49
  ---
42
50
 
43
51
  #### Methods <a name="Methods" id="Methods"></a>
@@ -1085,6 +1093,7 @@ allow legacy bucket naming style, default is false.
1085
1093
  | <code><a href="#s3-secure-bucket.S3SecureBucket.property.disallowPublicAccess">disallowPublicAccess</a></code> | <code>boolean</code> | Whether to disallow public access. |
1086
1094
  | <code><a href="#s3-secure-bucket.S3SecureBucket.property.policy">policy</a></code> | <code>aws-cdk-lib.aws_s3.BucketPolicy</code> | The resource policy associated with this bucket. |
1087
1095
  | <code><a href="#s3-secure-bucket.S3SecureBucket.property.replicationRoleArn">replicationRoleArn</a></code> | <code>string</code> | Role used to set up permissions on this bucket for replication. |
1096
+ | <code><a href="#s3-secure-bucket.S3SecureBucket.property.accessLogBucketPolicyDependable">accessLogBucketPolicyDependable</a></code> | <code>constructs.IDependable</code> | Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet). |
1088
1097
 
1089
1098
  ---
1090
1099
 
@@ -1303,6 +1312,21 @@ Role used to set up permissions on this bucket for replication.
1303
1312
 
1304
1313
  ---
1305
1314
 
1315
+ ##### `accessLogBucketPolicyDependable`<sup>Optional</sup> <a name="accessLogBucketPolicyDependable" id="s3-secure-bucket.S3SecureBucket.property.accessLogBucketPolicyDependable"></a>
1316
+
1317
+ ```typescript
1318
+ public readonly accessLogBucketPolicyDependable: IDependable;
1319
+ ```
1320
+
1321
+ - *Type:* constructs.IDependable
1322
+ - *Default:* undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET }.
1323
+
1324
+ Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}. Use as a dependency target so load balancer access-log enablement runs after the bucket policy exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet).
1325
+
1326
+ Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.
1327
+
1328
+ ---
1329
+
1306
1330
  #### Constants <a name="Constants" id="Constants"></a>
1307
1331
 
1308
1332
  | **Name** | **Type** | **Description** |
@@ -1327,9 +1351,9 @@ Uniquely identifies this class.
1327
1351
 
1328
1352
  ### S3SecureBucketProps <a name="S3SecureBucketProps" id="s3-secure-bucket.S3SecureBucketProps"></a>
1329
1353
 
1330
- Props for {@link S3SecureBucket}.
1354
+ Construction properties for {@link S3SecureBucket}.
1331
1355
 
1332
- Extends `s3.BucketProps` with a bucket type for secure defaults.
1356
+ Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.
1333
1357
 
1334
1358
  #### Initializer <a name="Initializer" id="s3-secure-bucket.S3SecureBucketProps.Initializer"></a>
1335
1359
 
@@ -1377,7 +1401,7 @@ const s3SecureBucketProps: S3SecureBucketProps = { ... }
1377
1401
  | <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteIndexDocument">websiteIndexDocument</a></code> | <code>string</code> | The name of the index document (e.g. "index.html") for the website. Enables static website hosting for this bucket. |
1378
1402
  | <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteRedirect">websiteRedirect</a></code> | <code>aws-cdk-lib.aws_s3.RedirectTarget</code> | Specifies the redirect behavior of all requests to a website endpoint of a bucket. |
1379
1403
  | <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.websiteRoutingRules">websiteRoutingRules</a></code> | <code>aws-cdk-lib.aws_s3.RoutingRule[]</code> | Rules that define when a redirect is applied and the redirect behavior. |
1380
- | <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.bucketType">bucketType</a></code> | <code>string</code> | The type of the bucket. |
1404
+ | <code><a href="#s3-secure-bucket.S3SecureBucketProps.property.bucketType">bucketType</a></code> | <code>string</code> | Selects encryption defaults and optional resource-policy statements. |
1381
1405
 
1382
1406
  ---
1383
1407
 
@@ -1898,11 +1922,9 @@ public readonly bucketType: string;
1898
1922
  ```
1899
1923
 
1900
1924
  - *Type:* string
1901
- - *Default:* S3SecureBucketType.DEFAULT_BUCKET
1902
-
1903
- The type of the bucket.
1925
+ - *Default:* {@link S3SecureBucketType.DEFAULT_BUCKET }
1904
1926
 
1905
- Determines encryption and resource policy behavior.
1927
+ Selects encryption defaults and optional resource-policy statements.
1906
1928
 
1907
1929
  ---
1908
1930
 
package/README.md CHANGED
@@ -6,19 +6,20 @@
6
6
  [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/gammarers-aws-cdk-resources/s3-secure-bucket/release.yml?branch=main&label=release&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/actions/workflows/release.yml)
7
7
  [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gammarers-aws-cdk-resources/s3-secure-bucket?sort=semver&style=flat-square)](https://github.com/gammarers-aws-cdk-resources/s3-secure-bucket/releases)
8
8
 
9
- An [AWS CDK](https://aws.amazon.com/cdk/) construct that defines an S3 bucket with security-focused defaults. It wraps the standard `s3.Bucket` and applies settings that follow AWS best practices, so you can create buckets without accidentally leaving them open or unencrypted. You can still override any option or use it as a drop-in replacement where a regular `s3.Bucket` is expected. For CDK pipeline artifact buckets or CloudFront origins, use the `bucketType` option so encryption and resource policies are set appropriately.
9
+ AWS CDK v2 construct library: an [`s3.Bucket`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html) with security-focused defaults (private ACLs, block public access, TLS-only access, encryption, versioning, `BucketOwnerEnforced`, `RemovalPolicy.RETAIN`). Use `bucketType` for pipeline artifacts, CloudFront origins, and centralized access logs so encryption and bucket policies match each workload.
10
10
 
11
11
  ## Features
12
12
 
13
- - Security-focused defaults for S3 buckets (private, block public access, enforce SSL)
14
- - Encryption enabled by default
15
- - Versioning enabled by default
16
- - Object ownership enforced by default (`BucketOwnerEnforced`)
17
- - `RemovalPolicy.RETAIN` by default (prevent accidental deletion)
18
- - Bucket-type presets via `bucketType` for common production use cases
19
- - `DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`: CDK pipeline artifact buckets with custom qualifier support
20
- - `CLOUDFRONT_ORIGIN_BUCKET`: CloudFront origin buckets using S3-managed encryption
21
- - `ACCESS_LOG_BUCKET`: Centralized access log buckets with minimal log-delivery permissions
13
+ - Private access, block public access, and deny insecure transport (`enforceSSL`)
14
+ - **Default bucket**: KMS-managed encryption (`aws:kms`) unless overridden
15
+ - **Log / origin types**: S3-managed encryption (`AES256`) for `ACCESS_LOG_BUCKET` and `CLOUDFRONT_ORIGIN_BUCKET`
16
+ - Versioning on by default; object ownership `BucketOwnerEnforced` by default
17
+ - `RemovalPolicy.RETAIN` on the bucket
18
+ - **`bucketType` presets**
19
+ - **`DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET`**: optional `s3:*` grant for the CDK deploy role when using a **non-default** bootstrap qualifier
20
+ - **`CLOUDFRONT_ORIGIN_BUCKET`**: S3-managed encryption for typical origin use
21
+ - **`ACCESS_LOG_BUCKET`**: `s3:PutObject` on `AWSLogs/<account>/*` for ALB/NLB (`logdelivery.elasticloadbalancing.amazonaws.com` + regional **ELBv2 account** from `aws-cdk-lib/region-info` when known), CloudFront standard logging (`delivery.logs.amazonaws.com`), and S3 server access logging (`logging.s3.amazonaws.com`)
22
+ - **`accessLogBucketPolicyDependable`** (access-log buckets only): use with `loadBalancer.node.addDependency(...)` so ALB/NLB access-log enablement runs after the bucket policy exists (avoids validation `PutObject` failures)
22
23
 
23
24
  ## Installation
24
25
 
@@ -39,48 +40,69 @@ yarn add s3-secure-bucket
39
40
  ### Default secure bucket
40
41
 
41
42
  ```typescript
43
+ import { Stack } from 'aws-cdk-lib';
42
44
  import { S3SecureBucket } from 's3-secure-bucket';
43
45
 
46
+ declare const stack: Stack;
47
+
44
48
  const bucket = new S3SecureBucket(stack, 'S3SecureBucket', {
45
49
  bucketName: 'example-secure-bucket',
46
50
  });
47
51
  ```
48
52
 
49
- ### Centralized access log bucket (ALB / CloudFront / S3)
53
+ ### Centralized access log bucket (ALB / NLB / CloudFront / S3)
54
+
55
+ For `ACCESS_LOG_BUCKET`, the stack **`env.region` must be a concrete region** at synthesis time (not a token) so the regional ELBv2 log-delivery account ID can be resolved.
50
56
 
51
57
  ```typescript
58
+ import { Stack } from 'aws-cdk-lib';
52
59
  import { S3SecureBucket, S3SecureBucketType } from 's3-secure-bucket';
53
60
 
61
+ declare const stack: Stack;
62
+
54
63
  const accessLogBucket = new S3SecureBucket(stack, 'AccessLogBucket', {
55
64
  bucketType: S3SecureBucketType.ACCESS_LOG_BUCKET,
56
65
  });
66
+
67
+ // After creating your load balancer (e.g. elbv2.ApplicationLoadBalancer), depend on the bucket policy
68
+ // so ELB's validation PutObject runs after the policy exists:
69
+ // loadBalancer.node.addDependency(accessLogBucket.accessLogBucketPolicyDependable!);
57
70
  ```
58
71
 
72
+ Wire logging on the load balancer using your normal approach (for example L1 attributes or another construct). This library only configures the **bucket** and its **resource policy**.
73
+
59
74
  ## Options
60
75
 
61
- The `S3SecureBucket` constructor accepts `S3SecureBucketProps`. Since it extends `s3.BucketProps`, you can also use standard S3 bucket options such as `bucketName`, `versioned`, and `encryption`.
76
+ `S3SecureBucket` accepts `S3SecureBucketProps`, which extends [`s3.BucketProps`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.BucketProps.html). Standard options such as `bucketName`, `versioned`, `encryption`, and `lifecycleRules` work as usual alongside the secure defaults.
62
77
 
63
- ### S3SecureBucket-specific options
78
+ ### Construct props (`S3SecureBucketProps`)
64
79
 
65
80
  | Property | Type | Default | Description |
66
81
  | --- | --- | --- | --- |
67
- | `bucketType` | `S3SecureBucketType` | `S3SecureBucketType.DEFAULT_BUCKET` | Determines encryption and resource policy behavior. |
82
+ | `bucketType` | `S3SecureBucketType` | `DEFAULT_BUCKET` | Selects encryption defaults and optional resource-policy statements. |
83
+ | *(inherited)* | `s3.BucketProps` | — | All other `Bucket` properties are passed through (some receive overrides inside the construct). |
68
84
 
69
- ### S3SecureBucketType values
85
+ ### `S3SecureBucketType` values
70
86
 
71
87
  | Constant | Use case |
72
88
  | --- | --- |
73
- | `S3SecureBucketType.DEFAULT_BUCKET` | Default bucket when not using a custom qualifier |
74
- | `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access log bucket for ALB / CloudFront / S3 (RETAIN + minimal log-delivery permissions) |
75
- | `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (when using a custom qualifier) |
89
+ | `S3SecureBucketType.DEFAULT_BUCKET` | General-purpose secure bucket |
90
+ | `S3SecureBucketType.ACCESS_LOG_BUCKET` | Centralized access logs (`AWSLogs/<account>/*` writers only) |
91
+ | `S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET` | CDK pipeline artifact bucket (custom bootstrap qualifier) |
76
92
  | `S3SecureBucketType.CLOUDFRONT_ORIGIN_BUCKET` | CloudFront origin bucket |
77
93
 
94
+ ### Read-only: `accessLogBucketPolicyDependable`
95
+
96
+ | Property | Type | When set | Description |
97
+ | --- | --- | --- | --- |
98
+ | `accessLogBucketPolicyDependable` | `IDependable \| undefined` | `bucketType === ACCESS_LOG_BUCKET` | Depend on this from ALB/NLB so access-log configuration waits for the bucket policy resource. |
99
+
78
100
  See [API.md](./API.md) for the full API reference.
79
101
 
80
102
  ## Requirements
81
103
 
82
104
  - Node.js >= 20
83
- - AWS CDK v2 (`aws-cdk-lib`)
105
+ - Peer dependencies: `aws-cdk-lib` ^2.232.0, `constructs` ^10.5.1
84
106
 
85
107
  ## License
86
108
 
package/lib/index.d.ts CHANGED
@@ -1,43 +1,79 @@
1
1
  import * as s3 from 'aws-cdk-lib/aws-s3';
2
- import { Construct } from 'constructs';
2
+ import { Construct, IDependable } from 'constructs';
3
3
  /**
4
- * Bucket type constants. Use these values for the {@link S3SecureBucketProps.bucketType} property.
4
+ * Bucket type discriminator values for {@link S3SecureBucketProps.bucketType}.
5
+ *
6
+ * @see {@link S3SecureBucketProps.bucketType}
5
7
  */
6
8
  export declare const S3SecureBucketType: {
7
9
  /**
8
- * Select when using this bucket as the CDK pipeline artifact bucket with a custom Qualifier
9
- * (single-region or multi-region deployment).
10
+ * Pipeline artifact bucket when using a custom CDK bootstrap qualifier
11
+ * (single- or multi-region deployments).
10
12
  */
11
13
  readonly DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET: "DeploymentPipelineArtifactBucket";
12
14
  /**
13
- * Select when using this bucket as the CloudFront origin.
15
+ * Origin bucket for CloudFront distributions.
14
16
  */
15
17
  readonly CLOUDFRONT_ORIGIN_BUCKET: "CloudFrontOriginBucket";
16
18
  /**
17
- * Select for the default bucket when not using a custom Qualifier.
19
+ * General-purpose secure bucket (default qualifier / standard use).
18
20
  */
19
21
  readonly DEFAULT_BUCKET: "DefaultBucket";
20
22
  /**
21
- * Select when using this bucket as a centralized access log bucket
22
- * for ALB, CloudFront, S3 server access logging, and similar producers.
23
+ * Centralized access logs for producers such as ALB/NLB, CloudFront standard logging (v2),
24
+ * and S3 server access logging. Grants `s3:PutObject` on `AWSLogs/<account>/*` only (no read/list).
25
+ *
26
+ * For {@link S3SecureBucketType.ACCESS_LOG_BUCKET}, the stack {@link Stack#region} must be a
27
+ * concrete region string at synthesis time so the regional ELBv2 log-delivery account ID can be
28
+ * resolved from `aws-cdk-lib/region-info` (legacy path alongside the log delivery service principal).
23
29
  */
24
30
  readonly ACCESS_LOG_BUCKET: "AccessLogBucket";
25
31
  };
26
- /** Bucket type: one of the {@link S3SecureBucketType} constant values. */
32
+ /**
33
+ * Discriminated union of {@link S3SecureBucketType} string literals.
34
+ */
27
35
  export type S3SecureBucketType = typeof S3SecureBucketType[keyof typeof S3SecureBucketType];
28
36
  /**
29
- * Props for {@link S3SecureBucket}. Extends `s3.BucketProps` with a bucket type for secure defaults.
37
+ * Construction properties for {@link S3SecureBucket}.
38
+ *
39
+ * Extends {@link s3.BucketProps}; several fields receive secure defaults inside the construct.
30
40
  */
31
41
  export interface S3SecureBucketProps extends s3.BucketProps {
32
42
  /**
33
- * The type of the bucket. Determines encryption and resource policy behavior.
34
- * @default S3SecureBucketType.DEFAULT_BUCKET
43
+ * Selects encryption defaults and optional resource-policy statements.
44
+ *
45
+ * @default {@link S3SecureBucketType.DEFAULT_BUCKET}
35
46
  */
36
47
  readonly bucketType?: S3SecureBucketType;
37
48
  }
38
49
  /**
39
- * An S3 bucket with secure defaults: private access, SSL enforced, public access blocked, and encryption required.
50
+ * S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access,
51
+ * and encryption (S3-managed for log/origin types; KMS-managed by default otherwise).
52
+ *
53
+ * @remarks
54
+ * - {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET}: may attach a deploy-role policy when a non-default bootstrap qualifier is present.
55
+ * - {@link S3SecureBucketType.ACCESS_LOG_BUCKET}: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link S3SecureBucket#accessLogBucketPolicyDependable}.
40
56
  */
41
57
  export declare class S3SecureBucket extends s3.Bucket {
58
+ /**
59
+ * Set only when {@link S3SecureBucketProps.bucketType} is {@link S3SecureBucketType.ACCESS_LOG_BUCKET}.
60
+ * Use as a dependency target so load balancer access-log enablement runs after the bucket policy
61
+ * exists (ELB performs an immediate validation `PutObject` that fails if the policy is not applied yet).
62
+ *
63
+ * Example: `loadBalancer.node.addDependency(bucket.accessLogBucketPolicyDependable!)`.
64
+ *
65
+ * @default undefined when `bucketType` is not {@link S3SecureBucketType.ACCESS_LOG_BUCKET}.
66
+ */
67
+ readonly accessLogBucketPolicyDependable?: IDependable;
68
+ /**
69
+ * Creates a secure S3 bucket according to `bucketType` and merged `props`.
70
+ *
71
+ * @param scope - Parent construct, typically a {@link Stack}.
72
+ * @param id - Construct ID (stable logical ID segment).
73
+ * @param props - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
74
+ * @throws When `bucketType` is {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link Stack#region} is still
75
+ * unresolved at synthesis time (a token). Set an explicit `env.region` on the stack so the ELBv2
76
+ * log-delivery account can be looked up.
77
+ */
42
78
  constructor(scope: Construct, id: string, props?: S3SecureBucketProps);
43
79
  }
package/lib/index.js CHANGED
@@ -6,33 +6,55 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const iam = require("aws-cdk-lib/aws-iam");
8
8
  const s3 = require("aws-cdk-lib/aws-s3");
9
+ const region_info_1 = require("aws-cdk-lib/region-info");
9
10
  /**
10
- * Bucket type constants. Use these values for the {@link S3SecureBucketProps.bucketType} property.
11
+ * Bucket type discriminator values for {@link S3SecureBucketProps.bucketType}.
12
+ *
13
+ * @see {@link S3SecureBucketProps.bucketType}
11
14
  */
12
15
  exports.S3SecureBucketType = {
13
16
  /**
14
- * Select when using this bucket as the CDK pipeline artifact bucket with a custom Qualifier
15
- * (single-region or multi-region deployment).
17
+ * Pipeline artifact bucket when using a custom CDK bootstrap qualifier
18
+ * (single- or multi-region deployments).
16
19
  */
17
20
  DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET: 'DeploymentPipelineArtifactBucket',
18
21
  /**
19
- * Select when using this bucket as the CloudFront origin.
22
+ * Origin bucket for CloudFront distributions.
20
23
  */
21
24
  CLOUDFRONT_ORIGIN_BUCKET: 'CloudFrontOriginBucket',
22
25
  /**
23
- * Select for the default bucket when not using a custom Qualifier.
26
+ * General-purpose secure bucket (default qualifier / standard use).
24
27
  */
25
28
  DEFAULT_BUCKET: 'DefaultBucket',
26
29
  /**
27
- * Select when using this bucket as a centralized access log bucket
28
- * for ALB, CloudFront, S3 server access logging, and similar producers.
30
+ * Centralized access logs for producers such as ALB/NLB, CloudFront standard logging (v2),
31
+ * and S3 server access logging. Grants `s3:PutObject` on `AWSLogs/<account>/*` only (no read/list).
32
+ *
33
+ * For {@link S3SecureBucketType.ACCESS_LOG_BUCKET}, the stack {@link Stack#region} must be a
34
+ * concrete region string at synthesis time so the regional ELBv2 log-delivery account ID can be
35
+ * resolved from `aws-cdk-lib/region-info` (legacy path alongside the log delivery service principal).
29
36
  */
30
37
  ACCESS_LOG_BUCKET: 'AccessLogBucket',
31
38
  };
32
39
  /**
33
- * An S3 bucket with secure defaults: private access, SSL enforced, public access blocked, and encryption required.
40
+ * S3 bucket with opinionated secure defaults: private ACLs, block public access, TLS-only access,
41
+ * and encryption (S3-managed for log/origin types; KMS-managed by default otherwise).
42
+ *
43
+ * @remarks
44
+ * - {@link S3SecureBucketType.DEPLOYMENT_PIPELINE_ARTIFACT_BUCKET}: may attach a deploy-role policy when a non-default bootstrap qualifier is present.
45
+ * - {@link S3SecureBucketType.ACCESS_LOG_BUCKET}: adds log-writer principals; see {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link S3SecureBucket#accessLogBucketPolicyDependable}.
34
46
  */
35
47
  class S3SecureBucket extends s3.Bucket {
48
+ /**
49
+ * Creates a secure S3 bucket according to `bucketType` and merged `props`.
50
+ *
51
+ * @param scope - Parent construct, typically a {@link Stack}.
52
+ * @param id - Construct ID (stable logical ID segment).
53
+ * @param props - Optional {@link s3.BucketProps} plus {@link S3SecureBucketProps.bucketType} and `eventBridgeEnabled` (applied via L1 override when true).
54
+ * @throws When `bucketType` is {@link S3SecureBucketType.ACCESS_LOG_BUCKET} and {@link Stack#region} is still
55
+ * unresolved at synthesis time (a token). Set an explicit `env.region` on the stack so the ELBv2
56
+ * log-delivery account can be looked up.
57
+ */
36
58
  constructor(scope, id, props) {
37
59
  const bucketType = props?.bucketType || exports.S3SecureBucketType.DEFAULT_BUCKET;
38
60
  super(scope, id, {
@@ -86,8 +108,9 @@ class S3SecureBucket extends s3.Bucket {
86
108
  }
87
109
  }
88
110
  if (bucketType === exports.S3SecureBucketType.ACCESS_LOG_BUCKET) {
89
- // Allow ALB / NLB log delivery to put objects (no read or list)
90
- this.addToResourcePolicy(new iam.PolicyStatement({
111
+ const awsLogsPrefixResource = `${this.bucketArn}/AWSLogs/${account}/*`;
112
+ // Allow ALB / NLB log delivery (modern service principal path; also required in opt-in regions).
113
+ const albLogDeliveryPolicyResult = this.addToResourcePolicy(new iam.PolicyStatement({
91
114
  effect: iam.Effect.ALLOW,
92
115
  principals: [
93
116
  new iam.ServicePrincipal('logdelivery.elasticloadbalancing.amazonaws.com'),
@@ -96,9 +119,31 @@ class S3SecureBucket extends s3.Bucket {
96
119
  's3:PutObject',
97
120
  ],
98
121
  resources: [
99
- `${this.bucketArn}/AWSLogs/${account}/*`,
122
+ awsLogsPrefixResource,
100
123
  ],
101
124
  }));
125
+ // In non–opt-in regions (for example ap-northeast-1), access logs are often delivered using the
126
+ // regional ELBv2 account (root of that account) for s3:PutObject, not only the service principal above.
127
+ if (aws_cdk_lib_1.Token.isUnresolved(region)) {
128
+ throw new Error('S3SecureBucket ACCESS_LOG_BUCKET: cannot resolve ELBv2 log delivery account (stack region is a token). ' +
129
+ 'Set a concrete `env.region` on the stack.');
130
+ }
131
+ const elbAccountId = region_info_1.RegionInfo.get(region).elbv2Account;
132
+ if (elbAccountId) {
133
+ this.addToResourcePolicy(new iam.PolicyStatement({
134
+ effect: iam.Effect.ALLOW,
135
+ principals: [
136
+ new iam.AccountPrincipal(elbAccountId),
137
+ ],
138
+ actions: [
139
+ 's3:PutObject',
140
+ ],
141
+ resources: [
142
+ awsLogsPrefixResource,
143
+ ],
144
+ }));
145
+ }
146
+ this.accessLogBucketPolicyDependable = albLogDeliveryPolicyResult.policyDependable ?? this;
102
147
  // Allow CloudFront standard logging (v2) to write logs
103
148
  this.addToResourcePolicy(new iam.PolicyStatement({
104
149
  effect: iam.Effect.ALLOW,
@@ -109,7 +154,7 @@ class S3SecureBucket extends s3.Bucket {
109
154
  's3:PutObject',
110
155
  ],
111
156
  resources: [
112
- `${this.bucketArn}/AWSLogs/${account}/*`,
157
+ awsLogsPrefixResource,
113
158
  ],
114
159
  }));
115
160
  // Allow S3 server access logging to write logs when required by configuration
@@ -122,7 +167,7 @@ class S3SecureBucket extends s3.Bucket {
122
167
  's3:PutObject',
123
168
  ],
124
169
  resources: [
125
- `${this.bucketArn}/AWSLogs/${account}/*`,
170
+ awsLogsPrefixResource,
126
171
  ],
127
172
  }));
128
173
  }
@@ -130,5 +175,5 @@ class S3SecureBucket extends s3.Bucket {
130
175
  }
131
176
  exports.S3SecureBucket = S3SecureBucket;
132
177
  _a = JSII_RTTI_SYMBOL_1;
133
- S3SecureBucket[_a] = { fqn: "s3-secure-bucket.S3SecureBucket", version: "0.1.6" };
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEU7QUFDNUUsMkNBQTJDO0FBQzNDLHlDQUF5QztBQUd6Qzs7R0FFRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEM7OztPQUdHO0lBQ0gsbUNBQW1DLEVBQUUsa0NBQWtDO0lBQ3ZFOztPQUVHO0lBQ0gsd0JBQXdCLEVBQUUsd0JBQXdCO0lBQ2xEOztPQUVHO0lBQ0gsY0FBYyxFQUFFLGVBQWU7SUFDL0I7OztPQUdHO0lBQ0gsaUJBQWlCLEVBQUUsaUJBQWlCO0NBQzVCLENBQUM7QUFpQlg7O0dBRUc7QUFDSCxNQUFhLGNBQWUsU0FBUSxFQUFFLENBQUMsTUFBTTtJQUMzQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksMEJBQWtCLENBQUMsY0FBYyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsYUFBYSxFQUFFLDJCQUFhLENBQUMsTUFBTTtZQUNuQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksVUFBVSxLQUFLLDBCQUFrQixDQUFDLHdCQUF3QixJQUFJLFVBQVUsS0FBSywwQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN0SCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDOUQsQ0FBQyxDQUFDLEVBQUU7WUFDSixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7b0JBQzFCLE9BQU8s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QWdCLENBQUMsNkJBQTZCLENBQUM7aUJBQ3hEO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxjQUFjO2lCQUNmO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxHQUFHLElBQUksQ0FBQyxTQUFTLFlBQVksT0FBTyxJQUFJO2lCQUN6QzthQUNGLENBQUMsQ0FBQyxDQUFDO1lBRUosOEVBQThFO1lBQzlFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQy9DLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQ3hCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztpQkFDckQ7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLGNBQWM7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWSxPQUFPLElBQUk7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQzs7QUF0R0gsd0NBdUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdFN0YWNrU3ludGhlc2l6ZXIsIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIEJ1Y2tldCB0eXBlIGNvbnN0YW50cy4gVXNlIHRoZXNlIHZhbHVlcyBmb3IgdGhlIHtAbGluayBTM1NlY3VyZUJ1Y2tldFByb3BzLmJ1Y2tldFR5cGV9IHByb3BlcnR5LlxuICovXG5leHBvcnQgY29uc3QgUzNTZWN1cmVCdWNrZXRUeXBlID0ge1xuICAvKipcbiAgICogU2VsZWN0IHdoZW4gdXNpbmcgdGhpcyBidWNrZXQgYXMgdGhlIENESyBwaXBlbGluZSBhcnRpZmFjdCBidWNrZXQgd2l0aCBhIGN1c3RvbSBRdWFsaWZpZXJcbiAgICogKHNpbmdsZS1yZWdpb24gb3IgbXVsdGktcmVnaW9uIGRlcGxveW1lbnQpLlxuICAgKi9cbiAgREVQTE9ZTUVOVF9QSVBFTElORV9BUlRJRkFDVF9CVUNLRVQ6ICdEZXBsb3ltZW50UGlwZWxpbmVBcnRpZmFjdEJ1Y2tldCcsXG4gIC8qKlxuICAgKiBTZWxlY3Qgd2hlbiB1c2luZyB0aGlzIGJ1Y2tldCBhcyB0aGUgQ2xvdWRGcm9udCBvcmlnaW4uXG4gICAqL1xuICBDTE9VREZST05UX09SSUdJTl9CVUNLRVQ6ICdDbG91ZEZyb250T3JpZ2luQnVja2V0JyxcbiAgLyoqXG4gICAqIFNlbGVjdCBmb3IgdGhlIGRlZmF1bHQgYnVja2V0IHdoZW4gbm90IHVzaW5nIGEgY3VzdG9tIFF1YWxpZmllci5cbiAgICovXG4gIERFRkFVTFRfQlVDS0VUOiAnRGVmYXVsdEJ1Y2tldCcsXG4gIC8qKlxuICAgKiBTZWxlY3Qgd2hlbiB1c2luZyB0aGlzIGJ1Y2tldCBhcyBhIGNlbnRyYWxpemVkIGFjY2VzcyBsb2cgYnVja2V0XG4gICAqIGZvciBBTEIsIENsb3VkRnJvbnQsIFMzIHNlcnZlciBhY2Nlc3MgbG9nZ2luZywgYW5kIHNpbWlsYXIgcHJvZHVjZXJzLlxuICAgKi9cbiAgQUNDRVNTX0xPR19CVUNLRVQ6ICdBY2Nlc3NMb2dCdWNrZXQnLFxufSBhcyBjb25zdDtcblxuLyoqIEJ1Y2tldCB0eXBlOiBvbmUgb2YgdGhlIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGV9IGNvbnN0YW50IHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIFMzU2VjdXJlQnVja2V0VHlwZSA9IHR5cGVvZiBTM1NlY3VyZUJ1Y2tldFR5cGVba2V5b2YgdHlwZW9mIFMzU2VjdXJlQnVja2V0VHlwZV07XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBTM1NlY3VyZUJ1Y2tldH0uIEV4dGVuZHMgYHMzLkJ1Y2tldFByb3BzYCB3aXRoIGEgYnVja2V0IHR5cGUgZm9yIHNlY3VyZSBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM1NlY3VyZUJ1Y2tldFByb3BzIGV4dGVuZHMgczMuQnVja2V0UHJvcHMge1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgYnVja2V0LiBEZXRlcm1pbmVzIGVuY3J5cHRpb24gYW5kIHJlc291cmNlIHBvbGljeSBiZWhhdmlvci5cbiAgICogQGRlZmF1bHQgUzNTZWN1cmVCdWNrZXRUeXBlLkRFRkFVTFRfQlVDS0VUXG4gICAqL1xuICByZWFkb25seSBidWNrZXRUeXBlPzogUzNTZWN1cmVCdWNrZXRUeXBlO1xufVxuXG4vKipcbiAqIEFuIFMzIGJ1Y2tldCB3aXRoIHNlY3VyZSBkZWZhdWx0czogcHJpdmF0ZSBhY2Nlc3MsIFNTTCBlbmZvcmNlZCwgcHVibGljIGFjY2VzcyBibG9ja2VkLCBhbmQgZW5jcnlwdGlvbiByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzU2VjdXJlQnVja2V0IGV4dGVuZHMgczMuQnVja2V0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTM1NlY3VyZUJ1Y2tldFByb3BzKSB7XG4gICAgY29uc3QgYnVja2V0VHlwZSA9IHByb3BzPy5idWNrZXRUeXBlIHx8IFMzU2VjdXJlQnVja2V0VHlwZS5ERUZBVUxUX0JVQ0tFVDtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uOiAoKCkgPT4ge1xuICAgICAgICBpZiAoYnVja2V0VHlwZSA9PT0gUzNTZWN1cmVCdWNrZXRUeXBlLkNMT1VERlJPTlRfT1JJR0lOX0JVQ0tFVCB8fCBidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcz8uZW5jcnlwdGlvbiB8fCBzMy5CdWNrZXRFbmNyeXB0aW9uLktNU19NQU5BR0VEO1xuICAgICAgfSkoKSxcbiAgICAgIGFjY2Vzc0NvbnRyb2w6ICgoKSA9PiB7XG4gICAgICAgIGlmICghcHJvcHM/LmFjY2Vzc0NvbnRyb2wpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5hY2Nlc3NDb250cm9sO1xuICAgICAgfSkoKSxcbiAgICAgIGV2ZW50QnJpZGdlRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgcHVibGljUmVhZEFjY2VzczogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogcHJvcHM/LnZlcnNpb25lZCAhPT0gdW5kZWZpbmVkID8gcHJvcHMudmVyc2lvbmVkIDogdHJ1ZSxcbiAgICAgIG9iamVjdE93bmVyc2hpcDogKCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzPy5vYmplY3RPd25lcnNoaXApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcHMub2JqZWN0T3duZXJzaGlwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzMy5PYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VEO1xuICAgICAgfSkoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNmbkJ1Y2tldCA9IHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgYXMgczMuQ2ZuQnVja2V0O1xuICAgIGlmIChwcm9wcz8uZXZlbnRCcmlkZ2VFbmFibGVkID09PSB0cnVlKSB7XG4gICAgICBjZm5CdWNrZXQuYWRkUHJvcGVydHlPdmVycmlkZSgnTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbi5FdmVudEJyaWRnZUNvbmZpZ3VyYXRpb24uRXZlbnRCcmlkZ2VFbmFibGVkJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgY29uc3QgcmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuXG4gICAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5ERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVCkge1xuXG4gICAgICBjb25zdCBxdWFsaWZpZXIgPSBTdGFjay5vZih0aGlzKS5zeW50aGVzaXplci5ib290c3RyYXBRdWFsaWZpZXI7XG5cbiAgICAgIGlmIChxdWFsaWZpZXIgJiYgKHF1YWxpZmllciAhPSBEZWZhdWx0U3RhY2tTeW50aGVzaXplci5ERUZBVUxUX1FVQUxJRklFUikpIHtcbiAgICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnczM6KicsXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufWAsXG4gICAgICAgICAgICBgJHt0aGlzLmJ1Y2tldEFybn0vKmAsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS9jZGstJHtxdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7YWNjb3VudH0tJHtyZWdpb259YCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgIC8vIEFsbG93IEFMQiAvIE5MQiBsb2cgZGVsaXZlcnkgdG8gcHV0IG9iamVjdHMgKG5vIHJlYWQgb3IgbGlzdClcbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbG9nZGVsaXZlcnkuZWxhc3RpY2xvYWRiYWxhbmNpbmcuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufS9BV1NMb2dzLyR7YWNjb3VudH0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEFsbG93IENsb3VkRnJvbnQgc3RhbmRhcmQgbG9nZ2luZyAodjIpIHRvIHdyaXRlIGxvZ3NcbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYCR7dGhpcy5idWNrZXRBcm59L0FXU0xvZ3MvJHthY2NvdW50fS8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gQWxsb3cgUzMgc2VydmVyIGFjY2VzcyBsb2dnaW5nIHRvIHdyaXRlIGxvZ3Mgd2hlbiByZXF1aXJlZCBieSBjb25maWd1cmF0aW9uXG4gICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2xvZ2dpbmcuczMuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOlB1dE9iamVjdCcsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufS9BV1NMb2dzLyR7YWNjb3VudH0vKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG59XG4iXX0=
178
+ S3SecureBucket[_a] = { fqn: "s3-secure-bucket.S3SecureBucket", version: "0.2.0" };
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBbUY7QUFDbkYsMkNBQTJDO0FBQzNDLHlDQUF5QztBQUN6Qyx5REFBcUQ7QUFHckQ7Ozs7R0FJRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEM7OztPQUdHO0lBQ0gsbUNBQW1DLEVBQUUsa0NBQWtDO0lBQ3ZFOztPQUVHO0lBQ0gsd0JBQXdCLEVBQUUsd0JBQXdCO0lBQ2xEOztPQUVHO0lBQ0gsY0FBYyxFQUFFLGVBQWU7SUFDL0I7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixFQUFFLGlCQUFpQjtDQUM1QixDQUFDO0FBc0JYOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxFQUFFLENBQUMsTUFBTTtJQVkzQzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksMEJBQWtCLENBQUMsY0FBYyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsYUFBYSxFQUFFLDJCQUFhLENBQUMsTUFBTTtZQUNuQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hCLElBQUksVUFBVSxLQUFLLDBCQUFrQixDQUFDLHdCQUF3QixJQUFJLFVBQVUsS0FBSywwQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN0SCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUM7WUFDOUQsQ0FBQyxDQUFDLEVBQUU7WUFDSixhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25CLElBQUks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QUNWLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDO2lCQUNyRDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsY0FBYztpQkFDZjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QscUJBQXFCO2lCQUN0QjthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7O0FBeEpILHdDQXlKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRTdGFja1N5bnRoZXNpemVyLCBSZW1vdmFsUG9saWN5LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgUmVnaW9uSW5mbyB9IGZyb20gJ2F3cy1jZGstbGliL3JlZ2lvbi1pbmZvJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSURlcGVuZGFibGUgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBCdWNrZXQgdHlwZSBkaXNjcmltaW5hdG9yIHZhbHVlcyBmb3Ige0BsaW5rIFMzU2VjdXJlQnVja2V0UHJvcHMuYnVja2V0VHlwZX0uXG4gKlxuICogQHNlZSB7QGxpbmsgUzNTZWN1cmVCdWNrZXRQcm9wcy5idWNrZXRUeXBlfVxuICovXG5leHBvcnQgY29uc3QgUzNTZWN1cmVCdWNrZXRUeXBlID0ge1xuICAvKipcbiAgICogUGlwZWxpbmUgYXJ0aWZhY3QgYnVja2V0IHdoZW4gdXNpbmcgYSBjdXN0b20gQ0RLIGJvb3RzdHJhcCBxdWFsaWZpZXJcbiAgICogKHNpbmdsZS0gb3IgbXVsdGktcmVnaW9uIGRlcGxveW1lbnRzKS5cbiAgICovXG4gIERFUExPWU1FTlRfUElQRUxJTkVfQVJUSUZBQ1RfQlVDS0VUOiAnRGVwbG95bWVudFBpcGVsaW5lQXJ0aWZhY3RCdWNrZXQnLFxuICAvKipcbiAgICogT3JpZ2luIGJ1Y2tldCBmb3IgQ2xvdWRGcm9udCBkaXN0cmlidXRpb25zLlxuICAgKi9cbiAgQ0xPVURGUk9OVF9PUklHSU5fQlVDS0VUOiAnQ2xvdWRGcm9udE9yaWdpbkJ1Y2tldCcsXG4gIC8qKlxuICAgKiBHZW5lcmFsLXB1cnBvc2Ugc2VjdXJlIGJ1Y2tldCAoZGVmYXVsdCBxdWFsaWZpZXIgLyBzdGFuZGFyZCB1c2UpLlxuICAgKi9cbiAgREVGQVVMVF9CVUNLRVQ6ICdEZWZhdWx0QnVja2V0JyxcbiAgLyoqXG4gICAqIENlbnRyYWxpemVkIGFjY2VzcyBsb2dzIGZvciBwcm9kdWNlcnMgc3VjaCBhcyBBTEIvTkxCLCBDbG91ZEZyb250IHN0YW5kYXJkIGxvZ2dpbmcgKHYyKSxcbiAgICogYW5kIFMzIHNlcnZlciBhY2Nlc3MgbG9nZ2luZy4gR3JhbnRzIGBzMzpQdXRPYmplY3RgIG9uIGBBV1NMb2dzLzxhY2NvdW50Pi8qYCBvbmx5IChubyByZWFkL2xpc3QpLlxuICAgKlxuICAgKiBGb3Ige0BsaW5rIFMzU2VjdXJlQnVja2V0VHlwZS5BQ0NFU1NfTE9HX0JVQ0tFVH0sIHRoZSBzdGFjayB7QGxpbmsgU3RhY2sjcmVnaW9ufSBtdXN0IGJlIGFcbiAgICogY29uY3JldGUgcmVnaW9uIHN0cmluZyBhdCBzeW50aGVzaXMgdGltZSBzbyB0aGUgcmVnaW9uYWwgRUxCdjIgbG9nLWRlbGl2ZXJ5IGFjY291bnQgSUQgY2FuIGJlXG4gICAqIHJlc29sdmVkIGZyb20gYGF3cy1jZGstbGliL3JlZ2lvbi1pbmZvYCAobGVnYWN5IHBhdGggYWxvbmdzaWRlIHRoZSBsb2cgZGVsaXZlcnkgc2VydmljZSBwcmluY2lwYWwpLlxuICAgKi9cbiAgQUNDRVNTX0xPR19CVUNLRVQ6ICdBY2Nlc3NMb2dCdWNrZXQnLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGV9IHN0cmluZyBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHR5cGUgUzNTZWN1cmVCdWNrZXRUeXBlID0gdHlwZW9mIFMzU2VjdXJlQnVja2V0VHlwZVtrZXlvZiB0eXBlb2YgUzNTZWN1cmVCdWNrZXRUeXBlXTtcblxuLyoqXG4gKiBDb25zdHJ1Y3Rpb24gcHJvcGVydGllcyBmb3Ige0BsaW5rIFMzU2VjdXJlQnVja2V0fS5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBzMy5CdWNrZXRQcm9wc307IHNldmVyYWwgZmllbGRzIHJlY2VpdmUgc2VjdXJlIGRlZmF1bHRzIGluc2lkZSB0aGUgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzU2VjdXJlQnVja2V0UHJvcHMgZXh0ZW5kcyBzMy5CdWNrZXRQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgZW5jcnlwdGlvbiBkZWZhdWx0cyBhbmQgb3B0aW9uYWwgcmVzb3VyY2UtcG9saWN5IHN0YXRlbWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuREVGQVVMVF9CVUNLRVR9XG4gICAqL1xuICByZWFkb25seSBidWNrZXRUeXBlPzogUzNTZWN1cmVCdWNrZXRUeXBlO1xufVxuXG4vKipcbiAqIFMzIGJ1Y2tldCB3aXRoIG9waW5pb25hdGVkIHNlY3VyZSBkZWZhdWx0czogcHJpdmF0ZSBBQ0xzLCBibG9jayBwdWJsaWMgYWNjZXNzLCBUTFMtb25seSBhY2Nlc3MsXG4gKiBhbmQgZW5jcnlwdGlvbiAoUzMtbWFuYWdlZCBmb3IgbG9nL29yaWdpbiB0eXBlczsgS01TLW1hbmFnZWQgYnkgZGVmYXVsdCBvdGhlcndpc2UpLlxuICpcbiAqIEByZW1hcmtzXG4gKiAtIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuREVQTE9ZTUVOVF9QSVBFTElORV9BUlRJRkFDVF9CVUNLRVR9OiBtYXkgYXR0YWNoIGEgZGVwbG95LXJvbGUgcG9saWN5IHdoZW4gYSBub24tZGVmYXVsdCBib290c3RyYXAgcXVhbGlmaWVyIGlzIHByZXNlbnQuXG4gKiAtIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9OiBhZGRzIGxvZy13cml0ZXIgcHJpbmNpcGFsczsgc2VlIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9IGFuZCB7QGxpbmsgUzNTZWN1cmVCdWNrZXQjYWNjZXNzTG9nQnVja2V0UG9saWN5RGVwZW5kYWJsZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTM1NlY3VyZUJ1Y2tldCBleHRlbmRzIHMzLkJ1Y2tldCB7XG4gIC8qKlxuICAgKiBTZXQgb25seSB3aGVuIHtAbGluayBTM1NlY3VyZUJ1Y2tldFByb3BzLmJ1Y2tldFR5cGV9IGlzIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9LlxuICAgKiBVc2UgYXMgYSBkZXBlbmRlbmN5IHRhcmdldCBzbyBsb2FkIGJhbGFuY2VyIGFjY2Vzcy1sb2cgZW5hYmxlbWVudCBydW5zIGFmdGVyIHRoZSBidWNrZXQgcG9saWN5XG4gICAqIGV4aXN0cyAoRUxCIHBlcmZvcm1zIGFuIGltbWVkaWF0ZSB2YWxpZGF0aW9uIGBQdXRPYmplY3RgIHRoYXQgZmFpbHMgaWYgdGhlIHBvbGljeSBpcyBub3QgYXBwbGllZCB5ZXQpLlxuICAgKlxuICAgKiBFeGFtcGxlOiBgbG9hZEJhbGFuY2VyLm5vZGUuYWRkRGVwZW5kZW5jeShidWNrZXQuYWNjZXNzTG9nQnVja2V0UG9saWN5RGVwZW5kYWJsZSEpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIHdoZW4gYGJ1Y2tldFR5cGVgIGlzIG5vdCB7QGxpbmsgUzNTZWN1cmVCdWNrZXRUeXBlLkFDQ0VTU19MT0dfQlVDS0VUfS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY2Nlc3NMb2dCdWNrZXRQb2xpY3lEZXBlbmRhYmxlPzogSURlcGVuZGFibGU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzZWN1cmUgUzMgYnVja2V0IGFjY29yZGluZyB0byBgYnVja2V0VHlwZWAgYW5kIG1lcmdlZCBgcHJvcHNgLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBQYXJlbnQgY29uc3RydWN0LCB0eXBpY2FsbHkgYSB7QGxpbmsgU3RhY2t9LlxuICAgKiBAcGFyYW0gaWQgLSBDb25zdHJ1Y3QgSUQgKHN0YWJsZSBsb2dpY2FsIElEIHNlZ21lbnQpLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBPcHRpb25hbCB7QGxpbmsgczMuQnVja2V0UHJvcHN9IHBsdXMge0BsaW5rIFMzU2VjdXJlQnVja2V0UHJvcHMuYnVja2V0VHlwZX0gYW5kIGBldmVudEJyaWRnZUVuYWJsZWRgIChhcHBsaWVkIHZpYSBMMSBvdmVycmlkZSB3aGVuIHRydWUpLlxuICAgKiBAdGhyb3dzIFdoZW4gYGJ1Y2tldFR5cGVgIGlzIHtAbGluayBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVR9IGFuZCB7QGxpbmsgU3RhY2sjcmVnaW9ufSBpcyBzdGlsbFxuICAgKiAgIHVucmVzb2x2ZWQgYXQgc3ludGhlc2lzIHRpbWUgKGEgdG9rZW4pLiBTZXQgYW4gZXhwbGljaXQgYGVudi5yZWdpb25gIG9uIHRoZSBzdGFjayBzbyB0aGUgRUxCdjJcbiAgICogICBsb2ctZGVsaXZlcnkgYWNjb3VudCBjYW4gYmUgbG9va2VkIHVwLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBTM1NlY3VyZUJ1Y2tldFByb3BzKSB7XG4gICAgY29uc3QgYnVja2V0VHlwZSA9IHByb3BzPy5idWNrZXRUeXBlIHx8IFMzU2VjdXJlQnVja2V0VHlwZS5ERUZBVUxUX0JVQ0tFVDtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uOiAoKCkgPT4ge1xuICAgICAgICBpZiAoYnVja2V0VHlwZSA9PT0gUzNTZWN1cmVCdWNrZXRUeXBlLkNMT1VERlJPTlRfT1JJR0lOX0JVQ0tFVCB8fCBidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcz8uZW5jcnlwdGlvbiB8fCBzMy5CdWNrZXRFbmNyeXB0aW9uLktNU19NQU5BR0VEO1xuICAgICAgfSkoKSxcbiAgICAgIGFjY2Vzc0NvbnRyb2w6ICgoKSA9PiB7XG4gICAgICAgIGlmICghcHJvcHM/LmFjY2Vzc0NvbnRyb2wpIHtcbiAgICAgICAgICByZXR1cm4gczMuQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5hY2Nlc3NDb250cm9sO1xuICAgICAgfSkoKSxcbiAgICAgIGV2ZW50QnJpZGdlRW5hYmxlZDogdW5kZWZpbmVkLFxuICAgICAgcHVibGljUmVhZEFjY2VzczogZmFsc2UsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgIHZlcnNpb25lZDogcHJvcHM/LnZlcnNpb25lZCAhPT0gdW5kZWZpbmVkID8gcHJvcHMudmVyc2lvbmVkIDogdHJ1ZSxcbiAgICAgIG9iamVjdE93bmVyc2hpcDogKCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzPy5vYmplY3RPd25lcnNoaXApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcHMub2JqZWN0T3duZXJzaGlwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzMy5PYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VEO1xuICAgICAgfSkoKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNmbkJ1Y2tldCA9IHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgYXMgczMuQ2ZuQnVja2V0O1xuICAgIGlmIChwcm9wcz8uZXZlbnRCcmlkZ2VFbmFibGVkID09PSB0cnVlKSB7XG4gICAgICBjZm5CdWNrZXQuYWRkUHJvcGVydHlPdmVycmlkZSgnTm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbi5FdmVudEJyaWRnZUNvbmZpZ3VyYXRpb24uRXZlbnRCcmlkZ2VFbmFibGVkJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudCA9IFN0YWNrLm9mKHRoaXMpLmFjY291bnQ7XG4gICAgY29uc3QgcmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuXG4gICAgaWYgKGJ1Y2tldFR5cGUgPT09IFMzU2VjdXJlQnVja2V0VHlwZS5ERVBMT1lNRU5UX1BJUEVMSU5FX0FSVElGQUNUX0JVQ0tFVCkge1xuXG4gICAgICBjb25zdCBxdWFsaWZpZXIgPSBTdGFjay5vZih0aGlzKS5zeW50aGVzaXplci5ib290c3RyYXBRdWFsaWZpZXI7XG5cbiAgICAgIGlmIChxdWFsaWZpZXIgJiYgKHF1YWxpZmllciAhPSBEZWZhdWx0U3RhY2tTeW50aGVzaXplci5ERUZBVUxUX1FVQUxJRklFUikpIHtcbiAgICAgICAgdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnczM6KicsXG4gICAgICAgICAgXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgIGAke3RoaXMuYnVja2V0QXJufWAsXG4gICAgICAgICAgICBgJHt0aGlzLmJ1Y2tldEFybn0vKmAsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS9jZGstJHtxdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7YWNjb3VudH0tJHtyZWdpb259YCksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWNrZXRUeXBlID09PSBTM1NlY3VyZUJ1Y2tldFR5cGUuQUNDRVNTX0xPR19CVUNLRVQpIHtcbiAgICAgIGNvbnN0IGF3c0xvZ3NQcmVmaXhSZXNvdXJjZSA9IGAke3RoaXMuYnVja2V0QXJufS9BV1NMb2dzLyR7YWNjb3VudH0vKmA7XG5cbiAgICAgIC8vIEFsbG93IEFMQiAvIE5MQiBsb2cgZGVsaXZlcnkgKG1vZGVybiBzZXJ2aWNlIHByaW5jaXBhbCBwYXRoOyBhbHNvIHJlcXVpcmVkIGluIG9wdC1pbiByZWdpb25zKS5cbiAgICAgIGNvbnN0IGFsYkxvZ0RlbGl2ZXJ5UG9saWN5UmVzdWx0ID0gdGhpcy5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsb2dkZWxpdmVyeS5lbGFzdGljbG9hZGJhbGFuY2luZy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgICAgICBdLFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBJbiBub27igJNvcHQtaW4gcmVnaW9ucyAoZm9yIGV4YW1wbGUgYXAtbm9ydGhlYXN0LTEpLCBhY2Nlc3MgbG9ncyBhcmUgb2Z0ZW4gZGVsaXZlcmVkIHVzaW5nIHRoZVxuICAgICAgLy8gcmVnaW9uYWwgRUxCdjIgYWNjb3VudCAocm9vdCBvZiB0aGF0IGFjY291bnQpIGZvciBzMzpQdXRPYmplY3QsIG5vdCBvbmx5IHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBhYm92ZS5cbiAgICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocmVnaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1MzU2VjdXJlQnVja2V0IEFDQ0VTU19MT0dfQlVDS0VUOiBjYW5ub3QgcmVzb2x2ZSBFTEJ2MiBsb2cgZGVsaXZlcnkgYWNjb3VudCAoc3RhY2sgcmVnaW9uIGlzIGEgdG9rZW4pLiAnICtcbiAgICAgICAgICAgICdTZXQgYSBjb25jcmV0ZSBgZW52LnJlZ2lvbmAgb24gdGhlIHN0YWNrLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYkFjY291bnRJZCA9IFJlZ2lvbkluZm8uZ2V0KHJlZ2lvbikuZWxidjJBY2NvdW50O1xuICAgICAgaWYgKGVsYkFjY291bnRJZCkge1xuICAgICAgICB0aGlzLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLkFjY291bnRQcmluY2lwYWwoZWxiQWNjb3VudElkKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdzMzpQdXRPYmplY3QnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICBhd3NMb2dzUHJlZml4UmVzb3VyY2UsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjY2Vzc0xvZ0J1Y2tldFBvbGljeURlcGVuZGFibGUgPSBhbGJMb2dEZWxpdmVyeVBvbGljeVJlc3VsdC5wb2xpY3lEZXBlbmRhYmxlID8/IHRoaXM7XG5cbiAgICAgIC8vIEFsbG93IENsb3VkRnJvbnQgc3RhbmRhcmQgbG9nZ2luZyAodjIpIHRvIHdyaXRlIGxvZ3NcbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgICAgICBdLFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBBbGxvdyBTMyBzZXJ2ZXIgYWNjZXNzIGxvZ2dpbmcgdG8gd3JpdGUgbG9ncyB3aGVuIHJlcXVpcmVkIGJ5IGNvbmZpZ3VyYXRpb25cbiAgICAgIHRoaXMuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnbG9nZ2luZy5zMy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnczM6UHV0T2JqZWN0JyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYXdzTG9nc1ByZWZpeFJlc291cmNlLFxuICAgICAgICBdLFxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -79,7 +79,7 @@
79
79
  "publishConfig": {
80
80
  "access": "public"
81
81
  },
82
- "version": "0.1.6",
82
+ "version": "0.2.0",
83
83
  "jest": {
84
84
  "coverageProvider": "v8",
85
85
  "testMatch": [