@btc-embedded/cdk-extensions 0.20.9 → 0.20.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/.jsii +405 -34
  2. package/API.md +424 -16
  3. package/CHANGELOG.md +14 -0
  4. package/assets/constructs/api-keys/lambdas/pre-token.lambda/index.js +16 -13
  5. package/lib/constructs/EventPipe.js +1 -1
  6. package/lib/constructs/ExportedService.js +1 -1
  7. package/lib/constructs/S3Bucket.js +1 -1
  8. package/lib/constructs/SecureRestApi.js +1 -1
  9. package/lib/constructs/SecureRestApiV2.js +1 -1
  10. package/lib/constructs/api-keys/ApiKeyClientAuthorization.js +1 -1
  11. package/lib/constructs/api-keys/ApiKeyManagement.js +1 -1
  12. package/lib/constructs/api-keys/ApiKeyPreTokenHandler.js +1 -1
  13. package/lib/constructs/api-keys/ApiKeyStore.js +1 -1
  14. package/lib/constructs/api-keys/lambdas/pre-token.lambda.js +16 -17
  15. package/lib/extensions/ApiGatewayExtension.js +1 -1
  16. package/lib/extensions/ApplicationLoadBalancerExtension.js +1 -1
  17. package/lib/extensions/ApplicationLoadBalancerExtensionV2.js +1 -1
  18. package/lib/extensions/CloudMapExtension.js +1 -1
  19. package/lib/extensions/DeactivatableServiceExtension.js +1 -1
  20. package/lib/extensions/DeploymentConfigExtension.js +1 -1
  21. package/lib/extensions/DocumentDbAccessExtension.js +1 -1
  22. package/lib/extensions/DomainEventMessagingExtension.js +1 -1
  23. package/lib/extensions/EfsMountExtension.js +1 -1
  24. package/lib/extensions/ExtraContainerExtension.js +1 -1
  25. package/lib/extensions/HTTPApiExtension.d.ts +4 -2
  26. package/lib/extensions/HTTPApiExtension.js +14 -10
  27. package/lib/extensions/LogExtension.js +1 -1
  28. package/lib/extensions/ModifyContainerDefinitionExtension.js +1 -1
  29. package/lib/extensions/ModifyTaskDefinitionExtension.js +1 -1
  30. package/lib/extensions/OpenIdExtension.js +1 -1
  31. package/lib/extensions/OpenTelemetryExtension.js +1 -1
  32. package/lib/extensions/PostgresDbAccessExtension.js +1 -1
  33. package/lib/extensions/SharedVolumeExtension.js +1 -1
  34. package/lib/extensions/TcpKeepAliveExtension.js +1 -1
  35. package/lib/platform/ApiGateway.js +1 -1
  36. package/lib/platform/ApiGatewayVpcLink.js +2 -2
  37. package/lib/platform/ApplicationLoadBalancer.js +1 -1
  38. package/lib/platform/ApplicationLoadBalancerV2.js +2 -2
  39. package/lib/platform/BTCLogGroup.js +1 -1
  40. package/lib/platform/CognitoUserPool.js +2 -2
  41. package/lib/platform/DefaultUserPoolClients.js +1 -1
  42. package/lib/platform/DocumentDB.js +2 -2
  43. package/lib/platform/EcsCluster.js +1 -1
  44. package/lib/platform/EfsFileSystem.js +1 -1
  45. package/lib/platform/HostedZone.d.ts +103 -0
  46. package/lib/platform/HostedZone.js +105 -0
  47. package/lib/platform/PrivateDnsNamespace.js +1 -1
  48. package/lib/platform/ResourceServer.js +1 -1
  49. package/lib/platform/Vpc.js +1 -1
  50. package/lib/platform/VpcV2.d.ts +10 -1
  51. package/lib/platform/VpcV2.js +8 -4
  52. package/lib/platform/index.d.ts +1 -0
  53. package/lib/platform/index.js +2 -1
  54. package/lib/utils/StackParameter.js +1 -1
  55. package/package.json +1 -1
package/API.md CHANGED
@@ -3798,6 +3798,175 @@ The security group of the exported ECS service.
3798
3798
  ---
3799
3799
 
3800
3800
 
