token-injectable-docker-builder 1.3.0 → 1.3.2
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 +80 -31
- package/API.md +36 -37
- package/LICENSE +1 -1
- package/isComplete/isComplete.js +91 -68
- package/lib/index.d.ts +43 -34
- package/lib/index.js +47 -41
- package/package.json +10 -8
package/.jsii
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
]
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"aws-cdk-lib": "^2.
|
|
10
|
+
"aws-cdk-lib": "^2.173.2",
|
|
11
11
|
"constructs": "^10.0.5"
|
|
12
12
|
},
|
|
13
13
|
"dependencyClosure": {
|
|
@@ -1019,6 +1019,19 @@
|
|
|
1019
1019
|
}
|
|
1020
1020
|
}
|
|
1021
1021
|
},
|
|
1022
|
+
"aws-cdk-lib.aws_connectcampaignsv2": {
|
|
1023
|
+
"targets": {
|
|
1024
|
+
"dotnet": {
|
|
1025
|
+
"package": "Amazon.CDK.AWS.ConnectCampaignsV2"
|
|
1026
|
+
},
|
|
1027
|
+
"java": {
|
|
1028
|
+
"package": "software.amazon.awscdk.services.connectcampaignsv2"
|
|
1029
|
+
},
|
|
1030
|
+
"python": {
|
|
1031
|
+
"module": "aws_cdk.aws_connectcampaignsv2"
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
},
|
|
1022
1035
|
"aws-cdk-lib.aws_controltower": {
|
|
1023
1036
|
"targets": {
|
|
1024
1037
|
"dotnet": {
|
|
@@ -1838,6 +1851,19 @@
|
|
|
1838
1851
|
}
|
|
1839
1852
|
}
|
|
1840
1853
|
},
|
|
1854
|
+
"aws-cdk-lib.aws_invoicing": {
|
|
1855
|
+
"targets": {
|
|
1856
|
+
"dotnet": {
|
|
1857
|
+
"package": "Amazon.CDK.AWS.Invoicing"
|
|
1858
|
+
},
|
|
1859
|
+
"java": {
|
|
1860
|
+
"package": "software.amazon.awscdk.services.invoicing"
|
|
1861
|
+
},
|
|
1862
|
+
"python": {
|
|
1863
|
+
"module": "aws_cdk.aws_invoicing"
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
},
|
|
1841
1867
|
"aws-cdk-lib.aws_iot": {
|
|
1842
1868
|
"targets": {
|
|
1843
1869
|
"dotnet": {
|
|
@@ -2826,6 +2852,19 @@
|
|
|
2826
2852
|
}
|
|
2827
2853
|
}
|
|
2828
2854
|
},
|
|
2855
|
+
"aws-cdk-lib.aws_rbin": {
|
|
2856
|
+
"targets": {
|
|
2857
|
+
"dotnet": {
|
|
2858
|
+
"package": "Amazon.CDK.AWS.Rbin"
|
|
2859
|
+
},
|
|
2860
|
+
"java": {
|
|
2861
|
+
"package": "software.amazon.awscdk.services.rbin"
|
|
2862
|
+
},
|
|
2863
|
+
"python": {
|
|
2864
|
+
"module": "aws_cdk.aws_rbin"
|
|
2865
|
+
}
|
|
2866
|
+
}
|
|
2867
|
+
},
|
|
2829
2868
|
"aws-cdk-lib.aws_rds": {
|
|
2830
2869
|
"targets": {
|
|
2831
2870
|
"dotnet": {
|
|
@@ -3860,7 +3899,7 @@
|
|
|
3860
3899
|
"stability": "stable"
|
|
3861
3900
|
},
|
|
3862
3901
|
"homepage": "https://github.com/AlexTech314/TokenInjectableDockerBuilder.git",
|
|
3863
|
-
"jsiiVersion": "5.5.
|
|
3902
|
+
"jsiiVersion": "5.5.17 (build 2bbd2c1)",
|
|
3864
3903
|
"keywords": [
|
|
3865
3904
|
"aws",
|
|
3866
3905
|
"aws-cdk",
|
|
@@ -3920,31 +3959,41 @@
|
|
|
3920
3959
|
"base": "constructs.Construct",
|
|
3921
3960
|
"docs": {
|
|
3922
3961
|
"stability": "stable",
|
|
3923
|
-
"summary": "A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources,
|
|
3962
|
+
"summary": "A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources, **then** retrieve the final image tag so that ECS/Lambda references use the exact digest."
|
|
3924
3963
|
},
|
|
3925
3964
|
"fqn": "token-injectable-docker-builder.TokenInjectableDockerBuilder",
|
|
3926
3965
|
"initializer": {
|
|
3927
3966
|
"docs": {
|
|
3928
|
-
"stability": "stable"
|
|
3967
|
+
"stability": "stable",
|
|
3968
|
+
"summary": "Creates a new `TokenInjectableDockerBuilder`."
|
|
3929
3969
|
},
|
|
3930
3970
|
"locationInModule": {
|
|
3931
3971
|
"filename": "src/index.ts",
|
|
3932
|
-
"line":
|
|
3972
|
+
"line": 138
|
|
3933
3973
|
},
|
|
3934
3974
|
"parameters": [
|
|
3935
3975
|
{
|
|
3976
|
+
"docs": {
|
|
3977
|
+
"summary": "The scope in which to define this construct."
|
|
3978
|
+
},
|
|
3936
3979
|
"name": "scope",
|
|
3937
3980
|
"type": {
|
|
3938
3981
|
"fqn": "constructs.Construct"
|
|
3939
3982
|
}
|
|
3940
3983
|
},
|
|
3941
3984
|
{
|
|
3985
|
+
"docs": {
|
|
3986
|
+
"summary": "The scoped construct ID."
|
|
3987
|
+
},
|
|
3942
3988
|
"name": "id",
|
|
3943
3989
|
"type": {
|
|
3944
3990
|
"primitive": "string"
|
|
3945
3991
|
}
|
|
3946
3992
|
},
|
|
3947
3993
|
{
|
|
3994
|
+
"docs": {
|
|
3995
|
+
"summary": "Configuration for building and pushing the Docker image."
|
|
3996
|
+
},
|
|
3948
3997
|
"name": "props",
|
|
3949
3998
|
"type": {
|
|
3950
3999
|
"fqn": "token-injectable-docker-builder.TokenInjectableDockerBuilderProps"
|
|
@@ -3955,19 +4004,19 @@
|
|
|
3955
4004
|
"kind": "class",
|
|
3956
4005
|
"locationInModule": {
|
|
3957
4006
|
"filename": "src/index.ts",
|
|
3958
|
-
"line":
|
|
4007
|
+
"line": 113
|
|
3959
4008
|
},
|
|
3960
4009
|
"name": "TokenInjectableDockerBuilder",
|
|
3961
4010
|
"properties": [
|
|
3962
4011
|
{
|
|
3963
4012
|
"docs": {
|
|
3964
4013
|
"stability": "stable",
|
|
3965
|
-
"summary": "An ECS-compatible
|
|
4014
|
+
"summary": "An ECS-compatible container image referencing the tag of the built Docker image."
|
|
3966
4015
|
},
|
|
3967
4016
|
"immutable": true,
|
|
3968
4017
|
"locationInModule": {
|
|
3969
4018
|
"filename": "src/index.ts",
|
|
3970
|
-
"line":
|
|
4019
|
+
"line": 123
|
|
3971
4020
|
},
|
|
3972
4021
|
"name": "containerImage",
|
|
3973
4022
|
"type": {
|
|
@@ -3977,12 +4026,12 @@
|
|
|
3977
4026
|
{
|
|
3978
4027
|
"docs": {
|
|
3979
4028
|
"stability": "stable",
|
|
3980
|
-
"summary": "A Lambda-compatible DockerImageCode referencing the
|
|
4029
|
+
"summary": "A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image."
|
|
3981
4030
|
},
|
|
3982
4031
|
"immutable": true,
|
|
3983
4032
|
"locationInModule": {
|
|
3984
4033
|
"filename": "src/index.ts",
|
|
3985
|
-
"line":
|
|
4034
|
+
"line": 129
|
|
3986
4035
|
},
|
|
3987
4036
|
"name": "dockerImageCode",
|
|
3988
4037
|
"type": {
|
|
@@ -4003,7 +4052,7 @@
|
|
|
4003
4052
|
"kind": "interface",
|
|
4004
4053
|
"locationInModule": {
|
|
4005
4054
|
"filename": "src/index.ts",
|
|
4006
|
-
"line":
|
|
4055
|
+
"line": 19
|
|
4007
4056
|
},
|
|
4008
4057
|
"name": "TokenInjectableDockerBuilderProps",
|
|
4009
4058
|
"properties": [
|
|
@@ -4016,7 +4065,7 @@
|
|
|
4016
4065
|
"immutable": true,
|
|
4017
4066
|
"locationInModule": {
|
|
4018
4067
|
"filename": "src/index.ts",
|
|
4019
|
-
"line":
|
|
4068
|
+
"line": 23
|
|
4020
4069
|
},
|
|
4021
4070
|
"name": "path",
|
|
4022
4071
|
"type": {
|
|
@@ -4027,14 +4076,14 @@
|
|
|
4027
4076
|
"abstract": true,
|
|
4028
4077
|
"docs": {
|
|
4029
4078
|
"example": "{\n TOKEN: 'my-secret-token',\n ENV: 'production'\n}",
|
|
4030
|
-
"remarks": "These are transformed into `--build-arg` flags.",
|
|
4079
|
+
"remarks": "These are transformed into `--build-arg KEY=VALUE` flags.",
|
|
4031
4080
|
"stability": "stable",
|
|
4032
4081
|
"summary": "Build arguments to pass to the Docker build process."
|
|
4033
4082
|
},
|
|
4034
4083
|
"immutable": true,
|
|
4035
4084
|
"locationInModule": {
|
|
4036
4085
|
"filename": "src/index.ts",
|
|
4037
|
-
"line":
|
|
4086
|
+
"line": 34
|
|
4038
4087
|
},
|
|
4039
4088
|
"name": "buildArgs",
|
|
4040
4089
|
"optional": true,
|
|
@@ -4051,14 +4100,14 @@
|
|
|
4051
4100
|
"abstract": true,
|
|
4052
4101
|
"docs": {
|
|
4053
4102
|
"example": "'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'",
|
|
4054
|
-
"remarks": "This secret should store a JSON object with the following structure:\n```json\n{\n \"username\": \"my-docker-username\",\n \"password\": \"my-docker-password\"\n}\n```\nIf not provided (or not needed), the construct will skip Docker Hub login.\
|
|
4103
|
+
"remarks": "This secret should store a JSON object with the following structure:\n```json\n{\n \"username\": \"my-docker-username\",\n \"password\": \"my-docker-password\"\n}\n```\nIf not provided (or not needed), the construct will skip Docker Hub login.\n\n**Note**: The secret must be in the same region as the stack.",
|
|
4055
4104
|
"stability": "stable",
|
|
4056
4105
|
"summary": "The ARN of the AWS Secrets Manager secret containing Docker login credentials."
|
|
4057
4106
|
},
|
|
4058
4107
|
"immutable": true,
|
|
4059
4108
|
"locationInModule": {
|
|
4060
4109
|
"filename": "src/index.ts",
|
|
4061
|
-
"line":
|
|
4110
|
+
"line": 51
|
|
4062
4111
|
},
|
|
4063
4112
|
"name": "dockerLoginSecretArn",
|
|
4064
4113
|
"optional": true,
|
|
@@ -4070,14 +4119,14 @@
|
|
|
4070
4119
|
"abstract": true,
|
|
4071
4120
|
"docs": {
|
|
4072
4121
|
"default": "- No additional install commands.",
|
|
4073
|
-
"remarks": "**Example
|
|
4122
|
+
"remarks": "**Example**:\n```ts\ninstallCommands: [\n 'echo \"Updating package lists...\"',\n 'apt-get update -y',\n 'echo \"Installing required packages...\"',\n 'apt-get install -y curl dnsutils',\n],\n```",
|
|
4074
4123
|
"stability": "stable",
|
|
4075
|
-
"summary": "Custom commands to run during the install phase."
|
|
4124
|
+
"summary": "Custom commands to run during the install phase of CodeBuild."
|
|
4076
4125
|
},
|
|
4077
4126
|
"immutable": true,
|
|
4078
4127
|
"locationInModule": {
|
|
4079
4128
|
"filename": "src/index.ts",
|
|
4080
|
-
"line":
|
|
4129
|
+
"line": 91
|
|
4081
4130
|
},
|
|
4082
4131
|
"name": "installCommands",
|
|
4083
4132
|
"optional": true,
|
|
@@ -4094,14 +4143,14 @@
|
|
|
4094
4143
|
"abstract": true,
|
|
4095
4144
|
"docs": {
|
|
4096
4145
|
"default": "- No additional pre-build commands.",
|
|
4097
|
-
"remarks": "**Example
|
|
4146
|
+
"remarks": "**Example**:\n```ts\npreBuildCommands: [\n 'echo \"Fetching configuration from private API...\"',\n 'curl -o config.json https://api.example.com/config',\n],\n```",
|
|
4098
4147
|
"stability": "stable",
|
|
4099
|
-
"summary": "Custom commands to run during the pre_build phase."
|
|
4148
|
+
"summary": "Custom commands to run during the pre_build phase of CodeBuild."
|
|
4100
4149
|
},
|
|
4101
4150
|
"immutable": true,
|
|
4102
4151
|
"locationInModule": {
|
|
4103
4152
|
"filename": "src/index.ts",
|
|
4104
|
-
"line":
|
|
4153
|
+
"line": 105
|
|
4105
4154
|
},
|
|
4106
4155
|
"name": "preBuildCommands",
|
|
4107
4156
|
"optional": true,
|
|
@@ -4117,15 +4166,15 @@
|
|
|
4117
4166
|
{
|
|
4118
4167
|
"abstract": true,
|
|
4119
4168
|
"docs": {
|
|
4120
|
-
"default": "No security groups are attached.",
|
|
4121
|
-
"remarks": "These
|
|
4169
|
+
"default": "- No security groups are attached.",
|
|
4170
|
+
"remarks": "These define the network access rules for the CodeBuild project.",
|
|
4122
4171
|
"stability": "stable",
|
|
4123
4172
|
"summary": "The security groups to attach to the CodeBuild project."
|
|
4124
4173
|
},
|
|
4125
4174
|
"immutable": true,
|
|
4126
4175
|
"locationInModule": {
|
|
4127
4176
|
"filename": "src/index.ts",
|
|
4128
|
-
"line":
|
|
4177
|
+
"line": 67
|
|
4129
4178
|
},
|
|
4130
4179
|
"name": "securityGroups",
|
|
4131
4180
|
"optional": true,
|
|
@@ -4141,7 +4190,7 @@
|
|
|
4141
4190
|
{
|
|
4142
4191
|
"abstract": true,
|
|
4143
4192
|
"docs": {
|
|
4144
|
-
"default": "All subnets in the VPC are used.",
|
|
4193
|
+
"default": "- All subnets in the VPC are used.",
|
|
4145
4194
|
"remarks": "Allows the user to select private, public, or isolated subnets.",
|
|
4146
4195
|
"stability": "stable",
|
|
4147
4196
|
"summary": "The subnet selection to specify which subnets to use within the VPC."
|
|
@@ -4149,7 +4198,7 @@
|
|
|
4149
4198
|
"immutable": true,
|
|
4150
4199
|
"locationInModule": {
|
|
4151
4200
|
"filename": "src/index.ts",
|
|
4152
|
-
"line":
|
|
4201
|
+
"line": 75
|
|
4153
4202
|
},
|
|
4154
4203
|
"name": "subnetSelection",
|
|
4155
4204
|
"optional": true,
|
|
@@ -4160,7 +4209,7 @@
|
|
|
4160
4209
|
{
|
|
4161
4210
|
"abstract": true,
|
|
4162
4211
|
"docs": {
|
|
4163
|
-
"default": "No VPC is attached, and the CodeBuild project will use public internet.",
|
|
4212
|
+
"default": "- No VPC is attached, and the CodeBuild project will use public internet.",
|
|
4164
4213
|
"remarks": "If provided, the CodeBuild project will be launched within the specified VPC.",
|
|
4165
4214
|
"stability": "stable",
|
|
4166
4215
|
"summary": "The VPC in which the CodeBuild project will be deployed."
|
|
@@ -4168,7 +4217,7 @@
|
|
|
4168
4217
|
"immutable": true,
|
|
4169
4218
|
"locationInModule": {
|
|
4170
4219
|
"filename": "src/index.ts",
|
|
4171
|
-
"line":
|
|
4220
|
+
"line": 59
|
|
4172
4221
|
},
|
|
4173
4222
|
"name": "vpc",
|
|
4174
4223
|
"optional": true,
|
|
@@ -4180,6 +4229,6 @@
|
|
|
4180
4229
|
"symbolId": "src/index:TokenInjectableDockerBuilderProps"
|
|
4181
4230
|
}
|
|
4182
4231
|
},
|
|
4183
|
-
"version": "1.3.
|
|
4184
|
-
"fingerprint": "
|
|
4232
|
+
"version": "1.3.2",
|
|
4233
|
+
"fingerprint": "wJDs0q3ApIhWraxUB0B+6KYlND78J8+CeIAXA0yZcS0="
|
|
4185
4234
|
}
|
package/API.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
### TokenInjectableDockerBuilder <a name="TokenInjectableDockerBuilder" id="token-injectable-docker-builder.TokenInjectableDockerBuilder"></a>
|
|
6
6
|
|
|
7
|
-
A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources,
|
|
7
|
+
A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources, **then** retrieve the final image tag so that ECS/Lambda references use the exact digest.
|
|
8
8
|
|
|
9
9
|
#### Initializers <a name="Initializers" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer"></a>
|
|
10
10
|
|
|
@@ -16,9 +16,9 @@ new TokenInjectableDockerBuilder(scope: Construct, id: string, props: TokenInjec
|
|
|
16
16
|
|
|
17
17
|
| **Name** | **Type** | **Description** |
|
|
18
18
|
| --- | --- | --- |
|
|
19
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> |
|
|
20
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id">id</a></code> | <code>string</code> |
|
|
21
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props">props</a></code> | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a></code> |
|
|
19
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | The scope in which to define this construct. |
|
|
20
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id">id</a></code> | <code>string</code> | The scoped construct ID. |
|
|
21
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props">props</a></code> | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a></code> | Configuration for building and pushing the Docker image. |
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
@@ -26,18 +26,24 @@ new TokenInjectableDockerBuilder(scope: Construct, id: string, props: TokenInjec
|
|
|
26
26
|
|
|
27
27
|
- *Type:* constructs.Construct
|
|
28
28
|
|
|
29
|
+
The scope in which to define this construct.
|
|
30
|
+
|
|
29
31
|
---
|
|
30
32
|
|
|
31
33
|
##### `id`<sup>Required</sup> <a name="id" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id"></a>
|
|
32
34
|
|
|
33
35
|
- *Type:* string
|
|
34
36
|
|
|
37
|
+
The scoped construct ID.
|
|
38
|
+
|
|
35
39
|
---
|
|
36
40
|
|
|
37
41
|
##### `props`<sup>Required</sup> <a name="props" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.props"></a>
|
|
38
42
|
|
|
39
43
|
- *Type:* <a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps">TokenInjectableDockerBuilderProps</a>
|
|
40
44
|
|
|
45
|
+
Configuration for building and pushing the Docker image.
|
|
46
|
+
|
|
41
47
|
---
|
|
42
48
|
|
|
43
49
|
#### Methods <a name="Methods" id="Methods"></a>
|
|
@@ -87,8 +93,8 @@ Any object.
|
|
|
87
93
|
| **Name** | **Type** | **Description** |
|
|
88
94
|
| --- | --- | --- |
|
|
89
95
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
|
|
90
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.containerImage">containerImage</a></code> | <code>aws-cdk-lib.aws_ecs.ContainerImage</code> | An ECS-compatible
|
|
91
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> | A Lambda-compatible DockerImageCode referencing the
|
|
96
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.containerImage">containerImage</a></code> | <code>aws-cdk-lib.aws_ecs.ContainerImage</code> | An ECS-compatible container image referencing the tag of the built Docker image. |
|
|
97
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> | A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image. |
|
|
92
98
|
|
|
93
99
|
---
|
|
94
100
|
|
|
@@ -112,7 +118,7 @@ public readonly containerImage: ContainerImage;
|
|
|
112
118
|
|
|
113
119
|
- *Type:* aws-cdk-lib.aws_ecs.ContainerImage
|
|
114
120
|
|
|
115
|
-
An ECS-compatible
|
|
121
|
+
An ECS-compatible container image referencing the tag of the built Docker image.
|
|
116
122
|
|
|
117
123
|
---
|
|
118
124
|
|
|
@@ -124,7 +130,7 @@ public readonly dockerImageCode: DockerImageCode;
|
|
|
124
130
|
|
|
125
131
|
- *Type:* aws-cdk-lib.aws_lambda.DockerImageCode
|
|
126
132
|
|
|
127
|
-
A Lambda-compatible DockerImageCode referencing the
|
|
133
|
+
A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image.
|
|
128
134
|
|
|
129
135
|
---
|
|
130
136
|
|
|
@@ -150,8 +156,8 @@ const tokenInjectableDockerBuilderProps: TokenInjectableDockerBuilderProps = { .
|
|
|
150
156
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.path">path</a></code> | <code>string</code> | The path to the directory containing the Dockerfile or source code. |
|
|
151
157
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.buildArgs">buildArgs</a></code> | <code>{[ key: string ]: string}</code> | Build arguments to pass to the Docker build process. |
|
|
152
158
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.dockerLoginSecretArn">dockerLoginSecretArn</a></code> | <code>string</code> | The ARN of the AWS Secrets Manager secret containing Docker login credentials. |
|
|
153
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.installCommands">installCommands</a></code> | <code>string[]</code> | Custom commands to run during the install phase. |
|
|
154
|
-
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.preBuildCommands">preBuildCommands</a></code> | <code>string[]</code> | Custom commands to run during the pre_build phase. |
|
|
159
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.installCommands">installCommands</a></code> | <code>string[]</code> | Custom commands to run during the install phase of CodeBuild. |
|
|
160
|
+
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.preBuildCommands">preBuildCommands</a></code> | <code>string[]</code> | Custom commands to run during the pre_build phase of CodeBuild. |
|
|
155
161
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.securityGroups">securityGroups</a></code> | <code>aws-cdk-lib.aws_ec2.ISecurityGroup[]</code> | The security groups to attach to the CodeBuild project. |
|
|
156
162
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.subnetSelection">subnetSelection</a></code> | <code>aws-cdk-lib.aws_ec2.SubnetSelection</code> | The subnet selection to specify which subnets to use within the VPC. |
|
|
157
163
|
| <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | The VPC in which the CodeBuild project will be deployed. |
|
|
@@ -180,7 +186,7 @@ public readonly buildArgs: {[ key: string ]: string};
|
|
|
180
186
|
|
|
181
187
|
Build arguments to pass to the Docker build process.
|
|
182
188
|
|
|
183
|
-
These are transformed into `--build-arg` flags.
|
|
189
|
+
These are transformed into `--build-arg KEY=VALUE` flags.
|
|
184
190
|
|
|
185
191
|
---
|
|
186
192
|
|
|
@@ -212,7 +218,8 @@ This secret should store a JSON object with the following structure:
|
|
|
212
218
|
}
|
|
213
219
|
```
|
|
214
220
|
If not provided (or not needed), the construct will skip Docker Hub login.
|
|
215
|
-
|
|
221
|
+
|
|
222
|
+
**Note**: The secret must be in the same region as the stack.
|
|
216
223
|
|
|
217
224
|
---
|
|
218
225
|
|
|
@@ -232,20 +239,16 @@ public readonly installCommands: string[];
|
|
|
232
239
|
- *Type:* string[]
|
|
233
240
|
- *Default:* No additional install commands.
|
|
234
241
|
|
|
235
|
-
Custom commands to run during the install phase.
|
|
242
|
+
Custom commands to run during the install phase of CodeBuild.
|
|
236
243
|
|
|
237
|
-
**Example
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
'apt-get install -y curl dnsutils',
|
|
246
|
-
],
|
|
247
|
-
// ... other properties ...
|
|
248
|
-
});
|
|
244
|
+
**Example**:
|
|
245
|
+
```ts
|
|
246
|
+
installCommands: [
|
|
247
|
+
'echo "Updating package lists..."',
|
|
248
|
+
'apt-get update -y',
|
|
249
|
+
'echo "Installing required packages..."',
|
|
250
|
+
'apt-get install -y curl dnsutils',
|
|
251
|
+
],
|
|
249
252
|
```
|
|
250
253
|
|
|
251
254
|
---
|
|
@@ -259,18 +262,14 @@ public readonly preBuildCommands: string[];
|
|
|
259
262
|
- *Type:* string[]
|
|
260
263
|
- *Default:* No additional pre-build commands.
|
|
261
264
|
|
|
262
|
-
Custom commands to run during the pre_build phase.
|
|
265
|
+
Custom commands to run during the pre_build phase of CodeBuild.
|
|
263
266
|
|
|
264
|
-
**Example
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
'curl -o config.json https://api.example.com/config',
|
|
271
|
-
],
|
|
272
|
-
// ... other properties ...
|
|
273
|
-
});
|
|
267
|
+
**Example**:
|
|
268
|
+
```ts
|
|
269
|
+
preBuildCommands: [
|
|
270
|
+
'echo "Fetching configuration from private API..."',
|
|
271
|
+
'curl -o config.json https://api.example.com/config',
|
|
272
|
+
],
|
|
274
273
|
```
|
|
275
274
|
|
|
276
275
|
---
|
|
@@ -286,7 +285,7 @@ public readonly securityGroups: ISecurityGroup[];
|
|
|
286
285
|
|
|
287
286
|
The security groups to attach to the CodeBuild project.
|
|
288
287
|
|
|
289
|
-
These
|
|
288
|
+
These define the network access rules for the CodeBuild project.
|
|
290
289
|
|
|
291
290
|
---
|
|
292
291
|
|
package/LICENSE
CHANGED
package/isComplete/isComplete.js
CHANGED
|
@@ -1,97 +1,120 @@
|
|
|
1
|
-
const {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
const {
|
|
2
|
+
CodeBuildClient,
|
|
3
|
+
ListBuildsForProjectCommand,
|
|
4
|
+
BatchGetBuildsCommand,
|
|
5
|
+
} = require('@aws-sdk/client-codebuild');
|
|
6
|
+
const {
|
|
7
|
+
CloudWatchLogsClient,
|
|
8
|
+
GetLogEventsCommand,
|
|
9
|
+
} = require('@aws-sdk/client-cloudwatch-logs');
|
|
10
|
+
|
|
11
|
+
exports.handler = async (event) => {
|
|
12
|
+
console.log('--- isComplete Handler Invoked ---');
|
|
13
|
+
console.log('AWS_REGION:', process.env.AWS_REGION);
|
|
14
|
+
console.log('Event:', JSON.stringify(event, null, 2));
|
|
15
|
+
|
|
16
|
+
const region = process.env.AWS_REGION;
|
|
17
|
+
const codebuildClient = new CodeBuildClient({ region });
|
|
18
|
+
const logsClient = new CloudWatchLogsClient({ region });
|
|
10
19
|
|
|
11
20
|
try {
|
|
12
|
-
const projectName = event.ResourceProperties
|
|
21
|
+
const projectName = event.ResourceProperties?.ProjectName;
|
|
22
|
+
console.log('ProjectName from ResourceProperties:', projectName);
|
|
13
23
|
|
|
14
24
|
if (!projectName) {
|
|
15
|
-
throw new Error('ProjectName
|
|
25
|
+
throw new Error('Missing ProjectName in ResourceProperties');
|
|
16
26
|
}
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
sortOrder: 'DESCENDING',
|
|
24
|
-
maxResults: 1,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const listBuildsResp = await codebuildClient.send(listBuildsCommand);
|
|
28
|
-
const buildIds = listBuildsResp.ids;
|
|
28
|
+
// Handle Delete requests gracefully
|
|
29
|
+
if (event.RequestType === 'Delete') {
|
|
30
|
+
console.log('Delete request detected. Marking resource as complete.');
|
|
31
|
+
return { IsComplete: true };
|
|
32
|
+
}
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
// 1) Retrieve the latest build ID for this project
|
|
35
|
+
console.log('Querying CodeBuild for the most recent build...');
|
|
36
|
+
const listResp = await codebuildClient.send(
|
|
37
|
+
new ListBuildsForProjectCommand({
|
|
38
|
+
projectName,
|
|
39
|
+
sortOrder: 'DESCENDING',
|
|
40
|
+
maxResults: 1,
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
console.log('ListBuildsForProjectCommand response:', JSON.stringify(listResp, null, 2));
|
|
44
|
+
|
|
45
|
+
if (!listResp.ids || listResp.ids.length === 0) {
|
|
31
46
|
throw new Error(`No builds found for project: ${projectName}`);
|
|
32
47
|
}
|
|
33
48
|
|
|
34
|
-
const buildId =
|
|
35
|
-
console.log(`
|
|
49
|
+
const buildId = listResp.ids[0];
|
|
50
|
+
console.log(`Identified latest Build ID: ${buildId}`);
|
|
36
51
|
|
|
37
|
-
// Get build
|
|
38
|
-
const
|
|
39
|
-
ids: [buildId]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const buildDetailsResp = await codebuildClient.send(batchGetBuildsCommand);
|
|
43
|
-
const build = buildDetailsResp.builds[0];
|
|
52
|
+
// 2) Get details about that specific build
|
|
53
|
+
const batchResp = await codebuildClient.send(
|
|
54
|
+
new BatchGetBuildsCommand({ ids: [buildId] })
|
|
55
|
+
);
|
|
56
|
+
console.log('BatchGetBuildsCommand response:', JSON.stringify(batchResp, null, 2));
|
|
44
57
|
|
|
58
|
+
const build = batchResp.builds?.[0];
|
|
45
59
|
if (!build) {
|
|
46
60
|
throw new Error(`Build details not found for Build ID: ${buildId}`);
|
|
47
61
|
}
|
|
48
62
|
|
|
49
63
|
const buildStatus = build.buildStatus;
|
|
50
|
-
console.log(`
|
|
64
|
+
console.log(`The build status for ID ${buildId} is: ${buildStatus}`);
|
|
51
65
|
|
|
66
|
+
// Check for in-progress status
|
|
52
67
|
if (buildStatus === 'IN_PROGRESS') {
|
|
53
|
-
|
|
54
|
-
console.log('Build is still in progress.');
|
|
68
|
+
console.log('Build is still in progress. Requesting more time...');
|
|
55
69
|
return { IsComplete: false };
|
|
56
|
-
}
|
|
57
|
-
// Build succeeded
|
|
58
|
-
console.log('Build succeeded.');
|
|
59
|
-
return { IsComplete: true };
|
|
60
|
-
} else if (['FAILED', 'FAULT', 'STOPPED', 'TIMED_OUT'].includes(buildStatus)) {
|
|
61
|
-
// Build failed; retrieve last 5 log lines
|
|
62
|
-
const logsInfo = build.logs;
|
|
63
|
-
if (logsInfo && logsInfo.groupName && logsInfo.streamName) {
|
|
64
|
-
console.log(`Retrieving logs from CloudWatch Logs Group: ${logsInfo.groupName}, Stream: ${logsInfo.streamName}`);
|
|
65
|
-
|
|
66
|
-
const getLogEventsCommand = new GetLogEventsCommand({
|
|
67
|
-
logGroupName: logsInfo.groupName,
|
|
68
|
-
logStreamName: logsInfo.streamName,
|
|
69
|
-
startFromHead: false, // Start from the end to get latest logs
|
|
70
|
-
limit: 5,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
const logEventsResp = await cloudwatchlogsClient.send(getLogEventsCommand);
|
|
74
|
-
const logEvents = logEventsResp.events;
|
|
75
|
-
const lastFiveMessages = logEvents.map((event) => event.message).reverse().join('\n');
|
|
70
|
+
}
|
|
76
71
|
|
|
77
|
-
|
|
78
|
-
|
|
72
|
+
// If build succeeded, retrieve the final artifact with the digest
|
|
73
|
+
if (buildStatus === 'SUCCEEDED') {
|
|
74
|
+
return {
|
|
75
|
+
IsComplete: true,
|
|
76
|
+
Data: {
|
|
77
|
+
ImageTag: process.env.IMAGE_TAG,
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
79
81
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
// If the build is in a failed status, retrieve CloudWatch logs
|
|
83
|
+
if (['FAILED', 'FAULT', 'STOPPED', 'TIMED_OUT'].includes(buildStatus)) {
|
|
84
|
+
console.log(`Build ended with status: ${buildStatus}. Attempting to retrieve last log lines...`);
|
|
85
|
+
const logsInfo = build.logs;
|
|
86
|
+
console.log('Logs info:', JSON.stringify(logsInfo, null, 2));
|
|
87
|
+
|
|
88
|
+
if (logsInfo?.groupName && logsInfo?.streamName) {
|
|
89
|
+
console.log(`Retrieving up to 5 log events from CloudWatch Logs in group ${logsInfo.groupName} stream ${logsInfo.streamName}`);
|
|
90
|
+
const logResp = await logsClient.send(
|
|
91
|
+
new GetLogEventsCommand({
|
|
92
|
+
logGroupName: logsInfo.groupName,
|
|
93
|
+
logStreamName: logsInfo.streamName,
|
|
94
|
+
startFromHead: false,
|
|
95
|
+
limit: 5,
|
|
96
|
+
})
|
|
97
|
+
);
|
|
98
|
+
console.log('GetLogEventsCommand response:', JSON.stringify(logResp, null, 2));
|
|
99
|
+
|
|
100
|
+
const logEvents = logResp.events || [];
|
|
101
|
+
const lastFive = logEvents.map(e => e.message).reverse().join('\n');
|
|
102
|
+
console.error('Last 5 build log lines:\n', lastFive);
|
|
103
|
+
|
|
104
|
+
throw new Error(`Build failed with status ${buildStatus}. Last logs:\n${lastFive}`);
|
|
82
105
|
} else {
|
|
83
|
-
|
|
84
|
-
console.error(errorMessage);
|
|
85
|
-
throw new Error(errorMessage);
|
|
106
|
+
throw new Error(`Build failed with status: ${buildStatus}, but no logs found.`);
|
|
86
107
|
}
|
|
87
|
-
} else {
|
|
88
|
-
const errorMessage = `Unknown build status: ${buildStatus}`;
|
|
89
|
-
console.error(errorMessage);
|
|
90
|
-
throw new Error(errorMessage);
|
|
91
108
|
}
|
|
109
|
+
|
|
110
|
+
// If we reach here, it's an unexpected status
|
|
111
|
+
console.log(`Encountered unknown build status: ${buildStatus}`);
|
|
112
|
+
throw new Error(`Unknown build status: ${buildStatus}`);
|
|
113
|
+
|
|
92
114
|
} catch (error) {
|
|
93
|
-
console.error('
|
|
94
|
-
|
|
115
|
+
console.error('--- Caught an error in isComplete handler ---');
|
|
116
|
+
console.error('Error details:', error);
|
|
117
|
+
// re-throw for CloudFormation to see the error
|
|
95
118
|
throw error;
|
|
96
119
|
}
|
|
97
120
|
};
|
package/lib/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
12
12
|
readonly path: string;
|
|
13
13
|
/**
|
|
14
14
|
* Build arguments to pass to the Docker build process.
|
|
15
|
-
* These are transformed into `--build-arg` flags.
|
|
15
|
+
* These are transformed into `--build-arg KEY=VALUE` flags.
|
|
16
16
|
* @example
|
|
17
17
|
* {
|
|
18
18
|
* TOKEN: 'my-secret-token',
|
|
@@ -32,7 +32,8 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
32
32
|
* }
|
|
33
33
|
* ```
|
|
34
34
|
* If not provided (or not needed), the construct will skip Docker Hub login.
|
|
35
|
-
*
|
|
35
|
+
*
|
|
36
|
+
* **Note**: The secret must be in the same region as the stack.
|
|
36
37
|
*
|
|
37
38
|
* @example 'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'
|
|
38
39
|
*/
|
|
@@ -40,71 +41,79 @@ export interface TokenInjectableDockerBuilderProps {
|
|
|
40
41
|
/**
|
|
41
42
|
* The VPC in which the CodeBuild project will be deployed.
|
|
42
43
|
* If provided, the CodeBuild project will be launched within the specified VPC.
|
|
43
|
-
*
|
|
44
|
+
*
|
|
45
|
+
* @default - No VPC is attached, and the CodeBuild project will use public internet.
|
|
44
46
|
*/
|
|
45
47
|
readonly vpc?: IVpc;
|
|
46
48
|
/**
|
|
47
49
|
* The security groups to attach to the CodeBuild project.
|
|
48
|
-
* These
|
|
49
|
-
*
|
|
50
|
+
* These define the network access rules for the CodeBuild project.
|
|
51
|
+
*
|
|
52
|
+
* @default - No security groups are attached.
|
|
50
53
|
*/
|
|
51
54
|
readonly securityGroups?: ISecurityGroup[];
|
|
52
55
|
/**
|
|
53
56
|
* The subnet selection to specify which subnets to use within the VPC.
|
|
54
57
|
* Allows the user to select private, public, or isolated subnets.
|
|
55
|
-
*
|
|
58
|
+
*
|
|
59
|
+
* @default - All subnets in the VPC are used.
|
|
56
60
|
*/
|
|
57
61
|
readonly subnetSelection?: SubnetSelection;
|
|
58
62
|
/**
|
|
59
|
-
* Custom commands to run during the install phase.
|
|
63
|
+
* Custom commands to run during the install phase of CodeBuild.
|
|
60
64
|
*
|
|
61
|
-
* **Example
|
|
62
|
-
* ```
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* 'apt-get install -y curl dnsutils',
|
|
70
|
-
* ],
|
|
71
|
-
* // ... other properties ...
|
|
72
|
-
* });
|
|
65
|
+
* **Example**:
|
|
66
|
+
* ```ts
|
|
67
|
+
* installCommands: [
|
|
68
|
+
* 'echo "Updating package lists..."',
|
|
69
|
+
* 'apt-get update -y',
|
|
70
|
+
* 'echo "Installing required packages..."',
|
|
71
|
+
* 'apt-get install -y curl dnsutils',
|
|
72
|
+
* ],
|
|
73
73
|
* ```
|
|
74
74
|
* @default - No additional install commands.
|
|
75
75
|
*/
|
|
76
76
|
readonly installCommands?: string[];
|
|
77
77
|
/**
|
|
78
|
-
* Custom commands to run during the pre_build phase.
|
|
78
|
+
* Custom commands to run during the pre_build phase of CodeBuild.
|
|
79
79
|
*
|
|
80
|
-
* **Example
|
|
81
|
-
* ```
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* 'curl -o config.json https://api.example.com/config',
|
|
87
|
-
* ],
|
|
88
|
-
* // ... other properties ...
|
|
89
|
-
* });
|
|
80
|
+
* **Example**:
|
|
81
|
+
* ```ts
|
|
82
|
+
* preBuildCommands: [
|
|
83
|
+
* 'echo "Fetching configuration from private API..."',
|
|
84
|
+
* 'curl -o config.json https://api.example.com/config',
|
|
85
|
+
* ],
|
|
90
86
|
* ```
|
|
91
87
|
* @default - No additional pre-build commands.
|
|
92
88
|
*/
|
|
93
89
|
readonly preBuildCommands?: string[];
|
|
94
90
|
}
|
|
95
91
|
/**
|
|
96
|
-
* A CDK construct to build and push Docker images to an ECR repository using
|
|
97
|
-
*
|
|
92
|
+
* A CDK construct to build and push Docker images to an ECR repository using
|
|
93
|
+
* CodeBuild and Lambda custom resources, **then** retrieve the final image tag
|
|
94
|
+
* so that ECS/Lambda references use the exact digest.
|
|
98
95
|
*/
|
|
99
96
|
export declare class TokenInjectableDockerBuilder extends Construct {
|
|
97
|
+
/**
|
|
98
|
+
* The ECR repository that stores the resulting Docker image.
|
|
99
|
+
*/
|
|
100
100
|
private readonly ecrRepository;
|
|
101
101
|
/**
|
|
102
|
-
* An ECS-compatible
|
|
102
|
+
* An ECS-compatible container image referencing the tag
|
|
103
|
+
* of the built Docker image.
|
|
103
104
|
*/
|
|
104
105
|
readonly containerImage: ContainerImage;
|
|
105
106
|
/**
|
|
106
|
-
* A Lambda-compatible DockerImageCode referencing the
|
|
107
|
+
* A Lambda-compatible DockerImageCode referencing the the tag
|
|
108
|
+
* of the built Docker image.
|
|
107
109
|
*/
|
|
108
110
|
readonly dockerImageCode: DockerImageCode;
|
|
111
|
+
/**
|
|
112
|
+
* Creates a new `TokenInjectableDockerBuilder`.
|
|
113
|
+
*
|
|
114
|
+
* @param scope The scope in which to define this construct.
|
|
115
|
+
* @param id The scoped construct ID.
|
|
116
|
+
* @param props Configuration for building and pushing the Docker image.
|
|
117
|
+
*/
|
|
109
118
|
constructor(scope: Construct, id: string, props: TokenInjectableDockerBuilderProps);
|
|
110
119
|
}
|
package/lib/index.js
CHANGED
|
@@ -12,24 +12,33 @@ const aws_ecs_1 = require("aws-cdk-lib/aws-ecs");
|
|
|
12
12
|
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
13
13
|
const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
14
14
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
15
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
15
16
|
const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
|
|
16
17
|
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
17
18
|
const constructs_1 = require("constructs");
|
|
18
19
|
/**
|
|
19
|
-
* A CDK construct to build and push Docker images to an ECR repository using
|
|
20
|
-
*
|
|
20
|
+
* A CDK construct to build and push Docker images to an ECR repository using
|
|
21
|
+
* CodeBuild and Lambda custom resources, **then** retrieve the final image tag
|
|
22
|
+
* so that ECS/Lambda references use the exact digest.
|
|
21
23
|
*/
|
|
22
24
|
class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
25
|
+
/**
|
|
26
|
+
* Creates a new `TokenInjectableDockerBuilder`.
|
|
27
|
+
*
|
|
28
|
+
* @param scope The scope in which to define this construct.
|
|
29
|
+
* @param id The scoped construct ID.
|
|
30
|
+
* @param props Configuration for building and pushing the Docker image.
|
|
31
|
+
*/
|
|
23
32
|
constructor(scope, id, props) {
|
|
24
33
|
super(scope, id);
|
|
25
34
|
const { path: sourcePath, buildArgs, dockerLoginSecretArn, vpc, securityGroups, subnetSelection, installCommands, preBuildCommands, } = props;
|
|
26
|
-
// Generate
|
|
35
|
+
// Generate an ephemeral tag for CodeBuild
|
|
27
36
|
const imageTag = crypto.randomUUID();
|
|
28
|
-
// KMS key for ECR encryption
|
|
37
|
+
// Define a KMS key for ECR encryption
|
|
29
38
|
const encryptionKey = new aws_kms_1.Key(this, 'EcrEncryptionKey', {
|
|
30
39
|
enableKeyRotation: true,
|
|
31
40
|
});
|
|
32
|
-
// ECR repository
|
|
41
|
+
// Create an ECR repository with encryption, lifecycle rules, and image scanning
|
|
33
42
|
this.ecrRepository = new aws_ecr_1.Repository(this, 'ECRRepository', {
|
|
34
43
|
lifecycleRules: [
|
|
35
44
|
{
|
|
@@ -43,70 +52,67 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
43
52
|
encryptionKey,
|
|
44
53
|
imageScanOnPush: true,
|
|
45
54
|
});
|
|
46
|
-
//
|
|
55
|
+
// Wrap the source folder as an S3 asset for CodeBuild to use
|
|
47
56
|
const sourceAsset = new aws_s3_assets_1.Asset(this, 'SourceAsset', {
|
|
48
57
|
path: sourcePath,
|
|
49
58
|
});
|
|
50
|
-
//
|
|
59
|
+
// Create an S3 bucket to store the CodeBuild artifacts
|
|
60
|
+
const artifactBucket = new aws_s3_1.Bucket(this, 'ArtifactBucket', {
|
|
61
|
+
removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
|
|
62
|
+
autoDeleteObjects: true,
|
|
63
|
+
blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
|
|
64
|
+
});
|
|
65
|
+
// Convert buildArgs to a CLI-friendly string
|
|
51
66
|
const buildArgsString = buildArgs
|
|
52
67
|
? Object.entries(buildArgs)
|
|
53
68
|
.map(([k, v]) => `--build-arg ${k}=${v}`)
|
|
54
69
|
.join(' ')
|
|
55
70
|
: '';
|
|
56
|
-
//
|
|
71
|
+
// Optional DockerHub login, if a secret ARN is provided
|
|
57
72
|
const dockerLoginCommands = dockerLoginSecretArn
|
|
58
73
|
? [
|
|
59
|
-
'echo "Retrieving Docker credentials
|
|
74
|
+
'echo "Retrieving Docker credentials..."',
|
|
60
75
|
'apt-get update -y && apt-get install -y jq',
|
|
61
76
|
`DOCKER_USERNAME=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .username)`,
|
|
62
77
|
`DOCKER_PASSWORD=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .password)`,
|
|
63
78
|
'echo "Logging in to Docker Hub..."',
|
|
64
|
-
// Use non-stdin login to avoid TTY error:
|
|
65
79
|
'echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin',
|
|
66
80
|
]
|
|
67
|
-
: ['echo "No Docker credentials
|
|
68
|
-
// BuildSpec
|
|
81
|
+
: ['echo "No Docker credentials. Skipping Docker Hub login."'];
|
|
69
82
|
const buildSpecObj = {
|
|
70
83
|
version: '0.2',
|
|
71
84
|
phases: {
|
|
72
85
|
install: {
|
|
73
86
|
commands: [
|
|
74
87
|
'echo "Beginning install phase..."',
|
|
75
|
-
...(installCommands
|
|
88
|
+
...(installCommands ?? []),
|
|
76
89
|
],
|
|
77
90
|
},
|
|
78
91
|
pre_build: {
|
|
79
92
|
commands: [
|
|
80
|
-
...(preBuildCommands
|
|
93
|
+
...(preBuildCommands ?? []),
|
|
81
94
|
...dockerLoginCommands,
|
|
82
95
|
'echo "Retrieving AWS Account ID..."',
|
|
83
96
|
'export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)',
|
|
84
|
-
'echo "Logging
|
|
97
|
+
'echo "Logging into Amazon ECR..."',
|
|
85
98
|
'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com',
|
|
86
99
|
],
|
|
87
100
|
},
|
|
88
101
|
build: {
|
|
89
102
|
commands: [
|
|
90
|
-
|
|
103
|
+
`echo "Building Docker image with tag ${imageTag}..."`,
|
|
91
104
|
`docker build ${buildArgsString} -t $ECR_REPO_URI:${imageTag} $CODEBUILD_SRC_DIR`,
|
|
92
105
|
],
|
|
93
106
|
},
|
|
94
107
|
post_build: {
|
|
95
108
|
commands: [
|
|
96
|
-
`echo "
|
|
109
|
+
`echo "Pushing Docker image with tag ${imageTag}..."`,
|
|
97
110
|
`docker push $ECR_REPO_URI:${imageTag}`,
|
|
98
|
-
`export IMAGE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $ECR_REPO_URI:${imageTag})`,
|
|
99
|
-
'echo "Image digest: $IMAGE_DIGEST"',
|
|
100
|
-
'echo "{ \\"ImageDigest\\": \\"$IMAGE_DIGEST\\" }" > imageDetail.json',
|
|
101
111
|
],
|
|
102
112
|
},
|
|
103
113
|
},
|
|
104
|
-
artifacts: {
|
|
105
|
-
files: ['imageDetail.json'],
|
|
106
|
-
name: 'imageDetail',
|
|
107
|
-
},
|
|
108
114
|
};
|
|
109
|
-
// CodeBuild project
|
|
115
|
+
// Create the CodeBuild project
|
|
110
116
|
const codeBuildProject = new aws_codebuild_1.Project(this, 'CodeBuildProject', {
|
|
111
117
|
source: aws_codebuild_1.Source.s3({
|
|
112
118
|
bucket: sourceAsset.bucket,
|
|
@@ -119,12 +125,12 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
119
125
|
environmentVariables: {
|
|
120
126
|
ECR_REPO_URI: { value: this.ecrRepository.repositoryUri },
|
|
121
127
|
},
|
|
128
|
+
buildSpec: aws_codebuild_1.BuildSpec.fromObject(buildSpecObj),
|
|
122
129
|
vpc,
|
|
123
130
|
securityGroups,
|
|
124
131
|
subnetSelection,
|
|
125
|
-
buildSpec: aws_codebuild_1.BuildSpec.fromObject(buildSpecObj),
|
|
126
132
|
});
|
|
127
|
-
//
|
|
133
|
+
// Grant CodeBuild the ability to interact with ECR
|
|
128
134
|
this.ecrRepository.grantPullPush(codeBuildProject);
|
|
129
135
|
codeBuildProject.role?.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
|
|
130
136
|
actions: [
|
|
@@ -141,7 +147,7 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
141
147
|
}));
|
|
142
148
|
}
|
|
143
149
|
encryptionKey.grantEncryptDecrypt(codeBuildProject.role);
|
|
144
|
-
//
|
|
150
|
+
// Define the Lambda functions for custom resource event and completion handling
|
|
145
151
|
const onEventHandlerFunction = new aws_lambda_1.Function(this, 'OnEventHandlerFunction', {
|
|
146
152
|
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
|
|
147
153
|
code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../onEvent')),
|
|
@@ -152,10 +158,12 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
152
158
|
actions: ['codebuild:StartBuild'],
|
|
153
159
|
resources: [codeBuildProject.projectArn],
|
|
154
160
|
}));
|
|
155
|
-
// isComplete handler
|
|
156
161
|
const isCompleteHandlerFunction = new aws_lambda_1.Function(this, 'IsCompleteHandlerFunction', {
|
|
157
162
|
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
|
|
158
163
|
code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../isComplete')),
|
|
164
|
+
environment: {
|
|
165
|
+
IMAGE_TAG: imageTag,
|
|
166
|
+
},
|
|
159
167
|
handler: 'isComplete.handler',
|
|
160
168
|
timeout: aws_cdk_lib_1.Duration.minutes(15),
|
|
161
169
|
});
|
|
@@ -166,22 +174,21 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
166
174
|
'logs:GetLogEvents',
|
|
167
175
|
'logs:DescribeLogStreams',
|
|
168
176
|
'logs:DescribeLogGroups',
|
|
169
|
-
's3:GetObject',
|
|
170
|
-
's3:GetBucketLocation',
|
|
171
177
|
],
|
|
172
178
|
resources: ['*'],
|
|
173
179
|
}));
|
|
180
|
+
artifactBucket.grantReadWrite(isCompleteHandlerFunction);
|
|
174
181
|
encryptionKey.grantEncryptDecrypt(onEventHandlerFunction);
|
|
175
182
|
encryptionKey.grantEncryptDecrypt(isCompleteHandlerFunction);
|
|
176
183
|
this.ecrRepository.grantPullPush(onEventHandlerFunction);
|
|
177
184
|
this.ecrRepository.grantPullPush(isCompleteHandlerFunction);
|
|
178
|
-
//
|
|
185
|
+
// Create a custom resource provider that uses the above Lambdas
|
|
179
186
|
const provider = new custom_resources_1.Provider(this, 'CustomResourceProvider', {
|
|
180
187
|
onEventHandler: onEventHandlerFunction,
|
|
181
188
|
isCompleteHandler: isCompleteHandlerFunction,
|
|
182
189
|
queryInterval: aws_cdk_lib_1.Duration.seconds(30),
|
|
183
190
|
});
|
|
184
|
-
// Custom
|
|
191
|
+
// Custom Resource that triggers the CodeBuild and waits for completion
|
|
185
192
|
const buildTriggerResource = new aws_cdk_lib_1.CustomResource(this, 'BuildTriggerResource', {
|
|
186
193
|
serviceToken: provider.serviceToken,
|
|
187
194
|
properties: {
|
|
@@ -191,17 +198,16 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
|
|
|
191
198
|
},
|
|
192
199
|
});
|
|
193
200
|
buildTriggerResource.node.addDependency(codeBuildProject);
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
this.containerImage = aws_ecs_1.ContainerImage.fromEcrRepository(this.ecrRepository,
|
|
198
|
-
// Lambda-compatible from ECR by digest
|
|
201
|
+
// Retrieve the final Docker image tag from Data.ImageTag
|
|
202
|
+
// This creates a dependency on the Custom Resource...
|
|
203
|
+
const imageTagRef = buildTriggerResource.getAttString('ImageTag');
|
|
204
|
+
this.containerImage = aws_ecs_1.ContainerImage.fromEcrRepository(this.ecrRepository, imageTagRef);
|
|
199
205
|
this.dockerImageCode = aws_lambda_1.DockerImageCode.fromEcr(this.ecrRepository, {
|
|
200
|
-
tagOrDigest:
|
|
206
|
+
tagOrDigest: imageTagRef,
|
|
201
207
|
});
|
|
202
208
|
}
|
|
203
209
|
}
|
|
204
210
|
exports.TokenInjectableDockerBuilder = TokenInjectableDockerBuilder;
|
|
205
211
|
_a = JSII_RTTI_SYMBOL_1;
|
|
206
|
-
TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.3.
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDZDQUF1RDtBQUN2RCw2REFBd0Y7QUFFeEYsaURBQWtGO0FBQ2xGLGlEQUFxRDtBQUNyRCxpREFBc0Q7QUFDdEQsaURBQTBDO0FBQzFDLHVEQUFrRjtBQUNsRiw2REFBa0Q7QUFDbEQsbUVBQXdEO0FBQ3hELDJDQUF1QztBQWtHdkM7OztHQUdHO0FBQ0gsTUFBYSw0QkFBNkIsU0FBUSxzQkFBUztJQWF6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUNKLElBQUksRUFBRSxVQUFVLEVBQ2hCLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixHQUFHLEtBQUssQ0FBQztRQUVWLHdDQUF3QztRQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFckMsNkJBQTZCO1FBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILGlCQUFpQjtRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxZQUFZLEVBQUUsQ0FBQztvQkFDZixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxRQUFRO29CQUM3QixXQUFXLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lC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WTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7Z0JBQ3pDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTthQUM3QjtTQUNGLENBQUMsQ0FBQztRQUVILG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxRCwrRUFBK0U7UUFDL0UsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLHdCQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV4Rix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyw0QkFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2pFLFdBQVcsRUFBRSxXQUFXO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeE9ILG9FQXlPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IFByb2plY3QsIFNvdXJjZSwgTGludXhCdWlsZEltYWdlLCBCdWlsZFNwZWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IElWcGMsIElTZWN1cml0eUdyb3VwLCBTdWJuZXRTZWxlY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IFJlcG9zaXRvcnksIFJlcG9zaXRvcnlFbmNyeXB0aW9uLCBUYWdTdGF0dXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyJztcbmltcG9ydCB7IENvbnRhaW5lckltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgUnVudGltZSwgQ29kZSwgRG9ja2VySW1hZ2VDb2RlLCBGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgYFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXJgIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyUHJvcHMge1xuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBEb2NrZXJmaWxlIG9yIHNvdXJjZSBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgRG9ja2VyIGJ1aWxkIHByb2Nlc3MuXG4gICAqIFRoZXNlIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIGAtLWJ1aWxkLWFyZ2AgZmxhZ3MuXG4gICAqIEBleGFtcGxlXG4gICAqIHtcbiAgICogICBUT0tFTjogJ215LXNlY3JldC10b2tlbicsXG4gICAqICAgRU5WOiAncHJvZHVjdGlvbidcbiAgICogfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRBcmdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgQVdTIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyBEb2NrZXIgbG9naW4gY3JlZGVudGlhbHMuXG4gICAqIFRoaXMgc2VjcmV0IHNob3VsZCBzdG9yZSBhIEpTT04gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gICAqIGBgYGpzb25cbiAgICoge1xuICAgKiAgIFwidXNlcm5hbWVcIjogXCJteS1kb2NrZXItdXNlcm5hbWVcIixcbiAgICogICBcInBhc3N3b3JkXCI6IFwibXktZG9ja2VyLXBhc3N3b3JkXCJcbiAgICogfVxuICAgKiBgYGBcbiAgICogSWYgbm90IHByb3ZpZGVkIChvciBub3QgbmVlZGVkKSwgdGhlIGNvbnN0cnVjdCB3aWxsIHNraXAgRG9ja2VyIEh1YiBsb2dpbi5cbiAgICogTk9URTogVGhlIHNlY3JldCBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2suXG4gICAqXG4gICAqIEBleGFtcGxlICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OkRvY2tlckxvZ2luU2VjcmV0J1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyTG9naW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgYmUgZGVwbG95ZWQuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgQ29kZUJ1aWxkIHByb2plY3Qgd2lsbCBiZSBsYXVuY2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqIEBkZWZhdWx0IE5vIFZQQyBpcyBhdHRhY2hlZCwgYW5kIHRoZSBDb2RlQnVpbGQgcHJvamVjdCB3aWxsIHVzZSBwdWJsaWMgaW50ZXJuZXQuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRvIGF0dGFjaCB0byB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIFRoZXNlIHNob3VsZCBkZWZpbmUgdGhlIG5ldHdvcmsgYWNjZXNzIHJ1bGVzIGZvciB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIEBkZWZhdWx0IE5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgc2VsZWN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc3VibmV0cyB0byB1c2Ugd2l0aGluIHRoZSBWUEMuXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgcHJpdmF0ZSwgcHVibGljLCBvciBpc29sYXRlZCBzdWJuZXRzLlxuICAgKiBAZGVmYXVsdCBBbGwgc3VibmV0cyBpbiB0aGUgVlBDIGFyZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gY29tbWFuZHMgdG8gcnVuIGR1cmluZyB0aGUgaW5zdGFsbCBwaGFzZS5cbiAgICpcbiAgICogKipFeGFtcGxlIFVzYWdlOioqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXIodGhpcywgJ015RG9ja2VyQnVpbGRlcicsIHtcbiAgICogICBwYXRoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vYXBwJyksXG4gICAqICAgaW5zdGFsbENvbW1hbmRzOiBbXG4gICAqICAgICAnZWNobyBcIlVwZGF0aW5nIHBhY2thZ2UgbGlzdHMuLi5cIicsXG4gICAqICAgICAnYXB0LWdldCB1cGRhdGUgLXknLFxuICAgKiAgICAgJ2VjaG8gXCJJbnN0YWxsaW5nIHJlcXVpcmVkIHBhY2thZ2VzLi4uXCInLFxuICAgKiAgICAgJ2FwdC1nZXQgaW5zdGFsbCAteSBjdXJsIGRuc3V0aWxzJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBpbnN0YWxsIGNvbW1hbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbENvbW1hbmRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb21tYW5kcyB0byBydW4gZHVyaW5nIHRoZSBwcmVfYnVpbGQgcGhhc2UuXG4gICAqXG4gICAqICoqRXhhbXBsZSBVc2FnZToqKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyKHRoaXMsICdNeURvY2tlckJ1aWxkZXInLCB7XG4gICAqICAgcGF0aDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL2FwcCcpLFxuICAgKiAgIHByZUJ1aWxkQ29tbWFuZHM6IFtcbiAgICogICAgICdlY2hvIFwiRmV0Y2hpbmcgY29uZmlndXJhdGlvbiBmcm9tIHByaXZhdGUgQVBJLi4uXCInLFxuICAgKiAgICAgJ2N1cmwgLW8gY29uZmlnLmpzb24gaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vY29uZmlnJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBwcmUtYnVpbGQgY29tbWFuZHMuXG4gICAqL1xuICByZWFkb25seSBwcmVCdWlsZENvbW1hbmRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBDREsgY29uc3RydWN0IHRvIGJ1aWxkIGFuZCBwdXNoIERvY2tlciBpbWFnZXMgdG8gYW4gRUNSIHJlcG9zaXRvcnkgdXNpbmcgQ29kZUJ1aWxkIGFuZCBMYW1iZGEgY3VzdG9tIHJlc291cmNlcyxcbiAqIHJldHJpZXZpbmcgdGhlIGZpbmFsIGltYWdlIGRpZ2VzdCAoU0hBKSBhbmQgdXNpbmcgdGhhdCBleGFjdCBkaWdlc3QgZm9yIEVDUyBvciBMYW1iZGEgcmVmZXJlbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIEFuIEVDUy1jb21wYXRpYmxlIENvbnRhaW5lckltYWdlIHJlZmVyZW5jaW5nIHRoZSAqZXhhY3QqIFNIQSBkaWdlc3Qgb2YgdGhlIGJ1aWx0IERvY2tlciBpbWFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJJbWFnZTogQ29udGFpbmVySW1hZ2U7XG5cbiAgLyoqXG4gICAqIEEgTGFtYmRhLWNvbXBhdGlibGUgRG9ja2VySW1hZ2VDb2RlIHJlZmVyZW5jaW5nIHRoZSAqZXhhY3QqIFNIQSBkaWdlc3Qgb2YgdGhlIGJ1aWx0IERvY2tlciBpbWFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU6IERvY2tlckltYWdlQ29kZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICBidWlsZEFyZ3MsXG4gICAgICBkb2NrZXJMb2dpblNlY3JldEFybixcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgICAgaW5zdGFsbENvbW1hbmRzLFxuICAgICAgcHJlQnVpbGRDb21tYW5kcyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBHZW5lcmF0ZSBhIHVuaXF1ZSB0YWcgZm9yIHRoaXMgYnVpbGQuXG4gICAgY29uc3QgaW1hZ2VUYWcgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuXG4gICAgLy8gS01TIGtleSBmb3IgRUNSIGVuY3J5cHRpb25cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gbmV3IEtleSh0aGlzLCAnRWNyRW5jcnlwdGlvbktleScsIHtcbiAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gRUNSIHJlcG9zaXRvcnlcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSh0aGlzLCAnRUNSUmVwb3NpdG9yeScsIHtcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBydWxlUHJpb3JpdHk6IDEsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdSZW1vdmUgdW50YWdnZWQgaW1hZ2VzIGFmdGVyIDEgZGF5JyxcbiAgICAgICAgICB0YWdTdGF0dXM6IFRhZ1N0YXR1cy5VTlRBR0dFRCxcbiAgICAgICAgICBtYXhJbWFnZUFnZTogRHVyYXRpb24uZGF5cygxKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbmNyeXB0aW9uOiBSZXBvc2l0b3J5RW5jcnlwdGlvbi5LTVMsXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgaW1hZ2VTY2FuT25QdXNoOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFja2FnZSBzb3VyY2UgY29kZVxuICAgIGNvbnN0IHNvdXJjZUFzc2V0ID0gbmV3IEFzc2V0KHRoaXMsICdTb3VyY2VBc3NldCcsIHtcbiAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZCBhcmdzXG4gICAgY29uc3QgYnVpbGRBcmdzU3RyaW5nID0gYnVpbGRBcmdzXG4gICAgICA/IE9iamVjdC5lbnRyaWVzKGJ1aWxkQXJncylcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgLS1idWlsZC1hcmcgJHtrfT0ke3Z9YClcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgOiAnJztcblxuICAgIC8vIERvY2tlciBIdWIgbG9naW4gY29tbWFuZHNcbiAgICBjb25zdCBkb2NrZXJMb2dpbkNvbW1hbmRzID0gZG9ja2VyTG9naW5TZWNyZXRBcm5cbiAgICAgID8gW1xuICAgICAgICAnZWNobyBcIlJldHJpZXZpbmcgRG9ja2VyIGNyZWRlbnRpYWxzIGZyb20gU2VjcmV0cyBNYW5hZ2VyLi4uXCInLFxuICAgICAgICAnYXB0LWdldCB1cGRhdGUgLXkgJiYgYXB0LWdldCBpbnN0YWxsIC15IGpxJyxcbiAgICAgICAgYERPQ0tFUl9VU0VSTkFNRT0kKGF3cyBzZWNyZXRzbWFuYWdlciBnZXQtc2VjcmV0LXZhbHVlIC0tc2VjcmV0LWlkICR7ZG9ja2VyTG9naW5TZWNyZXRBcm59IC0tcXVlcnkgU2VjcmV0U3RyaW5nIC0tb3V0cHV0IHRleHQgfCBqcSAtciAudXNlcm5hbWUpYCxcbiAgICAgICAgYERPQ0tFUl9QQVNTV09SRD0kKGF3cyBzZWNyZXRzbWFuYWdlciBnZXQtc2VjcmV0LXZhbHVlIC0tc2VjcmV0LWlkICR7ZG9ja2VyTG9naW5TZWNyZXRBcm59IC0tcXVlcnkgU2VjcmV0U3RyaW5nIC0tb3V0cHV0IHRleHQgfCBqcSAtciAucGFzc3dvcmQpYCxcbiAgICAgICAgJ2VjaG8gXCJMb2dnaW5nIGluIHRvIERvY2tlciBIdWIuLi5cIicsXG4gICAgICAgIC8vIFVzZSBub24tc3RkaW4gbG9naW4gdG8gYXZvaWQgVFRZIGVycm9yOlxuICAgICAgICAnZWNobyAkRE9DS0VSX1BBU1NXT1JEIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgJERPQ0tFUl9VU0VSTkFNRSAtLXBhc3N3b3JkLXN0ZGluJyxcbiAgICAgIF1cbiAgICAgIDogWydlY2hvIFwiTm8gRG9ja2VyIGNyZWRlbnRpYWxzIHByb3ZpZGVkLiBTa2lwcGluZyBEb2NrZXIgSHViIGxvZ2luLlwiJ107XG5cbiAgICAvLyBCdWlsZFNwZWNcbiAgICBjb25zdCBidWlsZFNwZWNPYmogPSB7XG4gICAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgICAgIHBoYXNlczoge1xuICAgICAgICBpbnN0YWxsOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdlY2hvIFwiQmVnaW5uaW5nIGluc3RhbGwgcGhhc2UuLi5cIicsXG4gICAgICAgICAgICAuLi4oaW5zdGFsbENvbW1hbmRzIHx8IFtdKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgLi4uKHByZUJ1aWxkQ29tbWFuZHMgfHwgW10pLFxuICAgICAgICAgICAgLi4uZG9ja2VyTG9naW5Db21tYW5kcyxcbiAgICAgICAgICAgICdlY2hvIFwiUmV0cmlldmluZyBBV1MgQWNjb3VudCBJRC4uLlwiJyxcbiAgICAgICAgICAgICdleHBvcnQgQUNDT1VOVF9JRD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgJ2VjaG8gXCJMb2dnaW5nIGluIHRvIEFtYXpvbiBFQ1IuLi5cIicsXG4gICAgICAgICAgICAnYXdzIGVjciBnZXQtbG9naW4tcGFzc3dvcmQgLS1yZWdpb24gJEFXU19ERUZBVUxUX1JFR0lPTiB8IGRvY2tlciBsb2dpbiAtLXVzZXJuYW1lIEFXUyAtLXBhc3N3b3JkLXN0ZGluICRBQ0NPVU5UX0lELmRrci5lY3IuJEFXU19ERUZBVUxUX1JFR0lPTi5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBidWlsZDoge1xuICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAnZWNobyBcIkJ1aWxkIHBoYXNlOiBCdWlsZGluZyB0aGUgRG9ja2VyIGltYWdlLi4uXCInLFxuICAgICAgICAgICAgYGRvY2tlciBidWlsZCAke2J1aWxkQXJnc1N0cmluZ30gLXQgJEVDUl9SRVBPX1VSSToke2ltYWdlVGFnfSAkQ09ERUJVSUxEX1NSQ19ESVJgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBvc3RfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgYGVjaG8gXCJQb3N0LWJ1aWxkIHBoYXNlOiBQdXNoaW5nIHRoZSBEb2NrZXIgaW1hZ2Ugd2l0aCB0YWcgJHtpbWFnZVRhZ30uLi5cImAsXG4gICAgICAgICAgICBgZG9ja2VyIHB1c2ggJEVDUl9SRVBPX1VSSToke2ltYWdlVGFnfWAsXG4gICAgICAgICAgICBgZXhwb3J0IElNQUdFX0RJR0VTVD0kKGRvY2tlciBpbnNwZWN0IC0tZm9ybWF0PSd7e2luZGV4IC5SZXBvRGlnZXN0cyAwfX0nICRFQ1JfUkVQT19VUkk6JHtpbWFnZVRhZ30pYCxcbiAgICAgICAgICAgICdlY2hvIFwiSW1hZ2UgZGlnZXN0OiAkSU1BR0VfRElHRVNUXCInLFxuICAgICAgICAgICAgJ2VjaG8gXCJ7IFxcXFxcIkltYWdlRGlnZXN0XFxcXFwiOiBcXFxcXCIkSU1BR0VfRElHRVNUXFxcXFwiIH1cIiA+IGltYWdlRGV0YWlsLmpzb24nLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXJ0aWZhY3RzOiB7XG4gICAgICAgIGZpbGVzOiBbJ2ltYWdlRGV0YWlsLmpzb24nXSxcbiAgICAgICAgbmFtZTogJ2ltYWdlRGV0YWlsJyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIENvZGVCdWlsZCBwcm9qZWN0XG4gICAgY29uc3QgY29kZUJ1aWxkUHJvamVjdCA9IG5ldyBQcm9qZWN0KHRoaXMsICdDb2RlQnVpbGRQcm9qZWN0Jywge1xuICAgICAgc291cmNlOiBTb3VyY2UuczMoe1xuICAgICAgICBidWNrZXQ6IHNvdXJjZUFzc2V0LmJ1Y2tldCxcbiAgICAgICAgcGF0aDogc291cmNlQXNzZXQuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgRUNSX1JFUE9fVVJJOiB7IHZhbHVlOiB0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaSB9LFxuICAgICAgfSxcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgICAgYnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdChidWlsZFNwZWNPYmopLFxuICAgIH0pO1xuXG4gICAgLy8gUGVybWlzc2lvbnNcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChjb2RlQnVpbGRQcm9qZWN0KTtcbiAgICBjb2RlQnVpbGRQcm9qZWN0LnJvbGU/LmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnZWNyOkdldEF1dGhvcml6YXRpb25Ub2tlbicsXG4gICAgICAgICAgJ2VjcjpHZXREb3dubG9hZFVybEZvckxheWVyJyxcbiAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW3RoaXMuZWNyUmVwb3NpdG9yeS5yZXBvc2l0b3J5QXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBpZiAoZG9ja2VyTG9naW5TZWNyZXRBcm4pIHtcbiAgICAgIGNvZGVCdWlsZFByb2plY3Qucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtkb2NrZXJMb2dpblNlY3JldEFybl0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoY29kZUJ1aWxkUHJvamVjdC5yb2xlISk7XG5cbiAgICAvLyBvbkV2ZW50IGhhbmRsZXJcbiAgICBjb25zdCBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdPbkV2ZW50SGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9vbkV2ZW50JykpLFxuICAgICAgaGFuZGxlcjogJ29uRXZlbnQuaGFuZGxlcicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcblxuICAgIG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnY29kZWJ1aWxkOlN0YXJ0QnVpbGQnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbY29kZUJ1aWxkUHJvamVjdC5wcm9qZWN0QXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBpc0NvbXBsZXRlIGhhbmRsZXJcbiAgICBjb25zdCBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9pc0NvbXBsZXRlJykpLFxuICAgICAgaGFuZGxlcjogJ2lzQ29tcGxldGUuaGFuZGxlcicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcblxuICAgIGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY29kZWJ1aWxkOkJhdGNoR2V0QnVpbGRzJyxcbiAgICAgICAgICAnY29kZWJ1aWxkOkxpc3RCdWlsZHNGb3JQcm9qZWN0JyxcbiAgICAgICAgICAnbG9nczpHZXRMb2dFdmVudHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICAgICdzMzpHZXRPYmplY3QnLFxuICAgICAgICAgICdzMzpHZXRCdWNrZXRMb2NhdGlvbicsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24pO1xuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChvbkV2ZW50SGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcblxuICAgIC8vIFByb3ZpZGVyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ0N1c3RvbVJlc291cmNlUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogb25FdmVudEhhbmRsZXJGdW5jdGlvbixcbiAgICAgIGlzQ29tcGxldGVIYW5kbGVyOiBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uLFxuICAgICAgcXVlcnlJbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgfSk7XG5cbiAgICAvLyBDdXN0b20gcmVzb3VyY2VcbiAgICBjb25zdCBidWlsZFRyaWdnZXJSZXNvdXJjZSA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCAnQnVpbGRUcmlnZ2VyUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgUHJvamVjdE5hbWU6IGNvZGVCdWlsZFByb2plY3QucHJvamVjdE5hbWUsXG4gICAgICAgIEltYWdlVGFnOiBpbWFnZVRhZyxcbiAgICAgICAgVHJpZ2dlcjogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBidWlsZFRyaWdnZXJSZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3koY29kZUJ1aWxkUHJvamVjdCk7XG5cbiAgICAvLyBHcmFiIHRoZSBTSEEgZnJvbSB0aGUgY3VzdG9tIHJlc291cmNlJ3MgcmVzcG9uc2UgKHNldCBpbiBpc0NvbXBsZXRlIGhhbmRsZXIpXG4gICAgY29uc3QgaW1hZ2VEaWdlc3QgPSBidWlsZFRyaWdnZXJSZXNvdXJjZS5nZXRBdHRTdHJpbmcoJ0ltYWdlRGlnZXN0Jyk7XG5cbiAgICAvLyBFQ1MtY29tcGF0aWJsZSBmcm9tIEVDUiBieSBkaWdlc3RcbiAgICB0aGlzLmNvbnRhaW5lckltYWdlID0gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkodGhpcy5lY3JSZXBvc2l0b3J5LCBpbWFnZURpZ2VzdCk7XG5cbiAgICAvLyBMYW1iZGEtY29tcGF0aWJsZSBmcm9tIEVDUiBieSBkaWdlc3RcbiAgICB0aGlzLmRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHRoaXMuZWNyUmVwb3NpdG9yeSwge1xuICAgICAgdGFnT3JEaWdlc3Q6IGltYWdlRGlnZXN0LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
212
|
+
TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.3.2" };
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDZDQUFzRTtBQUN0RSw2REFBd0Y7QUFFeEYsaURBQWtGO0FBQ2xGLGlEQUFxRDtBQUNyRCxpREFBc0Q7QUFDdEQsaURBQTBDO0FBQzFDLHVEQUFrRjtBQUNsRiwrQ0FBK0Q7QUFDL0QsNkRBQWtEO0FBQ2xELG1FQUF3RDtBQUN4RCwyQ0FBdUM7QUE4RnZDOzs7O0dBSUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBa0J6RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdDO1FBQ2hGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUNKLElBQUksRUFBRSxVQUFVLEVBQ2hCLFNBQVMsRUFDVCxvQkFBb0IsRUFDcEIsR0FBRyxFQUNILGNBQWMsRUFDZCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGdCQUFnQixHQUNqQixHQUFHLEtBQUssQ0FBQztRQUVWLDBDQUEwQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFckMsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILGdGQUFnRjtRQUNoRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxZQUFZLEVBQUUsQ0FBQztvQkFDZixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxRQUFRO29CQUM3QixXQUFXLEVBQUUsc0JB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QUNwQyxDQUFDLENBQUM7UUFFSCx1RUFBdUU7UUFDdkUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzVFLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7Z0JBQ3pDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRTthQUM3QjtTQUNGLENBQUMsQ0FBQztRQUNILG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUUxRCx5REFBeUQ7UUFDekQsc0RBQXNEO1FBQ3RELE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLHdCQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsZUFBZSxHQUFHLDRCQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDakUsV0FBVyxFQUFFLFdBQVc7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFyT0gsb0VBc09DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUHJvamVjdCwgU291cmNlLCBMaW51eEJ1aWxkSW1hZ2UsIEJ1aWxkU3BlYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVZwYywgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUVuY3J5cHRpb24sIFRhZ1N0YXR1cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgQ29udGFpbmVySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBSdW50aW1lLCBDb2RlLCBEb2NrZXJJbWFnZUNvZGUsIEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQsIEJsb2NrUHVibGljQWNjZXNzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyYCBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgRG9ja2VyZmlsZSBvciBzb3VyY2UgY29kZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQnVpbGQgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIERvY2tlciBidWlsZCBwcm9jZXNzLlxuICAgKiBUaGVzZSBhcmUgdHJhbnNmb3JtZWQgaW50byBgLS1idWlsZC1hcmcgS0VZPVZBTFVFYCBmbGFncy5cbiAgICogQGV4YW1wbGVcbiAgICoge1xuICAgKiAgIFRPS0VOOiAnbXktc2VjcmV0LXRva2VuJyxcbiAgICogICBFTlY6ICdwcm9kdWN0aW9uJ1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIERvY2tlciBsb2dpbiBjcmVkZW50aWFscy5cbiAgICogVGhpcyBzZWNyZXQgc2hvdWxkIHN0b3JlIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJ1c2VybmFtZVwiOiBcIm15LWRvY2tlci11c2VybmFtZVwiLFxuICAgKiAgIFwicGFzc3dvcmRcIjogXCJteS1kb2NrZXItcGFzc3dvcmRcIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJZiBub3QgcHJvdmlkZWQgKG9yIG5vdCBuZWVkZWQpLCB0aGUgY29uc3RydWN0IHdpbGwgc2tpcCBEb2NrZXIgSHViIGxvZ2luLlxuICAgKlxuICAgKiAqKk5vdGUqKjogVGhlIHNlY3JldCBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2suXG4gICAqXG4gICAqIEBleGFtcGxlICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OkRvY2tlckxvZ2luU2VjcmV0J1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyTG9naW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgYmUgZGVwbG95ZWQuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgQ29kZUJ1aWxkIHByb2plY3Qgd2lsbCBiZSBsYXVuY2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gVlBDIGlzIGF0dGFjaGVkLCBhbmQgdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgdXNlIHB1YmxpYyBpbnRlcm5ldC5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBncm91cHMgdG8gYXR0YWNoIHRvIHRoZSBDb2RlQnVpbGQgcHJvamVjdC5cbiAgICogVGhlc2UgZGVmaW5lIHRoZSBuZXR3b3JrIGFjY2VzcyBydWxlcyBmb3IgdGhlIENvZGVCdWlsZCBwcm9qZWN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgc2VsZWN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc3VibmV0cyB0byB1c2Ugd2l0aGluIHRoZSBWUEMuXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgcHJpdmF0ZSwgcHVibGljLCBvciBpc29sYXRlZCBzdWJuZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFsbCBzdWJuZXRzIGluIHRoZSBWUEMgYXJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRTZWxlY3Rpb24/OiBTdWJuZXRTZWxlY3Rpb247XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb21tYW5kcyB0byBydW4gZHVyaW5nIHRoZSBpbnN0YWxsIHBoYXNlIG9mIENvZGVCdWlsZC5cbiAgICpcbiAgICogKipFeGFtcGxlKio6XG4gICAqIGBgYHRzXG4gICAqIGluc3RhbGxDb21tYW5kczogW1xuICAgKiAgICdlY2hvIFwiVXBkYXRpbmcgcGFja2FnZSBsaXN0cy4uLlwiJyxcbiAgICogICAnYXB0LWdldCB1cGRhdGUgLXknLFxuICAgKiAgICdlY2hvIFwiSW5zdGFsbGluZyByZXF1aXJlZCBwYWNrYWdlcy4uLlwiJyxcbiAgICogICAnYXB0LWdldCBpbnN0YWxsIC15IGN1cmwgZG5zdXRpbHMnLFxuICAgKiBdLFxuICAgKiBgYGBcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIGluc3RhbGwgY29tbWFuZHMuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ3VzdG9tIGNvbW1hbmRzIHRvIHJ1biBkdXJpbmcgdGhlIHByZV9idWlsZCBwaGFzZSBvZiBDb2RlQnVpbGQuXG4gICAqXG4gICAqICoqRXhhbXBsZSoqOlxuICAgKiBgYGB0c1xuICAgKiBwcmVCdWlsZENvbW1hbmRzOiBbXG4gICAqICAgJ2VjaG8gXCJGZXRjaGluZyBjb25maWd1cmF0aW9uIGZyb20gcHJpdmF0ZSBBUEkuLi5cIicsXG4gICAqICAgJ2N1cmwgLW8gY29uZmlnLmpzb24gaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vY29uZmlnJyxcbiAgICogXSxcbiAgICogYGBgXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBwcmUtYnVpbGQgY29tbWFuZHMuXG4gICAqL1xuICByZWFkb25seSBwcmVCdWlsZENvbW1hbmRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBDREsgY29uc3RydWN0IHRvIGJ1aWxkIGFuZCBwdXNoIERvY2tlciBpbWFnZXMgdG8gYW4gRUNSIHJlcG9zaXRvcnkgdXNpbmdcbiAqIENvZGVCdWlsZCBhbmQgTGFtYmRhIGN1c3RvbSByZXNvdXJjZXMsICoqdGhlbioqIHJldHJpZXZlIHRoZSBmaW5hbCBpbWFnZSB0YWdcbiAqIHNvIHRoYXQgRUNTL0xhbWJkYSByZWZlcmVuY2VzIHVzZSB0aGUgZXhhY3QgZGlnZXN0LlxuICovXG5leHBvcnQgY2xhc3MgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgRUNSIHJlcG9zaXRvcnkgdGhhdCBzdG9yZXMgdGhlIHJlc3VsdGluZyBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVjclJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIEFuIEVDUy1jb21wYXRpYmxlIGNvbnRhaW5lciBpbWFnZSByZWZlcmVuY2luZyB0aGUgdGFnXG4gICAqIG9mIHRoZSBidWlsdCBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVySW1hZ2U6IENvbnRhaW5lckltYWdlO1xuXG4gIC8qKlxuICAgKiBBIExhbWJkYS1jb21wYXRpYmxlIERvY2tlckltYWdlQ29kZSByZWZlcmVuY2luZyB0aGUgdGhlIHRhZ1xuICAgKiBvZiB0aGUgYnVpbHQgRG9ja2VyIGltYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyYC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3QuXG4gICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC5cbiAgICogQHBhcmFtIHByb3BzIENvbmZpZ3VyYXRpb24gZm9yIGJ1aWxkaW5nIGFuZCBwdXNoaW5nIHRoZSBEb2NrZXIgaW1hZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICBidWlsZEFyZ3MsXG4gICAgICBkb2NrZXJMb2dpblNlY3JldEFybixcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgICAgaW5zdGFsbENvbW1hbmRzLFxuICAgICAgcHJlQnVpbGRDb21tYW5kcyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvLyBHZW5lcmF0ZSBhbiBlcGhlbWVyYWwgdGFnIGZvciBDb2RlQnVpbGRcbiAgICBjb25zdCBpbWFnZVRhZyA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG5cbiAgICAvLyBEZWZpbmUgYSBLTVMga2V5IGZvciBFQ1IgZW5jcnlwdGlvblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBuZXcgS2V5KHRoaXMsICdFY3JFbmNyeXB0aW9uS2V5Jywge1xuICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gRUNSIHJlcG9zaXRvcnkgd2l0aCBlbmNyeXB0aW9uLCBsaWZlY3ljbGUgcnVsZXMsIGFuZCBpbWFnZSBzY2FubmluZ1xuICAgIHRoaXMuZWNyUmVwb3NpdG9yeSA9IG5ldyBSZXBvc2l0b3J5KHRoaXMsICdFQ1JSZXBvc2l0b3J5Jywge1xuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJ1bGVQcmlvcml0eTogMSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlbW92ZSB1bnRhZ2dlZCBpbWFnZXMgYWZ0ZXIgMSBkYXknLFxuICAgICAgICAgIHRhZ1N0YXR1czogVGFnU3RhdHVzLlVOVEFHR0VELFxuICAgICAgICAgIG1heEltYWdlQWdlOiBEdXJhdGlvbi5kYXlzKDEpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuY3J5cHRpb246IFJlcG9zaXRvcnlFbmNyeXB0aW9uLktNUyxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICBpbWFnZVNjYW5PblB1c2g6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBXcmFwIHRoZSBzb3VyY2UgZm9sZGVyIGFzIGFuIFMzIGFzc2V0IGZvciBDb2RlQnVpbGQgdG8gdXNlXG4gICAgY29uc3Qgc291cmNlQXNzZXQgPSBuZXcgQXNzZXQodGhpcywgJ1NvdXJjZUFzc2V0Jywge1xuICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIENvZGVCdWlsZCBhcnRpZmFjdHNcbiAgICBjb25zdCBhcnRpZmFjdEJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgJ0FydGlmYWN0QnVja2V0Jywge1xuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCBidWlsZEFyZ3MgdG8gYSBDTEktZnJpZW5kbHkgc3RyaW5nXG4gICAgY29uc3QgYnVpbGRBcmdzU3RyaW5nID0gYnVpbGRBcmdzXG4gICAgICA/IE9iamVjdC5lbnRyaWVzKGJ1aWxkQXJncylcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBgLS1idWlsZC1hcmcgJHtrfT0ke3Z9YClcbiAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgOiAnJztcblxuICAgIC8vIE9wdGlvbmFsIERvY2tlckh1YiBsb2dpbiwgaWYgYSBzZWNyZXQgQVJOIGlzIHByb3ZpZGVkXG4gICAgY29uc3QgZG9ja2VyTG9naW5Db21tYW5kcyA9IGRvY2tlckxvZ2luU2VjcmV0QXJuXG4gICAgICA/IFtcbiAgICAgICAgJ2VjaG8gXCJSZXRyaWV2aW5nIERvY2tlciBjcmVkZW50aWFscy4uLlwiJyxcbiAgICAgICAgJ2FwdC1nZXQgdXBkYXRlIC15ICYmIGFwdC1nZXQgaW5zdGFsbCAteSBqcScsXG4gICAgICAgIGBET0NLRVJfVVNFUk5BTUU9JChhd3Mgc2VjcmV0c21hbmFnZXIgZ2V0LXNlY3JldC12YWx1ZSAtLXNlY3JldC1pZCAke2RvY2tlckxvZ2luU2VjcmV0QXJufSAtLXF1ZXJ5IFNlY3JldFN0cmluZyAtLW91dHB1dCB0ZXh0IHwganEgLXIgLnVzZXJuYW1lKWAsXG4gICAgICAgIGBET0NLRVJfUEFTU1dPUkQ9JChhd3Mgc2VjcmV0c21hbmFnZXIgZ2V0LXNlY3JldC12YWx1ZSAtLXNlY3JldC1pZCAke2RvY2tlckxvZ2luU2VjcmV0QXJufSAtLXF1ZXJ5IFNlY3JldFN0cmluZyAtLW91dHB1dCB0ZXh0IHwganEgLXIgLnBhc3N3b3JkKWAsXG4gICAgICAgICdlY2hvIFwiTG9nZ2luZyBpbiB0byBEb2NrZXIgSHViLi4uXCInLFxuICAgICAgICAnZWNobyAkRE9DS0VSX1BBU1NXT1JEIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgJERPQ0tFUl9VU0VSTkFNRSAtLXBhc3N3b3JkLXN0ZGluJyxcbiAgICAgIF1cbiAgICAgIDogWydlY2hvIFwiTm8gRG9ja2VyIGNyZWRlbnRpYWxzLiBTa2lwcGluZyBEb2NrZXIgSHViIGxvZ2luLlwiJ107XG5cbiAgICBjb25zdCBidWlsZFNwZWNPYmogPSB7XG4gICAgICB2ZXJzaW9uOiAnMC4yJyxcbiAgICAgIHBoYXNlczoge1xuICAgICAgICBpbnN0YWxsOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICdlY2hvIFwiQmVnaW5uaW5nIGluc3RhbGwgcGhhc2UuLi5cIicsXG4gICAgICAgICAgICAuLi4oaW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBwcmVfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgLi4uKHByZUJ1aWxkQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICAgICAgLi4uZG9ja2VyTG9naW5Db21tYW5kcyxcbiAgICAgICAgICAgICdlY2hvIFwiUmV0cmlldmluZyBBV1MgQWNjb3VudCBJRC4uLlwiJyxcbiAgICAgICAgICAgICdleHBvcnQgQUNDT1VOVF9JRD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgJ2VjaG8gXCJMb2dnaW5nIGludG8gQW1hem9uIEVDUi4uLlwiJyxcbiAgICAgICAgICAgICdhd3MgZWNyIGdldC1sb2dpbi1wYXNzd29yZCAtLXJlZ2lvbiAkQVdTX0RFRkFVTFRfUkVHSU9OIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgQVdTIC0tcGFzc3dvcmQtc3RkaW4gJEFDQ09VTlRfSUQuZGtyLmVjci4kQVdTX0RFRkFVTFRfUkVHSU9OLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgIGBlY2hvIFwiQnVpbGRpbmcgRG9ja2VyIGltYWdlIHdpdGggdGFnICR7aW1hZ2VUYWd9Li4uXCJgLFxuICAgICAgICAgICAgYGRvY2tlciBidWlsZCAke2J1aWxkQXJnc1N0cmluZ30gLXQgJEVDUl9SRVBPX1VSSToke2ltYWdlVGFnfSAkQ09ERUJVSUxEX1NSQ19ESVJgLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHBvc3RfYnVpbGQ6IHtcbiAgICAgICAgICBjb21tYW5kczogW1xuICAgICAgICAgICAgYGVjaG8gXCJQdXNoaW5nIERvY2tlciBpbWFnZSB3aXRoIHRhZyAke2ltYWdlVGFnfS4uLlwiYCxcbiAgICAgICAgICAgIGBkb2NrZXIgcHVzaCAkRUNSX1JFUE9fVVJJOiR7aW1hZ2VUYWd9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuXG5cbiAgICAvLyBDcmVhdGUgdGhlIENvZGVCdWlsZCBwcm9qZWN0XG4gICAgY29uc3QgY29kZUJ1aWxkUHJvamVjdCA9IG5ldyBQcm9qZWN0KHRoaXMsICdDb2RlQnVpbGRQcm9qZWN0Jywge1xuICAgICAgc291cmNlOiBTb3VyY2UuczMoe1xuICAgICAgICBidWNrZXQ6IHNvdXJjZUFzc2V0LmJ1Y2tldCxcbiAgICAgICAgcGF0aDogc291cmNlQXNzZXQuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgRUNSX1JFUE9fVVJJOiB7IHZhbHVlOiB0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaSB9LFxuICAgICAgfSxcbiAgICAgIGJ1aWxkU3BlYzogQnVpbGRTcGVjLmZyb21PYmplY3QoYnVpbGRTcGVjT2JqKSxcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgc3VibmV0U2VsZWN0aW9uLFxuICAgIH0pO1xuXG4gICAgLy8gR3JhbnQgQ29kZUJ1aWxkIHRoZSBhYmlsaXR5IHRvIGludGVyYWN0IHdpdGggRUNSXG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2goY29kZUJ1aWxkUHJvamVjdCk7XG4gICAgY29kZUJ1aWxkUHJvamVjdC5yb2xlPy5hZGRUb1ByaW5jaXBhbFBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5lY3JSZXBvc2l0b3J5LnJlcG9zaXRvcnlBcm5dLFxuICAgIH0pKTtcbiAgICBpZiAoZG9ja2VyTG9naW5TZWNyZXRBcm4pIHtcbiAgICAgIGNvZGVCdWlsZFByb2plY3Qucm9sZT8uYWRkVG9QcmluY2lwYWxQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZG9ja2VyTG9naW5TZWNyZXRBcm5dLFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBlbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoY29kZUJ1aWxkUHJvamVjdC5yb2xlISk7XG5cbiAgICAvLyBEZWZpbmUgdGhlIExhbWJkYSBmdW5jdGlvbnMgZm9yIGN1c3RvbSByZXNvdXJjZSBldmVudCBhbmQgY29tcGxldGlvbiBoYW5kbGluZ1xuICAgIGNvbnN0IG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgJ09uRXZlbnRIYW5kbGVyRnVuY3Rpb24nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL29uRXZlbnQnKSksXG4gICAgICBoYW5kbGVyOiAnb25FdmVudC5oYW5kbGVyJyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgIH0pO1xuICAgIG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgYWN0aW9uczogWydjb2RlYnVpbGQ6U3RhcnRCdWlsZCddLFxuICAgICAgcmVzb3VyY2VzOiBbY29kZUJ1aWxkUHJvamVjdC5wcm9qZWN0QXJuXSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9pc0NvbXBsZXRlJykpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgSU1BR0VfVEFHOiBpbWFnZVRhZyxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAnaXNDb21wbGV0ZS5oYW5kbGVyJyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgIH0pO1xuXG4gICAgaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbi5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdjb2RlYnVpbGQ6QmF0Y2hHZXRCdWlsZHMnLFxuICAgICAgICAnY29kZWJ1aWxkOkxpc3RCdWlsZHNGb3JQcm9qZWN0JyxcbiAgICAgICAgJ2xvZ3M6R2V0TG9nRXZlbnRzJyxcbiAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dTdHJlYW1zJyxcbiAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSkpO1xuXG4gICAgYXJ0aWZhY3RCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG4gICAgZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KG9uRXZlbnRIYW5kbGVyRnVuY3Rpb24pO1xuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChvbkV2ZW50SGFuZGxlckZ1bmN0aW9uKTtcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkuZ3JhbnRQdWxsUHVzaChpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uKTtcblxuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IHVzZXMgdGhlIGFib3ZlIExhbWJkYXNcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLFxuICAgICAgaXNDb21wbGV0ZUhhbmRsZXI6IGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24sXG4gICAgICBxdWVyeUludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KTtcblxuICAgIC8vIEN1c3RvbSBSZXNvdXJjZSB0aGF0IHRyaWdnZXJzIHRoZSBDb2RlQnVpbGQgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uXG4gICAgY29uc3QgYnVpbGRUcmlnZ2VyUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0J1aWxkVHJpZ2dlclJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFByb2plY3ROYW1lOiBjb2RlQnVpbGRQcm9qZWN0LnByb2plY3ROYW1lLFxuICAgICAgICBJbWFnZVRhZzogaW1hZ2VUYWcsXG4gICAgICAgIFRyaWdnZXI6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGJ1aWxkVHJpZ2dlclJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShjb2RlQnVpbGRQcm9qZWN0KTtcblxuICAgIC8vIFJldHJpZXZlIHRoZSBmaW5hbCBEb2NrZXIgaW1hZ2UgdGFnIGZyb20gRGF0YS5JbWFnZVRhZ1xuICAgIC8vIFRoaXMgY3JlYXRlcyBhIGRlcGVuZGVuY3kgb24gdGhlIEN1c3RvbSBSZXNvdXJjZS4uLlxuICAgIGNvbnN0IGltYWdlVGFnUmVmID0gYnVpbGRUcmlnZ2VyUmVzb3VyY2UuZ2V0QXR0U3RyaW5nKCdJbWFnZVRhZycpO1xuICAgIHRoaXMuY29udGFpbmVySW1hZ2UgPSBDb250YWluZXJJbWFnZS5mcm9tRWNyUmVwb3NpdG9yeSh0aGlzLmVjclJlcG9zaXRvcnksIGltYWdlVGFnUmVmKTtcbiAgICB0aGlzLmRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHRoaXMuZWNyUmVwb3NpdG9yeSwge1xuICAgICAgdGFnT3JEaWdlc3Q6IGltYWdlVGFnUmVmLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -30,7 +30,9 @@
|
|
|
30
30
|
"watch": "npx projen watch",
|
|
31
31
|
"projen": "npx projen",
|
|
32
32
|
"local-deploy": "cdk deploy --app \"npx ts-node src/integ.default.ts\"",
|
|
33
|
-
"local-
|
|
33
|
+
"local-deploy-no-rollback": "cdk deploy --no-rollback --app \"npx ts-node src/integ.default.ts\"",
|
|
34
|
+
"local-destroy": "cdk destroy --app \"npx ts-node src/integ.default.ts\"",
|
|
35
|
+
"local-synth": "cdk synth --app \"npx ts-node src/integ.default.ts\""
|
|
34
36
|
},
|
|
35
37
|
"author": {
|
|
36
38
|
"name": "AlexTech314",
|
|
@@ -40,29 +42,29 @@
|
|
|
40
42
|
"devDependencies": {
|
|
41
43
|
"@stylistic/eslint-plugin": "^2",
|
|
42
44
|
"@types/jest": "^29.5.14",
|
|
43
|
-
"@types/node": "^22.10.
|
|
45
|
+
"@types/node": "^22.10.6",
|
|
44
46
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
45
47
|
"@typescript-eslint/parser": "^8",
|
|
46
|
-
"aws-cdk-lib": "2.
|
|
48
|
+
"aws-cdk-lib": "2.173.2",
|
|
47
49
|
"commit-and-tag-version": "^12",
|
|
48
50
|
"constructs": "10.0.5",
|
|
49
51
|
"eslint": "^9",
|
|
50
52
|
"eslint-import-resolver-typescript": "^3.7.0",
|
|
51
53
|
"eslint-plugin-import": "^2.31.0",
|
|
52
54
|
"jest": "^29.7.0",
|
|
53
|
-
"jest-junit": "^
|
|
55
|
+
"jest-junit": "^16",
|
|
54
56
|
"jsii": "~5.5.0",
|
|
55
57
|
"jsii-diff": "^1.106.0",
|
|
56
58
|
"jsii-docgen": "^10.5.0",
|
|
57
59
|
"jsii-pacmak": "^1.106.0",
|
|
58
60
|
"jsii-rosetta": "~5.5.0",
|
|
59
|
-
"projen": "^0.91.
|
|
61
|
+
"projen": "^0.91.6",
|
|
60
62
|
"ts-jest": "^29.2.5",
|
|
61
63
|
"ts-node": "^10.9.2",
|
|
62
|
-
"typescript": "^5.7.
|
|
64
|
+
"typescript": "^5.7.3"
|
|
63
65
|
},
|
|
64
66
|
"peerDependencies": {
|
|
65
|
-
"aws-cdk-lib": "^2.
|
|
67
|
+
"aws-cdk-lib": "^2.173.2",
|
|
66
68
|
"constructs": "^10.0.5"
|
|
67
69
|
},
|
|
68
70
|
"keywords": [
|
|
@@ -96,7 +98,7 @@
|
|
|
96
98
|
"publishConfig": {
|
|
97
99
|
"access": "public"
|
|
98
100
|
},
|
|
99
|
-
"version": "1.3.
|
|
101
|
+
"version": "1.3.2",
|
|
100
102
|
"jest": {
|
|
101
103
|
"coverageProvider": "v8",
|
|
102
104
|
"testMatch": [
|