@xpertss/projen-types 0.0.13 → 0.0.14
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 +2598 -746
- package/API.md +5752 -1419
- package/README.md +274 -35
- package/lib/actions/action-build-workflow.js +1 -1
- package/lib/actions/action-dogfood-workflow.js +1 -1
- package/lib/actions/action-sonar-workflow.js +1 -1
- package/lib/actions/github-action-project.d.ts +5 -0
- package/lib/actions/github-action-project.js +10 -3
- 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.js +10 -3
- 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 +5 -0
- package/lib/cdk/options.js +1 -1
- package/lib/common/ci-steps.d.ts +14 -0
- package/lib/common/ci-steps.js +30 -0
- package/lib/common/editorconfig.d.ts +12 -0
- package/lib/common/editorconfig.js +44 -0
- package/lib/common/projen-drift-check-workflow.js +5 -15
- package/lib/common/workflow-change-notice-workflow.js +1 -1
- package/lib/index.d.ts +4 -0
- package/lib/index.js +5 -1
- package/lib/java/components/cdk-deploy-hook.d.ts +2 -2
- package/lib/java/components/cdk-deploy-hook.js +2 -2
- package/lib/java/components/code-index-workflow.d.ts +2 -2
- package/lib/java/components/code-index-workflow.js +5 -3
- package/lib/java/components/docker-publish.d.ts +2 -2
- package/lib/java/components/docker-publish.js +2 -2
- package/lib/java/components/flyway-migration.d.ts +8 -3
- package/lib/java/components/flyway-migration.js +11 -5
- package/lib/java/components/github-packages-publish.d.ts +2 -2
- package/lib/java/components/github-packages-publish.js +2 -2
- package/lib/java/components/maven-central-publish.d.ts +2 -2
- package/lib/java/components/maven-central-publish.js +2 -2
- package/lib/java/components/maven-upgrade-report.d.ts +22 -0
- package/lib/java/components/maven-upgrade-report.js +61 -0
- package/lib/java/java-app-project.js +1 -1
- package/lib/java/java-library-project.d.ts +5 -1
- package/lib/java/java-library-project.js +14 -3
- package/lib/java/java-maven-base.d.ts +91 -8
- package/lib/java/java-maven-base.js +339 -24
- package/lib/java/java-service-project.d.ts +17 -5
- package/lib/java/java-service-project.js +20 -7
- package/lib/java/java-spring-boot-project.d.ts +30 -0
- package/lib/java/java-spring-boot-project.js +68 -0
- package/lib/java/java-versions.d.ts +40 -0
- package/lib/java/java-versions.js +106 -0
- package/lib/java/maven/maven-module.d.ts +47 -0
- package/lib/java/maven/maven-module.js +99 -0
- package/lib/java/maven/maven-pom.d.ts +143 -0
- package/lib/java/maven/maven-pom.js +337 -0
- package/lib/java/options.d.ts +128 -1
- package/lib/java/options.js +1 -1
- package/package.json +1 -1
- package/lib/common/upgrade-workflow.d.ts +0 -18
- package/lib/common/upgrade-workflow.js +0 -45
package/README.md
CHANGED
|
@@ -10,12 +10,26 @@ Instead of hand-maintaining `pom.xml`, `cdk.json`, and GitHub workflows, you dec
|
|
|
10
10
|
| --- | --- | --- | --- |
|
|
11
11
|
| `CdkInfraProject` | Pure-infrastructure CDK stacks (CloudFront, Route53, SQS, API Gateway, Cognito, ECR/ECS for externally-built images) | - | `build` (PR checks), `deploy` (manual dispatch) |
|
|
12
12
|
| `CdkAppProject` | Full TypeScript service behind API Gateway: infra + app source + database | - | `build`, `deploy`, `app-build` (PR checks) |
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
15
|
-
| `JavaAppProject` | GUI/TUI/CLI Java application | GitHub Packages | `build`, `upgrade` (nightly), `publish-ghpackages` |
|
|
13
|
+
| `JavaMavenProject` | Plain Maven project, single- or multi-module, no framework | - | `build`, `upgrade` (nightly report) |
|
|
14
|
+
| `JavaLibraryProject` | Reusable Java library | Maven Central | `build`, `upgrade` (nightly report), `publish-maven-central`, `codeindex` |
|
|
15
|
+
| `JavaAppProject` | GUI/TUI/CLI Java application | GitHub Packages | `build`, `upgrade` (nightly report), `publish-ghpackages` |
|
|
16
|
+
| `JavaSpringBootProject` | Spring Boot on Maven, single- or multi-module, **no Docker** | - | `build`, `upgrade` (nightly report) |
|
|
17
|
+
| `JavaServiceProject` | Spring Boot service deployed as a container | Docker Hub | `build`, `upgrade` (nightly report), `publish-docker`, `deploy-cdk` |
|
|
16
18
|
| `GitHubActionProject` | Reusable GitHub Action or Workflow | GitHub Releases | `build`, `test-dogfood`, `sonar`, `release` |
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
The Java types are layered, so pick the lowest layer that does what you need:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
JavaMavenProject java_maven Maven only; single- or multi-module; any supported Java line
|
|
24
|
+
├── JavaLibraryProject java_library + Maven Central publish, source/javadoc jars, code index
|
|
25
|
+
├── JavaAppProject java_app + GitHub Packages publish
|
|
26
|
+
└── JavaSpringBootProject java_spring_boot + Spring Boot BOM and executable-jar repackaging; no Docker/Flyway/CDK
|
|
27
|
+
└── JavaServiceProject java_service + Docker publish, Flyway, CDK deploy hook (single-module)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Every Java type targets a configurable Java line (`javaVersion`: `1.8`, `17`, `21` or `25`; see [Java version support](#java-version-support)), and every one except `JavaServiceProject` can be a multi-module Maven reactor (see [JavaMavenProject](#javamavenproject)).
|
|
31
|
+
|
|
32
|
+
One foundation class is also exported for advanced use: `CdkTypescriptProject` (shared CDK + TypeScript base for the CDK types).
|
|
19
33
|
|
|
20
34
|
All project types:
|
|
21
35
|
|
|
@@ -35,12 +49,34 @@ npx projen new --from @xpertss/projen-types cdk_infra --name my-project
|
|
|
35
49
|
|
|
36
50
|
That writes a starter `.projenrc.ts`, synthesizes the whole scaffold and
|
|
37
51
|
installs dependencies. The type names `projen new` accepts are `cdk_infra`,
|
|
38
|
-
`cdk_app`, `
|
|
39
|
-
`git_hub_action`; pass a bogus one to have it list them.
|
|
40
|
-
become flags: `--name` for every type, plus
|
|
41
|
-
(Java) and `--sonar-host-url`
|
|
42
|
-
option can be passed the same
|
|
43
|
-
`--
|
|
52
|
+
`cdk_app`, `java_maven`, `java_library`, `java_app`, `java_spring_boot`,
|
|
53
|
+
`java_service` and `git_hub_action`; pass a bogus one to have it list them.
|
|
54
|
+
Required options become flags: `--name` for every type, plus
|
|
55
|
+
`--group-id`/`--artifact-id` (Java) and `--sonar-host-url`
|
|
56
|
+
(`git_hub_action`). Any other plainly-typed option can be passed the same
|
|
57
|
+
way - `--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
|
|
58
|
+
`--docker-registry ghcr.io`, `--no-use-flyway`, and so on. Modules can't be
|
|
59
|
+
passed on the command line; add them to `.projenrc.ts` afterwards (see
|
|
60
|
+
[JavaMavenProject](#javamavenproject)).
|
|
61
|
+
|
|
62
|
+
**Adding projen to a repo that already has content.** `projen new` runs
|
|
63
|
+
`git init` and commits the scaffold by default. In a repo with existing work,
|
|
64
|
+
pass `--no-git` so it writes the files and leaves committing to you:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
cd existing-repo
|
|
68
|
+
npx projen new --from @xpertss/projen-types java_spring_boot --name obeya --group-id org.xpertss.obeya --artifact-id obeya-parent --no-git
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Commit a lockfile.** The generated `build.yml` and drift check install the
|
|
72
|
+
toolchain with `npm ci`, which needs a committed `package-lock.json`, and
|
|
73
|
+
`projen new` doesn't always leave one behind. Run `npm install` once and
|
|
74
|
+
commit `package-lock.json` along with the scaffold. Without it those
|
|
75
|
+
workflows fail with an `::error::` that says exactly this. For the Java
|
|
76
|
+
types, `package.json` is generated, and it pins `projen` and
|
|
77
|
+
`@xpertss/projen-types` to **exact** versions (no `^`), so every machine and
|
|
78
|
+
CI run uses the same generator. A floating range would make the drift check
|
|
79
|
+
report the differences between generator versions as drift.
|
|
44
80
|
|
|
45
81
|
Commit the result. From then on, every change to the scaffold goes through
|
|
46
82
|
`.projenrc.ts` followed by `npx projen`:
|
|
@@ -59,7 +95,9 @@ deploy workflow; leaving `dogfood` out (or a service's
|
|
|
59
95
|
fails and tells you what to add - a gate this package considers load-bearing
|
|
60
96
|
is allowed to be missing loudly, never silently.
|
|
61
97
|
|
|
62
|
-
The `name` option must match the `name` field in the project's `package.json` (for the CDK types)
|
|
98
|
+
The `name` option must match the `name` field in the project's `package.json` (for the CDK types). For the Java types it becomes the root pom's `<name>` and the generated `package.json` name.
|
|
99
|
+
|
|
100
|
+
> **Never write projen's generated-file marker text literally in `.projenrc.ts`.** projen deletes, as an orphaned generated file, any file containing the marker line (`~~ Generated by projen. To modify, ...`), and that includes `.projenrc.ts` itself. When you generate a file yourself (for example with `TextFile`), insert the marker through the file's `marker` property: ``file.addLine(`# ${file.marker}`)``.
|
|
63
101
|
|
|
64
102
|
## Updating an existing project when this package changes
|
|
65
103
|
|
|
@@ -147,6 +185,90 @@ Everything from `CdkInfraProject`, plus:
|
|
|
147
185
|
- `src/constructs/database.ts` - a `Database` construct stub for the chosen engine (`postgres`/`mysql` -> RDS, `dynamodb` -> DynamoDB). `migrationTool` (no default, intentionally) is added as a dev dependency and referenced in the stub - wiring it up is left to you.
|
|
148
186
|
- `.github/workflows/app-build.yml` - runs the project's test task on every PR, then checks for projen drift.
|
|
149
187
|
|
|
188
|
+
### JavaMavenProject
|
|
189
|
+
|
|
190
|
+
A plain Maven build with no framework and no publish target. It's the base of every other Java type, and it's usable on its own. It's single-module until you add a module, then it's a multi-module reactor.
|
|
191
|
+
|
|
192
|
+
Scaffold it with the `java_maven` type:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npx projen new --from @xpertss/projen-types java_maven --name legacy-tools --group-id org.xpertss --artifact-id legacy-tools --java-version 1.8
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**Single module:**
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// .projenrc.ts
|
|
202
|
+
import { JavaMavenProject } from '@xpertss/projen-types';
|
|
203
|
+
|
|
204
|
+
const project = new JavaMavenProject({
|
|
205
|
+
name: 'legacy-tools',
|
|
206
|
+
groupId: 'org.xpertss',
|
|
207
|
+
artifactId: 'legacy-tools',
|
|
208
|
+
javaVersion: '1.8',
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
project.addDependency('commons-io/commons-io@2.20.0'); // exact version
|
|
212
|
+
project.addTestDependency('org.assertj/assertj-core@3.27.3');
|
|
213
|
+
|
|
214
|
+
project.synth();
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Multi-module:** each `addModule()` call adds a module directory with its own generated `pom.xml`. The root pom becomes the `pom`-packaged reactor parent. Everything stays one projen project, with one `.projen/`, one `.gitignore` and one `tasks.json`.
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
// .projenrc.ts
|
|
221
|
+
import { JavaMavenProject } from '@xpertss/projen-types';
|
|
222
|
+
|
|
223
|
+
const project = new JavaMavenProject({
|
|
224
|
+
name: 'toolkit',
|
|
225
|
+
groupId: 'org.xpertss.toolkit',
|
|
226
|
+
artifactId: 'toolkit-parent',
|
|
227
|
+
version: '0.1.0-SNAPSHOT',
|
|
228
|
+
javaVersion: '17',
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const model = project.addModule({ dir: 'toolkit-model', artifactId: 'toolkit-model', description: 'Domain model' });
|
|
232
|
+
const stub = project.addModule({ dir: 'tools/stub-model', artifactId: 'toolkit-stub-model' }); // nested dirs are fine
|
|
233
|
+
const cli = project.addModule({ dir: 'toolkit-cli', artifactId: 'toolkit-cli' });
|
|
234
|
+
|
|
235
|
+
stub.addModuleDependency(model); // sibling module: versionless
|
|
236
|
+
cli.addModuleDependency(model);
|
|
237
|
+
cli.addDependency('info.picocli/picocli@4.7.7'); // pinned: the version moves to the parent
|
|
238
|
+
cli.addDependency('org.yaml/snakeyaml'); // versionless: managed below
|
|
239
|
+
project.addManagedDependency('org.yaml/snakeyaml@2.4');
|
|
240
|
+
project.addBom('org.testcontainers/testcontainers-bom@1.21.3');
|
|
241
|
+
|
|
242
|
+
project.synth();
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
What the reactor looks like:
|
|
246
|
+
|
|
247
|
+
- **Root `pom.xml`:**
|
|
248
|
+
- `<packaging>pom</packaging>`, with `<modules>` in `addModule` order.
|
|
249
|
+
- `<dependencyManagement>` holds the BOM imports first (`type=pom`, `scope=import`), then every module at `${project.version}`, then every pinned version.
|
|
250
|
+
- `<pluginManagement>` holds the plugin versions, and versionless `<plugins>` are inherited by every module: compiler, surefire, failsafe, jar, and enforcer.
|
|
251
|
+
- `junit-jupiter` is a test dependency every module inherits. Its version comes from `junit-bom`, or from the Spring Boot BOM in the Spring Boot types.
|
|
252
|
+
- **Module `pom.xml`:** `<parent>` with the right `relativePath` (`tools/stub-model` → `../../pom.xml`), then `artifactId`, `name`, `description`, and versionless `<dependencies>`. Nothing else, unless the module adds plugins.
|
|
253
|
+
- A version given to `module.addDependency`/`addTestDependency`/`addPlugin` is moved into the parent's `<dependencyManagement>`/`<pluginManagement>`, so every module that uses an artifact gets the same version. Pinning one artifact at two different versions fails the synth.
|
|
254
|
+
- The synth fails with a clear message on:
|
|
255
|
+
- two modules with the same `artifactId`
|
|
256
|
+
- two modules with the same `dir`, or one `dir` nested inside another
|
|
257
|
+
- a `dir` outside the repo
|
|
258
|
+
- a module depending on itself
|
|
259
|
+
- `packaging` set to anything but `pom` on a project with modules
|
|
260
|
+
|
|
261
|
+
You get:
|
|
262
|
+
|
|
263
|
+
- the root `pom.xml` (and one per module), written by this package:
|
|
264
|
+
- **exact versions only**: a range such as `^1`, `~1.2` or `[1,2)` fails the synth
|
|
265
|
+
- the compiler level, enforcer rule and JUnit line all follow `javaVersion`
|
|
266
|
+
- 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/`.
|
|
267
|
+
- `.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).
|
|
268
|
+
- `.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`.
|
|
269
|
+
- the projen drift check, `LICENSE` (MIT by default), `.editorconfig`, and a generated `package.json` that pins the projen toolchain exactly.
|
|
270
|
+
- no sample code, unless `sample: true` on a single-module project.
|
|
271
|
+
|
|
150
272
|
### JavaLibraryProject
|
|
151
273
|
|
|
152
274
|
A reusable Java library published to Maven Central.
|
|
@@ -173,17 +295,64 @@ const project = new JavaLibraryProject({
|
|
|
173
295
|
project.synth();
|
|
174
296
|
```
|
|
175
297
|
|
|
176
|
-
You get:
|
|
298
|
+
You get everything from [`JavaMavenProject`](#javamavenproject), so modules work here too, plus:
|
|
177
299
|
|
|
178
|
-
- `
|
|
179
|
-
- `.github/workflows/build.yml` - PR build + projen drift check, plus a SonarQube scan step when `sonarProjectKey` is set (needs a `SONAR_TOKEN` secret).
|
|
180
|
-
- `.github/workflows/upgrade.yml` - nightly (03:00 UTC) PR running `mvn versions:use-latest-releases versions:update-properties`.
|
|
300
|
+
- `maven-source-plugin` and `maven-javadoc-plugin`, attaching the `-sources`/`-javadoc` jars Maven Central requires. In a multi-module library every module attaches them.
|
|
181
301
|
- `.github/workflows/publish-maven-central.yml` - manual dispatch running `mvn -B deploy -P release`. With `mavenCentralOidc: true` it uses Maven Central's OIDC trusted publishing (no GPG secrets needed); otherwise it expects the secrets `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PASSPHRASE`, `MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD`.
|
|
182
|
-
- `.github/workflows/codeindex.yml` - on push to `main`, generates a Java source index under `.cai/` (disable with `publishCodeIndex: false`).
|
|
302
|
+
- `.github/workflows/codeindex.yml` - on push to `main`, generates a Java source index under `.cai/` covering every module (disable with `publishCodeIndex: false`).
|
|
303
|
+
|
|
304
|
+
### JavaSpringBootProject
|
|
305
|
+
|
|
306
|
+
Spring Boot on Maven, single- or multi-module, **without** Docker, Flyway or a deploy hook. It's [`JavaMavenProject`](#javamavenproject) plus Spring Boot dependency management. Use it for a Spring Boot repo that ships something other than this package's container image, such as a multi-module control plane, or for a Boot app you deploy your own way.
|
|
307
|
+
|
|
308
|
+
Scaffold it with the `java_spring_boot` type:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
npx projen new --from @xpertss/projen-types java_spring_boot --name obeya --group-id org.xpertss.obeya --artifact-id obeya-parent
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```typescript
|
|
315
|
+
// .projenrc.ts
|
|
316
|
+
import { JavaSpringBootProject } from '@xpertss/projen-types';
|
|
317
|
+
|
|
318
|
+
const project = new JavaSpringBootProject({
|
|
319
|
+
name: 'obeya',
|
|
320
|
+
groupId: 'org.xpertss.obeya',
|
|
321
|
+
artifactId: 'obeya-parent',
|
|
322
|
+
version: '0.1.0-SNAPSHOT',
|
|
323
|
+
javaVersion: '21',
|
|
324
|
+
copyrightOwner: 'Xpert Software',
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// plain jar modules: shared libraries, clients, tools
|
|
328
|
+
const model = project.addModule({ dir: 'obeya-model', artifactId: 'obeya-model' });
|
|
329
|
+
const client = project.addModule({ dir: 'obeya-api-client', artifactId: 'obeya-api-client' });
|
|
330
|
+
client.addModuleDependency(model);
|
|
331
|
+
|
|
332
|
+
// a Spring Boot application module, repackaged into an executable jar
|
|
333
|
+
const server = project.addSpringBootModule({ dir: 'obeya-server', artifactId: 'obeya-server' });
|
|
334
|
+
server.addModuleDependency(model);
|
|
335
|
+
server.addDependency('org.springframework.boot/spring-boot-starter-web'); // versionless: Boot's BOM manages it
|
|
336
|
+
server.addTestDependency('org.springframework.boot/spring-boot-starter-test');
|
|
337
|
+
|
|
338
|
+
project.addBom('org.testcontainers/testcontainers-bom@1.21.3');
|
|
339
|
+
|
|
340
|
+
project.synth();
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
You get everything from [`JavaMavenProject`](#javamavenproject), plus:
|
|
344
|
+
|
|
345
|
+
- `spring-boot-dependencies` imported as the **first** BOM, so starters and every library Boot manages (JUnit included) are added without a version. `springBootVersion` sets it; the default is the newest release of the line that supports `javaVersion` (see [Java version support](#java-version-support)).
|
|
346
|
+
- `spring-boot-maven-plugin`, versioned in `<pluginManagement>`:
|
|
347
|
+
- In a **single-module** project the root jar is repackaged into an executable jar.
|
|
348
|
+
- In a **multi-module** project only modules added with `addSpringBootModule()` are repackaged; `addModule()` modules stay plain jars.
|
|
349
|
+
- A repackaged module needs its `@SpringBootApplication` class before `mvn verify` passes, because `repackage` fails with `Unable to find main class` until one exists. Add a module as a plain `addModule()` while it's still empty.
|
|
350
|
+
- failsafe configured to run integration tests against the compiled classes rather than the repackaged jar (as `spring-boot-starter-parent` does).
|
|
351
|
+
- no starters, no Docker, no Flyway, no CDK. Add the starters you need with `addDependency`.
|
|
183
352
|
|
|
184
353
|
### JavaServiceProject
|
|
185
354
|
|
|
186
|
-
A Spring Boot service that publishes a Docker image and can trigger deploys in a companion CDK repo.
|
|
355
|
+
A Spring Boot service that publishes a Docker image and can trigger deploys in a companion CDK repo. It is [`JavaSpringBootProject`](#javaspringbootproject) plus Docker, Flyway and a deploy hook. It is **single-module**, because the Docker build, the migrations and the deploy hook all assume one deployable at the repo root; `addModule()` fails and points you to `JavaSpringBootProject`.
|
|
187
356
|
|
|
188
357
|
Scaffold it with the `java_service` type:
|
|
189
358
|
|
|
@@ -207,11 +376,11 @@ const project = new JavaServiceProject({
|
|
|
207
376
|
project.synth();
|
|
208
377
|
```
|
|
209
378
|
|
|
210
|
-
You get
|
|
379
|
+
You get everything from [`JavaSpringBootProject`](#javaspringbootproject) (and so from `JavaMavenProject`), plus:
|
|
211
380
|
|
|
212
|
-
- `spring-boot-starter-web` added to the pom.
|
|
381
|
+
- `spring-boot-starter-web` added to the pom (versionless; Boot's BOM manages it).
|
|
213
382
|
- `.github/workflows/publish-docker.yml` - manual dispatch: `mvn -B package && docker build -t <registry>/<name>:<sha>`, logged in with the `DOCKER_USERNAME` / `DOCKER_PASSWORD` secrets. `dockerRegistry` defaults to `docker.io`.
|
|
214
|
-
- Flyway wiring when `useFlyway` (default `true`): `flyway-
|
|
383
|
+
- Flyway wiring when `useFlyway` (default `true`): `flyway-core` (versionless, so it matches what Boot's Flyway auto-configuration expects), `flyway-maven-plugin` pinned for the Java line, and `src/main/resources/db/migration/V1__init.sql`.
|
|
215
384
|
- `.github/workflows/deploy-cdk.yml` (the `CdkDeployHook`, generated by default) - manual dispatch with an environment selector; each job sends a `workflow_dispatch` to `deploy.yml` in the companion `cdkDeployTargetRepo` (a `CdkInfraProject`/`CdkAppProject` repo). With no `cdkDeployTargetRepo` set, the workflow is still generated but each job's only step fails with instructions - it is dispatch-only, so that lands on whoever tries to deploy rather than on every PR. Turn the workflow off entirely with `cdkDeployHook: false`. `environments` defaults to `['prod']`.
|
|
216
385
|
|
|
217
386
|
### JavaAppProject
|
|
@@ -238,7 +407,7 @@ const project = new JavaAppProject({
|
|
|
238
407
|
project.synth();
|
|
239
408
|
```
|
|
240
409
|
|
|
241
|
-
You get everything from `JavaMavenProject
|
|
410
|
+
You get everything from [`JavaMavenProject`](#javamavenproject) (modules included), plus `.github/workflows/publish-ghpackages.yml` - manual dispatch running `mvn -B deploy -DaltDeploymentRepository=github::<registry>`, authenticated with `GITHUB_TOKEN`. `ghPackagesRegistry` defaults to `https://maven.pkg.github.com/<repo>` derived from the repository URL.
|
|
242
411
|
|
|
243
412
|
### GitHubActionProject
|
|
244
413
|
|
|
@@ -312,6 +481,60 @@ You get:
|
|
|
312
481
|
|
|
313
482
|
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 following [Getting started](#getting-started), write the `.projenrc.ts` above, then hand-write `action.yml`/`auto-commit.sh`/`test/fixtures/`.
|
|
314
483
|
|
|
484
|
+
## Java version support
|
|
485
|
+
|
|
486
|
+
`javaVersion` picks the Java line a Java project targets. It defaults to `21`; the supported lines are `1.8` (alias `8`), `17`, `21` and `25`, and any other value fails the synth with that list. **Nothing in the generated build is hard-coded to one Java line.** Everything that depends on it comes from one table in this package, grouped by line:
|
|
487
|
+
|
|
488
|
+
| | `1.8` | `17` | `21` | `25` |
|
|
489
|
+
| --- | --- | --- | --- | --- |
|
|
490
|
+
| Compiler level | `maven.compiler.source`/`target` = `1.8` (javac 8 has no `--release`) | `maven.compiler.release` = `17` | `release` = `21` | `release` = `25` |
|
|
491
|
+
| Enforcer `requireJavaVersion` | `[1.8,)` | `[17,)` | `[21,)` | `[25,)` |
|
|
492
|
+
| JUnit (`junit-bom`) | 5.14.4 (JUnit 6 needs Java 17) | 6.1.3 | 6.1.3 | 6.1.3 |
|
|
493
|
+
| Default Spring Boot (`JavaSpringBootProject`) | 2.7.18 (Boot 3+ needs Java 17; a 3.x+ `springBootVersion` fails the synth) | 4.1.1 | 4.1.1 | 4.1.1 |
|
|
494
|
+
| `flyway-maven-plugin` (`JavaServiceProject`) | 9.22.3 | 13.9.0 | 13.9.0 | 13.9.0 |
|
|
495
|
+
| CI JDK (`actions/setup-java` `java-version`) | `8` | `17` | `21` | `25` |
|
|
496
|
+
|
|
497
|
+
Maven plugins (the same on every line, because all of them run on JDK 8): `maven-compiler-plugin` 3.16.0, `maven-surefire-plugin`/`maven-failsafe-plugin` 3.6.0, `maven-jar-plugin` 3.5.1, `maven-enforcer-plugin` 3.6.3, `maven-source-plugin` 3.4.0 and `maven-javadoc-plugin` 3.12.0 (library only), `versions-maven-plugin` 2.22.0 (the `upgrade` report).
|
|
498
|
+
|
|
499
|
+
**The enforcer.** `maven-enforcer-plugin` fails the build at the start when the JDK or Maven running it is older than the project needs. Without it you get confusing compiler errors later, or a jar built for the wrong runtime. Its Java rule always follows `javaVersion`. The Maven rule defaults to `[3.9,)`; change it with `minMavenVersion`, or drop the plugin entirely with `enforcer: false`. CI installs the matching JDK through `setup-java`, so the rule only fires on a developer machine with the wrong JDK. A Java 1.8 project builds on any newer JDK (the rule is a minimum), but the JDK 8 runtime API is guaranteed only when you build on JDK 8.
|
|
500
|
+
|
|
501
|
+
**Overriding a version.** `pluginVersions` replaces any default in the table, keyed by `groupId/artifactId`, with an exact version:
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
new JavaMavenProject({
|
|
505
|
+
name: 'svc',
|
|
506
|
+
groupId: 'org.xpertss',
|
|
507
|
+
artifactId: 'svc',
|
|
508
|
+
pluginVersions: {
|
|
509
|
+
'org.apache.maven.plugins/maven-surefire-plugin': '3.5.6',
|
|
510
|
+
'org.junit/junit-bom': '5.14.4',
|
|
511
|
+
},
|
|
512
|
+
});
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
`project.pinnedVersion('org.apache.maven.plugins/maven-surefire-plugin')` returns the version in effect, for reuse in your own plugin config.
|
|
516
|
+
|
|
517
|
+
**New Java lines** are one new row in this package's version table and a release. Until a line is listed, `javaVersion` rejects it rather than guessing.
|
|
518
|
+
|
|
519
|
+
## Adding CI jobs to a Java project
|
|
520
|
+
|
|
521
|
+
`build.yml` is exposed as `project.buildVerifyWorkflow`, so jobs are added through projen's `addJob` rather than `addOverride`. `project.ciSetupSteps` holds the steps every Maven job here needs: pinned Node, `npm ci`, and the project's JDK with a Maven cache. Every job in `build.yml` can then be made a required check on `main`.
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
import { github } from 'projen';
|
|
525
|
+
|
|
526
|
+
project.buildVerifyWorkflow.addJob('integration', {
|
|
527
|
+
name: 'Container integration tests',
|
|
528
|
+
runsOn: ['self-hosted', 'linux', 'fedora', 'podman'],
|
|
529
|
+
permissions: { contents: github.workflows.JobPermission.READ },
|
|
530
|
+
steps: [
|
|
531
|
+
{ name: 'Checkout', uses: 'actions/checkout@v7' },
|
|
532
|
+
...project.ciSetupSteps,
|
|
533
|
+
{ name: 'Integration tests', run: 'mvn -B verify -Pcontainer-its' },
|
|
534
|
+
],
|
|
535
|
+
});
|
|
536
|
+
```
|
|
537
|
+
|
|
315
538
|
## Common options
|
|
316
539
|
|
|
317
540
|
CDK project types (`CdkInfraProjectOptions` / `CdkAppProjectOptions`):
|
|
@@ -328,16 +551,30 @@ CDK project types (`CdkInfraProjectOptions` / `CdkAppProjectOptions`):
|
|
|
328
551
|
| `database` | - (app only) | `DatabaseOptions` - `engine` (`postgres`/`mysql`/`dynamodb`, default `postgres`), `migrationTool` |
|
|
329
552
|
| `appEntryPoint` | `src/app.ts` (app only) | Path of the generated application entrypoint |
|
|
330
553
|
|
|
331
|
-
Java project types (`
|
|
554
|
+
Java project types (`JavaMavenProjectOptions` and everything built on it - `JavaLibraryProjectOptions`, `JavaAppProjectOptions`, `JavaSpringBootProjectOptions`, `JavaServiceProjectOptions`):
|
|
332
555
|
|
|
333
556
|
| Option | Default | Description |
|
|
334
557
|
| --- | --- | --- |
|
|
335
558
|
| `name` | - (required) | Project name |
|
|
336
559
|
| `groupId` | - (required) | Maven group id |
|
|
337
|
-
| `artifactId` | - (required) | Maven artifact id |
|
|
338
|
-
| `version` | `0.1.0` | Maven version |
|
|
560
|
+
| `artifactId` | - (required) | Maven artifact id (of the reactor parent, in a multi-module project) |
|
|
561
|
+
| `version` | `0.1.0` | Maven version; must be exact |
|
|
562
|
+
| `description` / `url` | - | Written to the root pom |
|
|
563
|
+
| `javaVersion` | `21` | Java line: `1.8`, `17`, `21`, `25` - see [Java version support](#java-version-support) |
|
|
564
|
+
| `javaDistribution` | `temurin` | `actions/setup-java` distribution for CI |
|
|
565
|
+
| `packaging` | `jar` | Root packaging while the project has no modules; a project with modules is always `pom` |
|
|
566
|
+
| `sample` | `false` | Starter `Main` + test under the `groupId` package (single-module only) |
|
|
567
|
+
| `enforcer` | `true` | `maven-enforcer-plugin` with Maven and Java version rules |
|
|
568
|
+
| `minMavenVersion` | `3.9` | The enforcer's `requireMavenVersion` minimum |
|
|
569
|
+
| `pluginVersions` | - | Exact-version overrides for this package's defaults, keyed by `groupId/artifactId` |
|
|
570
|
+
| `licensed` | `true` | Write a `LICENSE` |
|
|
571
|
+
| `license` | `MIT` | SPDX identifier for the `LICENSE` |
|
|
572
|
+
| `copyrightOwner` / `copyrightPeriod` | `xpertss` / current year | Named in the `LICENSE` |
|
|
573
|
+
| `editorconfig` | `true` | Write a projen-managed `.editorconfig` (also on the CDK and action types) |
|
|
574
|
+
| `upgradeWorkflow` | `true` | Generate the nightly update report (`upgrade.yml`) |
|
|
339
575
|
| `sonarProjectKey` | - | SonarQube project key; the sonar step is skipped when unset |
|
|
340
576
|
| `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
|
|
577
|
+
| `springBootVersion` | newest Boot for `javaVersion` (Spring Boot types only) | Exact Spring Boot version: the BOM and `spring-boot-maven-plugin` |
|
|
341
578
|
| `cdkDeployTargetRepo` | - (service only; `deploy-cdk.yml` fails until set) | Companion CDK repo (`owner/repo`) whose `deploy.yml` the deploy hook dispatches |
|
|
342
579
|
| `cdkDeployHook` | `true` (service only) | Whether to generate `deploy-cdk.yml` at all |
|
|
343
580
|
| `dockerRegistry` | `docker.io` (service only) | Registry the Docker image is pushed to |
|
|
@@ -400,7 +637,7 @@ Most actions need exactly one `scenario` step. Actions with a re-run/no-op/idemp
|
|
|
400
637
|
|
|
401
638
|
## Customizing `.gitignore`
|
|
402
639
|
|
|
403
|
-
Every project type already ignores JetBrains IDE state (`/.idea/*`). To ignore more, call the inherited `addGitIgnore()` method after constructing the project in your `.projenrc.ts`:
|
|
640
|
+
Every project type already ignores JetBrains IDE state (`/.idea/*`) and the `/spec/` directory with all of its subdirectories (local plans and specs, never committed). The Java types also ignore Maven `target/` output and Eclipse files. To ignore more, call the inherited `addGitIgnore()` method after constructing the project in your `.projenrc.ts`:
|
|
404
641
|
|
|
405
642
|
```typescript
|
|
406
643
|
// .projenrc.ts
|
|
@@ -431,23 +668,25 @@ The project types are composed from smaller components you can also attach to yo
|
|
|
431
668
|
| `DatabaseComponent` | `NodeProject` | Database construct stub + migration tool wiring |
|
|
432
669
|
| `EcrEcsConstructs` | `Project` | ECR + Fargate ECS construct helper |
|
|
433
670
|
| `EdgeNetworkingConstructs` | `Project` | Per-resource edge networking construct helpers |
|
|
434
|
-
| `
|
|
435
|
-
| `
|
|
436
|
-
| `
|
|
437
|
-
| `
|
|
438
|
-
| `
|
|
439
|
-
| `
|
|
671
|
+
| `MavenPom` | `Project` | A `pom.xml` with modules, BOM imports, dependency/plugin management, and exact versions only |
|
|
672
|
+
| `MavenModule` | `JavaMavenProject` | One module of a reactor (created by `addModule()`) |
|
|
673
|
+
| `MavenUpgradeReport` | `GitHubProject` | Nightly report-only `upgrade.yml` |
|
|
674
|
+
| `MavenCentralPublish` | `JavaMavenProject` | Manual-dispatch Maven Central publish workflow |
|
|
675
|
+
| `DockerPublish` | `JavaMavenProject` | Manual-dispatch Docker build+push workflow |
|
|
676
|
+
| `GitHubPackagesPublish` | `JavaMavenProject` | Manual-dispatch GitHub Packages publish workflow |
|
|
677
|
+
| `FlywayMigration` | `JavaSpringBootProject` | Flyway plugin/dependency + migrations directory |
|
|
678
|
+
| `CdkDeployHook` | `JavaMavenProject` | Manual-dispatch workflow that triggers `deploy.yml` in a companion CDK repo |
|
|
679
|
+
| `CodeIndexWorkflow` | `JavaMavenProject` | Code index generation on push to `main` |
|
|
440
680
|
| `ActionBuildWorkflow` | `GitHubProject` | The `lint` task (shellcheck/yamllint/pinned actionlint) + `build.yml` |
|
|
441
681
|
| `ActionDogfoodWorkflow` | `GitHubProject` | `test-dogfood.yml` from an `ActionDogfoodOptions` scenario |
|
|
442
682
|
| `ActionSonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI) |
|
|
443
683
|
|
|
444
|
-
Example - adding a Docker publish to a
|
|
684
|
+
Example - adding a Docker publish to a `JavaMavenProject` (`JavaServiceProject` is the packaged version of this, with Spring Boot):
|
|
445
685
|
|
|
446
686
|
```typescript
|
|
447
|
-
import {
|
|
448
|
-
import { DockerPublish } from '@xpertss/projen-types';
|
|
687
|
+
import { DockerPublish, JavaMavenProject } from '@xpertss/projen-types';
|
|
449
688
|
|
|
450
|
-
const project = new
|
|
689
|
+
const project = new JavaMavenProject({
|
|
451
690
|
name: 'my-service',
|
|
452
691
|
groupId: 'org.xpertss',
|
|
453
692
|
artifactId: 'my-service',
|
|
@@ -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.14" };
|
|
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.14" };
|
|
45
45
|
workflow;
|
|
46
46
|
constructor(scope, options) {
|
|
47
47
|
super(scope, 'ActionDogfoodWorkflow');
|
|
@@ -15,7 +15,7 @@ const SONAR_SCANNER_SHA256 = 'bb8f709f9cb73352f8d1260a3b3c506c0f41146754bc630762
|
|
|
15
15
|
* inclusions may skip `action.yml` outside `.github/`.
|
|
16
16
|
*/
|
|
17
17
|
class ActionSonarWorkflow extends projen_1.Component {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.14" };
|
|
19
19
|
workflow;
|
|
20
20
|
constructor(scope, options) {
|
|
21
21
|
super(scope, 'ActionSonarWorkflow');
|
|
@@ -49,6 +49,11 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
|
|
|
49
49
|
* @default "MIT"
|
|
50
50
|
*/
|
|
51
51
|
readonly license?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Write a projen-managed `.editorconfig`.
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
readonly editorconfig?: boolean;
|
|
52
57
|
}
|
|
53
58
|
/**
|
|
54
59
|
* Scaffolds the repo lifecycle (AD-001) around a hand-committed, composite
|
|
@@ -7,6 +7,7 @@ const action_build_workflow_1 = require("./action-build-workflow");
|
|
|
7
7
|
const action_dogfood_workflow_1 = require("./action-dogfood-workflow");
|
|
8
8
|
const action_sonar_workflow_1 = require("./action-sonar-workflow");
|
|
9
9
|
const constants_1 = require("../common/constants");
|
|
10
|
+
const editorconfig_1 = require("../common/editorconfig");
|
|
10
11
|
const internal_actions_1 = require("../common/internal-actions");
|
|
11
12
|
const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
|
|
12
13
|
const projenrc_ts_1 = require("../common/projenrc-ts");
|
|
@@ -62,7 +63,7 @@ hand-committed.
|
|
|
62
63
|
* per the action's own F### spec - this type only lints it.
|
|
63
64
|
*/
|
|
64
65
|
class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
65
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.
|
|
66
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.14" };
|
|
66
67
|
buildWorkflow;
|
|
67
68
|
dogfoodWorkflow;
|
|
68
69
|
sonarWorkflow;
|
|
@@ -88,8 +89,14 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
|
88
89
|
throw new Error('GitHubActionProject requires GitHub integration to be enabled');
|
|
89
90
|
}
|
|
90
91
|
(0, internal_actions_1.applyInternalActionOverrides)(gh);
|
|
91
|
-
// JetBrains IDE state (.idea/) is never tracked in generated repos
|
|
92
|
+
// JetBrains IDE state (.idea/) is never tracked in generated repos, and
|
|
93
|
+
// neither is /spec/ (local plans and specs; the pattern covers every
|
|
94
|
+
// subdirectory).
|
|
92
95
|
this.addGitIgnore('/.idea/*');
|
|
96
|
+
this.addGitIgnore('/spec/');
|
|
97
|
+
if (options.editorconfig ?? true) {
|
|
98
|
+
(0, editorconfig_1.addEditorConfig)(this);
|
|
99
|
+
}
|
|
93
100
|
new projen_drift_check_workflow_1.ProjenDriftCheckWorkflow(this, {
|
|
94
101
|
gheTokenSecret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
|
|
95
102
|
});
|
|
@@ -161,4 +168,4 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
|
|
|
161
168
|
}
|
|
162
169
|
}
|
|
163
170
|
exports.GitHubActionProject = GitHubActionProject;
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FPZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELGlFQUEwRTtBQUMxRSx1RkFBaUY7QUFDakYsdURBQWlFO0FBQ2pFLCtGQUF5RjtBQUN6RixpRUFBaUU7QUFFakUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSwrREFBK0Q7QUFDL0QseUVBQXlFO0FBQ3pFLG9FQUFvRTtBQUNwRSxrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLE1BQU0sY0FBYyxHQUFXLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN0RSxpRUFBaUU7QUFDakUsTUFBTSxvQkFBb0IsR0FBVyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFFM0Usd0VBQXdFO0FBQ3hFLDRFQUE0RTtBQUM1RSxtQ0FBbUM7QUFDbkMsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUM7QUEwRHhDLFNBQVMscUJBQXFCLENBQUMsT0FBbUM7SUFDaEUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxJQUFJOztFQUV4QixPQUFPLENBQUMsV0FBVyxJQUFJLEVBQUU7Ozs7O2tCQUtULE9BQU8sQ0FBQyxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7Q0FlN0IsQ0FBQztBQUNGLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLGVBQU0sQ0FBQyxhQUFhOztJQUMzQyxhQUFhLENBQXNCO0lBQ25DLGVBQWUsQ0FBd0I7SUFDdkMsYUFBYSxDQUFzQjtJQUNuQyxPQUFPLENBQWtCO0lBRXpDLFlBQVksT0FBbUM7UUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELDREQUE0RDtRQUM1RCwwREFBMEQ7UUFDMUQsNkJBQTZCO1FBRTdCLEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLHlFQUF5RTtZQUN6RSxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRTtZQUNuRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtTQUN2RSxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELENBQ2hFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBQSwrQ0FBNEIsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUVqQyxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QixJQUFJLHNEQUF3QixDQUFDLElBQUksRUFBRTtZQUNqQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxvQ0FBd0I7U0FDbkUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSw4REFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxJQUFJLGdCQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLEtBQUs7WUFDOUIsY0FBYyxFQUFFLFNBQVM7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsSUFBQSxzQ0FBd0IsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUUvQix3RUFBd0U7UUFDeEUsZ0VBQWdFO1FBQ2hFLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsbUJBQW1CO1FBQ25CLElBQUksaUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ2pDLEdBQUcsRUFBRTtnQkFDSCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixPQUFPLEVBQUUsSUFBSTtnQkFDYixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLGVBQWUsRUFBRTtvQkFDZixRQUFRLEVBQUUsY0FBYztvQkFDeEIsdUJBQXVCLEVBQUUsb0JBQW9CO29CQUM3Qyx3QkFBd0IsRUFBRSxzQkFBc0I7aUJBQ2pEO2FBQ0Y7WUFDRCxRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7UUFFSCxJQUFJLGlCQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUM5QixHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxFQUFFLFNBQVM7Z0JBQ2xCLEtBQUssRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTthQUN2QztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSwyQ0FBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksK0NBQXFCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksMkNBQW1CLENBQUMsSUFBSSxFQUFFO1lBQ2pELFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7U0FDbkQsQ0FBQyxDQUFDO1FBRUgscURBQXFEO1FBQ3JELGtFQUFrRTtRQUNsRSxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZ0JBQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsbUVBQW1FO1lBQ25FLHdEQUF3RDtZQUN4RCxrQkFBa0IsRUFBRSxNQUFNO1lBQzFCLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFdBQVcsRUFBRSxjQUFjO1lBQzNCLGlCQUFpQixFQUFFLDBCQUFpQixDQUFDLGdCQUFnQixFQUFFO1lBQ3ZELGNBQWMsRUFBRSxnQkFBTyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDbkQsV0FBVyxFQUFFLDBCQUEwQixzQkFBc0IsRUFBRTtZQUMvRCx5QkFBeUIsRUFBRTtnQkFDekIsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTthQUNoRDtTQUNGLENBQUMsQ0FBQztRQUVILG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLDZDQUE2QztRQUM3QyxJQUFBLHNDQUFtQixFQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLEVBQ2pELHFGQUFxRixDQUN0RixDQUFDO0lBQ0osQ0FBQzs7QUFuSEgsa0RBb0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSnNvbkZpbGUsXG4gIExpY2Vuc2UsXG4gIFJlbGVhc2FibGVDb21taXRzLFxuICBZYW1sRmlsZSxcbiAgZ2l0aHViLFxuICByZWxlYXNlLFxufSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQWN0aW9uQnVpbGRXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWJ1aWxkLXdvcmtmbG93JztcbmltcG9ydCB7IEFjdGlvbkRvZ2Zvb2RPcHRpb25zLCBBY3Rpb25Eb2dmb29kV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1kb2dmb29kLXdvcmtmbG93JztcbmltcG9ydCB7IEFjdGlvblNvbmFyV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1zb25hci13b3JrZmxvdyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vcHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93JztcbmltcG9ydCB7IGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW5yYy10cyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuaW1wb3J0IHsgbm90ZVdvcmtmbG93UHVycG9zZSB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1wdXJwb3NlJztcblxuLy8gYHJlcXVpcmUoJ3Byb2plbi9wYWNrYWdlLmpzb24nKWAvYHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpYCByZXNvbHZlXG4vLyB2aWEgTm9kZSdzIG5vcm1hbCBtb2R1bGUgcmVzb2x1dGlvbiwgc28gaW4gYSAqcHVibGlzaGVkKiBwYWNrYWdlIHRoZXNlXG4vLyByZWFkIHRoZSB2ZXJzaW9ucyBhY3R1YWxseSBpbnN0YWxsZWQgaW4gdGhlIGNvbnN1bWluZyByZXBvJ3Ncbi8vIG5vZGVfbW9kdWxlcyAtIGV4YWN0bHkgdGhlIFwiUFJPSkVOX1ZFUlNJT04gb2YgdGhlIHN5bnRoXCIgLyBcInZlcnNpb24gb2Zcbi8vIHRoaXMgcGFja2FnZSB0aGF0IHNjYWZmb2xkZWQgdGhlIHJlcG9cIiB0aGUgcHJpdmF0ZSBwYWNrYWdlLmpzb24nc1xuLy8gZGV2RGVwZW5kZW5jaWVzIG5lZWQgdG8gcGluIChzZWUgRjAxMCBDSS1kZXBlbmRlbmNpZXMgc2VjdGlvbikuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgUFJPSkVOX1ZFUlNJT046IHN0cmluZyA9IHJlcXVpcmUoJ3Byb2plbi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9UWVBFU19WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuXG4vLyBFeGFjdCBwaW4sIHJlY29yZGVkIGFzIGEgY29tcG9uZW50IGNvbnN0YW50IChBRC0wMDE6IG5vIGxhdGVzdC9tb3Zpbmdcbi8vIHRhZy9zZW12ZXIgcmFuZ2UgaW4gYW55dGhpbmcgYSBnZW5lcmF0ZWQgcmVwbyBkZXBlbmRzIG9uKS4gVXBncmFkaW5nIHRoaXNcbi8vIGlzIGEgcmV2aWV3ZWQgZGlmZiBvZiB0aGlzIGZpbGUuXG5jb25zdCBDT01NSVRfQU5EX1RBR19WRVJTSU9OID0gJzEzLjIuMSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnNcbiAgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdE9wdGlvbnMge1xuICAvKipcbiAgICogT25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbi4gVXNlZCBpbiB0aGUgZGVmYXVsdCBSRUFETUVcbiAgICogdGVtcGxhdGUgYW5kIHJlY29yZGVkIGluIHRoZSBwcml2YXRlIGBwYWNrYWdlLmpzb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIEdpdEh1YiBBY3Rpb25zIHNlY3JldCBob2xkaW5nIHRoZSBQQVQgdXNlZCBmb3JcbiAgICogcHJvamVuLWF1dG9tYXRpb24gUFIgY29tbWVudHMgKEYwMDMpIGFuZCwgd2hlbiB0aGUgYWN0aW9uIGhhcyBhXG4gICAqIGB0b2tlbmAgaW5wdXQsIHRoZSBkb2dmb29kJ3MgaW52b2NhdGlvbiBvZiBpdC5cbiAgICogQGRlZmF1bHQgXCJQUk9KRU5fR0lUSFVCX1RPS0VOXCJcbiAgICovXG4gIHJlYWRvbmx5IGdoZVRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIG9yZydzIFNvbmFyQ2xvdWQgaW5zdGFuY2UgKGUuZy4gYGh0dHBzOi8vc29uYXJjbG91ZC5pb2ApLlxuICAgKiBNVVNUIGJlIHJlYWNoYWJsZSBmcm9tIGdpdGh1Yi5jb20taG9zdGVkIChwdWJsaWMpIHJ1bm5lcnMgKEFELTAwMSkuXG4gICAqIFJlcXVpcmVkLCBubyBkZWZhdWx0OiBhIGd1ZXNzZWQgc2VydmVyIGlzIHdvcnNlIHRoYW4gYSBsb3VkIGZhaWx1cmUuXG4gICAqL1xuICByZWFkb25seSBzb25hckhvc3RVcmw6IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJTT05BUl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IHNvbmFyVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHNvbmFyLnltbGAgYWxzbyBydW5zIG9uIGBwdWxsX3JlcXVlc3RgIGFzIGEgcGFzcy9mYWlsIGdhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyUHVsbFJlcXVlc3RHYXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRvZ2Zvb2Qgc2NlbmFyaW8gKEFELTAwMSkuIFdoYXQgZml4dHVyZSBzdGF0ZSwgd2hhdCB0byBhc3NlcnQsIGFuZFxuICAgKiBob3cgdG8gY2xlYW4gdXAgYXJlIHNwZWNpZmllZCBieSB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoZVxuICAgKiBoaWdoZXN0LXJpc2sgYmVoYXZpb3Igb2YgdGhhdCBhY3Rpb24uXG4gICAqXG4gICAqIEl0cyB0eXBlIGlzIGEgc3RydWN0LCB3aGljaCBwcm9qZW4ncyBDTEkgY2Fubm90IHJlbmRlciBpbnRvIGEgcHJvamVucmMsXG4gICAqIHNvIGl0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gYnkgaGFuZCAtIGl0IGlzIHRoZXJlZm9yZSBvcHRpb25hbCwgYmVjYXVzZSBhXG4gICAqICpyZXF1aXJlZCogb3B0aW9uIGBwcm9qZW4gbmV3YCBjYW5ub3Qgc3VwcGx5IHdvdWxkIG1ha2UgdGhpcyBwcm9qZWN0XG4gICAqIHR5cGUgaW1wb3NzaWJsZSB0byBzY2FmZm9sZC4gQUQtMDAxJ3MgXCJuZXZlciBhIHNpbGVudCBuby1vcCBkb2dmb29kXCJcbiAgICogcnVsZSBpcyBlbmZvcmNlZCBpbnN0ZWFkIGJ5IHRoZSB3b3JrZmxvdyBpdCBnZW5lcmF0ZXMgaW4gdGhhdCBjYXNlOiBhXG4gICAqIHNpbmdsZSBzdGVwIHRoYXQgZmFpbHMgb24gZXZlcnkgUFIgdW50aWwgYSBzY2VuYXJpbyBpcyBkZWNsYXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgdGVzdC1kb2dmb29kLnltbGAgcnVucyBvbmUgZmFpbGluZyBzdGVwIHRoYXQgdGVsbHMgeW91IHRvXG4gICAqIGRlY2xhcmUgYSBzY2VuYXJpb1xuICAgKi9cbiAgcmVhZG9ubHkgZG9nZm9vZD86IEFjdGlvbkRvZ2Zvb2RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTUERYIGlkZW50aWZpZXIgZm9yIHRoZSBnZW5lcmF0ZWQgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIk1JVFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9uczogR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnMpOiBzdHJpbmcge1xuICByZXR1cm4gYCMgJHtvcHRpb25zLm5hbWV9XG5cbiR7b3B0aW9ucy5kZXNjcmlwdGlvbiA/PyAnJ31cblxuIyMgVXNhZ2VcblxuXFxgXFxgXFxgeWFtbFxuLSB1c2VzOiB4cGVydHNzLyR7b3B0aW9ucy5uYW1lfUA8cmVmPlxuXFxgXFxgXFxgXG5cbiMjIEJ1bXBpbmdcblxuQSBcXGBmZWF0OlxcYC9cXGBmaXg6XFxgIGNvbW1pdCBwdXNoZWQgdG8gXFxgbWFpblxcYCBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5OiBidW1wLFxudGFnIFxcYHZYLlkuWlxcYCwgR2l0SHViIFJlbGVhc2UuIFNlZSBcXGAuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbFxcYC5cblxuIyMgVHJ1c3QgY29udHJhY3RcblxuVGhpcyBpcyBhIGNvbXBvc2l0ZSAoc2hlbGwpIGFjdGlvbiAtIG5vIE5vZGUvbnBtIGF0IHJ1bnRpbWUsIG5vIERvY2tlci4gSXRzXG5DSSBsaW50IGdhdGUgKFxcYGJ1aWxkLnltbFxcYCksIGRvZ2Zvb2QgdGVzdCAoXFxgdGVzdC1kb2dmb29kLnltbFxcYCksIGFuZCBTb25hclxuc2NhbiAoXFxgc29uYXIueW1sXFxgKSBhcmUgc2NhZmZvbGRlZCBieSBcXGBAeHBlcnRzcy9wcm9qZW4tdHlwZXNcXGAnXG5cXGBHaXRIdWJBY3Rpb25Qcm9qZWN0XFxgOyBvbmx5IFxcYGFjdGlvbi55bWxcXGAgYW5kIGl0cyBzaGVsbCBzY3JpcHRzIGFyZVxuaGFuZC1jb21taXR0ZWQuXG5gO1xufVxuXG4vKipcbiAqIFNjYWZmb2xkcyB0aGUgcmVwbyBsaWZlY3ljbGUgKEFELTAwMSkgYXJvdW5kIGEgaGFuZC1jb21taXR0ZWQsIGNvbXBvc2l0ZVxuICogKHNoZWxsKSBHaXRIdWIgQWN0aW9uOiB0aGUgYGJ1aWxkYC9gdGVzdC1kb2dmb29kYC9gc29uYXJgL2ByZWxlYXNlYFxuICAqIHdvcmtmbG93cywgdmVyc2lvbmluZyBhbmQgcmVsZWFzZSBkaXNjaXBsaW5lLCB0aGUgRjAwMyB2ZXJpZnkgY29tcG9uZW50cyxcbiAgKiBhbmQgcmVwbyBib2lsZXJwbGF0ZSAoYSBwcml2YXRlIHZlcnNpb24tc291cmNlIGBwYWNrYWdlLmpzb25gLCBgLnlhbWxsaW50YCxcbiAgKiBgTElDRU5TRWAsIGFuZCBhIGBSRUFETUUubWRgIHRlbXBsYXRlKS4gVGhlXG4gKiBhY3Rpb24ncyBvd24gY29udGVudFxuICogKGBhY3Rpb24ueW1sYCwgaXRzIHNoZWxsIHNjcmlwdHMsIGB0ZXN0L2AgZml4dHVyZXMpIGlzIGF1dGhvcmVkIGJ5IGhhbmRcbiAqIHBlciB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoaXMgdHlwZSBvbmx5IGxpbnRzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgR2l0SHViQWN0aW9uUHJvamVjdCBleHRlbmRzIGdpdGh1Yi5HaXRIdWJQcm9qZWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkV29ya2Zsb3c6IEFjdGlvbkJ1aWxkV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBkb2dmb29kV29ya2Zsb3c6IEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IHNvbmFyV29ya2Zsb3c6IEFjdGlvblNvbmFyV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSByZWxlYXNlOiByZWxlYXNlLlJlbGVhc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogR2l0SHViQWN0aW9uUHJvamVjdE9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMuc29uYXJIb3N0VXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YkFjdGlvblByb2plY3QgcmVxdWlyZXMgc29uYXJIb3N0VXJsJyk7XG4gICAgfVxuICAgIC8vIEEgZGVjbGFyZWQtYnV0LWluY29tcGxldGUgZG9nZm9vZCBpcyBzdGlsbCBhbiBlcnJvciAtIHNlZVxuICAgIC8vIGBBY3Rpb25Eb2dmb29kV29ya2Zsb3dgLCB3aGljaCBvd25zIHRoYXQgY2hlY2sgKGFuZCB0aGVcbiAgICAvLyBuby1kb2dmb29kLWRlY2xhcmVkIGNhc2UpLlxuXG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIFBSIHRpdGxlcyBhcmUgbm90IGdhdGVkOiBgZmVhdDpgL2BmaXg6YCBtYXR0ZXIgb25seSBiZWNhdXNlIHRoZXkgZHJpdmVcbiAgICAgIC8vIHRoZSByZWxlYXNlIHdvcmtmbG93ICh2aWEgYHJlbGVhc2FibGVDb21taXRzYCksIG5vdCBQUiBjaGVja3MuIFRoZVxuICAgICAgLy8gY29udmVudGlvbmFsLWNvbW1pdCBQUi10aXRsZSBsaW50IGlzIGFkZGVkIGJ5IHRoZSBgR2l0SHViYCBjb21wb25lbnRcbiAgICAgIC8vIHVubGVzcyBgZ2l0aHViT3B0aW9ucy5wdWxsUmVxdWVzdExpbnRgIGlzIGBmYWxzZWAgKGl0IGRlZmF1bHRzIHRydWUpLlxuICAgICAgZ2l0aHViT3B0aW9uczogeyAuLi5vcHRpb25zLmdpdGh1Yk9wdGlvbnMsIHB1bGxSZXF1ZXN0TGludDogZmFsc2UgfSxcbiAgICAgIHJlYWRtZTogb3B0aW9ucy5yZWFkbWUgPz8geyBjb250ZW50czogZGVmYXVsdFJlYWRtZUNvbnRlbnRzKG9wdGlvbnMpIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBnaCA9IHRoaXMuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0dpdEh1YkFjdGlvblByb2plY3QgcmVxdWlyZXMgR2l0SHViIGludGVncmF0aW9uIHRvIGJlIGVuYWJsZWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXBwbHlJbnRlcm5hbEFjdGlvbk92ZXJyaWRlcyhnaCk7XG5cbiAgICAvLyBKZXRCcmFpbnMgSURFIHN0YXRlICguaWRlYS8pIGlzIG5ldmVyIHRyYWNrZWQgaW4gZ2VuZXJhdGVkIHJlcG9zLlxuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvLmlkZWEvKicpO1xuXG4gICAgbmV3IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBnaGVUb2tlblNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgfSk7XG4gICAgbmV3IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3codGhpcyk7XG5cbiAgICBuZXcgTGljZW5zZSh0aGlzLCB7XG4gICAgICBzcGR4OiBvcHRpb25zLmxpY2Vuc2UgPz8gJ01JVCcsXG4gICAgICBjb3B5cmlnaHRPd25lcjogJ3hwZXJ0c3MnLFxuICAgIH0pO1xuXG4gICAgLy8gYC5wcm9qZW5yYy50c2AgKyBgbnB4IHByb2plbmAsIHNhbWUgYXMgZXZlcnkgb3RoZXIgdHlwZSBoZXJlLiBBIGJhcmVcbiAgICAvLyBHaXRIdWJQcm9qZWN0IGhhcyBubyBkZWZhdWx0IHRhc2sgdGhhdCBydW5zIGEgcHJvamVucmMgb24gaXRzIG93biwgc29cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFrZXMgYG5weCBwcm9qZW5gIHdvcmsgaW4gdGhlIGdlbmVyYXRlZCByZXBvIGF0IGFsbC5cbiAgICBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmModGhpcyk7XG5cbiAgICAvLyBwcm9qZW4gbWFya3MgZ2VuZXJhdGVkIGZpbGVzIHJlYWQtb25seSAoMDQ0NCkgb24gZGlzayBieSBkZWZhdWx0LCBidXRcbiAgICAvLyB0aGlzIG9uZSBtdXN0IHN0YXkgb3duZXItd3JpdGFibGU6IHRoZSBkb2N1bWVudGVkIHVwZGF0ZSBmbG93XG4gICAgLy8gKGBucG0gaSAtRCBAeHBlcnRzcy9wcm9qZW4tdHlwZXNAbGF0ZXN0YCkgbmVlZHMgbnBtIHRvIHJld3JpdGUgdGhlXG4gICAgLy8gcGlubmVkIHZlcnNpb25zIGluIGFuIGV4aXN0aW5nIHJlcG8uIEhhbmQtZWRpdHMgYXJlIHN0aWxsIGNhdWdodCBieVxuICAgIC8vIHRoZSBkcmlmdCBjaGVjay5cbiAgICBuZXcgSnNvbkZpbGUodGhpcywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICAgIHByaXZhdGU6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAncHJvamVuJzogUFJPSkVOX1ZFUlNJT04sXG4gICAgICAgICAgJ0B4cGVydHNzL3Byb2plbi10eXBlcyc6IFBST0pFTl9UWVBFU19WRVJTSU9OLFxuICAgICAgICAgICdjb21taXQtYW5kLXRhZy12ZXJzaW9uJzogQ09NTUlUX0FORF9UQUdfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy55YW1sbGludCcsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBleHRlbmRzOiAnZGVmYXVsdCcsXG4gICAgICAgIHJ1bGVzOiB7ICdsaW5lLWxlbmd0aCc6IHsgbWF4OiAxMjAgfSB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnVpbGRXb3JrZmxvdyA9IG5ldyBBY3Rpb25CdWlsZFdvcmtmbG93KHRoaXMpO1xuXG4gICAgdGhpcy5kb2dmb29kV29ya2Zsb3cgPSBuZXcgQWN0aW9uRG9nZm9vZFdvcmtmbG93KHRoaXMsIG9wdGlvbnMuZG9nZm9vZCk7XG5cbiAgICB0aGlzLnNvbmFyV29ya2Zsb3cgPSBuZXcgQWN0aW9uU29uYXJXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBzb25hckhvc3RVcmw6IG9wdGlvbnMuc29uYXJIb3N0VXJsLFxuICAgICAgc29uYXJUb2tlblNlY3JldDogb3B0aW9ucy5zb25hclRva2VuU2VjcmV0LFxuICAgICAgc29uYXJQdWxsUmVxdWVzdEdhdGU6IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUsXG4gICAgfSk7XG5cbiAgICAvLyBgZ2l0aHViUmVsZWFzZWAgZGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggYXV0by13aXJlc1xuICAgIC8vIGBwdWJsaXNoVG9HaXRIdWJSZWxlYXNlc2AgLSBpdHMgYGdoIHJlbGVhc2UgY3JlYXRlIC4uLiAtLXRhcmdldFxuICAgIC8vICRHSVRIVUJfU0hBYCBjcmVhdGVzIHRoZSB0YWcgKmFuZCogdGhlIHJlbGVhc2UgdG9nZXRoZXIgZm9yIG91clxuICAgIC8vIGNvbnRpbnVvdXMgKHB1c2gtdG8tbWFpbikgdHJpZ2dlci4gTm8gc2VwYXJhdGUgYHB1Ymxpc2hUb0dpdGAgY2FsbFxuICAgIC8vIG5lZWRlZCAodGhhdCBwYXRoIG9ubHkgZmlyZXMgZm9yIGEgbWFudWFsIHJlbGVhc2UgdHJpZ2dlcikuXG4gICAgdGhpcy5yZWxlYXNlID0gbmV3IHJlbGVhc2UuUmVsZWFzZSh0aGlzLCB7XG4gICAgICBicmFuY2g6ICdtYWluJyxcbiAgICAgIC8vIE5vIGJ1aWxkIGFydGlmYWN0IGZvciBhIGNvbXBvc2l0ZSBhY3Rpb24gKEFELTAwMSkgLSB0aGlzIGlzIG9ubHlcbiAgICAgIC8vIHdoZXJlIFJlbGVhc2Ugc3RhZ2VzIGl0cyBvd24gdmVyc2lvbi9jaGFuZ2Vsb2cgZmlsZXMuXG4gICAgICBhcnRpZmFjdHNEaXJlY3Rvcnk6ICdkaXN0JyxcbiAgICAgIHRhc2tzOiBbdGhpcy5idWlsZFdvcmtmbG93LnRhc2tdLFxuICAgICAgdmVyc2lvbkZpbGU6ICdwYWNrYWdlLmpzb24nLFxuICAgICAgcmVsZWFzYWJsZUNvbW1pdHM6IFJlbGVhc2FibGVDb21taXRzLmZlYXR1cmVzQW5kRml4ZXMoKSxcbiAgICAgIHJlbGVhc2VUcmlnZ2VyOiByZWxlYXNlLlJlbGVhc2VUcmlnZ2VyLmNvbnRpbnVvdXMoKSxcbiAgICAgIGJ1bXBQYWNrYWdlOiBgY29tbWl0LWFuZC10YWctdmVyc2lvbkAke0NPTU1JVF9BTkRfVEFHX1ZFUlNJT059YCxcbiAgICAgIHJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJlbGVhc2Ugd29ya2Zsb3cgaXMgY3JlYXRlZCBpbnNpZGUgYHJlbGVhc2UuUmVsZWFzZWAgKHByb2plblxuICAgIC8vIGludGVybmFsKSwgbm90IGJ5IHRoaXMgdHlwZSAtIHJlYWNoIGl0cyBmaWxlIGJ5IHBhdGggdG8gYW5ub3RhdGUgaXRcbiAgICAvLyBsaWtlIGV2ZXJ5IG90aGVyIGdlbmVyYXRlZCB3b3JrZmxvdy4gVGhpcyB0eXBlIGlzIGFsd2F5cyBhIHJvb3RcbiAgICAvLyBwcm9qZWN0LCBzbyBwcm9qZW4gbmFtZXMgaXQgYHJlbGVhc2UueW1sYC5cbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy50cnlGaW5kRmlsZSgnLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwnKSxcbiAgICAgICdDb250aW51b3VzIHJlbGVhc2Ugb24gcHVzaCB0byBtYWluOiBidW1wIHZlcnNpb24sIHRhZywgYW5kIGNyZWF0ZSBhIEdpdEh1YiBSZWxlYXNlLicsXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FPZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUNqRSwrRkFBeUY7QUFDekYsaUVBQWlFO0FBRWpFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsK0RBQStEO0FBQy9ELHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFDcEUsa0VBQWtFO0FBQ2xFLGlFQUFpRTtBQUNqRSxNQUFNLGNBQWMsR0FBVyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUM7QUFDdEUsaUVBQWlFO0FBQ2pFLE1BQU0sb0JBQW9CLEdBQVcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBRTNFLHdFQUF3RTtBQUN4RSw0RUFBNEU7QUFDNUUsbUNBQW1DO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0FBZ0V4QyxTQUFTLHFCQUFxQixDQUFDLE9BQW1DO0lBQ2hFLE9BQU8sS0FBSyxPQUFPLENBQUMsSUFBSTs7RUFFeEIsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFOzs7OztrQkFLVCxPQUFPLENBQUMsSUFBSTs7Ozs7Ozs7Ozs7Ozs7O0NBZTdCLENBQUM7QUFDRixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxlQUFNLENBQUMsYUFBYTs7SUFDM0MsYUFBYSxDQUFzQjtJQUNuQyxlQUFlLENBQXdCO0lBQ3ZDLGFBQWEsQ0FBc0I7SUFDbkMsT0FBTyxDQUFrQjtJQUV6QyxZQUFZLE9BQW1DO1FBQzdDLElBQUksQ0FBQyxPQUFPLENB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QixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDMUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsa0VBQWtFO1FBQ2xFLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsOERBQThEO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdkMsTUFBTSxFQUFFLE1BQU07WUFDZCxtRUFBbUU7WUFDbkUsd0RBQXdEO1lBQ3hELGtCQUFrQixFQUFFLE1BQU07WUFDMUIsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFDaEMsV0FBVyxFQUFFLGNBQWM7WUFDM0IsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkQsY0FBYyxFQUFFLGdCQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNuRCxXQUFXLEVBQUUsMEJBQTBCLHNCQUFzQixFQUFFO1lBQy9ELHlCQUF5QixFQUFFO2dCQUN6QixFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxrRUFBa0U7UUFDbEUsNkNBQTZDO1FBQzdDLElBQUEsc0NBQW1CLEVBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsK0JBQStCLENBQUMsRUFDakQscUZBQXFGLENBQ3RGLENBQUM7SUFDSixDQUFDOztBQTFISCxrREEySEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBKc29uRmlsZSxcbiAgTGljZW5zZSxcbiAgUmVsZWFzYWJsZUNvbW1pdHMsXG4gIFlhbWxGaWxlLFxuICBnaXRodWIsXG4gIHJlbGVhc2UsXG59IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBY3Rpb25CdWlsZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uRG9nZm9vZE9wdGlvbnMsIEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWRvZ2Zvb2Qtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uU29uYXJXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLXNvbmFyLXdvcmtmbG93JztcbmltcG9ydCB7IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkRWRpdG9yQ29uZmlnIH0gZnJvbSAnLi4vY29tbW9uL2VkaXRvcmNvbmZpZyc7XG5pbXBvcnQgeyBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzIH0gZnJvbSAnLi4vY29tbW9uL2ludGVybmFsLWFjdGlvbnMnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQsIHdoZW4gdGhlIGFjdGlvbiBoYXMgYVxuICAgKiBgdG9rZW5gIGlucHV0LCB0aGUgZG9nZm9vZCdzIGludm9jYXRpb24gb2YgaXQuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBvcmcncyBTb25hckNsb3VkIGluc3RhbmNlIChlLmcuIGBodHRwczovL3NvbmFyY2xvdWQuaW9gKS5cbiAgICogTVVTVCBiZSByZWFjaGFibGUgZnJvbSBnaXRodWIuY29tLWhvc3RlZCAocHVibGljKSBydW5uZXJzIChBRC0wMDEpLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdDogYSBndWVzc2VkIHNlcnZlciBpcyB3b3JzZSB0aGFuIGEgbG91ZCBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJIb3N0VXJsOiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwiU09OQVJfVE9LRU5cIiAqL1xuICByZWFkb25seSBzb25hclRva2VuU2VjcmV0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGBzb25hci55bWxgIGFsc28gcnVucyBvbiBgcHVsbF9yZXF1ZXN0YCBhcyBhIHBhc3MvZmFpbCBnYXRlLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzb25hclB1bGxSZXF1ZXN0R2F0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBkb2dmb29kIHNjZW5hcmlvIChBRC0wMDEpLiBXaGF0IGZpeHR1cmUgc3RhdGUsIHdoYXQgdG8gYXNzZXJ0LCBhbmRcbiAgICogaG93IHRvIGNsZWFuIHVwIGFyZSBzcGVjaWZpZWQgYnkgdGhlIGFjdGlvbidzIG93biBGIyMjIHNwZWMgLSB0aGVcbiAgICogaGlnaGVzdC1yaXNrIGJlaGF2aW9yIG9mIHRoYXQgYWN0aW9uLlxuICAgKlxuICAgKiBJdHMgdHlwZSBpcyBhIHN0cnVjdCwgd2hpY2ggcHJvamVuJ3MgQ0xJIGNhbm5vdCByZW5kZXIgaW50byBhIHByb2plbnJjLFxuICAgKiBzbyBpdCBjYW4gb25seSBiZSB3cml0dGVuIGJ5IGhhbmQgLSBpdCBpcyB0aGVyZWZvcmUgb3B0aW9uYWwsIGJlY2F1c2UgYVxuICAgKiAqcmVxdWlyZWQqIG9wdGlvbiBgcHJvamVuIG5ld2AgY2Fubm90IHN1cHBseSB3b3VsZCBtYWtlIHRoaXMgcHJvamVjdFxuICAgKiB0eXBlIGltcG9zc2libGUgdG8gc2NhZmZvbGQuIEFELTAwMSdzIFwibmV2ZXIgYSBzaWxlbnQgbm8tb3AgZG9nZm9vZFwiXG4gICAqIHJ1bGUgaXMgZW5mb3JjZWQgaW5zdGVhZCBieSB0aGUgd29ya2Zsb3cgaXQgZ2VuZXJhdGVzIGluIHRoYXQgY2FzZTogYVxuICAgKiBzaW5nbGUgc3RlcCB0aGF0IGZhaWxzIG9uIGV2ZXJ5IFBSIHVudGlsIGEgc2NlbmFyaW8gaXMgZGVjbGFyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYHRlc3QtZG9nZm9vZC55bWxgIHJ1bnMgb25lIGZhaWxpbmcgc3RlcCB0aGF0IHRlbGxzIHlvdSB0b1xuICAgKiBkZWNsYXJlIGEgc2NlbmFyaW9cbiAgICovXG4gIHJlYWRvbmx5IGRvZ2Zvb2Q/OiBBY3Rpb25Eb2dmb29kT3B0aW9ucztcblxuICAvKipcbiAgICogU1BEWCBpZGVudGlmaWVyIGZvciB0aGUgZ2VuZXJhdGVkIGBMSUNFTlNFYC5cbiAgICogQGRlZmF1bHQgXCJNSVRcIlxuICAgKi9cbiAgcmVhZG9ubHkgbGljZW5zZT86IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGUgYSBwcm9qZW4tbWFuYWdlZCBgLmVkaXRvcmNvbmZpZ2AuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgIyAke29wdGlvbnMubmFtZX1cblxuJHtvcHRpb25zLmRlc2NyaXB0aW9uID8/ICcnfVxuXG4jIyBVc2FnZVxuXG5cXGBcXGBcXGB5YW1sXG4tIHVzZXM6IHhwZXJ0c3MvJHtvcHRpb25zLm5hbWV9QDxyZWY+XG5cXGBcXGBcXGBcblxuIyMgQnVtcGluZ1xuXG5BIFxcYGZlYXQ6XFxgL1xcYGZpeDpcXGAgY29tbWl0IHB1c2hlZCB0byBcXGBtYWluXFxgIGlzIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHk6IGJ1bXAsXG50YWcgXFxgdlguWS5aXFxgLCBHaXRIdWIgUmVsZWFzZS4gU2VlIFxcYC5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sXFxgLlxuXG4jIyBUcnVzdCBjb250cmFjdFxuXG5UaGlzIGlzIGEgY29tcG9zaXRlIChzaGVsbCkgYWN0aW9uIC0gbm8gTm9kZS9ucG0gYXQgcnVudGltZSwgbm8gRG9ja2VyLiBJdHNcbkNJIGxpbnQgZ2F0ZSAoXFxgYnVpbGQueW1sXFxgKSwgZG9nZm9vZCB0ZXN0IChcXGB0ZXN0LWRvZ2Zvb2QueW1sXFxgKSwgYW5kIFNvbmFyXG5zY2FuIChcXGBzb25hci55bWxcXGApIGFyZSBzY2FmZm9sZGVkIGJ5IFxcYEB4cGVydHNzL3Byb2plbi10eXBlc1xcYCdcblxcYEdpdEh1YkFjdGlvblByb2plY3RcXGA7IG9ubHkgXFxgYWN0aW9uLnltbFxcYCBhbmQgaXRzIHNoZWxsIHNjcmlwdHMgYXJlXG5oYW5kLWNvbW1pdHRlZC5cbmA7XG59XG5cbi8qKlxuICogU2NhZmZvbGRzIHRoZSByZXBvIGxpZmVjeWNsZSAoQUQtMDAxKSBhcm91bmQgYSBoYW5kLWNvbW1pdHRlZCwgY29tcG9zaXRlXG4gKiAoc2hlbGwpIEdpdEh1YiBBY3Rpb246IHRoZSBgYnVpbGRgL2B0ZXN0LWRvZ2Zvb2RgL2Bzb25hcmAvYHJlbGVhc2VgXG4gICogd29ya2Zsb3dzLCB2ZXJzaW9uaW5nIGFuZCByZWxlYXNlIGRpc2NpcGxpbmUsIHRoZSBGMDAzIHZlcmlmeSBjb21wb25lbnRzLFxuICAqIGFuZCByZXBvIGJvaWxlcnBsYXRlIChhIHByaXZhdGUgdmVyc2lvbi1zb3VyY2UgYHBhY2thZ2UuanNvbmAsIGAueWFtbGxpbnRgLFxuICAqIGBMSUNFTlNFYCwgYW5kIGEgYFJFQURNRS5tZGAgdGVtcGxhdGUpLiBUaGVcbiAqIGFjdGlvbidzIG93biBjb250ZW50XG4gKiAoYGFjdGlvbi55bWxgLCBpdHMgc2hlbGwgc2NyaXB0cywgYHRlc3QvYCBmaXh0dXJlcykgaXMgYXV0aG9yZWQgYnkgaGFuZFxuICogcGVyIHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhpcyB0eXBlIG9ubHkgbGludHMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRIdWJBY3Rpb25Qcm9qZWN0IGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRXb3JrZmxvdzogQWN0aW9uQnVpbGRXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IGRvZ2Zvb2RXb3JrZmxvdzogQWN0aW9uRG9nZm9vZFdvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgc29uYXJXb3JrZmxvdzogQWN0aW9uU29uYXJXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IHJlbGVhc2U6IHJlbGVhc2UuUmVsZWFzZTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBzb25hckhvc3RVcmwnKTtcbiAgICB9XG4gICAgLy8gQSBkZWNsYXJlZC1idXQtaW5jb21wbGV0ZSBkb2dmb29kIGlzIHN0aWxsIGFuIGVycm9yIC0gc2VlXG4gICAgLy8gYEFjdGlvbkRvZ2Zvb2RXb3JrZmxvd2AsIHdoaWNoIG93bnMgdGhhdCBjaGVjayAoYW5kIHRoZVxuICAgIC8vIG5vLWRvZ2Zvb2QtZGVjbGFyZWQgY2FzZSkuXG5cbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucywgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcmVhZG1lOiBvcHRpb25zLnJlYWRtZSA/PyB7IGNvbnRlbnRzOiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9ucykgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdoID0gdGhpcy5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MsIGFuZFxuICAgIC8vIG5laXRoZXIgaXMgL3NwZWMvIChsb2NhbCBwbGFucyBhbmQgc3BlY3M7IHRoZSBwYXR0ZXJuIGNvdmVycyBldmVyeVxuICAgIC8vIHN1YmRpcmVjdG9yeSkuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy9zcGVjLycpO1xuXG4gICAgaWYgKG9wdGlvbnMuZWRpdG9yY29uZmlnID8/IHRydWUpIHtcbiAgICAgIGFkZEVkaXRvckNvbmZpZyh0aGlzKTtcbiAgICB9XG5cbiAgICBuZXcgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93KHRoaXMsIHtcbiAgICAgIGdoZVRva2VuU2VjcmV0OiBvcHRpb25zLmdoZVRva2VuU2VjcmV0ID8/IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCxcbiAgICB9KTtcbiAgICBuZXcgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyh0aGlzKTtcblxuICAgIG5ldyBMaWNlbnNlKHRoaXMsIHtcbiAgICAgIHNwZHg6IG9wdGlvbnMubGljZW5zZSA/PyAnTUlUJyxcbiAgICAgIGNvcHlyaWdodE93bmVyOiAneHBlcnRzcycsXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIEEgYmFyZVxuICAgIC8vIEdpdEh1YlByb2plY3QgaGFzIG5vIGRlZmF1bHQgdGFzayB0aGF0IHJ1bnMgYSBwcm9qZW5yYyBvbiBpdHMgb3duLCBzb1xuICAgIC8vIHRoaXMgaXMgd2hhdCBtYWtlcyBgbnB4IHByb2plbmAgd29yayBpbiB0aGUgZ2VuZXJhdGVkIHJlcG8gYXQgYWxsLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIHByb2plbiBtYXJrcyBnZW5lcmF0ZWQgZmlsZXMgcmVhZC1vbmx5ICgwNDQ0KSBvbiBkaXNrIGJ5IGRlZmF1bHQsIGJ1dFxuICAgIC8vIHRoaXMgb25lIG11c3Qgc3RheSBvd25lci13cml0YWJsZTogdGhlIGRvY3VtZW50ZWQgdXBkYXRlIGZsb3dcbiAgICAvLyAoYG5wbSBpIC1EIEB4cGVydHNzL3Byb2plbi10eXBlc0BsYXRlc3RgKSBuZWVkcyBucG0gdG8gcmV3cml0ZSB0aGVcbiAgICAvLyBwaW5uZWQgdmVyc2lvbnMgaW4gYW4gZXhpc3RpbmcgcmVwby4gSGFuZC1lZGl0cyBhcmUgc3RpbGwgY2F1Z2h0IGJ5XG4gICAgLy8gdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGRldkRlcGVuZGVuY2llczoge1xuICAgICAgICAgICdwcm9qZW4nOiBQUk9KRU5fVkVSU0lPTixcbiAgICAgICAgICAnQHhwZXJ0c3MvcHJvamVuLXR5cGVzJzogUFJPSkVOX1RZUEVTX1ZFUlNJT04sXG4gICAgICAgICAgJ2NvbW1pdC1hbmQtdGFnLXZlcnNpb24nOiBDT01NSVRfQU5EX1RBR19WRVJTSU9OLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIG5ldyBZYW1sRmlsZSh0aGlzLCAnLnlhbWxsaW50Jywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGV4dGVuZHM6ICdkZWZhdWx0JyxcbiAgICAgICAgcnVsZXM6IHsgJ2xpbmUtbGVuZ3RoJzogeyBtYXg6IDEyMCB9IH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZFdvcmtmbG93ID0gbmV3IEFjdGlvbkJ1aWxkV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmRvZ2Zvb2RXb3JrZmxvdyA9IG5ldyBBY3Rpb25Eb2dmb29kV29ya2Zsb3codGhpcywgb3B0aW9ucy5kb2dmb29kKTtcblxuICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBBY3Rpb25Tb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgIHNvbmFySG9zdFVybDogb3B0aW9ucy5zb25hckhvc3RVcmwsXG4gICAgICBzb25hclRva2VuU2VjcmV0OiBvcHRpb25zLnNvbmFyVG9rZW5TZWNyZXQsXG4gICAgICBzb25hclB1bGxSZXF1ZXN0R2F0ZTogb3B0aW9ucy5zb25hclB1bGxSZXF1ZXN0R2F0ZSxcbiAgICB9KTtcblxuICAgIC8vIGBnaXRodWJSZWxlYXNlYCBkZWZhdWx0cyB0byB0cnVlLCB3aGljaCBhdXRvLXdpcmVzXG4gICAgLy8gYHB1Ymxpc2hUb0dpdEh1YlJlbGVhc2VzYCAtIGl0cyBgZ2ggcmVsZWFzZSBjcmVhdGUgLi4uIC0tdGFyZ2V0XG4gICAgLy8gJEdJVEhVQl9TSEFgIGNyZWF0ZXMgdGhlIHRhZyAqYW5kKiB0aGUgcmVsZWFzZSB0b2dldGhlciBmb3Igb3VyXG4gICAgLy8gY29udGludW91cyAocHVzaC10by1tYWluKSB0cmlnZ2VyLiBObyBzZXBhcmF0ZSBgcHVibGlzaFRvR2l0YCBjYWxsXG4gICAgLy8gbmVlZGVkICh0aGF0IHBhdGggb25seSBmaXJlcyBmb3IgYSBtYW51YWwgcmVsZWFzZSB0cmlnZ2VyKS5cbiAgICB0aGlzLnJlbGVhc2UgPSBuZXcgcmVsZWFzZS5SZWxlYXNlKHRoaXMsIHtcbiAgICAgIGJyYW5jaDogJ21haW4nLFxuICAgICAgLy8gTm8gYnVpbGQgYXJ0aWZhY3QgZm9yIGEgY29tcG9zaXRlIGFjdGlvbiAoQUQtMDAxKSAtIHRoaXMgaXMgb25seVxuICAgICAgLy8gd2hlcmUgUmVsZWFzZSBzdGFnZXMgaXRzIG93biB2ZXJzaW9uL2NoYW5nZWxvZyBmaWxlcy5cbiAgICAgIGFydGlmYWN0c0RpcmVjdG9yeTogJ2Rpc3QnLFxuICAgICAgdGFza3M6IFt0aGlzLmJ1aWxkV29ya2Zsb3cudGFza10sXG4gICAgICB2ZXJzaW9uRmlsZTogJ3BhY2thZ2UuanNvbicsXG4gICAgICByZWxlYXNhYmxlQ29tbWl0czogUmVsZWFzYWJsZUNvbW1pdHMuZmVhdHVyZXNBbmRGaXhlcygpLFxuICAgICAgcmVsZWFzZVRyaWdnZXI6IHJlbGVhc2UuUmVsZWFzZVRyaWdnZXIuY29udGludW91cygpLFxuICAgICAgYnVtcFBhY2thZ2U6IGBjb21taXQtYW5kLXRhZy12ZXJzaW9uQCR7Q09NTUlUX0FORF9UQUdfVkVSU0lPTn1gLFxuICAgICAgcmVsZWFzZVdvcmtmbG93U2V0dXBTdGVwczogW1xuICAgICAgICB7IG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsIHJ1bjogJ25wbSBjaScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVsZWFzZSB3b3JrZmxvdyBpcyBjcmVhdGVkIGluc2lkZSBgcmVsZWFzZS5SZWxlYXNlYCAocHJvamVuXG4gICAgLy8gaW50ZXJuYWwpLCBub3QgYnkgdGhpcyB0eXBlIC0gcmVhY2ggaXRzIGZpbGUgYnkgcGF0aCB0byBhbm5vdGF0ZSBpdFxuICAgIC8vIGxpa2UgZXZlcnkgb3RoZXIgZ2VuZXJhdGVkIHdvcmtmbG93LiBUaGlzIHR5cGUgaXMgYWx3YXlzIGEgcm9vdFxuICAgIC8vIHByb2plY3QsIHNvIHByb2plbiBuYW1lcyBpdCBgcmVsZWFzZS55bWxgLlxuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLnRyeUZpbmRGaWxlKCcuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbCcpLFxuICAgICAgJ0NvbnRpbnVvdXMgcmVsZWFzZSBvbiBwdXNoIHRvIG1haW46IGJ1bXAgdmVyc2lvbiwgdGFnLCBhbmQgY3JlYXRlIGEgR2l0SHViIFJlbGVhc2UuJyxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -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.14" };
|
|
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.14" };
|
|
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.14" };
|
|
15
15
|
constructor(options) {
|
|
16
16
|
super(options);
|
|
17
17
|
if (options.ecrEcs?.enabled) {
|