@xpertss/projen-types 0.0.12 → 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.
Files changed (60) hide show
  1. package/.jsii +2602 -750
  2. package/API.md +5753 -1420
  3. package/README.md +335 -37
  4. package/lib/actions/action-build-workflow.js +1 -1
  5. package/lib/actions/action-dogfood-workflow.d.ts +4 -4
  6. package/lib/actions/action-dogfood-workflow.js +4 -4
  7. package/lib/actions/action-sonar-workflow.js +1 -1
  8. package/lib/actions/github-action-project.d.ts +5 -0
  9. package/lib/actions/github-action-project.js +10 -3
  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.js +10 -3
  14. package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
  15. package/lib/cdk/components/edge-networking-constructs.js +1 -1
  16. package/lib/cdk/database-component.js +1 -1
  17. package/lib/cdk/options.d.ts +5 -0
  18. package/lib/cdk/options.js +1 -1
  19. package/lib/common/ci-steps.d.ts +14 -0
  20. package/lib/common/ci-steps.js +30 -0
  21. package/lib/common/editorconfig.d.ts +12 -0
  22. package/lib/common/editorconfig.js +44 -0
  23. package/lib/common/projen-drift-check-workflow.js +5 -15
  24. package/lib/common/workflow-change-notice-workflow.js +1 -1
  25. package/lib/index.d.ts +4 -0
  26. package/lib/index.js +5 -1
  27. package/lib/java/components/cdk-deploy-hook.d.ts +2 -2
  28. package/lib/java/components/cdk-deploy-hook.js +2 -2
  29. package/lib/java/components/code-index-workflow.d.ts +2 -2
  30. package/lib/java/components/code-index-workflow.js +5 -3
  31. package/lib/java/components/docker-publish.d.ts +2 -2
  32. package/lib/java/components/docker-publish.js +2 -2
  33. package/lib/java/components/flyway-migration.d.ts +8 -3
  34. package/lib/java/components/flyway-migration.js +11 -5
  35. package/lib/java/components/github-packages-publish.d.ts +2 -2
  36. package/lib/java/components/github-packages-publish.js +2 -2
  37. package/lib/java/components/maven-central-publish.d.ts +2 -2
  38. package/lib/java/components/maven-central-publish.js +2 -2
  39. package/lib/java/components/maven-upgrade-report.d.ts +22 -0
  40. package/lib/java/components/maven-upgrade-report.js +61 -0
  41. package/lib/java/java-app-project.js +1 -1
  42. package/lib/java/java-library-project.d.ts +5 -1
  43. package/lib/java/java-library-project.js +14 -3
  44. package/lib/java/java-maven-base.d.ts +91 -8
  45. package/lib/java/java-maven-base.js +339 -24
  46. package/lib/java/java-service-project.d.ts +17 -5
  47. package/lib/java/java-service-project.js +20 -7
  48. package/lib/java/java-spring-boot-project.d.ts +30 -0
  49. package/lib/java/java-spring-boot-project.js +68 -0
  50. package/lib/java/java-versions.d.ts +40 -0
  51. package/lib/java/java-versions.js +106 -0
  52. package/lib/java/maven/maven-module.d.ts +47 -0
  53. package/lib/java/maven/maven-module.js +99 -0
  54. package/lib/java/maven/maven-pom.d.ts +143 -0
  55. package/lib/java/maven/maven-pom.js +337 -0
  56. package/lib/java/options.d.ts +128 -1
  57. package/lib/java/options.js +1 -1
  58. package/package.json +1 -1
  59. package/lib/common/upgrade-workflow.d.ts +0 -18
  60. package/lib/common/upgrade-workflow.js +0 -45
@@ -1,15 +1,98 @@
1
1
  import { Task, github, java } from 'projen';
2
- import { CommonJavaOptions } from './options';
3
- export interface JavaMavenProjectOptions extends CommonJavaOptions {
4
- }
2
+ import { MavenModule } from './maven/maven-module';
3
+ import { MavenPom } from './maven/maven-pom';
4
+ import { JavaMavenProjectOptions, MavenModuleOptions } from './options';
5
5
  /**
6
- * Shared Maven build skeleton for all three Java project types: standard
7
- * `pom.xml`/directory layout (via `java.JavaProject`), a PR-triggered
8
- * build+test(+SonarQube) workflow that hard-fails on projen drift, and a
9
- * nightly dependency-upgrade workflow.
6
+ * Baseline Maven project, single- or multi-module, with no framework
7
+ * assumptions. It is the base of every Java type in this package and is
8
+ * usable on its own (`projen new ... java_maven`).
9
+ *
10
+ * - The pom is written by this package (`MavenPom`), not projen's
11
+ * `java.Pom`: exact versions only, BOM imports, `<modules>`,
12
+ * `<dependencyManagement>`, `<pluginManagement>`.
13
+ * - Everything Java-version-dependent (compiler level, enforcer rule, JUnit
14
+ * line, CI JDK) follows `javaVersion`.
15
+ * - With no `addModule()` calls the root pom is the artifact. After the
16
+ * first `addModule()` it is a `pom`-packaged reactor parent and the
17
+ * modules inherit its plugins and test dependencies.
18
+ * - `npx projen build` synthesizes, then runs Maven once: `mvn -B verify`
19
+ * (unit tests via surefire, `*IT` tests via failsafe).
20
+ * - CI: a PR build (with an optional SonarQube scan), the projen drift
21
+ * check, and a nightly report-only update check.
10
22
  */
