@xpertss/projen-types 0.0.21 → 0.0.22
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 +445 -309
- package/API.md +1453 -385
- package/README.md +40 -16
- package/lib/actions/action-build-workflow.js +1 -1
- package/lib/actions/action-dogfood-workflow.js +1 -1
- package/lib/actions/action-sonar-workflow.d.ts +10 -29
- package/lib/actions/action-sonar-workflow.js +9 -58
- package/lib/actions/github-action-project.d.ts +5 -22
- package/lib/actions/github-action-project.js +16 -12
- package/lib/cdk/app-runtime-scaffold.js +1 -1
- package/lib/cdk/cdk-app-project.js +1 -1
- package/lib/cdk/cdk-infra-project.js +1 -1
- package/lib/cdk/cdk-typescript-base.d.ts +3 -0
- package/lib/cdk/cdk-typescript-base.js +14 -2
- package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
- package/lib/cdk/components/edge-networking-constructs.js +1 -1
- package/lib/cdk/database-component.js +1 -1
- package/lib/cdk/options.d.ts +2 -1
- package/lib/cdk/options.js +1 -1
- package/lib/common/projen-drift-check-workflow.js +1 -1
- package/lib/common/sonar-options.d.ts +29 -0
- package/lib/common/sonar-options.js +3 -0
- package/lib/common/sonar-workflow.d.ts +48 -0
- package/lib/common/sonar-workflow.js +75 -0
- package/lib/common/workflow-change-notice-workflow.js +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/java/components/cdk-deploy-hook.js +1 -1
- package/lib/java/components/code-index-workflow.js +1 -1
- package/lib/java/components/docker-publish.js +1 -1
- package/lib/java/components/flyway-migration.js +1 -1
- package/lib/java/components/github-packages-publish.js +1 -1
- package/lib/java/components/maven-central-publish.js +1 -1
- package/lib/java/components/maven-upgrade-report.js +1 -1
- package/lib/java/java-app-project.js +1 -1
- package/lib/java/java-library-project.js +1 -1
- package/lib/java/java-maven-base.d.ts +6 -2
- package/lib/java/java-maven-base.js +18 -14
- package/lib/java/java-service-project.js +1 -1
- package/lib/java/java-spring-boot-project.js +1 -1
- package/lib/java/maven/maven-module.js +1 -1
- package/lib/java/maven/maven-pom.js +1 -1
- package/lib/java/options.d.ts +2 -3
- package/lib/java/options.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,6 +36,7 @@ All project types:
|
|
|
36
36
|
- run a **drift check** in PR builds - a job that re-runs projen and fails if generated files were hand-edited. Edit `.projenrc.ts`, then run `npx projen`; never edit generated files directly.
|
|
37
37
|
- use the GitHub secret `PROJEN_GITHUB_TOKEN` (a fine-grained PAT) for projen's automation. Override with `gheTokenSecret`.
|
|
38
38
|
- make all publishing/deploying **manual** (workflow_dispatch) rather than on every merge.
|
|
39
|
+
- offer an opt-in SonarCloud scan (`sonar.yml`) on any type via `sonarHostUrl` (see [SonarCloud (opt-in)](#sonarcloud-opt-in)).
|
|
39
40
|
|
|
40
41
|
## Getting started
|
|
41
42
|
|
|
@@ -60,9 +61,9 @@ installs dependencies. The type names `projen new` accepts are `cdk_infra`,
|
|
|
60
61
|
`cdk_app`, `java_maven`, `java_library`, `java_app`, `java_spring_boot`,
|
|
61
62
|
`java_service` and `git_hub_action`; pass a bogus one to have it list them.
|
|
62
63
|
Required options become flags: `--name` for every type, plus
|
|
63
|
-
`--group-id`/`--artifact-id` (Java)
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
`--group-id`/`--artifact-id` (Java). Any other plainly-typed option can be
|
|
65
|
+
passed the same way - `--sonar-host-url` (opt-in Sonar, all types),
|
|
66
|
+
`--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
|
|
66
67
|
`--docker-registry ghcr.io`, `--no-use-flyway`, and so on. Modules can't be
|
|
67
68
|
passed on the command line; add them to `.projenrc.ts` afterwards (see
|
|
68
69
|
[JavaMavenProject](#javamavenproject)).
|
|
@@ -329,7 +330,7 @@ You get:
|
|
|
329
330
|
- **exact versions only**: a range such as `^1`, `~1.2` or `[1,2)` fails the synth
|
|
330
331
|
- the compiler level, enforcer rule and JUnit line all follow `javaVersion`
|
|
331
332
|
- one Maven run per build. `npx projen build` synthesizes, then runs `mvn -B verify`: compile, unit tests (surefire), package, and `*IT` integration tests (failsafe). There is no `mvn deploy` and no `dist/`.
|
|
332
|
-
- `.github/workflows/build.yml`: a PR build that installs the pinned Node toolchain (`npm ci`) and the project's JDK (`actions/setup-java`, Maven cache), then runs `npx projen build
|
|
333
|
+
- `.github/workflows/build.yml`: a PR build that installs the pinned Node toolchain (`npm ci`) and the project's JDK (`actions/setup-java`, Maven cache), then runs `npx projen build`. The Maven build itself never runs a Sonar step - SonarCloud scanning is a separate, opt-in `sonar.yml` (set `sonarHostUrl`). See [Adding CI jobs](#adding-ci-jobs-to-a-java-project) and [SonarCloud (opt-in)](#sonarcloud-opt-in).
|
|
333
334
|
- `.github/workflows/upgrade.yml`: a nightly (03:00 UTC) **report** of available dependency and plugin updates in the job summary. It changes nothing, because every version comes from `.projenrc.ts`; apply an update there. Turn it off with `upgradeWorkflow: false`. The same report runs locally with `npx projen upgrade`.
|
|
334
335
|
- the projen drift check, `LICENSE` (MIT by default), `.editorconfig`, and a generated `package.json` that pins the projen toolchain exactly.
|
|
335
336
|
- no sample code, unless `sample: true` on a single-module project.
|
|
@@ -353,7 +354,7 @@ const project = new JavaLibraryProject({
|
|
|
353
354
|
groupId: 'org.xpertss',
|
|
354
355
|
artifactId: 'common-utils',
|
|
355
356
|
version: '1.0.0',
|
|
356
|
-
|
|
357
|
+
sonarHostUrl: 'https://sonarcloud.io', // opt-in: adds sonar.yml (see SonarCloud)
|
|
357
358
|
mavenCentralOidc: true,
|
|
358
359
|
});
|
|
359
360
|
|
|
@@ -491,7 +492,7 @@ import { GitHubActionProject } from '@xpertss/projen-types';
|
|
|
491
492
|
const project = new GitHubActionProject({
|
|
492
493
|
name: 'auto-commit',
|
|
493
494
|
description: 'Stage a folder and, only if it changed, commit and push it',
|
|
494
|
-
sonarHostUrl: 'https://sonarcloud.io', //
|
|
495
|
+
sonarHostUrl: 'https://sonarcloud.io', // optional - set it to add sonar.yml (see SonarCloud)
|
|
495
496
|
sonarOrganization: 'xpertss', // default - your SonarCloud org key
|
|
496
497
|
dogfood: {
|
|
497
498
|
// Two scenario steps: the "changed" path and the "no-op" path are both
|
|
@@ -538,14 +539,14 @@ project.synth();
|
|
|
538
539
|
You get:
|
|
539
540
|
|
|
540
541
|
- `action.yml` and `auto-commit.sh` are hand-written - this type only lints their content via `build.yml`'s shellcheck/yamllint/actionlint checks.
|
|
541
|
-
- `.github/workflows/build.yml` - lint gate: `apt`-installed shellcheck/yamllint plus a pinned, SHA-256-verified `actionlint` release binary. Gates `main` alongside `sonar.yml
|
|
542
|
+
- `.github/workflows/build.yml` - lint gate: `apt`-installed shellcheck/yamllint plus a pinned, SHA-256-verified `actionlint` release binary. Gates `main` (alongside `sonar.yml` when Sonar is enabled).
|
|
542
543
|
- `.github/workflows/test-dogfood.yml` - runs the `dogfood.scenario` steps above against this repo's own `action.yml` (via `uses: ./`), then the shared `cleanup`, on `workflow_dispatch`, every `pull_request`, and nightly. Omit `dogfood` and the workflow still exists, with one step that fails on every PR until you declare a scenario - AD-001 allows a dogfood to be missing loudly, never silently. A *partial* `dogfood` (a scenario with no cleanup) is a synth error.
|
|
543
|
-
- `.github/workflows/sonar.yml` - SonarCloud scan via the Scanner CLI (the quality gate blocks the PR), scanning `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly.
|
|
544
|
+
- `.github/workflows/sonar.yml` - SonarCloud scan via the Scanner CLI (the quality gate blocks the PR), scanning `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly. Opt-in: generated only when `sonarHostUrl` is set (see [SonarCloud (opt-in)](#sonarcloud-opt-in)).
|
|
544
545
|
- `.github/workflows/release.yml` - `feat:`/`fix:` commits on `main` bump the version, tag `vX.Y.Z`, and create a GitHub Release.
|
|
545
546
|
- `.github/workflows/projen-drift-check.yml` and `workflow-change-notice.yml` - drift detection and a change notice, always included.
|
|
546
547
|
- `package.json` (**private**, version source only), `.yamllint`, `LICENSE` (MIT by default), and a `README.md` template - all regenerated by `npx projen`.
|
|
547
548
|
|
|
548
|
-
Needs
|
|
549
|
+
Needs `PROJEN_GITHUB_TOKEN` (used for automated PR comments), and `SONAR_TOKEN` only when Sonar is enabled (see [SonarCloud (opt-in)](#sonarcloud-opt-in)). Onboard a brand-new action repo by running the `projen new` command above first (see [Getting started](#getting-started)), then replace the generated `.projenrc.ts` with the one above and run `npx projen`, then hand-write `action.yml`/`auto-commit.sh`/`test/fixtures/`. If you wrote the `.projenrc.ts` before running `projen new`, see [Starting from an existing `.projenrc.ts`](#starting-from-an-existing-projenrcts).
|
|
549
550
|
|
|
550
551
|
## Java version support
|
|
551
552
|
|
|
@@ -640,7 +641,7 @@ Java project types (`JavaMavenProjectOptions` and everything built on it - `Java
|
|
|
640
641
|
| `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
|
|
641
642
|
| `editorconfig` | `true` | Write a projen-managed `.editorconfig` (also on the CDK and action types) |
|
|
642
643
|
| `upgradeWorkflow` | `true` | Generate the nightly update report (`upgrade.yml`) |
|
|
643
|
-
|
|
|
644
|
+
| Sonar options | - | `sonarHostUrl`, `sonarOrganization`, `sonarTokenSecret`, `sonarPullRequestGate`, `sonarProjectKey` - SonarCloud is opt-in; see [SonarCloud (opt-in)](#sonarcloud-opt-in) |
|
|
644
645
|
| `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
|
|
645
646
|
| `springBootVersion` | newest Boot for `javaVersion` (Spring Boot types only) | Exact Spring Boot version: the BOM and `spring-boot-maven-plugin` |
|
|
646
647
|
| `cdkDeployTargetRepo` | - (service only; `deploy-cdk.yml` fails until set) | Companion CDK repo (`owner/repo`) whose `deploy.yml` the deploy hook dispatches |
|
|
@@ -692,10 +693,7 @@ Plain strings (`'dev'`) are shorthand for `{ name: 'dev' }`.
|
|
|
692
693
|
| --- | --- | --- |
|
|
693
694
|
| `name` | - (required) | Project name |
|
|
694
695
|
| `description` | - | One-line description; used in the default README template and recorded in the private `package.json` |
|
|
695
|
-
|
|
|
696
|
-
| `sonarOrganization` | `xpertss` | SonarCloud org key (`sonar.organization`); required by the Scanner CLI, not derived from the token |
|
|
697
|
-
| `sonarTokenSecret` | `SONAR_TOKEN` | GitHub secret holding the Sonar token |
|
|
698
|
-
| `sonarPullRequestGate` | `true` | Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate |
|
|
696
|
+
| Sonar options | - | `sonarHostUrl`, `sonarOrganization`, `sonarTokenSecret`, `sonarPullRequestGate`, `sonarProjectKey` - SonarCloud is opt-in; see [SonarCloud (opt-in)](#sonarcloud-opt-in) |
|
|
699
697
|
| `dogfood` | - (a `test-dogfood.yml` that fails until you declare one) | `ActionDogfoodOptions` - the scenario that exercises the action end-to-end via `uses: ./` |
|
|
700
698
|
| `license` | `MIT` | SPDX identifier for the generated `LICENSE` |
|
|
701
699
|
| `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
|
|
@@ -720,12 +718,38 @@ interface ActionDogfoodStep {
|
|
|
720
718
|
|
|
721
719
|
Most actions need exactly one `scenario` step. Actions with a re-run/no-op/idempotency behavior to verify (e.g. `auto-commit`'s no-op-on-no-change path, `create-pull-request`'s reuse-the-PR path) declare two - the second typically omits `fixtureSteps` so its invocation sees no new state, and its assertion checks the opposite outcome of the first. Reference an invocation's own outputs from a later assertion via `${{ steps.<id>.outputs.<name> }}`, using either the default slug or an explicit `id`.
|
|
722
720
|
|
|
721
|
+
## SonarCloud (opt-in)
|
|
722
|
+
|
|
723
|
+
SonarCloud is a shared, **opt-in** capability on every project type (CDK, Java, and GitHub Action). Set `sonarHostUrl` on any type and it generates a `.github/workflows/sonar.yml` that runs a pinned, SHA-256-verified Sonar Scanner CLI and blocks the PR on the quality gate. Omit it and no `sonar.yml` is generated. The Maven build itself never runs a Sonar step.
|
|
724
|
+
|
|
725
|
+
Shared options (accepted by the CDK types, every Java type, and `GitHubActionProject`):
|
|
726
|
+
|
|
727
|
+
| Option | Default | Description |
|
|
728
|
+
| --- | --- | --- |
|
|
729
|
+
| `sonarHostUrl` | - (required to enable) | URL of your SonarCloud instance (e.g. `https://sonarcloud.io`); must be reachable from github.com-hosted runners |
|
|
730
|
+
| `sonarOrganization` | `xpertss` | SonarCloud org key (`sonar.organization`); required by the Scanner CLI, not derived from the token |
|
|
731
|
+
| `sonarProjectKey` | `${sonarOrganization}_${name}` | `sonar.projectKey` - the org + project key SonarCloud uses (e.g. `xpertss_create-pull-request`) |
|
|
732
|
+
| `sonarTokenSecret` | `SONAR_TOKEN` | GitHub secret holding the Sonar token |
|
|
733
|
+
| `sonarPullRequestGate` | `true` | Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate |
|
|
734
|
+
|
|
735
|
+
Inclusions differ by type: a `GitHubActionProject` scans `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly (YAML and shell are not in Sonar's default-recognized set), while the CDK and Java types rely on Sonar's default inclusions for their languages.
|
|
736
|
+
|
|
737
|
+
```typescript
|
|
738
|
+
new CdkInfraProject({
|
|
739
|
+
name: 'my-infra',
|
|
740
|
+
environments: ['dev', 'prod'],
|
|
741
|
+
sonarHostUrl: 'https://sonarcloud.io', // adds sonar.yml
|
|
742
|
+
});
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
Requires the `SONAR_TOKEN` secret (rename it with `sonarTokenSecret`).
|
|
746
|
+
|
|
723
747
|
## Required GitHub secrets
|
|
724
748
|
|
|
725
749
|
| Secret | Used by | Notes |
|
|
726
750
|
| --- | --- | --- |
|
|
727
751
|
| `PROJEN_GITHUB_TOKEN` | all types | PAT for projen's self-mutation/automation; override via `gheTokenSecret` |
|
|
728
|
-
| `SONAR_TOKEN` |
|
|
752
|
+
| `SONAR_TOKEN` | any type with `sonarHostUrl` set | SonarCloud scan in `sonar.yml`; override the secret name via `sonarTokenSecret` |
|
|
729
753
|
| `DOCKER_USERNAME` / `DOCKER_PASSWORD` | `JavaServiceProject` | Docker image push |
|
|
730
754
|
| `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PASSPHRASE`, `MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD` | `JavaLibraryProject` without `mavenCentralOidc` | Not needed with OIDC trusted publishing |
|
|
731
755
|
|
|
@@ -780,7 +804,7 @@ The project types are composed from smaller components you can also attach to yo
|
|
|
780
804
|
| `CodeIndexWorkflow` | `JavaMavenProject` | Code index generation on push to `main` |
|
|
781
805
|
| `ActionBuildWorkflow` | `GitHubProject` | The `lint` task (shellcheck/yamllint/pinned actionlint) + `build.yml` |
|
|
782
806
|
| `ActionDogfoodWorkflow` | `GitHubProject` | `test-dogfood.yml` from an `ActionDogfoodOptions` scenario |
|
|
783
|
-
| `
|
|
807
|
+
| `SonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI); opt-in, shared by every type via `sonarHostUrl` |
|
|
784
808
|
|
|
785
809
|
Example - adding a Docker publish to a `JavaMavenProject` (`JavaServiceProject` is the packaged version of this, with Spring Boot):
|
|
786
810
|
|
|
@@ -20,7 +20,7 @@ const ACTIONLINT_SHA256 = '8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc
|
|
|
20
20
|
* the release build job, so the lint commands exist in exactly one place.
|
|
21
21
|
*/
|
|
22
22
|
class ActionBuildWorkflow extends projen_1.Component {
|
|
23
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.
|
|
23
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.22" };
|
|
24
24
|
task;
|
|
25
25
|
workflow;
|
|
26
26
|
constructor(scope) {
|
|
@@ -41,7 +41,7 @@ const UNCONFIGURED_STEPS = [
|
|
|
41
41
|
* error: if you wrote a scenario by hand, you can write its cleanup too.
|
|
42
42
|
*/
|
|
43
43
|
class ActionDogfoodWorkflow extends projen_1.Component {
|
|
44
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.
|
|
44
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.22" };
|
|
45
45
|
workflow;
|
|
46
46
|
constructor(scope, options) {
|
|
47
47
|
super(scope, 'ActionDogfoodWorkflow');
|
|
@@ -1,32 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* URL of the org's SonarCloud instance (e.g. `https://sonarcloud.io`).
|
|
5
|
-
* Required, no default - a guessed server is worse than a loud failure.
|
|
6
|
-
*/
|
|
7
|
-
readonly sonarHostUrl: string;
|
|
8
|
-
/**
|
|
9
|
-
* SonarCloud organization key (`sonar.organization`). Mandatory for the
|
|
10
|
-
* Scanner CLI on SonarCloud - it is not derived from the token, so a scan
|
|
11
|
-
* without it always fails.
|
|
12
|
-
* @default "xpertss"
|
|
13
|
-
*/
|
|
14
|
-
readonly sonarOrganization?: string;
|
|
15
|
-
/** @default "SONAR_TOKEN" */
|
|
16
|
-
readonly sonarTokenSecret?: string;
|
|
17
|
-
/**
|
|
18
|
-
* Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate.
|
|
19
|
-
* @default true
|
|
20
|
-
*/
|
|
21
|
-
readonly sonarPullRequestGate?: boolean;
|
|
22
|
-
}
|
|
1
|
+
import { github } from 'projen';
|
|
2
|
+
import { SonarWorkflow, SonarWorkflowOptions } from '../common/sonar-workflow';
|
|
23
3
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
4
|
+
* @deprecated Renamed to `SonarWorkflow` (now in `src/common/` and applied to
|
|
5
|
+
* every project type, not just actions). Use `SonarWorkflow` instead; this
|
|
6
|
+
* subclass is kept only so existing imports of `ActionSonarWorkflow` keep
|
|
7
|
+
* compiling. It behaves identically to `SonarWorkflow`.
|
|
28
8
|
*/
|
|
29
|
-
export declare class ActionSonarWorkflow extends
|
|
30
|
-
|
|
31
|
-
constructor(scope: github.GitHubProject, options: ActionSonarWorkflowOptions);
|
|
9
|
+
export declare class ActionSonarWorkflow extends SonarWorkflow {
|
|
10
|
+
constructor(scope: github.GitHubProject, options: SonarWorkflowOptions);
|
|
32
11
|
}
|
|
12
|
+
/** @deprecated Renamed to `SonarWorkflowOptions`. */
|
|
13
|
+
export type ActionSonarWorkflowOptions = SonarWorkflowOptions;
|
|
@@ -2,67 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ActionSonarWorkflow = void 0;
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
-
const
|
|
6
|
-
const workflow_purpose_1 = require("../common/workflow-purpose");
|
|
7
|
-
// Pinned release + verified SHA-256 (linux-x64) - upgrade is a reviewed diff
|
|
8
|
-
// of this constant, never a floating version (AD-001).
|
|
9
|
-
const SONAR_SCANNER_VERSION = '8.1.0.6389';
|
|
10
|
-
const SONAR_SCANNER_SHA256 = 'bb8f709f9cb73352f8d1260a3b3c506c0f41146754bc630762c126d795499d0b';
|
|
5
|
+
const sonar_workflow_1 = require("../common/sonar-workflow");
|
|
11
6
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
7
|
+
* @deprecated Renamed to `SonarWorkflow` (now in `src/common/` and applied to
|
|
8
|
+
* every project type, not just actions). Use `SonarWorkflow` instead; this
|
|
9
|
+
* subclass is kept only so existing imports of `ActionSonarWorkflow` keep
|
|
10
|
+
* compiling. It behaves identically to `SonarWorkflow`.
|
|
16
11
|
*/
|
|
17
|
-
class ActionSonarWorkflow extends
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.
|
|
19
|
-
workflow;
|
|
12
|
+
class ActionSonarWorkflow extends sonar_workflow_1.SonarWorkflow {
|
|
13
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.22" };
|
|
20
14
|
constructor(scope, options) {
|
|
21
|
-
super(scope,
|
|
22
|
-
if (!options.sonarHostUrl) {
|
|
23
|
-
throw new Error('ActionSonarWorkflow requires sonarHostUrl');
|
|
24
|
-
}
|
|
25
|
-
const gh = scope.github;
|
|
26
|
-
if (!gh) {
|
|
27
|
-
throw new Error('ActionSonarWorkflow requires GitHub integration to be enabled');
|
|
28
|
-
}
|
|
29
|
-
const sonarTokenSecret = options.sonarTokenSecret ?? 'SONAR_TOKEN';
|
|
30
|
-
const pullRequestGate = options.sonarPullRequestGate ?? true;
|
|
31
|
-
const sonarOrganization = options.sonarOrganization ?? 'xpertss';
|
|
32
|
-
this.workflow = new projen_1.github.GithubWorkflow(gh, 'sonar');
|
|
33
|
-
(0, workflow_purpose_1.noteWorkflowPurpose)(this.workflow.file, 'Static-analysis scan of the action on the org SonarCloud.');
|
|
34
|
-
this.workflow.on({
|
|
35
|
-
push: { branches: ['main'] },
|
|
36
|
-
...(pullRequestGate ? { pullRequest: {} } : {}),
|
|
37
|
-
});
|
|
38
|
-
this.workflow.addJob('sonar', {
|
|
39
|
-
runsOn: ['ubuntu-latest'],
|
|
40
|
-
permissions: { contents: projen_1.github.workflows.JobPermission.READ },
|
|
41
|
-
env: { SONAR_TOKEN: `\${{ secrets.${sonarTokenSecret} }}` },
|
|
42
|
-
steps: [
|
|
43
|
-
projen_1.github.WorkflowSteps.checkout(),
|
|
44
|
-
{
|
|
45
|
-
name: 'Install sonar-scanner',
|
|
46
|
-
run: `set -euo pipefail
|
|
47
|
-
curl -fsSL -o /tmp/sonar-scanner.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip"
|
|
48
|
-
echo "${SONAR_SCANNER_SHA256} /tmp/sonar-scanner.zip" | sha256sum -c -
|
|
49
|
-
unzip -q /tmp/sonar-scanner.zip -d /tmp
|
|
50
|
-
echo "/tmp/sonar-scanner-${SONAR_SCANNER_VERSION}-linux-x64/bin" >> "$GITHUB_PATH"
|
|
51
|
-
`,
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
name: 'Scan',
|
|
55
|
-
run: `sonar-scanner \\
|
|
56
|
-
-Dsonar.host.url=${options.sonarHostUrl} \\
|
|
57
|
-
-Dsonar.organization=${sonarOrganization} \\
|
|
58
|
-
-Dsonar.projectKey=${scope.name} \\
|
|
59
|
-
-Dsonar.projectVersion="$(git describe --tags --always)" \\
|
|
60
|
-
-Dsonar.inclusions=.github/workflows/**,action.yml,**/*.sh \\
|
|
61
|
-
-Dsonar.qualitygate.wait=true`,
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
});
|
|
15
|
+
super(scope, options);
|
|
65
16
|
}
|
|
66
17
|
}
|
|
67
18
|
exports.ActionSonarWorkflow = ActionSonarWorkflow;
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXNvbmFyLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLXNvbmFyLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSw2REFBK0U7QUFFL0U7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLDhCQUFhOztJQUNwRCxZQUFZLEtBQTJCLEVBQUUsT0FBNkI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDOztBQUhILGtEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IFNvbmFyV29ya2Zsb3csIFNvbmFyV29ya2Zsb3dPcHRpb25zIH0gZnJvbSAnLi4vY29tbW9uL3NvbmFyLXdvcmtmbG93JztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZW5hbWVkIHRvIGBTb25hcldvcmtmbG93YCAobm93IGluIGBzcmMvY29tbW9uL2AgYW5kIGFwcGxpZWQgdG9cbiAqIGV2ZXJ5IHByb2plY3QgdHlwZSwgbm90IGp1c3QgYWN0aW9ucykuIFVzZSBgU29uYXJXb3JrZmxvd2AgaW5zdGVhZDsgdGhpc1xuICogc3ViY2xhc3MgaXMga2VwdCBvbmx5IHNvIGV4aXN0aW5nIGltcG9ydHMgb2YgYEFjdGlvblNvbmFyV29ya2Zsb3dgIGtlZXBcbiAqIGNvbXBpbGluZy4gSXQgYmVoYXZlcyBpZGVudGljYWxseSB0byBgU29uYXJXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Tb25hcldvcmtmbG93IGV4dGVuZHMgU29uYXJXb3JrZmxvdyB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBnaXRodWIuR2l0SHViUHJvamVjdCwgb3B0aW9uczogU29uYXJXb3JrZmxvd09wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFJlbmFtZWQgdG8gYFNvbmFyV29ya2Zsb3dPcHRpb25zYC4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvblNvbmFyV29ya2Zsb3dPcHRpb25zID0gU29uYXJXb3JrZmxvd09wdGlvbnM7XG4iXX0=
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { github, release } from 'projen';
|
|
2
2
|
import { ActionBuildWorkflow } from './action-build-workflow';
|
|
3
3
|
import { ActionDogfoodOptions, ActionDogfoodWorkflow } from './action-dogfood-workflow';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { SonarScanOptions } from '../common/sonar-options';
|
|
5
|
+
import { SonarWorkflow } from '../common/sonar-workflow';
|
|
6
|
+
export interface GitHubActionProjectOptions extends github.GitHubProjectOptions, SonarScanOptions {
|
|
6
7
|
/**
|
|
7
8
|
* One-line description of the action. Used in the default README
|
|
8
9
|
* template and recorded in the private `package.json`.
|
|
@@ -17,25 +18,6 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
|
|
|
17
18
|
* @default "PROJEN_GITHUB_TOKEN"
|
|
18
19
|
*/
|
|
19
20
|
readonly gheTokenSecret?: string;
|
|
20
|
-
/**
|
|
21
|
-
* URL of the org's SonarCloud instance (e.g. `https://sonarcloud.io`).
|
|
22
|
-
* MUST be reachable from github.com-hosted (public) runners (AD-001).
|
|
23
|
-
* Required, no default: a guessed server is worse than a loud failure.
|
|
24
|
-
*/
|
|
25
|
-
readonly sonarHostUrl: string;
|
|
26
|
-
/**
|
|
27
|
-
* SonarCloud organization key (`sonar.organization`), required by the
|
|
28
|
-
* Scanner CLI on SonarCloud.
|
|
29
|
-
* @default "xpertss"
|
|
30
|
-
*/
|
|
31
|
-
readonly sonarOrganization?: string;
|
|
32
|
-
/** @default "SONAR_TOKEN" */
|
|
33
|
-
readonly sonarTokenSecret?: string;
|
|
34
|
-
/**
|
|
35
|
-
* Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate.
|
|
36
|
-
* @default true
|
|
37
|
-
*/
|
|
38
|
-
readonly sonarPullRequestGate?: boolean;
|
|
39
21
|
/**
|
|
40
22
|
* The dogfood scenario (AD-001). What fixture state, what to assert, and
|
|
41
23
|
* how to clean up are specified by the action's own F### spec - the
|
|
@@ -86,7 +68,8 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
|
|
|
86
68
|
export declare class GitHubActionProject extends github.GitHubProject {
|
|
87
69
|
readonly buildWorkflow: ActionBuildWorkflow;
|
|
88
70
|
readonly dogfoodWorkflow: ActionDogfoodWorkflow;
|
|
89
|
-
|
|
71
|
+
/** Set only when `sonarHostUrl` is provided. */
|
|
72
|
+
readonly sonarWorkflow?: SonarWorkflow;
|
|
90
73
|
readonly release: release.Release;
|
|
91
74
|
constructor(options: GitHubActionProjectOptions);
|
|
92
75
|
}
|
|
@@ -5,13 +5,13 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
const action_build_workflow_1 = require("./action-build-workflow");
|
|
7
7
|
const action_dogfood_workflow_1 = require("./action-dogfood-workflow");
|
|
8
|
-
const action_sonar_workflow_1 = require("./action-sonar-workflow");
|
|
9
8
|
const constants_1 = require("../common/constants");
|
|
10
9
|
const editorconfig_1 = require("../common/editorconfig");
|
|
11
10
|
const internal_actions_1 = require("../common/internal-actions");
|
|
12
11
|
const license_file_1 = require("../common/license-file");
|
|
13
12
|
const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
|
|
14
13
|
const projenrc_ts_1 = require("../common/projenrc-ts");
|
|
14
|
+
const sonar_workflow_1 = require("../common/sonar-workflow");
|
|
15
15
|
const workflow_change_notice_workflow_1 = require("../common/workflow-change-notice-workflow");
|
|
16
16
|
const workflow_purpose_1 = require("../common/workflow-purpose");
|
|
17
17
|
// `require('projen/package.json')`/`require('../../package.json')` resolve
|
|
@@ -64,15 +64,13 @@ hand-committed.
|
|
|
64
64
|
* per the action's own F### spec - this type only lints it.
|
|
65
65
|
*/
|
|
66
66
|
class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
67
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.
|
|
67
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.22" };
|
|
68
68
|
buildWorkflow;
|
|
69
69
|
dogfoodWorkflow;
|
|
70
|
+
/** Set only when `sonarHostUrl` is provided. */
|
|
70
71
|
sonarWorkflow;
|
|
71
72
|
release;
|
|
72
73
|
constructor(options) {
|
|
73
|
-
if (!options.sonarHostUrl) {
|
|
74
|
-
throw new Error('GitHubActionProject requires sonarHostUrl');
|
|
75
|
-
}
|
|
76
74
|
// A declared-but-incomplete dogfood is still an error - see
|
|
77
75
|
// `ActionDogfoodWorkflow`, which owns that check (and the
|
|
78
76
|
// no-dogfood-declared case).
|
|
@@ -138,12 +136,18 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
|
138
136
|
});
|
|
139
137
|
this.buildWorkflow = new action_build_workflow_1.ActionBuildWorkflow(this);
|
|
140
138
|
this.dogfoodWorkflow = new action_dogfood_workflow_1.ActionDogfoodWorkflow(this, options.dogfood);
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
139
|
+
if (options.sonarHostUrl) {
|
|
140
|
+
this.sonarWorkflow = new sonar_workflow_1.SonarWorkflow(this, {
|
|
141
|
+
sonarHostUrl: options.sonarHostUrl,
|
|
142
|
+
sonarOrganization: options.sonarOrganization,
|
|
143
|
+
sonarTokenSecret: options.sonarTokenSecret,
|
|
144
|
+
sonarPullRequestGate: options.sonarPullRequestGate,
|
|
145
|
+
sonarProjectKey: options.sonarProjectKey,
|
|
146
|
+
// YAML / shell are not in Sonar's default-recognized set, so the
|
|
147
|
+
// action's `action.yml` and scripts need explicit inclusions.
|
|
148
|
+
sonarInclusions: '.github/workflows/**,action.yml,**/*.sh',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
147
151
|
// `githubRelease` defaults to true, which auto-wires
|
|
148
152
|
// `publishToGitHubReleases` - its `gh release create ... --target
|
|
149
153
|
// $GITHUB_SHA` creates the tag *and* the release together for our
|
|
@@ -171,4 +175,4 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
|
171
175
|
}
|
|
172
176
|
}
|
|
173
177
|
exports.GitHubActionProject = GitHubActionProject;
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FNZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUseURBQXdEO0FBQ3hELHVGQUFpRjtBQUNqRix1REFBaUU7QUFDakUsK0ZBQXlGO0FBQ3pGLGlFQUFpRTtBQUVqRSwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLCtEQUErRDtBQUMvRCx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQXFGeEMsU0FBUyxxQkFBcUIsQ0FBQyxPQUFtQztJQUNoRSxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUk7O0VBRXhCLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTs7Ozs7a0JBS1QsT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7OztDQWU3QixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsZUFBTSxDQUFDLGFBQWE7O0lBQzNDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUF3QjtJQUN2QyxhQUFhLENBQXNCO0lBQ25DLE9BQU8sQ0FBa0I7SUFFekMsWUFBWSxPQUFtQztRQUM3QyxJQUFJ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SSwyQ0FBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDakQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7WUFDNUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZQUMxQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztRQUVILHFEQUFxRDtRQUNyRCxrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN2QyxNQUFNLEVBQUUsTUFBTTtZQUNkLG1FQUFtRTtZQUNuRSx3REFBd0Q7WUFDeEQsa0JBQWtCLEVBQUUsTUFBTTtZQUMxQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUNoQyxXQUFXLEVBQUUsY0FBYztZQUMzQixpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2RCxjQUFjLEVBQUUsZ0JBQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFO1lBQ25ELFdBQVcsRUFBRSwwQkFBMEIsc0JBQXNCLEVBQUU7WUFDL0QseUJBQXlCLEVBQUU7Z0JBQ3pCLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7YUFDaEQ7U0FDRixDQUFDLENBQUM7UUFFSCxtRUFBbUU7UUFDbkUsc0VBQXNFO1FBQ3RFLGtFQUFrRTtRQUNsRSw2Q0FBNkM7UUFDN0MsSUFBQSxzQ0FBbUIsRUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQyxFQUNqRCxxRkFBcUYsQ0FDdEYsQ0FBQztJQUNKLENBQUM7O0FBNUhILGtEQTZIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEpzb25GaWxlLFxuICBSZWxlYXNhYmxlQ29tbWl0cyxcbiAgWWFtbEZpbGUsXG4gIGdpdGh1YixcbiAgcmVsZWFzZSxcbn0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEFjdGlvbkJ1aWxkV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1idWlsZC13b3JrZmxvdyc7XG5pbXBvcnQgeyBBY3Rpb25Eb2dmb29kT3B0aW9ucywgQWN0aW9uRG9nZm9vZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tZG9nZm9vZC13b3JrZmxvdyc7XG5pbXBvcnQgeyBBY3Rpb25Tb25hcldvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tc29uYXItd29ya2Zsb3cnO1xuaW1wb3J0IHsgREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVUIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRFZGl0b3JDb25maWcgfSBmcm9tICcuLi9jb21tb24vZWRpdG9yY29uZmlnJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRMaWNlbnNlRmlsZSB9IGZyb20gJy4uL2NvbW1vbi9saWNlbnNlLWZpbGUnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQgdGhlIGRyaWZ0LWNoZWNrJ3MgUFIgY29tbWVudHMuXG4gICAqIEl0IGlzICoqbm90Kiogd2lyZWQgaW50byB0aGUgZG9nZm9vZCBhdXRvbWF0aWNhbGx5OiBhIGRvZ2Zvb2QgdGhhdCBpbnZva2VzXG4gICAqIGFuIGFjdGlvbiB3aXRoIGEgYHRva2VuYCBpbnB1dCBtdXN0IHJlZmVyZW5jZSB0aGlzIHNlY3JldCBpbiB0aGUgc3RlcCdzXG4gICAqIGBpbnB1dHNgIChlLmcuIGB0b2tlbjogJyR7eyBzZWNyZXRzLlBST0pFTl9HSVRIVUJfVE9LRU4gfX0nYCkuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBvcmcncyBTb25hckNsb3VkIGluc3RhbmNlIChlLmcuIGBodHRwczovL3NvbmFyY2xvdWQuaW9gKS5cbiAgICogTVVTVCBiZSByZWFjaGFibGUgZnJvbSBnaXRodWIuY29tLWhvc3RlZCAocHVibGljKSBydW5uZXJzIChBRC0wMDEpLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdDogYSBndWVzc2VkIHNlcnZlciBpcyB3b3JzZSB0aGFuIGEgbG91ZCBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJIb3N0VXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvbmFyQ2xvdWQgb3JnYW5pemF0aW9uIGtleSAoYHNvbmFyLm9yZ2FuaXphdGlvbmApLCByZXF1aXJlZCBieSB0aGVcbiAgICogU2Nhbm5lciBDTEkgb24gU29uYXJDbG91ZC5cbiAgICogQGRlZmF1bHQgXCJ4cGVydHNzXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyT3JnYW5pemF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKiBAZGVmYXVsdCBcIlNPTkFSX1RPS0VOXCIgKi9cbiAgcmVhZG9ubHkgc29uYXJUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBgc29uYXIueW1sYCBhbHNvIHJ1bnMgb24gYHB1bGxfcmVxdWVzdGAgYXMgYSBwYXNzL2ZhaWwgZ2F0ZS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJQdWxsUmVxdWVzdEdhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9nZm9vZCBzY2VuYXJpbyAoQUQtMDAxKS4gV2hhdCBmaXh0dXJlIHN0YXRlLCB3aGF0IHRvIGFzc2VydCwgYW5kXG4gICAqIGhvdyB0byBjbGVhbiB1cCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhlXG4gICAqIGhpZ2hlc3QtcmlzayBiZWhhdmlvciBvZiB0aGF0IGFjdGlvbi5cbiAgICpcbiAgICogSXRzIHR5cGUgaXMgYSBzdHJ1Y3QsIHdoaWNoIHByb2plbidzIENMSSBjYW5ub3QgcmVuZGVyIGludG8gYSBwcm9qZW5yYyxcbiAgICogc28gaXQgY2FuIG9ubHkgYmUgd3JpdHRlbiBieSBoYW5kIC0gaXQgaXMgdGhlcmVmb3JlIG9wdGlvbmFsLCBiZWNhdXNlIGFcbiAgICogKnJlcXVpcmVkKiBvcHRpb24gYHByb2plbiBuZXdgIGNhbm5vdCBzdXBwbHkgd291bGQgbWFrZSB0aGlzIHByb2plY3RcbiAgICogdHlwZSBpbXBvc3NpYmxlIHRvIHNjYWZmb2xkLiBBRC0wMDEncyBcIm5ldmVyIGEgc2lsZW50IG5vLW9wIGRvZ2Zvb2RcIlxuICAgKiBydWxlIGlzIGVuZm9yY2VkIGluc3RlYWQgYnkgdGhlIHdvcmtmbG93IGl0IGdlbmVyYXRlcyBpbiB0aGF0IGNhc2U6IGFcbiAgICogc2luZ2xlIHN0ZXAgdGhhdCBmYWlscyBvbiBldmVyeSBQUiB1bnRpbCBhIHNjZW5hcmlvIGlzIGRlY2xhcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGB0ZXN0LWRvZ2Zvb2QueW1sYCBydW5zIG9uZSBmYWlsaW5nIHN0ZXAgdGhhdCB0ZWxscyB5b3UgdG9cbiAgICogZGVjbGFyZSBhIHNjZW5hcmlvXG4gICAqL1xuICByZWFkb25seSBkb2dmb29kPzogQWN0aW9uRG9nZm9vZE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFNQRFggaWRlbnRpZmllciBmb3IgdGhlIGdlbmVyYXRlZCBgTElDRU5TRWAuXG4gICAqIEBkZWZhdWx0IFwiTUlUXCJcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvcHlyaWdodCBvd25lciBuYW1lZCBpbiB0aGUgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIlhwZXJ0IFNvZnR3YXJlXCJcbiAgICovXG4gIHJlYWRvbmx5IGNvcHlyaWdodE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb3B5cmlnaHQgcGVyaW9kIG5hbWVkIGluIHRoZSBgTElDRU5TRWAuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGN1cnJlbnQgeWVhclxuICAgKi9cbiAgcmVhZG9ubHkgY29weXJpZ2h0UGVyaW9kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZSBhIHByb2plbi1tYW5hZ2VkIGAuZWRpdG9yY29uZmlnYC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yY29uZmlnPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFJlYWRtZUNvbnRlbnRzKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAjICR7b3B0aW9ucy5uYW1lfVxuXG4ke29wdGlvbnMuZGVzY3JpcHRpb24gPz8gJyd9XG5cbiMjIFVzYWdlXG5cblxcYFxcYFxcYHlhbWxcbi0gdXNlczogeHBlcnRzcy8ke29wdGlvbnMubmFtZX1APHJlZj5cblxcYFxcYFxcYFxuXG4jIyBCdW1waW5nXG5cbkEgXFxgZmVhdDpcXGAvXFxgZml4OlxcYCBjb21taXQgcHVzaGVkIHRvIFxcYG1haW5cXGAgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseTogYnVtcCxcbnRhZyBcXGB2WC5ZLlpcXGAsIEdpdEh1YiBSZWxlYXNlLiBTZWUgXFxgLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxcXGAuXG5cbiMjIFRydXN0IGNvbnRyYWN0XG5cblRoaXMgaXMgYSBjb21wb3NpdGUgKHNoZWxsKSBhY3Rpb24gLSBubyBOb2RlL25wbSBhdCBydW50aW1lLCBubyBEb2NrZXIuIEl0c1xuQ0kgbGludCBnYXRlIChcXGBidWlsZC55bWxcXGApLCBkb2dmb29kIHRlc3QgKFxcYHRlc3QtZG9nZm9vZC55bWxcXGApLCBhbmQgU29uYXJcbnNjYW4gKFxcYHNvbmFyLnltbFxcYCkgYXJlIHNjYWZmb2xkZWQgYnkgXFxgQHhwZXJ0c3MvcHJvamVuLXR5cGVzXFxgJ1xuXFxgR2l0SHViQWN0aW9uUHJvamVjdFxcYDsgb25seSBcXGBhY3Rpb24ueW1sXFxgIGFuZCBpdHMgc2hlbGwgc2NyaXB0cyBhcmVcbmhhbmQtY29tbWl0dGVkLlxuYDtcbn1cblxuLyoqXG4gKiBTY2FmZm9sZHMgdGhlIHJlcG8gbGlmZWN5Y2xlIChBRC0wMDEpIGFyb3VuZCBhIGhhbmQtY29tbWl0dGVkLCBjb21wb3NpdGVcbiAqIChzaGVsbCkgR2l0SHViIEFjdGlvbjogdGhlIGBidWlsZGAvYHRlc3QtZG9nZm9vZGAvYHNvbmFyYC9gcmVsZWFzZWBcbiAgKiB3b3JrZmxvd3MsIHZlcnNpb25pbmcgYW5kIHJlbGVhc2UgZGlzY2lwbGluZSwgdGhlIEYwMDMgdmVyaWZ5IGNvbXBvbmVudHMsXG4gICogYW5kIHJlcG8gYm9pbGVycGxhdGUgKGEgcHJpdmF0ZSB2ZXJzaW9uLXNvdXJjZSBgcGFja2FnZS5qc29uYCwgYC55YW1sbGludGAsXG4gICogYExJQ0VOU0VgLCBhbmQgYSBgUkVBRE1FLm1kYCB0ZW1wbGF0ZSkuIFRoZVxuICogYWN0aW9uJ3Mgb3duIGNvbnRlbnRcbiAqIChgYWN0aW9uLnltbGAsIGl0cyBzaGVsbCBzY3JpcHRzLCBgdGVzdC9gIGZpeHR1cmVzKSBpcyBhdXRob3JlZCBieSBoYW5kXG4gKiBwZXIgdGhlIGFjdGlvbidzIG93biBGIyMjIHNwZWMgLSB0aGlzIHR5cGUgb25seSBsaW50cyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkFjdGlvblByb2plY3QgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBidWlsZFdvcmtmbG93OiBBY3Rpb25CdWlsZFdvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgZG9nZm9vZFdvcmtmbG93OiBBY3Rpb25Eb2dmb29kV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBzb25hcldvcmtmbG93OiBBY3Rpb25Tb25hcldvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZTogcmVsZWFzZS5SZWxlYXNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnNvbmFySG9zdFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIHNvbmFySG9zdFVybCcpO1xuICAgIH1cbiAgICAvLyBBIGRlY2xhcmVkLWJ1dC1pbmNvbXBsZXRlIGRvZ2Zvb2QgaXMgc3RpbGwgYW4gZXJyb3IgLSBzZWVcbiAgICAvLyBgQWN0aW9uRG9nZm9vZFdvcmtmbG93YCwgd2hpY2ggb3ducyB0aGF0IGNoZWNrIChhbmQgdGhlXG4gICAgLy8gbm8tZG9nZm9vZC1kZWNsYXJlZCBjYXNlKS5cblxuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBQUiB0aXRsZXMgYXJlIG5vdCBnYXRlZDogYGZlYXQ6YC9gZml4OmAgbWF0dGVyIG9ubHkgYmVjYXVzZSB0aGV5IGRyaXZlXG4gICAgICAvLyB0aGUgcmVsZWFzZSB3b3JrZmxvdyAodmlhIGByZWxlYXNhYmxlQ29tbWl0c2ApLCBub3QgUFIgY2hlY2tzLiBUaGVcbiAgICAgIC8vIGNvbnZlbnRpb25hbC1jb21taXQgUFItdGl0bGUgbGludCBpcyBhZGRlZCBieSB0aGUgYEdpdEh1YmAgY29tcG9uZW50XG4gICAgICAvLyB1bmxlc3MgYGdpdGh1Yk9wdGlvbnMucHVsbFJlcXVlc3RMaW50YCBpcyBgZmFsc2VgIChpdCBkZWZhdWx0cyB0cnVlKS5cbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHsgLi4ub3B0aW9ucy5naXRodWJPcHRpb25zLCBwdWxsUmVxdWVzdExpbnQ6IGZhbHNlIH0sXG4gICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lID8/IHsgY29udGVudHM6IGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zKSB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZ2ggPSB0aGlzLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgLy8gSmV0QnJhaW5zIElERSBzdGF0ZSAoLmlkZWEvKSBpcyBuZXZlciB0cmFja2VkIGluIGdlbmVyYXRlZCByZXBvcywgYW5kXG4gICAgLy8gbmVpdGhlciBpcyAvc3BlYy8gKGxvY2FsIHBsYW5zIGFuZCBzcGVjczsgdGhlIHBhdHRlcm4gY292ZXJzIGV2ZXJ5XG4gICAgLy8gc3ViZGlyZWN0b3J5KS5cbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnLy5pZGVhLyonKTtcbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnL3NwZWMvJyk7XG5cbiAgICBpZiAob3B0aW9ucy5lZGl0b3Jjb25maWcgPz8gdHJ1ZSkge1xuICAgICAgYWRkRWRpdG9yQ29uZmlnKHRoaXMpO1xuICAgIH1cblxuICAgIG5ldyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3codGhpcywge1xuICAgICAgZ2hlVG9rZW5TZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgIH0pO1xuICAgIG5ldyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93KHRoaXMpO1xuXG4gICAgYWRkTGljZW5zZUZpbGUodGhpcywge1xuICAgICAgc3BkeDogb3B0aW9ucy5saWNlbnNlID8/ICdNSVQnLFxuICAgICAgY29weXJpZ2h0T3duZXI6IG9wdGlvbnMuY29weXJpZ2h0T3duZXIgPz8gJ1hwZXJ0IFNvZnR3YXJlJyxcbiAgICAgIGNvcHlyaWdodFBlcmlvZDogb3B0aW9ucy5jb3B5cmlnaHRQZXJpb2QsXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIEEgYmFyZVxuICAgIC8vIEdpdEh1YlByb2plY3QgaGFzIG5vIGRlZmF1bHQgdGFzayB0aGF0IHJ1bnMgYSBwcm9qZW5yYyBvbiBpdHMgb3duLCBzb1xuICAgIC8vIHRoaXMgaXMgd2hhdCBtYWtlcyBgbnB4IHByb2plbmAgd29yayBpbiB0aGUgZ2VuZXJhdGVkIHJlcG8gYXQgYWxsLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIHByb2plbiBtYXJrcyBnZW5lcmF0ZWQgZmlsZXMgcmVhZC1vbmx5ICgwNDQ0KSBvbiBkaXNrIGJ5IGRlZmF1bHQsIGJ1dFxuICAgIC8vIHRoaXMgb25lIG11c3Qgc3RheSBvd25lci13cml0YWJsZTogdGhlIGRvY3VtZW50ZWQgdXBkYXRlIGZsb3dcbiAgICAvLyAoYG5wbSBpIC1EIEB4cGVydHNzL3Byb2plbi10eXBlc0BsYXRlc3RgKSBuZWVkcyBucG0gdG8gcmV3cml0ZSB0aGVcbiAgICAvLyBwaW5uZWQgdmVyc2lvbnMgaW4gYW4gZXhpc3RpbmcgcmVwby4gSGFuZC1lZGl0cyBhcmUgc3RpbGwgY2F1Z2h0IGJ5XG4gICAgLy8gdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGRldkRlcGVuZGVuY2llczoge1xuICAgICAgICAgICdwcm9qZW4nOiBQUk9KRU5fVkVSU0lPTixcbiAgICAgICAgICAnQHhwZXJ0c3MvcHJvamVuLXR5cGVzJzogUFJPSkVOX1RZUEVTX1ZFUlNJT04sXG4gICAgICAgICAgJ2NvbW1pdC1hbmQtdGFnLXZlcnNpb24nOiBDT01NSVRfQU5EX1RBR19WRVJTSU9OLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIG5ldyBZYW1sRmlsZSh0aGlzLCAnLnlhbWxsaW50Jywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGV4dGVuZHM6ICdkZWZhdWx0JyxcbiAgICAgICAgcnVsZXM6IHsgJ2xpbmUtbGVuZ3RoJzogeyBtYXg6IDEyMCB9IH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZFdvcmtmbG93ID0gbmV3IEFjdGlvbkJ1aWxkV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmRvZ2Zvb2RXb3JrZmxvdyA9IG5ldyBBY3Rpb25Eb2dmb29kV29ya2Zsb3codGhpcywgb3B0aW9ucy5kb2dmb29kKTtcblxuICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBBY3Rpb25Tb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgIHNvbmFySG9zdFVybDogb3B0aW9ucy5zb25hckhvc3RVcmwsXG4gICAgICBzb25hck9yZ2FuaXphdGlvbjogb3B0aW9ucy5zb25hck9yZ2FuaXphdGlvbixcbiAgICAgIHNvbmFyVG9rZW5TZWNyZXQ6IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCxcbiAgICAgIHNvbmFyUHVsbFJlcXVlc3RHYXRlOiBvcHRpb25zLnNvbmFyUHVsbFJlcXVlc3RHYXRlLFxuICAgIH0pO1xuXG4gICAgLy8gYGdpdGh1YlJlbGVhc2VgIGRlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGF1dG8td2lyZXNcbiAgICAvLyBgcHVibGlzaFRvR2l0SHViUmVsZWFzZXNgIC0gaXRzIGBnaCByZWxlYXNlIGNyZWF0ZSAuLi4gLS10YXJnZXRcbiAgICAvLyAkR0lUSFVCX1NIQWAgY3JlYXRlcyB0aGUgdGFnICphbmQqIHRoZSByZWxlYXNlIHRvZ2V0aGVyIGZvciBvdXJcbiAgICAvLyBjb250aW51b3VzIChwdXNoLXRvLW1haW4pIHRyaWdnZXIuIE5vIHNlcGFyYXRlIGBwdWJsaXNoVG9HaXRgIGNhbGxcbiAgICAvLyBuZWVkZWQgKHRoYXQgcGF0aCBvbmx5IGZpcmVzIGZvciBhIG1hbnVhbCByZWxlYXNlIHRyaWdnZXIpLlxuICAgIHRoaXMucmVsZWFzZSA9IG5ldyByZWxlYXNlLlJlbGVhc2UodGhpcywge1xuICAgICAgYnJhbmNoOiAnbWFpbicsXG4gICAgICAvLyBObyBidWlsZCBhcnRpZmFjdCBmb3IgYSBjb21wb3NpdGUgYWN0aW9uIChBRC0wMDEpIC0gdGhpcyBpcyBvbmx5XG4gICAgICAvLyB3aGVyZSBSZWxlYXNlIHN0YWdlcyBpdHMgb3duIHZlcnNpb24vY2hhbmdlbG9nIGZpbGVzLlxuICAgICAgYXJ0aWZhY3RzRGlyZWN0b3J5OiAnZGlzdCcsXG4gICAgICB0YXNrczogW3RoaXMuYnVpbGRXb3JrZmxvdy50YXNrXSxcbiAgICAgIHZlcnNpb25GaWxlOiAncGFja2FnZS5qc29uJyxcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBSZWxlYXNhYmxlQ29tbWl0cy5mZWF0dXJlc0FuZEZpeGVzKCksXG4gICAgICByZWxlYXNlVHJpZ2dlcjogcmVsZWFzZS5SZWxlYXNlVHJpZ2dlci5jb250aW51b3VzKCksXG4gICAgICBidW1wUGFja2FnZTogYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25AJHtDT01NSVRfQU5EX1RBR19WRVJTSU9OfWAsXG4gICAgICByZWxlYXNlV29ya2Zsb3dTZXR1cFN0ZXBzOiBbXG4gICAgICAgIHsgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJywgcnVuOiAnbnBtIGNpJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIFRoZSByZWxlYXNlIHdvcmtmbG93IGlzIGNyZWF0ZWQgaW5zaWRlIGByZWxlYXNlLlJlbGVhc2VgIChwcm9qZW5cbiAgICAvLyBpbnRlcm5hbCksIG5vdCBieSB0aGlzIHR5cGUgLSByZWFjaCBpdHMgZmlsZSBieSBwYXRoIHRvIGFubm90YXRlIGl0XG4gICAgLy8gbGlrZSBldmVyeSBvdGhlciBnZW5lcmF0ZWQgd29ya2Zsb3cuIFRoaXMgdHlwZSBpcyBhbHdheXMgYSByb290XG4gICAgLy8gcHJvamVjdCwgc28gcHJvamVuIG5hbWVzIGl0IGByZWxlYXNlLnltbGAuXG4gICAgbm90ZVdvcmtmbG93UHVycG9zZShcbiAgICAgIHRoaXMudHJ5RmluZEZpbGUoJy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sJyksXG4gICAgICAnQ29udGludW91cyByZWxlYXNlIG9uIHB1c2ggdG8gbWFpbjogYnVtcCB2ZXJzaW9uLCB0YWcsIGFuZCBjcmVhdGUgYSBHaXRIdWIgUmVsZWFzZS4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FNZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtREFBK0Q7QUFDL0QseURBQXlEO0FBQ3pELGlFQUEwRTtBQUMxRSx5REFBd0Q7QUFDeEQsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUVqRSw2REFBeUQ7QUFDekQsK0ZBQXlGO0FBQ3pGLGlFQUFpRTtBQUVqRSwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLCtEQUErRDtBQUMvRCx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQStEeEMsU0FBUyxxQkFBcUIsQ0FBQyxPQUFtQztJQUNoRSxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUk7O0VBRXhCLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTs7Ozs7a0JBS1QsT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7OztDQWU3QixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsZUFBTSxDQUFDLGFBQWE7O0lBQzNDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUF3QjtJQUN2RCxnREFBZ0Q7SUFDaEMsYUFBYSxDQUFpQjtJQUM5QixPQUFPLENBQWtCO0lBRXpDLFlBQVksT0FB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c29uRmlsZSxcbiAgUmVsZWFzYWJsZUNvbW1pdHMsXG4gIFlhbWxGaWxlLFxuICBnaXRodWIsXG4gIHJlbGVhc2UsXG59IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBY3Rpb25CdWlsZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uRG9nZm9vZE9wdGlvbnMsIEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWRvZ2Zvb2Qtd29ya2Zsb3cnO1xuaW1wb3J0IHsgREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVUIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRFZGl0b3JDb25maWcgfSBmcm9tICcuLi9jb21tb24vZWRpdG9yY29uZmlnJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRMaWNlbnNlRmlsZSB9IGZyb20gJy4uL2NvbW1vbi9saWNlbnNlLWZpbGUnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgU29uYXJTY2FuT3B0aW9ucyB9IGZyb20gJy4uL2NvbW1vbi9zb25hci1vcHRpb25zJztcbmltcG9ydCB7IFNvbmFyV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vc29uYXItd29ya2Zsb3cnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zLFxuICBTb25hclNjYW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQgdGhlIGRyaWZ0LWNoZWNrJ3MgUFIgY29tbWVudHMuXG4gICAqIEl0IGlzICoqbm90Kiogd2lyZWQgaW50byB0aGUgZG9nZm9vZCBhdXRvbWF0aWNhbGx5OiBhIGRvZ2Zvb2QgdGhhdCBpbnZva2VzXG4gICAqIGFuIGFjdGlvbiB3aXRoIGEgYHRva2VuYCBpbnB1dCBtdXN0IHJlZmVyZW5jZSB0aGlzIHNlY3JldCBpbiB0aGUgc3RlcCdzXG4gICAqIGBpbnB1dHNgIChlLmcuIGB0b2tlbjogJyR7eyBzZWNyZXRzLlBST0pFTl9HSVRIVUJfVE9LRU4gfX0nYCkuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvZ2Zvb2Qgc2NlbmFyaW8gKEFELTAwMSkuIFdoYXQgZml4dHVyZSBzdGF0ZSwgd2hhdCB0byBhc3NlcnQsIGFuZFxuICAgKiBob3cgdG8gY2xlYW4gdXAgYXJlIHNwZWNpZmllZCBieSB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoZVxuICAgKiBoaWdoZXN0LXJpc2sgYmVoYXZpb3Igb2YgdGhhdCBhY3Rpb24uXG4gICAqXG4gICAqIEl0cyB0eXBlIGlzIGEgc3RydWN0LCB3aGljaCBwcm9qZW4ncyBDTEkgY2Fubm90IHJlbmRlciBpbnRvIGEgcHJvamVucmMsXG4gICAqIHNvIGl0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gYnkgaGFuZCAtIGl0IGlzIHRoZXJlZm9yZSBvcHRpb25hbCwgYmVjYXVzZSBhXG4gICAqICpyZXF1aXJlZCogb3B0aW9uIGBwcm9qZW4gbmV3YCBjYW5ub3Qgc3VwcGx5IHdvdWxkIG1ha2UgdGhpcyBwcm9qZWN0XG4gICAqIHR5cGUgaW1wb3NzaWJsZSB0byBzY2FmZm9sZC4gQUQtMDAxJ3MgXCJuZXZlciBhIHNpbGVudCBuby1vcCBkb2dmb29kXCJcbiAgICogcnVsZSBpcyBlbmZvcmNlZCBpbnN0ZWFkIGJ5IHRoZSB3b3JrZmxvdyBpdCBnZW5lcmF0ZXMgaW4gdGhhdCBjYXNlOiBhXG4gICAqIHNpbmdsZSBzdGVwIHRoYXQgZmFpbHMgb24gZXZlcnkgUFIgdW50aWwgYSBzY2VuYXJpbyBpcyBkZWNsYXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgdGVzdC1kb2dmb29kLnltbGAgcnVucyBvbmUgZmFpbGluZyBzdGVwIHRoYXQgdGVsbHMgeW91IHRvXG4gICAqIGRlY2xhcmUgYSBzY2VuYXJpb1xuICAgKi9cbiAgcmVhZG9ubHkgZG9nZm9vZD86IEFjdGlvbkRvZ2Zvb2RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTUERYIGlkZW50aWZpZXIgZm9yIHRoZSBnZW5lcmF0ZWQgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIk1JVFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb3B5cmlnaHQgb3duZXIgbmFtZWQgaW4gdGhlIGBMSUNFTlNFYC5cbiAgICogQGRlZmF1bHQgXCJYcGVydCBTb2Z0d2FyZVwiXG4gICAqL1xuICByZWFkb25seSBjb3B5cmlnaHRPd25lcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ29weXJpZ2h0IHBlcmlvZCBuYW1lZCBpbiB0aGUgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBjdXJyZW50IHllYXJcbiAgICovXG4gIHJlYWRvbmx5IGNvcHlyaWdodFBlcmlvZD86IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGUgYSBwcm9qZW4tbWFuYWdlZCBgLmVkaXRvcmNvbmZpZ2AuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgIyAke29wdGlvbnMubmFtZX1cblxuJHtvcHRpb25zLmRlc2NyaXB0aW9uID8/ICcnfVxuXG4jIyBVc2FnZVxuXG5cXGBcXGBcXGB5YW1sXG4tIHVzZXM6IHhwZXJ0c3MvJHtvcHRpb25zLm5hbWV9QDxyZWY+XG5cXGBcXGBcXGBcblxuIyMgQnVtcGluZ1xuXG5BIFxcYGZlYXQ6XFxgL1xcYGZpeDpcXGAgY29tbWl0IHB1c2hlZCB0byBcXGBtYWluXFxgIGlzIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHk6IGJ1bXAsXG50YWcgXFxgdlguWS5aXFxgLCBHaXRIdWIgUmVsZWFzZS4gU2VlIFxcYC5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sXFxgLlxuXG4jIyBUcnVzdCBjb250cmFjdFxuXG5UaGlzIGlzIGEgY29tcG9zaXRlIChzaGVsbCkgYWN0aW9uIC0gbm8gTm9kZS9ucG0gYXQgcnVudGltZSwgbm8gRG9ja2VyLiBJdHNcbkNJIGxpbnQgZ2F0ZSAoXFxgYnVpbGQueW1sXFxgKSwgZG9nZm9vZCB0ZXN0IChcXGB0ZXN0LWRvZ2Zvb2QueW1sXFxgKSwgYW5kIFNvbmFyXG5zY2FuIChcXGBzb25hci55bWxcXGApIGFyZSBzY2FmZm9sZGVkIGJ5IFxcYEB4cGVydHNzL3Byb2plbi10eXBlc1xcYCdcblxcYEdpdEh1YkFjdGlvblByb2plY3RcXGA7IG9ubHkgXFxgYWN0aW9uLnltbFxcYCBhbmQgaXRzIHNoZWxsIHNjcmlwdHMgYXJlXG5oYW5kLWNvbW1pdHRlZC5cbmA7XG59XG5cbi8qKlxuICogU2NhZmZvbGRzIHRoZSByZXBvIGxpZmVjeWNsZSAoQUQtMDAxKSBhcm91bmQgYSBoYW5kLWNvbW1pdHRlZCwgY29tcG9zaXRlXG4gKiAoc2hlbGwpIEdpdEh1YiBBY3Rpb246IHRoZSBgYnVpbGRgL2B0ZXN0LWRvZ2Zvb2RgL2Bzb25hcmAvYHJlbGVhc2VgXG4gICogd29ya2Zsb3dzLCB2ZXJzaW9uaW5nIGFuZCByZWxlYXNlIGRpc2NpcGxpbmUsIHRoZSBGMDAzIHZlcmlmeSBjb21wb25lbnRzLFxuICAqIGFuZCByZXBvIGJvaWxlcnBsYXRlIChhIHByaXZhdGUgdmVyc2lvbi1zb3VyY2UgYHBhY2thZ2UuanNvbmAsIGAueWFtbGxpbnRgLFxuICAqIGBMSUNFTlNFYCwgYW5kIGEgYFJFQURNRS5tZGAgdGVtcGxhdGUpLiBUaGVcbiAqIGFjdGlvbidzIG93biBjb250ZW50XG4gKiAoYGFjdGlvbi55bWxgLCBpdHMgc2hlbGwgc2NyaXB0cywgYHRlc3QvYCBmaXh0dXJlcykgaXMgYXV0aG9yZWQgYnkgaGFuZFxuICogcGVyIHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhpcyB0eXBlIG9ubHkgbGludHMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRIdWJBY3Rpb25Qcm9qZWN0IGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRXb3JrZmxvdzogQWN0aW9uQnVpbGRXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IGRvZ2Zvb2RXb3JrZmxvdzogQWN0aW9uRG9nZm9vZFdvcmtmbG93O1xuICAvKiogU2V0IG9ubHkgd2hlbiBgc29uYXJIb3N0VXJsYCBpcyBwcm92aWRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvbmFyV29ya2Zsb3c/OiBTb25hcldvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZTogcmVsZWFzZS5SZWxlYXNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKSB7XG4gICAgLy8gQSBkZWNsYXJlZC1idXQtaW5jb21wbGV0ZSBkb2dmb29kIGlzIHN0aWxsIGFuIGVycm9yIC0gc2VlXG4gICAgLy8gYEFjdGlvbkRvZ2Zvb2RXb3JrZmxvd2AsIHdoaWNoIG93bnMgdGhhdCBjaGVjayAoYW5kIHRoZVxuICAgIC8vIG5vLWRvZ2Zvb2QtZGVjbGFyZWQgY2FzZSkuXG5cbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucywgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcmVhZG1lOiBvcHRpb25zLnJlYWRtZSA/PyB7IGNvbnRlbnRzOiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9ucykgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdoID0gdGhpcy5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MsIGFuZFxuICAgIC8vIG5laXRoZXIgaXMgL3NwZWMvIChsb2NhbCBwbGFucyBhbmQgc3BlY3M7IHRoZSBwYXR0ZXJuIGNvdmVycyBldmVyeVxuICAgIC8vIHN1YmRpcmVjdG9yeSkuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy9zcGVjLycpO1xuXG4gICAgaWYgKG9wdGlvbnMuZWRpdG9yY29uZmlnID8/IHRydWUpIHtcbiAgICAgIGFkZEVkaXRvckNvbmZpZyh0aGlzKTtcbiAgICB9XG5cbiAgICBuZXcgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93KHRoaXMsIHtcbiAgICAgIGdoZVRva2VuU2VjcmV0OiBvcHRpb25zLmdoZVRva2VuU2VjcmV0ID8/IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCxcbiAgICB9KTtcbiAgICBuZXcgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyh0aGlzKTtcblxuICAgIGFkZExpY2Vuc2VGaWxlKHRoaXMsIHtcbiAgICAgIHNwZHg6IG9wdGlvbnMubGljZW5zZSA/PyAnTUlUJyxcbiAgICAgIGNvcHlyaWdodE93bmVyOiBvcHRpb25zLmNvcHlyaWdodE93bmVyID8/ICdYcGVydCBTb2Z0d2FyZScsXG4gICAgICBjb3B5cmlnaHRQZXJpb2Q6IG9wdGlvbnMuY29weXJpZ2h0UGVyaW9kLFxuICAgIH0pO1xuXG4gICAgLy8gYC5wcm9qZW5yYy50c2AgKyBgbnB4IHByb2plbmAsIHNhbWUgYXMgZXZlcnkgb3RoZXIgdHlwZSBoZXJlLiBBIGJhcmVcbiAgICAvLyBHaXRIdWJQcm9qZWN0IGhhcyBubyBkZWZhdWx0IHRhc2sgdGhhdCBydW5zIGEgcHJvamVucmMgb24gaXRzIG93biwgc29cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFrZXMgYG5weCBwcm9qZW5gIHdvcmsgaW4gdGhlIGdlbmVyYXRlZCByZXBvIGF0IGFsbC5cbiAgICBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmModGhpcyk7XG5cbiAgICAvLyBwcm9qZW4gbWFya3MgZ2VuZXJhdGVkIGZpbGVzIHJlYWQtb25seSAoMDQ0NCkgb24gZGlzayBieSBkZWZhdWx0LCBidXRcbiAgICAvLyB0aGlzIG9uZSBtdXN0IHN0YXkgb3duZXItd3JpdGFibGU6IHRoZSBkb2N1bWVudGVkIHVwZGF0ZSBmbG93XG4gICAgLy8gKGBucG0gaSAtRCBAeHBlcnRzcy9wcm9qZW4tdHlwZXNAbGF0ZXN0YCkgbmVlZHMgbnBtIHRvIHJld3JpdGUgdGhlXG4gICAgLy8gcGlubmVkIHZlcnNpb25zIGluIGFuIGV4aXN0aW5nIHJlcG8uIEhhbmQtZWRpdHMgYXJlIHN0aWxsIGNhdWdodCBieVxuICAgIC8vIHRoZSBkcmlmdCBjaGVjay5cbiAgICBuZXcgSnNvbkZpbGUodGhpcywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICAgIHByaXZhdGU6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAncHJvamVuJzogUFJPSkVOX1ZFUlNJT04sXG4gICAgICAgICAgJ0B4cGVydHNzL3Byb2plbi10eXBlcyc6IFBST0pFTl9UWVBFU19WRVJTSU9OLFxuICAgICAgICAgICdjb21taXQtYW5kLXRhZy12ZXJzaW9uJzogQ09NTUlUX0FORF9UQUdfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy55YW1sbGludCcsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBleHRlbmRzOiAnZGVmYXVsdCcsXG4gICAgICAgIHJ1bGVzOiB7ICdsaW5lLWxlbmd0aCc6IHsgbWF4OiAxMjAgfSB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnVpbGRXb3JrZmxvdyA9IG5ldyBBY3Rpb25CdWlsZFdvcmtmbG93KHRoaXMpO1xuXG4gICAgdGhpcy5kb2dmb29kV29ya2Zsb3cgPSBuZXcgQWN0aW9uRG9nZm9vZFdvcmtmbG93KHRoaXMsIG9wdGlvbnMuZG9nZm9vZCk7XG5cbiAgICBpZiAob3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBTb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgICAgc29uYXJIb3N0VXJsOiBvcHRpb25zLnNvbmFySG9zdFVybCxcbiAgICAgICAgc29uYXJPcmdhbml6YXRpb246IG9wdGlvbnMuc29uYXJPcmdhbml6YXRpb24sXG4gICAgICAgIHNvbmFyVG9rZW5TZWNyZXQ6IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCxcbiAgICAgICAgc29uYXJQdWxsUmVxdWVzdEdhdGU6IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUsXG4gICAgICAgIHNvbmFyUHJvamVjdEtleTogb3B0aW9ucy5zb25hclByb2plY3RLZXksXG4gICAgICAgIC8vIFlBTUwgLyBzaGVsbCBhcmUgbm90IGluIFNvbmFyJ3MgZGVmYXVsdC1yZWNvZ25pemVkIHNldCwgc28gdGhlXG4gICAgICAgIC8vIGFjdGlvbidzIGBhY3Rpb24ueW1sYCBhbmQgc2NyaXB0cyBuZWVkIGV4cGxpY2l0IGluY2x1c2lvbnMuXG4gICAgICAgIHNvbmFySW5jbHVzaW9uczogJy5naXRodWIvd29ya2Zsb3dzLyoqLGFjdGlvbi55bWwsKiovKi5zaCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBgZ2l0aHViUmVsZWFzZWAgZGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggYXV0by13aXJlc1xuICAgIC8vIGBwdWJsaXNoVG9HaXRIdWJSZWxlYXNlc2AgLSBpdHMgYGdoIHJlbGVhc2UgY3JlYXRlIC4uLiAtLXRhcmdldFxuICAgIC8vICRHSVRIVUJfU0hBYCBjcmVhdGVzIHRoZSB0YWcgKmFuZCogdGhlIHJlbGVhc2UgdG9nZXRoZXIgZm9yIG91clxuICAgIC8vIGNvbnRpbnVvdXMgKHB1c2gtdG8tbWFpbikgdHJpZ2dlci4gTm8gc2VwYXJhdGUgYHB1Ymxpc2hUb0dpdGAgY2FsbFxuICAgIC8vIG5lZWRlZCAodGhhdCBwYXRoIG9ubHkgZmlyZXMgZm9yIGEgbWFudWFsIHJlbGVhc2UgdHJpZ2dlcikuXG4gICAgdGhpcy5yZWxlYXNlID0gbmV3IHJlbGVhc2UuUmVsZWFzZSh0aGlzLCB7XG4gICAgICBicmFuY2g6ICdtYWluJyxcbiAgICAgIC8vIE5vIGJ1aWxkIGFydGlmYWN0IGZvciBhIGNvbXBvc2l0ZSBhY3Rpb24gKEFELTAwMSkgLSB0aGlzIGlzIG9ubHlcbiAgICAgIC8vIHdoZXJlIFJlbGVhc2Ugc3RhZ2VzIGl0cyBvd24gdmVyc2lvbi9jaGFuZ2Vsb2cgZmlsZXMuXG4gICAgICBhcnRpZmFjdHNEaXJlY3Rvcnk6ICdkaXN0JyxcbiAgICAgIHRhc2tzOiBbdGhpcy5idWlsZFdvcmtmbG93LnRhc2tdLFxuICAgICAgdmVyc2lvbkZpbGU6ICdwYWNrYWdlLmpzb24nLFxuICAgICAgcmVsZWFzYWJsZUNvbW1pdHM6IFJlbGVhc2FibGVDb21taXRzLmZlYXR1cmVzQW5kRml4ZXMoKSxcbiAgICAgIHJlbGVhc2VUcmlnZ2VyOiByZWxlYXNlLlJlbGVhc2VUcmlnZ2VyLmNvbnRpbnVvdXMoKSxcbiAgICAgIGJ1bXBQYWNrYWdlOiBgY29tbWl0LWFuZC10YWctdmVyc2lvbkAke0NPTU1JVF9BTkRfVEFHX1ZFUlNJT059YCxcbiAgICAgIHJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJlbGVhc2Ugd29ya2Zsb3cgaXMgY3JlYXRlZCBpbnNpZGUgYHJlbGVhc2UuUmVsZWFzZWAgKHByb2plblxuICAgIC8vIGludGVybmFsKSwgbm90IGJ5IHRoaXMgdHlwZSAtIHJlYWNoIGl0cyBmaWxlIGJ5IHBhdGggdG8gYW5ub3RhdGUgaXRcbiAgICAvLyBsaWtlIGV2ZXJ5IG90aGVyIGdlbmVyYXRlZCB3b3JrZmxvdy4gVGhpcyB0eXBlIGlzIGFsd2F5cyBhIHJvb3RcbiAgICAvLyBwcm9qZWN0LCBzbyBwcm9qZW4gbmFtZXMgaXQgYHJlbGVhc2UueW1sYC5cbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy50cnlGaW5kRmlsZSgnLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwnKSxcbiAgICAgICdDb250aW51b3VzIHJlbGVhc2Ugb24gcHVzaCB0byBtYWluOiBidW1wIHZlcnNpb24sIHRhZywgYW5kIGNyZWF0ZSBhIEdpdEh1YiBSZWxlYXNlLicsXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -8,7 +8,7 @@ const projen_1 = require("projen");
|
|
|
8
8
|
* layered on top of `CdkTypescriptProject`'s pure-infra scaffold.
|
|
9
9
|
*/
|
|
10
10
|
class AppRuntimeScaffold extends projen_1.Component {
|
|
11
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.
|
|
11
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.22" };
|
|
12
12
|
constructor(project, appEntryPoint = 'src/app.ts') {
|
|
13
13
|
super(project, 'AppRuntimeScaffold');
|
|
14
14
|
const app = new projen_1.SourceCode(project, appEntryPoint);
|
|
@@ -13,7 +13,7 @@ const workflow_purpose_1 = require("../common/workflow-purpose");
|
|
|
13
13
|
* application source, a database, and an app-level build/test workflow.
|
|
14
14
|
*/
|
|
15
15
|
class CdkAppProject extends cdk_infra_project_1.CdkInfraProject {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.22" };
|
|
17
17
|
constructor(options) {
|
|
18
18
|
super(options);
|
|
19
19
|
new app_runtime_scaffold_1.AppRuntimeScaffold(this, options.appEntryPoint ?? 'src/app.ts');
|
|
@@ -11,7 +11,7 @@ const edge_networking_constructs_1 = require("./components/edge-networking-const
|
|
|
11
11
|
* externally-built images). Reference example: SimulcastAVDelivery.
|
|
12
12
|
*/
|
|
13
13
|
class CdkInfraProject extends cdk_typescript_base_1.CdkTypescriptProject {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.22" };
|
|
15
15
|
constructor(options) {
|
|
16
16
|
super(options);
|
|
17
17
|
if (options.ecrEcs?.enabled) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { awscdk } from 'projen';
|
|
2
2
|
import { CommonCdkOptions } from './options';
|
|
3
3
|
import { EnvironmentOptions } from '../common/environment-options';
|
|
4
|
+
import { SonarWorkflow } from '../common/sonar-workflow';
|
|
4
5
|
export interface CdkTypescriptProjectOptions extends CommonCdkOptions {
|
|
5
6
|
readonly environments?: (string | EnvironmentOptions)[];
|
|
6
7
|
}
|
|
@@ -12,5 +13,7 @@ export interface CdkTypescriptProjectOptions extends CommonCdkOptions {
|
|
|
12
13
|
* `ManualDeployWorkflow` when `environments` is provided.
|
|
13
14
|
*/
|
|
14
15
|
export declare class CdkTypescriptProject extends awscdk.AwsCdkTypeScriptApp {
|
|
16
|
+
/** Set only when `sonarHostUrl` is provided. */
|
|
17
|
+
readonly sonarWorkflow?: SonarWorkflow;
|
|
15
18
|
constructor(options: CdkTypescriptProjectOptions);
|
|
16
19
|
}
|