3801
+ ### HostedZone <a name="HostedZone" id="@btc-embedded/cdk-extensions.HostedZone"></a>
3802
+
3803
+ - *Implements:* <a href="#@btc-embedded/cdk-extensions.IHostedZone">IHostedZone</a>
3804
+
3805
+ A CDK construct that creates or looks up a Route53 hosted zone.
3806
+
3807
+ *Example*
3808
+
3809
+ ```typescript
3810
+ // Import from base platform
3811
+ const zone = HostedZone.fromBasePlatform(this, 'Zone', {
3812
+ stackName: 'my-platform'
3813
+ });
3814
+ ```
3815
+
3816
+
3817
+ #### Initializers <a name="Initializers" id="@btc-embedded/cdk-extensions.HostedZone.Initializer"></a>
3818
+
3819
+ ```typescript
3820
+ import { HostedZone } from '@btc-embedded/cdk-extensions'
3821
+
3822
+ new HostedZone(scope: Construct, id: string, props: HostedZoneProps)
3823
+ ```
3824
+
3825
+ | **Name** | **Type** | **Description** |
3826
+ | --- | --- | --- |
3827
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
3828
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
3829
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.props">props</a></code> | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps">HostedZoneProps</a></code> | *No description.* |
3830
+
3831
+ ---
3832
+
3833
+ ##### `scope`<sup>Required</sup> <a name="scope" id="@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.scope"></a>
3834
+
3835
+ - *Type:* constructs.Construct
3836
+
3837
+ ---
3838
+
3839
+ ##### `id`<sup>Required</sup> <a name="id" id="@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.id"></a>
3840
+
3841
+ - *Type:* string
3842
+
3843
+ ---
3844
+
3845
+ ##### `props`<sup>Required</sup> <a name="props" id="@btc-embedded/cdk-extensions.HostedZone.Initializer.parameter.props"></a>
3846
+
3847
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.HostedZoneProps">HostedZoneProps</a>
3848
+
3849
+ ---
3850
+
3851
+ #### Methods <a name="Methods" id="Methods"></a>
3852
+
3853
+ | **Name** | **Description** |
3854
+ | --- | --- |
3855
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.toString">toString</a></code> | Returns a string representation of this construct. |
3856
+
3857
+ ---
3858
+
3859
+ ##### `toString` <a name="toString" id="@btc-embedded/cdk-extensions.HostedZone.toString"></a>
3860
+
3861
+ ```typescript
3862
+ public toString(): string
3863
+ ```
3864
+
3865
+ Returns a string representation of this construct.
3866
+
3867
+ #### Static Functions <a name="Static Functions" id="Static Functions"></a>
3868
+
3869
+ | **Name** | **Description** |
3870
+ | --- | --- |
3871
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
3872
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.fromBasePlatform">fromBasePlatform</a></code> | Import a hosted zone from a base platform stack. |
3873
+
3874
+ ---
3875
+
3876
+ ##### `isConstruct` <a name="isConstruct" id="@btc-embedded/cdk-extensions.HostedZone.isConstruct"></a>
3877
+
3878
+ ```typescript
3879
+ import { HostedZone } from '@btc-embedded/cdk-extensions'
3880
+
3881
+ HostedZone.isConstruct(x: any)
3882
+ ```
3883
+
3884
+ Checks if `x` is a construct.
3885
+
3886
+ Use this method instead of `instanceof` to properly detect `Construct`
3887
+ instances, even when the construct library is symlinked.
3888
+
3889
+ Explanation: in JavaScript, multiple copies of the `constructs` library on
3890
+ disk are seen as independent, completely different libraries. As a
3891
+ consequence, the class `Construct` in each copy of the `constructs` library
3892
+ is seen as a different class, and an instance of one class will not test as
3893
+ `instanceof` the other class. `npm install` will not create installations
3894
+ like this, but users may manually symlink construct libraries together or
3895
+ use a monorepo tool: in those cases, multiple copies of the `constructs`
3896
+ library can be accidentally installed, and `instanceof` will behave
3897
+ unpredictably. It is safest to avoid using `instanceof`, and using
3898
+ this type-testing method instead.
3899
+
3900
+ ###### `x`<sup>Required</sup> <a name="x" id="@btc-embedded/cdk-extensions.HostedZone.isConstruct.parameter.x"></a>
3901
+
3902
+ - *Type:* any
3903
+
3904
+ Any object.
3905
+
3906
+ ---
3907
+
3908
+ ##### `fromBasePlatform` <a name="fromBasePlatform" id="@btc-embedded/cdk-extensions.HostedZone.fromBasePlatform"></a>
3909
+
3910
+ ```typescript
3911
+ import { HostedZone } from '@btc-embedded/cdk-extensions'
3912
+
3913
+ HostedZone.fromBasePlatform(scope: Construct, id: string, attrs: HostedZoneAttributes)
3914
+ ```
3915
+
3916
+ Import a hosted zone from a base platform stack.
3917
+
3918
+ ###### `scope`<sup>Required</sup> <a name="scope" id="@btc-embedded/cdk-extensions.HostedZone.fromBasePlatform.parameter.scope"></a>
3919
+
3920
+ - *Type:* constructs.Construct
3921
+
3922
+ ---
3923
+
3924
+ ###### `id`<sup>Required</sup> <a name="id" id="@btc-embedded/cdk-extensions.HostedZone.fromBasePlatform.parameter.id"></a>
3925
+
3926
+ - *Type:* string
3927
+
3928
+ ---
3929
+
3930
+ ###### `attrs`<sup>Required</sup> <a name="attrs" id="@btc-embedded/cdk-extensions.HostedZone.fromBasePlatform.parameter.attrs"></a>
3931
+
3932
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.HostedZoneAttributes">HostedZoneAttributes</a>
3933
+
3934
+ ---
3935
+
3936
+ #### Properties <a name="Properties" id="Properties"></a>
3937
+
3938
+ | **Name** | **Type** | **Description** |
3939
+ | --- | --- | --- |
3940
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
3941
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZone.property.zone">zone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | The AWS Route53 HostedZone instance. |
3942
+
3943
+ ---
3944
+
3945
+ ##### `node`<sup>Required</sup> <a name="node" id="@btc-embedded/cdk-extensions.HostedZone.property.node"></a>
3946
+
3947
+ ```typescript
3948
+ public readonly node: Node;
3949
+ ```
3950
+
3951
+ - *Type:* constructs.Node
3952
+
3953
+ The tree node.
3954
+
3955
+ ---
3956
+
3957
+ ##### `zone`<sup>Required</sup> <a name="zone" id="@btc-embedded/cdk-extensions.HostedZone.property.zone"></a>
3958
+
3959
+ ```typescript
3960
+ public readonly zone: IHostedZone;
3961
+ ```
3962
+
3963
+ - *Type:* aws-cdk-lib.aws_route53.IHostedZone
3964
+
3965
+ The AWS Route53 HostedZone instance.
3966
+
3967
+ ---
3968
+
3969
+
3801
3970
  ### PrivateDnsNamespace <a name="PrivateDnsNamespace" id="@btc-embedded/cdk-extensions.PrivateDnsNamespace"></a>
3802
3971
 
3803
3972
  - *Implements:* <a href="#@btc-embedded/cdk-extensions.IPrivateDnsNamespace">IPrivateDnsNamespace</a>
@@ -5897,6 +6066,9 @@ A construct that creates or imports an existing VPC.
5897
6066
 
5898
6067
  Supports importing by VPC ID, VPC name, or creating a new VPC with a specified CIDR block.
5899
6068
 
6069
+ When using fromBasePlatform() to import a VPC from another stack, provide the vpcId
6070
+ parameter as a string to avoid CloudFormation token issues with VPC lookups.
6071
+
5900
6072
  #### Initializers <a name="Initializers" id="@btc-embedded/cdk-extensions.VpcV2.Initializer"></a>
5901
6073
 
5902
6074
  ```typescript
@@ -5993,7 +6165,7 @@ Any object.
5993
6165
  ```typescript
5994
6166
  import { VpcV2 } from '@btc-embedded/cdk-extensions'
5995
6167
 
