@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
|
@@ -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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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.
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.
|
|
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
|
|
27
|
-
//
|
|
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
|
-
//
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
1
|
+
import { JavaSpringBootProject } from './java-spring-boot-project';
|
|
2
|
+
import { MavenModule } from './maven/maven-module';
|
|
3
|
+
import { JavaServiceProjectOptions, MavenModuleOptions } from './options';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
|
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
|
}
|
|
@@ -5,16 +5,22 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const cdk_deploy_hook_1 = require("./components/cdk-deploy-hook");
|
|
6
6
|
const docker_publish_1 = require("./components/docker-publish");
|
|
7
7
|
const flyway_migration_1 = require("./components/flyway-migration");
|
|
8
|
-
const
|
|
8
|
+
const java_spring_boot_project_1 = require("./java-spring-boot-project");
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Spring Boot service application deployed as a container:
|
|
11
|
+
* `JavaSpringBootProject` plus Docker publishing (Docker Hub by default -
|
|
12
|
+
* never Maven Central), Flyway, and a CDK deploy hook. Publish and deploy
|
|
13
|
+
* are both manual-dispatch, not on every merge.
|
|
14
|
+
*
|
|
15
|
+
* Single-module only: the Docker build, Flyway migrations and deploy hook
|
|
16
|
+
* all assume one deployable at the repo root. For a multi-module Spring Boot
|
|
17
|
+
* repo use `JavaSpringBootProject`.
|
|
12
18
|
*/
|
|
13
|
-
class JavaServiceProject extends
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.
|
|
19
|
+
class JavaServiceProject extends java_spring_boot_project_1.JavaSpringBootProject {
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.14" };
|
|
15
21
|
constructor(options) {
|
|
16
22
|
super(options);
|
|
17
|
-
this.
|
|
23
|
+
this.addDependency('org.springframework.boot/spring-boot-starter-web');
|
|
18
24
|
new docker_publish_1.DockerPublish(this, { dockerRegistry: options.dockerRegistry });
|
|
19
25
|
if (options.useFlyway ?? true) {
|
|
20
26
|
new flyway_migration_1.FlywayMigration(this);
|
|
@@ -25,6 +31,13 @@ class JavaServiceProject extends java_maven_base_1.JavaMavenProject {
|
|
|
25
31
|
});
|
|
26
32
|
}
|
|
27
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Not supported: `JavaServiceProject` is single-module. Use
|
|
36
|
+
* `JavaSpringBootProject` for a multi-module Spring Boot repo.
|
|
37
|
+
*/
|
|
38
|
+
addModule(_options) {
|
|
39
|
+
throw new Error('JavaServiceProject is single-module (its Docker build, Flyway migrations and deploy hook assume one deployable at the repo root). Use JavaSpringBootProject for a multi-module Spring Boot repo.');
|
|
40
|
+
}
|
|
28
41
|
}
|
|
29
42
|
exports.JavaServiceProject = JavaServiceProject;
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1zZXJ2aWNlLXByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvamF2YS9qYXZhLXNlcnZpY2UtcHJvamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsa0VBQTZEO0FBQzdELGdFQUE0RDtBQUM1RCxvRUFBZ0U7QUFDaEUseUVBQW1FO0FBSW5FOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsZ0RBQXFCOztJQUMzRCxZQUFZLE9BQWtDO1FBQzVDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxhQUFhLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUV2RSxJQUFJLDhCQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXBFLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFJLGtDQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLCtCQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUI7YUFDeEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQUMsUUFBNEI7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FDYixrTUFBa00sQ0FDbk0sQ0FBQztJQUNKLENBQUM7O0FBM0JILGdEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RlcGxveUhvb2sgfSBmcm9tICcuL2NvbXBvbmVudHMvY2RrLWRlcGxveS1ob29rJztcbmltcG9ydCB7IERvY2tlclB1Ymxpc2ggfSBmcm9tICcuL2NvbXBvbmVudHMvZG9ja2VyLXB1Ymxpc2gnO1xuaW1wb3J0IHsgRmx5d2F5TWlncmF0aW9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2ZseXdheS1taWdyYXRpb24nO1xuaW1wb3J0IHsgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0IH0gZnJvbSAnLi9qYXZhLXNwcmluZy1ib290LXByb2plY3QnO1xuaW1wb3J0IHsgTWF2ZW5Nb2R1bGUgfSBmcm9tICcuL21hdmVuL21hdmVuLW1vZHVsZSc7XG5pbXBvcnQgeyBKYXZhU2VydmljZVByb2plY3RPcHRpb25zLCBNYXZlbk1vZHVsZU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuXG4vKipcbiAqIFNwcmluZyBCb290IHNlcnZpY2UgYXBwbGljYXRpb24gZGVwbG95ZWQgYXMgYSBjb250YWluZXI6XG4gKiBgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0YCBwbHVzIERvY2tlciBwdWJsaXNoaW5nIChEb2NrZXIgSHViIGJ5IGRlZmF1bHQgLVxuICogbmV2ZXIgTWF2ZW4gQ2VudHJhbCksIEZseXdheSwgYW5kIGEgQ0RLIGRlcGxveSBob29rLiBQdWJsaXNoIGFuZCBkZXBsb3lcbiAqIGFyZSBib3RoIG1hbnVhbC1kaXNwYXRjaCwgbm90IG9uIGV2ZXJ5IG1lcmdlLlxuICpcbiAqIFNpbmdsZS1tb2R1bGUgb25seTogdGhlIERvY2tlciBidWlsZCwgRmx5d2F5IG1pZ3JhdGlvbnMgYW5kIGRlcGxveSBob29rXG4gKiBhbGwgYXNzdW1lIG9uZSBkZXBsb3lhYmxlIGF0IHRoZSByZXBvIHJvb3QuIEZvciBhIG11bHRpLW1vZHVsZSBTcHJpbmcgQm9vdFxuICogcmVwbyB1c2UgYEphdmFTcHJpbmdCb290UHJvamVjdGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBKYXZhU2VydmljZVByb2plY3QgZXh0ZW5kcyBKYXZhU3ByaW5nQm9vdFByb2plY3Qge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBKYXZhU2VydmljZVByb2plY3RPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICB0aGlzLmFkZERlcGVuZGVuY3koJ29yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC9zcHJpbmctYm9vdC1zdGFydGVyLXdlYicpO1xuXG4gICAgbmV3IERvY2tlclB1Ymxpc2godGhpcywgeyBkb2NrZXJSZWdpc3RyeTogb3B0aW9ucy5kb2NrZXJSZWdpc3RyeSB9KTtcblxuICAgIGlmIChvcHRpb25zLnVzZUZseXdheSA/PyB0cnVlKSB7XG4gICAgICBuZXcgRmx5d2F5TWlncmF0aW9uKHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNka0RlcGxveUhvb2sgPz8gdHJ1ZSkge1xuICAgICAgbmV3IENka0RlcGxveUhvb2sodGhpcywgb3B0aW9ucy5lbnZpcm9ubWVudHMgPz8gWydwcm9kJ10sIHtcbiAgICAgICAgdGFyZ2V0UmVwbzogb3B0aW9ucy5jZGtEZXBsb3lUYXJnZXRSZXBvLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdCBzdXBwb3J0ZWQ6IGBKYXZhU2VydmljZVByb2plY3RgIGlzIHNpbmdsZS1tb2R1bGUuIFVzZVxuICAgKiBgSmF2YVNwcmluZ0Jvb3RQcm9qZWN0YCBmb3IgYSBtdWx0aS1tb2R1bGUgU3ByaW5nIEJvb3QgcmVwby5cbiAgICovXG4gIHB1YmxpYyBhZGRNb2R1bGUoX29wdGlvbnM6IE1hdmVuTW9kdWxlT3B0aW9ucyk6IE1hdmVuTW9kdWxlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnSmF2YVNlcnZpY2VQcm9qZWN0IGlzIHNpbmdsZS1tb2R1bGUgKGl0cyBEb2NrZXIgYnVpbGQsIEZseXdheSBtaWdyYXRpb25zIGFuZCBkZXBsb3kgaG9vayBhc3N1bWUgb25lIGRlcGxveWFibGUgYXQgdGhlIHJlcG8gcm9vdCkuIFVzZSBKYXZhU3ByaW5nQm9vdFByb2plY3QgZm9yIGEgbXVsdGktbW9kdWxlIFNwcmluZyBCb290IHJlcG8uJyxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { JavaMavenProject } from './java-maven-base';
|
|
2
|
+
import { MavenModule } from './maven/maven-module';
|
|
3
|
+
import { JavaSpringBootProjectOptions, MavenModuleOptions } from './options';
|
|
4
|
+
/**
|
|
5
|
+
* Spring Boot on Maven, single- or multi-module, with no Docker, Flyway or
|
|
6
|
+
* CDK - `JavaMavenProject` plus Spring Boot dependency management.
|
|
7
|
+
*
|
|
8
|
+
* - `spring-boot-dependencies` is imported as the first BOM, so starters and
|
|
9
|
+
* the libraries Boot manages (JUnit included) are added versionless.
|
|
10
|
+
* - `spring-boot-maven-plugin` is versioned in `<pluginManagement>`. A
|
|
11
|
+
* single-module project repackages its root jar into an executable one.
|
|
12
|
+
* In a multi-module project only modules added with
|
|
13
|
+
* `addSpringBootModule()` are repackaged; `addModule()` modules stay plain
|
|
14
|
+
* jars (shared libraries, clients, ...).
|
|
15
|
+
*
|
|
16
|
+
* `JavaServiceProject` builds on this and adds Docker publishing, Flyway,
|
|
17
|
+
* and a CDK deploy hook.
|
|
18
|
+
*/
|
|
19
|
+
export declare class JavaSpringBootProject extends JavaMavenProject {
|
|
20
|
+
/** The Spring Boot version (BOM and Maven plugin). */
|
|
21
|
+
readonly springBootVersion: string;
|
|
22
|
+
constructor(options: JavaSpringBootProjectOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Adds a module that is a Spring Boot application: like `addModule()`, plus
|
|
25
|
+
* `spring-boot-maven-plugin`'s `repackage`, which turns the module's jar
|
|
26
|
+
* into an executable one.
|
|
27
|
+
*/
|
|
28
|
+
addSpringBootModule(options: MavenModuleOptions): MavenModule;
|
|
29
|
+
preSynthesize(): void;
|
|
30
|
+
}
|