@xpertss/projen-types 0.0.20 → 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.
Files changed (45) hide show
  1. package/.jsii +535 -291
  2. package/API.md +1808 -488
  3. package/README.md +46 -17
  4. package/lib/actions/action-build-workflow.js +1 -1
  5. package/lib/actions/action-dogfood-workflow.js +1 -1
  6. package/lib/actions/action-sonar-workflow.d.ts +10 -29
  7. package/lib/actions/action-sonar-workflow.js +9 -58
  8. package/lib/actions/github-action-project.d.ts +15 -22
  9. package/lib/actions/github-action-project.js +18 -13
  10. package/lib/cdk/app-runtime-scaffold.js +1 -1
  11. package/lib/cdk/cdk-app-project.js +1 -1
  12. package/lib/cdk/cdk-infra-project.js +1 -1
  13. package/lib/cdk/cdk-typescript-base.d.ts +3 -0
  14. package/lib/cdk/cdk-typescript-base.js +25 -2
  15. package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
  16. package/lib/cdk/components/edge-networking-constructs.js +1 -1
  17. package/lib/cdk/database-component.js +1 -1
  18. package/lib/cdk/options.d.ts +22 -1
  19. package/lib/cdk/options.js +1 -1
  20. package/lib/common/projen-drift-check-workflow.js +1 -1
  21. package/lib/common/sonar-options.d.ts +29 -0
  22. package/lib/common/sonar-options.js +3 -0
  23. package/lib/common/sonar-workflow.d.ts +48 -0
  24. package/lib/common/sonar-workflow.js +75 -0
  25. package/lib/common/workflow-change-notice-workflow.js +1 -1
  26. package/lib/index.d.ts +2 -0
  27. package/lib/index.js +3 -1
  28. package/lib/java/components/cdk-deploy-hook.js +1 -1
  29. package/lib/java/components/code-index-workflow.js +1 -1
  30. package/lib/java/components/docker-publish.js +1 -1
  31. package/lib/java/components/flyway-migration.js +1 -1
  32. package/lib/java/components/github-packages-publish.js +1 -1
  33. package/lib/java/components/maven-central-publish.js +1 -1
  34. package/lib/java/components/maven-upgrade-report.js +1 -1
  35. package/lib/java/java-app-project.js +1 -1
  36. package/lib/java/java-library-project.js +1 -1
  37. package/lib/java/java-maven-base.d.ts +6 -2
  38. package/lib/java/java-maven-base.js +19 -15
  39. package/lib/java/java-service-project.js +1 -1
  40. package/lib/java/java-spring-boot-project.js +1 -1
  41. package/lib/java/maven/maven-module.js +1 -1
  42. package/lib/java/maven/maven-pom.js +1 -1
  43. package/lib/java/options.d.ts +3 -4
  44. package/lib/java/options.js +1 -1
  45. 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) and `--sonar-host-url`
64
- (`git_hub_action`). Any other plainly-typed option can be passed the same
65
- way - `--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
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)).
@@ -214,6 +215,7 @@ You get:
214
215
  - `cdk.json`, `cdk synth` / `cdk diff` / `cdk deploy` tasks, and the standard `AwsCdkTypeScriptApp` layout (CDK 2.189.1 by default).
215
216
  - `.github/workflows/build.yml` - PR build that hard-fails on projen drift.
216
217
  - `.github/workflows/deploy.yml` - manual dispatch with one `deploy-<env>` job per environment (runs `cdk deploy --all` with `--context environment=<env>`); `requiresApproval` environments get a GitHub Environment approval gate.
218
+ - `LICENSE` (MIT by default), `.editorconfig`, and the projen drift check.
217
219
  - `src/constructs/edge-networking.ts` - helper constructs only for the requested `edgeResources` (`cloudfront`, `route53`, `apigateway`, `cognito`, `sqs`).
218
220
  - `src/constructs/ecr-ecs.ts` when `ecrEcs.enabled` - ECR repo + Fargate service; `externalImageSource: true` (default) means the service pulls an image built outside this repo.
219
221
 
@@ -328,7 +330,7 @@ You get:
328
330
  - **exact versions only**: a range such as `^1`, `~1.2` or `[1,2)` fails the synth
329
331
  - the compiler level, enforcer rule and JUnit line all follow `javaVersion`
330
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/`.
331
- - `.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`, plus a SonarQube step when `sonarProjectKey` is set. See [Adding CI jobs](#adding-ci-jobs-to-a-java-project).
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).
332
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`.
333
335
  - the projen drift check, `LICENSE` (MIT by default), `.editorconfig`, and a generated `package.json` that pins the projen toolchain exactly.
334
336
  - no sample code, unless `sample: true` on a single-module project.
@@ -352,7 +354,7 @@ const project = new JavaLibraryProject({
352
354
  groupId: 'org.xpertss',
353
355
  artifactId: 'common-utils',
354
356
  version: '1.0.0',
355
- sonarProjectKey: 'org.xpertss:common-utils',
357
+ sonarHostUrl: 'https://sonarcloud.io', // opt-in: adds sonar.yml (see SonarCloud)
356
358
  mavenCentralOidc: true,
357
359
  });
358
360
 
@@ -490,7 +492,7 @@ import { GitHubActionProject } from '@xpertss/projen-types';
490
492
  const project = new GitHubActionProject({
491
493
  name: 'auto-commit',
492
494
  description: 'Stage a folder and, only if it changed, commit and push it',
493
- sonarHostUrl: 'https://sonarcloud.io', // required, no default - your SonarCloud URL
495
+ sonarHostUrl: 'https://sonarcloud.io', // optional - set it to add sonar.yml (see SonarCloud)
494
496
  sonarOrganization: 'xpertss', // default - your SonarCloud org key
495
497
  dogfood: {
496
498
  // Two scenario steps: the "changed" path and the "no-op" path are both
@@ -537,14 +539,14 @@ project.synth();
537
539
  You get:
538
540
 
539
541
  - `action.yml` and `auto-commit.sh` are hand-written - this type only lints their content via `build.yml`'s shellcheck/yamllint/actionlint checks.
540
- - `.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).
541
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.
542
- - `.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)).
543
545
  - `.github/workflows/release.yml` - `feat:`/`fix:` commits on `main` bump the version, tag `vX.Y.Z`, and create a GitHub Release.
544
546
  - `.github/workflows/projen-drift-check.yml` and `workflow-change-notice.yml` - drift detection and a change notice, always included.
545
547
  - `package.json` (**private**, version source only), `.yamllint`, `LICENSE` (MIT by default), and a `README.md` template - all regenerated by `npx projen`.
546
548
 
547
- Needs the same two secrets as everything else in this package: `PROJEN_GITHUB_TOKEN` (used for automated PR comments) and `SONAR_TOKEN` (the Sonar scan). 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
+ 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).
548
550
 
549
551
  ## Java version support
550
552
 
@@ -609,6 +611,9 @@ CDK project types (`CdkInfraProjectOptions` / `CdkAppProjectOptions`):
609
611
  | `name` | - (required) | Project name; must match `package.json` |
610
612
  | `cdkVersion` | `2.189.1` | AWS CDK version |
611
613
  | `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
