@atomist/sdm-pack-spring
Version:
Atomist software delivery machine extension pack for Spring and Spring Boot applications
260 lines • 12.6 kB
JavaScript
;
/*
* Copyright © 2019 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const automation_client_1 = require("@atomist/automation-client");
const axios_1 = require("axios");
const decompress = require("decompress");
const fs = require("fs");
const path = require("path");
const tmp = require("tmp-promise");
const javaPatterns_1 = require("../../java/javaPatterns");
const gradleBuildTransforms_1 = require("./gradleBuildTransforms");
const springBootTransforms_1 = require("./springBootTransforms");
const transformSeedToCustomProject_1 = require("./transformSeedToCustomProject");
function addSpringInitializrGenerator(sdm) {
return __awaiter(this, void 0, void 0, function* () {
sdm.addGeneratorCommand({
name: "start.spring.io",
intent: "spring initializr",
description: "Create a new Spring Boot project using Spring Initializr",
paramsMaker: () => new SpringInitializrProjectCreationParameters(getSpringInitializrMetaData()),
startingPoint: params => springInitializrProject(sdm, params),
transform: [
springBootTransforms_1.SetAtomistTeamInApplicationYml,
gradleBuildTransforms_1.AddGradleBootRunArgsSupport,
...transformSeedToCustomProject_1.TransformMavenSpringBootSeedToCustomProject,
],
});
});
}
exports.addSpringInitializrGenerator = addSpringInitializrGenerator;
function getSpringInitializrMetaData() {
return __awaiter(this, void 0, void 0, function* () {
const packageJson = require("../../../package.json");
return automation_client_1.doWithRetry(() => axios_1.default.get("https://start.spring.io", {
headers: {
"User-Agent": "atomist/sdm-pack-spring-" + packageJson.version,
"Accept": "application/vnd.initializr.v2.1+json",
},
}), "metadata").then(response => response.data);
});
}
function springInitializrProject(sdm, params) {
const url = "https://start.spring.io/starter.zip";
const tmpDir = tmp.dirSync({ unsafeCleanup: true });
const cwd = tmpDir.name;
const lastSlash = url.lastIndexOf("/");
const filename = url.substring(lastSlash + 1);
const zipFile = path.join(cwd, filename);
const urlParameters = getUrlParameters(params);
const packageJson = require("../../../package.json");
const headers = {
"User-Agent": "atomist/sdm-pack-spring-" + packageJson.version,
};
return downloadFileAs(url, zipFile, urlParameters, headers)
.then(() => decompress(zipFile, cwd))
.then(() => fs.unlinkSync(zipFile))
.then(() => new automation_client_1.NodeFsLocalProject("spring-initializr-project", cwd));
}
function downloadFileAs(url, outputFilename, params, headers) {
return automation_client_1.doWithRetry(() => axios_1.default.get(url, {
params,
headers: Object.assign(Object.assign({}, headers), { "Accept": "application/octet-stream", "Content-Type": "application/zip" }),
responseType: "arraybuffer",
}), `Download ${url} to ${outputFilename}`, {
minTimeout: 10000,
maxTimeout: 10100,
retries: 10,
})
.then(result => {
return fs.writeFileSync(outputFilename, result.data);
});
}
function getUrlParameters(params) {
return {
artifactId: params.enteredArtifactId,
type: params.projectType,
groupId: params.groupId,
packageName: params.rootPackage,
dependencies: params.dependencies,
language: params.language,
bootVersion: params.bootVersion,
packaging: params.packaging,
javaVersion: params.javaVersion,
};
}
let SpringInitializrProjectCreationParameters = class SpringInitializrProjectCreationParameters {
constructor(metaData) {
this.metaData = metaData;
this.version = "0.1.0-SNAPSHOT";
this.addAtomistWebhook = true;
this.enteredArtifactId = "";
}
/* tslint:disable:cyclomatic-complexity */
bindAndValidate() {
return this.metaData.then(springBootMetaData => {
const validationErrors = [];
if (this.bootVersion) {
const springBootVersions = springBootMetaData.bootVersion.values.map((v) => v.id);
if (!springBootVersions.includes(this.bootVersion)) {
validationErrors.push("Spring Boot version is invalid, should be one of: " + springBootVersions.join(", "));
}
}
if (this.packaging) {
const packagings = springBootMetaData.packaging.values.map((v) => v.id);
if (!packagings.includes(this.packaging)) {
validationErrors.push("Packaging is invalid, should be one of: " + packagings.join(", "));
}
}
if (this.language) {
const languages = springBootMetaData.language.values.map((v) => v.id);
if (!languages.includes(this.language)) {
validationErrors.push("Language is invalid, should be one of: " + languages.join(", "));
}
}
if (this.projectType) {
const types = springBootMetaData.type.values.map((v) => v.id);
if (!types.includes(this.projectType)) {
validationErrors.push("Project type is invalid, should be one of: " + types.join(", "));
}
}
if (this.javaVersion) {
const versions = springBootMetaData.javaVersion.values.map((v) => v.id);
if (!versions.includes(this.javaVersion)) {
validationErrors.push("Java version is invalid, should be one of: " + versions.join(", "));
}
}
if (this.javaVersion) {
const versions = springBootMetaData.javaVersion.values.map((v) => v.id);
if (!versions.includes(this.javaVersion)) {
validationErrors.push("Java version is invalid, should be one of: " + versions.join(", "));
}
}
if (this.dependencies) {
const dependencyGroups = springBootMetaData.dependencies.values.map((v) => v.values);
const knownDependencies = [].concat(...dependencyGroups).map((v) => v.id);
const dependencies = this.dependencies.split(",");
const wrongDependencies = dependencies.filter(d => !knownDependencies.includes(d));
if (wrongDependencies && wrongDependencies.length > 0) {
validationErrors.push("Unknown dependencies found: " + wrongDependencies.join(", "));
}
}
if (validationErrors && validationErrors.length > 0) {
return Promise.resolve({ message: validationErrors.join("\n") });
}
else {
return undefined;
}
});
}
};
__decorate([
automation_client_1.Parameter({
displayName: "Project Type",
description: "type of project",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "projectType", void 0);
__decorate([
automation_client_1.Parameter({
displayName: "Spring Boot dependencies",
description: "comma separated list of dependencies",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "dependencies", void 0);
__decorate([
automation_client_1.Parameter({
displayName: "Programming language",
description: "language (java, kotlin or groovy, default java)",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "language", void 0);
__decorate([
automation_client_1.Parameter({
displayName: "Spring Boot version",
description: "Version of Spring Boot you want to use",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "bootVersion", void 0);
__decorate([
automation_client_1.Parameter({
displayName: "Packaging",
description: "packaging (jar or war, default jar)",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "packaging", void 0);
__decorate([
automation_client_1.Parameter({
displayName: "Java version level",
description: "Java version level (1.8 or 10, default 1.8)",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "javaVersion", void 0);
__decorate([
automation_client_1.Parameter(Object.assign(Object.assign({}, javaPatterns_1.MavenGroupIdRegExp), { required: true, order: 50 })),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "groupId", void 0);
__decorate([
automation_client_1.Parameter(Object.assign(Object.assign({}, javaPatterns_1.JavaPackageRegExp), { required: true, order: 53 })),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "rootPackage", void 0);
__decorate([
automation_client_1.Parameter({
pattern: /.*/,
description: "Version to use",
required: false,
}),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "version", void 0);
__decorate([
automation_client_1.Parameter(Object.assign(Object.assign({ displayName: "Class Name", description: "name for the service class" }, javaPatterns_1.JavaIdentifierRegExp), { required: false })),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "enteredServiceClassName", void 0);
__decorate([
automation_client_1.Parameter(Object.assign(Object.assign({}, javaPatterns_1.MavenArtifactIdRegExp), { displayName: "artifactId", required: false, order: 51 })),
__metadata("design:type", String)
], SpringInitializrProjectCreationParameters.prototype, "enteredArtifactId", void 0);
SpringInitializrProjectCreationParameters = __decorate([
automation_client_1.Parameters(),
__metadata("design:paramtypes", [Promise])
], SpringInitializrProjectCreationParameters);
exports.SpringInitializrProjectCreationParameters = SpringInitializrProjectCreationParameters;
//# sourceMappingURL=springInitializrGenerator.js.map