UNPKG

quicksilver-cli

Version:
321 lines (320 loc) 13.3 kB
"use strict"; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; result["default"] = mod; return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const prompt_1 = require("./prompt"); const GradleUtil = __importStar(require("./gradle")); const version_1 = require("./version"); const TomcatUtil = __importStar(require("./tomcat")); const fs = __importStar(require("fs")); const path = __importStar(require("path")); const os = __importStar(require("os")); const log4js_1 = require("log4js"); const projectJson = require("../resources/project/project.json"); const colors = require("colors"); exports.tomcatConfigFile = projectJson.tomcatConfigFile; exports.environmentConfigFile = projectJson.environmentConfigFile; exports.cacheFile = path.join(os.tmpdir(), projectJson.cacheFile); async function initTomcatInfo(rootProjectPath) { try { const tomcat = readTomcatConfigFile(rootProjectPath); const tomcatHome = await TomcatUtil.initTomcat(rootProjectPath, tomcat.home); let writeFile = false; if (tomcat.httpPort == null) { tomcat.httpPort = projectJson.httpPortForDevelop; writeFile = true; } if (tomcat.home != tomcatHome) { tomcat.home = tomcatHome; writeFile = true; } if (writeFile) { writeTomcatConfigFile(rootProjectPath, tomcat); } return tomcat; } catch (e) { const tomcatHome = await TomcatUtil.initTomcat(rootProjectPath); const tomcat = { httpPort: projectJson.httpPortForDevelop, home: tomcatHome }; writeTomcatConfigFile(rootProjectPath, tomcat); return tomcat; } } exports.initTomcatInfo = initTomcatInfo; function writeTomcatConfigFile(rootProjectPath, tomcat) { const content = JSON.stringify(tomcat, null, 2); fs.writeFileSync(path.join(rootProjectPath, exports.tomcatConfigFile), content); } exports.writeTomcatConfigFile = writeTomcatConfigFile; function readTomcatConfigFile(rootProjectPath) { const content = fs.readFileSync(path.join(rootProjectPath, exports.tomcatConfigFile), "utf8") .replace(/\\/g, "/"); return JSON.parse(content); } exports.readTomcatConfigFile = readTomcatConfigFile; function putCache(key, value) { const cache = getCaches(); cache[key] = value; const content = JSON.stringify(cache, null, 2); fs.writeFileSync(exports.cacheFile, content); } exports.putCache = putCache; function getCaches() { try { const content = fs.readFileSync(exports.cacheFile, "utf8"); return JSON.parse(content); } catch (e) { return {}; } } exports.getCaches = getCaches; function getCache(key) { const cache = getCaches(); return key in cache ? cache[key] : null; } exports.getCache = getCache; function isValidName(name) { return name != null && /^[a-z][a-z0-9_-]*$/.test(name); } exports.isValidName = isValidName; function existsGradleProject(projectPath) { return fs.existsSync(path.join(projectPath, "gradlew")); } exports.existsGradleProject = existsGradleProject; async function validateGradleProject(projectPath, cacheKey) { const gradleProject = await existsGradleProject(projectPath); if (!gradleProject) { const fileName = cacheKey ? getCache(cacheKey) : null; let rejectMessage = `'${projectPath}' is not a root project.`; if (fileName) { const relativePath = path.relative(projectPath, fileName); rejectMessage += `Please change directory, Eg: ` + colors.green.bold(`cd ${relativePath}`); } return Promise.reject(rejectMessage); } } exports.validateGradleProject = validateGradleProject; function existsSubGradleProject(projectPath) { const gradlePath = path.join(projectPath, "build.gradle"); const rootProjectPath = path.dirname(projectPath); const existsParentGradleProject = existsGradleProject(rootProjectPath); const existsProject = fs.existsSync(projectPath); const standardProject = /-(module-|lib-|run|build)/.test(projectPath); const existsGradle = fs.existsSync(gradlePath); return existsParentGradleProject && existsProject && standardProject && existsGradle; } exports.existsSubGradleProject = existsSubGradleProject; async function createBuildProjectIfNotExists(rootProjectPath) { const logger = log4js_1.getLogger("project"); const rootProjectName = path.basename(rootProjectPath); const projectName = rootProjectName + "-build"; const projectPath = path.join(rootProjectPath, projectName); if (existsSubGradleProject(projectPath)) { return; } logger.info(`The build-sub project is '${projectName}'.`); const gradle = GradleUtil.getBuildProjectGradle(rootProjectName, projectJson.httpPortForProduct, projectJson.httpsPortForProduct); const gradlePath = path.join(projectPath, "build.gradle"); fs.mkdirSync(projectPath, { recursive: true }); fs.writeFileSync(gradlePath, gradle); GradleUtil.modifySettingsGradle(projectPath); logger.info(`Created build-sub project '${projectName}'.`); } exports.createBuildProjectIfNotExists = createBuildProjectIfNotExists; async function promptProject(project) { const messages = [ `1. A valid project name can contain only lowercase letters, numbers, underscores and dashes.`, `2. It must begin with a lowercase letter.` ]; const info = { question: "Please input a name for the root project: ", value: project, validators: [{ message: messages.join("\n"), predictor: isValidName }] }; return await prompt_1.prompt(info); } exports.promptProject = promptProject; async function promptSubProject(type, project) { const messages = [ `1. A valid ${type}-sub project name can contain only lowercase letters, numbers, underscores and dashes.`, `2. It must begin with a lowercase letter.` ]; const info = { question: `Please input a name for ${type} project: `, value: project, validators: [{ message: messages.join("\n"), predictor: isValidName }] }; return await prompt_1.prompt(info); } exports.promptSubProject = promptSubProject; function getModuleNames(rootProjectPath, module) { const rootProjectName = path.basename(rootProjectPath); const subProjectNames = fs.readdirSync(rootProjectPath); const modulePrefix = `${rootProjectName}-module-`; const moduleNames = subProjectNames.filter(subProjectName => subProjectName.startsWith(modulePrefix)) .map(subProjectName => subProjectName.substring(modulePrefix.length)); if (module != null) { moduleNames.push(module); } return moduleNames; } exports.getModuleNames = getModuleNames; function getRunNames(rootProjectPath) { const rootProjectName = path.basename(rootProjectPath); const subProjectNames = fs.readdirSync(rootProjectPath); const runPrefix = `${rootProjectName}-run`; return subProjectNames.filter(subProjectName => subProjectName.startsWith(runPrefix)) .map(subProjectName => { return subProjectName.length == runPrefix.length ? "" : subProjectName.substring(runPrefix.length + 1); }); } exports.getRunNames = getRunNames; function getAvailableRunNames(rootProjectPath, module) { const moduleNames = getModuleNames(rootProjectPath, module); const runNames = getRunNames(rootProjectPath); const names = moduleNames.filter(name => !runNames.includes(name)); if (moduleNames.length > 0) { if (!runNames.includes("")) { names.push(""); } } return names; } exports.getAvailableRunNames = getAvailableRunNames; async function promptGroup(group) { const messages = [ `1. A valid group name can contain only lowercase letters, dots and dashes.`, `2. It must begin with a lowercase letter.` ]; const info = { question: "Please input a group name for the root project: ", value: group, defaultValue: projectJson.group, validators: [{ message: messages.join("\n"), predictor: /^[a-z]+([-\.][a-z]+)*$/ }] }; return await prompt_1.prompt(info); } exports.promptGroup = promptGroup; async function promptVersion(version) { const messages = [ `1. A valid version can contain only dots and number.`, `2. It must begin with a number.` ]; const info = { question: "Please input a version for the root project: ", value: version, defaultValue: projectJson.version, validators: [{ message: messages.join("\n"), predictor: /^[0-9]+(\.[0-9]+)*$/ }] }; return await prompt_1.prompt(info); } exports.promptVersion = promptVersion; async function promptNexus(nexus) { const message = `A invalid url of remote nexus repository.`; const info = { question: "Please input a url of remote nexus repository for the project: ", value: nexus, defaultValue: projectJson.nexus, validators: [{ message: message, predictor: /^http(s)?:\/\/.*$/ }] }; return await prompt_1.prompt(info); } exports.promptNexus = promptNexus; async function getQuicksilverDefaultVersion() { const logger = log4js_1.getLogger("project"); try { const defaultQsVersion = await version_1.getQuicksilverLatestVersion(); if (projectJson.quicksilver != defaultQsVersion) { projectJson.quicksilver = defaultQsVersion; try { logger.debug(`Updating project.json`); const content = JSON.stringify(projectJson, null, 2); fs.writeFileSync(path.join(__dirname, '../resources/project/project.json'), content); } catch (e) { logger.error(`Failed to update project.json`); } } return defaultQsVersion; } catch (e) { return projectJson.quicksilver; } } exports.getQuicksilverDefaultVersion = getQuicksilverDefaultVersion; async function promptQuicksilverVersion(quicksilverVersion) { const defaultQsVersion = await getQuicksilverDefaultVersion(); const messages = [ `1. A valid qs version can contain only dots and number.`, `2. It must begin with a number.` ]; const info = { question: "Please input the dependent quicksilver version for the root project: ", value: quicksilverVersion, defaultValue: defaultQsVersion, validators: [{ message: messages.join("\n"), predictor: /^[0-9]+(\.[0-9]+)*$/ }] }; return await prompt_1.prompt(info); } exports.promptQuicksilverVersion = promptQuicksilverVersion; async function promptHttpPort(httpPort) { const message = `Http port for a tomcat should in [0, 65536].`; const info = { question: "Please input http port for the project: ", defaultValue: `${projectJson.httpPortForDevelop}`, validators: [ { message: message, predictor: /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/ } ] }; if (httpPort != null) { info.value = `${httpPort}`; } return parseInt(await prompt_1.prompt(info)); } exports.promptHttpPort = promptHttpPort; async function promptHttpsPort(httpsPort) { const message = `Https port for a tomcat should in [0, 65536].`; const info = { question: "Please input https port for the project: ", defaultValue: `${projectJson.httpsPortForDevelop}`, validators: [ { message: message, predictor: /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/ } ] }; if (httpsPort != null) { info.value = `${httpsPort}`; } return parseInt(await prompt_1.prompt(info)); } exports.promptHttpsPort = promptHttpsPort; async function promptTomcat(projectPath, tomcat) { const message = `A invalid tomcat home.`; if (tomcat == null || tomcat.trim() == "") { const info = { question: `Please input tomcat home for the project: `, defaultValue: "./apache-tomcat", validators: [ { message: message, predictor: value => value != null } ] }; tomcat = await prompt_1.prompt(info); } return await TomcatUtil.initTomcat(projectPath, tomcat); } exports.promptTomcat = promptTomcat; function copyEnvironmentConfigFileIfNotExists(rootProjectPath) { const environmentJsonPath = path.join(rootProjectPath, exports.environmentConfigFile); if (!fs.existsSync(environmentJsonPath)) { fs.copyFileSync(path.join(__dirname, `../resources/project/${exports.environmentConfigFile}`), environmentJsonPath); } } exports.copyEnvironmentConfigFileIfNotExists = copyEnvironmentConfigFileIfNotExists;