projen-modules 3.0.2 → 3.2.0

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
@@ -99,7 +99,7 @@
99
99
  },
100
100
  "name": "projen-modules",
101
101
  "readme": {
102
- "markdown": "# projen-modules\n\nA collection of custom projen modules, that can be used to bootstrap and maintain consistent project configuration, tooling, dependencies, and builds.\n\n## Getting Started\n\n```sh\nyarn install\nnpx projen build\n```\n\nThis will:\n* Install the dependencies\n* Apply any projen changes\n* Run tests\n* Package project locally\n\nAny files changed by projen should be committed to git.\n\nRunning the tests like this will update any snapshot files, this should be reviewed and committed to git.\n\n## Testing\n\nTypes of testing:\n* Snapshot - projen project outputs are stored as a snapshot in the corresponding `__snapshots__` directory. When the project changes then it is expected that these snapshots change too and should be reviewed committed alongside the project.\n* Unit tests - these assert on specific functionality of the project and should be written for any new functionality added.\n\n\n## Creating a New Project\n\n\n```\nnpx projen new {project} --from projen-modules\n```\n\nSome projects may have required fields that need to be specified as part of this command, review any errors for details what needs to be specified.\n\n### Project Types\n\n| Project type | Description |\n| ---------------------------------------------- | -------------------------- |\n| [cdk-typescript-app](API.md#cdktypescriptapp-) | A typescript CDK app |\n| [npm-package](API.md#npmpackage-) | A typescript npm package |\n| [python-package](API.md#pythonpackage-) | A python package |\n| [jsii-package](API.md#jsiiproject-) | A typescript JSII package |\n\n## Project Structure\n\nAll source is located in `src` and is grouped by:\n* `components` - these are common building blocks that can be used by projects to implement specific project functionality.\n* `projects` - these are projects that can be built from this project (see #something)\n* `utils` - these are helper functions that are often reused\n\n`test` contains tests, and mirrors the `src` directory structure. Within here there are `__snapshots__` which contain snapshots of project tests (see #section)."
102
+ "markdown": "# projen-modules\n\nA collection of custom projen modules, that can be used to bootstrap and maintain consistent project configuration, tooling, dependencies, and builds.\n\n## Getting Started\n\n```sh\nyarn install\nnpx projen build\n```\n\nThis will:\n* Install the dependencies\n* Apply any projen changes\n* Run tests\n* Package project locally\n\nAny files changed by projen should be committed to git.\n\nRunning the tests like this will update any snapshot files, this should be reviewed and committed to git.\n\n## Testing\n\nTypes of testing:\n* Snapshot - projen project outputs are stored as a snapshot in the corresponding `__snapshots__` directory. When the project changes then it is expected that these snapshots change too and should be reviewed committed alongside the project.\n* Unit tests - these assert on specific functionality of the project and should be written for any new functionality added.\n\n\n## GitHub Configuration\n\nAll pull requests are merged by the [Mergify](https://mergify.com) merge queue, configured in `.mergify.yml`. Once a pull request's checks pass, Mergify queues it, brings it up to date with the default branch, waits for the checks again and squash merges it. Draft pull requests and those labelled `do-not-merge` are not merged.\n\nThe repository must be configured as below so that nothing can be merged without going through the queue.\n\n### Mergify\n\nInstall the [Mergify GitHub App](https://github.com/apps/mergify) and give it access to this repository.\n\n### Pull request settings\n\nIn **Settings → General → Pull Requests**:\n* Allow squash merging only (untick merge commits and rebase merging), matching the queue's merge method.\n* Untick **Allow auto-merge**, because GitHub's own auto-merge merges outside the queue.\n* Tick **Automatically delete head branches**.\n\n### Code scanning\n\nCodeQL runs from `.github/workflows/codeql.yml`, which is managed by projen. In **Settings → Advanced Security**, leave CodeQL **Default setup** off, because it cannot run alongside this workflow. Under **Protection rules**, keep the **Check run failure threshold** at **High or higher** for security alerts and **Errors** for other alerts, as this decides whether the `CodeQL` check fails. Private repositories also need GitHub Code Security enabled there for code scanning results to be uploaded.\n\n### Branch ruleset\n\nIn **Settings → Rules → Rulesets**, create a branch ruleset with enforcement **Active** that targets the default branch, and set:\n* **Bypass list**: the **Mergify** app only, in **Exempt** mode. Do not add admins or other roles, as anyone on this list can merge without the queue.\n* **Restrict updates**: only bypass actors can update the branch, so pull requests cannot be merged from the GitHub UI or CLI and commits cannot be pushed directly.\n* **Restrict deletions** and **Block force pushes**.\n* **Require a pull request before merging**, with 0 required approvals.\n* **Require status checks to pass**, listing the checks that `.mergify.yml` waits for: `build`, `package-js`, `package-python`. Leave **Require branches to be up to date before merging** unticked, as the queue already updates and retests each pull request.\n* **Require code scanning results**, with the tool **CodeQL**, security alerts set to **High or higher** and alerts set to **Errors**. Mergify is exempt from this rule, so `.mergify.yml` also waits for the `CodeQL` check instead.\n\nDo not enable GitHub's own **Require merge queue** rule, as it competes with Mergify.\n\nIf the queue is unavailable and a change has to be merged, add yourself to the bypass list temporarily and remove yourself afterwards.\n\n## Creating a New Project\n\n\n```\nnpx projen new {project} --from projen-modules\n```\n\nSome projects may have required fields that need to be specified as part of this command, review any errors for details what needs to be specified.\n\n### Project Types\n\n| Project type | Description |\n| ---------------------------------------------- | -------------------------- |\n| [cdk-typescript-app](API.md#cdktypescriptapp-) | A typescript CDK app |\n| [npm-package](API.md#npmpackage-) | A typescript npm package |\n| [python-package](API.md#pythonpackage-) | A python package |\n| [jsii-package](API.md#jsiiproject-) | A typescript JSII package |\n\n## Project Structure\n\nAll source is located in `src` and is grouped by:\n* `components` - these are common building blocks that can be used by projects to implement specific project functionality.\n* `projects` - these are projects that can be built from this project (see #something)\n* `utils` - these are helper functions that are often reused\n\n`test` contains tests, and mirrors the `src` directory structure. Within here there are `__snapshots__` which contain snapshots of project tests (see #section)."
103
103
  },
104
104
  "repository": {
105
105
  "type": "git",
@@ -133,7 +133,7 @@
133
133
  },
134
134
  "locationInModule": {
135
135
  "filename": "src/projects/cdk-ts/index.ts",
136
- "line": 35
136
+ "line": 36
137
137
  },
