projen-pipelines 0.0.1 → 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",
@@ -90,7 +90,9 @@
90
90
  "assembly": "projen-pipelines",
91
91
  "base": "projen.Component",
92
92
  "docs": {
93
- "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."
94
96
  },
95
97
  "fqn": "projen-pipelines.CDKPipeline",
96
98
  "initializer": {
@@ -99,7 +101,7 @@
99
101
  },
100
102
  "locationInModule": {
101
103
  "filename": "src/pipeline.ts",
102
- "line": 24
104
+ "line": 94
103
105
  },
104
106
  "parameters": [
105
107
  {
@@ -119,7 +121,7 @@
119
121
  "kind": "class",
120
122
  "locationInModule": {
121
123
  "filename": "src/pipeline.ts",
122
- "line": 22
124
+ "line": 92
123
125
  },
124
126
  "name": "CDKPipeline",
125
127
  "symbolId": "src/pipeline:CDKPipeline"
@@ -128,25 +130,29 @@
128
130
  "assembly": "projen-pipelines",
129
131
  "datatype": true,
130
132
  "docs": {
131
- "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."
132
136
  },
133
137
  "fqn": "projen-pipelines.CDKPipelineOptions",
134
138
  "kind": "interface",
135
139
  "locationInModule": {
136
140
  "filename": "src/pipeline.ts",
137
- "line": 16
141
+ "line": 66
138
142
  },
139
143
  "name": "CDKPipelineOptions",
140
144
  "properties": [
141
145
  {
142
146
  "abstract": true,
143
147
  "docs": {
144
- "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."
145
151
  },
146
152
  "immutable": true,
147
153
  "locationInModule": {
148
154
  "filename": "src/pipeline.ts",
149
- "line": 19
155
+ "line": 85
150
156
  },
151
157
  "name": "environments",
152
158
  "type": {
@@ -156,12 +162,14 @@
156
162
  {
157
163
  "abstract": true,
158
164
  "docs": {
159
- "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."
160
168
  },
161
169
  "immutable": true,
162
170
  "locationInModule": {
163
171
  "filename": "src/pipeline.ts",
164
- "line": 18
172
+ "line": 78
165
173
  },
166
174
  "name": "pkgNamespace",
167
175
  "type": {
@@ -171,12 +179,13 @@
171
179
  {
172
180
  "abstract": true,
173
181
  "docs": {
174
- "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."
175
184
  },
176
185
  "immutable": true,
177
186
  "locationInModule": {
178
187
  "filename": "src/pipeline.ts",
179
- "line": 17
188
+ "line": 71
180
189
  },
181
190
  "name": "stackPrefix",
182
191
  "type": {
@@ -190,25 +199,29 @@
190
199
  "assembly": "projen-pipelines",
191
200
  "datatype": true,
192
201
  "docs": {
193
- "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."
194
205
  },
195
206
  "fqn": "projen-pipelines.Environment",
196
207
  "kind": "interface",
197
208
  "locationInModule": {
198
209
  "filename": "src/pipeline.ts",
199
- "line": 4
210
+ "line": 9
200
211
  },
201
212
  "name": "Environment",
202
213
  "properties": [
203
214
  {
204
215
  "abstract": true,
205
216
  "docs": {
206
- "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."
207
220
  },
208
221
  "immutable": true,
209
222
  "locationInModule": {
210
223
  "filename": "src/pipeline.ts",
211
- "line": 5
224
+ "line": 15
212
225
  },
213
226
  "name": "account",
214
227
  "type": {
@@ -218,12 +231,14 @@
218
231
  {
219
232
  "abstract": true,
220
233
  "docs": {
221
- "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."
222
237
  },
223
238
  "immutable": true,
224
239
  "locationInModule": {
225
240
  "filename": "src/pipeline.ts",
226
- "line": 6
241
+ "line": 22
227
242
  },
228
243
  "name": "region",
229
244
  "type": {
@@ -237,25 +252,29 @@
237
252
  "assembly": "projen-pipelines",
238
253
  "datatype": true,
239
254
  "docs": {
240
- "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."
241
258
  },
242
259
  "fqn": "projen-pipelines.EnvironmentMap",
243
260
  "kind": "interface",
244
261
  "locationInModule": {
245
262
  "filename": "src/pipeline.ts",
246
- "line": 9
263
+ "line": 30
247
264
  },
248
265
  "name": "EnvironmentMap",
249
266
  "properties": [
250
267
  {
251
268
  "abstract": true,
252
269
  "docs": {
253
- "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."
254
273
  },
255
274
  "immutable": true,
256
275
  "locationInModule": {
257
276
  "filename": "src/pipeline.ts",
258
- "line": 12
277
+ "line": 51
259
278
  },
260
279
  "name": "dev",
261
280
  "type": {
@@ -265,12 +284,14 @@
265
284
  {
266
285
  "abstract": true,
267
286
  "docs": {
268
- "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."
269
290
  },
270
291
  "immutable": true,
271
292
  "locationInModule": {
272
293
  "filename": "src/pipeline.ts",
273
- "line": 11
294
+ "line": 44
274
295
  },
275
296
  "name": "feature",
276
297
  "type": {
@@ -280,12 +301,13 @@
280
301
  {
281
302
  "abstract": true,
282
303
  "docs": {
283
- "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."
284
306
  },
285
307
  "immutable": true,
286
308
  "locationInModule": {
287
309
  "filename": "src/pipeline.ts",
288
- "line": 10
310
+ "line": 36
289
311
  },
290
312
  "name": "personal",
291
313
  "type": {
@@ -295,12 +317,14 @@
295
317
  {
296
318
  "abstract": true,
297
319
  "docs": {
298
- "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."
299
323
  },
300
324
  "immutable": true,
301
325
  "locationInModule": {
302
326
  "filename": "src/pipeline.ts",
303
- "line": 13
327
+ "line": 57
304
328
  },
305
329
  "name": "prod",
306
330
  "type": {
@@ -311,6 +335,6 @@
311
335
  "symbolId": "src/pipeline:EnvironmentMap"
312
336
  }
313
337
  },
314
- "version": "0.0.1",
315
- "fingerprint": "2LYbS7mnYEB7BvVsmfx7xZ2z3b2bi5G6OW2IkIWWAjs="
338
+ "version": "0.0.2",
339
+ "fingerprint": "waYM4hyDn3h3HyWbjkniKI5tGRzEWHiWZjTSiUvbuxI="
316
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,12 +359,20 @@ 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
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
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
  }
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
+ */
17
81
  export declare class CDKPipeline extends Component {
18
82
  private app;
19
83
  private props;
20
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,29 +5,41 @@ 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
+ /**
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
+ */
8
12
  class CDKPipeline extends projen_1.Component {
9
13
  constructor(app, props) {
10
14
  super(app);
11
15
  this.app = app;
12
16
  this.props = props;
17
+ // Add development dependencies
13
18
  this.app.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
14
19
  // this.app.addDeps(
15
20
  // );
16
- // Remove assembly before synth
21
+ // Removes the compiled cloud assembly before each synth
17
22
  this.project.tasks.tryFind('synth')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
18
23
  this.project.tasks.tryFind('synth:silent')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
19
- // Remove conflicting tasks
24
+ // Remove tasks that might conflict with the pipeline process
20
25
  this.project.removeTask('deploy');
21
26
  this.project.removeTask('diff');
22
27
  this.project.removeTask('destroy');
23
28
  this.project.removeTask('watch');
29
+ // Creates different deployment stages
24
30
  this.createPersonalStage();
25
31
  this.createFeatureStage();
26
32
  this.createPipelineStage('dev');
27
33
  this.createPipelineStage('prod');
34
+ // Creates tasks to handle the release process
28
35
  this.createReleaseTasks();
36
+ // Creates a specialized CDK App class
29
37
  this.createApplicationEntrypoint();
30
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
+ */
31
43
  createApplicationEntrypoint() {
32
44
  const appFile = new projen_1.TextFile(this.project, `${this.app.srcdir}/app.ts`);
33
45
  appFile.addLine(`// ${common_1.PROJEN_MARKER}
@@ -38,31 +50,61 @@ class CDKPipeline extends projen_1.Component {
38
50
  /* eslint-disable quote-props */
39
51
  import { App, AppProps, Stack, StackProps } from 'aws-cdk-lib';
40
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
+ */
41
60
  export interface PipelineAppProps extends AppProps {
61
+ /** This optional function, if provided, will be used to generate a development stack. */
42
62
  provideDevStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
63
+
64
+ /** This optional function, if provided, will be used to generate a production stack. */
43
65
  provideProdStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
66
+
67
+ /** This optional function, if provided, will be used to generate a personal stack. */
44
68
  providePersonalStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
69
+
70
+ /** This optional function, if provided, will be used to generate a feature stack. */
45
71
  provideFeatureStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
46
72
  }
47
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
+ */
48
78
  export interface PipelineAppStackProps extends StackProps {
49
79
  stageName: string;
50
80
  }
51
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
+ */
52
87
  export class PipelineApp extends App {
53
88
  constructor(props: PipelineAppProps) {
54
89
  super(props);
55
90
 
91
+ // If a function is provided for creating a development stack, it is called with necessary arguments.
56
92
  if (props.provideDevStack) {
57
93
  props.provideDevStack(this, '${this.props.stackPrefix}-dev', { env: ${JSON.stringify(this.props.environments.dev)}, stackName: '${this.props.stackPrefix}-dev', stageName: 'dev' });
58
94
  }
95
+
96
+ // If a function is provided for creating a production stack, it is called with necessary arguments.
59
97
  if (props.provideProdStack) {
60
98
  props.provideProdStack(this, '${this.props.stackPrefix}-prod', { env: ${JSON.stringify(this.props.environments.prod)}, stackName: '${this.props.stackPrefix}-prod', stageName: 'prod' });
61
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.
62
102
  if (props.providePersonalStack && process.env.USER) {
63
103
  const stageName = 'personal-' + process.env.USER.toLowerCase().replace(/\\\//g, '-');
64
104
  props.providePersonalStack(this, '${this.props.stackPrefix}-personal', { env: ${JSON.stringify(this.props.environments.personal)}, stackName: \`${this.props.stackPrefix}-\${stageName}\`, stageName });
65
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.
66
108
  if (props.provideFeatureStack && process.env.BRANCH) {
67
109
  const stageName = 'feature-' + process.env.BRANCH.toLowerCase().replace(/\\\//g, '-');
68
110
  props.provideFeatureStack(this, '${this.props.stackPrefix}-feature', { env: ${JSON.stringify(this.props.environments.feature)}, stackName: \`${this.props.stackPrefix}-\${stageName}\`, stageName });
@@ -71,6 +113,10 @@ export class PipelineApp extends App {
71
113
  }
72
114
  `);
73
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
+ */
74
120
  createReleaseTasks() {
75
121
  // Task to publish the CDK assets to all accounts
76
122
  this.project.addTask('publish:assets', {
@@ -110,6 +156,10 @@ export class PipelineApp extends App {
110
156
  ],
111
157
  });
112
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
+ */
113
163
  createPersonalStage() {
114
164
  this.project.addTask('deploy:personal', {
115
165
  exec: `cdk deploy ${this.props.stackPrefix}-personal`,
@@ -124,6 +174,10 @@ export class PipelineApp extends App {
124
174
  exec: `cdk destroy ${this.props.stackPrefix}-personal`,
125
175
  });
126
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
+ */
127
181
  createFeatureStage() {
128
182
  this.project.addTask('deploy:feature', {
129
183
  exec: `cdk --progress events --require-approval never deploy ${this.props.stackPrefix}-feature`,
@@ -135,6 +189,10 @@ export class PipelineApp extends App {
135
189
  exec: `cdk destroy ${this.props.stackPrefix}-feature`,
136
190
  });
137
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
+ */
138
196
  createPipelineStage(stageName) {
139
197
  this.project.addTask(`deploy:${stageName}`, {
140
198
  exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.props.stackPrefix}-${stageName}`,
@@ -145,6 +203,6 @@ export class PipelineApp extends App {
145
203
  }
146
204
  }
147
205
  _a = JSII_RTTI_SYMBOL_1;
148
- CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.1" };
206
+ CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.2" };
149
207
  exports.CDKPipeline = CDKPipeline;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBcUQ7QUFDckQsOENBQWtEO0FBb0JsRCxNQUFhLFdBQVksU0FBUSxrQkFBUztJQUV4QyxZQUFvQixHQUErQixFQUFVLEtBQXlCO1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFHcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2pCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsWUFBWSxDQUNiLENBQUM7UUFDRixvQkFBb0I7UUFDcEIsS0FBSztRQUVMLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUUvRiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsSUFB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QUFVLFNBQVMsRUFBRSxFQUFFO1lBQzFDLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sc0RBQXNELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLFNBQVMsRUFBRTtTQUN4SSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLFNBQVMsRUFBRSxFQUFFO1lBQ3hDLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUU7U0FDM0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztBQTFKVSxrQ0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUsIGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBQUk9KRU5fTUFSS0VSIH0gZnJvbSAncHJvamVuL2xpYi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50IHtcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudE1hcCB7XG4gIHJlYWRvbmx5IHBlcnNvbmFsOiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgZmVhdHVyZTogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IGRldjogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHByb2Q6IEVudmlyb25tZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENES1BpcGVsaW5lT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHN0YWNrUHJlZml4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBrZ05hbWVzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50TWFwO1xufVxuXG5leHBvcnQgY2xhc3MgQ0RLUGlwZWxpbmUgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCwgcHJpdmF0ZSBwcm9wczogQ0RLUGlwZWxpbmVPcHRpb25zKSB7XG4gICAgc3VwZXIoYXBwKTtcblxuICAgIHRoaXMuYXBwLmFkZERldkRlcHMoXG4gICAgICAnQHR5cGVzL3N0YW5kYXJkLXZlcnNpb24nLFxuICAgICAgJ3N0YW5kYXJkLXZlcnNpb24nLFxuICAgICAgJ2Nkay1hc3NldHMnLFxuICAgICk7XG4gICAgLy8gdGhpcy5hcHAuYWRkRGVwcyhcbiAgICAvLyApO1xuXG4gICAgLy8gUmVtb3ZlIGFzc2VtYmx5IGJlZm9yZSBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZsaWN0aW5nIHRhc2tzXG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2RlcGxveScpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkaWZmJyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2Rlc3Ryb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnd2F0Y2gnKTtcblxuICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuXG4gICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcblxuICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZSgnZGV2Jyk7XG4gICAgdGhpcy5jcmVhdGVQaXBlbGluZVN0YWdlKCdwcm9kJyk7XG5cbiAgICB0aGlzLmNyZWF0ZVJlbGVhc2VUYXNrcygpO1xuXG4gICAgdGhpcy5jcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCkge1xuICAgIGNvbnN0IGFwcEZpbGUgPSBuZXcgVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBgJHt0aGlzLmFwcC5zcmNkaXJ9L2FwcC50c2ApO1xuICAgIGFwcEZpbGUuYWRkTGluZShgLy8gJHtQUk9KRU5fTUFSS0VSfVxuLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LWN1cmx5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xuLyogZXNsaW50LWRpc2FibGUga2V5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFByb3BzIGV4dGVuZHMgQXBwUHJvcHMge1xuICBwcm92aWRlRGV2U3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQcm9kU3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuICBwcm92aWRlRmVhdHVyZVN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMucHJvdmlkZURldlN0YWNrKSB7XG4gICAgICBwcm9wcy5wcm92aWRlRGV2U3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2JywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMuZGV2KX0sIHN0YWNrTmFtZTogJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2Jywgc3RhZ2VOYW1lOiAnZGV2JyB9KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnByb3ZpZGVQcm9kU3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGVQcm9kU3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcHJvZCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnByb2QpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kJywgc3RhZ2VOYW1lOiAncHJvZCcgfSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayAmJiBwcm9jZXNzLmVudi5VU0VSKSB7XG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSAncGVyc29uYWwtJyArIHByb2Nlc3MuZW52LlVTRVIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayh0aGlzLCAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnBlcnNvbmFsKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5mZWF0dXJlKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuYCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlbGVhc2VUYXNrcygpIHtcbiAgICAvLyBUYXNrIHRvIHB1Ymxpc2ggdGhlIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3B1Ymxpc2g6YXNzZXRzJywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9LyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2LmFzc2V0cy5qc29uIHB1Ymxpc2hgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogYG5weCBjZGstYXNzZXRzIC1wICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0vJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kLmFzc2V0cy5qc29uIHB1Ymxpc2hgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdidW1wJywge1xuICAgICAgZGVzY3JpcHRpb246ICdCdW1wcyB2ZXJzaW9uIGJhc2VkIG9uIGxhdGVzdCBnaXQgdGFnJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAncGlwZWxpbmVzLXJlbGVhc2UgYnVtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAnZ2l0IHB1c2ggLS10YWdzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3JlbGVhc2U6cHVzaC1hc3NlbWJseScsIHtcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgcGlwZWxpbmVzLXJlbGVhc2UgY3JlYXRlLW1hbmlmZXN0IFwiJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fVwiICBcIiR7dGhpcy5wcm9wcy5wa2dOYW1lc3BhY2V9XCJgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0LFxuICAgICAgICAgIGV4ZWM6ICducG0gdmVyc2lvbiAtLW5vLWdpdC10YWctdmVyc2lvbiBmcm9tLWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSBwdWJsaXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBlcnNvbmFsU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCd3YXRjaDpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0td2F0Y2ggLS1ob3Rzd2FwICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkaWZmOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGZWF0dXJlU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZU5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS0ke3N0YWdlTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2VOYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tJHtzdGFnZU5hbWV9YCxcbiAgICB9KTtcbiAgfVxufSJdfQ==
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.1",
76
+ "version": "0.0.2",
77
77
  "jest": {
78
78
  "testMatch": [
79
79
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",