projen-pipelines 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -73,7 +73,7 @@
73
73
  },
74
74
  "name": "projen-pipelines",
75
75
  "readme": {
76
- "markdown": "# replace this"
76
+ "markdown": "# Projen Pipelines\n\n[![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)\n\n\nProjen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.\nIt is specifically designed to work with the projen project configuration engine.\n\nThis library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.\nWith this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.\n\n## Getting Started\n\n### Installation\n\nTo install the package, add teh package `projen-pipelines` to your projects devDeps in your projen configuration file.\n\n\nAfter installing the package, you can import and use the constructs to define your CDK Pipelines.\n\n### Usage\n\nYou can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:\n\n```typescript\nimport { awscdk } from 'projen';\nimport { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';\n\n// Define your AWS CDK TypeScript App\nconst app = new awscdk.AwsCdkTypeScriptApp({\n cdkVersion: '2.80.0',\n name: 'my-awesome-app',\n defaultReleaseBranch: 'main',\n devDeps: [\n 'projen-pipelines',\n ],\n});\n\n// Create the pipeline\nnew CDKPipeline(app, {\n stackPrefix: 'MyApp',\n pkgNamespace: '@company-assemblies',\n environments: {\n dev: { account: '111111111111', region: 'eu-central-1' },\n prod: { account: '222222222222', region: 'eu-central-1' },\n },\n});\n```\n\nAfter running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.\n\nYou can then use this in your `main.ts` to configure your deployment.\n\n```typescript\nimport { PipelineApp } from './app';\nimport { BackendStack } from './stack';\n\nconst app = new PipelineApp({\n provideDevStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api-dev',\n myConfigSetting: 'value-for-dev',\n });\n },\n provideProdStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api',\n myConfigSetting: 'value-for-prod',\n });\n },\n providePersonalStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: `api-${props.stageName}`,\n myConfigSetting: 'value-for-personal-stage',\n });\n },\n});\n\napp.synth();\n```\n\n### Deployment\n\nThe `CDKPipeline` class creates and adds several tasks to the projen project that then can be used in your pipeline to deploy your application to AWS.\n\nHere's a brief description of each one:\n\n1. **deploy:personal** - This task deploys the application's personal stage, which is a distinct, isolated deployment of the application. The personal stage is intended for personal use, such as testing and development.\n\n2. **watch:personal** - This task deploys the personal stage of the application in watch mode. In this mode, the AWS CDK monitors your application source files for changes, automatically re-synthesizing and deploying when it detects any changes.\n\n3. **diff:personal** - This task compares the deployed personal stage with the current state of the application code. It's used to understand what changes would be made if the application were deployed.\n\n4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.\n\n5. **deploy:feature** - This task deploys the application's feature stage. The feature stage is used for new features testing before these are merged into the main branch.\n\n6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.\n\n7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.\n\n8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').\n\n9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.\n\n10. **publish:assets** - This task publishes the CDK assets to all accounts. This is useful when the CDK application uses assets like Docker images or files from the S3 bucket.\n\n11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.\n\n12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.\n\nRemember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.\n\n\n## Contributing\n\nWe welcome all contributions to Projen Pipelines! Here's how you can get started:\n\n1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.\n\n2. **Clone your Fork**: Clone the forked repository to your local machine.\n\n```bash\ngit clone https://github.com/<your_username>/projen-pipelines.git\n```\n\n3. **Create a Branch**: To keep your work organized, create a branch for your contribution.\n\n```bash\ngit checkout -b my-branch\n```\n\n4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.\n\n5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.\n\n6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.\n\n```bash\ngit commit -m \"feat: Your descriptive commit message\"\n```\n\n7. **Push to your Fork**: Push your commits to the branch in your forked repository.\n\n```bash\ngit push origin my-branch\n```\n\n8. **Submit a Pull Request**: Once your changes are ready to be reviewed, create a pull request from your forked repository's branch into the `main` branch of this repository.\n\nYour pull request will be reviewed and hopefully merged quickly. Thanks for contributing!\n"
77
77
  },
