UNPKG

@atomist/sdm-pack-spring

Version:

Atomist software delivery machine extension pack for Spring and Spring Boot applications

260 lines 12.6 kB
"use strict"; /* * 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