614
+ | `licensed` | `true` | Write a `LICENSE` |
615
+ | `license` | `MIT` | SPDX identifier for the `LICENSE` |
616
+ | `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
612
617
  | `environments` | - (no `deploy` workflow) | Deploy targets for the `deploy` workflow; strings or `EnvironmentOptions` |
613
618
  | `ecrEcs` | - | `EcrEcsOptions` - `enabled`, `externalImageSource` (default `true`) |
614
619
  | `edgeResources` | - | Subset of `cloudfront`, `route53`, `apigateway`, `cognito`, `sqs` |
@@ -633,10 +638,10 @@ Java project types (`JavaMavenProjectOptions` and everything built on it - `Java
633
638
  | `pluginVersions` | - | Exact-version overrides for this package's defaults, keyed by `groupId/artifactId` |
634
639
  | `licensed` | `true` | Write a `LICENSE` |
635
640
  | `license` | `MIT` | SPDX identifier for the `LICENSE` |
636
- | `copyrightOwner` / `copyrightPeriod` | `xpertss` / current year | Named in the `LICENSE` |
641
+ | `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
637
642
  | `editorconfig` | `true` | Write a projen-managed `.editorconfig` (also on the CDK and action types) |
638
643
  | `upgradeWorkflow` | `true` | Generate the nightly update report (`upgrade.yml`) |
639
- | `sonarProjectKey` | - | SonarQube project key; the sonar step is skipped when unset |
644
+ | Sonar options | - | `sonarHostUrl`, `sonarOrganization`, `sonarTokenSecret`, `sonarPullRequestGate`, `sonarProjectKey` - SonarCloud is opt-in; see [SonarCloud (opt-in)](#sonarcloud-opt-in) |
640
645
  | `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
641
646
  | `springBootVersion` | newest Boot for `javaVersion` (Spring Boot types only) | Exact Spring Boot version: the BOM and `spring-boot-maven-plugin` |
642
647
  | `cdkDeployTargetRepo` | - (service only; `deploy-cdk.yml` fails until set) | Companion CDK repo (`owner/repo`) whose `deploy.yml` the deploy hook dispatches |
@@ -688,12 +693,10 @@ Plain strings (`'dev'`) are shorthand for `{ name: 'dev' }`.
688
693
  | --- | --- | --- |
689
694
  | `name` | - (required) | Project name |
690
695
  | `description` | - | One-line description; used in the default README template and recorded in the private `package.json` |
691
- | `sonarHostUrl` | - (required) | URL of your SonarCloud instance (e.g. `https://sonarcloud.io`); must be reachable from github.com-hosted runners |
692
- | `sonarOrganization` | `xpertss` | SonarCloud org key (`sonar.organization`); required by the Scanner CLI, not derived from the token |
693
- | `sonarTokenSecret` | `SONAR_TOKEN` | GitHub secret holding the Sonar token |
694
- | `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) |
695
697
  | `dogfood` | - (a `test-dogfood.yml` that fails until you declare one) | `ActionDogfoodOptions` - the scenario that exercises the action end-to-end via `uses: ./` |
696
698
  | `license` | `MIT` | SPDX identifier for the generated `LICENSE` |
699
+ | `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
697
700
  | `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT (drift-check PR comments); a dogfood that passes a `token` input must reference this secret in the step's `inputs` |
698
701
 
699
702
  `ActionDogfoodOptions`/`ActionDogfoodStep` - the dogfood scenario (`test-dogfood.yml`):
@@ -715,12 +718,38 @@ interface ActionDogfoodStep {
715
718
 
716
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`.
717
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
+
718
747
  ## Required GitHub secrets
719
748
 
720
749
  | Secret | Used by | Notes |
721
750
  | --- | --- | --- |
722
751
  | `PROJEN_GITHUB_TOKEN` | all types | PAT for projen's self-mutation/automation; override via `gheTokenSecret` |
723
- | `SONAR_TOKEN` | Java types with `sonarProjectKey`; `GitHubActionProject` | SonarQube scan step in `build.yml` / `sonar.yml`; override via `sonarTokenSecret` on `GitHubActionProject` |
752
+ | `SONAR_TOKEN` | any type with `sonarHostUrl` set | SonarCloud scan in `sonar.yml`; override the secret name via `sonarTokenSecret` |
724
753
  | `DOCKER_USERNAME` / `DOCKER_PASSWORD` | `JavaServiceProject` | Docker image push |
725
754
  | `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PASSPHRASE`, `MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD` | `JavaLibraryProject` without `mavenCentralOidc` | Not needed with OIDC trusted publishing |
726
755
 
@@ -775,7 +804,7 @@ The project types are composed from smaller components you can also attach to yo
775
804
  | `CodeIndexWorkflow` | `JavaMavenProject` | Code index generation on push to `main` |
776
805
  | `ActionBuildWorkflow` | `GitHubProject` | The `lint` task (shellcheck/yamllint/pinned actionlint) + `build.yml` |
777
806
  | `ActionDogfoodWorkflow` | `GitHubProject` | `test-dogfood.yml` from an `ActionDogfoodOptions` scenario |
778
- | `ActionSonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI) |
807
+ | `SonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI); opt-in, shared by every type via `sonarHostUrl` |
779
808
 
780
809
  Example - adding a Docker publish to a `JavaMavenProject` (`JavaServiceProject` is the packaged version of this, with Spring Boot):