78
78
  "repository": {
79
79
  "type": "git",
@@ -88,8 +88,11 @@
88
88
  "types": {
89
89
  "projen-pipelines.CDKPipeline": {
90
90
  "assembly": "projen-pipelines",
91
+ "base": "projen.Component",
91
92
  "docs": {
92
- "stability": "stable"
93
+ "remarks": "It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.",
94
+ "stability": "stable",
95
+ "summary": "The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages."
93
96
  },
94
97
  "fqn": "projen-pipelines.CDKPipeline",
95
98
  "initializer": {
@@ -98,11 +101,11 @@
98
101
  },
99
102
  "locationInModule": {
100
103
  "filename": "src/pipeline.ts",
101
- "line": 24
104
+ "line": 94
102
105
  },
103
106
  "parameters": [
104
107
  {
105
- "name": "project",
108
+ "name": "app",
106
109
  "type": {
107
110
  "fqn": "projen.awscdk.AwsCdkTypeScriptApp"
108
111
  }
@@ -118,7 +121,7 @@
118
121
  "kind": "class",
119
122
  "locationInModule": {
120
123
  "filename": "src/pipeline.ts",
121
- "line": 22
124
+ "line": 92
122
125
  },
123
126
  "name": "CDKPipeline",
124
127
  "symbolId": "src/pipeline:CDKPipeline"
@@ -127,25 +130,29 @@
127
130
  "assembly": "projen-pipelines",
128
131
  "datatype": true,
129
132
  "docs": {
130
- "stability": "stable"
133
+ "remarks": "It allows the definition\nof settings such as the stack prefix and package namespace to be used in the\nAWS stack, along with the environments configuration to be used.",
134
+ "stability": "stable",
135
+ "summary": "The CDKPipelineOptions interface is designed to provide configuration options for a CDK (Cloud Development Kit) pipeline."
131
136
  },
132
137
  "fqn": "projen-pipelines.CDKPipelineOptions",
133
138
  "kind": "interface",
134
139
  "locationInModule": {
135
140
  "filename": "src/pipeline.ts",
136
- "line": 16
141
+ "line": 66
137
142
  },
138
143
  "name": "CDKPipelineOptions",
139
144
  "properties": [
140
145
  {
141
146
  "abstract": true,
142
147
  "docs": {
143
- "stability": "stable"
148
+ "remarks": "It allows the\npipeline to deploy to different environments based on the stage of the\ndeployment process, whether that's a personal, feature, dev, or prod stage.",
149
+ "stability": "stable",
150
+ "summary": "This is a map of environments to be used in the pipeline."
144
151
  },
145
152
  "immutable": true,
146
153
  "locationInModule": {
147
154
  "filename": "src/pipeline.ts",
148
- "line": 19
155
+ "line": 85
149
156
  },
150
157
  "name": "environments",
151
158
  "type": {
@@ -155,12 +162,14 @@
155
162
  {
156
163
  "abstract": true,
157
164
  "docs": {
158
- "stability": "stable"
165
+ "remarks": "A namespace helps group related resources together, providing\nbetter organization and ease of management.",
166
+ "stability": "stable",
167
+ "summary": "This field determines the NPM namespace to be used when packaging CDK cloud assemblies."
159
168
  },
160
169
  "immutable": true,
161
170
  "locationInModule": {
162
171
  "filename": "src/pipeline.ts",
163
- "line": 18
172
+ "line": 78
164
173
  },
165
174
  "name": "pkgNamespace",
166
175
  "type": {
@@ -170,12 +179,13 @@
170
179
  {
171
180
  "abstract": true,
172
181
  "docs": {
173
- "stability": "stable"
182
+ "stability": "stable",
183
+ "summary": "This field is used to define a prefix for the AWS Stack resources created during the pipeline's operation."
174
184
  },
175
185
  "immutable": true,
176
186
  "locationInModule": {
177
187
  "filename": "src/pipeline.ts",
178
- "line": 17
188
+ "line": 71
179
189
  },
180
190
  "name": "stackPrefix",
181
191
  "type": {
@@ -189,25 +199,29 @@
189
199
  "assembly": "projen-pipelines",
190
200
  "datatype": true,
191
201
  "docs": {
192
- "stability": "stable"
202
+ "remarks": "Each environment requires a specific account and region for its resources.",
203
+ "stability": "stable",
204
+ "summary": "The Environment interface is designed to hold AWS related information for a specific deployment environment within your infrastructure."
193
205
  },
194
206
  "fqn": "projen-pipelines.Environment",
195
207
  "kind": "interface",
196
208
  "locationInModule": {
197
209
  "filename": "src/pipeline.ts",
198
- "line": 4
210
+ "line": 9
199
211
  },
200
212
  "name": "Environment",
201
213
  "properties": [
202
214
  {
203
215
  "abstract": true,
204
216
  "docs": {
205
- "stability": "stable"
217
+ "remarks": "It's important because\ndifferent services or features could have distinct permissions and settings\nin different accounts.",
218
+ "stability": "stable",
219
+ "summary": "The AWS Account ID associated with the environment."
206
220
  },
207
221
  "immutable": true,
208
222
  "locationInModule": {
209
223
  "filename": "src/pipeline.ts",
210
- "line": 5
224
+ "line": 15
211
225
  },
212
226
  "name": "account",
213
227
  "type": {
@@ -217,12 +231,14 @@
217
231
  {
218
232
  "abstract": true,
219
233
  "docs": {
220
- "stability": "stable"
234
+ "remarks": "This determines where your resources\nare created and where your application will run. It can affect latency,\navailability, and pricing.",
235
+ "stability": "stable",
236
+ "summary": "The AWS Region for the environment."
221
237
  },
222
238
  "immutable": true,
223
239
  "locationInModule": {
224
240
  "filename": "src/pipeline.ts",
225
- "line": 6
241
+ "line": 22
226
242
  },
227
243
  "name": "region",
228
244
  "type": {
@@ -236,25 +252,29 @@
236
252
  "assembly": "projen-pipelines",
237
253
  "datatype": true,
238
254
  "docs": {
239
- "stability": "stable"
255
+ "remarks": "Each type of environment - personal,\nfeature, dev, and prod, represents a different stage of development or usage.",
256
+ "stability": "stable",
257
+ "summary": "The EnvironmentMap interface is used to maintain a mapping of different types of environments used in the application."
240
258
  },
241
259
  "fqn": "projen-pipelines.EnvironmentMap",
242
260
  "kind": "interface",
243
261
  "locationInModule": {
244
262
  "filename": "src/pipeline.ts",
245
- "line": 9
263
+ "line": 30
246
264
  },
247
265
  "name": "EnvironmentMap",
248
266
  "properties": [
249
267
  {
250
268
  "abstract": true,
251
269
  "docs": {
252
- "stability": "stable"
270
+ "remarks": "It represents the latest version of the application\nbut may not be as stable as the production environment.",
271
+ "stability": "stable",
272
+ "summary": "The dev environment is a shared environment where developers integrate their feature changes."
253
273
  },
254
274
  "immutable": true,
255
275
  "locationInModule": {
256
276
  "filename": "src/pipeline.ts",
257
- "line": 12
277
+ "line": 51
258
278
  },
259
279
  "name": "dev",
260
280
  "type": {
@@ -264,12 +284,14 @@
264
284
  {
265
285
  "abstract": true,
266
286
  "docs": {
267
- "stability": "stable"
287
+ "remarks": "This allows developers to work on\nindividual features without impacting the stability of the dev or prod\nenvironments.",
288
+ "stability": "stable",
289
+ "summary": "The feature environment is typically used for developing specific features in isolation from the main codebase."
268
290
  },
269
291
  "immutable": true,
270
292
  "locationInModule": {
271
293
  "filename": "src/pipeline.ts",
272
- "line": 11
294
+ "line": 44
273
295
  },
274
296
  "name": "feature",
275
297
  "type": {
@@ -279,12 +301,13 @@
279
301
  {
280
302
  "abstract": true,
281
303
  "docs": {
282
- "stability": "stable"
304
+ "stability": "stable",
305
+ "summary": "The personal environment is usually used for individual development and testing, allowing developers to freely test and experiment without affecting the shared development environment."
283
306
  },
284
307
  "immutable": true,
285
308
  "locationInModule": {
286
309
  "filename": "src/pipeline.ts",
287
- "line": 10
310
+ "line": 36
288
311
  },
289
312
  "name": "personal",
290
313
  "type": {
@@ -294,12 +317,14 @@
294
317
  {
295
318
  "abstract": true,
296
319
  "docs": {
297
- "stability": "stable"
320
+ "remarks": "It should be stable and only receive thoroughly tested changes.",
321
+ "stability": "stable",
322
+ "summary": "The prod environment is where the live, user-facing application runs."
298
323
  },
299
324
  "immutable": true,
300
325
  "locationInModule": {
301
326
  "filename": "src/pipeline.ts",
302
- "line": 13
327
+ "line": 57
303
328
  },
304
329
  "name": "prod",
305
330
  "type": {
@@ -310,6 +335,6 @@
310
335
  "symbolId": "src/pipeline:EnvironmentMap"
311
336
  }
312
337
  },
313
- "version": "0.0.0",
314
- "fingerprint": "UFwqHc7GSvbpjDLYBfcslrRRhxbD+/Dsr3FKaS/PfFU="
338
+ "version": "0.0.2",
339
+ "fingerprint": "waYM4hyDn3h3HyWbjkniKI5tGRzEWHiWZjTSiUvbuxI="
315
340
  }
package/API.md CHANGED
@@ -1,4 +1,158 @@
1
- # replace this
1
+ # Projen Pipelines
2
+
3
+ [![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)
4
+
5
+
6
+ Projen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.
7
+ It is specifically designed to work with the projen project configuration engine.
8
+
9
+ This library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.
10
+ With this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.
11
+
12
+ ## Getting Started
13
+
14
+ ### Installation
15
+
16
+ To install the package, add teh package `projen-pipelines` to your projects devDeps in your projen configuration file.
17
+
18
+
19
+ After installing the package, you can import and use the constructs to define your CDK Pipelines.
20
+
21
+ ### Usage
22
+
23
+ You can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:
24
+
25
+ ```typescript
26
+ import { awscdk } from 'projen';
27
+ import { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';
28
+
29
+ // Define your AWS CDK TypeScript App
30
+ const app = new awscdk.AwsCdkTypeScriptApp({
31
+ cdkVersion: '2.80.0',
32
+ name: 'my-awesome-app',
33
+ defaultReleaseBranch: 'main',
34
+ devDeps: [
35
+ 'projen-pipelines',
36
+ ],
37
+ });
38
+
39
+ // Create the pipeline
40
+ new CDKPipeline(app, {
41
+ stackPrefix: 'MyApp',
42
+ pkgNamespace: '@company-assemblies',
43
+ environments: {
44
+ dev: { account: '111111111111', region: 'eu-central-1' },
45
+ prod: { account: '222222222222', region: 'eu-central-1' },
46
+ },
47
+ });
48
+ ```
49
+
50
+ After running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.
51
+
52
+ You can then use this in your `main.ts` to configure your deployment.
53
+
54
+ ```typescript
55
+ import { PipelineApp } from './app';
56
+ import { BackendStack } from './stack';
57
+
58
+ const app = new PipelineApp({
59
+ provideDevStack: (scope, id, props) => {
60
+ return new BackendStack(scope, id, {
61
+ ...props,
62
+ apiHostname: 'api-dev',
63
+ myConfigSetting: 'value-for-dev',
64
+ });
65
+ },
66
+ provideProdStack: (scope, id, props) => {
67
+ return new BackendStack(scope, id, {
68
+ ...props,
69
+ apiHostname: 'api',
70
+ myConfigSetting: 'value-for-prod',
71
+ });
72
+ },
73
+ providePersonalStack: (scope, id, props) => {
74
+ return new BackendStack(scope, id, {
75
+ ...props,
76
+ apiHostname: `api-${props.stageName}`,
77
+ myConfigSetting: 'value-for-personal-stage',
78
+ });
79
+ },
80
+ });
81
+
82
+ app.synth();
83
+ ```
84
+
85
+ ### Deployment
86
+
87
+ The `CDKPipeline` class creates and adds several tasks to the projen project that then can be used in your pipeline to deploy your application to AWS.
88
+
89
+ Here's a brief description of each one:
90
+
91
+ 1. **deploy:personal** - This task deploys the application's personal stage, which is a distinct, isolated deployment of the application. The personal stage is intended for personal use, such as testing and development.
92
+
93
+ 2. **watch:personal** - This task deploys the personal stage of the application in watch mode. In this mode, the AWS CDK monitors your application source files for changes, automatically re-synthesizing and deploying when it detects any changes.
94
+
95
+ 3. **diff:personal** - This task compares the deployed personal stage with the current state of the application code. It's used to understand what changes would be made if the application were deployed.
96
+
97
+ 4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.
98
+
99
+ 5. **deploy:feature** - This task deploys the application's feature stage. The feature stage is used for new features testing before these are merged into the main branch.
100
+
101
+ 6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.
102
+
103
+ 7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.
104
+
105
+ 8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').
106
+
107
+ 9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.
108
+
109
+ 10. **publish:assets** - This task publishes the CDK assets to all accounts. This is useful when the CDK application uses assets like Docker images or files from the S3 bucket.
110
+
111
+ 11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.
112
+
113
+ 12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.
114
+
115
+ Remember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.
116
+
117
+
118
+ ## Contributing
119
+
120
+ We welcome all contributions to Projen Pipelines! Here's how you can get started:
121
+
122
+ 1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.
123
+
124
+ 2. **Clone your Fork**: Clone the forked repository to your local machine.
125
+
126
+ ```bash
127
+ git clone https://github.com/<your_username>/projen-pipelines.git
128
+ ```
129
+
130
+ 3. **Create a Branch**: To keep your work organized, create a branch for your contribution.
131
+
132
+ ```bash
133
+ git checkout -b my-branch
134
+ ```
135
+
136
+ 4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.
137
+
138
+ 5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.
139
+
140
+ 6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.
141
+
142
+ ```bash
143
+ git commit -m "feat: Your descriptive commit message"
144
+ ```
145
+
146
+ 7. **Push to your Fork**: Push your commits to the branch in your forked repository.
147
+
148
+ ```bash
149
+ git push origin my-branch
150
+ ```
151
+
152
+ 8. **Submit a Pull Request**: Once your changes are ready to be reviewed, create a pull request from your forked repository's branch into the `main` branch of this repository.
153
+
154
+ Your pull request will be reviewed and hopefully merged quickly. Thanks for contributing!
155
+
2
156
  # API Reference <a name="API Reference" id="api-reference"></a>
3
157
 
4
158
 
@@ -6,6 +160,12 @@
6
160
 
7
161
  ### CDKPipelineOptions <a name="CDKPipelineOptions" id="projen-pipelines.CDKPipelineOptions"></a>
8
162
 
163
+ The CDKPipelineOptions interface is designed to provide configuration options for a CDK (Cloud Development Kit) pipeline.
164
+
165
+ It allows the definition
166
+ of settings such as the stack prefix and package namespace to be used in the
167
+ AWS stack, along with the environments configuration to be used.
168
+
9
169
  #### Initializer <a name="Initializer" id="projen-pipelines.CDKPipelineOptions.Initializer"></a>
10
170
 
11
171
  ```typescript
@@ -18,9 +178,9 @@ const cDKPipelineOptions: CDKPipelineOptions = { ... }
18
178
 
19
179
  | **Name** | **Type** | **Description** |
20
180
  | --- | --- | --- |
21
- | <code><a href="#projen-pipelines.CDKPipelineOptions.property.environments">environments</a></code> | <code><a href="#projen-pipelines.EnvironmentMap">EnvironmentMap</a></code> | *No description.* |
22
- | <code><a href="#projen-pipelines.CDKPipelineOptions.property.pkgNamespace">pkgNamespace</a></code> | <code>string</code> | *No description.* |
23
- | <code><a href="#projen-pipelines.CDKPipelineOptions.property.stackPrefix">stackPrefix</a></code> | <code>string</code> | *No description.* |
181
+ | <code><a href="#projen-pipelines.CDKPipelineOptions.property.environments">environments</a></code> | <code><a href="#projen-pipelines.EnvironmentMap">EnvironmentMap</a></code> | This is a map of environments to be used in the pipeline. |
182
+ | <code><a href="#projen-pipelines.CDKPipelineOptions.property.pkgNamespace">pkgNamespace</a></code> | <code>string</code> | This field determines the NPM namespace to be used when packaging CDK cloud assemblies. |
183
+ | <code><a href="#projen-pipelines.CDKPipelineOptions.property.stackPrefix">stackPrefix</a></code> | <code>string</code> | This field is used to define a prefix for the AWS Stack resources created during the pipeline's operation. |
24
184
 
25
185
  ---
26
186
 
@@ -32,6 +192,12 @@ public readonly environments: EnvironmentMap;
32
192
 
33
193
  - *Type:* <a href="#projen-pipelines.EnvironmentMap">EnvironmentMap</a>
34
194
 
195
+ This is a map of environments to be used in the pipeline.
196
+
197
+ It allows the
198
+ pipeline to deploy to different environments based on the stage of the
199
+ deployment process, whether that's a personal, feature, dev, or prod stage.
200
+
35
201
  ---
36
202
 
37
203
  ##### `pkgNamespace`<sup>Required</sup> <a name="pkgNamespace" id="projen-pipelines.CDKPipelineOptions.property.pkgNamespace"></a>
@@ -42,6 +208,11 @@ public readonly pkgNamespace: string;
42
208
 
43
209
  - *Type:* string
44
210
 
211
+ This field determines the NPM namespace to be used when packaging CDK cloud assemblies.
212
+
213
+ A namespace helps group related resources together, providing
214
+ better organization and ease of management.
215
+
45
216
  ---
46
217
 
47
218
  ##### `stackPrefix`<sup>Required</sup> <a name="stackPrefix" id="projen-pipelines.CDKPipelineOptions.property.stackPrefix"></a>
@@ -52,10 +223,16 @@ public readonly stackPrefix: string;
52
223
 
53
224
  - *Type:* string
54
225
 
226
+ This field is used to define a prefix for the AWS Stack resources created during the pipeline's operation.
227
+
55
228
  ---
56
229
 
57
230
  ### Environment <a name="Environment" id="projen-pipelines.Environment"></a>
58
231
 
232
+ The Environment interface is designed to hold AWS related information for a specific deployment environment within your infrastructure.
233
+
234
+ Each environment requires a specific account and region for its resources.
235
+
59
236
  #### Initializer <a name="Initializer" id="projen-pipelines.Environment.Initializer"></a>
60
237
 
61
238
  ```typescript
@@ -68,8 +245,8 @@ const environment: Environment = { ... }
68
245
 
69
246
  | **Name** | **Type** | **Description** |
70
247
  | --- | --- | --- |
71
- | <code><a href="#projen-pipelines.Environment.property.account">account</a></code> | <code>string</code> | *No description.* |
72
- | <code><a href="#projen-pipelines.Environment.property.region">region</a></code> | <code>string</code> | *No description.* |
248
+ | <code><a href="#projen-pipelines.Environment.property.account">account</a></code> | <code>string</code> | The AWS Account ID associated with the environment. |
249
+ | <code><a href="#projen-pipelines.Environment.property.region">region</a></code> | <code>string</code> | The AWS Region for the environment. |
73
250
 
74
251
  ---
75
252
 
@@ -81,6 +258,12 @@ public readonly account: string;
81
258
 
82
259
  - *Type:* string
83
260
 
261
+ The AWS Account ID associated with the environment.
262
+
263
+ It's important because
264
+ different services or features could have distinct permissions and settings
265
+ in different accounts.
266
+
84
267
  ---
85
268
 
86
269
  ##### `region`<sup>Required</sup> <a name="region" id="projen-pipelines.Environment.property.region"></a>
@@ -91,10 +274,21 @@ public readonly region: string;
91
274
 
92
275
  - *Type:* string
93
276
 
277
+ The AWS Region for the environment.
278
+
279
+ This determines where your resources
280
+ are created and where your application will run. It can affect latency,
281
+ availability, and pricing.
282
+
94
283
  ---
95
284
 
96
285
  ### EnvironmentMap <a name="EnvironmentMap" id="projen-pipelines.EnvironmentMap"></a>
97
286
 
287
+ The EnvironmentMap interface is used to maintain a mapping of different types of environments used in the application.
288
+
289
+ Each type of environment - personal,
290
+ feature, dev, and prod, represents a different stage of development or usage.
291
+
98
292
  #### Initializer <a name="Initializer" id="projen-pipelines.EnvironmentMap.Initializer"></a>
99
293
 
100
294
  ```typescript
@@ -107,10 +301,10 @@ const environmentMap: EnvironmentMap = { ... }
107
301
 
108
302
  | **Name** | **Type** | **Description** |
109
303
  | --- | --- | --- |
110
- | <code><a href="#projen-pipelines.EnvironmentMap.property.dev">dev</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | *No description.* |
111
- | <code><a href="#projen-pipelines.EnvironmentMap.property.feature">feature</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | *No description.* |
112
- | <code><a href="#projen-pipelines.EnvironmentMap.property.personal">personal</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | *No description.* |
113
- | <code><a href="#projen-pipelines.EnvironmentMap.property.prod">prod</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | *No description.* |
304
+ | <code><a href="#projen-pipelines.EnvironmentMap.property.dev">dev</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | The dev environment is a shared environment where developers integrate their feature changes. |
305
+ | <code><a href="#projen-pipelines.EnvironmentMap.property.feature">feature</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | The feature environment is typically used for developing specific features in isolation from the main codebase. |
306
+ | <code><a href="#projen-pipelines.EnvironmentMap.property.personal">personal</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | The personal environment is usually used for individual development and testing, allowing developers to freely test and experiment without affecting the shared development environment. |
307
+ | <code><a href="#projen-pipelines.EnvironmentMap.property.prod">prod</a></code> | <code><a href="#projen-pipelines.Environment">Environment</a></code> | The prod environment is where the live, user-facing application runs. |
114
308
 
115
309
  ---
116
310
 
@@ -122,6 +316,11 @@ public readonly dev: Environment;
122
316
 
123
317
  - *Type:* <a href="#projen-pipelines.Environment">Environment</a>
124
318
 
319
+ The dev environment is a shared environment where developers integrate their feature changes.
320
+
321
+ It represents the latest version of the application
322
+ but may not be as stable as the production environment.
323
+
125
324
  ---
126
325
 
127
326
  ##### `feature`<sup>Required</sup> <a name="feature" id="projen-pipelines.EnvironmentMap.property.feature"></a>
@@ -132,6 +331,12 @@ public readonly feature: Environment;
132
331
 
133
332
  - *Type:* <a href="#projen-pipelines.Environment">Environment</a>
134
333
 
334
+ The feature environment is typically used for developing specific features in isolation from the main codebase.
335
+
336
+ This allows developers to work on
337
+ individual features without impacting the stability of the dev or prod
338
+ environments.
339
+
135
340
  ---
136
341
 
137
342
  ##### `personal`<sup>Required</sup> <a name="personal" id="projen-pipelines.EnvironmentMap.property.personal"></a>
@@ -142,6 +347,8 @@ public readonly personal: Environment;
142
347
 
143
348
  - *Type:* <a href="#projen-pipelines.Environment">Environment</a>
144
349
 
350
+ The personal environment is usually used for individual development and testing, allowing developers to freely test and experiment without affecting the shared development environment.
351
+
145
352
  ---
146
353
 
147
354
  ##### `prod`<sup>Required</sup> <a name="prod" id="projen-pipelines.EnvironmentMap.property.prod"></a>
@@ -152,28 +359,36 @@ public readonly prod: Environment;
152
359
 
153
360
  - *Type:* <a href="#projen-pipelines.Environment">Environment</a>
154
361
 
362
+ The prod environment is where the live, user-facing application runs.
363
+
364
+ It should be stable and only receive thoroughly tested changes.
365
+
155
366
  ---
156
367
 
157
368
  ## Classes <a name="Classes" id="Classes"></a>
158
369
 
159
370
  ### CDKPipeline <a name="CDKPipeline" id="projen-pipelines.CDKPipeline"></a>
160
371
 
372
+ The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
373
+
374
+ It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
375
+
161
376
  #### Initializers <a name="Initializers" id="projen-pipelines.CDKPipeline.Initializer"></a>
162
377
 
163
378
  ```typescript
164
379
  import { CDKPipeline } from 'projen-pipelines'
165
380
 
166
- new CDKPipeline(project: AwsCdkTypeScriptApp, props: CDKPipelineOptions)
381
+ new CDKPipeline(app: AwsCdkTypeScriptApp, props: CDKPipelineOptions)
167
382
  ```
168
383
 
169
384
  | **Name** | **Type** | **Description** |
170
385
  | --- | --- | --- |
171
- | <code><a href="#projen-pipelines.CDKPipeline.Initializer.parameter.project">project</a></code> | <code>projen.awscdk.AwsCdkTypeScriptApp</code> | *No description.* |
386
+ | <code><a href="#projen-pipelines.CDKPipeline.Initializer.parameter.app">app</a></code> | <code>projen.awscdk.AwsCdkTypeScriptApp</code> | *No description.* |
172
387
  | <code><a href="#projen-pipelines.CDKPipeline.Initializer.parameter.props">props</a></code> | <code><a href="#projen-pipelines.CDKPipelineOptions">CDKPipelineOptions</a></code> | *No description.* |
173
388
 
174
389
  ---
175
390
 
176
- ##### `project`<sup>Required</sup> <a name="project" id="projen-pipelines.CDKPipeline.Initializer.parameter.project"></a>
391
+ ##### `app`<sup>Required</sup> <a name="app" id="projen-pipelines.CDKPipeline.Initializer.parameter.app"></a>
177
392
 
178
393
  - *Type:* projen.awscdk.AwsCdkTypeScriptApp
179
394
 
@@ -185,8 +400,60 @@ new CDKPipeline(project: AwsCdkTypeScriptApp, props: CDKPipelineOptions)
185
400
 
186
401
  ---
187
402
 
403
+ #### Methods <a name="Methods" id="Methods"></a>
404
+
405
+ | **Name** | **Description** |
406
+ | --- | --- |
407
+ | <code><a href="#projen-pipelines.CDKPipeline.postSynthesize">postSynthesize</a></code> | Called after synthesis. |
408
+ | <code><a href="#projen-pipelines.CDKPipeline.preSynthesize">preSynthesize</a></code> | Called before synthesis. |
409
+ | <code><a href="#projen-pipelines.CDKPipeline.synthesize">synthesize</a></code> | Synthesizes files to the project output directory. |
410
+
411
+ ---
412
+
413
+ ##### `postSynthesize` <a name="postSynthesize" id="projen-pipelines.CDKPipeline.postSynthesize"></a>
188
414
 
415
+ ```typescript
416
+ public postSynthesize(): void
417
+ ```
418
+
419
+ Called after synthesis.
420
+
421
+ Order is *not* guaranteed.
422
+
423
+ ##### `preSynthesize` <a name="preSynthesize" id="projen-pipelines.CDKPipeline.preSynthesize"></a>
424
+
425
+ ```typescript
426
+ public preSynthesize(): void
427
+ ```
428
+
429
+ Called before synthesis.
430
+
431
+ ##### `synthesize` <a name="synthesize" id="projen-pipelines.CDKPipeline.synthesize"></a>
432
+
433
+ ```typescript
434
+ public synthesize(): void
435
+ ```
436
+
437
+ Synthesizes files to the project output directory.
189
438
 
190
439
 
440
+ #### Properties <a name="Properties" id="Properties"></a>
441
+
442
+ | **Name** | **Type** | **Description** |
443
+ | --- | --- | --- |
444
+ | <code><a href="#projen-pipelines.CDKPipeline.property.project">project</a></code> | <code>projen.Project</code> | *No description.* |
445
+
446
+ ---
447
+
448
+ ##### `project`<sup>Required</sup> <a name="project" id="projen-pipelines.CDKPipeline.property.project"></a>
449
+
450
+ ```typescript
451
+ public readonly project: Project;
452
+ ```
453
+
454
+ - *Type:* projen.Project
455
+
456
+ ---
457
+
191
458
 
192
459
 
package/README.md CHANGED
@@ -1 +1,154 @@
1
- # replace this
1
+ # Projen Pipelines
2
+
3
+ [![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)
4
+
5
+
6
+ Projen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.
7
+ It is specifically designed to work with the projen project configuration engine.
8
+
9
+ This library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.
10
+ With this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.
11
+
12
+ ## Getting Started
13
+
14
+ ### Installation
15
+
16
+ To install the package, add teh package `projen-pipelines` to your projects devDeps in your projen configuration file.
17
+
18
+
19
+ After installing the package, you can import and use the constructs to define your CDK Pipelines.
20
+
21
+ ### Usage
22
+
23
+ You can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:
24
+
25
+ ```typescript
26
+ import { awscdk } from 'projen';
27
+ import { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';
28
+
29
+ // Define your AWS CDK TypeScript App
30
+ const app = new awscdk.AwsCdkTypeScriptApp({
31
+ cdkVersion: '2.80.0',
32
+ name: 'my-awesome-app',
33
+ defaultReleaseBranch: 'main',
34
+ devDeps: [
35
+ 'projen-pipelines',
36
+ ],
37
+ });
38
+
39
+ // Create the pipeline
40
+ new CDKPipeline(app, {
41
+ stackPrefix: 'MyApp',
42
+ pkgNamespace: '@company-assemblies',
43
+ environments: {
44
+ dev: { account: '111111111111', region: 'eu-central-1' },
45
+ prod: { account: '222222222222', region: 'eu-central-1' },
46
+ },
47
+ });
48
+ ```
49
+
50
+ After running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.
51
+
52
+ You can then use this in your `main.ts` to configure your deployment.
53
+
54
+ ```typescript
55
+ import { PipelineApp } from './app';
56
+ import { BackendStack } from './stack';
57
+
58
+ const app = new PipelineApp({
59
+ provideDevStack: (scope, id, props) => {
60
+ return new BackendStack(scope, id, {
61
+ ...props,
62
+ apiHostname: 'api-dev',
63
+ myConfigSetting: 'value-for-dev',
64
+ });
65
+ },
66
+ provideProdStack: (scope, id, props) => {
67
+ return new BackendStack(scope, id, {
68
+ ...props,
69
+ apiHostname: 'api',
70
+ myConfigSetting: 'value-for-prod',
71
+ });
72
+ },
73
+ providePersonalStack: (scope, id, props) => {
74
+ return new BackendStack(scope, id, {
75
+ ...props,
76
+ apiHostname: `api-${props.stageName}`,
77
+ myConfigSetting: 'value-for-personal-stage',
78
+ });
79
+ },
80
+ });
81
+
82
+ app.synth();
83
+ ```
84
+
85
+ ### Deployment
86
+
87
+ The `CDKPipeline` class creates and adds several tasks to the projen project that then can be used in your pipeline to deploy your application to AWS.
88
+
89
+ Here's a brief description of each one:
90
+
91
+ 1. **deploy:personal** - This task deploys the application's personal stage, which is a distinct, isolated deployment of the application. The personal stage is intended for personal use, such as testing and development.
92
+
93
+ 2. **watch:personal** - This task deploys the personal stage of the application in watch mode. In this mode, the AWS CDK monitors your application source files for changes, automatically re-synthesizing and deploying when it detects any changes.
94
+
95
+ 3. **diff:personal** - This task compares the deployed personal stage with the current state of the application code. It's used to understand what changes would be made if the application were deployed.
96
+
97
+ 4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.
98
+
99
+ 5. **deploy:feature** - This task deploys the application's feature stage. The feature stage is used for new features testing before these are merged into the main branch.
100
+
101
+ 6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.
102
+
103
+ 7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.
104
+
105
+ 8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').
106
+
107
+ 9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.
108
+
109
+ 10. **publish:assets** - This task publishes the CDK assets to all accounts. This is useful when the CDK application uses assets like Docker images or files from the S3 bucket.
110
+
111
+ 11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.
112
+
113
+ 12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.
114
+
115
+ Remember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.
116
+
117
+
118
+ ## Contributing
119
+
120
+ We welcome all contributions to Projen Pipelines! Here's how you can get started:
121
+
122
+ 1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.
123
+
124
+ 2. **Clone your Fork**: Clone the forked repository to your local machine.
125
+
126
+ ```bash
127
+ git clone https://github.com/<your_username>/projen-pipelines.git
128
+ ```
129
+
130
+ 3. **Create a Branch**: To keep your work organized, create a branch for your contribution.
131
+
132
+ ```bash
133
+ git checkout -b my-branch
134
+ ```
135
+
136
+ 4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.
137
+
138
+ 5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.
139
+
140
+ 6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.
141
+
142
+ ```bash
143
+ git commit -m "feat: Your descriptive commit message"
144
+ ```
145
+
146
+ 7. **Push to your Fork**: Push your commits to the branch in your forked repository.
147
+
148
+ ```bash
149
+ git push origin my-branch
150
+ ```
151
+
152
+ 8. **Submit a Pull Request**: Once your changes are ready to be reviewed, create a pull request from your forked repository's branch into the `main` branch of this repository.
153
+
154
+ Your pull request will be reviewed and hopefully merged quickly. Thanks for contributing!
package/lib/pipeline.d.ts CHANGED
@@ -1,26 +1,110 @@
1
- import { awscdk } from 'projen';
1
+ import { Component, awscdk } from 'projen';
2
+ /**
3
+ * The Environment interface is designed to hold AWS related information
4
+ * for a specific deployment environment within your infrastructure.
5
+ * Each environment requires a specific account and region for its resources.
6
+ */
2
7
  export interface Environment {
8
+ /**
9
+ * The AWS Account ID associated with the environment. It's important because
10
+ * different services or features could have distinct permissions and settings
11
+ * in different accounts.
12
+ */
3
13
  readonly account: string;
14
+ /**
15
+ * The AWS Region for the environment. This determines where your resources
16
+ * are created and where your application will run. It can affect latency,
17
+ * availability, and pricing.
18
+ */
4
19
  readonly region: string;
5
20
  }
21
+ /**
22
+ * The EnvironmentMap interface is used to maintain a mapping of different types
23
+ * of environments used in the application. Each type of environment - personal,
24
+ * feature, dev, and prod, represents a different stage of development or usage.
25
+ */
6
26
  export interface EnvironmentMap {
27
+ /**
28
+ * The personal environment is usually used for individual development and
29
+ * testing, allowing developers to freely test and experiment without
30
+ * affecting the shared development environment.
31
+ */
7
32
  readonly personal: Environment;
33
+ /**
34
+ * The feature environment is typically used for developing specific features
35
+ * in isolation from the main codebase. This allows developers to work on
36
+ * individual features without impacting the stability of the dev or prod
37
+ * environments.
38
+ */
8
39
  readonly feature: Environment;
40
+ /**
41
+ * The dev environment is a shared environment where developers integrate
42
+ * their feature changes. It represents the latest version of the application
43
+ * but may not be as stable as the production environment.
44
+ */
9
45
  readonly dev: Environment;
46
+ /**
47
+ * The prod environment is where the live, user-facing application runs.
48
+ * It should be stable and only receive thoroughly tested changes.
49
+ */
10
50
  readonly prod: Environment;
11
51
  }
52
+ /**
53
+ * The CDKPipelineOptions interface is designed to provide configuration
54
+ * options for a CDK (Cloud Development Kit) pipeline. It allows the definition
55
+ * of settings such as the stack prefix and package namespace to be used in the
56
+ * AWS stack, along with the environments configuration to be used.
57
+ */
12
58
  export interface CDKPipelineOptions {
59
+ /**
60
+ * This field is used to define a prefix for the AWS Stack resources created
61
+ * during the pipeline's operation.
62
+ */
13
63
  readonly stackPrefix: string;
64
+ /**
65
+ * This field determines the NPM namespace to be used when packaging CDK cloud
66
+ * assemblies. A namespace helps group related resources together, providing
67
+ * better organization and ease of management.
68
+ */
14
69
  readonly pkgNamespace: string;
70
+ /**
71
+ * This is a map of environments to be used in the pipeline. It allows the
72
+ * pipeline to deploy to different environments based on the stage of the
73
+ * deployment process, whether that's a personal, feature, dev, or prod stage.
74
+ */
15
75
  readonly environments: EnvironmentMap;
16
76
  }
17
- export declare class CDKPipeline {
18
- private project;
77
+ /**
78
+ * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
79
+ * It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
80
+ */
81
+ export declare class CDKPipeline extends Component {
82
+ private app;
19
83
  private props;
20
- constructor(project: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions);
84
+ constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions);
85
+ /**
86
+ * This method generates the entry point for the application, including interfaces and classes
87
+ * necessary to set up the pipeline and define the AWS CDK stacks for different environments.
88
+ */
21
89
  private createApplicationEntrypoint;
90
+ /**
91
+ * This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
92
+ * based on the latest git tag and pushing the CDK assembly to the package repository.
93
+ */
22
94
  private createReleaseTasks;
95
+ /**
96
+ * This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
97
+ * comparing changes (diff), and destroying the stack when no longer needed.
98
+ */
23
99
  private createPersonalStage;
100
+ /**
101
+ * This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
102
+ * and destroying the stack when no longer needed.
103
+ */
24
104
  private createFeatureStage;
105
+ /**
106
+ * This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
107
+ * @param {string} stageName - The name of the stage (e.g., 'dev', 'prod')
108
+ */
25
109
  private createPipelineStage;
26
110
  }
package/lib/pipeline.js CHANGED
@@ -5,30 +5,43 @@ exports.CDKPipeline = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const projen_1 = require("projen");
7
7
  const common_1 = require("projen/lib/common");
8
- class CDKPipeline {
9
- constructor(project, props) {
10
- this.project = project;
8
+ /**
9
+ * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
10
+ * It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
11
+ */
12
+ class CDKPipeline extends projen_1.Component {
13
+ constructor(app, props) {
14
+ super(app);
15
+ this.app = app;
11
16
  this.props = props;
12
- this.project.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
13
- // this.project.addDeps(
17
+ // Add development dependencies
18
+ this.app.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
19
+ // this.app.addDeps(
14
20
  // );
15
- // Remove assembly before synth
16
- this.project.tasks.tryFind('synth')?.prependExec(`rm -rf ${this.project.cdkConfig.cdkout}`);
17
- this.project.tasks.tryFind('synth:silent')?.prependExec(`rm -rf ${this.project.cdkConfig.cdkout}`);
18
- // Remove conflicting tasks
21
+ // Removes the compiled cloud assembly before each synth
22
+ this.project.tasks.tryFind('synth')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
23
+ this.project.tasks.tryFind('synth:silent')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
24
+ // Remove tasks that might conflict with the pipeline process
19
25
  this.project.removeTask('deploy');
20
26
  this.project.removeTask('diff');
21
27
  this.project.removeTask('destroy');
22
28
  this.project.removeTask('watch');
29
+ // Creates different deployment stages
23
30
  this.createPersonalStage();
24
31
  this.createFeatureStage();
25
32
  this.createPipelineStage('dev');
26
33
  this.createPipelineStage('prod');
34
+ // Creates tasks to handle the release process
27
35
  this.createReleaseTasks();
36
+ // Creates a specialized CDK App class
28
37
  this.createApplicationEntrypoint();
29
38
  }
39
+ /**
40
+ * This method generates the entry point for the application, including interfaces and classes
41
+ * necessary to set up the pipeline and define the AWS CDK stacks for different environments.
42
+ */
30
43
  createApplicationEntrypoint() {
31
- const appFile = new projen_1.TextFile(this.project, `${this.project.srcdir}/app.ts`);
44
+ const appFile = new projen_1.TextFile(this.project, `${this.app.srcdir}/app.ts`);
32
45
  appFile.addLine(`// ${common_1.PROJEN_MARKER}
33
46
  /* eslint-disable object-curly-spacing */
34
47
  /* eslint-disable comma-spacing */
@@ -37,31 +50,61 @@ class CDKPipeline {
37
50
  /* eslint-disable quote-props */
38
51
  import { App, AppProps, Stack, StackProps } from 'aws-cdk-lib';
39
52
 
53
+ /**
54
+ * PipelineAppProps is an extension of AppProps, which is part of the AWS CDK core.
55
+ * It includes optional functions to provide AWS Stacks for different stages.
56
+ *
57
+ * Use these functions to instantiate your application stacks with the parameters for
58
+ * each stage
59
+ */
40
60
  export interface PipelineAppProps extends AppProps {
61
+ /** This optional function, if provided, will be used to generate a development stack. */
41
62
  provideDevStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
63
+
64
+ /** This optional function, if provided, will be used to generate a production stack. */
42
65
  provideProdStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
66
+
67
+ /** This optional function, if provided, will be used to generate a personal stack. */
43
68
  providePersonalStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
69
+
70
+ /** This optional function, if provided, will be used to generate a feature stack. */
44
71
  provideFeatureStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
45
72
  }
46
73
 
74
+ /**
75
+ * PipelineAppStackProps is an extension of StackProps, which is part of the AWS CDK core.
76
+ * It includes an additional property to specify the stage name.
77
+ */
47
78
  export interface PipelineAppStackProps extends StackProps {
48
79
  stageName: string;
49
80
  }
50
81
 
82
+ /**
83
+ * The PipelineApp class extends the App class from AWS CDK and overrides the constructor to support
84
+ * different stages of the application (development, production, personal, feature) by invoking the provided
85
+ * stack-providing functions from the props.
86
+ */
51
87
  export class PipelineApp extends App {
52
88
  constructor(props: PipelineAppProps) {
53
89
  super(props);
54
90
 
91
+ // If a function is provided for creating a development stack, it is called with necessary arguments.
55
92
  if (props.provideDevStack) {
56
93
  props.provideDevStack(this, '${this.props.stackPrefix}-dev', { env: ${JSON.stringify(this.props.environments.dev)}, stackName: '${this.props.stackPrefix}-dev', stageName: 'dev' });
57
94
  }
95
+
96
+ // If a function is provided for creating a production stack, it is called with necessary arguments.
58
97
  if (props.provideProdStack) {
59
98
  props.provideProdStack(this, '${this.props.stackPrefix}-prod', { env: ${JSON.stringify(this.props.environments.prod)}, stackName: '${this.props.stackPrefix}-prod', stageName: 'prod' });
60
99
  }
100
+
101
+ // If the environment variable USER is set and a function is provided for creating a personal stack, it is called with necessary arguments.
61
102
  if (props.providePersonalStack && process.env.USER) {
62
103
  const stageName = 'personal-' + process.env.USER.toLowerCase().replace(/\\\//g, '-');
63
104
  props.providePersonalStack(this, '${this.props.stackPrefix}-personal', { env: ${JSON.stringify(this.props.environments.personal)}, stackName: \`${this.props.stackPrefix}-\${stageName}\`, stageName });
64
105
  }
106
+
107
+ // If the environment variable BRANCH is set and a function is provided for creating a feature stack, it is called with necessary arguments.
65
108
  if (props.provideFeatureStack && process.env.BRANCH) {
66
109
  const stageName = 'feature-' + process.env.BRANCH.toLowerCase().replace(/\\\//g, '-');
67
110
  props.provideFeatureStack(this, '${this.props.stackPrefix}-feature', { env: ${JSON.stringify(this.props.environments.feature)}, stackName: \`${this.props.stackPrefix}-\${stageName}\`, stageName });
@@ -70,15 +113,19 @@ export class PipelineApp extends App {
70
113
  }
71
114
  `);
72
115
  }
116
+ /**
117
+ * This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
118
+ * based on the latest git tag and pushing the CDK assembly to the package repository.
119
+ */
73
120
  createReleaseTasks() {
74
121
  // Task to publish the CDK assets to all accounts
75
122
  this.project.addTask('publish:assets', {
76
123
  steps: [
77
124
  {
78
- exec: `npx cdk-assets -p ${this.project.cdkConfig.cdkout}/${this.props.stackPrefix}-dev.assets.json publish`,
125
+ exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.props.stackPrefix}-dev.assets.json publish`,
79
126
  },
80
127
  {
81
- exec: `npx cdk-assets -p ${this.project.cdkConfig.cdkout}/${this.props.stackPrefix}-prod.assets.json publish`,
128
+ exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.props.stackPrefix}-prod.assets.json publish`,
82
129
  },
83
130
  ],
84
131
  });
@@ -96,19 +143,23 @@ export class PipelineApp extends App {
96
143
  this.project.addTask('release:push-assembly', {
97
144
  steps: [
98
145
  {
99
- exec: `pipelines-release create-manifest "${this.project.cdkConfig.cdkout}" "${this.props.pkgNamespace}"`,
146
+ exec: `pipelines-release create-manifest "${this.app.cdkConfig.cdkout}" "${this.props.pkgNamespace}"`,
100
147
  },
101
148
  {
102
- cwd: this.project.cdkConfig.cdkout,
149
+ cwd: this.app.cdkConfig.cdkout,
103
150
  exec: 'npm version --no-git-tag-version from-git',
104
151
  },
105
152
  {
106
- cwd: this.project.cdkConfig.cdkout,
153
+ cwd: this.app.cdkConfig.cdkout,
107
154
  exec: 'npm publish',
108
155
  },
109
156
  ],
110
157
  });
111
158
  }
159
+ /**
160
+ * This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
161
+ * comparing changes (diff), and destroying the stack when no longer needed.
162
+ */
112
163
  createPersonalStage() {
113
164
  this.project.addTask('deploy:personal', {
114
165
  exec: `cdk deploy ${this.props.stackPrefix}-personal`,
@@ -123,6 +174,10 @@ export class PipelineApp extends App {
123
174
  exec: `cdk destroy ${this.props.stackPrefix}-personal`,
124
175
  });
125
176
  }
177
+ /**
178
+ * This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
179
+ * and destroying the stack when no longer needed.
180
+ */
126
181
  createFeatureStage() {
127
182
  this.project.addTask('deploy:feature', {
128
183
  exec: `cdk --progress events --require-approval never deploy ${this.props.stackPrefix}-feature`,
@@ -134,16 +189,20 @@ export class PipelineApp extends App {
134
189
  exec: `cdk destroy ${this.props.stackPrefix}-feature`,
135
190
  });
136
191
  }
192
+ /**
193
+ * This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
194
+ * @param {string} stageName - The name of the stage (e.g., 'dev', 'prod')
195
+ */
137
196
  createPipelineStage(stageName) {
138
197
  this.project.addTask(`deploy:${stageName}`, {
139
- exec: `cdk --app ${this.project.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.props.stackPrefix}-${stageName}`,
198
+ exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.props.stackPrefix}-${stageName}`,
140
199
  });
141
200
  this.project.addTask(`diff:${stageName}`, {
142
- exec: `cdk --app ${this.project.cdkConfig.cdkout} diff ${this.props.stackPrefix}-${stageName}`,
201
+ exec: `cdk --app ${this.app.cdkConfig.cdkout} diff ${this.props.stackPrefix}-${stageName}`,
143
202
  });
144
203
  }
145
204
  }
146
205
  _a = JSII_RTTI_SYMBOL_1;
147
- CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.0" };
206
+ CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.2" };
148
207
  exports.CDKPipeline = CDKPipeline;
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBMEM7QUFDMUMsOENBQWtEO0FBb0JsRCxNQUFhLFdBQVc7SUFFdEIsWUFBb0IsT0FBbUMsRUFBVSxLQUF5QjtRQUF0RSxZQUFPLEdBQVAsT0FBTyxDQUE0QjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBRXhGLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUNyQix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLFlBQVksQ0FDYixDQUFDO1FBQ0Ysd0JBQXdCO1FBQ3hCLEtBQUs7UUFFTCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFbkcsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQyxt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QUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLHNEQUFzRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUU7U0FDNUksQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxTQUFTLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEVBQUUsYUFBYSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO1NBQy9GLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7QUF6SlUsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZXh0RmlsZSwgYXdzY2RrIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IFBST0pFTl9NQVJLRVIgfSBmcm9tICdwcm9qZW4vbGliL2NvbW1vbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnQge1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50TWFwIHtcbiAgcmVhZG9ubHkgcGVyc29uYWw6IEVudmlyb25tZW50O1xuICByZWFkb25seSBmZWF0dXJlOiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgZGV2OiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgcHJvZDogRW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcbiAgcmVhZG9ubHkgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGtnTmFtZXNwYWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50czogRW52aXJvbm1lbnRNYXA7XG59XG5cbmV4cG9ydCBjbGFzcyBDREtQaXBlbGluZSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwcm9qZWN0OiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCwgcHJpdmF0ZSBwcm9wczogQ0RLUGlwZWxpbmVPcHRpb25zKSB7XG5cbiAgICB0aGlzLnByb2plY3QuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLnByb2plY3QuYWRkRGVwcyhcbiAgICAvLyApO1xuXG4gICAgLy8gUmVtb3ZlIGFzc2VtYmx5IGJlZm9yZSBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5wcm9qZWN0LmNka0NvbmZpZy5jZGtvdXR9YCk7XG4gICAgdGhpcy5wcm9qZWN0LnRhc2tzLnRyeUZpbmQoJ3N5bnRoOnNpbGVudCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5wcm9qZWN0LmNka0NvbmZpZy5jZGtvdXR9YCk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmxpY3RpbmcgdGFza3NcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGVwbG95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2RpZmYnKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGVzdHJveScpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCd3YXRjaCcpO1xuXG4gICAgdGhpcy5jcmVhdGVQZXJzb25hbFN0YWdlKCk7XG5cbiAgICB0aGlzLmNyZWF0ZUZlYXR1cmVTdGFnZSgpO1xuXG4gICAgdGhpcy5jcmVhdGVQaXBlbGluZVN0YWdlKCdkZXYnKTtcbiAgICB0aGlzLmNyZWF0ZVBpcGVsaW5lU3RhZ2UoJ3Byb2QnKTtcblxuICAgIHRoaXMuY3JlYXRlUmVsZWFzZVRhc2tzKCk7XG5cbiAgICB0aGlzLmNyZWF0ZUFwcGxpY2F0aW9uRW50cnlwb2ludCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKSB7XG4gICAgY29uc3QgYXBwRmlsZSA9IG5ldyBUZXh0RmlsZSh0aGlzLnByb2plY3QsIGAke3RoaXMucHJvamVjdC5zcmNkaXJ9L2FwcC50c2ApO1xuICAgIGFwcEZpbGUuYWRkTGluZShgLy8gJHtQUk9KRU5fTUFSS0VSfVxuLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LWN1cmx5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xuLyogZXNsaW50LWRpc2FibGUga2V5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFByb3BzIGV4dGVuZHMgQXBwUHJvcHMge1xuICBwcm92aWRlRGV2U3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQcm9kU3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuICBwcm92aWRlRmVhdHVyZVN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMucHJvdmlkZURldlN0YWNrKSB7XG4gICAgICBwcm9wcy5wcm92aWRlRGV2U3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2JywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMuZGV2KX0sIHN0YWNrTmFtZTogJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2Jywgc3RhZ2VOYW1lOiAnZGV2JyB9KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnByb3ZpZGVQcm9kU3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGVQcm9kU3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcHJvZCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnByb2QpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kJywgc3RhZ2VOYW1lOiAncHJvZCcgfSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayAmJiBwcm9jZXNzLmVudi5VU0VSKSB7XG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSAncGVyc29uYWwtJyArIHByb2Nlc3MuZW52LlVTRVIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayh0aGlzLCAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnBlcnNvbmFsKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5mZWF0dXJlKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuYCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlbGVhc2VUYXNrcygpIHtcbiAgICAvLyBUYXNrIHRvIHB1Ymxpc2ggdGhlIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3B1Ymxpc2g6YXNzZXRzJywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMucHJvamVjdC5jZGtDb25maWcuY2Rrb3V0fS8ke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWRldi5hc3NldHMuanNvbiBwdWJsaXNoYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMucHJvamVjdC5jZGtDb25maWcuY2Rrb3V0fS8ke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LXByb2QuYXNzZXRzLmpzb24gcHVibGlzaGAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2J1bXAnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0J1bXBzIHZlcnNpb24gYmFzZWQgb24gbGF0ZXN0IGdpdCB0YWcnLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdwaXBlbGluZXMtcmVsZWFzZSBidW1wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdnaXQgcHVzaCAtLXRhZ3MnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncmVsZWFzZTpwdXNoLWFzc2VtYmx5Jywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBwaXBlbGluZXMtcmVsZWFzZSBjcmVhdGUtbWFuaWZlc3QgXCIke3RoaXMucHJvamVjdC5jZGtDb25maWcuY2Rrb3V0fVwiICBcIiR7dGhpcy5wcm9wcy5wa2dOYW1lc3BhY2V9XCJgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLnByb2plY3QuY2RrQ29uZmlnLmNka291dCxcbiAgICAgICAgICBleGVjOiAnbnBtIHZlcnNpb24gLS1uby1naXQtdGFnLXZlcnNpb24gZnJvbS1naXQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLnByb2plY3QuY2RrQ29uZmlnLmNka291dCxcbiAgICAgICAgICBleGVjOiAnbnBtIHB1Ymxpc2gnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGVyc29uYWxTdGFnZSgpIHtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVwbG95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbGAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3dhdGNoOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXBsb3kgLS13YXRjaCAtLWhvdHN3YXAgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbGAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRpZmYgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbGAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Rlc3Ryb3k6cGVyc29uYWwnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbGAsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZlYXR1cmVTdGFnZSgpIHtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVwbG95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Rlc3Ryb3k6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVzdHJveSAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQaXBlbGluZVN0YWdlKHN0YWdlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soYGRlcGxveToke3N0YWdlTmFtZX1gLCB7XG4gICAgICBleGVjOiBgY2RrIC0tYXBwICR7dGhpcy5wcm9qZWN0LmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS0ke3N0YWdlTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2VOYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLnByb2plY3QuY2RrQ29uZmlnLmNka291dH0gZGlmZiAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LSR7c3RhZ2VOYW1lfWAsXG4gICAgfSk7XG4gIH1cbn0iXX0=
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBcUQ7QUFDckQsOENBQWtEO0FBc0ZsRDs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSxrQkFBUztJQUV4QyxZQUFvQixHQUErQixFQUFVLEtBQXlCO1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFHcEYsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNqQix5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLFlBQVksQ0FDYixDQUFDO1FBQ0Ysb0JBQW9CO1FBQ3BCLEtBQUs7UUFFTCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFL0YsNkRBQTZEO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpDLHNDQUFzQztRQUN0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RUFBRTtZQUN0QyxJQUFJLEVBQUUsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsVUFBVTtTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssbUJBQW1CLENBQUMsU0FBaUI7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxTQUFTLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLHNEQUFzRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUU7U0FDeEksQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxTQUFTLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO1NBQzNGLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7QUE5TVUsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFRleHRGaWxlLCBhd3NjZGsgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgUFJPSkVOX01BUktFUiB9IGZyb20gJ3Byb2plbi9saWIvY29tbW9uJztcblxuLyoqXG4gKiBUaGUgRW52aXJvbm1lbnQgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIGhvbGQgQVdTIHJlbGF0ZWQgaW5mb3JtYXRpb25cbiAqIGZvciBhIHNwZWNpZmljIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgd2l0aGluIHlvdXIgaW5mcmFzdHJ1Y3R1cmUuXG4gKiBFYWNoIGVudmlyb25tZW50IHJlcXVpcmVzIGEgc3BlY2lmaWMgYWNjb3VudCBhbmQgcmVnaW9uIGZvciBpdHMgcmVzb3VyY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgQWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGVudmlyb25tZW50LiBJdCdzIGltcG9ydGFudCBiZWNhdXNlXG4gICAqIGRpZmZlcmVudCBzZXJ2aWNlcyBvciBmZWF0dXJlcyBjb3VsZCBoYXZlIGRpc3RpbmN0IHBlcm1pc3Npb25zIGFuZCBzZXR0aW5nc1xuICAgKiBpbiBkaWZmZXJlbnQgYWNjb3VudHMuXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgUmVnaW9uIGZvciB0aGUgZW52aXJvbm1lbnQuIFRoaXMgZGV0ZXJtaW5lcyB3aGVyZSB5b3VyIHJlc291cmNlc1xuICAgKiBhcmUgY3JlYXRlZCBhbmQgd2hlcmUgeW91ciBhcHBsaWNhdGlvbiB3aWxsIHJ1bi4gSXQgY2FuIGFmZmVjdCBsYXRlbmN5LFxuICAgKiBhdmFpbGFiaWxpdHksIGFuZCBwcmljaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIEVudmlyb25tZW50TWFwIGludGVyZmFjZSBpcyB1c2VkIHRvIG1haW50YWluIGEgbWFwcGluZyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAqIG9mIGVudmlyb25tZW50cyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi4gRWFjaCB0eXBlIG9mIGVudmlyb25tZW50IC0gcGVyc29uYWwsXG4gKiBmZWF0dXJlLCBkZXYsIGFuZCBwcm9kLCByZXByZXNlbnRzIGEgZGlmZmVyZW50IHN0YWdlIG9mIGRldmVsb3BtZW50IG9yIHVzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50TWFwIHtcbiAgLyoqXG4gICAqIFRoZSBwZXJzb25hbCBlbnZpcm9ubWVudCBpcyB1c3VhbGx5IHVzZWQgZm9yIGluZGl2aWR1YWwgZGV2ZWxvcG1lbnQgYW5kXG4gICAqIHRlc3RpbmcsIGFsbG93aW5nIGRldmVsb3BlcnMgdG8gZnJlZWx5IHRlc3QgYW5kIGV4cGVyaW1lbnQgd2l0aG91dFxuICAgKiBhZmZlY3RpbmcgdGhlIHNoYXJlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBlcnNvbmFsOiBFbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIGZlYXR1cmUgZW52aXJvbm1lbnQgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRldmVsb3Bpbmcgc3BlY2lmaWMgZmVhdHVyZXNcbiAgICogaW4gaXNvbGF0aW9uIGZyb20gdGhlIG1haW4gY29kZWJhc2UuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMgdG8gd29yayBvblxuICAgKiBpbmRpdmlkdWFsIGZlYXR1cmVzIHdpdGhvdXQgaW1wYWN0aW5nIHRoZSBzdGFiaWxpdHkgb2YgdGhlIGRldiBvciBwcm9kXG4gICAqIGVudmlyb25tZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmU6IEVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZGV2IGVudmlyb25tZW50IGlzIGEgc2hhcmVkIGVudmlyb25tZW50IHdoZXJlIGRldmVsb3BlcnMgaW50ZWdyYXRlXG4gICAqIHRoZWlyIGZlYXR1cmUgY2hhbmdlcy4gSXQgcmVwcmVzZW50cyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAqIGJ1dCBtYXkgbm90IGJlIGFzIHN0YWJsZSBhcyB0aGUgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGRldjogRW52aXJvbm1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9kIGVudmlyb25tZW50IGlzIHdoZXJlIHRoZSBsaXZlLCB1c2VyLWZhY2luZyBhcHBsaWNhdGlvbiBydW5zLlxuICAgKiBJdCBzaG91bGQgYmUgc3RhYmxlIGFuZCBvbmx5IHJlY2VpdmUgdGhvcm91Z2hseSB0ZXN0ZWQgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IHByb2Q6IEVudmlyb25tZW50O1xufVxuXG4vKipcbiAqIFRoZSBDREtQaXBlbGluZU9wdGlvbnMgaW50ZXJmYWNlIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgY29uZmlndXJhdGlvblxuICogb3B0aW9ucyBmb3IgYSBDREsgKENsb3VkIERldmVsb3BtZW50IEtpdCkgcGlwZWxpbmUuIEl0IGFsbG93cyB0aGUgZGVmaW5pdGlvblxuICogb2Ygc2V0dGluZ3Mgc3VjaCBhcyB0aGUgc3RhY2sgcHJlZml4IGFuZCBwYWNrYWdlIG5hbWVzcGFjZSB0byBiZSB1c2VkIGluIHRoZVxuICogQVdTIHN0YWNrLCBhbG9uZyB3aXRoIHRoZSBlbnZpcm9ubWVudHMgY29uZmlndXJhdGlvbiB0byBiZSB1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENES1BpcGVsaW5lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVmaW5lIGEgcHJlZml4IGZvciB0aGUgQVdTIFN0YWNrIHJlc291cmNlcyBjcmVhdGVkXG4gICAqIGR1cmluZyB0aGUgcGlwZWxpbmUncyBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1ByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGRldGVybWluZXMgdGhlIE5QTSBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHBhY2thZ2luZyBDREsgY2xvdWRcbiAgICogYXNzZW1ibGllcy4gQSBuYW1lc3BhY2UgaGVscHMgZ3JvdXAgcmVsYXRlZCByZXNvdXJjZXMgdG9nZXRoZXIsIHByb3ZpZGluZ1xuICAgKiBiZXR0ZXIgb3JnYW5pemF0aW9uIGFuZCBlYXNlIG9mIG1hbmFnZW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwa2dOYW1lc3BhY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhpcyBpcyBhIG1hcCBvZiBlbnZpcm9ubWVudHMgdG8gYmUgdXNlZCBpbiB0aGUgcGlwZWxpbmUuIEl0IGFsbG93cyB0aGVcbiAgICogcGlwZWxpbmUgdG8gZGVwbG95IHRvIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYmFzZWQgb24gdGhlIHN0YWdlIG9mIHRoZVxuICAgKiBkZXBsb3ltZW50IHByb2Nlc3MsIHdoZXRoZXIgdGhhdCdzIGEgcGVyc29uYWwsIGZlYXR1cmUsIGRldiwgb3IgcHJvZCBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50czogRW52aXJvbm1lbnRNYXA7XG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lIGNsYXNzIGV4dGVuZHMgdGhlIENvbXBvbmVudCBjbGFzcyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZm9yIGRlcGxveWluZyBBV1MgQ0RLIChDbG91ZCBEZXZlbG9wbWVudCBLaXQpIGFwcGxpY2F0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgc3RhZ2VzLlxuICogSXQgYWxzbyBtYW5hZ2VzIHRhc2tzIHN1Y2ggYXMgcHVibGlzaGluZyBDREsgYXNzZXRzLCBidW1waW5nIHZlcnNpb24gYmFzZWQgb24gZ2l0IHRhZ3MsIGFuZCBjbGVhbmluZyB1cCBjb25mbGljdGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENES1BpcGVsaW5lIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByaXZhdGUgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucykge1xuICAgIHN1cGVyKGFwcCk7XG5cbiAgICAvLyBBZGQgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzXG4gICAgdGhpcy5hcHAuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLmFwcC5hZGREZXBzKFxuICAgIC8vICk7XG5cbiAgICAvLyBSZW1vdmVzIHRoZSBjb21waWxlZCBjbG91ZCBhc3NlbWJseSBiZWZvcmUgZWFjaCBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIHRhc2tzIHRoYXQgbWlnaHQgY29uZmxpY3Qgd2l0aCB0aGUgcGlwZWxpbmUgcHJvY2Vzc1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXBsb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGlmZicpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXN0cm95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ3dhdGNoJyk7XG5cbiAgICAvLyBDcmVhdGVzIGRpZmZlcmVudCBkZXBsb3ltZW50IHN0YWdlc1xuICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuICAgIHRoaXMuY3JlYXRlRmVhdHVyZVN0YWdlKCk7XG4gICAgdGhpcy5jcmVhdGVQaXBlbGluZVN0YWdlKCdkZXYnKTtcbiAgICB0aGlzLmNyZWF0ZVBpcGVsaW5lU3RhZ2UoJ3Byb2QnKTtcblxuICAgIC8vIENyZWF0ZXMgdGFza3MgdG8gaGFuZGxlIHRoZSByZWxlYXNlIHByb2Nlc3NcbiAgICB0aGlzLmNyZWF0ZVJlbGVhc2VUYXNrcygpO1xuXG4gICAgLy8gQ3JlYXRlcyBhIHNwZWNpYWxpemVkIENESyBBcHAgY2xhc3NcbiAgICB0aGlzLmNyZWF0ZUFwcGxpY2F0aW9uRW50cnlwb2ludCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGludGVyZmFjZXMgYW5kIGNsYXNzZXNcbiAgICogbmVjZXNzYXJ5IHRvIHNldCB1cCB0aGUgcGlwZWxpbmUgYW5kIGRlZmluZSB0aGUgQVdTIENESyBzdGFja3MgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFwcGxpY2F0aW9uRW50cnlwb2ludCgpIHtcbiAgICBjb25zdCBhcHBGaWxlID0gbmV3IFRleHRGaWxlKHRoaXMucHJvamVjdCwgYCR7dGhpcy5hcHAuc3JjZGlyfS9hcHAudHNgKTtcbiAgICBhcHBGaWxlLmFkZExpbmUoYC8vICR7UFJPSkVOX01BUktFUn1cbi8qIGVzbGludC1kaXNhYmxlIG9iamVjdC1jdXJseS1zcGFjaW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGtleS1zcGFjaW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuaW1wb3J0IHsgQXBwLCBBcHBQcm9wcywgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbi8qKlxuICogUGlwZWxpbmVBcHBQcm9wcyBpcyBhbiBleHRlbnNpb24gb2YgQXBwUHJvcHMsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFXUyBDREsgY29yZS5cbiAqIEl0IGluY2x1ZGVzIG9wdGlvbmFsIGZ1bmN0aW9ucyB0byBwcm92aWRlIEFXUyBTdGFja3MgZm9yIGRpZmZlcmVudCBzdGFnZXMuXG4gKiBcbiAqIFVzZSB0aGVzZSBmdW5jdGlvbnMgdG8gaW5zdGFudGlhdGUgeW91ciBhcHBsaWNhdGlvbiBzdGFja3Mgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3JcbiAqIGVhY2ggc3RhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFByb3BzIGV4dGVuZHMgQXBwUHJvcHMge1xuICAvKiogVGhpcyBvcHRpb25hbCBmdW5jdGlvbiwgaWYgcHJvdmlkZWQsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGRldmVsb3BtZW50IHN0YWNrLiAqL1xuICBwcm92aWRlRGV2U3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG5cbiAgLyoqIFRoaXMgb3B0aW9uYWwgZnVuY3Rpb24sIGlmIHByb3ZpZGVkLCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBwcm9kdWN0aW9uIHN0YWNrLiAqL1xuICBwcm92aWRlUHJvZFN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuXG4gIC8qKiBUaGlzIG9wdGlvbmFsIGZ1bmN0aW9uLCBpZiBwcm92aWRlZCwgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcGVyc29uYWwgc3RhY2suICovXG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuXG4gIC8qKiBUaGlzIG9wdGlvbmFsIGZ1bmN0aW9uLCBpZiBwcm92aWRlZCwgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgZmVhdHVyZSBzdGFjay4gKi9cbiAgcHJvdmlkZUZlYXR1cmVTdGFjaz86IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcbn1cblxuLyoqXG4gKiBQaXBlbGluZUFwcFN0YWNrUHJvcHMgaXMgYW4gZXh0ZW5zaW9uIG9mIFN0YWNrUHJvcHMsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEFXUyBDREsgY29yZS5cbiAqIEl0IGluY2x1ZGVzIGFuIGFkZGl0aW9uYWwgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgc3RhZ2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIFBpcGVsaW5lQXBwIGNsYXNzIGV4dGVuZHMgdGhlIEFwcCBjbGFzcyBmcm9tIEFXUyBDREsgYW5kIG92ZXJyaWRlcyB0aGUgY29uc3RydWN0b3IgdG8gc3VwcG9ydFxuICogZGlmZmVyZW50IHN0YWdlcyBvZiB0aGUgYXBwbGljYXRpb24gKGRldmVsb3BtZW50LCBwcm9kdWN0aW9uLCBwZXJzb25hbCwgZmVhdHVyZSkgYnkgaW52b2tpbmcgdGhlIHByb3ZpZGVkIFxuICogc3RhY2stcHJvdmlkaW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBwcm9wcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAvLyBJZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhIGRldmVsb3BtZW50IHN0YWNrLCBpdCBpcyBjYWxsZWQgd2l0aCBuZWNlc3NhcnkgYXJndW1lbnRzLlxuICAgIGlmIChwcm9wcy5wcm92aWRlRGV2U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGVEZXZTdGFjayh0aGlzLCAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1kZXYnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5kZXYpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1kZXYnLCBzdGFnZU5hbWU6ICdkZXYnIH0pO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgcHJvZHVjdGlvbiBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZVByb2RTdGFjaykge1xuICAgICAgcHJvcHMucHJvdmlkZVByb2RTdGFjayh0aGlzLCAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kJywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMucHJvZCl9LCBzdGFja05hbWU6ICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LXByb2QnLCBzdGFnZU5hbWU6ICdwcm9kJyB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVVNFUiBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgcGVyc29uYWwgc3RhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIG5lY2Vzc2FyeSBhcmd1bWVudHMuXG4gICAgaWYgKHByb3BzLnByb3ZpZGVQZXJzb25hbFN0YWNrICYmIHByb2Nlc3MuZW52LlVTRVIpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdwZXJzb25hbC0nICsgcHJvY2Vzcy5lbnYuVVNFUi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xcXFxcXC8vZywgJy0nKTtcbiAgICAgIHByb3BzLnByb3ZpZGVQZXJzb25hbFN0YWNrKHRoaXMsICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsJywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMucGVyc29uYWwpfSwgc3RhY2tOYW1lOiBcXGAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LVxcJHtzdGFnZU5hbWV9XFxgLCBzdGFnZU5hbWUgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJSQU5DSCBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgZmVhdHVyZSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5mZWF0dXJlKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyB0byBwdWJsaXNoIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzIGFuZCBoYW5kbGUgdmVyc2lvbmluZywgaW5jbHVkaW5nIGJ1bXBpbmcgdGhlIHZlcnNpb25cbiAgICogYmFzZWQgb24gdGhlIGxhdGVzdCBnaXQgdGFnIGFuZCBwdXNoaW5nIHRoZSBDREsgYXNzZW1ibHkgdG8gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmVsZWFzZVRhc2tzKCkge1xuICAgIC8vIFRhc2sgdG8gcHVibGlzaCB0aGUgQ0RLIGFzc2V0cyB0byBhbGwgYWNjb3VudHNcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncHVibGlzaDphc3NldHMnLCB7XG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogYG5weCBjZGstYXNzZXRzIC1wICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0vJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1kZXYuYXNzZXRzLmpzb24gcHVibGlzaGAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgbnB4IGNkay1hc3NldHMgLXAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fS8ke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LXByb2QuYXNzZXRzLmpzb24gcHVibGlzaGAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2J1bXAnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0J1bXBzIHZlcnNpb24gYmFzZWQgb24gbGF0ZXN0IGdpdCB0YWcnLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdwaXBlbGluZXMtcmVsZWFzZSBidW1wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdnaXQgcHVzaCAtLXRhZ3MnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncmVsZWFzZTpwdXNoLWFzc2VtYmx5Jywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBwaXBlbGluZXMtcmVsZWFzZSBjcmVhdGUtbWFuaWZlc3QgXCIke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9XCIgIFwiJHt0aGlzLnByb3BzLnBrZ05hbWVzcGFjZX1cImAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSB2ZXJzaW9uIC0tbm8tZ2l0LXRhZy12ZXJzaW9uIGZyb20tZ2l0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGN3ZDogdGhpcy5hcHAuY2RrQ29uZmlnLmNka291dCxcbiAgICAgICAgICBleGVjOiAnbnBtIHB1Ymxpc2gnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgcGVyc29uYWwgZGVwbG95bWVudCBzdGFnZSwgaW5jbHVkaW5nIGRlcGxveW1lbnQsIHdhdGNoaW5nIGZvciBjaGFuZ2VzLFxuICAgKiBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVBlcnNvbmFsU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCd3YXRjaDpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0td2F0Y2ggLS1ob3Rzd2FwICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkaWZmOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgZm9yIHRoZSBmZWF0dXJlIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksXG4gICAqIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZlYXR1cmVTdGFnZSgpIHtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVwbG95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Rlc3Ryb3k6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVzdHJveSAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgZm9yIHRoZSBnZW5lcmFsIHBpcGVsaW5lIHN0YWdlcyAoZGV2LCBwcm9kKSwgaW5jbHVkaW5nIGRlcGxveW1lbnQgYW5kIGNvbXBhcmluZyBjaGFuZ2VzIChkaWZmKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdGFnZSAoZS5nLiwgJ2RldicsICdwcm9kJylcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZU5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS0ke3N0YWdlTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2VOYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tJHtzdGFnZU5hbWV9YCxcbiAgICB9KTtcbiAgfVxufSJdfQ==
package/package.json CHANGED
@@ -73,7 +73,7 @@
73
73
  ],
74
74
  "main": "lib/index.js",
75
75
  "license": "Apache-2.0",
76
- "version": "0.0.0",
76
+ "version": "0.0.2",
77
77
  "jest": {
78
78
  "testMatch": [
79
79
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",