token-injectable-docker-builder 1.3.0 → 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, retrieving the final image digest (SHA) and using that exact digest for ECS or Lambda references."
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": 128
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": 115
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 ContainerImage referencing the *exact* SHA digest of the built Docker image."
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": 121
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 *exact* SHA digest of the built Docker image."
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": 126
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": 18
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": 22
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": 33
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.\nNOTE: The secret must be in the same region as the stack.",
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": 49
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 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```",
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": 90
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 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```",
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": 108
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 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.",
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": 63
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": 70
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": 56
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.0",
4184
- "fingerprint": "ZL25JVTzJLNHeDV7j15vMt4HHx0Ae4Mvgy29nJsio6w="
4232
+ "version": "1.3.1",
4233
+ "fingerprint": "Q9DfzcrA3DzkFuZ3QghI1ZV3uoLI/0611iFI3ZPoifc="
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, retrieving the final image digest (SHA) and using that exact digest for ECS or Lambda references.
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> | An ECS-compatible ContainerImage referencing the *exact* SHA digest of the built Docker image. |
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 *exact* SHA digest of the built Docker image. |
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 ContainerImage referencing the *exact* SHA digest of the built Docker image.
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 *exact* SHA digest of the built Docker image.
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
- NOTE: The secret must be in the same region as the stack.
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 Usage:**
238
- ```typescript
239
- new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
240
- path: path.resolve(__dirname, '../app'),
241
- installCommands: [
242
- 'echo "Updating package lists..."',
243
- 'apt-get update -y',
244
- 'echo "Installing required packages..."',
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 Usage:**
265
- ```typescript
266
- new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
267
- path: path.resolve(__dirname, '../app'),
268
- preBuildCommands: [
269
- 'echo "Fetching configuration from private API..."',
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 should define the network access rules for the CodeBuild project.
288
+ These define the network access rules for the CodeBuild project.
290
289
 
291
290
  ---
292
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',
@@ -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
- * NOTE: The secret must be in the same region as the stack.
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
- * @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.
44
46
  */
45
47
  readonly vpc?: IVpc;
46
48
  /**
47
49
  * The security groups to attach to the CodeBuild project.
48
- * These should define the network access rules for the CodeBuild project.
49
- * @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.
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
- * @default All subnets in the VPC are used.
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 Usage:**
62
- * ```typescript
63
- * new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
64
- * path: path.resolve(__dirname, '../app'),
65
- * installCommands: [
66
- * 'echo "Updating package lists..."',
67
- * 'apt-get update -y',
68
- * 'echo "Installing required packages..."',
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 Usage:**
81
- * ```typescript
82
- * new TokenInjectableDockerBuilder(this, 'MyDockerBuilder', {
83
- * path: path.resolve(__dirname, '../app'),
84
- * preBuildCommands: [
85
- * 'echo "Fetching configuration from private API..."',
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 CodeBuild and Lambda custom resources,
97
- * retrieving the final image digest (SHA) and using that exact digest for ECS or Lambda references.
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 ContainerImage referencing the *exact* SHA digest of the built Docker image.
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 *exact* SHA digest of the built Docker image.
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 CodeBuild and Lambda custom resources,
20
- * retrieving the final image digest (SHA) and using that exact digest for ECS or Lambda references.
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 a unique tag for this build.
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
- // Package source code
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
- // Build args
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
- // Docker Hub login commands
71
+ // Optional DockerHub login, if a secret ARN is provided
57
72
  const dockerLoginCommands = dockerLoginSecretArn
58
73
  ? [
59
- 'echo "Retrieving Docker credentials from Secrets Manager..."',
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 provided. Skipping Docker Hub login."'];
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 in to Amazon ECR..."',
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
- 'echo "Build phase: Building the Docker image..."',
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 "Post-build phase: Pushing the Docker image with tag ${imageTag}..."`,
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
- // Permissions
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
- // onEvent handler
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
- // Provider
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 resource
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
- // Grab the SHA from the custom resource's response (set in isComplete handler)
195
- const imageDigest = buildTriggerResource.getAttString('ImageDigest');
196
- // ECS-compatible from ECR by digest
197
- this.containerImage = aws_ecs_1.ContainerImage.fromEcrRepository(this.ecrRepository, imageDigest);
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: imageDigest,
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.0" };
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.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.3.0",
101
+ "version": "1.3.1",
100
102
  "jest": {
101
103
  "coverageProvider": "v8",
102
104
  "testMatch": [