5996
- VpcV2.fromBasePlatform(scope: Construct, id: string, stackName: string)
6168
+ VpcV2.fromBasePlatform(scope: Construct, id: string, attrs: VpcV2Attributes)
5997
6169
  ```
5998
6170
 
5999
6171
  ###### `scope`<sup>Required</sup> <a name="scope" id="@btc-embedded/cdk-extensions.VpcV2.fromBasePlatform.parameter.scope"></a>
@@ -6008,9 +6180,9 @@ VpcV2.fromBasePlatform(scope: Construct, id: string, stackName: string)
6008
6180
 
6009
6181
  ---
6010
6182
 
6011
- ###### `stackName`<sup>Required</sup> <a name="stackName" id="@btc-embedded/cdk-extensions.VpcV2.fromBasePlatform.parameter.stackName"></a>
6183
+ ###### `attrs`<sup>Required</sup> <a name="attrs" id="@btc-embedded/cdk-extensions.VpcV2.fromBasePlatform.parameter.attrs"></a>
6012
6184
 
6013
- - *Type:* string
6185
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.VpcV2Attributes">VpcV2Attributes</a>
6014
6186
 
6015
6187
  ---
6016
6188
 
@@ -9847,6 +10019,150 @@ const filterEqualsIgnoreCase: FilterEqualsIgnoreCase = { ... }
9847
10019
  ```
9848
10020
 
9849
10021
 
10022
+ ### HostedZoneAttributes <a name="HostedZoneAttributes" id="@btc-embedded/cdk-extensions.HostedZoneAttributes"></a>
10023
+
10024
+ Attributes required to import an existing hosted zone from another stack.
10025
+
10026
+ #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.HostedZoneAttributes.Initializer"></a>
10027
+
10028
+ ```typescript
10029
+ import { HostedZoneAttributes } from '@btc-embedded/cdk-extensions'
10030
+
10031
+ const hostedZoneAttributes: HostedZoneAttributes = { ... }
10032
+ ```
10033
+
10034
+ #### Properties <a name="Properties" id="Properties"></a>
10035
+
10036
+ | **Name** | **Type** | **Description** |
10037
+ | --- | --- | --- |
10038
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneAttributes.property.stackName">stackName</a></code> | <code>string</code> | The name of the stack where the hosted zone is defined. |
10039
+
10040
+ ---
10041
+
10042
+ ##### `stackName`<sup>Required</sup> <a name="stackName" id="@btc-embedded/cdk-extensions.HostedZoneAttributes.property.stackName"></a>
10043
+
10044
+ ```typescript
10045
+ public readonly stackName: string;
10046
+ ```
10047
+
10048
+ - *Type:* string
10049
+
10050
+ The name of the stack where the hosted zone is defined.
10051
+
10052
+ This is usually the base platform stack.
10053
+
10054
+ ---
10055
+
10056
+ ### HostedZoneProps <a name="HostedZoneProps" id="@btc-embedded/cdk-extensions.HostedZoneProps"></a>
10057
+
10058
+ Properties for creating or looking up a hosted zone.
10059
+
10060
+ #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.HostedZoneProps.Initializer"></a>
10061
+
10062
+ ```typescript
10063
+ import { HostedZoneProps } from '@btc-embedded/cdk-extensions'
10064
+
10065
+ const hostedZoneProps: HostedZoneProps = { ... }
10066
+ ```
10067
+
10068
+ #### Properties <a name="Properties" id="Properties"></a>
10069
+
10070
+ | **Name** | **Type** | **Description** |
10071
+ | --- | --- | --- |
10072
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.domainName">domainName</a></code> | <code>string</code> | The domain name of the hosted zone (e.g., "example.com"). |
10073
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.addTrailingDot">addTrailingDot</a></code> | <code>boolean</code> | Whether to add a trailing dot to the zone name. |
10074
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.caaAmazon">caaAmazon</a></code> | <code>boolean</code> | Restrict certificate authorities to Amazon only. |
10075
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.comment">comment</a></code> | <code>string</code> | Comments about the hosted zone. |
10076
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.mode">mode</a></code> | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneMode">HostedZoneMode</a></code> | Whether to create a new zone or look up an existing one. |
10077
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneProps.property.queryLogsLogGroupArn">queryLogsLogGroupArn</a></code> | <code>string</code> | ARN of the CloudWatch log group for query logs. |
10078
+
10079
+ ---
10080
+
10081
+ ##### `domainName`<sup>Required</sup> <a name="domainName" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.domainName"></a>
10082
+
10083
+ ```typescript
10084
+ public readonly domainName: string;
10085
+ ```
10086
+
10087
+ - *Type:* string
10088
+
10089
+ The domain name of the hosted zone (e.g., "example.com").
10090
+
10091
+ ---
10092
+
10093
+ ##### `addTrailingDot`<sup>Optional</sup> <a name="addTrailingDot" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.addTrailingDot"></a>
10094
+
10095
+ ```typescript
10096
+ public readonly addTrailingDot: boolean;
10097
+ ```
10098
+
10099
+ - *Type:* boolean
10100
+ - *Default:* true
10101
+
10102
+ Whether to add a trailing dot to the zone name.
10103
+
10104
+ Only applies when mode is CREATE.
10105
+
10106
+ ---
10107
+
10108
+ ##### `caaAmazon`<sup>Optional</sup> <a name="caaAmazon" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.caaAmazon"></a>
10109
+
10110
+ ```typescript
10111
+ public readonly caaAmazon: boolean;
10112
+ ```
10113
+
10114
+ - *Type:* boolean
10115
+ - *Default:* false
10116
+
10117
+ Restrict certificate authorities to Amazon only.
10118
+
10119
+ Only applies when mode is CREATE.
10120
+
10121
+ ---
10122
+
10123
+ ##### `comment`<sup>Optional</sup> <a name="comment" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.comment"></a>
10124
+
10125
+ ```typescript
10126
+ public readonly comment: string;
10127
+ ```
10128
+
10129
+ - *Type:* string
10130
+ - *Default:* none
10131
+
10132
+ Comments about the hosted zone.
10133
+
10134
+ Only applies when mode is CREATE.
10135
+
10136
+ ---
10137
+
10138
+ ##### `mode`<sup>Optional</sup> <a name="mode" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.mode"></a>
10139
+
10140
+ ```typescript
10141
+ public readonly mode: HostedZoneMode;
10142
+ ```
10143
+
10144
+ - *Type:* <a href="#@btc-embedded/cdk-extensions.HostedZoneMode">HostedZoneMode</a>
10145
+ - *Default:* HostedZoneMode.LOOKUP
10146
+
10147
+ Whether to create a new zone or look up an existing one.
10148
+
10149
+ ---
10150
+
10151
+ ##### `queryLogsLogGroupArn`<sup>Optional</sup> <a name="queryLogsLogGroupArn" id="@btc-embedded/cdk-extensions.HostedZoneProps.property.queryLogsLogGroupArn"></a>
10152
+
10153
+ ```typescript
10154
+ public readonly queryLogsLogGroupArn: string;
10155
+ ```
10156
+
10157
+ - *Type:* string
10158
+ - *Default:* disabled
10159
+
10160
+ ARN of the CloudWatch log group for query logs.
10161
+
10162
+ Only applies when mode is CREATE.
10163
+
10164
+ ---
10165
+
9850
10166
  ### HTTPApiExtensionProps <a name="HTTPApiExtensionProps" id="@btc-embedded/cdk-extensions.HTTPApiExtensionProps"></a>
