quicksilver-cli
Version:
Cli tool for Quicksilver
321 lines (320 loc) • 13.3 kB
JavaScript
;
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;