138
138
  "parameters": [
139
139
  {
@@ -147,7 +147,7 @@
147
147
  "kind": "class",
148
148
  "locationInModule": {
149
149
  "filename": "src/projects/cdk-ts/index.ts",
150
- "line": 32
150
+ "line": 33
151
151
  },
152
152
  "name": "CdkTypeScriptApp",
153
153
  "properties": [
@@ -157,7 +157,7 @@
157
157
  },
158
158
  "locationInModule": {
159
159
  "filename": "src/projects/cdk-ts/index.ts",
160
- "line": 33
160
+ "line": 34
161
161
  },
162
162
  "name": "readme",
163
163
  "type": {
@@ -208,7 +208,7 @@
208
208
  "immutable": true,
209
209
  "locationInModule": {
210
210
  "filename": "src/projects/cdk-ts/cdk-typescript-app-options.ts",
211
- "line": 1270
211
+ "line": 1275
212
212
  },
213
213
  "name": "codeOwners",
214
214
  "type": {
@@ -923,6 +923,24 @@
923
923
  "primitive": "string"
924
924
  }
925
925
  },
926
+ {
927
+ "abstract": true,
928
+ "docs": {
929
+ "default": "true",
930
+ "stability": "stable",
931
+ "summary": "Scan the code with CodeQL on pull requests, pushes to the default branch and weekly."
932
+ },
933
+ "immutable": true,
934
+ "locationInModule": {
935
+ "filename": "src/projects/cdk-ts/cdk-typescript-app-options.ts",
936
+ "line": 1271
937
+ },
938
+ "name": "codeql",
939
+ "optional": true,
940
+ "type": {
941
+ "primitive": "boolean"
942
+ }
943
+ },
926
944
  {
927
945
  "abstract": true,
928
946
  "docs": {
@@ -3560,7 +3578,7 @@
3560
3578
  },
3561
3579
  "locationInModule": {
3562
3580
  "filename": "src/projects/jsii/index.ts",
3563
- "line": 33
3581
+ "line": 34
3564
3582
  },
3565
3583
  "parameters": [
3566
3584
  {
@@ -3574,7 +3592,7 @@
3574
3592
  "kind": "class",
3575
3593
  "locationInModule": {
3576
3594
  "filename": "src/projects/jsii/index.ts",
3577
- "line": 30
3595
+ "line": 31
3578
3596
  },
3579
3597
  "name": "JsiiProject",
3580
3598
  "properties": [
@@ -3584,7 +3602,7 @@
3584
3602
  },
3585
3603
  "locationInModule": {
3586
3604
  "filename": "src/projects/jsii/index.ts",
3587
- "line": 31
3605
+ "line": 32
3588
3606
  },
3589
3607
  "name": "readme",
3590
3608
  "type": {
@@ -3652,7 +3670,7 @@
3652
3670
  "immutable": true,
3653
3671
  "locationInModule": {
3654
3672
  "filename": "src/projects/jsii/jsii-project-options.ts",
3655
- "line": 1239
3673
+ "line": 1244
3656
3674
  },
3657
3675
  "name": "codeOwners",
3658
3676
  "type": {
@@ -4275,6 +4293,24 @@
4275
4293
  "primitive": "string"
4276
4294
  }
4277
4295
  },
4296
+ {
4297
+ "abstract": true,
4298
+ "docs": {
4299
+ "default": "true",
4300
+ "stability": "stable",
4301
+ "summary": "Scan the code with CodeQL on pull requests, pushes to the default branch and weekly."
4302
+ },
4303
+ "immutable": true,
4304
+ "locationInModule": {
4305
+ "filename": "src/projects/jsii/jsii-project-options.ts",
4306
+ "line": 1240
4307
+ },
4308
+ "name": "codeql",
4309
+ "optional": true,
4310
+ "type": {
4311
+ "primitive": "boolean"
4312
+ }
4313
+ },
4278
4314
  {
4279
4315
  "abstract": true,
4280
4316
  "docs": {
@@ -9853,7 +9889,7 @@
9853
9889
  },
9854
9890
  "locationInModule": {
9855
9891
  "filename": "src/projects/python/index.ts",
9856
- "line": 29
9892
+ "line": 33
9857
9893
  },
9858
9894
  "parameters": [
9859
9895
  {
@@ -9867,7 +9903,7 @@
9867
9903
  "kind": "class",
9868
9904
  "locationInModule": {
9869
9905
  "filename": "src/projects/python/index.ts",
9870
- "line": 26
9906
+ "line": 29
9871
9907
  },
9872
9908
  "name": "PythonPackage",
9873
9909
  "properties": [
@@ -9875,9 +9911,24 @@
9875
9911
  "docs": {
9876
9912
  "stability": "stable"
9877
9913
  },
9914
+ "immutable": true,
9878
9915
  "locationInModule": {
9879
9916
  "filename": "src/projects/python/index.ts",
9880
- "line": 27
9917
+ "line": 30
9918
+ },
9919
+ "name": "autoMerge",
9920
+ "optional": true,
9921
+ "type": {
9922
+ "fqn": "projen.github.AutoMerge"
9923
+ }
9924
+ },
9925
+ {
9926
+ "docs": {
9927
+ "stability": "stable"
9928
+ },
9929
+ "locationInModule": {
9930
+ "filename": "src/projects/python/index.ts",
9931
+ "line": 31
9881
9932
  },
9882
9933
  "name": "readme",
9883
9934
  "type": {
@@ -9945,7 +9996,7 @@
9945
9996
  "immutable": true,
9946
9997
  "locationInModule": {
9947
9998
  "filename": "src/projects/python/python-package-options.ts",
9948
- "line": 386
9999
+ "line": 391
9949
10000
  },
9950
10001
  "name": "codeOwners",
9951
10002
  "type": {
@@ -10111,6 +10162,24 @@
10111
10162
  "primitive": "boolean"
10112
10163
  }
10113
10164
  },
10165
+ {
10166
+ "abstract": true,
10167
+ "docs": {
10168
+ "default": "true",
10169
+ "stability": "stable",
10170
+ "summary": "Scan the code with CodeQL on pull requests, pushes to the default branch and weekly."
10171
+ },
10172
+ "immutable": true,
10173
+ "locationInModule": {
10174
+ "filename": "src/projects/python/python-package-options.ts",
10175
+ "line": 387
10176
+ },
10177
+ "name": "codeql",
10178
+ "optional": true,
10179
+ "type": {
10180
+ "primitive": "boolean"
10181
+ }
10182
+ },
10114
10183
  {
10115
10184
  "abstract": true,
10116
10185
  "docs": {
@@ -10687,7 +10756,7 @@
10687
10756
  "immutable": true,
10688
10757
  "locationInModule": {
10689
10758
  "filename": "src/projects/python/python-package-options.ts",
10690
- "line": 391
10759
+ "line": 396
10691
10760
  },
10692
10761
  "name": "pullRequestTemplate",
10693
10762
  "optional": true,
@@ -10705,7 +10774,7 @@
10705
10774
  "immutable": true,
10706
10775
  "locationInModule": {
10707
10776
  "filename": "src/projects/python/python-package-options.ts",
10708
- "line": 396
10777
+ "line": 401
10709
10778
  },
10710
10779
  "name": "pullRequestTemplateContents",
10711
10780
  "optional": true,
@@ -11270,6 +11339,6 @@
11270
11339
  "symbolId": "src/components/readme/elements/section:Section"
11271
11340
  }
11272
11341
  },
11273
- "version": "3.0.2",
11274
- "fingerprint": "xP4Sjc6oO0AbWAKZNwF+yB8AUYrVL1Y36Rck9AfRZ0E="
11342
+ "version": "3.2.0",
11343
+ "fingerprint": "SqSTEbuSGXMK69aCHL2ZKsfp/IqCWwE3Sv+ocdd9j74="
11275
11344
  }
package/API.md CHANGED
@@ -4729,6 +4729,7 @@ When given a project, this it the project itself.
4729
4729
  | <code><a href="#projen-modules.PythonPackage.property.version">version</a></code> | <code>string</code> | Version of the package for distribution (should follow semver). |
4730
4730
  | <code><a href="#projen-modules.PythonPackage.property.packagingManager">packagingManager</a></code> | <code>projen.python.IPythonPackaging</code> | API for managing packaging the project as a library. |
4731
4731
  | <code><a href="#projen-modules.PythonPackage.property.pytest">pytest</a></code> | <code>projen.python.Pytest</code> | Pytest component. |
4732
+ | <code><a href="#projen-modules.PythonPackage.property.autoMerge">autoMerge</a></code> | <code>projen.github.AutoMerge</code> | *No description.* |
4732
4733
  | <code><a href="#projen-modules.PythonPackage.property.readme">readme</a></code> | <code><a href="#projen-modules.Readme">Readme</a></code> | *No description.* |
4733
4734
 
4734
4735
  ---
@@ -5187,6 +5188,16 @@ Pytest component.
5187
5188
 
5188
5189
  ---
5189
5190
 
5191
+ ##### `autoMerge`<sup>Optional</sup> <a name="autoMerge" id="projen-modules.PythonPackage.property.autoMerge"></a>
5192
+
5193
+ ```typescript
5194
+ public readonly autoMerge: AutoMerge;
5195
+ ```
5196
+
5197
+ - *Type:* projen.github.AutoMerge
5198
+
5199
+ ---
5200
+
5190
5201
  ##### `readme`<sup>Required</sup> <a name="readme" id="projen-modules.PythonPackage.property.readme"></a>
5191
5202
 
5192
5203
  ```typescript
@@ -5673,6 +5684,7 @@ const cdkTypeScriptAppOptions: CdkTypeScriptAppOptions = { ... }
5673
5684
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.codeArtifactOptions">codeArtifactOptions</a></code> | <code>projen.javascript.CodeArtifactOptions</code> | Options for npm packages using AWS CodeArtifact. |
5674
5685
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.codeCov">codeCov</a></code> | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/. Uses codecov/codecov-action. By default, OIDC auth is used. Alternatively a token can be provided via `codeCovTokenSecret`. |
5675
5686
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.codeCovTokenSecret">codeCovTokenSecret</a></code> | <code>string</code> | Define the secret name for a specified https://codecov.io/ token. |
5687
+ | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.codeql">codeql</a></code> | <code>boolean</code> | Scan the code with CodeQL on pull requests, pushes to the default branch and weekly. |
5676
5688
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.commitGenerated">commitGenerated</a></code> | <code>boolean</code> | Whether to commit the managed files by default. |
5677
5689
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.config">config</a></code> | <code>{[ key: string ]: any}</code> | Configuration values available to package scripts at runtime. |
5678
5690
  | <code><a href="#projen-modules.CdkTypeScriptAppOptions.property.constructsVersion">constructsVersion</a></code> | <code>string</code> | Minimum version of the `constructs` library to depend on. |
@@ -6395,6 +6407,19 @@ Define the secret name for a specified https://codecov.io/ token.
6395
6407
 
6396
6408
  ---
6397
6409
 
6410
+ ##### `codeql`<sup>Optional</sup> <a name="codeql" id="projen-modules.CdkTypeScriptAppOptions.property.codeql"></a>
6411
+
6412
+ ```typescript
6413
+ public readonly codeql: boolean;
6414
+ ```
6415
+
6416
+ - *Type:* boolean
6417
+ - *Default:* true
6418
+
6419
+ Scan the code with CodeQL on pull requests, pushes to the default branch and weekly.
6420
+
6421
+ ---
6422
+
6398
6423
  ##### `commitGenerated`<sup>Optional</sup> <a name="commitGenerated" id="projen-modules.CdkTypeScriptAppOptions.property.commitGenerated"></a>
6399
6424
 
6400
6425
  ```typescript
@@ -8385,6 +8410,7 @@ const jsiiProjectOptions: JsiiProjectOptions = { ... }
8385
8410
  | <code><a href="#projen-modules.JsiiProjectOptions.property.codeArtifactOptions">codeArtifactOptions</a></code> | <code>projen.javascript.CodeArtifactOptions</code> | Options for npm packages using AWS CodeArtifact. |
8386
8411
  | <code><a href="#projen-modules.JsiiProjectOptions.property.codeCov">codeCov</a></code> | <code>boolean</code> | Define a GitHub workflow step for sending code coverage metrics to https://codecov.io/. Uses codecov/codecov-action. By default, OIDC auth is used. Alternatively a token can be provided via `codeCovTokenSecret`. |
8387
8412
  | <code><a href="#projen-modules.JsiiProjectOptions.property.codeCovTokenSecret">codeCovTokenSecret</a></code> | <code>string</code> | Define the secret name for a specified https://codecov.io/ token. |
8413
+ | <code><a href="#projen-modules.JsiiProjectOptions.property.codeql">codeql</a></code> | <code>boolean</code> | Scan the code with CodeQL on pull requests, pushes to the default branch and weekly. |
8388
8414
  | <code><a href="#projen-modules.JsiiProjectOptions.property.commitGenerated">commitGenerated</a></code> | <code>boolean</code> | Whether to commit the managed files by default. |
8389
8415
  | <code><a href="#projen-modules.JsiiProjectOptions.property.compat">compat</a></code> | <code>boolean</code> | Automatically run API compatibility test against the latest version published to npm after compilation. |
8390
8416
  | <code><a href="#projen-modules.JsiiProjectOptions.property.compatIgnore">compatIgnore</a></code> | <code>string</code> | Name of the ignore file for API compatibility tests. |
@@ -9040,6 +9066,19 @@ Define the secret name for a specified https://codecov.io/ token.
9040
9066
 
9041
9067
  ---
9042
9068
 
9069
+ ##### `codeql`<sup>Optional</sup> <a name="codeql" id="projen-modules.JsiiProjectOptions.property.codeql"></a>
9070
+
9071
+ ```typescript
9072
+ public readonly codeql: boolean;
9073
+ ```
9074
+
9075
+ - *Type:* boolean
9076
+ - *Default:* true
9077
+
9078
+ Scan the code with CodeQL on pull requests, pushes to the default branch and weekly.
9079
+
9080
+ ---
9081
+
9043
9082
  ##### `commitGenerated`<sup>Optional</sup> <a name="commitGenerated" id="projen-modules.JsiiProjectOptions.property.commitGenerated"></a>
9044
9083
 
9045
9084
  ```typescript
@@ -13428,6 +13467,7 @@ const pythonPackageOptions: PythonPackageOptions = { ... }
13428
13467
  | <code><a href="#projen-modules.PythonPackageOptions.property.autoMergeOptions">autoMergeOptions</a></code> | <code>projen.github.AutoMergeOptions</code> | Configure options for automatic merging on GitHub. |
13429
13468
  | <code><a href="#projen-modules.PythonPackageOptions.property.classifiers">classifiers</a></code> | <code>string[]</code> | A list of PyPI trove classifiers that describe the project. |
13430
13469
  | <code><a href="#projen-modules.PythonPackageOptions.property.clobber">clobber</a></code> | <code>boolean</code> | Add a `clobber` task which resets the repo to origin. |
13470
+ | <code><a href="#projen-modules.PythonPackageOptions.property.codeql">codeql</a></code> | <code>boolean</code> | Scan the code with CodeQL on pull requests, pushes to the default branch and weekly. |
13431
13471
  | <code><a href="#projen-modules.PythonPackageOptions.property.commitGenerated">commitGenerated</a></code> | <code>boolean</code> | Whether to commit the managed files by default. |
13432
13472
  | <code><a href="#projen-modules.PythonPackageOptions.property.deps">deps</a></code> | <code>string[]</code> | List of runtime dependencies for this project. Dependencies use the format: `<module>@<semver>`. |
13433
13473
  | <code><a href="#projen-modules.PythonPackageOptions.property.description">description</a></code> | <code>string</code> | A short description of the package. |
@@ -13629,6 +13669,19 @@ Add a `clobber` task which resets the repo to origin.
13629
13669
 
13630
13670
  ---
13631
13671
 
13672
+ ##### `codeql`<sup>Optional</sup> <a name="codeql" id="projen-modules.PythonPackageOptions.property.codeql"></a>
13673
+
13674
+ ```typescript
13675
+ public readonly codeql: boolean;
13676
+ ```
13677
+
13678
+ - *Type:* boolean
13679
+ - *Default:* true
13680
+
13681
+ Scan the code with CodeQL on pull requests, pushes to the default branch and weekly.
13682
+
13683
+ ---
13684
+
13632
13685
  ##### `commitGenerated`<sup>Optional</sup> <a name="commitGenerated" id="projen-modules.PythonPackageOptions.property.commitGenerated"></a>
13633
13686
 
13634
13687
  ```typescript
package/README.md CHANGED
@@ -26,6 +26,41 @@ Types of testing:
26
26
  * Unit tests - these assert on specific functionality of the project and should be written for any new functionality added.
27
27
 
28
28
 
29
+ ## GitHub Configuration
30
+
31
+ All pull requests are merged by the [Mergify](https://mergify.com) merge queue, configured in `.mergify.yml`. Once a pull request's checks pass, Mergify queues it, brings it up to date with the default branch, waits for the checks again and squash merges it. Draft pull requests and those labelled `do-not-merge` are not merged.
32
+
33
+ The repository must be configured as below so that nothing can be merged without going through the queue.
34
+
35
+ ### Mergify
36
+
37
+ Install the [Mergify GitHub App](https://github.com/apps/mergify) and give it access to this repository.
38
+
39
+ ### Pull request settings
40
+
41
+ In **Settings → General → Pull Requests**:
42
+ * Allow squash merging only (untick merge commits and rebase merging), matching the queue's merge method.
43
+ * Untick **Allow auto-merge**, because GitHub's own auto-merge merges outside the queue.
44
+ * Tick **Automatically delete head branches**.
45
+
46
+ ### Code scanning
47
+
48
+ CodeQL runs from `.github/workflows/codeql.yml`, which is managed by projen. In **Settings → Advanced Security**, leave CodeQL **Default setup** off, because it cannot run alongside this workflow. Under **Protection rules**, keep the **Check run failure threshold** at **High or higher** for security alerts and **Errors** for other alerts, as this decides whether the `CodeQL` check fails. Private repositories also need GitHub Code Security enabled there for code scanning results to be uploaded.
49
+
50
+ ### Branch ruleset
51
+
52
+ In **Settings → Rules → Rulesets**, create a branch ruleset with enforcement **Active** that targets the default branch, and set:
53
+ * **Bypass list**: the **Mergify** app only, in **Exempt** mode. Do not add admins or other roles, as anyone on this list can merge without the queue.
54
+ * **Restrict updates**: only bypass actors can update the branch, so pull requests cannot be merged from the GitHub UI or CLI and commits cannot be pushed directly.
55
+ * **Restrict deletions** and **Block force pushes**.
56
+ * **Require a pull request before merging**, with 0 required approvals.
57
+ * **Require status checks to pass**, listing the checks that `.mergify.yml` waits for: `build`, `package-js`, `package-python`. Leave **Require branches to be up to date before merging** unticked, as the queue already updates and retests each pull request.
58
+ * **Require code scanning results**, with the tool **CodeQL**, security alerts set to **High or higher** and alerts set to **Errors**. Mergify is exempt from this rule, so `.mergify.yml` also waits for the `CodeQL` check instead.
59
+
60
+ Do not enable GitHub's own **Require merge queue** rule, as it competes with Mergify.
61
+
62
+ If the queue is unavailable and a change has to be merged, add yourself to the bypass list temporarily and remove yourself afterwards.
63
+
29
64
  ## Creating a New Project
30
65
 
31
66
 
@@ -0,0 +1,25 @@
1
+ import { Component, github } from 'projen';
2
+ export interface CodeQlOptions {
3
+ /**
4
+ * Branches whose pushes, and the pull requests targeting them, are scanned
5
+ *
6
+ * @default ['main']
7
+ */
8
+ readonly branches?: Array<string>;
9
+ /**
10
+ * CodeQL languages to analyse, all of which must not need a build
11
+ *
12
+ * @see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#changing-the-languages-that-are-analyzed
13
+ */
14
+ readonly languages: Array<string>;
15
+ }
16
+ /**
17
+ * CodeQL code scanning, as a GitHub advanced setup workflow
18
+ */
19
+ export declare class CodeQl extends Component {
20
+ /**
21
+ * Name of the check run that reports the code scanning results on pull requests
22
+ */
23
+ static readonly CHECK_NAME = "CodeQL";
24
+ constructor(gitHub: github.GitHub, options: CodeQlOptions);
25
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeQl = void 0;
4
+ const projen_1 = require("projen");
5
+ const workflows_model_1 = require("projen/lib/github/workflows-model");
6
+ /**
7
+ * CodeQL code scanning, as a GitHub advanced setup workflow
8
+ */
9
+ class CodeQl extends projen_1.Component {
10
+ /**
11
+ * Name of the check run that reports the code scanning results on pull requests
12
+ */
13
+ static CHECK_NAME = 'CodeQL';
14
+ constructor(gitHub, options) {
15
+ super(gitHub.project);
16
+ const branches = options.branches ?? ['main'];
17
+ const workflow = gitHub.addWorkflow('codeql');
18
+ workflow.on({
19
+ push: { branches },
20
+ pullRequest: { branches },
21
+ schedule: [{ cron: '44 12 * * 1' }],
22
+ });
23
+ workflow.addJobs({
24
+ analyze: {
25
+ name: 'Analyze (${{ matrix.language }})',
26
+ runsOn: ['ubuntu-latest'],
27
+ permissions: {
28
+ actions: workflows_model_1.JobPermission.READ,
29
+ contents: workflows_model_1.JobPermission.READ,
30
+ packages: workflows_model_1.JobPermission.READ,
31
+ securityEvents: workflows_model_1.JobPermission.WRITE,
32
+ },
33
+ strategy: {
34
+ failFast: false,
35
+ matrix: {
36
+ domain: {
37
+ language: options.languages,
38
+ },
39
+ },
40
+ },
41
+ steps: [
42
+ projen_1.github.WorkflowSteps.checkout(),
43
+ {
44
+ name: 'Initialize CodeQL',
45
+ uses: 'github/codeql-action/init@v4',
46
+ with: {
47
+ 'languages': '${{ matrix.language }}',
48
+ 'build-mode': 'none',
49
+ },
50
+ },
51
+ {
52
+ name: 'Perform CodeQL Analysis',
53
+ uses: 'github/codeql-action/analyze@v4',
54
+ with: {
55
+ category: '/language:${{ matrix.language }}',
56
+ },
57
+ },
58
+ ],
59
+ },
60
+ });
61
+ }
62
+ }
63
+ exports.CodeQl = CodeQl;
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZ2l0aHViL2NvZGVxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBMkM7QUFDM0MsdUVBQWtFO0FBaUJsRTs7R0FFRztBQUNILE1BQWEsTUFBTyxTQUFRLGtCQUFTO0lBQ25DOztPQUVHO0lBQ0gsTUFBTSxDQUFVLFVBQVUsR0FBRyxRQUFRLENBQUM7SUFFdEMsWUFBWSxNQUFxQixFQUFFLE9BQXNCO1FBQ3ZELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNWLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRTtZQUNsQixXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUU7WUFDekIsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNmLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsa0NBQWtDO2dCQUN4QyxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ3pCLFdBQVcsRUFBRTtvQkFDWCxPQUFPLEVBQUUsK0JBQWEsQ0FBQyxJQUFJO29CQUMzQixRQUFRLEVBQUUsK0JBQWEsQ0FBQyxJQUFJO29CQUM1QixRQUFRLEVBQUUsK0JBQWEsQ0FBQyxJQUFJO29CQUM1QixjQUFjLEVBQUUsK0JBQWEsQ0FBQyxLQUFLO2lCQUNwQztnQkFDRCxRQUFRLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFO3dCQUNOLE1BQU0sRUFBRTs0QkFDTixRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVM7eUJBQzVCO3FCQUNGO2lCQUNGO2dCQUNELEtBQUssRUFBRTtvQkFDTCxlQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtvQkFDL0I7d0JBQ0UsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsSUFBSSxFQUFFLDhCQUE4Qjt3QkFDcEMsSUFBSSxFQUFFOzRCQUNKLFdBQVcsRUFBRSx3QkFBd0I7NEJBQ3JDLFlBQVksRUFBRSxNQUFNO3lCQUNyQjtxQkFDRjtvQkFDRDt3QkFDRSxJQUFJLEVBQUUseUJBQXlCO3dCQUMvQixJQUFJLEVBQUUsaUNBQWlDO3dCQUN2QyxJQUFJLEVBQUU7NEJBQ0osUUFBUSxFQUFFLGtDQUFrQzt5QkFDN0M7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBdERILHdCQXVEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEpvYlBlcm1pc3Npb24gfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVRbE9wdGlvbnMge1xuICAvKipcbiAgICogQnJhbmNoZXMgd2hvc2UgcHVzaGVzLCBhbmQgdGhlIHB1bGwgcmVxdWVzdHMgdGFyZ2V0aW5nIHRoZW0sIGFyZSBzY2FubmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnbWFpbiddXG4gICAqL1xuICByZWFkb25seSBicmFuY2hlcz86IEFycmF5PHN0cmluZz47XG4gIC8qKlxuICAgKiBDb2RlUUwgbGFuZ3VhZ2VzIHRvIGFuYWx5c2UsIGFsbCBvZiB3aGljaCBtdXN0IG5vdCBuZWVkIGEgYnVpbGRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9jb2RlLXNlY3VyaXR5L2NvZGUtc2Nhbm5pbmcvY3JlYXRpbmctYW4tYWR2YW5jZWQtc2V0dXAtZm9yLWNvZGUtc2Nhbm5pbmcvY3VzdG9taXppbmcteW91ci1hZHZhbmNlZC1zZXR1cC1mb3ItY29kZS1zY2FubmluZyNjaGFuZ2luZy10aGUtbGFuZ3VhZ2VzLXRoYXQtYXJlLWFuYWx5emVkXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZXM6IEFycmF5PHN0cmluZz47XG59XG5cbi8qKlxuICogQ29kZVFMIGNvZGUgc2Nhbm5pbmcsIGFzIGEgR2l0SHViIGFkdmFuY2VkIHNldHVwIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2RlUWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgY2hlY2sgcnVuIHRoYXQgcmVwb3J0cyB0aGUgY29kZSBzY2FubmluZyByZXN1bHRzIG9uIHB1bGwgcmVxdWVzdHNcbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBDSEVDS19OQU1FID0gJ0NvZGVRTCc7XG5cbiAgY29uc3RydWN0b3IoZ2l0SHViOiBnaXRodWIuR2l0SHViLCBvcHRpb25zOiBDb2RlUWxPcHRpb25zKSB7XG4gICAgc3VwZXIoZ2l0SHViLnByb2plY3QpO1xuXG4gICAgY29uc3QgYnJhbmNoZXMgPSBvcHRpb25zLmJyYW5jaGVzID8/IFsnbWFpbiddO1xuICAgIGNvbnN0IHdvcmtmbG93ID0gZ2l0SHViLmFkZFdvcmtmbG93KCdjb2RlcWwnKTtcbiAgICB3b3JrZmxvdy5vbih7XG4gICAgICBwdXNoOiB7IGJyYW5jaGVzIH0sXG4gICAgICBwdWxsUmVxdWVzdDogeyBicmFuY2hlcyB9LFxuICAgICAgc2NoZWR1bGU6IFt7IGNyb246ICc0NCAxMiAqICogMScgfV0sXG4gICAgfSk7XG4gICAgd29ya2Zsb3cuYWRkSm9icyh7XG4gICAgICBhbmFseXplOiB7XG4gICAgICAgIG5hbWU6ICdBbmFseXplICgke3sgbWF0cml4Lmxhbmd1YWdlIH19KScsXG4gICAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgYWN0aW9uczogSm9iUGVybWlzc2lvbi5SRUFELFxuICAgICAgICAgIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQsXG4gICAgICAgICAgcGFja2FnZXM6IEpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgICBzZWN1cml0eUV2ZW50czogSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RyYXRlZ3k6IHtcbiAgICAgICAgICBmYWlsRmFzdDogZmFsc2UsXG4gICAgICAgICAgbWF0cml4OiB7XG4gICAgICAgICAgICBkb21haW46IHtcbiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IG9wdGlvbnMubGFuZ3VhZ2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIGdpdGh1Yi5Xb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KCksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0luaXRpYWxpemUgQ29kZVFMJyxcbiAgICAgICAgICAgIHVzZXM6ICdnaXRodWIvY29kZXFsLWFjdGlvbi9pbml0QHY0JyxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgJ2xhbmd1YWdlcyc6ICcke3sgbWF0cml4Lmxhbmd1YWdlIH19JyxcbiAgICAgICAgICAgICAgJ2J1aWxkLW1vZGUnOiAnbm9uZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1BlcmZvcm0gQ29kZVFMIEFuYWx5c2lzJyxcbiAgICAgICAgICAgIHVzZXM6ICdnaXRodWIvY29kZXFsLWFjdGlvbi9hbmFseXplQHY0JyxcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6ICcvbGFuZ3VhZ2U6JHt7IG1hdHJpeC5sYW5ndWFnZSB9fScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,14 @@
1
1
  import { github, Project } from 'projen';
2
+ import { Readme } from '../readme';
2
3
  export interface MergifyOptions {
4
+ /**
5
+ * Number of approving reviews the merge queue waits for, which should match
6
+ * `autoMergeOptions.approvedReviews`. Use 0 for a repository with a single
7
+ * maintainer, who cannot approve their own pull requests.
8
+ *
9
+ * @default 1
10
+ */
11
+ readonly approvedReviews?: number;
3
12
  readonly assignUsers?: Array<string>;
4
13
  readonly reportingMethod?: string;
5
14
  /**
@@ -10,10 +19,12 @@ export interface MergifyOptions {
10
19
  readonly upgradeAuthor?: string;
11
20
  }
12
21
  type MergifyProject = Project & {
22
+ readonly autoMerge?: github.AutoMerge;
13
23
  readonly github?: github.GitHub;
14
24
  readonly buildWorkflow?: {
15
25
  readonly buildJobIds?: Array<string>;
16
26
  };
27
+ readonly readme?: Readme;
17
28
  };
18
29
  export declare function configureMergify(project: MergifyProject, options?: MergifyOptions): void;
19
30
  export {};
@@ -1,12 +1,73 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.configureMergify = configureMergify;
4
+ const codeql_1 = require("./codeql");
5
+ function githubConfigurationSection(requiredChecks, approvedReviews, codeScanning) {
6
+ const statusChecks = requiredChecks.length
7
+ ? 'the checks that `.mergify.yml` waits for: `' +
8
+ requiredChecks.join('`, `') +
9
+ '`'
10
+ : 'any CI checks added to the project (none are configured yet), keeping them in sync with `.mergify.yml`';
11
+ const approvals = approvedReviews === 1 ? '1 required approval' : `${approvedReviews} required approvals`;
12
+ const queued = approvedReviews
13
+ ? 'Once a pull request is approved and its checks pass'
14
+ : 'Once a pull request\'s checks pass';
15
+ const soleMaintainer = approvedReviews
16
+ ? `
17
+
18
+ A repository with a single maintainer, who cannot approve their own pull requests, should set \`autoMergeOptions: { approvedReviews: 0 }\` in \`.projenrc.ts\` and set the ruleset's required approvals to 0. Pull requests are then merged as soon as their checks pass.`
19
+ : '';
20
+ const codeScanningSettings = codeScanning
21
+ ? `
22
+
23
+ ### Code scanning
24
+
25
+ CodeQL runs from \`.github/workflows/codeql.yml\`, which is managed by projen. In **Settings → Advanced Security**, leave CodeQL **Default setup** off, because it cannot run alongside this workflow. Under **Protection rules**, keep the **Check run failure threshold** at **High or higher** for security alerts and **Errors** for other alerts, as this decides whether the \`${codeql_1.CodeQl.CHECK_NAME}\` check fails. Private repositories also need GitHub Code Security enabled there for code scanning results to be uploaded.`
26
+ : '';
27
+ const codeScanningRule = codeScanning
28
+ ? `
29
+ * **Require code scanning results**, with the tool **CodeQL**, security alerts set to **High or higher** and alerts set to **Errors**. Mergify is exempt from this rule, so \`.mergify.yml\` also waits for the \`${codeql_1.CodeQl.CHECK_NAME}\` check instead.`
30
+ : '';
31
+ return `All pull requests are merged by the [Mergify](https://mergify.com) merge queue, configured in \`.mergify.yml\`. ${queued}, Mergify queues it, brings it up to date with the default branch, waits for the checks again and squash merges it. Draft pull requests and those labelled \`do-not-merge\` are not merged.
32
+
33
+ The repository must be configured as below so that nothing can be merged without going through the queue.
34
+
35
+ ### Mergify
36
+
37
+ Install the [Mergify GitHub App](https://github.com/apps/mergify) and give it access to this repository.
38
+
39
+ ### Pull request settings
40
+
41
+ In **Settings → General → Pull Requests**:
42
+ * Allow squash merging only (untick merge commits and rebase merging), matching the queue's merge method.
43
+ * Untick **Allow auto-merge**, because GitHub's own auto-merge merges outside the queue.
44
+ * Tick **Automatically delete head branches**.${codeScanningSettings}
45
+
46
+ ### Branch ruleset
47
+
48
+ In **Settings → Rules → Rulesets**, create a branch ruleset with enforcement **Active** that targets the default branch, and set:
49
+ * **Bypass list**: the **Mergify** app only, in **Exempt** mode. Do not add admins or other roles, as anyone on this list can merge without the queue.
50
+ * **Restrict updates**: only bypass actors can update the branch, so pull requests cannot be merged from the GitHub UI or CLI and commits cannot be pushed directly.
51
+ * **Restrict deletions** and **Block force pushes**.
52
+ * **Require a pull request before merging**, with ${approvals}.
53
+ * **Require status checks to pass**, listing ${statusChecks}. Leave **Require branches to be up to date before merging** unticked, as the queue already updates and retests each pull request.${codeScanningRule}
54
+
55
+ Do not enable GitHub's own **Require merge queue** rule, as it competes with Mergify.
56
+
57
+ If the queue is unavailable and a change has to be merged, add yourself to the bypass list temporarily and remove yourself afterwards.${soleMaintainer}`;
58
+ }
4
59
  function configureMergify(project, options = {}) {
5
60
  const mergify = project.github?.mergify;
6
61
  if (!mergify) {
7
62
  return;
8
63
  }
9
64
  const buildJobIds = project.buildWorkflow?.buildJobIds ?? [];
65
+ project.autoMerge?.addConditions('-draft');
66
+ // Mergify is exempt from the ruleset's code scanning rule, so the queue enforces it instead
67
+ const codeScanning = project.components.some((c) => c instanceof codeql_1.CodeQl);
68
+ if (codeScanning) {
69
+ project.autoMerge?.addConditions(`status-success=${codeql_1.CodeQl.CHECK_NAME}`);
70
+ }
10
71
  mergify.addRule({
11
72
  name: 'Automatic approval for projen upgrade pull requests',
12
73
  conditions: [
@@ -30,5 +91,6 @@ function configureMergify(project, options = {}) {
30
91
  },
31
92
  });
32
93
  project.tryFindObjectFile('.mergify.yml')?.addOverride('merge_protections_settings.reporting_method', options.reportingMethod ?? 'deployments');
94
+ project.readme?.addSection('GitHub Configuration', githubConfigurationSection(buildJobIds, options.approvedReviews ?? 1, codeScanning));
33
95
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2lmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2dpdGh1Yi9tZXJnaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLDRDQXVDQztBQXZDRCxTQUFnQixnQkFBZ0IsQ0FDOUIsT0FBdUIsRUFDdkIsVUFBMEIsRUFBRTtJQUU1QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUN4QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUU3RCxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2QsSUFBSSxFQUFFLHFEQUFxRDtRQUMzRCxVQUFVLEVBQUU7WUFDVixVQUFVLE9BQU8sQ0FBQyxhQUFhLElBQUksbUJBQW1CLEVBQUU7WUFDeEQsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7U0FDbkQ7UUFDRCxPQUFPLEVBQUU7WUFDUCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLHdDQUF3QzthQUNsRDtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNkLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsVUFBVSxFQUFFLENBQUMsb0JBQW9CLENBQUM7UUFDbEMsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ25EO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUNwRCw2Q0FBNkMsRUFDN0MsT0FBTyxDQUFDLGVBQWUsSUFBSSxhQUFhLENBQ3pDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2l0aHViLCBQcm9qZWN0IH0gZnJvbSAncHJvamVuJztcblxuZXhwb3J0IGludGVyZmFjZSBNZXJnaWZ5T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2lnblVzZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcmVwb3J0aW5nTWV0aG9kPzogc3RyaW5nO1xuICAvKipcbiAgICogQXV0aG9yIG9mIHRoZSBwcm9qZW4gdXBncmFkZSBwdWxsIHJlcXVlc3RzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgYXBwcm92ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgJ2VuZG9yLXByb2plbltib3RdJ1xuICAgKi9cbiAgcmVhZG9ubHkgdXBncmFkZUF1dGhvcj86IHN0cmluZztcbn1cblxudHlwZSBNZXJnaWZ5UHJvamVjdCA9IFByb2plY3QgJiB7XG4gIHJlYWRvbmx5IGdpdGh1Yj86IGdpdGh1Yi5HaXRIdWI7XG4gIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c/OiB7XG4gICAgcmVhZG9ubHkgYnVpbGRKb2JJZHM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZU1lcmdpZnkoXG4gIHByb2plY3Q6IE1lcmdpZnlQcm9qZWN0LFxuICBvcHRpb25zOiBNZXJnaWZ5T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lcmdpZnkgPSBwcm9qZWN0LmdpdGh1Yj8ubWVyZ2lmeTtcbiAgaWYgKCFtZXJnaWZ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnVpbGRKb2JJZHMgPSBwcm9qZWN0LmJ1aWxkV29ya2Zsb3c/LmJ1aWxkSm9iSWRzID8/IFtdO1xuXG4gIG1lcmdpZnkuYWRkUnVsZSh7XG4gICAgbmFtZTogJ0F1dG9tYXRpYyBhcHByb3ZhbCBmb3IgcHJvamVuIHVwZ3JhZGUgcHVsbCByZXF1ZXN0cycsXG4gICAgY29uZGl0aW9uczogW1xuICAgICAgYGF1dGhvcj0ke29wdGlvbnMudXBncmFkZUF1dGhvciA/PyAnZW5kb3ItcHJvamVuW2JvdF0nfWAsXG4gICAgICAuLi5idWlsZEpvYklkcy5tYXAoKGlkKSA9PiBgc3RhdHVzLXN1Y2Nlc3M9JHtpZH1gKSxcbiAgICBdLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHJldmlldzoge1xuICAgICAgICB0eXBlOiAnQVBQUk9WRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBdXRvbWF0aWNhbGx5IGFwcHJvdmluZyBwcm9qZW4gdXBncmFkZScsXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIG1lcmdpZnkuYWRkUnVsZSh7XG4gICAgbmFtZTogJ0Fzc2lnbiBQUiB3aGVuIGNoZWNrIGZhaWxzJyxcbiAgICBjb25kaXRpb25zOiBbJyNjaGVjay1mYWlsdXJlID4gMCddLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIGFzc2lnbjoge1xuICAgICAgICBhZGRfdXNlcnM6IG9wdGlvbnMuYXNzaWduVXNlcnMgPz8gWydkYXZlc2hlcGhlcmQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgcHJvamVjdC50cnlGaW5kT2JqZWN0RmlsZSgnLm1lcmdpZnkueW1sJyk/LmFkZE92ZXJyaWRlKFxuICAgICdtZXJnZV9wcm90ZWN0aW9uc19zZXR0aW5ncy5yZXBvcnRpbmdfbWV0aG9kJyxcbiAgICBvcHRpb25zLnJlcG9ydGluZ01ldGhvZCA/PyAnZGVwbG95bWVudHMnLFxuICApO1xufVxuIl19
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2lmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2dpdGh1Yi9tZXJnaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkZBLDRDQXdEQztBQWxKRCxxQ0FBa0M7QUErQmxDLFNBQVMsMEJBQTBCLENBQ2pDLGNBQTZCLEVBQzdCLGVBQXVCLEVBQ3ZCLFlBQXFCO0lBRXJCLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxNQUFNO1FBQ3hDLENBQUMsQ0FBQyw2Q0FBNkM7WUFDN0MsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsR0FBRztRQUNMLENBQUMsQ0FBQyx3R0FBd0csQ0FBQztJQUM3RyxNQUFNLFNBQVMsR0FBRyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLHFCQUFxQixDQUFDO0lBQzFHLE1BQU0sTUFBTSxHQUFHLGVBQWU7UUFDNUIsQ0FBQyxDQUFDLHFEQUFxRDtRQUN2RCxDQUFDLENBQUMsb0NBQW9DLENBQUM7SUFDekMsTUFBTSxjQUFjLEdBQUcsZUFBZTtRQUNwQyxDQUFDLENBQUM7OzBRQUVvUTtRQUN0USxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsTUFBTSxvQkFBb0IsR0FBRyxZQUFZO1FBQ3ZDLENBQUMsQ0FBQzs7Ozt1WEFJaVgsZUFBTSxDQUFDLFVBQVUsNkhBQTZIO1FBQ2pnQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZO1FBQ25DLENBQUMsQ0FBQztvTkFDOE0sZUFBTSxDQUFDLFVBQVUsbUJBQW1CO1FBQ3BQLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxPQUFPLG1IQUFtSCxNQUFNOzs7Ozs7Ozs7Ozs7O2dEQWFsRixvQkFBb0I7Ozs7Ozs7O29EQVFoQixTQUFTOytDQUNkLFlBQVkscUlBQXFJLGdCQUFnQjs7Ozt3SUFJeEUsY0FBYyxFQUFFLENBQUM7QUFDekosQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUM5QixPQUF1QixFQUN2QixVQUEwQixFQUFFO0lBRTVCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxXQUFXLElBQUksRUFBRSxDQUFDO0lBRTdELE9BQU8sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTNDLDRGQUE0RjtJQUM1RixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLGVBQU0sQ0FBQyxDQUFDO0lBQ3pFLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsa0JBQWtCLGVBQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ2QsSUFBSSxFQUFFLHFEQUFxRDtRQUMzRCxVQUFVLEVBQUU7WUFDVixVQUFVLE9BQU8sQ0FBQyxhQUFhLElBQUksbUJBQW1CLEVBQUU7WUFDeEQsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7U0FDbkQ7UUFDRCxPQUFPLEVBQUU7WUFDUCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsT0FBTyxFQUFFLHdDQUF3QzthQUNsRDtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNkLElBQUksRUFBRSw0QkFBNEI7UUFDbEMsVUFBVSxFQUFFLENBQUMsb0JBQW9CLENBQUM7UUFDbEMsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ25EO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUNwRCw2Q0FBNkMsRUFDN0MsT0FBTyxDQUFDLGVBQWUsSUFBSSxhQUFhLENBQ3pDLENBQUM7SUFFRixPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FDeEIsc0JBQXNCLEVBQ3RCLDBCQUEwQixDQUN4QixXQUFXLEVBQ1gsT0FBTyxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQzVCLFlBQVksQ0FDYixDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2l0aHViLCBQcm9qZWN0IH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IENvZGVRbCB9IGZyb20gJy4vY29kZXFsJztcbmltcG9ydCB7IFJlYWRtZSB9IGZyb20gJy4uL3JlYWRtZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2lmeU9wdGlvbnMge1xuICAvKipcbiAgICogTnVtYmVyIG9mIGFwcHJvdmluZyByZXZpZXdzIHRoZSBtZXJnZSBxdWV1ZSB3YWl0cyBmb3IsIHdoaWNoIHNob3VsZCBtYXRjaFxuICAgKiBgYXV0b01lcmdlT3B0aW9ucy5hcHByb3ZlZFJldmlld3NgLiBVc2UgMCBmb3IgYSByZXBvc2l0b3J5IHdpdGggYSBzaW5nbGVcbiAgICogbWFpbnRhaW5lciwgd2hvIGNhbm5vdCBhcHByb3ZlIHRoZWlyIG93biBwdWxsIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBhcHByb3ZlZFJldmlld3M/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGFzc2lnblVzZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcmVwb3J0aW5nTWV0aG9kPzogc3RyaW5nO1xuICAvKipcbiAgICogQXV0aG9yIG9mIHRoZSBwcm9qZW4gdXBncmFkZSBwdWxsIHJlcXVlc3RzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgYXBwcm92ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgJ2VuZG9yLXByb2plbltib3RdJ1xuICAgKi9cbiAgcmVhZG9ubHkgdXBncmFkZUF1dGhvcj86IHN0cmluZztcbn1cblxudHlwZSBNZXJnaWZ5UHJvamVjdCA9IFByb2plY3QgJiB7XG4gIHJlYWRvbmx5IGF1dG9NZXJnZT86IGdpdGh1Yi5BdXRvTWVyZ2U7XG4gIHJlYWRvbmx5IGdpdGh1Yj86IGdpdGh1Yi5HaXRIdWI7XG4gIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c/OiB7XG4gICAgcmVhZG9ubHkgYnVpbGRKb2JJZHM/OiBBcnJheTxzdHJpbmc+O1xuICB9O1xuICByZWFkb25seSByZWFkbWU/OiBSZWFkbWU7XG59O1xuXG5mdW5jdGlvbiBnaXRodWJDb25maWd1cmF0aW9uU2VjdGlvbihcbiAgcmVxdWlyZWRDaGVja3M6IEFycmF5PHN0cmluZz4sXG4gIGFwcHJvdmVkUmV2aWV3czogbnVtYmVyLFxuICBjb2RlU2Nhbm5pbmc6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGF0dXNDaGVja3MgPSByZXF1aXJlZENoZWNrcy5sZW5ndGhcbiAgICA/ICd0aGUgY2hlY2tzIHRoYXQgYC5tZXJnaWZ5LnltbGAgd2FpdHMgZm9yOiBgJyArXG4gICAgICByZXF1aXJlZENoZWNrcy5qb2luKCdgLCBgJykgK1xuICAgICAgJ2AnXG4gICAgOiAnYW55IENJIGNoZWNrcyBhZGRlZCB0byB0aGUgcHJvamVjdCAobm9uZSBhcmUgY29uZmlndXJlZCB5ZXQpLCBrZWVwaW5nIHRoZW0gaW4gc3luYyB3aXRoIGAubWVyZ2lmeS55bWxgJztcbiAgY29uc3QgYXBwcm92YWxzID0gYXBwcm92ZWRSZXZpZXdzID09PSAxID8gJzEgcmVxdWlyZWQgYXBwcm92YWwnIDogYCR7YXBwcm92ZWRSZXZpZXdzfSByZXF1aXJlZCBhcHByb3ZhbHNgO1xuICBjb25zdCBxdWV1ZWQgPSBhcHByb3ZlZFJldmlld3NcbiAgICA/ICdPbmNlIGEgcHVsbCByZXF1ZXN0IGlzIGFwcHJvdmVkIGFuZCBpdHMgY2hlY2tzIHBhc3MnXG4gICAgOiAnT25jZSBhIHB1bGwgcmVxdWVzdFxcJ3MgY2hlY2tzIHBhc3MnO1xuICBjb25zdCBzb2xlTWFpbnRhaW5lciA9IGFwcHJvdmVkUmV2aWV3c1xuICAgID8gYFxuXG5BIHJlcG9zaXRvcnkgd2l0aCBhIHNpbmdsZSBtYWludGFpbmVyLCB3aG8gY2Fubm90IGFwcHJvdmUgdGhlaXIgb3duIHB1bGwgcmVxdWVzdHMsIHNob3VsZCBzZXQgXFxgYXV0b01lcmdlT3B0aW9uczogeyBhcHByb3ZlZFJldmlld3M6IDAgfVxcYCBpbiBcXGAucHJvamVucmMudHNcXGAgYW5kIHNldCB0aGUgcnVsZXNldCdzIHJlcXVpcmVkIGFwcHJvdmFscyB0byAwLiBQdWxsIHJlcXVlc3RzIGFyZSB0aGVuIG1lcmdlZCBhcyBzb29uIGFzIHRoZWlyIGNoZWNrcyBwYXNzLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb2RlU2Nhbm5pbmdTZXR0aW5ncyA9IGNvZGVTY2FubmluZ1xuICAgID8gYFxuXG4jIyMgQ29kZSBzY2FubmluZ1xuXG5Db2RlUUwgcnVucyBmcm9tIFxcYC5naXRodWIvd29ya2Zsb3dzL2NvZGVxbC55bWxcXGAsIHdoaWNoIGlzIG1hbmFnZWQgYnkgcHJvamVuLiBJbiAqKlNldHRpbmdzIOKGkiBBZHZhbmNlZCBTZWN1cml0eSoqLCBsZWF2ZSBDb2RlUUwgKipEZWZhdWx0IHNldHVwKiogb2ZmLCBiZWNhdXNlIGl0IGNhbm5vdCBydW4gYWxvbmdzaWRlIHRoaXMgd29ya2Zsb3cuIFVuZGVyICoqUHJvdGVjdGlvbiBydWxlcyoqLCBrZWVwIHRoZSAqKkNoZWNrIHJ1biBmYWlsdXJlIHRocmVzaG9sZCoqIGF0ICoqSGlnaCBvciBoaWdoZXIqKiBmb3Igc2VjdXJpdHkgYWxlcnRzIGFuZCAqKkVycm9ycyoqIGZvciBvdGhlciBhbGVydHMsIGFzIHRoaXMgZGVjaWRlcyB3aGV0aGVyIHRoZSBcXGAke0NvZGVRbC5DSEVDS19OQU1FfVxcYCBjaGVjayBmYWlscy4gUHJpdmF0ZSByZXBvc2l0b3JpZXMgYWxzbyBuZWVkIEdpdEh1YiBDb2RlIFNlY3VyaXR5IGVuYWJsZWQgdGhlcmUgZm9yIGNvZGUgc2Nhbm5pbmcgcmVzdWx0cyB0byBiZSB1cGxvYWRlZC5gXG4gICAgOiAnJztcbiAgY29uc3QgY29kZVNjYW5uaW5nUnVsZSA9IGNvZGVTY2FubmluZ1xuICAgID8gYFxuKiAqKlJlcXVpcmUgY29kZSBzY2FubmluZyByZXN1bHRzKiosIHdpdGggdGhlIHRvb2wgKipDb2RlUUwqKiwgc2VjdXJpdHkgYWxlcnRzIHNldCB0byAqKkhpZ2ggb3IgaGlnaGVyKiogYW5kIGFsZXJ0cyBzZXQgdG8gKipFcnJvcnMqKi4gTWVyZ2lmeSBpcyBleGVtcHQgZnJvbSB0aGlzIHJ1bGUsIHNvIFxcYC5tZXJnaWZ5LnltbFxcYCBhbHNvIHdhaXRzIGZvciB0aGUgXFxgJHtDb2RlUWwuQ0hFQ0tfTkFNRX1cXGAgY2hlY2sgaW5zdGVhZC5gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbGwgcHVsbCByZXF1ZXN0cyBhcmUgbWVyZ2VkIGJ5IHRoZSBbTWVyZ2lmeV0oaHR0cHM6Ly9tZXJnaWZ5LmNvbSkgbWVyZ2UgcXVldWUsIGNvbmZpZ3VyZWQgaW4gXFxgLm1lcmdpZnkueW1sXFxgLiAke3F1ZXVlZH0sIE1lcmdpZnkgcXVldWVzIGl0LCBicmluZ3MgaXQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBkZWZhdWx0IGJyYW5jaCwgd2FpdHMgZm9yIHRoZSBjaGVja3MgYWdhaW4gYW5kIHNxdWFzaCBtZXJnZXMgaXQuIERyYWZ0IHB1bGwgcmVxdWVzdHMgYW5kIHRob3NlIGxhYmVsbGVkIFxcYGRvLW5vdC1tZXJnZVxcYCBhcmUgbm90IG1lcmdlZC5cblxuVGhlIHJlcG9zaXRvcnkgbXVzdCBiZSBjb25maWd1cmVkIGFzIGJlbG93IHNvIHRoYXQgbm90aGluZyBjYW4gYmUgbWVyZ2VkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgcXVldWUuXG5cbiMjIyBNZXJnaWZ5XG5cbkluc3RhbGwgdGhlIFtNZXJnaWZ5IEdpdEh1YiBBcHBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBzL21lcmdpZnkpIGFuZCBnaXZlIGl0IGFjY2VzcyB0byB0aGlzIHJlcG9zaXRvcnkuXG5cbiMjIyBQdWxsIHJlcXVlc3Qgc2V0dGluZ3NcblxuSW4gKipTZXR0aW5ncyDihpIgR2VuZXJhbCDihpIgUHVsbCBSZXF1ZXN0cyoqOlxuKiBBbGxvdyBzcXVhc2ggbWVyZ2luZyBvbmx5ICh1bnRpY2sgbWVyZ2UgY29tbWl0cyBhbmQgcmViYXNlIG1lcmdpbmcpLCBtYXRjaGluZyB0aGUgcXVldWUncyBtZXJnZSBtZXRob2QuXG4qIFVudGljayAqKkFsbG93IGF1dG8tbWVyZ2UqKiwgYmVjYXVzZSBHaXRIdWIncyBvd24gYXV0by1tZXJnZSBtZXJnZXMgb3V0c2lkZSB0aGUgcXVldWUuXG4qIFRpY2sgKipBdXRvbWF0aWNhbGx5IGRlbGV0ZSBoZWFkIGJyYW5jaGVzKiouJHtjb2RlU2Nhbm5pbmdTZXR0aW5nc31cblxuIyMjIEJyYW5jaCBydWxlc2V0XG5cbkluICoqU2V0dGluZ3Mg4oaSIFJ1bGVzIOKGkiBSdWxlc2V0cyoqLCBjcmVhdGUgYSBicmFuY2ggcnVsZXNldCB3aXRoIGVuZm9yY2VtZW50ICoqQWN0aXZlKiogdGhhdCB0YXJnZXRzIHRoZSBkZWZhdWx0IGJyYW5jaCwgYW5kIHNldDpcbiogKipCeXBhc3MgbGlzdCoqOiB0aGUgKipNZXJnaWZ5KiogYXBwIG9ubHksIGluICoqRXhlbXB0KiogbW9kZS4gRG8gbm90IGFkZCBhZG1pbnMgb3Igb3RoZXIgcm9sZXMsIGFzIGFueW9uZSBvbiB0aGlzIGxpc3QgY2FuIG1lcmdlIHdpdGhvdXQgdGhlIHF1ZXVlLlxuKiAqKlJlc3RyaWN0IHVwZGF0ZXMqKjogb25seSBieXBhc3MgYWN0b3JzIGNhbiB1cGRhdGUgdGhlIGJyYW5jaCwgc28gcHVsbCByZXF1ZXN0cyBjYW5ub3QgYmUgbWVyZ2VkIGZyb20gdGhlIEdpdEh1YiBVSSBvciBDTEkgYW5kIGNvbW1pdHMgY2Fubm90IGJlIHB1c2hlZCBkaXJlY3RseS5cbiogKipSZXN0cmljdCBkZWxldGlvbnMqKiBhbmQgKipCbG9jayBmb3JjZSBwdXNoZXMqKi5cbiogKipSZXF1aXJlIGEgcHVsbCByZXF1ZXN0IGJlZm9yZSBtZXJnaW5nKiosIHdpdGggJHthcHByb3ZhbHN9LlxuKiAqKlJlcXVpcmUgc3RhdHVzIGNoZWNrcyB0byBwYXNzKiosIGxpc3RpbmcgJHtzdGF0dXNDaGVja3N9LiBMZWF2ZSAqKlJlcXVpcmUgYnJhbmNoZXMgdG8gYmUgdXAgdG8gZGF0ZSBiZWZvcmUgbWVyZ2luZyoqIHVudGlja2VkLCBhcyB0aGUgcXVldWUgYWxyZWFkeSB1cGRhdGVzIGFuZCByZXRlc3RzIGVhY2ggcHVsbCByZXF1ZXN0LiR7Y29kZVNjYW5uaW5nUnVsZX1cblxuRG8gbm90IGVuYWJsZSBHaXRIdWIncyBvd24gKipSZXF1aXJlIG1lcmdlIHF1ZXVlKiogcnVsZSwgYXMgaXQgY29tcGV0ZXMgd2l0aCBNZXJnaWZ5LlxuXG5JZiB0aGUgcXVldWUgaXMgdW5hdmFpbGFibGUgYW5kIGEgY2hhbmdlIGhhcyB0byBiZSBtZXJnZWQsIGFkZCB5b3Vyc2VsZiB0byB0aGUgYnlwYXNzIGxpc3QgdGVtcG9yYXJpbHkgYW5kIHJlbW92ZSB5b3Vyc2VsZiBhZnRlcndhcmRzLiR7c29sZU1haW50YWluZXJ9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZU1lcmdpZnkoXG4gIHByb2plY3Q6IE1lcmdpZnlQcm9qZWN0LFxuICBvcHRpb25zOiBNZXJnaWZ5T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lcmdpZnkgPSBwcm9qZWN0LmdpdGh1Yj8ubWVyZ2lmeTtcbiAgaWYgKCFtZXJnaWZ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYnVpbGRKb2JJZHMgPSBwcm9qZWN0LmJ1aWxkV29ya2Zsb3c/LmJ1aWxkSm9iSWRzID8/IFtdO1xuXG4gIHByb2plY3QuYXV0b01lcmdlPy5hZGRDb25kaXRpb25zKCctZHJhZnQnKTtcblxuICAvLyBNZXJnaWZ5IGlzIGV4ZW1wdCBmcm9tIHRoZSBydWxlc2V0J3MgY29kZSBzY2FubmluZyBydWxlLCBzbyB0aGUgcXVldWUgZW5mb3JjZXMgaXQgaW5zdGVhZFxuICBjb25zdCBjb2RlU2Nhbm5pbmcgPSBwcm9qZWN0LmNvbXBvbmVudHMuc29tZSgoYykgPT4gYyBpbnN0YW5jZW9mIENvZGVRbCk7XG4gIGlmIChjb2RlU2Nhbm5pbmcpIHtcbiAgICBwcm9qZWN0LmF1dG9NZXJnZT8uYWRkQ29uZGl0aW9ucyhgc3RhdHVzLXN1Y2Nlc3M9JHtDb2RlUWwuQ0hFQ0tfTkFNRX1gKTtcbiAgfVxuXG4gIG1lcmdpZnkuYWRkUnVsZSh7XG4gICAgbmFtZTogJ0F1dG9tYXRpYyBhcHByb3ZhbCBmb3IgcHJvamVuIHVwZ3JhZGUgcHVsbCByZXF1ZXN0cycsXG4gICAgY29uZGl0aW9uczogW1xuICAgICAgYGF1dGhvcj0ke29wdGlvbnMudXBncmFkZUF1dGhvciA/PyAnZW5kb3ItcHJvamVuW2JvdF0nfWAsXG4gICAgICAuLi5idWlsZEpvYklkcy5tYXAoKGlkKSA9PiBgc3RhdHVzLXN1Y2Nlc3M9JHtpZH1gKSxcbiAgICBdLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHJldmlldzoge1xuICAgICAgICB0eXBlOiAnQVBQUk9WRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBdXRvbWF0aWNhbGx5IGFwcHJvdmluZyBwcm9qZW4gdXBncmFkZScsXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIG1lcmdpZnkuYWRkUnVsZSh7XG4gICAgbmFtZTogJ0Fzc2lnbiBQUiB3aGVuIGNoZWNrIGZhaWxzJyxcbiAgICBjb25kaXRpb25zOiBbJyNjaGVjay1mYWlsdXJlID4gMCddLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIGFzc2lnbjoge1xuICAgICAgICBhZGRfdXNlcnM6IG9wdGlvbnMuYXNzaWduVXNlcnMgPz8gWydkYXZlc2hlcGhlcmQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgcHJvamVjdC50cnlGaW5kT2JqZWN0RmlsZSgnLm1lcmdpZnkueW1sJyk/LmFkZE92ZXJyaWRlKFxuICAgICdtZXJnZV9wcm90ZWN0aW9uc19zZXR0aW5ncy5yZXBvcnRpbmdfbWV0aG9kJyxcbiAgICBvcHRpb25zLnJlcG9ydGluZ01ldGhvZCA/PyAnZGVwbG95bWVudHMnLFxuICApO1xuXG4gIHByb2plY3QucmVhZG1lPy5hZGRTZWN0aW9uKFxuICAgICdHaXRIdWIgQ29uZmlndXJhdGlvbicsXG4gICAgZ2l0aHViQ29uZmlndXJhdGlvblNlY3Rpb24oXG4gICAgICBidWlsZEpvYklkcyxcbiAgICAgIG9wdGlvbnMuYXBwcm92ZWRSZXZpZXdzID8/IDEsXG4gICAgICBjb2RlU2Nhbm5pbmcsXG4gICAgKSxcbiAgKTtcbn1cbiJdfQ==
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Section = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  class Section {
6
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-modules.Section", version: "3.0.2" };
6
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen-modules.Section", version: "3.2.0" };
7
7
  options;
8
8
  constructor(options) {
9
9
  this.options = options;