9851
10167
 
9852
10168
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.HTTPApiExtensionProps.Initializer"></a>
@@ -9861,24 +10177,12 @@ const hTTPApiExtensionProps: HTTPApiExtensionProps = { ... }
9861
10177
 
9862
10178
  | **Name** | **Type** | **Description** |
9863
10179
  | --- | --- | --- |
9864
- | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.hostedZone">hostedZone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | Hosted Zone to create the gateway domain A record. |
9865
10180
  | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.platformStackName">platformStackName</a></code> | <code>string</code> | The name of the base platform stack. |
9866
10181
  | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.domainPrefix">domainPrefix</a></code> | <code>string</code> | Domain prefix for the API Gateway endpoint. |
9867
10182
  | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.enableAccessLogs">enableAccessLogs</a></code> | <code>boolean</code> | Enable access logs for the API Gateway. |
9868
10183
  | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.endpointPrefix">endpointPrefix</a></code> | <code>string</code> | The prefix for the API Gateway endpoint. |
9869
10184
  | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.extraHttpApiAttributes">extraHttpApiAttributes</a></code> | <code>aws-cdk-lib.aws_apigatewayv2.HttpApiAttributes</code> | Specify additional HTTP API Attributes. |
9870
-
9871
- ---
9872
-
9873
- ##### `hostedZone`<sup>Required</sup> <a name="hostedZone" id="@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.hostedZone"></a>
9874
-
9875
- ```typescript
9876
- public readonly hostedZone: IHostedZone;
9877
- ```
9878
-
9879
- - *Type:* aws-cdk-lib.aws_route53.IHostedZone
9880
-
9881
- Hosted Zone to create the gateway domain A record.
10185
+ | <code><a href="#@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.hostedZone">hostedZone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | Hosted Zone to create the gateway domain A record. |
9882
10186
 
9883
10187
  ---
9884
10188
 
@@ -9944,6 +10248,21 @@ Specify additional HTTP API Attributes.
9944
10248
 
9945
10249
  ---
9946
10250
 
10251
+ ##### ~~`hostedZone`~~<sup>Optional</sup> <a name="hostedZone" id="@btc-embedded/cdk-extensions.HTTPApiExtensionProps.property.hostedZone"></a>
10252
+
10253
+ - *Deprecated:* Provide only platformStackName. The hosted zone will be imported automatically.
10254
+
10255
+ ```typescript
10256
+ public readonly hostedZone: IHostedZone;
10257
+ ```
10258
+
10259
+ - *Type:* aws-cdk-lib.aws_route53.IHostedZone
10260
+ - *Default:* Imported from base platform using HostedZone.fromBasePlatform()
10261
+
10262
+ Hosted Zone to create the gateway domain A record.
10263
+
10264
+ ---
10265
+
9947
10266
  ### ImportLogGroupOption <a name="ImportLogGroupOption" id="@btc-embedded/cdk-extensions.ImportLogGroupOption"></a>
9948
10267
 
9949
10268
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.ImportLogGroupOption.Initializer"></a>
@@ -10960,6 +11279,38 @@ public readonly vpcCidr: IIpAddresses;
10960
11279
 
10961
11280
  ---
10962
11281
 
11282
+ ### VpcV2Attributes <a name="VpcV2Attributes" id="@btc-embedded/cdk-extensions.VpcV2Attributes"></a>
11283
+
11284
+ #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.VpcV2Attributes.Initializer"></a>
11285
+
11286
+ ```typescript
11287
+ import { VpcV2Attributes } from '@btc-embedded/cdk-extensions'
11288
+
11289
+ const vpcV2Attributes: VpcV2Attributes = { ... }
11290
+ ```
11291
+
11292
+ #### Properties <a name="Properties" id="Properties"></a>
11293
+
11294
+ | **Name** | **Type** | **Description** |
11295
+ | --- | --- | --- |
11296
+ | <code><a href="#@btc-embedded/cdk-extensions.VpcV2Attributes.property.vpcId">vpcId</a></code> | <code>string</code> | The VPC ID to import. |
11297
+
11298
+ ---
11299
+
11300
+ ##### `vpcId`<sup>Required</sup> <a name="vpcId" id="@btc-embedded/cdk-extensions.VpcV2Attributes.property.vpcId"></a>
11301
+
11302
+ ```typescript
11303
+ public readonly vpcId: string;
11304
+ ```
11305
+
11306
+ - *Type:* string
11307
+
11308
+ The VPC ID to import.
11309
+
11310
+ This should be a concrete value, not a token.
11311
+
11312
+ ---
11313
+
10963
11314
  ### VpcV2Props <a name="VpcV2Props" id="@btc-embedded/cdk-extensions.VpcV2Props"></a>
10964
11315
 
10965
11316
  #### Initializer <a name="Initializer" id="@btc-embedded/cdk-extensions.VpcV2Props.Initializer"></a>
@@ -16419,6 +16770,33 @@ The security group of the exported ECS service.
16419
16770
 
16420
16771
  ---
16421
16772
 
16773
+ ### IHostedZone <a name="IHostedZone" id="@btc-embedded/cdk-extensions.IHostedZone"></a>
16774
+
16775
+ - *Implemented By:* <a href="#@btc-embedded/cdk-extensions.HostedZone">HostedZone</a>, <a href="#@btc-embedded/cdk-extensions.IHostedZone">IHostedZone</a>
16776
+
16777
+ Interface for a HostedZone construct.
16778
+
16779
+
16780
+ #### Properties <a name="Properties" id="Properties"></a>
16781
+
16782
+ | **Name** | **Type** | **Description** |
16783
+ | --- | --- | --- |
16784
+ | <code><a href="#@btc-embedded/cdk-extensions.IHostedZone.property.zone">zone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | The AWS Route53 HostedZone instance. |
16785
+
16786
+ ---
16787
+
16788
+ ##### `zone`<sup>Required</sup> <a name="zone" id="@btc-embedded/cdk-extensions.IHostedZone.property.zone"></a>
16789
+
16790
+ ```typescript
16791
+ public readonly zone: IHostedZone;
16792
+ ```
16793
+
16794
+ - *Type:* aws-cdk-lib.aws_route53.IHostedZone
16795
+
16796
+ The AWS Route53 HostedZone instance.
16797
+
16798
+ ---
16799
+
16422
16800
  ### IPrivateDnsNamespace <a name="IPrivateDnsNamespace" id="@btc-embedded/cdk-extensions.IPrivateDnsNamespace"></a>