11
- export declare class JavaMavenProject extends java.JavaProject {
23
+ export declare class JavaMavenProject extends github.GitHubProject {
24
+ /** The root `pom.xml`. */
25
+ readonly pom: MavenPom;
26
+ /** The canonical Java line the build targets (`1.8`, `17`, `21`, `25`). */
27
+ readonly javaVersion: string;
28
+ /** Prints available dependency/plugin updates (`npx projen upgrade`). */
12
29
  readonly upgradeTask: Task;
30
+ /**
31
+ * The PR build workflow (`build.yml`). Add jobs to it with
32
+ * `buildVerifyWorkflow.addJob(id, job)`; use `ciSetupSteps` for a job that
33
+ * needs Node, the projen toolchain, and the JDK.
34
+ */
13
35
  readonly buildVerifyWorkflow: github.TaskWorkflow;
36
+ /**
37
+ * Steps that install Node (pinned), `npm ci`, and the project's JDK with a
38
+ * Maven cache - the setup every Maven CI job in this repo needs.
39
+ */
40
+ readonly ciSetupSteps: github.workflows.JobStep[];
41
+ private readonly javaLine;
42
+ private readonly rootPackaging?;
43
+ private readonly groupId;
44
+ private readonly sample;
45
+ private readonly mavenModules;
14
46
  constructor(options: JavaMavenProjectOptions);
47
+ /** The modules added with `addModule()`, in order. */
48
+ get modules(): MavenModule[];
49
+ /**
50
+ * Adds a Maven module in `dir` (relative to the repo root; may be nested,
51
+ * e.g. `tools/stub-model`) and turns the root pom into the reactor parent
52
+ * (`packaging=pom`, `<modules>` in the order added). The parent manages
53
+ * every module at `${project.version}`, so modules depend on each other
54
+ * with `addModuleDependency()`, versionless.
55
+ */
56
+ addModule(options: MavenModuleOptions): MavenModule;
57
+ /**
58
+ * Imports a BOM into the root `<dependencyManagement>` (`type=pom`,
59
+ * `scope=import`).
60
+ *
61
+ * @param spec `groupId/artifactId@version`
62
+ */
63
+ addBom(spec: string): void;
64
+ /**
65
+ * Pins a version in the root `<dependencyManagement>` without adding the
66
+ * dependency, so modules (or the root) can use it versionless.
67
+ *
68
+ * @param spec `groupId/artifactId@version`
69
+ */
70
+ addManagedDependency(spec: string): void;
71
+ /**
72
+ * Adds a compile-scope dependency to the root pom. In a multi-module
73
+ * project every module inherits it; use `MavenModule.addDependency` for
74
+ * one module.
75
+ *
76
+ * @param spec `groupId/artifactId[@version]` - exact version, or none when
77
+ * a BOM manages it
78
+ */
79
+ addDependency(spec: string): void;
80
+ /** Adds a test-scope dependency to the root pom (inherited by every module). */
81
+ addTestDependency(spec: string): void;
82
+ /** Adds a build plugin to the root pom (inherited by every module). */
83
+ addPlugin(spec: string, options?: java.PluginOptions): void;
84
+ preSynthesize(): void;
85
+ /**
86
+ * The exact version this project uses for a `groupId/artifactId` it pins
87
+ * by default: the `pluginVersions` override if set, otherwise the
88
+ * default for `javaVersion`.
89
+ */
90
+ pinnedVersion(coordinates: string): string;
91
+ /**
92
+ * The newest Spring Boot major version `javaVersion` supports, or
93
+ * undefined when this package knows of no cap.
94
+ */
95
+ protected maxSpringBootMajor(): number | undefined;
96
+ private configureBuild;
97
+ private addSample;
15
98
  }
@@ -2,59 +2,149 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.JavaMavenProject = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const path_1 = require("path");
5
6
  const projen_1 = require("projen");
7
+ const maven_upgrade_report_1 = require("./components/maven-upgrade-report");
8
+ const java_versions_1 = require("./java-versions");
9
+ const maven_module_1 = require("./maven/maven-module");
10
+ const maven_pom_1 = require("./maven/maven-pom");
11
+ const ci_steps_1 = require("../common/ci-steps");
6
12
  const constants_1 = require("../common/constants");
13
+ const editorconfig_1 = require("../common/editorconfig");
7
14
  const internal_actions_1 = require("../common/internal-actions");
8
15
  const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
9
16
  const projenrc_ts_1 = require("../common/projenrc-ts");
10
- const upgrade_workflow_1 = require("../common/upgrade-workflow");
11
17
  const workflow_change_notice_workflow_1 = require("../common/workflow-change-notice-workflow");
12
18
  const workflow_purpose_1 = require("../common/workflow-purpose");
19
+ // `require(...)` resolves through Node's normal module resolution, so in a
20
+ // *published* package these are the versions installed in the consuming
21
+ // repo - exactly what its package.json must pin (same as
22
+ // `GitHubActionProject`).
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const PROJEN_VERSION = require('projen/package.json').version;
25
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
26
+ const PROJEN_TYPES_VERSION = require('../../package.json').version;
13
27
  /**
14
- * Shared Maven build skeleton for all three Java project types: standard
15
- * `pom.xml`/directory layout (via `java.JavaProject`), a PR-triggered
16
- * build+test(+SonarQube) workflow that hard-fails on projen drift, and a
17
- * nightly dependency-upgrade workflow.
28
+ * Baseline Maven project, single- or multi-module, with no framework
29
+ * assumptions. It is the base of every Java type in this package and is
30
+ * usable on its own (`projen new ... java_maven`).
31
+ *
32
+ * - The pom is written by this package (`MavenPom`), not projen's
33
+ * `java.Pom`: exact versions only, BOM imports, `<modules>`,
34
+ * `<dependencyManagement>`, `<pluginManagement>`.
35
+ * - Everything Java-version-dependent (compiler level, enforcer rule, JUnit
36
+ * line, CI JDK) follows `javaVersion`.
37
+ * - With no `addModule()` calls the root pom is the artifact. After the
38
+ * first `addModule()` it is a `pom`-packaged reactor parent and the
39
+ * modules inherit its plugins and test dependencies.
40
+ * - `npx projen build` synthesizes, then runs Maven once: `mvn -B verify`
41
+ * (unit tests via surefire, `*IT` tests via failsafe).
42
+ * - CI: a PR build (with an optional SonarQube scan), the projen drift
43
+ * check, and a nightly report-only update check.
18
44
  */
19
- class JavaMavenProject extends projen_1.java.JavaProject {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.12" };
45
+ class JavaMavenProject extends projen_1.github.GitHubProject {
46
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.14" };
47
+ /** The root `pom.xml`. */
48
+ pom;
49
+ /** The canonical Java line the build targets (`1.8`, `17`, `21`, `25`). */
50
+ javaVersion;
51
+ /** Prints available dependency/plugin updates (`npx projen upgrade`). */
21
52
  upgradeTask;
53
+ /**
54
+ * The PR build workflow (`build.yml`). Add jobs to it with
55
+ * `buildVerifyWorkflow.addJob(id, job)`; use `ciSetupSteps` for a job that
56
+ * needs Node, the projen toolchain, and the JDK.
57
+ */
22
58
  buildVerifyWorkflow;
59
+ /**
60
+ * Steps that install Node (pinned), `npm ci`, and the project's JDK with a
61
+ * Maven cache - the setup every Maven CI job in this repo needs.
62
+ */
63
+ ciSetupSteps;
64
+ javaLine;
65
+ rootPackaging;
66
+ groupId;
67
+ sample;
68
+ mavenModules = [];
23
69
  constructor(options) {
24
70
  super({
25
71
  // Spread first, overrides after: forwarding the caller's options is
26
- // what lets `projen new --from @xpertss/projen-types java_library`
27
- // work - projen smuggles its bootstrap marker (`__new__`) through the
72
+ // what lets `projen new --from @xpertss/projen-types java_maven` work
73
+ // - projen smuggles its bootstrap marker (`__new__`) through the
28
74
  // options object, and it is that marker which makes the
29
75
  // `ProjenrcFile` component write the initial `.projenrc.ts`. Drop it
30
76
  // and `projen new` scaffolds a repo with no projenrc at all.
31
- ...options,
77
+ ...stringifyProjenNewArgs(options),
32
78
  name: options.name,
33
- groupId: options.groupId,
34
- artifactId: options.artifactId,
35
- version: options.version ?? '0.1.0',
36
79
  // PR titles are not gated: `feat:`/`fix:` matter only because they drive
37
80
  // the release workflow (via `releasableCommits`), not PR checks. The
38
81
  // conventional-commit PR-title lint is added by the `GitHub` component
39
82
  // unless `githubOptions.pullRequestLint` is `false` (it defaults true).
40
83
  githubOptions: { pullRequestLint: false },
41
- // Consumers author their config as a Node-side `.projenrc.ts` (this
42
- // package only publishes an npm jsii target, no java target), not a
43
- // hand-written `src/test/java/projenrc.java` - so java.JavaProject's
44
- // own Java-native projenrc (which wires the default task to `mvn
45
- // compiler:testCompile && mvn exec:java ...`) would be wrong here.
46
- // Disable it and attach the TypeScript one instead.
47
- projenrcJava: false,
48
84
  projenCredentials: projen_1.github.GithubCredentials.fromPersonalAccessToken({
49
85
  secret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
50
86
  }),
51
87
  });
88
+ for (const version of Object.values(options.pluginVersions ?? {})) {
89
+ (0, maven_pom_1.assertExactVersion)(version, 'pluginVersions');
90
+ }
91
+ this.javaLine = (0, java_versions_1.resolveJavaLine)(options.javaVersion, options.pluginVersions);
92
+ this.javaVersion = this.javaLine.line;
93
+ this.rootPackaging = options.packaging;
94
+ this.groupId = options.groupId;
95
+ this.sample = options.sample ?? false;
52
96
  // `.projenrc.ts` + `npx projen`, same as every other type here. The
53
97
  // Maven repo needs no TypeScript toolchain of its own - the runner is
54
98
  // fetched (pinned) by npx at synth time.
55
99
  (0, projenrc_ts_1.attachTypeScriptProjenrc)(this);
56
- // JetBrains IDE state (.idea/) is never tracked in generated repos.
100
+ // The projen toolchain `npx projen` runs, pinned exactly so every
101
+ // machine and CI resolve the same generator. Owner-writable on disk so
102
+ // the documented update flow (`npm i -D -E @xpertss/projen-types@<v>`)
103
+ // can rewrite it; hand-edits are still caught by the drift check.
104
+ new projen_1.JsonFile(this, 'package.json', {
105
+ obj: {
106
+ name: options.name,
107
+ version: '0.0.0',
108
+ private: true,
109
+ devDependencies: {
110
+ 'projen': PROJEN_VERSION,
111
+ '@xpertss/projen-types': PROJEN_TYPES_VERSION,
112
+ },
113
+ },
114
+ readonly: false,
115
+ });
116
+ // JetBrains IDE state (.idea/) is never tracked in generated repos, and
117
+ // neither is /spec/ (local plans and specs; the pattern covers every
118
+ // subdirectory).
57
119
  this.addGitIgnore('/.idea/*');
120
+ this.addGitIgnore('/spec/');
121
+ this.addGitIgnore('target/');
122
+ this.addGitIgnore('.classpath');
123
+ this.addGitIgnore('.project');
124
+ this.addGitIgnore('.settings');
125
+ if (options.licensed ?? true) {
126
+ new projen_1.License(this, {
127
+ spdx: options.license ?? 'MIT',
128
+ copyrightOwner: options.copyrightOwner ?? 'xpertss',
129
+ copyrightPeriod: options.copyrightPeriod,
130
+ });
131
+ }
132
+ if (options.editorconfig ?? true) {
133
+ (0, editorconfig_1.addEditorConfig)(this);
134
+ }
135
+ this.pom = new maven_pom_1.MavenPom(this, {
136
+ groupId: options.groupId,
137
+ artifactId: options.artifactId,
138
+ version: options.version ?? '0.1.0',
139
+ packaging: this.rootPackaging ?? 'jar',
140
+ name: options.name,
141
+ description: options.description,
142
+ url: options.url,
143
+ });
144
+ this.configureBuild(options);
145
+ // One Maven run per build: `verify` runs every earlier phase (compile,
146
+ // unit tests, package) plus integration tests. Nothing deploys.
147
+ this.testTask.exec('mvn -B verify');
58
148
  const gh = this.github;
59
149
  if (!gh) {
60
150
  throw new Error('JavaMavenProject requires GitHub integration');
@@ -64,6 +154,19 @@ class JavaMavenProject extends projen_1.java.JavaProject {
64
154
  gheTokenSecret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
65
155
  });
66
156
  new workflow_change_notice_workflow_1.WorkflowChangeNoticeWorkflow(this);
157
+ this.ciSetupSteps = [
158
+ ci_steps_1.SETUP_NODE_STEP,
159
+ ci_steps_1.NPM_CI_STEP,
160
+ {
161
+ name: 'Setup Java',
162
+ uses: 'actions/setup-java@v6',
163
+ with: {
164
+ 'distribution': options.javaDistribution ?? 'temurin',
165
+ 'java-version': this.javaLine.setupJavaVersion,
166
+ 'cache': 'maven',
167
+ },
168
+ },
169
+ ];
67
170
  const postBuildSteps = [];
68
171
  if (options.sonarProjectKey) {
69
172
  postBuildSteps.push({
@@ -78,14 +181,226 @@ class JavaMavenProject extends projen_1.java.JavaProject {
78
181
  task: this.buildTask,
79
182
  triggers: { pullRequest: {}, workflowDispatch: {} },
80
183
  permissions: { contents: projen_1.github.workflows.JobPermission.READ },
184
+ preBuildSteps: this.ciSetupSteps,
81
185
  postBuildSteps,
82
186
  });
83
187
  (0, workflow_purpose_1.noteWorkflowPurpose)(this.buildVerifyWorkflow.file, 'Build and test the Maven project on pull requests, with an optional SonarQube scan.');
188
+ const versionsPlugin = `org.codehaus.mojo:versions-maven-plugin:${this.pinnedVersion(java_versions_1.VERSIONS_MAVEN_PLUGIN)}`;
84
189
  this.upgradeTask = this.addTask('upgrade', {
85
- exec: 'mvn -B versions:use-latest-releases versions:update-properties',
190
+ exec: `mvn -B ${versionsPlugin}:display-dependency-updates ${versionsPlugin}:display-plugin-updates`,
191
+ });
192
+ if (options.upgradeWorkflow ?? true) {
193
+ new maven_upgrade_report_1.MavenUpgradeReport(this, {
194
+ task: this.upgradeTask,
195
+ setupSteps: this.ciSetupSteps,
196
+ });
197
+ }
198
+ }
199
+ /** The modules added with `addModule()`, in order. */
200
+ get modules() {
201
+ return [...this.mavenModules];
202
+ }
203
+ /**
204
+ * Adds a Maven module in `dir` (relative to the repo root; may be nested,
205
+ * e.g. `tools/stub-model`) and turns the root pom into the reactor parent
206
+ * (`packaging=pom`, `<modules>` in the order added). The parent manages
207
+ * every module at `${project.version}`, so modules depend on each other
208
+ * with `addModuleDependency()`, versionless.
209
+ */
210
+ addModule(options) {
211
+ if (this.rootPackaging !== undefined && this.rootPackaging !== 'pom') {
212
+ throw new Error(`A multi-module project's root pom is packaged as "pom"; remove packaging: "${this.rootPackaging}".`);
213
+ }
214
+ const dir = normalizeModuleDir(options.dir);
215
+ for (const m of this.mavenModules) {
216
+ if (m.artifactId === options.artifactId) {
217
+ throw new Error(`Duplicate module artifactId "${options.artifactId}" (dirs "${m.dir}" and "${dir}").`);
218
+ }
219
+ if (m.dir === dir || dir.startsWith(`${m.dir}/`) || m.dir.startsWith(`${dir}/`)) {
220
+ throw new Error(`Module dir "${dir}" overlaps module dir "${m.dir}": module dirs must be distinct and not nested.`);
221
+ }
222
+ }
223
+ const module = new maven_module_1.MavenModule(this, this.pom, { ...options, dir });
224
+ this.mavenModules.push(module);
225
+ this.pom.packaging = 'pom';
226
+ this.pom.managePluginVersions = true;
227
+ this.pom.addModule(dir);
228
+ this.pom.addManagedDependency(`${this.groupId}/${options.artifactId}@\${project.version}`);
229
+ return module;
230
+ }
231
+ /**
232
+ * Imports a BOM into the root `<dependencyManagement>` (`type=pom`,
233
+ * `scope=import`).
234
+ *
235
+ * @param spec `groupId/artifactId@version`
236
+ */
237
+ addBom(spec) {
238
+ this.pom.addBom(spec);
239
+ }
240
+ /**
241
+ * Pins a version in the root `<dependencyManagement>` without adding the
242
+ * dependency, so modules (or the root) can use it versionless.
243
+ *
244
+ * @param spec `groupId/artifactId@version`
245
+ */
246
+ addManagedDependency(spec) {
247
+ this.pom.addManagedDependency(spec);
248
+ }
249
+ /**
250
+ * Adds a compile-scope dependency to the root pom. In a multi-module
251
+ * project every module inherits it; use `MavenModule.addDependency` for
252
+ * one module.
253
+ *
254
+ * @param spec `groupId/artifactId[@version]` - exact version, or none when
255
+ * a BOM manages it
256
+ */
257
+ addDependency(spec) {
258
+ this.pom.addDependency(spec);
259
+ }
260
+ /** Adds a test-scope dependency to the root pom (inherited by every module). */
261
+ addTestDependency(spec) {
262
+ this.pom.addTestDependency(spec);
263
+ }
264
+ /** Adds a build plugin to the root pom (inherited by every module). */
265
+ addPlugin(spec, options = {}) {
266
+ this.pom.addPlugin(spec, options);
267
+ }
268
+ preSynthesize() {
269
+ super.preSynthesize();
270
+ if (this.sample && this.mavenModules.length === 0) {
271
+ this.addSample();
272
+ }
273
+ }
274
+ /**
275
+ * The exact version this project uses for a `groupId/artifactId` it pins
276
+ * by default: the `pluginVersions` override if set, otherwise the
277
+ * default for `javaVersion`.
278
+ */
279
+ pinnedVersion(coordinates) {
280
+ const version = this.javaLine.versions[coordinates];
281
+ if (!version) {
282
+ throw new Error(`No default version for ${coordinates}.`);
283
+ }
284
+ return version;
285
+ }
286
+ /**
287
+ * The newest Spring Boot major version `javaVersion` supports, or
288
+ * undefined when this package knows of no cap.
289
+ */
290
+ maxSpringBootMajor() {
291
+ return this.javaLine.maxSpringBootMajor;
292
+ }
293
+ configureBuild(options) {
294
+ this.pom.addProperty('project.build.sourceEncoding', 'UTF-8');
295
+ for (const [name, value] of Object.entries(this.javaLine.compilerProperties)) {
296
+ this.pom.addProperty(name, value);
297
+ }
298
+ // JUnit's version comes from its BOM (or from a framework BOM that
299
+ // manages it - see JavaSpringBootProject), never from a dependency.
300
+ this.pom.addBom(`${java_versions_1.JUNIT_BOM}@${this.pinnedVersion(java_versions_1.JUNIT_BOM)}`);
301
+ this.pom.addTestDependency('org.junit.jupiter/junit-jupiter');
302
+ this.addPlugin(`${java_versions_1.MAVEN_COMPILER_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_COMPILER_PLUGIN)}`);
303
+ this.addPlugin(`${java_versions_1.MAVEN_SUREFIRE_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_SUREFIRE_PLUGIN)}`);
304
+ // failsafe has no default lifecycle binding; bind it so `*IT` tests run
305
+ // in `mvn verify`.
306
+ this.addPlugin(`${java_versions_1.MAVEN_FAILSAFE_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_FAILSAFE_PLUGIN)}`, {
307
+ executions: [{ id: 'integration-tests', goals: ['integration-test', 'verify'] }],
308
+ });
309
+ this.addPlugin(`${java_versions_1.MAVEN_JAR_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_JAR_PLUGIN)}`, {
310
+ configuration: {
311
+ archive: {
312
+ manifest: {
313
+ addDefaultImplementationEntries: true,
314
+ addDefaultSpecificationEntries: true,
315
+ },
316
+ },
317
+ },
318
+ });
319
+ if (options.enforcer ?? true) {
320
+ const minMaven = options.minMavenVersion ?? java_versions_1.DEFAULT_MIN_MAVEN_VERSION;
321
+ (0, maven_pom_1.assertExactVersion)(minMaven, 'minMavenVersion');
322
+ this.addPlugin(`${java_versions_1.MAVEN_ENFORCER_PLUGIN}@${this.pinnedVersion(java_versions_1.MAVEN_ENFORCER_PLUGIN)}`, {
323
+ executions: [{ id: 'enforce-versions', goals: ['enforce'] }],
324
+ configuration: {
325
+ rules: {
326
+ requireMavenVersion: { version: `[${minMaven},)` },
327
+ requireJavaVersion: { version: this.javaLine.enforcerJavaRange },
328
+ },
329
+ },
330
+ });
331
+ }
332
+ }
333
+ addSample() {
334
+ const pkg = this.groupId.replace(/[^A-Za-z0-9_.]/g, '_');
335
+ const path = pkg.split('.');
336
+ new projen_1.SampleDir(this, path_1.posix.join('src/main/java', ...path), {
337
+ files: {
338
+ 'Main.java': [
339
+ `package ${pkg};`,
340
+ '',
341
+ 'public class Main {',
342
+ ' public static void main(String[] args) {',
343
+ ' System.out.println("Hello, world!");',
344
+ ' }',
345
+ '}',
346
+ '',
347
+ ].join('\n'),
348
+ },
349
+ });
350
+ new projen_1.SampleDir(this, path_1.posix.join('src/test/java', ...path), {
351
+ files: {
352
+ 'MainTest.java': [
353
+ `package ${pkg};`,
354
+ '',
355
+ 'import org.junit.jupiter.api.Test;',
356
+ '',
357
+ 'class MainTest {',
358
+ ' @Test',
359
+ ' void runs() {',
360
+ ' Main.main(new String[0]);',
361
+ ' }',
362
+ '}',
363
+ '',
364
+ ].join('\n'),
365
+ },
86
366
  });
87
- new upgrade_workflow_1.UpgradeWorkflow(this, { task: this.upgradeTask });
88
367
  }
89
368
  }
90
369
  exports.JavaMavenProject = JavaMavenProject;
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1tYXZlbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmEvamF2YS1tYXZlbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBNEM7QUFFNUMsbURBQStEO0FBQy9ELGlFQUEwRTtBQUMxRSx1RkFBaUY7QUFDakYsdURBQWlFO0FBQ2pFLGlFQUE2RDtBQUM3RCwrRkFBeUY7QUFDekYsaUVBQWlFO0FBSWpFOzs7OztHQUtHO0FBQ0gsTUFBYSxnQkFBaUIsU0FBUSxhQUFJLENBQUMsV0FBVzs7SUFDcEMsV0FBVyxDQUFPO0lBQ2xCLG1CQUFtQixDQUFzQjtJQUV6RCxZQUFZLE9BQWdDO1FBQzFDLEtBQUssQ0FBQztZQUNKLG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsc0VBQXNFO1lBQ3RFLHdEQUF3RDtZQUN4RCxxRUFBcUU7WUFDckUsNkRBQTZEO1lBQzdELEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU87WUFDbkMseUVBQXlFO1lBQ3pFLHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUU7WUFDekMsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsaUVBQWlFO1lBQ2pFLG1FQUFtRTtZQUNuRSxvREFBb0Q7WUFDcEQsWUFBWSxFQUFFLEtBQUs7WUFDbkIsaUJBQWlCLEVBQUUsZUFBTSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDO2dCQUNsRSxNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxvQ0FBd0I7YUFDM0QsQ0FBQztTQUNILENBQUMsQ0FBQztRQUVILG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUseUNBQXlDO1FBQ3pDLElBQUEsc0NBQXdCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0Isb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUEsK0NBQTRCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxzREFBd0IsQ0FBQyxJQUFJLEVBQUU7WUFDakMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksb0NBQXdCO1NBQ25FLENBQUMsQ0FBQztRQUNILElBQUksOERBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsTUFBTSxjQUFjLEdBQStCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNsQixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixHQUFHLEVBQUUseUNBQXlDLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ3ZFLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTthQUNuRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksZUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDckQsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztZQUNwQixRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRTtZQUNuRCxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlELGNBQWM7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFBLHNDQUFtQixFQUNqQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUM3QixxRkFBcUYsQ0FDdEYsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDekMsSUFBSSxFQUFFLGdFQUFnRTtTQUN2RSxDQUFDLENBQUM7UUFDSCxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBaEZILDRDQWlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhc2ssIGdpdGh1YiwgamF2YSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBDb21tb25KYXZhT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vcHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93JztcbmltcG9ydCB7IGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW5yYy10cyc7XG5pbXBvcnQgeyBVcGdyYWRlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vdXBncmFkZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuaW1wb3J0IHsgbm90ZVdvcmtmbG93UHVycG9zZSB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1wdXJwb3NlJztcblxuZXhwb3J0IGludGVyZmFjZSBKYXZhTWF2ZW5Qcm9qZWN0T3B0aW9ucyBleHRlbmRzIENvbW1vbkphdmFPcHRpb25zIHt9XG5cbi8qKlxuICogU2hhcmVkIE1hdmVuIGJ1aWxkIHNrZWxldG9uIGZvciBhbGwgdGhyZWUgSmF2YSBwcm9qZWN0IHR5cGVzOiBzdGFuZGFyZFxuICogYHBvbS54bWxgL2RpcmVjdG9yeSBsYXlvdXQgKHZpYSBgamF2YS5KYXZhUHJvamVjdGApLCBhIFBSLXRyaWdnZXJlZFxuICogYnVpbGQrdGVzdCgrU29uYXJRdWJlKSB3b3JrZmxvdyB0aGF0IGhhcmQtZmFpbHMgb24gcHJvamVuIGRyaWZ0LCBhbmQgYVxuICogbmlnaHRseSBkZXBlbmRlbmN5LXVwZ3JhZGUgd29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhTWF2ZW5Qcm9qZWN0IGV4dGVuZHMgamF2YS5KYXZhUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSB1cGdyYWRlVGFzazogVGFzaztcbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkVmVyaWZ5V29ya2Zsb3c6IGdpdGh1Yi5UYXNrV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSmF2YU1hdmVuUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAvLyBTcHJlYWQgZmlyc3QsIG92ZXJyaWRlcyBhZnRlcjogZm9yd2FyZGluZyB0aGUgY2FsbGVyJ3Mgb3B0aW9ucyBpc1xuICAgICAgLy8gd2hhdCBsZXRzIGBwcm9qZW4gbmV3IC0tZnJvbSBAeHBlcnRzcy9wcm9qZW4tdHlwZXMgamF2YV9saWJyYXJ5YFxuICAgICAgLy8gd29yayAtIHByb2plbiBzbXVnZ2xlcyBpdHMgYm9vdHN0cmFwIG1hcmtlciAoYF9fbmV3X19gKSB0aHJvdWdoIHRoZVxuICAgICAgLy8gb3B0aW9ucyBvYmplY3QsIGFuZCBpdCBpcyB0aGF0IG1hcmtlciB3aGljaCBtYWtlcyB0aGVcbiAgICAgIC8vIGBQcm9qZW5yY0ZpbGVgIGNvbXBvbmVudCB3cml0ZSB0aGUgaW5pdGlhbCBgLnByb2plbnJjLnRzYC4gRHJvcCBpdFxuICAgICAgLy8gYW5kIGBwcm9qZW4gbmV3YCBzY2FmZm9sZHMgYSByZXBvIHdpdGggbm8gcHJvamVucmMgYXQgYWxsLlxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGdyb3VwSWQ6IG9wdGlvbnMuZ3JvdXBJZCxcbiAgICAgIGFydGlmYWN0SWQ6IG9wdGlvbnMuYXJ0aWZhY3RJZCxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAnMC4xLjAnLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IHB1bGxSZXF1ZXN0TGludDogZmFsc2UgfSxcbiAgICAgIC8vIENvbnN1bWVycyBhdXRob3IgdGhlaXIgY29uZmlnIGFzIGEgTm9kZS1zaWRlIGAucHJvamVucmMudHNgICh0aGlzXG4gICAgICAvLyBwYWNrYWdlIG9ubHkgcHVibGlzaGVzIGFuIG5wbSBqc2lpIHRhcmdldCwgbm8gamF2YSB0YXJnZXQpLCBub3QgYVxuICAgICAgLy8gaGFuZC13cml0dGVuIGBzcmMvdGVzdC9qYXZhL3Byb2plbnJjLmphdmFgIC0gc28gamF2YS5KYXZhUHJvamVjdCdzXG4gICAgICAvLyBvd24gSmF2YS1uYXRpdmUgcHJvamVucmMgKHdoaWNoIHdpcmVzIHRoZSBkZWZhdWx0IHRhc2sgdG8gYG12blxuICAgICAgLy8gY29tcGlsZXI6dGVzdENvbXBpbGUgJiYgbXZuIGV4ZWM6amF2YSAuLi5gKSB3b3VsZCBiZSB3cm9uZyBoZXJlLlxuICAgICAgLy8gRGlzYWJsZSBpdCBhbmQgYXR0YWNoIHRoZSBUeXBlU2NyaXB0IG9uZSBpbnN0ZWFkLlxuICAgICAgcHJvamVucmNKYXZhOiBmYWxzZSxcbiAgICAgIHByb2plbkNyZWRlbnRpYWxzOiBnaXRodWIuR2l0aHViQ3JlZGVudGlhbHMuZnJvbVBlcnNvbmFsQWNjZXNzVG9rZW4oe1xuICAgICAgICBzZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIFRoZVxuICAgIC8vIE1hdmVuIHJlcG8gbmVlZHMgbm8gVHlwZVNjcmlwdCB0b29sY2hhaW4gb2YgaXRzIG93biAtIHRoZSBydW5uZXIgaXNcbiAgICAvLyBmZXRjaGVkIChwaW5uZWQpIGJ5IG5weCBhdCBzeW50aCB0aW1lLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG5cbiAgICBjb25zdCBnaCA9IHRoaXMuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSmF2YU1hdmVuUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24nKTtcbiAgICB9XG5cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIG5ldyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3codGhpcywge1xuICAgICAgZ2hlVG9rZW5TZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgIH0pO1xuICAgIG5ldyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93KHRoaXMpO1xuXG4gICAgY29uc3QgcG9zdEJ1aWxkU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdID0gW107XG4gICAgaWYgKG9wdGlvbnMuc29uYXJQcm9qZWN0S2V5KSB7XG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ1NvbmFyUXViZSBzY2FuJyxcbiAgICAgICAgcnVuOiBgbXZuIC1CIHNvbmFyOnNvbmFyIC1Ec29uYXIucHJvamVjdEtleT0ke29wdGlvbnMuc29uYXJQcm9qZWN0S2V5fWAsXG4gICAgICAgIGVudjogeyBTT05BUl9UT0tFTjogJyR7eyBzZWNyZXRzLlNPTkFSX1RPS0VOIH19JyB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93ID0gbmV3IGdpdGh1Yi5UYXNrV29ya2Zsb3coZ2gsIHtcbiAgICAgIG5hbWU6ICdidWlsZCcsXG4gICAgICBqb2JJZDogJ2J1aWxkJyxcbiAgICAgIHRhc2s6IHRoaXMuYnVpbGRUYXNrLFxuICAgICAgdHJpZ2dlcnM6IHsgcHVsbFJlcXVlc3Q6IHt9LCB3b3JrZmxvd0Rpc3BhdGNoOiB7fSB9LFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBwb3N0QnVpbGRTdGVwcyxcbiAgICB9KTtcbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93LmZpbGUsXG4gICAgICAnQnVpbGQgYW5kIHRlc3QgdGhlIE1hdmVuIHByb2plY3Qgb24gcHVsbCByZXF1ZXN0cywgd2l0aCBhbiBvcHRpb25hbCBTb25hclF1YmUgc2Nhbi4nLFxuICAgICk7XG5cbiAgICB0aGlzLnVwZ3JhZGVUYXNrID0gdGhpcy5hZGRUYXNrKCd1cGdyYWRlJywge1xuICAgICAgZXhlYzogJ212biAtQiB2ZXJzaW9uczp1c2UtbGF0ZXN0LXJlbGVhc2VzIHZlcnNpb25zOnVwZGF0ZS1wcm9wZXJ0aWVzJyxcbiAgICB9KTtcbiAgICBuZXcgVXBncmFkZVdvcmtmbG93KHRoaXMsIHsgdGFzazogdGhpcy51cGdyYWRlVGFzayB9KTtcbiAgfVxufVxuIl19
370
+ /**
371
+ * `projen new ... --java-version 21` (or `1.8`, or `--min-maven-version 3.9`)
372
+ * reaches the options as a *number*: yargs parses numeric-looking flags, and
373
+ * projen passes string-typed options through unchanged. The initial
374
+ * `.projenrc.ts` is rendered from the same args, so it would read
375
+ * `javaVersion: 21` and fail to type-check. No Java option is number-typed,
376
+ * so every numeric arg is turned back into the string the user typed. This
377
+ * runs before the Project constructor, which is where projen captures the
378
+ * args it renders. Options from a hand-written projenrc are never numbers
379
+ * (they type-check as strings) and are left alone.
380
+ */
381
+ function stringifyProjenNewArgs(options) {
382
+ const marker = options.__new__;
383
+ if (!marker?.args) {
384
+ return options;
385
+ }
386
+ for (const target of [options, marker.args]) {
387
+ for (const [name, value] of Object.entries(target)) {
388
+ if (typeof value === 'number') {
389
+ target[name] = String(value);
390
+ }
391
+ }
392
+ }
393
+ return options;
394
+ }
395
+ function normalizeModuleDir(dir) {
396
+ const unix = dir.replace(/\\/g, '/');
397
+ if (unix.startsWith('/') || /^[A-Za-z]:/.test(unix)) {
398
+ throw new Error(`Module dir "${dir}" must be relative to the repo root.`);
399
+ }
400
+ const normalized = path_1.posix.normalize(unix).replace(/\/+$/, '');
401
+ if (normalized === '.' || normalized === '' || normalized.split('/').includes('..')) {
402
+ throw new Error(`Module dir "${dir}" must be a subdirectory of the repo root.`);
403
+ }
404
+ return normalized;
405
+ }
406
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1tYXZlbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmEvamF2YS1tYXZlbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwrQkFBNkI7QUFDN0IsbUNBQTBFO0FBQzFFLDRFQUF1RTtBQUN2RSxtREFXeUI7QUFDekIsdURBQW1EO0FBQ25ELGlEQUFpRTtBQUVqRSxpREFBa0U7QUFDbEUsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUNqRSwrRkFBeUY7QUFDekYsaUVBQWlFO0FBRWpFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUseURBQXlEO0FBQ3pELDBCQUEwQjtBQUMxQixpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLGVBQU0sQ0FBQyxhQUFhOztJQUN4RCwwQkFBMEI7SUFDVixHQUFHLENBQVc7SUFFOUIsMkVBQTJFO0lBQzNELFdBQVcsQ0FBUztJQUVwQyx5RUFBeUU7SUFDekQsV0FBVyxDQUFPO0lBRWxDOzs7O09BSUc7SUFDYSxtQkFBbUIsQ0FBc0I7SUFFekQ7OztPQUdHO0lBQ2EsWUFBWSxDQUE2QjtJQUV4QyxRQUFRLENBQWtCO0lBQzFCLGFBQWEsQ0FBVTtJQUN2QixPQUFPLENBQVM7SUFDaEIsTUFBTSxDQUFVO0lBQ2hCLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBRWxELFlBQVksT0FBZ0M7UUFDMUMsS0FBSyxDQUFDO1lBQ0osb0VBQW9FO1lBQ3BFLHNFQUFzRTtZQUN0RSxpRUFBaUU7WUFDakUsd0RBQXdEO1lB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QUM3RCxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BGLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxHQUFHLDRDQUE0QyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3NpeCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSnNvbkZpbGUsIExpY2Vuc2UsIFNhbXBsZURpciwgVGFzaywgZ2l0aHViLCBqYXZhIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IE1hdmVuVXBncmFkZVJlcG9ydCB9IGZyb20gJy4vY29tcG9uZW50cy9tYXZlbi11cGdyYWRlLXJlcG9ydCc7XG5pbXBvcnQge1xuICBERUZBVUxUX01JTl9NQVZFTl9WRVJTSU9OLFxuICBKVU5JVF9CT00sXG4gIEphdmFMaW5lUHJvZmlsZSxcbiAgTUFWRU5fQ09NUElMRVJfUExVR0lOLFxuICBNQVZFTl9FTkZPUkNFUl9QTFVHSU4sXG4gIE1BVkVOX0ZBSUxTQUZFX1BMVUdJTixcbiAgTUFWRU5fSkFSX1BMVUdJTixcbiAgTUFWRU5fU1VSRUZJUkVfUExVR0lOLFxuICBWRVJTSU9OU19NQVZFTl9QTFVHSU4sXG4gIHJlc29sdmVKYXZhTGluZSxcbn0gZnJvbSAnLi9qYXZhLXZlcnNpb25zJztcbmltcG9ydCB7IE1hdmVuTW9kdWxlIH0gZnJvbSAnLi9tYXZlbi9tYXZlbi1tb2R1bGUnO1xuaW1wb3J0IHsgTWF2ZW5Qb20sIGFzc2VydEV4YWN0VmVyc2lvbiB9IGZyb20gJy4vbWF2ZW4vbWF2ZW4tcG9tJztcbmltcG9ydCB7IEphdmFNYXZlblByb2plY3RPcHRpb25zLCBNYXZlbk1vZHVsZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgTlBNX0NJX1NURVAsIFNFVFVQX05PREVfU1RFUCB9IGZyb20gJy4uL2NvbW1vbi9jaS1zdGVwcyc7XG5pbXBvcnQgeyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZEVkaXRvckNvbmZpZyB9IGZyb20gJy4uL2NvbW1vbi9lZGl0b3Jjb25maWcnO1xuaW1wb3J0IHsgYXBwbHlJbnRlcm5hbEFjdGlvbk92ZXJyaWRlcyB9IGZyb20gJy4uL2NvbW1vbi9pbnRlcm5hbC1hY3Rpb25zJztcbmltcG9ydCB7IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi9wcm9qZW4tZHJpZnQtY2hlY2std29ya2Zsb3cnO1xuaW1wb3J0IHsgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjIH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbnJjLXRzJztcbmltcG9ydCB7IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctY2hhbmdlLW5vdGljZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBub3RlV29ya2Zsb3dQdXJwb3NlIH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LXB1cnBvc2UnO1xuXG4vLyBgcmVxdWlyZSguLi4pYCByZXNvbHZlcyB0aHJvdWdoIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGFcbi8vICpwdWJsaXNoZWQqIHBhY2thZ2UgdGhlc2UgYXJlIHRoZSB2ZXJzaW9ucyBpbnN0YWxsZWQgaW4gdGhlIGNvbnN1bWluZ1xuLy8gcmVwbyAtIGV4YWN0bHkgd2hhdCBpdHMgcGFja2FnZS5qc29uIG11c3QgcGluIChzYW1lIGFzXG4vLyBgR2l0SHViQWN0aW9uUHJvamVjdGApLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLyoqXG4gKiBCYXNlbGluZSBNYXZlbiBwcm9qZWN0LCBzaW5nbGUtIG9yIG11bHRpLW1vZHVsZSwgd2l0aCBubyBmcmFtZXdvcmtcbiAqIGFzc3VtcHRpb25zLiBJdCBpcyB0aGUgYmFzZSBvZiBldmVyeSBKYXZhIHR5cGUgaW4gdGhpcyBwYWNrYWdlIGFuZCBpc1xuICogdXNhYmxlIG9uIGl0cyBvd24gKGBwcm9qZW4gbmV3IC4uLiBqYXZhX21hdmVuYCkuXG4gKlxuICogLSBUaGUgcG9tIGlzIHdyaXR0ZW4gYnkgdGhpcyBwYWNrYWdlIChgTWF2ZW5Qb21gKSwgbm90IHByb2plbidzXG4gKiAgIGBqYXZhLlBvbWA6IGV4YWN0IHZlcnNpb25zIG9ubHksIEJPTSBpbXBvcnRzLCBgPG1vZHVsZXM+YCxcbiAqICAgYDxkZXBlbmRlbmN5TWFuYWdlbWVudD5gLCBgPHBsdWdpbk1hbmFnZW1lbnQ+YC5cbiAqIC0gRXZlcnl0aGluZyBKYXZhLXZlcnNpb24tZGVwZW5kZW50IChjb21waWxlciBsZXZlbCwgZW5mb3JjZXIgcnVsZSwgSlVuaXRcbiAqICAgbGluZSwgQ0kgSkRLKSBmb2xsb3dzIGBqYXZhVmVyc2lvbmAuXG4gKiAtIFdpdGggbm8gYGFkZE1vZHVsZSgpYCBjYWxscyB0aGUgcm9vdCBwb20gaXMgdGhlIGFydGlmYWN0LiBBZnRlciB0aGVcbiAqICAgZmlyc3QgYGFkZE1vZHVsZSgpYCBpdCBpcyBhIGBwb21gLXBhY2thZ2VkIHJlYWN0b3IgcGFyZW50IGFuZCB0aGVcbiAqICAgbW9kdWxlcyBpbmhlcml0IGl0cyBwbHVnaW5zIGFuZCB0ZXN0IGRlcGVuZGVuY2llcy5cbiAqIC0gYG5weCBwcm9qZW4gYnVpbGRgIHN5bnRoZXNpemVzLCB0aGVuIHJ1bnMgTWF2ZW4gb25jZTogYG12biAtQiB2ZXJpZnlgXG4gKiAgICh1bml0IHRlc3RzIHZpYSBzdXJlZmlyZSwgYCpJVGAgdGVzdHMgdmlhIGZhaWxzYWZlKS5cbiAqIC0gQ0k6IGEgUFIgYnVpbGQgKHdpdGggYW4gb3B0aW9uYWwgU29uYXJRdWJlIHNjYW4pLCB0aGUgcHJvamVuIGRyaWZ0XG4gKiAgIGNoZWNrLCBhbmQgYSBuaWdodGx5IHJlcG9ydC1vbmx5IHVwZGF0ZSBjaGVjay5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFNYXZlblByb2plY3QgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdCB7XG4gIC8qKiBUaGUgcm9vdCBgcG9tLnhtbGAuICovXG4gIHB1YmxpYyByZWFkb25seSBwb206IE1hdmVuUG9tO1xuXG4gIC8qKiBUaGUgY2Fub25pY2FsIEphdmEgbGluZSB0aGUgYnVpbGQgdGFyZ2V0cyAoYDEuOGAsIGAxN2AsIGAyMWAsIGAyNWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgamF2YVZlcnNpb246IHN0cmluZztcblxuICAvKiogUHJpbnRzIGF2YWlsYWJsZSBkZXBlbmRlbmN5L3BsdWdpbiB1cGRhdGVzIChgbnB4IHByb2plbiB1cGdyYWRlYCkuICovXG4gIHB1YmxpYyByZWFkb25seSB1cGdyYWRlVGFzazogVGFzaztcblxuICAvKipcbiAgICogVGhlIFBSIGJ1aWxkIHdvcmtmbG93IChgYnVpbGQueW1sYCkuIEFkZCBqb2JzIHRvIGl0IHdpdGhcbiAgICogYGJ1aWxkVmVyaWZ5V29ya2Zsb3cuYWRkSm9iKGlkLCBqb2IpYDsgdXNlIGBjaVNldHVwU3RlcHNgIGZvciBhIGpvYiB0aGF0XG4gICAqIG5lZWRzIE5vZGUsIHRoZSBwcm9qZW4gdG9vbGNoYWluLCBhbmQgdGhlIEpESy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWlsZFZlcmlmeVdvcmtmbG93OiBnaXRodWIuVGFza1dvcmtmbG93O1xuXG4gIC8qKlxuICAgKiBTdGVwcyB0aGF0IGluc3RhbGwgTm9kZSAocGlubmVkKSwgYG5wbSBjaWAsIGFuZCB0aGUgcHJvamVjdCdzIEpESyB3aXRoIGFcbiAgICogTWF2ZW4gY2FjaGUgLSB0aGUgc2V0dXAgZXZlcnkgTWF2ZW4gQ0kgam9iIGluIHRoaXMgcmVwbyBuZWVkcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaVNldHVwU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgamF2YUxpbmU6IEphdmFMaW5lUHJvZmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSByb290UGFja2FnaW5nPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzYW1wbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF2ZW5Nb2R1bGVzOiBNYXZlbk1vZHVsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSmF2YU1hdmVuUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAvLyBTcHJlYWQgZmlyc3QsIG92ZXJyaWRlcyBhZnRlcjogZm9yd2FyZGluZyB0aGUgY2FsbGVyJ3Mgb3B0aW9ucyBpc1xuICAgICAgLy8gd2hhdCBsZXRzIGBwcm9qZW4gbmV3IC0tZnJvbSBAeHBlcnRzcy9wcm9qZW4tdHlwZXMgamF2YV9tYXZlbmAgd29ya1xuICAgICAgLy8gLSBwcm9qZW4gc211Z2dsZXMgaXRzIGJvb3RzdHJhcCBtYXJrZXIgKGBfX25ld19fYCkgdGhyb3VnaCB0aGVcbiAgICAgIC8vIG9wdGlvbnMgb2JqZWN0LCBhbmQgaXQgaXMgdGhhdCBtYXJrZXIgd2hpY2ggbWFrZXMgdGhlXG4gICAgICAvLyBgUHJvamVucmNGaWxlYCBjb21wb25lbnQgd3JpdGUgdGhlIGluaXRpYWwgYC5wcm9qZW5yYy50c2AuIERyb3AgaXRcbiAgICAgIC8vIGFuZCBgcHJvamVuIG5ld2Agc2NhZmZvbGRzIGEgcmVwbyB3aXRoIG5vIHByb2plbnJjIGF0IGFsbC5cbiAgICAgIC4uLnN0cmluZ2lmeVByb2plbk5ld0FyZ3Mob3B0aW9ucyksXG4gICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAvLyBQUiB0aXRsZXMgYXJlIG5vdCBnYXRlZDogYGZlYXQ6YC9gZml4OmAgbWF0dGVyIG9ubHkgYmVjYXVzZSB0aGV5IGRyaXZlXG4gICAgICAvLyB0aGUgcmVsZWFzZSB3b3JrZmxvdyAodmlhIGByZWxlYXNhYmxlQ29tbWl0c2ApLCBub3QgUFIgY2hlY2tzLiBUaGVcbiAgICAgIC8vIGNvbnZlbnRpb25hbC1jb21taXQgUFItdGl0bGUgbGludCBpcyBhZGRlZCBieSB0aGUgYEdpdEh1YmAgY29tcG9uZW50XG4gICAgICAvLyB1bmxlc3MgYGdpdGh1Yk9wdGlvbnMucHVsbFJlcXVlc3RMaW50YCBpcyBgZmFsc2VgIChpdCBkZWZhdWx0cyB0cnVlKS5cbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHsgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcHJvamVuQ3JlZGVudGlhbHM6IGdpdGh1Yi5HaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7XG4gICAgICAgIHNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgdmVyc2lvbiBvZiBPYmplY3QudmFsdWVzKG9wdGlvbnMucGx1Z2luVmVyc2lvbnMgPz8ge30pKSB7XG4gICAgICBhc3NlcnRFeGFjdFZlcnNpb24odmVyc2lvbiwgJ3BsdWdpblZlcnNpb25zJyk7XG4gICAgfVxuICAgIHRoaXMuamF2YUxpbmUgPSByZXNvbHZlSmF2YUxpbmUob3B0aW9ucy5qYXZhVmVyc2lvbiwgb3B0aW9ucy5wbHVnaW5WZXJzaW9ucyk7XG4gICAgdGhpcy5qYXZhVmVyc2lvbiA9IHRoaXMuamF2YUxpbmUubGluZTtcbiAgICB0aGlzLnJvb3RQYWNrYWdpbmcgPSBvcHRpb25zLnBhY2thZ2luZztcbiAgICB0aGlzLmdyb3VwSWQgPSBvcHRpb25zLmdyb3VwSWQ7XG4gICAgdGhpcy5zYW1wbGUgPSBvcHRpb25zLnNhbXBsZSA/PyBmYWxzZTtcblxuICAgIC8vIGAucHJvamVucmMudHNgICsgYG5weCBwcm9qZW5gLCBzYW1lIGFzIGV2ZXJ5IG90aGVyIHR5cGUgaGVyZS4gVGhlXG4gICAgLy8gTWF2ZW4gcmVwbyBuZWVkcyBubyBUeXBlU2NyaXB0IHRvb2xjaGFpbiBvZiBpdHMgb3duIC0gdGhlIHJ1bm5lciBpc1xuICAgIC8vIGZldGNoZWQgKHBpbm5lZCkgYnkgbnB4IGF0IHN5bnRoIHRpbWUuXG4gICAgYXR0YWNoVHlwZVNjcmlwdFByb2plbnJjKHRoaXMpO1xuXG4gICAgLy8gVGhlIHByb2plbiB0b29sY2hhaW4gYG5weCBwcm9qZW5gIHJ1bnMsIHBpbm5lZCBleGFjdGx5IHNvIGV2ZXJ5XG4gICAgLy8gbWFjaGluZSBhbmQgQ0kgcmVzb2x2ZSB0aGUgc2FtZSBnZW5lcmF0b3IuIE93bmVyLXdyaXRhYmxlIG9uIGRpc2sgc29cbiAgICAvLyB0aGUgZG9jdW1lbnRlZCB1cGRhdGUgZmxvdyAoYG5wbSBpIC1EIC1FIEB4cGVydHNzL3Byb2plbi10eXBlc0A8dj5gKVxuICAgIC8vIGNhbiByZXdyaXRlIGl0OyBoYW5kLWVkaXRzIGFyZSBzdGlsbCBjYXVnaHQgYnkgdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgJ3Byb2plbic6IFBST0pFTl9WRVJTSU9OLFxuICAgICAgICAgICdAeHBlcnRzcy9wcm9qZW4tdHlwZXMnOiBQUk9KRU5fVFlQRVNfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBKZXRCcmFpbnMgSURFIHN0YXRlICguaWRlYS8pIGlzIG5ldmVyIHRyYWNrZWQgaW4gZ2VuZXJhdGVkIHJlcG9zLCBhbmRcbiAgICAvLyBuZWl0aGVyIGlzIC9zcGVjLyAobG9jYWwgcGxhbnMgYW5kIHNwZWNzOyB0aGUgcGF0dGVybiBjb3ZlcnMgZXZlcnlcbiAgICAvLyBzdWJkaXJlY3RvcnkpLlxuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvLmlkZWEvKicpO1xuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcvc3BlYy8nKTtcbiAgICB0aGlzLmFkZEdpdElnbm9yZSgndGFyZ2V0LycpO1xuICAgIHRoaXMuYWRkR2l0SWdub3JlKCcuY2xhc3NwYXRoJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy5wcm9qZWN0Jyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy5zZXR0aW5ncycpO1xuXG4gICAgaWYgKG9wdGlvbnMubGljZW5zZWQgPz8gdHJ1ZSkge1xuICAgICAgbmV3IExpY2Vuc2UodGhpcywge1xuICAgICAgICBzcGR4OiBvcHRpb25zLmxpY2Vuc2UgPz8gJ01JVCcsXG4gICAgICAgIGNvcHlyaWdodE93bmVyOiBvcHRpb25zLmNvcHlyaWdodE93bmVyID8/ICd4cGVydHNzJyxcbiAgICAgICAgY29weXJpZ2h0UGVyaW9kOiBvcHRpb25zLmNvcHlyaWdodFBlcmlvZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lZGl0b3Jjb25maWcgPz8gdHJ1ZSkge1xuICAgICAgYWRkRWRpdG9yQ29uZmlnKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMucG9tID0gbmV3IE1hdmVuUG9tKHRoaXMsIHtcbiAgICAgIGdyb3VwSWQ6IG9wdGlvbnMuZ3JvdXBJZCxcbiAgICAgIGFydGlmYWN0SWQ6IG9wdGlvbnMuYXJ0aWZhY3RJZCxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAnMC4xLjAnLFxuICAgICAgcGFja2FnaW5nOiB0aGlzLnJvb3RQYWNrYWdpbmcgPz8gJ2phcicsXG4gICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgfSk7XG4gICAgdGhpcy5jb25maWd1cmVCdWlsZChvcHRpb25zKTtcblxuICAgIC8vIE9uZSBNYXZlbiBydW4gcGVyIGJ1aWxkOiBgdmVyaWZ5YCBydW5zIGV2ZXJ5IGVhcmxpZXIgcGhhc2UgKGNvbXBpbGUsXG4gICAgLy8gdW5pdCB0ZXN0cywgcGFja2FnZSkgcGx1cyBpbnRlZ3JhdGlvbiB0ZXN0cy4gTm90aGluZyBkZXBsb3lzLlxuICAgIHRoaXMudGVzdFRhc2suZXhlYygnbXZuIC1CIHZlcmlmeScpO1xuXG4gICAgY29uc3QgZ2ggPSB0aGlzLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0phdmFNYXZlblByb2plY3QgcmVxdWlyZXMgR2l0SHViIGludGVncmF0aW9uJyk7XG4gICAgfVxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgbmV3IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBnaGVUb2tlblNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgfSk7XG4gICAgbmV3IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmNpU2V0dXBTdGVwcyA9IFtcbiAgICAgIFNFVFVQX05PREVfU1RFUCxcbiAgICAgIE5QTV9DSV9TVEVQLFxuICAgICAge1xuICAgICAgICBuYW1lOiAnU2V0dXAgSmF2YScsXG4gICAgICAgIHVzZXM6ICdhY3Rpb25zL3NldHVwLWphdmFAdjYnLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2Rpc3RyaWJ1dGlvbic6IG9wdGlvbnMuamF2YURpc3RyaWJ1dGlvbiA/PyAndGVtdXJpbicsXG4gICAgICAgICAgJ2phdmEtdmVyc2lvbic6IHRoaXMuamF2YUxpbmUuc2V0dXBKYXZhVmVyc2lvbixcbiAgICAgICAgICAnY2FjaGUnOiAnbWF2ZW4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcG9zdEJ1aWxkU3RlcHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iU3RlcFtdID0gW107XG4gICAgaWYgKG9wdGlvbnMuc29uYXJQcm9qZWN0S2V5KSB7XG4gICAgICBwb3N0QnVpbGRTdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ1NvbmFyUXViZSBzY2FuJyxcbiAgICAgICAgcnVuOiBgbXZuIC1CIHNvbmFyOnNvbmFyIC1Ec29uYXIucHJvamVjdEtleT0ke29wdGlvbnMuc29uYXJQcm9qZWN0S2V5fWAsXG4gICAgICAgIGVudjogeyBTT05BUl9UT0tFTjogJyR7eyBzZWNyZXRzLlNPTkFSX1RPS0VOIH19JyB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZFZlcmlmeVdvcmtmbG93ID0gbmV3IGdpdGh1Yi5UYXNrV29ya2Zsb3coZ2gsIHtcbiAgICAgIG5hbWU6ICdidWlsZCcsXG4gICAgICBqb2JJZDogJ2J1aWxkJyxcbiAgICAgIHRhc2s6IHRoaXMuYnVpbGRUYXNrLFxuICAgICAgdHJpZ2dlcnM6IHsgcHVsbFJlcXVlc3Q6IHt9LCB3b3JrZmxvd0Rpc3BhdGNoOiB7fSB9LFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBwcmVCdWlsZFN0ZXBzOiB0aGlzLmNpU2V0dXBTdGVwcyxcbiAgICAgIHBvc3RCdWlsZFN0ZXBzLFxuICAgIH0pO1xuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLmJ1aWxkVmVyaWZ5V29ya2Zsb3cuZmlsZSxcbiAgICAgICdCdWlsZCBhbmQgdGVzdCB0aGUgTWF2ZW4gcHJvamVjdCBvbiBwdWxsIHJlcXVlc3RzLCB3aXRoIGFuIG9wdGlvbmFsIFNvbmFyUXViZSBzY2FuLicsXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcnNpb25zUGx1Z2luID0gYG9yZy5jb2RlaGF1cy5tb2pvOnZlcnNpb25zLW1hdmVuLXBsdWdpbjoke3RoaXMucGlubmVkVmVyc2lvbihWRVJTSU9OU19NQVZFTl9QTFVHSU4pfWA7XG4gICAgdGhpcy51cGdyYWRlVGFzayA9IHRoaXMuYWRkVGFzaygndXBncmFkZScsIHtcbiAgICAgIGV4ZWM6IGBtdm4gLUIgJHt2ZXJzaW9uc1BsdWdpbn06ZGlzcGxheS1kZXBlbmRlbmN5LXVwZGF0ZXMgJHt2ZXJzaW9uc1BsdWdpbn06ZGlzcGxheS1wbHVnaW4tdXBkYXRlc2AsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMudXBncmFkZVdvcmtmbG93ID8/IHRydWUpIHtcbiAgICAgIG5ldyBNYXZlblVwZ3JhZGVSZXBvcnQodGhpcywge1xuICAgICAgICB0YXNrOiB0aGlzLnVwZ3JhZGVUYXNrLFxuICAgICAgICBzZXR1cFN0ZXBzOiB0aGlzLmNpU2V0dXBTdGVwcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgbW9kdWxlcyBhZGRlZCB3aXRoIGBhZGRNb2R1bGUoKWAsIGluIG9yZGVyLiAqL1xuICBwdWJsaWMgZ2V0IG1vZHVsZXMoKTogTWF2ZW5Nb2R1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm1hdmVuTW9kdWxlc107XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIE1hdmVuIG1vZHVsZSBpbiBgZGlyYCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdDsgbWF5IGJlIG5lc3RlZCxcbiAgICogZS5nLiBgdG9vbHMvc3R1Yi1tb2RlbGApIGFuZCB0dXJucyB0aGUgcm9vdCBwb20gaW50byB0aGUgcmVhY3RvciBwYXJlbnRcbiAgICogKGBwYWNrYWdpbmc9cG9tYCwgYDxtb2R1bGVzPmAgaW4gdGhlIG9yZGVyIGFkZGVkKS4gVGhlIHBhcmVudCBtYW5hZ2VzXG4gICAqIGV2ZXJ5IG1vZHVsZSBhdCBgJHtwcm9qZWN0LnZlcnNpb259YCwgc28gbW9kdWxlcyBkZXBlbmQgb24gZWFjaCBvdGhlclxuICAgKiB3aXRoIGBhZGRNb2R1bGVEZXBlbmRlbmN5KClgLCB2ZXJzaW9ubGVzcy5cbiAgICovXG4gIHB1YmxpYyBhZGRNb2R1bGUob3B0aW9uczogTWF2ZW5Nb2R1bGVPcHRpb25zKTogTWF2ZW5Nb2R1bGUge1xuICAgIGlmICh0aGlzLnJvb3RQYWNrYWdpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJvb3RQYWNrYWdpbmcgIT09ICdwb20nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBIG11bHRpLW1vZHVsZSBwcm9qZWN0J3Mgcm9vdCBwb20gaXMgcGFja2FnZWQgYXMgXCJwb21cIjsgcmVtb3ZlIHBhY2thZ2luZzogXCIke3RoaXMucm9vdFBhY2thZ2luZ31cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGlyID0gbm9ybWFsaXplTW9kdWxlRGlyKG9wdGlvbnMuZGlyKTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5tYXZlbk1vZHVsZXMpIHtcbiAgICAgIGlmIChtLmFydGlmYWN0SWQgPT09IG9wdGlvbnMuYXJ0aWZhY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYER1cGxpY2F0ZSBtb2R1bGUgYXJ0aWZhY3RJZCBcIiR7b3B0aW9ucy5hcnRpZmFjdElkfVwiIChkaXJzIFwiJHttLmRpcn1cIiBhbmQgXCIke2Rpcn1cIikuYCk7XG4gICAgICB9XG4gICAgICBpZiAobS5kaXIgPT09IGRpciB8fCBkaXIuc3RhcnRzV2l0aChgJHttLmRpcn0vYCkgfHwgbS5kaXIuc3RhcnRzV2l0aChgJHtkaXJ9L2ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG92ZXJsYXBzIG1vZHVsZSBkaXIgXCIke20uZGlyfVwiOiBtb2R1bGUgZGlycyBtdXN0IGJlIGRpc3RpbmN0IGFuZCBub3QgbmVzdGVkLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZHVsZSA9IG5ldyBNYXZlbk1vZHVsZSh0aGlzLCB0aGlzLnBvbSwgeyAuLi5vcHRpb25zLCBkaXIgfSk7XG4gICAgdGhpcy5tYXZlbk1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgIHRoaXMucG9tLnBhY2thZ2luZyA9ICdwb20nO1xuICAgIHRoaXMucG9tLm1hbmFnZVBsdWdpblZlcnNpb25zID0gdHJ1ZTtcbiAgICB0aGlzLnBvbS5hZGRNb2R1bGUoZGlyKTtcbiAgICB0aGlzLnBvbS5hZGRNYW5hZ2VkRGVwZW5kZW5jeShgJHt0aGlzLmdyb3VwSWR9LyR7b3B0aW9ucy5hcnRpZmFjdElkfUBcXCR7cHJvamVjdC52ZXJzaW9ufWApO1xuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIEJPTSBpbnRvIHRoZSByb290IGA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+YCAoYHR5cGU9cG9tYCxcbiAgICogYHNjb3BlPWltcG9ydGApLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkQHZlcnNpb25gXG4gICAqL1xuICBwdWJsaWMgYWRkQm9tKHNwZWM6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucG9tLmFkZEJvbShzcGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5zIGEgdmVyc2lvbiBpbiB0aGUgcm9vdCBgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PmAgd2l0aG91dCBhZGRpbmcgdGhlXG4gICAqIGRlcGVuZGVuY3ksIHNvIG1vZHVsZXMgKG9yIHRoZSByb290KSBjYW4gdXNlIGl0IHZlcnNpb25sZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkQHZlcnNpb25gXG4gICAqL1xuICBwdWJsaWMgYWRkTWFuYWdlZERlcGVuZGVuY3koc3BlYzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkTWFuYWdlZERlcGVuZGVuY3koc3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbXBpbGUtc2NvcGUgZGVwZW5kZW5jeSB0byB0aGUgcm9vdCBwb20uIEluIGEgbXVsdGktbW9kdWxlXG4gICAqIHByb2plY3QgZXZlcnkgbW9kdWxlIGluaGVyaXRzIGl0OyB1c2UgYE1hdmVuTW9kdWxlLmFkZERlcGVuZGVuY3lgIGZvclxuICAgKiBvbmUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBgZ3JvdXBJZC9hcnRpZmFjdElkW0B2ZXJzaW9uXWAgLSBleGFjdCB2ZXJzaW9uLCBvciBub25lIHdoZW5cbiAgICogYSBCT00gbWFuYWdlcyBpdFxuICAgKi9cbiAgcHVibGljIGFkZERlcGVuZGVuY3koc3BlYzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkRGVwZW5kZW5jeShzcGVjKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGEgdGVzdC1zY29wZSBkZXBlbmRlbmN5IHRvIHRoZSByb290IHBvbSAoaW5oZXJpdGVkIGJ5IGV2ZXJ5IG1vZHVsZSkuICovXG4gIHB1YmxpYyBhZGRUZXN0RGVwZW5kZW5jeShzcGVjOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnBvbS5hZGRUZXN0RGVwZW5kZW5jeShzcGVjKTtcbiAgfVxuXG4gIC8qKiBBZGRzIGEgYnVpbGQgcGx1Z2luIHRvIHRoZSByb290IHBvbSAoaW5oZXJpdGVkIGJ5IGV2ZXJ5IG1vZHVsZSkuICovXG4gIHB1YmxpYyBhZGRQbHVnaW4oc3BlYzogc3RyaW5nLCBvcHRpb25zOiBqYXZhLlBsdWdpbk9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMucG9tLmFkZFBsdWdpbihzcGVjLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHN1cGVyLnByZVN5bnRoZXNpemUoKTtcbiAgICBpZiAodGhpcy5zYW1wbGUgJiYgdGhpcy5tYXZlbk1vZHVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmFkZFNhbXBsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhhY3QgdmVyc2lvbiB0aGlzIHByb2plY3QgdXNlcyBmb3IgYSBgZ3JvdXBJZC9hcnRpZmFjdElkYCBpdCBwaW5zXG4gICAqIGJ5IGRlZmF1bHQ6IHRoZSBgcGx1Z2luVmVyc2lvbnNgIG92ZXJyaWRlIGlmIHNldCwgb3RoZXJ3aXNlIHRoZVxuICAgKiBkZWZhdWx0IGZvciBgamF2YVZlcnNpb25gLlxuICAgKi9cbiAgcHVibGljIHBpbm5lZFZlcnNpb24oY29vcmRpbmF0ZXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuamF2YUxpbmUudmVyc2lvbnNbY29vcmRpbmF0ZXNdO1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkZWZhdWx0IHZlcnNpb24gZm9yICR7Y29vcmRpbmF0ZXN9LmApO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmV3ZXN0IFNwcmluZyBCb290IG1ham9yIHZlcnNpb24gYGphdmFWZXJzaW9uYCBzdXBwb3J0cywgb3JcbiAgICogdW5kZWZpbmVkIHdoZW4gdGhpcyBwYWNrYWdlIGtub3dzIG9mIG5vIGNhcC5cbiAgICovXG4gIHByb3RlY3RlZCBtYXhTcHJpbmdCb290TWFqb3IoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5qYXZhTGluZS5tYXhTcHJpbmdCb290TWFqb3I7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ3VyZUJ1aWxkKG9wdGlvbnM6IEphdmFNYXZlblByb2plY3RPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5wb20uYWRkUHJvcGVydHkoJ3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2RpbmcnLCAnVVRGLTgnKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5qYXZhTGluZS5jb21waWxlclByb3BlcnRpZXMpKSB7XG4gICAgICB0aGlzLnBvbS5hZGRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gSlVuaXQncyB2ZXJzaW9uIGNvbWVzIGZyb20gaXRzIEJPTSAob3IgZnJvbSBhIGZyYW1ld29yayBCT00gdGhhdFxuICAgIC8vIG1hbmFnZXMgaXQgLSBzZWUgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0KSwgbmV2ZXIgZnJvbSBhIGRlcGVuZGVuY3kuXG4gICAgdGhpcy5wb20uYWRkQm9tKGAke0pVTklUX0JPTX1AJHt0aGlzLnBpbm5lZFZlcnNpb24oSlVOSVRfQk9NKX1gKTtcbiAgICB0aGlzLnBvbS5hZGRUZXN0RGVwZW5kZW5jeSgnb3JnLmp1bml0Lmp1cGl0ZXIvanVuaXQtanVwaXRlcicpO1xuXG4gICAgdGhpcy5hZGRQbHVnaW4oYCR7TUFWRU5fQ09NUElMRVJfUExVR0lOfUAke3RoaXMucGlubmVkVmVyc2lvbihNQVZFTl9DT01QSUxFUl9QTFVHSU4pfWApO1xuICAgIHRoaXMuYWRkUGx1Z2luKGAke01BVkVOX1NVUkVGSVJFX1BMVUdJTn1AJHt0aGlzLnBpbm5lZFZlcnNpb24oTUFWRU5fU1VSRUZJUkVfUExVR0lOKX1gKTtcbiAgICAvLyBmYWlsc2FmZSBoYXMgbm8gZGVmYXVsdCBsaWZlY3ljbGUgYmluZGluZzsgYmluZCBpdCBzbyBgKklUYCB0ZXN0cyBydW5cbiAgICAvLyBpbiBgbXZuIHZlcmlmeWAuXG4gICAgdGhpcy5hZGRQbHVnaW4oYCR7TUFWRU5fRkFJTFNBRkVfUExVR0lOfUAke3RoaXMucGlubmVkVmVyc2lvbihNQVZFTl9GQUlMU0FGRV9QTFVHSU4pfWAsIHtcbiAgICAgIGV4ZWN1dGlvbnM6IFt7IGlkOiAnaW50ZWdyYXRpb24tdGVzdHMnLCBnb2FsczogWydpbnRlZ3JhdGlvbi10ZXN0JywgJ3ZlcmlmeSddIH1dLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUGx1Z2luKGAke01BVkVOX0pBUl9QTFVHSU59QCR7dGhpcy5waW5uZWRWZXJzaW9uKE1BVkVOX0pBUl9QTFVHSU4pfWAsIHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgYXJjaGl2ZToge1xuICAgICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgICBhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgICAgYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZW5mb3JjZXIgPz8gdHJ1ZSkge1xuICAgICAgY29uc3QgbWluTWF2ZW4gPSBvcHRpb25zLm1pbk1hdmVuVmVyc2lvbiA/PyBERUZBVUxUX01JTl9NQVZFTl9WRVJTSU9OO1xuICAgICAgYXNzZXJ0RXhhY3RWZXJzaW9uKG1pbk1hdmVuLCAnbWluTWF2ZW5WZXJzaW9uJyk7XG4gICAgICB0aGlzLmFkZFBsdWdpbihgJHtNQVZFTl9FTkZPUkNFUl9QTFVHSU59QCR7dGhpcy5waW5uZWRWZXJzaW9uKE1BVkVOX0VORk9SQ0VSX1BMVUdJTil9YCwge1xuICAgICAgICBleGVjdXRpb25zOiBbeyBpZDogJ2VuZm9yY2UtdmVyc2lvbnMnLCBnb2FsczogWydlbmZvcmNlJ10gfV0sXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBydWxlczoge1xuICAgICAgICAgICAgcmVxdWlyZU1hdmVuVmVyc2lvbjogeyB2ZXJzaW9uOiBgWyR7bWluTWF2ZW59LClgIH0sXG4gICAgICAgICAgICByZXF1aXJlSmF2YVZlcnNpb246IHsgdmVyc2lvbjogdGhpcy5qYXZhTGluZS5lbmZvcmNlckphdmFSYW5nZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNhbXBsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwa2cgPSB0aGlzLmdyb3VwSWQucmVwbGFjZSgvW15BLVphLXowLTlfLl0vZywgJ18nKTtcbiAgICBjb25zdCBwYXRoID0gcGtnLnNwbGl0KCcuJyk7XG4gICAgbmV3IFNhbXBsZURpcih0aGlzLCBwb3NpeC5qb2luKCdzcmMvbWFpbi9qYXZhJywgLi4ucGF0aCksIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgICdNYWluLmphdmEnOiBbXG4gICAgICAgICAgYHBhY2thZ2UgJHtwa2d9O2AsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ3B1YmxpYyBjbGFzcyBNYWluIHsnLFxuICAgICAgICAgICcgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeycsXG4gICAgICAgICAgJyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiSGVsbG8sIHdvcmxkIVwiKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICcnLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBuZXcgU2FtcGxlRGlyKHRoaXMsIHBvc2l4LmpvaW4oJ3NyYy90ZXN0L2phdmEnLCAuLi5wYXRoKSwge1xuICAgICAgZmlsZXM6IHtcbiAgICAgICAgJ01haW5UZXN0LmphdmEnOiBbXG4gICAgICAgICAgYHBhY2thZ2UgJHtwa2d9O2AsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgJ2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgICdjbGFzcyBNYWluVGVzdCB7JyxcbiAgICAgICAgICAnICAgIEBUZXN0JyxcbiAgICAgICAgICAnICAgIHZvaWQgcnVucygpIHsnLFxuICAgICAgICAgICcgICAgICAgIE1haW4ubWFpbihuZXcgU3RyaW5nWzBdKTsnLFxuICAgICAgICAgICcgICAgfScsXG4gICAgICAgICAgJ30nLFxuICAgICAgICAgICcnLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGBwcm9qZW4gbmV3IC4uLiAtLWphdmEtdmVyc2lvbiAyMWAgKG9yIGAxLjhgLCBvciBgLS1taW4tbWF2ZW4tdmVyc2lvbiAzLjlgKVxuICogcmVhY2hlcyB0aGUgb3B0aW9ucyBhcyBhICpudW1iZXIqOiB5YXJncyBwYXJzZXMgbnVtZXJpYy1sb29raW5nIGZsYWdzLCBhbmRcbiAqIHByb2plbiBwYXNzZXMgc3RyaW5nLXR5cGVkIG9wdGlvbnMgdGhyb3VnaCB1bmNoYW5nZWQuIFRoZSBpbml0aWFsXG4gKiBgLnByb2plbnJjLnRzYCBpcyByZW5kZXJlZCBmcm9tIHRoZSBzYW1lIGFyZ3MsIHNvIGl0IHdvdWxkIHJlYWRcbiAqIGBqYXZhVmVyc2lvbjogMjFgIGFuZCBmYWlsIHRvIHR5cGUtY2hlY2suIE5vIEphdmEgb3B0aW9uIGlzIG51bWJlci10eXBlZCxcbiAqIHNvIGV2ZXJ5IG51bWVyaWMgYXJnIGlzIHR1cm5lZCBiYWNrIGludG8gdGhlIHN0cmluZyB0aGUgdXNlciB0eXBlZC4gVGhpc1xuICogcnVucyBiZWZvcmUgdGhlIFByb2plY3QgY29uc3RydWN0b3IsIHdoaWNoIGlzIHdoZXJlIHByb2plbiBjYXB0dXJlcyB0aGVcbiAqIGFyZ3MgaXQgcmVuZGVycy4gT3B0aW9ucyBmcm9tIGEgaGFuZC13cml0dGVuIHByb2plbnJjIGFyZSBuZXZlciBudW1iZXJzXG4gKiAodGhleSB0eXBlLWNoZWNrIGFzIHN0cmluZ3MpIGFuZCBhcmUgbGVmdCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5UHJvamVuTmV3QXJnczxUIGV4dGVuZHMgb2JqZWN0PihvcHRpb25zOiBUKTogVCB7XG4gIGNvbnN0IG1hcmtlciA9IChvcHRpb25zIGFzIGFueSkuX19uZXdfXztcbiAgaWYgKCFtYXJrZXI/LmFyZ3MpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiBbb3B0aW9ucyBhcyBhbnksIG1hcmtlci5hcmdzXSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0YXJnZXQpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTW9kdWxlRGlyKGRpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdW5peCA9IGRpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGlmICh1bml4LnN0YXJ0c1dpdGgoJy8nKSB8fCAvXltBLVphLXpdOi8udGVzdCh1bml4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdC5gKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXgubm9ybWFsaXplKHVuaXgpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAobm9ybWFsaXplZCA9PT0gJy4nIHx8IG5vcm1hbGl6ZWQgPT09ICcnIHx8IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlIGRpciBcIiR7ZGlyfVwiIG11c3QgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHJlcG8gcm9vdC5gKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbiJdfQ==
@@ -1,9 +1,21 @@
1
- import { JavaMavenProject } from './java-maven-base';
2
- import { JavaServiceProjectOptions } from './options';
1
+ import { JavaSpringBootProject } from './java-spring-boot-project';
2
+ import { MavenModule } from './maven/maven-module';
3
+ import { JavaServiceProjectOptions, MavenModuleOptions } from './options';
3
4
  /**
4
- * Springboot service application. Publishes to Docker Hub (never Maven
5
- * Central); publish and deploy are both manual-dispatch, not on every merge.
5
+ * Spring Boot service application deployed as a container:
6
+ * `JavaSpringBootProject` plus Docker publishing (Docker Hub by default -
7
+ * never Maven Central), Flyway, and a CDK deploy hook. Publish and deploy
8
+ * are both manual-dispatch, not on every merge.
9
+ *
10
+ * Single-module only: the Docker build, Flyway migrations and deploy hook
11
+ * all assume one deployable at the repo root. For a multi-module Spring Boot
12
+ * repo use `JavaSpringBootProject`.
6
13
  */
7
- export declare class JavaServiceProject extends JavaMavenProject {
14
+ export declare class JavaServiceProject extends JavaSpringBootProject {
8
15
  constructor(options: JavaServiceProjectOptions);
16
+ /**
17
+ * Not supported: `JavaServiceProject` is single-module. Use
18
+ * `JavaSpringBootProject` for a multi-module Spring Boot repo.
19
+ */
20
+ addModule(_options: MavenModuleOptions): MavenModule;
9
21
  }