781
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.20" };
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.20" };
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 { Component, github } from 'projen';
2
- export interface ActionSonarWorkflowOptions {
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
- * AD-001 Layer 2: SonarCloud via the Scanner CLI only (never
25
- * `SonarSource/sonarqube-scan-action` - third-party, and it carried a
26
- * security advisory). `sonar.inclusions` is set explicitly since default
27
- * inclusions may skip `action.yml` outside `.github/`.
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 Component {
30
- readonly workflow: github.GithubWorkflow;
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 projen_1 = require("projen");
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
- * AD-001 Layer 2: SonarCloud via the Scanner CLI only (never
13
- * `SonarSource/sonarqube-scan-action` - third-party, and it carried a
14
- * security advisory). `sonar.inclusions` is set explicitly since default
15
- * inclusions may skip `action.yml` outside `.github/`.
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 projen_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.20" };
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, 'ActionSonarWorkflow');
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXNvbmFyLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLXNvbmFyLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBMkM7QUFDM0MsaUVBQWlFO0FBRWpFLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUM7QUFDM0MsTUFBTSxvQkFBb0IsR0FDeEIsa0VBQWtFLENBQUM7QUEyQnJFOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxrQkFBUzs7SUFDaEMsUUFBUSxDQUF3QjtJQUVoRCxZQUNFLEtBQTJCLEVBQzNCLE9BQW1DO1FBRW5DLEtBQUssQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLGFBQWEsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDO1FBQzdELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBQSxzQ0FBbUIsRUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLDJEQUEyRCxDQUM1RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDekIsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUM5RCxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLGdCQUFnQixLQUFLLEVBQUU7WUFDM0QsS0FBSyxFQUFFO2dCQUNMLGVBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUMvQjtvQkFDRSxJQUFJLEVBQUUsdUJBQXVCO29CQUM3QixHQUFHLEVBQUU7MEhBQzJHLHFCQUFxQjtRQUN2SSxvQkFBb0I7OzJCQUVELHFCQUFxQjtDQUMvQztpQkFDUTtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixHQUFHLEVBQUU7cUJBQ00sT0FBTyxDQUFDLFlBQVk7eUJBQ2hCLGlCQUFpQjt1QkFDbkIsS0FBSyxDQUFDLElBQUk7OztnQ0FHRDtpQkFDdkI7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNURILGtEQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIFBpbm5lZCByZWxlYXNlICsgdmVyaWZpZWQgU0hBLTI1NiAobGludXgteDY0KSAtIHVwZ3JhZGUgaXMgYSByZXZpZXdlZCBkaWZmXG4vLyBvZiB0aGlzIGNvbnN0YW50LCBuZXZlciBhIGZsb2F0aW5nIHZlcnNpb24gKEFELTAwMSkuXG5jb25zdCBTT05BUl9TQ0FOTkVSX1ZFUlNJT04gPSAnOC4xLjAuNjM4OSc7XG5jb25zdCBTT05BUl9TQ0FOTkVSX1NIQTI1NiA9XG4gICdiYjhmNzA5ZjljYjczMzUyZjhkMTI2MGEzYjNjNTA2YzBmNDExNDY3NTRiYzYzMDc2MmMxMjZkNzk1NDk5ZDBiJztcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Tb25hcldvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIG9yZydzIFNvbmFyQ2xvdWQgaW5zdGFuY2UgKGUuZy4gYGh0dHBzOi8vc29uYXJjbG91ZC5pb2ApLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdCAtIGEgZ3Vlc3NlZCBzZXJ2ZXIgaXMgd29yc2UgdGhhbiBhIGxvdWQgZmFpbHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvbmFySG9zdFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb25hckNsb3VkIG9yZ2FuaXphdGlvbiBrZXkgKGBzb25hci5vcmdhbml6YXRpb25gKS4gTWFuZGF0b3J5IGZvciB0aGVcbiAgICogU2Nhbm5lciBDTEkgb24gU29uYXJDbG91ZCAtIGl0IGlzIG5vdCBkZXJpdmVkIGZyb20gdGhlIHRva2VuLCBzbyBhIHNjYW5cbiAgICogd2l0aG91dCBpdCBhbHdheXMgZmFpbHMuXG4gICAqIEBkZWZhdWx0IFwieHBlcnRzc1wiXG4gICAqL1xuICByZWFkb25seSBzb25hck9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJTT05BUl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IHNvbmFyVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHNvbmFyLnltbGAgYWxzbyBydW5zIG9uIGBwdWxsX3JlcXVlc3RgIGFzIGEgcGFzcy9mYWlsIGdhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyUHVsbFJlcXVlc3RHYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBRC0wMDEgTGF5ZXIgMjogU29uYXJDbG91ZCB2aWEgdGhlIFNjYW5uZXIgQ0xJIG9ubHkgKG5ldmVyXG4gKiBgU29uYXJTb3VyY2Uvc29uYXJxdWJlLXNjYW4tYWN0aW9uYCAtIHRoaXJkLXBhcnR5LCBhbmQgaXQgY2FycmllZCBhXG4gKiBzZWN1cml0eSBhZHZpc29yeSkuIGBzb25hci5pbmNsdXNpb25zYCBpcyBzZXQgZXhwbGljaXRseSBzaW5jZSBkZWZhdWx0XG4gKiBpbmNsdXNpb25zIG1heSBza2lwIGBhY3Rpb24ueW1sYCBvdXRzaWRlIGAuZ2l0aHViL2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Tb25hcldvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBnaXRodWIuR2l0aHViV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGdpdGh1Yi5HaXRIdWJQcm9qZWN0LFxuICAgIG9wdGlvbnM6IEFjdGlvblNvbmFyV29ya2Zsb3dPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgJ0FjdGlvblNvbmFyV29ya2Zsb3cnKTtcblxuICAgIGlmICghb3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9uU29uYXJXb3JrZmxvdyByZXF1aXJlcyBzb25hckhvc3RVcmwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBnaCA9IHNjb3BlLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBY3Rpb25Tb25hcldvcmtmbG93IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYXJUb2tlblNlY3JldCA9IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCA/PyAnU09OQVJfVE9LRU4nO1xuICAgIGNvbnN0IHB1bGxSZXF1ZXN0R2F0ZSA9IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUgPz8gdHJ1ZTtcbiAgICBjb25zdCBzb25hck9yZ2FuaXphdGlvbiA9IG9wdGlvbnMuc29uYXJPcmdhbml6YXRpb24gPz8gJ3hwZXJ0c3MnO1xuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBnaXRodWIuR2l0aHViV29ya2Zsb3coZ2gsICdzb25hcicpO1xuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLndvcmtmbG93LmZpbGUsXG4gICAgICAnU3RhdGljLWFuYWx5c2lzIHNjYW4gb2YgdGhlIGFjdGlvbiBvbiB0aGUgb3JnIFNvbmFyQ2xvdWQuJyxcbiAgICApO1xuICAgIHRoaXMud29ya2Zsb3cub24oe1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10gfSxcbiAgICAgIC4uLihwdWxsUmVxdWVzdEdhdGUgPyB7IHB1bGxSZXF1ZXN0OiB7fSB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdzb25hcicsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIGVudjogeyBTT05BUl9UT0tFTjogYFxcJHt7IHNlY3JldHMuJHtzb25hclRva2VuU2VjcmV0fSB9fWAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIGdpdGh1Yi5Xb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KCksXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBzb25hci1zY2FubmVyJyxcbiAgICAgICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuY3VybCAtZnNTTCAtbyAvdG1wL3NvbmFyLXNjYW5uZXIuemlwIFwiaHR0cHM6Ly9iaW5hcmllcy5zb25hcnNvdXJjZS5jb20vRGlzdHJpYnV0aW9uL3NvbmFyLXNjYW5uZXItY2xpL3NvbmFyLXNjYW5uZXItY2xpLSR7U09OQVJfU0NBTk5FUl9WRVJTSU9OfS1saW51eC14NjQuemlwXCJcbmVjaG8gXCIke1NPTkFSX1NDQU5ORVJfU0hBMjU2fSAgL3RtcC9zb25hci1zY2FubmVyLnppcFwiIHwgc2hhMjU2c3VtIC1jIC1cbnVuemlwIC1xIC90bXAvc29uYXItc2Nhbm5lci56aXAgLWQgL3RtcFxuZWNobyBcIi90bXAvc29uYXItc2Nhbm5lci0ke1NPTkFSX1NDQU5ORVJfVkVSU0lPTn0tbGludXgteDY0L2JpblwiID4+IFwiJEdJVEhVQl9QQVRIXCJcbmAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnU2NhbicsXG4gICAgICAgICAgcnVuOiBgc29uYXItc2Nhbm5lciBcXFxcXG4gIC1Ec29uYXIuaG9zdC51cmw9JHtvcHRpb25zLnNvbmFySG9zdFVybH0gXFxcXFxuICAtRHNvbmFyLm9yZ2FuaXphdGlvbj0ke3NvbmFyT3JnYW5pemF0aW9ufSBcXFxcXG4gIC1Ec29uYXIucHJvamVjdEtleT0ke3Njb3BlLm5hbWV9IFxcXFxcbiAgLURzb25hci5wcm9qZWN0VmVyc2lvbj1cIiQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFsd2F5cylcIiBcXFxcXG4gIC1Ec29uYXIuaW5jbHVzaW9ucz0uZ2l0aHViL3dvcmtmbG93cy8qKixhY3Rpb24ueW1sLCoqLyouc2ggXFxcXFxuICAtRHNvbmFyLnF1YWxpdHlnYXRlLndhaXQ9dHJ1ZWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
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 { ActionSonarWorkflow } from './action-sonar-workflow';
5
- export interface GitHubActionProjectOptions extends github.GitHubProjectOptions {
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
@@ -57,6 +39,16 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
57
39
  * @default "MIT"
58
40
  */
59
41
  readonly license?: string;
42
+ /**
43
+ * Copyright owner named in the `LICENSE`.
44
+ * @default "Xpert Software"
45
+ */
46
+ readonly copyrightOwner?: string;
47
+ /**
48
+ * Copyright period named in the `LICENSE`.
49
+ * @default - the current year
50
+ */
51
+ readonly copyrightPeriod?: string;
60
52
  /**
61
53
  * Write a projen-managed `.editorconfig`.
62
54
  * @default true
@@ -76,7 +68,8 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
76
68
  export declare class GitHubActionProject extends github.GitHubProject {
77
69
  readonly buildWorkflow: ActionBuildWorkflow;
78
70
  readonly dogfoodWorkflow: ActionDogfoodWorkflow;
79
- readonly sonarWorkflow: ActionSonarWorkflow;
71
+ /** Set only when `sonarHostUrl` is provided. */
72
+ readonly sonarWorkflow?: SonarWorkflow;
80
73
  readonly release: release.Release;
81
74
  constructor(options: GitHubActionProjectOptions);
82
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.20" };
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).
@@ -104,7 +102,8 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
104
102
  new workflow_change_notice_workflow_1.WorkflowChangeNoticeWorkflow(this);
105
103
  (0, license_file_1.addLicenseFile)(this, {
106
104
  spdx: options.license ?? 'MIT',
107
- copyrightOwner: 'xpertss',
105
+ copyrightOwner: options.copyrightOwner ?? 'Xpert Software',
106
+ copyrightPeriod: options.copyrightPeriod,
108
107
  });
109
108
  // `.projenrc.ts` + `npx projen`, same as every other type here. A bare
110
109
  // GitHubProject has no default task that runs a projenrc on its own, so
@@ -137,12 +136,18 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
137
136
  });