16423
16801
 
16424
16802
  - *Implemented By:* <a href="#@btc-embedded/cdk-extensions.PrivateDnsNamespace">PrivateDnsNamespace</a>, <a href="#@btc-embedded/cdk-extensions.IPrivateDnsNamespace">IPrivateDnsNamespace</a>
@@ -16536,6 +16914,36 @@ Root access is granted (includes read-write access).
16536
16914
  ---
16537
16915
 
16538
16916
 
16917
+ ### HostedZoneMode <a name="HostedZoneMode" id="@btc-embedded/cdk-extensions.HostedZoneMode"></a>
16918
+
16919
+ Mode for hosted zone creation or lookup.
16920
+
16921
+ #### Members <a name="Members" id="Members"></a>
16922
+
16923
+ | **Name** | **Description** |
16924
+ | --- | --- |
16925
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneMode.CREATE">CREATE</a></code> | Create a new hosted zone. |
16926
+ | <code><a href="#@btc-embedded/cdk-extensions.HostedZoneMode.LOOKUP">LOOKUP</a></code> | Look up an existing hosted zone. |
16927
+
16928
+ ---
16929
+
16930
+ ##### `CREATE` <a name="CREATE" id="@btc-embedded/cdk-extensions.HostedZoneMode.CREATE"></a>
16931
+
16932
+ Create a new hosted zone.
16933
+
16934
+ ---
16935
+
16936
+
16937
+ ##### `LOOKUP` <a name="LOOKUP" id="@btc-embedded/cdk-extensions.HostedZoneMode.LOOKUP"></a>
16938
+
16939
+ Look up an existing hosted zone.
16940
+
16941
+ Requires AWS credentials during synthesis.
16942
+ The result is cached in cdk.context.json.
16943
+
16944
+ ---
16945
+
16946
+
16539
16947
  ### InvocationType <a name="InvocationType" id="@btc-embedded/cdk-extensions.InvocationType"></a>
16540
16948
 
16541
16949
  The invocation type of the step function.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,18 @@
1
1
 
