token-injectable-docker-builder 1.2.7 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -7,7 +7,7 @@
7
7
  ]
8
8
  },
9
9
  "dependencies": {
10
- "aws-cdk-lib": "^2.166.0",
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": {
@@ -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": 123
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,18 +4004,19 @@
3955
4004
  "kind": "class",
3956
4005
  "locationInModule": {
3957
4006
  "filename": "src/index.ts",
3958
- "line": 118
4007
+ "line": 113
3959
4008
  },
3960
4009
  "name": "TokenInjectableDockerBuilder",
3961
4010
  "properties": [
3962
4011
  {
3963
4012
  "docs": {
3964
- "stability": "stable"
4013
+ "stability": "stable",
4014
+ "summary": "An ECS-compatible container image referencing the tag of the built Docker image."
3965
4015
  },
3966
4016
  "immutable": true,
3967
4017
  "locationInModule": {
3968
4018
  "filename": "src/index.ts",
3969
- "line": 120
4019
+ "line": 123
3970
4020
  },
3971
4021
  "name": "containerImage",
3972
4022
  "type": {
@@ -3975,12 +4025,13 @@
3975
4025
  },
3976
4026
  {
3977
4027
  "docs": {
3978
- "stability": "stable"
4028
+ "stability": "stable",
4029
+ "summary": "A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image."
3979
4030
  },
3980
4031
  "immutable": true,
3981
4032
  "locationInModule": {
3982
4033
  "filename": "src/index.ts",
3983
- "line": 121
4034
+ "line": 129
3984
4035
  },
3985
4036
  "name": "dockerImageCode",
3986
4037
  "type": {
@@ -4001,7 +4052,7 @@
4001
4052
  "kind": "interface",
4002
4053
  "locationInModule": {
4003
4054
  "filename": "src/index.ts",
4004
- "line": 18
4055
+ "line": 19
4005
4056
  },
4006
4057
  "name": "TokenInjectableDockerBuilderProps",
4007
4058
  "properties": [
@@ -4014,7 +4065,7 @@
4014
4065
  "immutable": true,
4015
4066
  "locationInModule": {
4016
4067
  "filename": "src/index.ts",
4017
- "line": 22
4068
+ "line": 23
4018
4069
  },
4019
4070
  "name": "path",
4020
4071
  "type": {
@@ -4025,14 +4076,14 @@
4025
4076
  "abstract": true,
4026
4077
  "docs": {
4027
4078
  "example": "{\n TOKEN: 'my-secret-token',\n ENV: 'production'\n}",
4028
- "remarks": "These are transformed into `--build-arg` flags.",
4079
+ "remarks": "These are transformed into `--build-arg KEY=VALUE` flags.",
4029
4080
  "stability": "stable",
4030
4081
  "summary": "Build arguments to pass to the Docker build process."
4031
4082
  },
4032
4083
  "immutable": true,
4033
4084
  "locationInModule": {
4034
4085
  "filename": "src/index.ts",
4035
- "line": 33
4086
+ "line": 34
4036
4087
  },
4037
4088
  "name": "buildArgs",
4038
4089
  "optional": true,
@@ -4049,14 +4100,14 @@
4049
4100
  "abstract": true,
4050
4101
  "docs": {
4051
4102
  "example": "'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'",
4052
- "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, the construct will skip Docker login during the build process.",
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.",
4053
4104
  "stability": "stable",
4054
4105
  "summary": "The ARN of the AWS Secrets Manager secret containing Docker login credentials."
4055
4106
  },
4056
4107
  "immutable": true,
4057
4108
  "locationInModule": {
4058
4109
  "filename": "src/index.ts",
4059
- "line": 48
4110
+ "line": 51
4060
4111
  },
4061
4112
  "name": "dockerLoginSecretArn",
4062
4113
  "optional": true,
@@ -4068,9 +4119,9 @@
4068
4119
  "abstract": true,
4069
4120
  "docs": {
4070
4121
  "default": "- No additional install commands.",
4071
- "remarks": "**Example Usage:**\n```typescript\nnew TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {\n path: path.resolve(__dirname, '../app'),\n installCommands: [\n 'echo \"Updating package lists...\"',\n 'apt-get update -y',\n 'echo \"Installing required packages...\"',\n 'apt-get install -y curl dnsutils',\n ],\n // ... other properties ...\n});\n```\n*This example demonstrates how to install the `curl` and `dnsutils` packages during the install phase using `apt-get`, the package manager for Ubuntu-based CodeBuild environments.*",
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```",
4072
4123
  "stability": "stable",
4073
- "summary": "Custom commands to run during the install phase."
4124
+ "summary": "Custom commands to run during the install phase of CodeBuild."
4074
4125
  },
4075
4126
  "immutable": true,
4076
4127
  "locationInModule": {
@@ -4092,14 +4143,14 @@
4092
4143
  "abstract": true,
4093
4144
  "docs": {
4094
4145
  "default": "- No additional pre-build commands.",
4095
- "remarks": "**Example Usage:**\n```typescript\nnew TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {\n path: path.resolve(__dirname, '../app'),\n preBuildCommands: [\n 'echo \"Fetching configuration from private API...\"',\n 'curl -o config.json https://api.example.com/config',\n ],\n // ... other properties ...\n});\n```\n*In this example, the builder fetches a configuration file from a private API before starting the Docker build. This config file will be available in the same directory as your Dockerfile during CDK deployment.*",
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```",
4096
4147
  "stability": "stable",
4097
- "summary": "Custom commands to run during the pre_build phase."
4148
+ "summary": "Custom commands to run during the pre_build phase of CodeBuild."
4098
4149
  },
4099
4150
  "immutable": true,
4100
4151
  "locationInModule": {
4101
4152
  "filename": "src/index.ts",
4102
- "line": 112
4153
+ "line": 105
4103
4154
  },
4104
4155
  "name": "preBuildCommands",
4105
4156
  "optional": true,
@@ -4115,15 +4166,15 @@
4115
4166
  {
4116
4167
  "abstract": true,
4117
4168
  "docs": {
4118
- "default": "No security groups are attached.",
4119
- "remarks": "These should define the network access rules for the CodeBuild project.",
4169
+ "default": "- No security groups are attached.",
4170
+ "remarks": "These define the network access rules for the CodeBuild project.",
4120
4171
  "stability": "stable",
4121
4172
  "summary": "The security groups to attach to the CodeBuild project."
4122
4173
  },
4123
4174
  "immutable": true,
4124
4175
  "locationInModule": {
4125
4176
  "filename": "src/index.ts",
4126
- "line": 62
4177
+ "line": 67
4127
4178
  },
4128
4179
  "name": "securityGroups",
4129
4180
  "optional": true,
@@ -4139,7 +4190,7 @@
4139
4190
  {
4140
4191
  "abstract": true,
4141
4192
  "docs": {
4142
- "default": "All subnets in the VPC are used.",
4193
+ "default": "- All subnets in the VPC are used.",
4143
4194
  "remarks": "Allows the user to select private, public, or isolated subnets.",
4144
4195
  "stability": "stable",
4145
4196
  "summary": "The subnet selection to specify which subnets to use within the VPC."
@@ -4147,7 +4198,7 @@
4147
4198
  "immutable": true,
4148
4199
  "locationInModule": {
4149
4200
  "filename": "src/index.ts",
4150
- "line": 69
4201
+ "line": 75
4151
4202
  },
4152
4203
  "name": "subnetSelection",
4153
4204
  "optional": true,
@@ -4158,7 +4209,7 @@
4158
4209
  {
4159
4210
  "abstract": true,
4160
4211
  "docs": {
4161
- "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.",
4162
4213
  "remarks": "If provided, the CodeBuild project will be launched within the specified VPC.",
4163
4214
  "stability": "stable",
4164
4215
  "summary": "The VPC in which the CodeBuild project will be deployed."
@@ -4166,7 +4217,7 @@
4166
4217
  "immutable": true,
4167
4218
  "locationInModule": {
4168
4219
  "filename": "src/index.ts",
4169
- "line": 55
4220
+ "line": 59
4170
4221
  },
4171
4222
  "name": "vpc",
4172
4223
  "optional": true,
@@ -4178,6 +4229,6 @@
4178
4229
  "symbolId": "src/index:TokenInjectableDockerBuilderProps"
4179
4230
  }
4180
4231
  },
4181
- "version": "1.2.7",
4182
- "fingerprint": "9GABMeCUEVrnrA3l3vauIPVodVLL/zlUUeRlfhTLS2w="
4232
+ "version": "1.3.1",
4233
+ "fingerprint": "Q9DfzcrA3DzkFuZ3QghI1ZV3uoLI/0611iFI3ZPoifc="
4183
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> | *No description.* |
20
- | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
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> | *No description.* |
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> | *No description.* |
91
- | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> | *No description.* |
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,6 +118,8 @@ public readonly containerImage: ContainerImage;
112
118
 
113
119
  - *Type:* aws-cdk-lib.aws_ecs.ContainerImage
114
120
 
121
+ An ECS-compatible container image referencing the tag of the built Docker image.
122
+
115
123
  ---
116
124
 
117
125
  ##### `dockerImageCode`<sup>Required</sup> <a name="dockerImageCode" id="token-injectable-docker-builder.TokenInjectableDockerBuilder.property.dockerImageCode"></a>
@@ -122,6 +130,8 @@ public readonly dockerImageCode: DockerImageCode;
122
130
 
123
131
  - *Type:* aws-cdk-lib.aws_lambda.DockerImageCode
124
132
 
133
+ A Lambda-compatible DockerImageCode referencing the the tag of the built Docker image.
134
+
125
135
  ---
126
136
 
127
137
 
@@ -146,8 +156,8 @@ const tokenInjectableDockerBuilderProps: TokenInjectableDockerBuilderProps = { .
146
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. |
147
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. |
148
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. |
149
- | <code><a href="#token-injectable-docker-builder.TokenInjectableDockerBuilderProps.property.installCommands">installCommands</a></code> | <code>string[]</code> | Custom commands to run during the install phase. |
150
- | <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. |
151
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. |
152
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. |
153
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. |
@@ -176,7 +186,7 @@ public readonly buildArgs: {[ key: string ]: string};
176
186
 
177
187
  Build arguments to pass to the Docker build process.
178
188
 
179
- These are transformed into `--build-arg` flags.
189
+ These are transformed into `--build-arg KEY=VALUE` flags.
180
190
 
181
191
  ---
182
192
 
@@ -207,7 +217,9 @@ This secret should store a JSON object with the following structure:
207
217
  "password": "my-docker-password"
208
218
  }
209
219
  ```
210
- If not provided, the construct will skip Docker login during the build process.
220
+ If not provided (or not needed), the construct will skip Docker Hub login.
221
+
222
+ **Note**: The secret must be in the same region as the stack.
211
223
 
212
224
  ---
213
225
 
@@ -227,22 +239,17 @@ public readonly installCommands: string[];
227
239
  - *Type:* string[]
228
240
  - *Default:* No additional install commands.
229
241
 
230
- Custom commands to run during the install phase.
242
+ Custom commands to run during the install phase of CodeBuild.
231
243
 
232
- **Example Usage:**
233
- ```typescript
234
- new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
235
- path: path.resolve(__dirname, '../app'),
236
- installCommands: [
237
- 'echo "Updating package lists..."',
238
- 'apt-get update -y',
239
- 'echo "Installing required packages..."',
240
- 'apt-get install -y curl dnsutils',
241
- ],
242
- // ... other properties ...
243
- });
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
+ ],
244
252
  ```
245
- *This example demonstrates how to install the `curl` and `dnsutils` packages during the install phase using `apt-get`, the package manager for Ubuntu-based CodeBuild environments.*
246
253
 
247
254
  ---
248
255
 
@@ -255,20 +262,15 @@ public readonly preBuildCommands: string[];
255
262
  - *Type:* string[]
256
263
  - *Default:* No additional pre-build commands.
257
264
 
258
- Custom commands to run during the pre_build phase.
265
+ Custom commands to run during the pre_build phase of CodeBuild.
259
266
 
260
- **Example Usage:**
261
- ```typescript
262
- new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
263
- path: path.resolve(__dirname, '../app'),
264
- preBuildCommands: [
265
- 'echo "Fetching configuration from private API..."',
266
- 'curl -o config.json https://api.example.com/config',
267
- ],
268
- // ... other properties ...
269
- });
267
+ **Example**:
268
+ ```ts
269
+ preBuildCommands: [
270
+ 'echo "Fetching configuration from private API..."',
271
+ 'curl -o config.json https://api.example.com/config',
272
+ ],
270
273
  ```
271
- *In this example, the builder fetches a configuration file from a private API before starting the Docker build. This config file will be available in the same directory as your Dockerfile during CDK deployment.*
272
274
 
273
275
  ---
274
276
 
@@ -283,7 +285,7 @@ public readonly securityGroups: ISecurityGroup[];
283
285
 
284
286
  The security groups to attach to the CodeBuild project.
285
287
 
286
- These should define the network access rules for the CodeBuild project.
288
+ These define the network access rules for the CodeBuild project.
287
289
 
288
290
  ---
289
291
 
@@ -1,97 +1,120 @@
1
- const { CodeBuildClient, ListBuildsForProjectCommand, BatchGetBuildsCommand } = require('@aws-sdk/client-codebuild');
2
- const { CloudWatchLogsClient, GetLogEventsCommand } = require('@aws-sdk/client-cloudwatch-logs');
3
-
4
- exports.handler = async (event, context) => {
5
- console.log('isCompleteHandler Event:', JSON.stringify(event, null, 2));
6
-
7
- // Initialize AWS SDK v3 clients
8
- const codebuildClient = new CodeBuildClient({ region: process.env.AWS_REGION });
9
- const cloudwatchlogsClient = new CloudWatchLogsClient({ region: process.env.AWS_REGION });
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.ProjectName;
21
+ const projectName = event.ResourceProperties?.ProjectName;
22
+ console.log('ProjectName from ResourceProperties:', projectName);
13
23
 
14
24
  if (!projectName) {
15
- throw new Error('ProjectName is required in ResourceProperties');
25
+ throw new Error('Missing ProjectName in ResourceProperties');
16
26
  }
17
27
 
18
- console.log(`Checking status for CodeBuild project: ${projectName}`);
19
-
20
- // Retrieve the latest build for the given project
21
- const listBuildsCommand = new ListBuildsForProjectCommand({
22
- projectName: projectName,
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
- if (!buildIds || buildIds.length === 0) {
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 = buildIds[0];
35
- console.log(`Latest Build ID: ${buildId}`);
49
+ const buildId = listResp.ids[0];
50
+ console.log(`Identified latest Build ID: ${buildId}`);
36
51
 
37
- // Get build details
38
- const batchGetBuildsCommand = new BatchGetBuildsCommand({
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(`Build Status: ${buildStatus}`);
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
- // Build is still in progress
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
- } else if (buildStatus === 'SUCCEEDED') {
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
- const errorMessage = `Build failed with status: ${buildStatus}\nLast 5 build logs:\n${lastFiveMessages}`;
78
- console.error(errorMessage);
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
- // Throw an error to indicate failure to the CDK provider
81
- throw new Error(errorMessage);
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
- const errorMessage = `Build failed with status: ${buildStatus}, but logs are not available.`;
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('Error in isCompleteHandler:', error);
94
- // Rethrow the error to inform the CDK provider of the failure
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',
@@ -31,7 +31,9 @@ export interface TokenInjectableDockerBuilderProps {
31
31
  * "password": "my-docker-password"
32
32
  * }
33
33
  * ```
34
- * If not provided, the construct will skip Docker login during the build process.
34
+ * If not provided (or not needed), the construct will skip Docker Hub login.
35
+ *
36
+ * **Note**: The secret must be in the same region as the stack.
35
37
  *
36
38
  * @example 'arn:aws:secretsmanager:us-east-1:123456789012:secret:DockerLoginSecret'
37
39
  */
@@ -39,68 +41,79 @@ export interface TokenInjectableDockerBuilderProps {
39
41
  /**
40
42
  * The VPC in which the CodeBuild project will be deployed.
41
43
  * If provided, the CodeBuild project will be launched within the specified VPC.
42
- * @default No VPC is attached, and the CodeBuild project will use public internet.
44
+ *
45
+ * @default - No VPC is attached, and the CodeBuild project will use public internet.
43
46
  */
44
47
  readonly vpc?: IVpc;
45
48
  /**
46
49
  * The security groups to attach to the CodeBuild project.
47
- * These should define the network access rules for the CodeBuild project.
48
- * @default No security groups are attached.
50
+ * These define the network access rules for the CodeBuild project.
51
+ *
52
+ * @default - No security groups are attached.
49
53
  */
50
54
  readonly securityGroups?: ISecurityGroup[];
51
55
  /**
52
56
  * The subnet selection to specify which subnets to use within the VPC.
53
57
  * Allows the user to select private, public, or isolated subnets.
54
- * @default All subnets in the VPC are used.
58
+ *
59
+ * @default - All subnets in the VPC are used.
55
60
  */
56
61
  readonly subnetSelection?: SubnetSelection;
57
62
  /**
58
- * Custom commands to run during the install phase.
63
+ * Custom commands to run during the install phase of CodeBuild.
59
64
  *
60
- * **Example Usage:**
61
- * ```typescript
62
- * new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
63
- * path: path.resolve(__dirname, '../app'),
64
- * installCommands: [
65
- * 'echo "Updating package lists..."',
66
- * 'apt-get update -y',
67
- * 'echo "Installing required packages..."',
68
- * 'apt-get install -y curl dnsutils',
69
- * ],
70
- * // ... other properties ...
71
- * });
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
+ * ],
72
73
  * ```
73
- * *This example demonstrates how to install the `curl` and `dnsutils` packages during the install phase using `apt-get`, the package manager for Ubuntu-based CodeBuild environments.*
74
- *
75
74
  * @default - No additional install commands.
76
75
  */
77
76
  readonly installCommands?: string[];
78
77
  /**
79
- * Custom commands to run during the pre_build phase.
78
+ * Custom commands to run during the pre_build phase of CodeBuild.
80
79
  *
81
- * **Example Usage:**
82
- * ```typescript
83
- * new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
84
- * path: path.resolve(__dirname, '../app'),
85
- * preBuildCommands: [
86
- * 'echo "Fetching configuration from private API..."',
87
- * 'curl -o config.json https://api.example.com/config',
88
- * ],
89
- * // ... other properties ...
90
- * });
80
+ * **Example**:
81
+ * ```ts
82
+ * preBuildCommands: [
83
+ * 'echo "Fetching configuration from private API..."',
84
+ * 'curl -o config.json https://api.example.com/config',
85
+ * ],
91
86
  * ```
92
- * *In this example, the builder fetches a configuration file from a private API before starting the Docker build. This config file will be available in the same directory as your Dockerfile during CDK deployment.*
93
- *
94
87
  * @default - No additional pre-build commands.
95
88
  */
96
89
  readonly preBuildCommands?: string[];
97
90
  }
98
91
  /**
99
- * A CDK construct to build and push Docker images to an ECR repository using CodeBuild and Lambda custom resources.
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.
100
95
  */
101
96
  export declare class TokenInjectableDockerBuilder extends Construct {
97
+ /**
98
+ * The ECR repository that stores the resulting Docker image.
99
+ */
102
100
  private readonly ecrRepository;
101
+ /**
102
+ * An ECS-compatible container image referencing the tag
103
+ * of the built Docker image.
104
+ */
103
105
  readonly containerImage: ContainerImage;
106
+ /**
107
+ * A Lambda-compatible DockerImageCode referencing the the tag
108
+ * of the built Docker image.
109
+ */
104
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
+ */
105
118
  constructor(scope: Construct, id: string, props: TokenInjectableDockerBuilderProps);
106
119
  }
package/lib/index.js CHANGED
@@ -12,21 +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 CodeBuild and Lambda custom resources.
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.
20
23
  */
21
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
+ */
22
32
  constructor(scope, id, props) {
23
33
  super(scope, id);
24
34
  const { path: sourcePath, buildArgs, dockerLoginSecretArn, vpc, securityGroups, subnetSelection, installCommands, preBuildCommands, } = props;
35
+ // Generate an ephemeral tag for CodeBuild
36
+ const imageTag = crypto.randomUUID();
25
37
  // Define a KMS key for ECR encryption
26
38
  const encryptionKey = new aws_kms_1.Key(this, 'EcrEncryptionKey', {
27
39
  enableKeyRotation: true,
28
40
  });
29
- // Create an ECR repository with lifecycle rules, encryption, and image scanning enabled
41
+ // Create an ECR repository with encryption, lifecycle rules, and image scanning
30
42
  this.ecrRepository = new aws_ecr_1.Repository(this, 'ECRRepository', {
31
43
  lifecycleRules: [
32
44
  {
@@ -37,31 +49,71 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
37
49
  },
38
50
  ],
39
51
  encryption: aws_ecr_1.RepositoryEncryption.KMS,
40
- encryptionKey: encryptionKey,
52
+ encryptionKey,
41
53
  imageScanOnPush: true,
42
54
  });
43
- // Package the source code as an asset
55
+ // Wrap the source folder as an S3 asset for CodeBuild to use
44
56
  const sourceAsset = new aws_s3_assets_1.Asset(this, 'SourceAsset', {
45
57
  path: sourcePath,
46
58
  });
47
- // Transform buildArgs into a string of --build-arg KEY=VALUE
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
48
66
  const buildArgsString = buildArgs
49
67
  ? Object.entries(buildArgs)
50
- .map(([key, value]) => `--build-arg ${key}=${value}`)
68
+ .map(([k, v]) => `--build-arg ${k}=${v}`)
51
69
  .join(' ')
52
70
  : '';
53
- // Conditional Dockerhub login commands
71
+ // Optional DockerHub login, if a secret ARN is provided
54
72
  const dockerLoginCommands = dockerLoginSecretArn
55
73
  ? [
56
- 'echo "Retrieving Docker credentials from Secrets Manager..."',
74
+ 'echo "Retrieving Docker credentials..."',
75
+ 'apt-get update -y && apt-get install -y jq',
57
76
  `DOCKER_USERNAME=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .username)`,
58
77
  `DOCKER_PASSWORD=$(aws secretsmanager get-secret-value --secret-id ${dockerLoginSecretArn} --query SecretString --output text | jq -r .password)`,
59
- 'echo "Logging in to Docker..."',
78
+ 'echo "Logging in to Docker Hub..."',
60
79
  'echo $DOCKER_PASSWORD | docker login --username $DOCKER_USERNAME --password-stdin',
61
80
  ]
62
- : ['echo "No Docker credentials provided. Skipping login step."'];
63
- // Create a CodeBuild project
64
- const codeBuildProject = new aws_codebuild_1.Project(this, 'UICodeBuildProject', {
81
+ : ['echo "No Docker credentials. Skipping Docker Hub login."'];
82
+ const buildSpecObj = {
83
+ version: '0.2',
84
+ phases: {
85
+ install: {
86
+ commands: [
87
+ 'echo "Beginning install phase..."',
88
+ ...(installCommands ?? []),
89
+ ],
90
+ },
91
+ pre_build: {
92
+ commands: [
93
+ ...(preBuildCommands ?? []),
94
+ ...dockerLoginCommands,
95
+ 'echo "Retrieving AWS Account ID..."',
96
+ 'export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)',
97
+ 'echo "Logging into Amazon ECR..."',
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',
99
+ ],
100
+ },
101
+ build: {
102
+ commands: [
103
+ `echo "Building Docker image with tag ${imageTag}..."`,
104
+ `docker build ${buildArgsString} -t $ECR_REPO_URI:${imageTag} $CODEBUILD_SRC_DIR`,
105
+ ],
106
+ },
107
+ post_build: {
108
+ commands: [
109
+ `echo "Pushing Docker image with tag ${imageTag}..."`,
110
+ `docker push $ECR_REPO_URI:${imageTag}`,
111
+ ],
112
+ },
113
+ },
114
+ };
115
+ // Create the CodeBuild project
116
+ const codeBuildProject = new aws_codebuild_1.Project(this, 'CodeBuildProject', {
65
117
  source: aws_codebuild_1.Source.s3({
66
118
  bucket: sourceAsset.bucket,
67
119
  path: sourceAsset.s3ObjectKey,
@@ -72,51 +124,15 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
72
124
  },
73
125
  environmentVariables: {
74
126
  ECR_REPO_URI: { value: this.ecrRepository.repositoryUri },
75
- BUILD_ARGS: { value: buildArgsString },
76
- // Include build arguments as environment variables if needed
77
- ...(buildArgs &&
78
- Object.fromEntries(Object.entries(buildArgs).map(([key, value]) => [key, { value }]))),
79
127
  },
128
+ buildSpec: aws_codebuild_1.BuildSpec.fromObject(buildSpecObj),
80
129
  vpc,
81
130
  securityGroups,
82
131
  subnetSelection,
83
- buildSpec: aws_codebuild_1.BuildSpec.fromObject({
84
- version: '0.2',
85
- phases: {
86
- install: {
87
- commands: [
88
- 'echo "Beginning install phase..."',
89
- ...(installCommands || []),
90
- ],
91
- },
92
- pre_build: {
93
- commands: [
94
- ...(preBuildCommands || []),
95
- ...dockerLoginCommands,
96
- 'echo "Retrieving AWS Account ID..."',
97
- 'export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)',
98
- 'echo "Logging in to Amazon ECR..."',
99
- 'aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com',
100
- ],
101
- },
102
- build: {
103
- commands: [
104
- 'echo Build phase: Building the Docker image...',
105
- 'docker build $BUILD_ARGS -t $ECR_REPO_URI:latest $CODEBUILD_SRC_DIR',
106
- ],
107
- },
108
- post_build: {
109
- commands: [
110
- 'echo Post-build phase: Pushing the Docker image...',
111
- 'docker push $ECR_REPO_URI:latest',
112
- ],
113
- },
114
- },
115
- }),
116
132
  });
117
- // Grant permissions to CodeBuild
133
+ // Grant CodeBuild the ability to interact with ECR
118
134
  this.ecrRepository.grantPullPush(codeBuildProject);
119
- codeBuildProject.role.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
135
+ codeBuildProject.role?.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
120
136
  actions: [
121
137
  'ecr:GetAuthorizationToken',
122
138
  'ecr:GetDownloadUrlForLayer',
@@ -125,14 +141,13 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
125
141
  resources: [this.ecrRepository.repositoryArn],
126
142
  }));
127
143
  if (dockerLoginSecretArn) {
128
- codeBuildProject.role.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
144
+ codeBuildProject.role?.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
129
145
  actions: ['secretsmanager:GetSecretValue'],
130
146
  resources: [dockerLoginSecretArn],
131
147
  }));
132
148
  }
133
- // Grant CodeBuild access to the KMS key
134
149
  encryptionKey.grantEncryptDecrypt(codeBuildProject.role);
135
- // Create Lambda functions for onEvent and isComplete handlers
150
+ // Define the Lambda functions for custom resource event and completion handling
136
151
  const onEventHandlerFunction = new aws_lambda_1.Function(this, 'OnEventHandlerFunction', {
137
152
  runtime: aws_lambda_1.Runtime.NODEJS_18_X,
138
153
  code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../onEvent')),
@@ -141,11 +156,14 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
141
156
  });
142
157
  onEventHandlerFunction.addToRolePolicy(new aws_iam_1.PolicyStatement({
143
158
  actions: ['codebuild:StartBuild'],
144
- resources: [codeBuildProject.projectArn], // Restrict to specific project
159
+ resources: [codeBuildProject.projectArn],
145
160
  }));
146
161
  const isCompleteHandlerFunction = new aws_lambda_1.Function(this, 'IsCompleteHandlerFunction', {
147
162
  runtime: aws_lambda_1.Runtime.NODEJS_18_X,
148
163
  code: aws_lambda_1.Code.fromAsset(path.resolve(__dirname, '../isComplete')),
164
+ environment: {
165
+ IMAGE_TAG: imageTag,
166
+ },
149
167
  handler: 'isComplete.handler',
150
168
  timeout: aws_cdk_lib_1.Duration.minutes(15),
151
169
  });
@@ -159,31 +177,37 @@ class TokenInjectableDockerBuilder extends constructs_1.Construct {
159
177
  ],
160
178
  resources: ['*'],
161
179
  }));
162
- // Grant Lambda functions access to KMS key and ECR
180
+ artifactBucket.grantReadWrite(isCompleteHandlerFunction);
163
181
  encryptionKey.grantEncryptDecrypt(onEventHandlerFunction);
164
182
  encryptionKey.grantEncryptDecrypt(isCompleteHandlerFunction);
165
183
  this.ecrRepository.grantPullPush(onEventHandlerFunction);
166
184
  this.ecrRepository.grantPullPush(isCompleteHandlerFunction);
167
- // Create a custom resource provider
185
+ // Create a custom resource provider that uses the above Lambdas
168
186
  const provider = new custom_resources_1.Provider(this, 'CustomResourceProvider', {
169
187
  onEventHandler: onEventHandlerFunction,
170
188
  isCompleteHandler: isCompleteHandlerFunction,
171
189
  queryInterval: aws_cdk_lib_1.Duration.seconds(30),
172
190
  });
173
- // Define the custom resource
191
+ // Custom Resource that triggers the CodeBuild and waits for completion
174
192
  const buildTriggerResource = new aws_cdk_lib_1.CustomResource(this, 'BuildTriggerResource', {
175
193
  serviceToken: provider.serviceToken,
176
194
  properties: {
177
195
  ProjectName: codeBuildProject.projectName,
196
+ ImageTag: imageTag,
178
197
  Trigger: crypto.randomUUID(),
179
198
  },
180
199
  });
181
200
  buildTriggerResource.node.addDependency(codeBuildProject);
182
- this.containerImage = aws_ecs_1.ContainerImage.fromEcrRepository(this.ecrRepository);
183
- this.dockerImageCode = aws_lambda_1.DockerImageCode.fromEcr(this.ecrRepository);
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);
205
+ this.dockerImageCode = aws_lambda_1.DockerImageCode.fromEcr(this.ecrRepository, {
206
+ tagOrDigest: imageTagRef,
207
+ });
184
208
  }
185
209
  }
186
210
  exports.TokenInjectableDockerBuilder = TokenInjectableDockerBuilder;
187
211
  _a = JSII_RTTI_SYMBOL_1;
188
- TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.2.7" };
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDZDQUF1RDtBQUN2RCw2REFBd0Y7QUFFeEYsaURBQWtGO0FBQ2xGLGlEQUFxRDtBQUNyRCxpREFBc0Q7QUFDdEQsaURBQTBDO0FBQzFDLHVEQUFrRjtBQUNsRiw2REFBa0Q7QUFDbEQsbUVBQXdEO0FBQ3hELDJDQUF1QztBQXNHdkM7O0dBRUc7QUFDSCxNQUFhLDRCQUE2QixTQUFRLHNCQUFTO0lBS3pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBd0M7UUFDaEYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQ0osSUFBSSxFQUFFLFVBQVUsRUFDaEIsU0FBUyxFQUNULG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsY0FBYyxFQUNkLGVBQWUsRUFDZixlQUFlLEVBQ2YsZ0JBQWdCLEdBQ2pCLEdBQUcsS0FBSyxDQUFDO1FBRVYsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN0RCxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILHdGQUF3RjtRQUN4RixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQVUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxZQUFZLEVBQUUsQ0FBQztvQkFDZixXQUFXLEVBQUUsb0NBQW9DO29CQUNqRCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxRQUFRO29CQUM3QixXQUFXLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUM5QjthQUNGO1lBQ0QsVUFBVSxFQUFFLDhCQUFvQixDQUFDLEdBQUc7WUFDcEMsYUFBYSxFQUFFLGFB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LGdCQUFnQixDQUFDLFdBQVc7Z0JBQ3pDLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO2FBQzdCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsd0JBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGVBQWUsR0FBRyw0QkFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckUsQ0FBQzs7QUE3TUgsb0VBOE1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUHJvamVjdCwgU291cmNlLCBMaW51eEJ1aWxkSW1hZ2UsIEJ1aWxkU3BlYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgSVZwYywgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUVuY3J5cHRpb24sIFRhZ1N0YXR1cyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgQ29udGFpbmVySW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBSdW50aW1lLCBDb2RlLCBEb2NrZXJJbWFnZUNvZGUsIEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBBc3NldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlcmAgY29uc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIERvY2tlcmZpbGUgb3Igc291cmNlIGNvZGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBEb2NrZXIgYnVpbGQgcHJvY2Vzcy5cbiAgICogVGhlc2UgYXJlIHRyYW5zZm9ybWVkIGludG8gYC0tYnVpbGQtYXJnYCBmbGFncy5cbiAgICogQGV4YW1wbGVcbiAgICoge1xuICAgKiAgIFRPS0VOOiAnbXktc2VjcmV0LXRva2VuJyxcbiAgICogICBFTlY6ICdwcm9kdWN0aW9uJ1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBidWlsZEFyZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBBV1MgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIERvY2tlciBsb2dpbiBjcmVkZW50aWFscy5cbiAgICogVGhpcyBzZWNyZXQgc2hvdWxkIHN0b3JlIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJ1c2VybmFtZVwiOiBcIm15LWRvY2tlci11c2VybmFtZVwiLFxuICAgKiAgIFwicGFzc3dvcmRcIjogXCJteS1kb2NrZXItcGFzc3dvcmRcIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjb25zdHJ1Y3Qgd2lsbCBza2lwIERvY2tlciBsb2dpbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gICAqXG4gICAqIEBleGFtcGxlICdhcm46YXdzOnNlY3JldHNtYW5hZ2VyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6c2VjcmV0OkRvY2tlckxvZ2luU2VjcmV0J1xuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyTG9naW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdpbGwgYmUgZGVwbG95ZWQuXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgQ29kZUJ1aWxkIHByb2plY3Qgd2lsbCBiZSBsYXVuY2hlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBWUEMuXG4gICAqIEBkZWZhdWx0IE5vIFZQQyBpcyBhdHRhY2hlZCwgYW5kIHRoZSBDb2RlQnVpbGQgcHJvamVjdCB3aWxsIHVzZSBwdWJsaWMgaW50ZXJuZXQuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRvIGF0dGFjaCB0byB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIFRoZXNlIHNob3VsZCBkZWZpbmUgdGhlIG5ldHdvcmsgYWNjZXNzIHJ1bGVzIGZvciB0aGUgQ29kZUJ1aWxkIHByb2plY3QuXG4gICAqIEBkZWZhdWx0IE5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdWJuZXQgc2VsZWN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggc3VibmV0cyB0byB1c2Ugd2l0aGluIHRoZSBWUEMuXG4gICAqIEFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgcHJpdmF0ZSwgcHVibGljLCBvciBpc29sYXRlZCBzdWJuZXRzLlxuICAgKiBAZGVmYXVsdCBBbGwgc3VibmV0cyBpbiB0aGUgVlBDIGFyZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0U2VsZWN0aW9uPzogU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gY29tbWFuZHMgdG8gcnVuIGR1cmluZyB0aGUgaW5zdGFsbCBwaGFzZS5cbiAgICpcbiAgICogKipFeGFtcGxlIFVzYWdlOioqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IFRva2VuSW5qZWN0YWJsZURvY2tlckJ1aWxkZXIodGhpcywgJ015RG9ja2VyQnVpbGRlcicsIHtcbiAgICogICBwYXRoOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vYXBwJyksXG4gICAqICAgaW5zdGFsbENvbW1hbmRzOiBbXG4gICAqICAgICAnZWNobyBcIlVwZGF0aW5nIHBhY2thZ2UgbGlzdHMuLi5cIicsXG4gICAqICAgICAnYXB0LWdldCB1cGRhdGUgLXknLFxuICAgKiAgICAgJ2VjaG8gXCJJbnN0YWxsaW5nIHJlcXVpcmVkIHBhY2thZ2VzLi4uXCInLFxuICAgKiAgICAgJ2FwdC1nZXQgaW5zdGFsbCAteSBjdXJsIGRuc3V0aWxzJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqICpUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbnN0YWxsIHRoZSBgY3VybGAgYW5kIGBkbnN1dGlsc2AgcGFja2FnZXMgZHVyaW5nIHRoZSBpbnN0YWxsIHBoYXNlIHVzaW5nIGBhcHQtZ2V0YCwgdGhlIHBhY2thZ2UgbWFuYWdlciBmb3IgVWJ1bnR1LWJhc2VkIENvZGVCdWlsZCBlbnZpcm9ubWVudHMuKlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgaW5zdGFsbCBjb21tYW5kcy5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxDb21tYW5kcz86IHN0cmluZ1tdO1xuXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb21tYW5kcyB0byBydW4gZHVyaW5nIHRoZSBwcmVfYnVpbGQgcGhhc2UuXG4gICAqXG4gICAqICoqRXhhbXBsZSBVc2FnZToqKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyKHRoaXMsICdNeURvY2tlckJ1aWxkZXInLCB7XG4gICAqICAgcGF0aDogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL2FwcCcpLFxuICAgKiAgIHByZUJ1aWxkQ29tbWFuZHM6IFtcbiAgICogICAgICdlY2hvIFwiRmV0Y2hpbmcgY29uZmlndXJhdGlvbiBmcm9tIHByaXZhdGUgQVBJLi4uXCInLFxuICAgKiAgICAgJ2N1cmwgLW8gY29uZmlnLmpzb24gaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vY29uZmlnJyxcbiAgICogICBdLFxuICAgKiAgIC8vIC4uLiBvdGhlciBwcm9wZXJ0aWVzIC4uLlxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqICpJbiB0aGlzIGV4YW1wbGUsIHRoZSBidWlsZGVyIGZldGNoZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSBhIHByaXZhdGUgQVBJIGJlZm9yZSBzdGFydGluZyB0aGUgRG9ja2VyIGJ1aWxkLiBUaGlzIGNvbmZpZyBmaWxlIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIERvY2tlcmZpbGUgZHVyaW5nIENESyBkZXBsb3ltZW50LipcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIHByZS1idWlsZCBjb21tYW5kcy5cbiAgICovXG4gIHJlYWRvbmx5IHByZUJ1aWxkQ29tbWFuZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIENESyBjb25zdHJ1Y3QgdG8gYnVpbGQgYW5kIHB1c2ggRG9ja2VyIGltYWdlcyB0byBhbiBFQ1IgcmVwb3NpdG9yeSB1c2luZyBDb2RlQnVpbGQgYW5kIExhbWJkYSBjdXN0b20gcmVzb3VyY2VzLlxuICovXG5leHBvcnQgY2xhc3MgVG9rZW5JbmplY3RhYmxlRG9ja2VyQnVpbGRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWNyUmVwb3NpdG9yeTogUmVwb3NpdG9yeTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lckltYWdlOiBDb250YWluZXJJbWFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUb2tlbkluamVjdGFibGVEb2NrZXJCdWlsZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgIGJ1aWxkQXJncyxcbiAgICAgIGRvY2tlckxvZ2luU2VjcmV0QXJuLFxuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBzdWJuZXRTZWxlY3Rpb24sXG4gICAgICBpbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwcmVCdWlsZENvbW1hbmRzLFxuICAgIH0gPSBwcm9wcztcblxuICAgIC8vIERlZmluZSBhIEtNUyBrZXkgZm9yIEVDUiBlbmNyeXB0aW9uXG4gICAgY29uc3QgZW5jcnlwdGlvbktleSA9IG5ldyBLZXkodGhpcywgJ0VjckVuY3J5cHRpb25LZXknLCB7XG4gICAgICBlbmFibGVLZXlSb3RhdGlvbjogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiBFQ1IgcmVwb3NpdG9yeSB3aXRoIGxpZmVjeWNsZSBydWxlcywgZW5jcnlwdGlvbiwgYW5kIGltYWdlIHNjYW5uaW5nIGVuYWJsZWRcbiAgICB0aGlzLmVjclJlcG9zaXRvcnkgPSBuZXcgUmVwb3NpdG9yeSh0aGlzLCAnRUNSUmVwb3NpdG9yeScsIHtcbiAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBydWxlUHJpb3JpdHk6IDEsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICdSZW1vdmUgdW50YWdnZWQgaW1hZ2VzIGFmdGVyIDEgZGF5JyxcbiAgICAgICAgICB0YWdTdGF0dXM6IFRhZ1N0YXR1cy5VTlRBR0dFRCxcbiAgICAgICAgICBtYXhJbWFnZUFnZTogRHVyYXRpb24uZGF5cygxKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbmNyeXB0aW9uOiBSZXBvc2l0b3J5RW5jcnlwdGlvbi5LTVMsXG4gICAgICBlbmNyeXB0aW9uS2V5OiBlbmNyeXB0aW9uS2V5LFxuICAgICAgaW1hZ2VTY2FuT25QdXNoOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFja2FnZSB0aGUgc291cmNlIGNvZGUgYXMgYW4gYXNzZXRcbiAgICBjb25zdCBzb3VyY2VBc3NldCA9IG5ldyBBc3NldCh0aGlzLCAnU291cmNlQXNzZXQnLCB7XG4gICAgICBwYXRoOiBzb3VyY2VQYXRoLFxuICAgIH0pO1xuXG4gICAgLy8gVHJhbnNmb3JtIGJ1aWxkQXJncyBpbnRvIGEgc3RyaW5nIG9mIC0tYnVpbGQtYXJnIEtFWT1WQUxVRVxuICAgIGNvbnN0IGJ1aWxkQXJnc1N0cmluZyA9IGJ1aWxkQXJnc1xuICAgICAgPyBPYmplY3QuZW50cmllcyhidWlsZEFyZ3MpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYC0tYnVpbGQtYXJnICR7a2V5fT0ke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCcgJylcbiAgICAgIDogJyc7XG5cbiAgICAvLyBDb25kaXRpb25hbCBEb2NrZXJodWIgbG9naW4gY29tbWFuZHNcbiAgICBjb25zdCBkb2NrZXJMb2dpbkNvbW1hbmRzID0gZG9ja2VyTG9naW5TZWNyZXRBcm5cbiAgICAgID8gW1xuICAgICAgICAnZWNobyBcIlJldHJpZXZpbmcgRG9ja2VyIGNyZWRlbnRpYWxzIGZyb20gU2VjcmV0cyBNYW5hZ2VyLi4uXCInLFxuICAgICAgICBgRE9DS0VSX1VTRVJOQU1FPSQoYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgJHtkb2NrZXJMb2dpblNlY3JldEFybn0gLS1xdWVyeSBTZWNyZXRTdHJpbmcgLS1vdXRwdXQgdGV4dCB8IGpxIC1yIC51c2VybmFtZSlgLFxuICAgICAgICBgRE9DS0VSX1BBU1NXT1JEPSQoYXdzIHNlY3JldHNtYW5hZ2VyIGdldC1zZWNyZXQtdmFsdWUgLS1zZWNyZXQtaWQgJHtkb2NrZXJMb2dpblNlY3JldEFybn0gLS1xdWVyeSBTZWNyZXRTdHJpbmcgLS1vdXRwdXQgdGV4dCB8IGpxIC1yIC5wYXNzd29yZClgLFxuICAgICAgICAnZWNobyBcIkxvZ2dpbmcgaW4gdG8gRG9ja2VyLi4uXCInLFxuICAgICAgICAnZWNobyAkRE9DS0VSX1BBU1NXT1JEIHwgZG9ja2VyIGxvZ2luIC0tdXNlcm5hbWUgJERPQ0tFUl9VU0VSTkFNRSAtLXBhc3N3b3JkLXN0ZGluJyxcbiAgICAgIF1cbiAgICAgIDogWydlY2hvIFwiTm8gRG9ja2VyIGNyZWRlbnRpYWxzIHByb3ZpZGVkLiBTa2lwcGluZyBsb2dpbiBzdGVwLlwiJ107XG5cbiAgICAvLyBDcmVhdGUgYSBDb2RlQnVpbGQgcHJvamVjdFxuICAgIGNvbnN0IGNvZGVCdWlsZFByb2plY3QgPSBuZXcgUHJvamVjdCh0aGlzLCAnVUlDb2RlQnVpbGRQcm9qZWN0Jywge1xuICAgICAgc291cmNlOiBTb3VyY2UuczMoe1xuICAgICAgICBidWNrZXQ6IHNvdXJjZUFzc2V0LmJ1Y2tldCxcbiAgICAgICAgcGF0aDogc291cmNlQXNzZXQuczNPYmplY3RLZXksXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIGJ1aWxkSW1hZ2U6IExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF83XzAsXG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgRUNSX1JFUE9fVVJJOiB7IHZhbHVlOiB0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeVVyaSB9LFxuICAgICAgICBCVUlMRF9BUkdTOiB7IHZhbHVlOiBidWlsZEFyZ3NTdHJpbmcgfSxcbiAgICAgICAgLy8gSW5jbHVkZSBidWlsZCBhcmd1bWVudHMgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGlmIG5lZWRlZFxuICAgICAgICAuLi4oYnVpbGRBcmdzICYmXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoYnVpbGRBcmdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgeyB2YWx1ZSB9XSksXG4gICAgICAgICAgKSksXG4gICAgICB9LFxuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cHMsXG4gICAgICBzdWJuZXRTZWxlY3Rpb24sXG4gICAgICBidWlsZFNwZWM6IEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHtcbiAgICAgICAgdmVyc2lvbjogJzAuMicsXG4gICAgICAgIHBoYXNlczoge1xuICAgICAgICAgIGluc3RhbGw6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIFwiQmVnaW5uaW5nIGluc3RhbGwgcGhhc2UuLi5cIicsXG4gICAgICAgICAgICAgIC4uLihpbnN0YWxsQ29tbWFuZHMgfHwgW10pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByZV9idWlsZDoge1xuICAgICAgICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgICAgICAgLi4uKHByZUJ1aWxkQ29tbWFuZHMgfHwgW10pLFxuICAgICAgICAgICAgICAuLi5kb2NrZXJMb2dpbkNvbW1hbmRzLFxuICAgICAgICAgICAgICAnZWNobyBcIlJldHJpZXZpbmcgQVdTIEFjY291bnQgSUQuLi5cIicsXG4gICAgICAgICAgICAgICdleHBvcnQgQUNDT1VOVF9JRD0kKGF3cyBzdHMgZ2V0LWNhbGxlci1pZGVudGl0eSAtLXF1ZXJ5IEFjY291bnQgLS1vdXRwdXQgdGV4dCknLFxuICAgICAgICAgICAgICAnZWNobyBcIkxvZ2dpbmcgaW4gdG8gQW1hem9uIEVDUi4uLlwiJyxcbiAgICAgICAgICAgICAgJ2F3cyBlY3IgZ2V0LWxvZ2luLXBhc3N3b3JkIC0tcmVnaW9uICRBV1NfREVGQVVMVF9SRUdJT04gfCBkb2NrZXIgbG9naW4gLS11c2VybmFtZSBBV1MgLS1wYXNzd29yZC1zdGRpbiAkQUNDT1VOVF9JRC5ka3IuZWNyLiRBV1NfREVGQVVMVF9SRUdJT04uYW1hem9uYXdzLmNvbScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIEJ1aWxkIHBoYXNlOiBCdWlsZGluZyB0aGUgRG9ja2VyIGltYWdlLi4uJyxcbiAgICAgICAgICAgICAgJ2RvY2tlciBidWlsZCAkQlVJTERfQVJHUyAtdCAkRUNSX1JFUE9fVVJJOmxhdGVzdCAkQ09ERUJVSUxEX1NSQ19ESVInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc3RfYnVpbGQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmRzOiBbXG4gICAgICAgICAgICAgICdlY2hvIFBvc3QtYnVpbGQgcGhhc2U6IFB1c2hpbmcgdGhlIERvY2tlciBpbWFnZS4uLicsXG4gICAgICAgICAgICAgICdkb2NrZXIgcHVzaCAkRUNSX1JFUE9fVVJJOmxhdGVzdCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IHBlcm1pc3Npb25zIHRvIENvZGVCdWlsZFxuICAgIHRoaXMuZWNyUmVwb3NpdG9yeS5ncmFudFB1bGxQdXNoKGNvZGVCdWlsZFByb2plY3QpO1xuXG4gICAgY29kZUJ1aWxkUHJvamVjdC5yb2xlIS5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjcjpHZXRBdXRob3JpemF0aW9uVG9rZW4nLFxuICAgICAgICAgICdlY3I6R2V0RG93bmxvYWRVcmxGb3JMYXllcicsXG4gICAgICAgICAgJ2VjcjpCYXRjaENoZWNrTGF5ZXJBdmFpbGFiaWxpdHknLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmVjclJlcG9zaXRvcnkucmVwb3NpdG9yeUFybl0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgaWYgKGRvY2tlckxvZ2luU2VjcmV0QXJuKSB7XG4gICAgICBjb2RlQnVpbGRQcm9qZWN0LnJvbGUhLmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbZG9ja2VyTG9naW5TZWNyZXRBcm5dLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgQ29kZUJ1aWxkIGFjY2VzcyB0byB0aGUgS01TIGtleVxuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChjb2RlQnVpbGRQcm9qZWN0LnJvbGUhKTtcblxuICAgIC8vIENyZWF0ZSBMYW1iZGEgZnVuY3Rpb25zIGZvciBvbkV2ZW50IGFuZCBpc0NvbXBsZXRlIGhhbmRsZXJzXG4gICAgY29uc3Qgb25FdmVudEhhbmRsZXJGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnT25FdmVudEhhbmRsZXJGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vb25FdmVudCcpKSxcbiAgICAgIGhhbmRsZXI6ICdvbkV2ZW50LmhhbmRsZXInLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgfSk7XG5cbiAgICBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ2NvZGVidWlsZDpTdGFydEJ1aWxkJ10sXG4gICAgICAgIHJlc291cmNlczogW2NvZGVCdWlsZFByb2plY3QucHJvamVjdEFybl0sIC8vIFJlc3RyaWN0IHRvIHNwZWNpZmljIHByb2plY3RcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBpc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlSGFuZGxlckZ1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi9pc0NvbXBsZXRlJykpLFxuICAgICAgaGFuZGxlcjogJ2lzQ29tcGxldGUuaGFuZGxlcicsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcblxuICAgIGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAnY29kZWJ1aWxkOkJhdGNoR2V0QnVpbGRzJyxcbiAgICAgICAgICAnY29kZWJ1aWxkOkxpc3RCdWlsZHNGb3JQcm9qZWN0JyxcbiAgICAgICAgICAnbG9nczpHZXRMb2dFdmVudHMnLFxuICAgICAgICAgICdsb2dzOkRlc2NyaWJlTG9nU3RyZWFtcycsXG4gICAgICAgICAgJ2xvZ3M6RGVzY3JpYmVMb2dHcm91cHMnLFxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEdyYW50IExhbWJkYSBmdW5jdGlvbnMgYWNjZXNzIHRvIEtNUyBrZXkgYW5kIEVDUlxuICAgIGVuY3J5cHRpb25LZXkuZ3JhbnRFbmNyeXB0RGVjcnlwdChvbkV2ZW50SGFuZGxlckZ1bmN0aW9uKTtcbiAgICBlbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2gob25FdmVudEhhbmRsZXJGdW5jdGlvbik7XG4gICAgdGhpcy5lY3JSZXBvc2l0b3J5LmdyYW50UHVsbFB1c2goaXNDb21wbGV0ZUhhbmRsZXJGdW5jdGlvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXJcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50SGFuZGxlckZ1bmN0aW9uLFxuICAgICAgaXNDb21wbGV0ZUhhbmRsZXI6IGlzQ29tcGxldGVIYW5kbGVyRnVuY3Rpb24sXG4gICAgICBxdWVyeUludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KTtcblxuICAgIC8vIERlZmluZSB0aGUgY3VzdG9tIHJlc291cmNlXG4gICAgY29uc3QgYnVpbGRUcmlnZ2VyUmVzb3VyY2UgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ0J1aWxkVHJpZ2dlclJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFByb2plY3ROYW1lOiBjb2RlQnVpbGRQcm9qZWN0LnByb2plY3ROYW1lLFxuICAgICAgICBUcmlnZ2VyOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGJ1aWxkVHJpZ2dlclJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShjb2RlQnVpbGRQcm9qZWN0KTtcbiAgICB0aGlzLmNvbnRhaW5lckltYWdlID0gQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkodGhpcy5lY3JSZXBvc2l0b3J5KTtcbiAgICB0aGlzLmRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHRoaXMuZWNyUmVwb3NpdG9yeSk7XG4gIH1cbn1cbiJdfQ==
212
+ TokenInjectableDockerBuilder[_a] = { fqn: "token-injectable-docker-builder.TokenInjectableDockerBuilder", version: "1.3.1" };
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-destroy": "cdk destroy --app \"npx ts-node src/integ.default.ts\""
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",
@@ -43,7 +45,7 @@
43
45
  "@types/node": "^22.10.2",
44
46
  "@typescript-eslint/eslint-plugin": "^8",
45
47
  "@typescript-eslint/parser": "^8",
46
- "aws-cdk-lib": "2.166.0",
48
+ "aws-cdk-lib": "2.173.2",
47
49
  "commit-and-tag-version": "^12",
48
50
  "constructs": "10.0.5",
49
51
  "eslint": "^9",
@@ -62,7 +64,7 @@
62
64
  "typescript": "^5.7.2"
63
65
  },
64
66
  "peerDependencies": {
65
- "aws-cdk-lib": "^2.166.0",
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.2.7",
101
+ "version": "1.3.1",
100
102
  "jest": {
101
103
  "coverageProvider": "v8",
102
104
  "testMatch": [