138
137
  this.buildWorkflow = new action_build_workflow_1.ActionBuildWorkflow(this);
139
138
  this.dogfoodWorkflow = new action_dogfood_workflow_1.ActionDogfoodWorkflow(this, options.dogfood);
140
- this.sonarWorkflow = new action_sonar_workflow_1.ActionSonarWorkflow(this, {
141
- sonarHostUrl: options.sonarHostUrl,
142
- sonarOrganization: options.sonarOrganization,
143
- sonarTokenSecret: options.sonarTokenSecret,
144
- sonarPullRequestGate: options.sonarPullRequestGate,
145
- });
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
+ }
146
151
  // `githubRelease` defaults to true, which auto-wires
147
152
  // `publishToGitHubReleases` - its `gh release create ... --target
148
153
  // $GITHUB_SHA` creates the tag *and* the release together for our
@@ -170,4 +175,4 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
170
175
  }
171
176
  }
172
177
  exports.GitHubActionProject = GitHubActionProject;
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FNZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUseURBQXdEO0FBQ3hELHVGQUFpRjtBQUNqRix1REFBaUU7QUFDakUsK0ZBQXlGO0FBQ3pGLGlFQUFpRTtBQUVqRSwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLCtEQUErRDtBQUMvRCx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQXlFeEMsU0FBUyxxQkFBcUIsQ0FBQyxPQUFtQztJQUNoRSxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUk7O0VBRXhCLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTs7Ozs7a0JBS1QsT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7OztDQWU3QixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsZUFBTSxDQUFDLGFBQWE7O0lBQzNDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUF3QjtJQUN2QyxhQUFhLENBQXNCO0lBQ25DLE9BQU8sQ0FBa0I7SUFFekMsWUFBWSxPQUFtQztRQUM3QyxJQUFJ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WTtZQUNsQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1lBQzVDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDMUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsa0VBQWtFO1FBQ2xFLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsOERBQThEO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxFQUFFLE1BQU07WUFDZCxtRUFBbUU7WUFDbkUsd0RBQXdEO1lBQ3hELGtCQUFrQixFQUFFLE1BQU07WUFDMUIsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDaEMsV0FBVyxFQUFFLGNBQWM7WUFDM0IsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkQsY0FBYyxFQUFFLGdCQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNuRCxXQUFXLEVBQUUsMEJBQTBCLHNCQUFzQixFQUFFO1lBQy9ELHlCQUF5QixFQUFFO2dCQUN6QixFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxrRUFBa0U7UUFDbEUsNkNBQTZDO1FBQzdDLElBQUEsc0NBQW1CLEVBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsK0JBQStCLENBQUMsRUFDakQscUZBQXFGLENBQ3RGLENBQUM7SUFDSixDQUFDOztBQTNISCxrREE0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBKc29uRmlsZSxcbiAgUmVsZWFzYWJsZUNvbW1pdHMsXG4gIFlhbWxGaWxlLFxuICBnaXRodWIsXG4gIHJlbGVhc2UsXG59IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBY3Rpb25CdWlsZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uRG9nZm9vZE9wdGlvbnMsIEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWRvZ2Zvb2Qtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uU29uYXJXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLXNvbmFyLXdvcmtmbG93JztcbmltcG9ydCB7IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vY29tbW9uL2VkaXRvcmNvbmZpZyc7XG5pbXBvcnQgeyBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzIH0gZnJvbSAnLi4vY29tbW9uL2ludGVybmFsLWFjdGlvbnMnO1xuaW1wb3J0IHsgYWRkTGljZW5zZUZpbGUgfSBmcm9tICcuLi9jb21tb24vbGljZW5zZS1maWxlJztcbmltcG9ydCB7IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW4tZHJpZnQtY2hlY2std29ya2Zsb3cnO1xuaW1wb3J0IHsgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjIH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbnJjLXRzJztcbmltcG9ydCB7IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctY2hhbmdlLW5vdGljZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBub3RlV29ya2Zsb3dQdXJwb3NlIH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LXB1cnBvc2UnO1xuXG4vLyBgcmVxdWlyZSgncHJvamVuL3BhY2thZ2UuanNvbicpYC9gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJylgIHJlc29sdmVcbi8vIHZpYSBOb2RlJ3Mgbm9ybWFsIG1vZHVsZSByZXNvbHV0aW9uLCBzbyBpbiBhICpwdWJsaXNoZWQqIHBhY2thZ2UgdGhlc2Vcbi8vIHJlYWQgdGhlIHZlcnNpb25zIGFjdHVhbGx5IGluc3RhbGxlZCBpbiB0aGUgY29uc3VtaW5nIHJlcG8nc1xuLy8gbm9kZV9tb2R1bGVzIC0gZXhhY3RseSB0aGUgXCJQUk9KRU5fVkVSU0lPTiBvZiB0aGUgc3ludGhcIiAvIFwidmVyc2lvbiBvZlxuLy8gdGhpcyBwYWNrYWdlIHRoYXQgc2NhZmZvbGRlZCB0aGUgcmVwb1wiIHRoZSBwcml2YXRlIHBhY2thZ2UuanNvbidzXG4vLyBkZXZEZXBlbmRlbmNpZXMgbmVlZCB0byBwaW4gKHNlZSBGMDEwIENJLWRlcGVuZGVuY2llcyBzZWN0aW9uKS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgncHJvamVuL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgUFJPSkVOX1RZUEVTX1ZFUlNJT046IHN0cmluZyA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5cbi8vIEV4YWN0IHBpbiwgcmVjb3JkZWQgYXMgYSBjb21wb25lbnQgY29uc3RhbnQgKEFELTAwMTogbm8gbGF0ZXN0L21vdmluZ1xuLy8gdGFnL3NlbXZlciByYW5nZSBpbiBhbnl0aGluZyBhIGdlbmVyYXRlZCByZXBvIGRlcGVuZHMgb24pLiBVcGdyYWRpbmcgdGhpc1xuLy8gaXMgYSByZXZpZXdlZCBkaWZmIG9mIHRoaXMgZmlsZS5cbmNvbnN0IENPTU1JVF9BTkRfVEFHX1ZFUlNJT04gPSAnMTMuMi4xJztcblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9uc1xuICBleHRlbmRzIGdpdGh1Yi5HaXRIdWJQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uLiBVc2VkIGluIHRoZSBkZWZhdWx0IFJFQURNRVxuICAgKiB0ZW1wbGF0ZSBhbmQgcmVjb3JkZWQgaW4gdGhlIHByaXZhdGUgYHBhY2thZ2UuanNvbmAuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2l0SHViIEFjdGlvbnMgc2VjcmV0IGhvbGRpbmcgdGhlIFBBVCB1c2VkIGZvclxuICAgKiBwcm9qZW4tYXV0b21hdGlvbiBQUiBjb21tZW50cyAoRjAwMykgYW5kIHRoZSBkcmlmdC1jaGVjaydzIFBSIGNvbW1lbnRzLlxuICAgKiBJdCBpcyAqKm5vdCoqIHdpcmVkIGludG8gdGhlIGRvZ2Zvb2QgYXV0b21hdGljYWxseTogYSBkb2dmb29kIHRoYXQgaW52b2tlc1xuICAgKiBhbiBhY3Rpb24gd2l0aCBhIGB0b2tlbmAgaW5wdXQgbXVzdCByZWZlcmVuY2UgdGhpcyBzZWNyZXQgaW4gdGhlIHN0ZXAnc1xuICAgKiBgaW5wdXRzYCAoZS5nLiBgdG9rZW46ICcke3sgc2VjcmV0cy5QUk9KRU5fR0lUSFVCX1RPS0VOIH19J2ApLlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgZ2hlVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVSTCBvZiB0aGUgb3JnJ3MgU29uYXJDbG91ZCBpbnN0YW5jZSAoZS5nLiBgaHR0cHM6Ly9zb25hcmNsb3VkLmlvYCkuXG4gICAqIE1VU1QgYmUgcmVhY2hhYmxlIGZyb20gZ2l0aHViLmNvbS1ob3N0ZWQgKHB1YmxpYykgcnVubmVycyAoQUQtMDAxKS5cbiAgICogUmVxdWlyZWQsIG5vIGRlZmF1bHQ6IGEgZ3Vlc3NlZCBzZXJ2ZXIgaXMgd29yc2UgdGhhbiBhIGxvdWQgZmFpbHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvbmFySG9zdFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb25hckNsb3VkIG9yZ2FuaXphdGlvbiBrZXkgKGBzb25hci5vcmdhbml6YXRpb25gKSwgcmVxdWlyZWQgYnkgdGhlXG4gICAqIFNjYW5uZXIgQ0xJIG9uIFNvbmFyQ2xvdWQuXG4gICAqIEBkZWZhdWx0IFwieHBlcnRzc1wiXG4gICAqL1xuICByZWFkb25seSBzb25hck9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJTT05BUl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IHNvbmFyVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHNvbmFyLnltbGAgYWxzbyBydW5zIG9uIGBwdWxsX3JlcXVlc3RgIGFzIGEgcGFzcy9mYWlsIGdhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyUHVsbFJlcXVlc3RHYXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRvZ2Zvb2Qgc2NlbmFyaW8gKEFELTAwMSkuIFdoYXQgZml4dHVyZSBzdGF0ZSwgd2hhdCB0byBhc3NlcnQsIGFuZFxuICAgKiBob3cgdG8gY2xlYW4gdXAgYXJlIHNwZWNpZmllZCBieSB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoZVxuICAgKiBoaWdoZXN0LXJpc2sgYmVoYXZpb3Igb2YgdGhhdCBhY3Rpb24uXG4gICAqXG4gICAqIEl0cyB0eXBlIGlzIGEgc3RydWN0LCB3aGljaCBwcm9qZW4ncyBDTEkgY2Fubm90IHJlbmRlciBpbnRvIGEgcHJvamVucmMsXG4gICAqIHNvIGl0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gYnkgaGFuZCAtIGl0IGlzIHRoZXJlZm9yZSBvcHRpb25hbCwgYmVjYXVzZSBhXG4gICAqICpyZXF1aXJlZCogb3B0aW9uIGBwcm9qZW4gbmV3YCBjYW5ub3Qgc3VwcGx5IHdvdWxkIG1ha2UgdGhpcyBwcm9qZWN0XG4gICAqIHR5cGUgaW1wb3NzaWJsZSB0byBzY2FmZm9sZC4gQUQtMDAxJ3MgXCJuZXZlciBhIHNpbGVudCBuby1vcCBkb2dmb29kXCJcbiAgICogcnVsZSBpcyBlbmZvcmNlZCBpbnN0ZWFkIGJ5IHRoZSB3b3JrZmxvdyBpdCBnZW5lcmF0ZXMgaW4gdGhhdCBjYXNlOiBhXG4gICAqIHNpbmdsZSBzdGVwIHRoYXQgZmFpbHMgb24gZXZlcnkgUFIgdW50aWwgYSBzY2VuYXJpbyBpcyBkZWNsYXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgdGVzdC1kb2dmb29kLnltbGAgcnVucyBvbmUgZmFpbGluZyBzdGVwIHRoYXQgdGVsbHMgeW91IHRvXG4gICAqIGRlY2xhcmUgYSBzY2VuYXJpb1xuICAgKi9cbiAgcmVhZG9ubHkgZG9nZm9vZD86IEFjdGlvbkRvZ2Zvb2RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTUERYIGlkZW50aWZpZXIgZm9yIHRoZSBnZW5lcmF0ZWQgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIk1JVFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZSBhIHByb2plbi1tYW5hZ2VkIGAuZWRpdG9yY29uZmlnYC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yY29uZmlnPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFJlYWRtZUNvbnRlbnRzKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAjICR7b3B0aW9ucy5uYW1lfVxuXG4ke29wdGlvbnMuZGVzY3JpcHRpb24gPz8gJyd9XG5cbiMjIFVzYWdlXG5cblxcYFxcYFxcYHlhbWxcbi0gdXNlczogeHBlcnRzcy8ke29wdGlvbnMubmFtZX1APHJlZj5cblxcYFxcYFxcYFxuXG4jIyBCdW1waW5nXG5cbkEgXFxgZmVhdDpcXGAvXFxgZml4OlxcYCBjb21taXQgcHVzaGVkIHRvIFxcYG1haW5cXGAgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseTogYnVtcCxcbnRhZyBcXGB2WC5ZLlpcXGAsIEdpdEh1YiBSZWxlYXNlLiBTZWUgXFxgLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxcXGAuXG5cbiMjIFRydXN0IGNvbnRyYWN0XG5cblRoaXMgaXMgYSBjb21wb3NpdGUgKHNoZWxsKSBhY3Rpb24gLSBubyBOb2RlL25wbSBhdCBydW50aW1lLCBubyBEb2NrZXIuIEl0c1xuQ0kgbGludCBnYXRlIChcXGBidWlsZC55bWxcXGApLCBkb2dmb29kIHRlc3QgKFxcYHRlc3QtZG9nZm9vZC55bWxcXGApLCBhbmQgU29uYXJcbnNjYW4gKFxcYHNvbmFyLnltbFxcYCkgYXJlIHNjYWZmb2xkZWQgYnkgXFxgQHhwZXJ0c3MvcHJvamVuLXR5cGVzXFxgJ1xuXFxgR2l0SHViQWN0aW9uUHJvamVjdFxcYDsgb25seSBcXGBhY3Rpb24ueW1sXFxgIGFuZCBpdHMgc2hlbGwgc2NyaXB0cyBhcmVcbmhhbmQtY29tbWl0dGVkLlxuYDtcbn1cblxuLyoqXG4gKiBTY2FmZm9sZHMgdGhlIHJlcG8gbGlmZWN5Y2xlIChBRC0wMDEpIGFyb3VuZCBhIGhhbmQtY29tbWl0dGVkLCBjb21wb3NpdGVcbiAqIChzaGVsbCkgR2l0SHViIEFjdGlvbjogdGhlIGBidWlsZGAvYHRlc3QtZG9nZm9vZGAvYHNvbmFyYC9gcmVsZWFzZWBcbiAgKiB3b3JrZmxvd3MsIHZlcnNpb25pbmcgYW5kIHJlbGVhc2UgZGlzY2lwbGluZSwgdGhlIEYwMDMgdmVyaWZ5IGNvbXBvbmVudHMsXG4gICogYW5kIHJlcG8gYm9pbGVycGxhdGUgKGEgcHJpdmF0ZSB2ZXJzaW9uLXNvdXJjZSBgcGFja2FnZS5qc29uYCwgYC55YW1sbGludGAsXG4gICogYExJQ0VOU0VgLCBhbmQgYSBgUkVBRE1FLm1kYCB0ZW1wbGF0ZSkuIFRoZVxuICogYWN0aW9uJ3Mgb3duIGNvbnRlbnRcbiAqIChgYWN0aW9uLnltbGAsIGl0cyBzaGVsbCBzY3JpcHRzLCBgdGVzdC9gIGZpeHR1cmVzKSBpcyBhdXRob3JlZCBieSBoYW5kXG4gKiBwZXIgdGhlIGFjdGlvbidzIG93biBGIyMjIHNwZWMgLSB0aGlzIHR5cGUgb25seSBsaW50cyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkFjdGlvblByb2plY3QgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBidWlsZFdvcmtmbG93OiBBY3Rpb25CdWlsZFdvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgZG9nZm9vZFdvcmtmbG93OiBBY3Rpb25Eb2dmb29kV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBzb25hcldvcmtmbG93OiBBY3Rpb25Tb25hcldvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZTogcmVsZWFzZS5SZWxlYXNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnNvbmFySG9zdFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIHNvbmFySG9zdFVybCcpO1xuICAgIH1cbiAgICAvLyBBIGRlY2xhcmVkLWJ1dC1pbmNvbXBsZXRlIGRvZ2Zvb2QgaXMgc3RpbGwgYW4gZXJyb3IgLSBzZWVcbiAgICAvLyBgQWN0aW9uRG9nZm9vZFdvcmtmbG93YCwgd2hpY2ggb3ducyB0aGF0IGNoZWNrIChhbmQgdGhlXG4gICAgLy8gbm8tZG9nZm9vZC1kZWNsYXJlZCBjYXNlKS5cblxuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBQUiB0aXRsZXMgYXJlIG5vdCBnYXRlZDogYGZlYXQ6YC9gZml4OmAgbWF0dGVyIG9ubHkgYmVjYXVzZSB0aGV5IGRyaXZlXG4gICAgICAvLyB0aGUgcmVsZWFzZSB3b3JrZmxvdyAodmlhIGByZWxlYXNhYmxlQ29tbWl0c2ApLCBub3QgUFIgY2hlY2tzLiBUaGVcbiAgICAgIC8vIGNvbnZlbnRpb25hbC1jb21taXQgUFItdGl0bGUgbGludCBpcyBhZGRlZCBieSB0aGUgYEdpdEh1YmAgY29tcG9uZW50XG4gICAgICAvLyB1bmxlc3MgYGdpdGh1Yk9wdGlvbnMucHVsbFJlcXVlc3RMaW50YCBpcyBgZmFsc2VgIChpdCBkZWZhdWx0cyB0cnVlKS5cbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHsgLi4ub3B0aW9ucy5naXRodWJPcHRpb25zLCBwdWxsUmVxdWVzdExpbnQ6IGZhbHNlIH0sXG4gICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lID8/IHsgY29udGVudHM6IGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zKSB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZ2ggPSB0aGlzLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgLy8gSmV0QnJhaW5zIElERSBzdGF0ZSAoLmlkZWEvKSBpcyBuZXZlciB0cmFja2VkIGluIGdlbmVyYXRlZCByZXBvcywgYW5kXG4gICAgLy8gbmVpdGhlciBpcyAvc3BlYy8gKGxvY2FsIHBsYW5zIGFuZCBzcGVjczsgdGhlIHBhdHRlcm4gY292ZXJzIGV2ZXJ5XG4gICAgLy8gc3ViZGlyZWN0b3J5KS5cbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnLy5pZGVhLyonKTtcbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnL3NwZWMvJyk7XG5cbiAgICBpZiAob3B0aW9ucy5lZGl0b3Jjb25maWcgPz8gdHJ1ZSkge1xuICAgICAgYWRkRWRpdG9yQ29uZmlnKHRoaXMpO1xuICAgIH1cblxuICAgIG5ldyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3codGhpcywge1xuICAgICAgZ2hlVG9rZW5TZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgIH0pO1xuICAgIG5ldyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93KHRoaXMpO1xuXG4gICAgYWRkTGljZW5zZUZpbGUodGhpcywge1xuICAgICAgc3BkeDogb3B0aW9ucy5saWNlbnNlID8/ICdNSVQnLFxuICAgICAgY29weXJpZ2h0T3duZXI6ICd4cGVydHNzJyxcbiAgICB9KTtcblxuICAgIC8vIGAucHJvamVucmMudHNgICsgYG5weCBwcm9qZW5gLCBzYW1lIGFzIGV2ZXJ5IG90aGVyIHR5cGUgaGVyZS4gQSBiYXJlXG4gICAgLy8gR2l0SHViUHJvamVjdCBoYXMgbm8gZGVmYXVsdCB0YXNrIHRoYXQgcnVucyBhIHByb2plbnJjIG9uIGl0cyBvd24sIHNvXG4gICAgLy8gdGhpcyBpcyB3aGF0IG1ha2VzIGBucHggcHJvamVuYCB3b3JrIGluIHRoZSBnZW5lcmF0ZWQgcmVwbyBhdCBhbGwuXG4gICAgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjKHRoaXMpO1xuXG4gICAgLy8gcHJvamVuIG1hcmtzIGdlbmVyYXRlZCBmaWxlcyByZWFkLW9ubHkgKDA0NDQpIG9uIGRpc2sgYnkgZGVmYXVsdCwgYnV0XG4gICAgLy8gdGhpcyBvbmUgbXVzdCBzdGF5IG93bmVyLXdyaXRhYmxlOiB0aGUgZG9jdW1lbnRlZCB1cGRhdGUgZmxvd1xuICAgIC8vIChgbnBtIGkgLUQgQHhwZXJ0c3MvcHJvamVuLXR5cGVzQGxhdGVzdGApIG5lZWRzIG5wbSB0byByZXdyaXRlIHRoZVxuICAgIC8vIHBpbm5lZCB2ZXJzaW9ucyBpbiBhbiBleGlzdGluZyByZXBvLiBIYW5kLWVkaXRzIGFyZSBzdGlsbCBjYXVnaHQgYnlcbiAgICAvLyB0aGUgZHJpZnQgY2hlY2suXG4gICAgbmV3IEpzb25GaWxlKHRoaXMsICdwYWNrYWdlLmpzb24nLCB7XG4gICAgICBvYmo6IHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnMC4wLjAnLFxuICAgICAgICBwcml2YXRlOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgJ3Byb2plbic6IFBST0pFTl9WRVJTSU9OLFxuICAgICAgICAgICdAeHBlcnRzcy9wcm9qZW4tdHlwZXMnOiBQUk9KRU5fVFlQRVNfVkVSU0lPTixcbiAgICAgICAgICAnY29tbWl0LWFuZC10YWctdmVyc2lvbic6IENPTU1JVF9BTkRfVEFHX1ZFUlNJT04sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgbmV3IFlhbWxGaWxlKHRoaXMsICcueWFtbGxpbnQnLCB7XG4gICAgICBvYmo6IHtcbiAgICAgICAgZXh0ZW5kczogJ2RlZmF1bHQnLFxuICAgICAgICBydWxlczogeyAnbGluZS1sZW5ndGgnOiB7IG1heDogMTIwIH0gfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmJ1aWxkV29ya2Zsb3cgPSBuZXcgQWN0aW9uQnVpbGRXb3JrZmxvdyh0aGlzKTtcblxuICAgIHRoaXMuZG9nZm9vZFdvcmtmbG93ID0gbmV3IEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyh0aGlzLCBvcHRpb25zLmRvZ2Zvb2QpO1xuXG4gICAgdGhpcy5zb25hcldvcmtmbG93ID0gbmV3IEFjdGlvblNvbmFyV29ya2Zsb3codGhpcywge1xuICAgICAgc29uYXJIb3N0VXJsOiBvcHRpb25zLnNvbmFySG9zdFVybCxcbiAgICAgIHNvbmFyT3JnYW5pemF0aW9uOiBvcHRpb25zLnNvbmFyT3JnYW5pemF0aW9uLFxuICAgICAgc29uYXJUb2tlblNlY3JldDogb3B0aW9ucy5zb25hclRva2VuU2VjcmV0LFxuICAgICAgc29uYXJQdWxsUmVxdWVzdEdhdGU6IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUsXG4gICAgfSk7XG5cbiAgICAvLyBgZ2l0aHViUmVsZWFzZWAgZGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggYXV0by13aXJlc1xuICAgIC8vIGBwdWJsaXNoVG9HaXRIdWJSZWxlYXNlc2AgLSBpdHMgYGdoIHJlbGVhc2UgY3JlYXRlIC4uLiAtLXRhcmdldFxuICAgIC8vICRHSVRIVUJfU0hBYCBjcmVhdGVzIHRoZSB0YWcgKmFuZCogdGhlIHJlbGVhc2UgdG9nZXRoZXIgZm9yIG91clxuICAgIC8vIGNvbnRpbnVvdXMgKHB1c2gtdG8tbWFpbikgdHJpZ2dlci4gTm8gc2VwYXJhdGUgYHB1Ymxpc2hUb0dpdGAgY2FsbFxuICAgIC8vIG5lZWRlZCAodGhhdCBwYXRoIG9ubHkgZmlyZXMgZm9yIGEgbWFudWFsIHJlbGVhc2UgdHJpZ2dlcikuXG4gICAgdGhpcy5yZWxlYXNlID0gbmV3IHJlbGVhc2UuUmVsZWFzZSh0aGlzLCB7XG4gICAgICBicmFuY2g6ICdtYWluJyxcbiAgICAgIC8vIE5vIGJ1aWxkIGFydGlmYWN0IGZvciBhIGNvbXBvc2l0ZSBhY3Rpb24gKEFELTAwMSkgLSB0aGlzIGlzIG9ubHlcbiAgICAgIC8vIHdoZXJlIFJlbGVhc2Ugc3RhZ2VzIGl0cyBvd24gdmVyc2lvbi9jaGFuZ2Vsb2cgZmlsZXMuXG4gICAgICBhcnRpZmFjdHNEaXJlY3Rvcnk6ICdkaXN0JyxcbiAgICAgIHRhc2tzOiBbdGhpcy5idWlsZFdvcmtmbG93LnRhc2tdLFxuICAgICAgdmVyc2lvbkZpbGU6ICdwYWNrYWdlLmpzb24nLFxuICAgICAgcmVsZWFzYWJsZUNvbW1pdHM6IFJlbGVhc2FibGVDb21taXRzLmZlYXR1cmVzQW5kRml4ZXMoKSxcbiAgICAgIHJlbGVhc2VUcmlnZ2VyOiByZWxlYXNlLlJlbGVhc2VUcmlnZ2VyLmNvbnRpbnVvdXMoKSxcbiAgICAgIGJ1bXBQYWNrYWdlOiBgY29tbWl0LWFuZC10YWctdmVyc2lvbkAke0NPTU1JVF9BTkRfVEFHX1ZFUlNJT059YCxcbiAgICAgIHJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJlbGVhc2Ugd29ya2Zsb3cgaXMgY3JlYXRlZCBpbnNpZGUgYHJlbGVhc2UuUmVsZWFzZWAgKHByb2plblxuICAgIC8vIGludGVybmFsKSwgbm90IGJ5IHRoaXMgdHlwZSAtIHJlYWNoIGl0cyBmaWxlIGJ5IHBhdGggdG8gYW5ub3RhdGUgaXRcbiAgICAvLyBsaWtlIGV2ZXJ5IG90aGVyIGdlbmVyYXRlZCB3b3JrZmxvdy4gVGhpcyB0eXBlIGlzIGFsd2F5cyBhIHJvb3RcbiAgICAvLyBwcm9qZWN0LCBzbyBwcm9qZW4gbmFtZXMgaXQgYHJlbGVhc2UueW1sYC5cbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy50cnlGaW5kRmlsZSgnLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwnKSxcbiAgICAgICdDb250aW51b3VzIHJlbGVhc2Ugb24gcHVzaCB0byBtYWluOiBidW1wIHZlcnNpb24sIHRhZywgYW5kIGNyZWF0ZSBhIEdpdEh1YiBSZWxlYXNlLicsXG4gICAgKTtcbiAgfVxufVxuIl19
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.20" };
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.20" };
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.20" };
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
  }