2
+ ## [0.20.10](https://github.com/btc-embedded/cdk-extensions/compare/v0.20.9...v0.20.10) (2026-01-23)
3
+
4
+
5
+ ### Features
6
+
7
+ * add HostedZone construct ([b62ff58](https://github.com/btc-embedded/cdk-extensions/commit/b62ff582857b6c05ce5cd0a2b29ccf5b957351e2))
8
+
9
+ ## [0.20.9](https://github.com/btc-embedded/cdk-extensions/compare/v0.20.8...v0.20.9) (2026-01-22)
10
+
11
+
12
+ ### Features
13
+
14
+ * export api client scope and secret ([f67c3a9](https://github.com/btc-embedded/cdk-extensions/commit/f67c3a9b5b1e465e3feed1a3acd7c8c9f86520c8))
15
+
2
16
  ## [0.20.8](https://github.com/btc-embedded/cdk-extensions/compare/v0.20.7...v0.20.8) (2026-01-22)
3
17
 
4
18
 
@@ -6184,10 +6184,10 @@ var attributesSchema = zod_default.object({
6184
6184
  });
6185
6185
  var handler = async (event) => {
6186
6186
  try {
6187
- if (event.userName !== "ClientCredentials") {
6188
- return event;
6189
- }
6190
- logger.info("Triggering pre-token lambda for m2m.");
6187
+ const clientRequest = event.userName === "ClientCredentials";
6188
+ logger.info(
6189
+ `Triggering pre-token lambda for ${clientRequest ? "m2m" : "user"}.`
6190
+ );
6191
6191
  if (!process.env.DYNAMODB_TABLE_NAME) {
6192
6192
  throw new Error("DYNAMODB_TABLE_NAME environment variable is not set");
6193
6193
  }
@@ -6201,8 +6201,7 @@ var handler = async (event) => {
6201
6201
  throw new Error("ATTRIBUTES environment variable contains invalid JSON");
6202
6202
  }
6203
6203
  const { attributes } = result.data;
6204
- const clientId = retrieveClientId(event);
6205
- const claims = clientId ? await generateApiClientClaims(clientId, attributes) : generateUserClaims(event, attributes);
6204
+ const claims = clientRequest ? await generateApiClientClaims(event, attributes) : generateUserClaims(event, attributes);
6206
6205
  logger.debug("Claims to overwrite:", {
6207
6206
  ...claims
6208
6207
  });
@@ -6227,20 +6226,24 @@ var handler = async (event) => {
6227
6226
  throw error;
6228
6227
  }
6229
6228
  };
6230
- async function generateApiClientClaims(clientId, attributes) {
6231
- const user = API_CLIENT_PREFIX + clientId;
6229
+ async function generateApiClientClaims(event, attributes) {
6230
+ const apiKey = retrieveApiKey(event);
6232
6231
  const tableName = process.env.DYNAMODB_TABLE_NAME;
6233
- logger.debug("Client ID:", clientId);
6232
+ logger.debug("API key:", apiKey ?? "none");
6233
+ if (!apiKey) {
6234
+ throw new Error("No API key has been provided.");
6235
+ }
6234
6236
  const getCommand = new import_lib_dynamodb.GetCommand({
6235
6237
  TableName: tableName,
6236
6238
  Key: {
6237
- id: clientId
6239
+ id: apiKey
6238
6240
  }
6239
6241
  });
6240
6242
  const response = await docClient.send(getCommand);
6241
6243
  if (!response.Item) {
6242
- throw new Error(`Client ID ${clientId} is invalid`);
6244
+ throw new Error(`Api key ${apiKey} is invalid`);
6243
6245
  }
6246
+ const user = API_CLIENT_PREFIX + apiKey;
6244
6247
  return attributes.reduce(
6245
6248
  (prev, cur) => ({
6246
6249
  ...prev,
@@ -6250,7 +6253,7 @@ async function generateApiClientClaims(clientId, attributes) {
6250
6253
  );
6251
6254
  }
6252
6255
  function generateUserClaims(event, attributes) {
6253
- const user = event.request.userAttributes["cognito:username"];
6256
+ const user = event.request.userAttributes["cognito:username"] ?? event.userName;
6254
6257
  logger.debug("User:", user);
6255
6258
  return attributes.reduce(
6256
6259
  (prev, cur) => ({
@@ -6260,7 +6263,7 @@ function generateUserClaims(event, attributes) {
6260
6263
  { user }
6261
6264
  );
6262
6265
  }
6263
- function retrieveClientId(event) {
6266
+ function retrieveApiKey(event) {
6264
6267
  const clientId = event.request.clientMetadata?.["api-key"];
6265
6268
  return clientId?.startsWith(API_CLIENT_PREFIX) ? clientId.substring(API_CLIENT_PREFIX.length) : clientId;
6266
6269
  }
@@ -145,5 +145,5 @@ class EventPipe extends construct_1.Construct {
145
145
  }
146
146
  exports.EventPipe = EventPipe;
147
147
  _a = JSII_RTTI_SYMBOL_1;
148
- EventPipe[_a] = { fqn: "@btc-embedded/cdk-extensions.EventPipe", version: "0.20.9" };
148
+ EventPipe[_a] = { fqn: "@btc-embedded/cdk-extensions.EventPipe", version: "0.20.11" };
149
149
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRQaXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cnVjdHMvRXZlbnRQaXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQTBDO0FBQzFDLGlEQUE2RDtBQUU3RCxxREFBZ0Q7QUFHaEQsd0RBQXFEO0FBQ3JELDBDQUEwQztBQUMxQyx3RUFBdUU7QUFzQ3ZFLElBQVksUUFpQlg7QUFqQkQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gsdUJBQVcsQ0FBQTtJQUNYOztPQUVHO0lBQ0gsMkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gseUJBQWEsQ0FBQTtJQUNiOztPQUVHO0lBQ0gsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBakJXLFFBQVEsd0JBQVIsUUFBUSxRQWlCbkI7QUFFRDs7R0FFRztBQUNILElBQVksY0FjWDtBQWRELFdBQVksY0FBYztJQUN4Qjs7Ozs7T0FLRztJQUNILDJFQUFnQixDQUFBO0lBQ2hCOzs7O09BSUc7SUFDSCx5RUFBZSxDQUFBO0FBQ2pCLENBQUMsRUFkVyxjQUFjLDhCQUFkLGNBQWMsUUFjekI7QUEyRkQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBUztJQUd0QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxrQkFBa0IsR0FDcEIsY0FBYyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDekUsSUFBSSw0QkFBNEIsR0FDOUIsWUFBWSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFckUsSUFBSSxXQUFXLEdBQUcsT0FBTyxJ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QUUsQ0FBQztRQUVQLElBQUksbUJBQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQzdCLEdBQUcsaUJBQWlCO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUM3QixNQUFNLEVBQUUsU0FBUztZQUNqQixnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELFFBQVEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBcUI7UUFDMUMsT0FBTyxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUM7SUFDekUsQ0FBQzs7QUE5R0gsOEJBK0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFJvbGUsIFNlcnZpY2VQcmluY2lwYWwgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgSUxvZ0dyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgeyBDZm5QaXBlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1waXBlc1wiO1xuaW1wb3J0IHsgSVF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcbmltcG9ydCB7IElTdGF0ZU1hY2hpbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzL2xpYi9jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IEJUQ0xvZ0dyb3VwIH0gZnJvbSBcIi4uL3BsYXRmb3JtXCI7XG5pbXBvcnQgeyBpc0RlYWN0aXZhdGVkQ29uc3RydWN0IH0gZnJvbSBcIi4uL3V0aWxzL2RlYWN0aXZhdGVkQ29uc3RydWN0XCI7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgcGlwZSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRQaXBlUHJvcHMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBTUVMgcXVldWUuIE5vIG90aGVyIHNvdXJjZSB0eXBlcyBhcmUgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IElRdWV1ZTtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBTUVMgcXVldWUgb3IgdGFyZ2V0IHN0ZXAgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB0YXJnZXQ6IFRhcmdldFF1ZXVlIHwgVGFyZ2V0U3RlcEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSB1c2VkIGJ5IHRoZSBldmVudCBwaXBlLiBJZiBvbWl0dGVkLCBhIG5ldyByb2xlIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZmlsdGVyIGZvciB0aGUgcGlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlcj86IFBpcGVGaWx0ZXI7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbG9nIGxldmVsIGZvciB0aGUgcGlwZS4gQ3JlYXRlcyBhIG5ldyBsb2cgZ3JvdXAsIGlmIGVuYWJsZWQuXG4gICAqIERlZmF1bHQ6IERpc2FibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcblxuICAvKipcbiAgICogVXNlIGFuIGV4aXN0aW5nIGxvZyBncm91cC4gSWYgbm9uZSBpcyBnaXZlbiBhbmQgbG9nZ2luZyBpcyBlbmFibGVkLCBhIG5ldyBsb2cgZ3JvdXAgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXA/OiBJTG9nR3JvdXA7XG59XG5cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgbG9nZ2luZy4gTm8gbG9nIGdyb3VwIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIE9GRiA9IFwiT0ZGXCIsXG4gIC8qKlxuICAgKiBPbmx5IGxvZyBlcnJvcnMuXG4gICAqL1xuICBFUlJPUiA9IFwiRVJST1JcIixcbiAgLyoqXG4gICAqIExvZyBlcnJvcnMgYW5kIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuXG4gICAqL1xuICBJTkZPID0gXCJJTkZPXCIsXG4gIC8qKlxuICAgKiBMb2cgdmVyeSB2ZXJib3NlLlxuICAgKi9cbiAgVFJBQ0UgPSBcIlRSQUNFXCIsXG59XG5cbi8qKlxuICogVGhlIGludm9jYXRpb24gdHlwZSBvZiB0aGUgc3RlcCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gSW52b2NhdGlvblR5cGUge1xuICAvKipcbiAgICogKGRlZmF1bHQpIC0gSW52b2tlIHN5bmNocm9ub3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogW1N0YXJ0U3luY0V4ZWN1dGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3N0ZXAtZnVuY3Rpb25zL2xhdGVzdC9hcGlyZWZlcmVuY2UvQVBJX1N0YXJ0U3luY0V4ZWN1dGlvbi5odG1sKVxuICAgKiBpbiB0aGUgKkFXUyBTdGVwIEZ1bmN0aW9ucyBBUEkgUmVmZXJlbmNlKi5cbiAgICogPiBgUkVRVUVTVF9SRVNQT05TRWAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYFNUQU5EQVJEYCBzdGF0ZSBtYWNoaW5lIHdvcmtmbG93cy5cbiAgICovXG4gIFJFUVVFU1RfUkVTUE9OU0UsXG4gIC8qKlxuICAgKiBJbnZva2UgYXN5bmNocm9ub3VzbHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbiAgICogW1N0YXJ0RXhlY3V0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3RlcC1mdW5jdGlvbnMvbGF0ZXN0L2FwaXJlZmVyZW5jZS9BUElfU3RhcnRFeGVjdXRpb24uaHRtbClcbiAgICogaW4gdGhlICpBV1MgU3RlcCBGdW5jdGlvbnMgQVBJIFJlZmVyZW5jZSouXG4gICAqL1xuICBGSVJFX0FORF9GT1JHRVQsXG59XG5cbi8qKlxuICogVGhlIGlucHV0IHRlbXBsYXRlLlxuICogTm90ZSB0aGF0IHNvbWUgdmFsdWVzIGluIHRoZSByZXN1bHRpbmcgY29kZSBzaG91bGQgbm90IGhhdmUgcXVvdGVzIGFyb3VuZCB0aGUgdmFsdWUsIGUuZy4gaWYgYW4gb2JqZWN0XG4gKiBzaGFsbCBiZSBhZGRlZC4gVG8gcmVmbGVjdCB0aGlzLCBhZGQgY3VybHkgYnJhY2tldHMgYXJvdW5kIHRoZSB2YWx1ZSwgZS5nLiBge3s8JC5ib2R5Pn19YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNRUyBxdWV1ZSBhcyBwaXBlIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRRdWV1ZSB7XG4gIHJlYWRvbmx5IHF1ZXVlOiBJUXVldWU7XG59XG5cbi8qKlxuICogU3RlcEZ1bmN0aW9uIGFzIHBpcGUgdGFyZ2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFN0ZXBGdW5jdGlvbiB7XG4gIHJlYWRvbmx5IHN0ZXBGdW5jdGlvbjogSVN0YXRlTWFjaGluZTtcbiAgcmVhZG9ubHkgcGFyYW1ldGVycz86IFRhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgYSBzdGVwIGZ1bmN0aW9uIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXJnZXRTdGVwRnVuY3Rpb25QYXJhbWV0ZXJzIHtcbiAgcmVhZG9ubHkgaW5wdXRUZW1wbGF0ZT86IElucHV0VGVtcGxhdGU7XG4gIHJlYWRvbmx5IGludm9jYXRpb25UeXBlPzogSW52b2NhdGlvblR5cGU7XG59XG5cbi8qKlxuICogQmFzZSB0eXBlIGZvciBmaWx0ZXIgcnVsZXMuIE5vdCBhbGwgYXZhaWxhYmxlIHJ1bGVzIGFyZSBjdXJyZW50bHkgaW1wbGVtZW50ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIEZpbHRlclJ1bGUgPVxuICB8IFByZWZpeEZpbHRlclJ1bGVcbiAgfCBTdWZmaXhGaWx0ZXJSdWxlXG4gIHwgQW55dGhpbmdCdXRGaWx0ZXJSdWxlXG4gIHwgRmlsdGVyRXF1YWxzSWdub3JlQ2FzZTtcblxuLyoqXG4gKiBSdWxlIHRoYXQgYSBwcm9wZXJ0eSBoYXMgdG8gc3RhcnQgd2l0aCBhIHByZWZpeC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVmaXhGaWx0ZXJSdWxlIHtcbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmcgfCBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBhIHByb3BlcnR5IGhhcyB0byBlbmQgd2l0aCBhIHN1ZmZpeC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWZmaXhGaWx0ZXJSdWxlIHtcbiAgcmVhZG9ubHkgc3VmZml4OiBzdHJpbmcgfCBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBhbGxvd3MgYWxsIHZhbHVlcyBleGNlcHQgdGhlIGdpdmVuIG9uZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW55dGhpbmdCdXRGaWx0ZXJSdWxlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgXCJhbnl0aGluZy1idXRcIjogc3RyaW5nW10gfCBGaWx0ZXJSdWxlO1xufVxuXG4vKipcbiAqIFJ1bGUgdGhhdCBtYXRjaGVzIGEgc3RyaW5nLCBpZ25vcmluZyB0aGUgY2FzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJFcXVhbHNJZ25vcmVDYXNlIHtcbiAgLyoqXG4gICAqIEBqc2lpIGlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgXCJlcXVhbHMtaWdub3JlLWNhc2VcIjogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBmaWx0ZXIgZm9yIG1lc3NhZ2VzIGluIHRoZSBwaXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIHJ1bGVzIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgYm9keS5cbiAgICogQGpzaWkgaWdub3JlXG4gICAqL1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBGaWx0ZXJSdWxlW107XG59XG5cbi8qKlxuICogQSB3cmFwcGVyIGZvciB0aGUgTDEgZXZlbnQgcGlwZSB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlYWN0aXZhdGUgaXQgd2l0aGluIHRoZSBzdGFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50UGlwZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFdmVudFBpcGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgdGFyZ2V0U3RlcEZ1bmN0aW9uID1cbiAgICAgIFwic3RlcEZ1bmN0aW9uXCIgaW4gcHJvcHMudGFyZ2V0ID8gcHJvcHMudGFyZ2V0LnN0ZXBGdW5jdGlvbiA6IHVuZGVmaW5lZDtcbiAgICBsZXQgdGFyZ2V0U3RlcEZ1bmN0aW9uUGFyYW1ldGVycyA9XG4gICAgICBcInBhcmFtZXRlcnNcIiBpbiBwcm9wcy50YXJnZXQgPyBwcm9wcy50YXJnZXQucGFyYW1ldGVycyA6IHVuZGVmaW5lZDtcblxuICAgIGxldCB0YXJnZXRRdWV1ZSA9IFwicXVldWVcIiBpbiBwcm9wcy50YXJnZXQgPyBwcm9wcy50YXJnZXQucXVldWUgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgc3FzVGFyZ2V0ID0gdGFyZ2V0UXVldWUgIT09IHVuZGVmaW5lZDtcblxuICAgIGxldCB0YXJnZXRBcm4gPSBzcXNUYXJnZXRcbiAgICAgID8gdGFyZ2V0UXVldWUhLnF1ZXVlQXJuXG4gICAgICA6IHRhcmdldFN0ZXBGdW5jdGlvbiEuc3RhdGVNYWNoaW5lQXJuO1xuXG4gICAgbGV0IGRlc2lyZWRTdGF0ZSA9IFwiUlVOTklOR1wiO1xuICAgIGlmIChpc0RlYWN0aXZhdGVkQ29uc3RydWN0KGlkKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkSW5mbyhgJHtpZH0gaXMgc2V0IGRvIGJlIGRlYWN0aXZhdGVkLmApO1xuICAgICAgZGVzaXJlZFN0YXRlID0gXCJTVE9QUEVEXCI7XG4gICAgfVxuXG4gICAgdGhpcy5yb2xlID1cbiAgICAgIHByb3BzLnJvbGUgfHxcbiAgICAgIG5ldyBSb2xlKHRoaXMsIFwiRXZlbnRQaXBlUm9sZVwiLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJwaXBlcy5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgfSk7XG5cbiAgICBsZXQgZmlsdGVyQ3JpdGVyaWEgPSBwcm9wcy5maWx0ZXJcbiAgICAgID8ge1xuICAgICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0dGVybjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgIC4uLnByb3BzLmZpbHRlcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgdGFyZ2V0UGFyYW1ldGVyczogQ2ZuUGlwZS5QaXBlVGFyZ2V0UGFyYW1ldGVyc1Byb3BlcnR5ID0ge307XG4gICAgaWYgKHRhcmdldFF1ZXVlKSB7XG4gICAgICB0YXJnZXRQYXJhbWV0ZXJzID0ge1xuICAgICAgICBzcXNRdWV1ZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBtZXNzYWdlR3JvdXBJZDogXCJkZWZhdWx0XCIsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRQYXJhbWV0ZXJzID0ge1xuICAgICAgICBzdGVwRnVuY3Rpb25TdGF0ZU1hY2hpbmVQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgaW52b2NhdGlvblR5cGU6IHRhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnM/Lmludm9jYXRpb25UeXBlXG4gICAgICAgICAgICA/IEludm9jYXRpb25UeXBlW3RhcmdldFN0ZXBGdW5jdGlvblBhcmFtZXRlcnMuaW52b2NhdGlvblR5cGVdXG4gICAgICAgICAgICA6IEludm9jYXRpb25UeXBlW0ludm9jYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0VdLFxuICAgICAgICB9LFxuICAgICAgICAuLi4odGFyZ2V0U3RlcEZ1bmN0aW9uUGFyYW1ldGVycz8uaW5wdXRUZW1wbGF0ZSAmJiB7XG4gICAgICAgICAgaW5wdXRUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0YXJnZXRTdGVwRnVuY3Rpb25QYXJhbWV0ZXJzLmlucHV0VGVtcGxhdGUsXG4gICAgICAgICAgKS5yZXBsYWNlKC9cIlxce1xceyguKz8pXFx9XFx9XCIvLCBcIiQxXCIpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZVBhcmFtZXRlcnMgPSB7XG4gICAgICBzcXNRdWV1ZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgYmF0Y2hTaXplOiAxLFxuICAgICAgfSxcbiAgICAgIC4uLihmaWx0ZXJDcml0ZXJpYSAmJiB7IGZpbHRlckNyaXRlcmlhOiBmaWx0ZXJDcml0ZXJpYSB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgbG9nR3JvdXAgPSB0aGlzLmxvZ2dpbmdFbmFibGVkKHByb3BzKVxuICAgICAgPyAocHJvcHMubG9nR3JvdXAgPz9cbiAgICAgICAgbmV3IEJUQ0xvZ0dyb3VwKHRoaXMsIFwiRXZlbnRQaXBlTG9nR3JvdXBcIiwge1xuICAgICAgICAgIGxvZ1R5cGU6IFwiZXZlbnQtcGlwZVwiLFxuICAgICAgICB9KSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcGlwZUNvbmZpZ3VyYXRpb24gPSB0aGlzLmxvZ2dpbmdFbmFibGVkKHByb3BzKVxuICAgICAgPyB7XG4gICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgY2xvdWR3YXRjaExvZ3NMb2dEZXN0aW5hdGlvbjoge1xuICAgICAgICAgICAgICBsb2dHcm91cEFybjogbG9nR3JvdXAhLmxvZ0dyb3VwQXJuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxldmVsOiBwcm9wcy5sb2dMZXZlbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9O1xuXG4gICAgbmV3IENmblBpcGUodGhpcywgXCJFdmVudFBpcGVcIiwge1xuICAgICAgLi4ucGlwZUNvbmZpZ3VyYXRpb24sXG4gICAgICByb2xlQXJuOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIHNvdXJjZTogcHJvcHMuc291cmNlLnF1ZXVlQXJuLFxuICAgICAgdGFyZ2V0OiB0YXJnZXRBcm4sXG4gICAgICBzb3VyY2VQYXJhbWV0ZXJzOiBzb3VyY2VQYXJhbWV0ZXJzLFxuICAgICAgdGFyZ2V0UGFyYW1ldGVyczogdGFyZ2V0UGFyYW1ldGVycyxcbiAgICAgIGRlc2lyZWRTdGF0ZTogZGVzaXJlZFN0YXRlLFxuICAgIH0pO1xuXG4gICAgcHJvcHMuc291cmNlLmdyYW50Q29uc3VtZU1lc3NhZ2VzKHRoaXMucm9sZSk7XG4gICAgdGFyZ2V0UXVldWU/LmdyYW50U2VuZE1lc3NhZ2VzKHRoaXMucm9sZSk7XG4gICAgdGFyZ2V0U3RlcEZ1bmN0aW9uPy5ncmFudFN0YXJ0RXhlY3V0aW9uKHRoaXMucm9sZSk7XG4gICAgbG9nR3JvdXA/LmdyYW50V3JpdGUodGhpcy5yb2xlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nZ2luZ0VuYWJsZWQocHJvcHM6IEV2ZW50UGlwZVByb3BzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb3BzLmxvZ0xldmVsICE9PSB1bmRlZmluZWQgJiYgcHJvcHMubG9nTGV2ZWwgIT09IExvZ0xldmVsLk9GRjtcbiAgfVxufVxuIl19