startkit-cli
Version:
Quick start your project
160 lines (129 loc) • 4.66 kB
JavaScript
;
var _downloadGithubRepo = require("download-github-repo");
var _downloadGithubRepo2 = _interopRequireDefault(_downloadGithubRepo);
var _commander = require("commander");
var _commander2 = _interopRequireDefault(_commander);
var _promptly = require("promptly");
var _promptly2 = _interopRequireDefault(_promptly);
var _fs = require("fs");
var _fs2 = _interopRequireDefault(_fs);
var _path = require("path");
var _path2 = _interopRequireDefault(_path);
var _requestPromiseNative = require("request-promise-native");
var _requestPromiseNative2 = _interopRequireDefault(_requestPromiseNative);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const print = console.log;
let templates;
async function fetchTemplates() {
if (templates) {
return;
}
try {
templates = JSON.parse((await (0, _requestPromiseNative2.default)("https://raw.githubusercontent.com/sky0014/startkit-cli/master/templates.json")));
} catch (e) {
templates = require("../templates.json");
print(`failed to fetch templates.json: ${e}, use default instead.`);
}
}
function search(name) {
for (let template of templates) {
if (name === template.name) return template;
}
}
async function doShowList(name) {
await fetchTemplates();
if (name) {
const template = search(name);
if (template) {
print(`Found templates:
\t${template.name}\t${template.description}
`);
} else {
print(`Template ${name} Not Found`);
}
} else {
print("Available templates:\n");
templates.forEach(template => {
print(`\t${template.name}\t${template.description}`);
});
}
}
async function doInstall(name, options) {
await fetchTemplates();
const template = search(name);
if (template) {
print(`Found templates:
\t${template.name}\t${template.description}
`);
print("Downloading...");
let path = "temp_" + parseInt(Date.now() * Math.random()).toString(16);
(0, _downloadGithubRepo2.default)(template.github, path, err => {
if (err) print(err);else {
print("Download complete");
doReplace(path, options);
}
});
} else {
print(`Not Found ${name}`);
}
}
async function doReplace(path, options) {
print("Installing...");
let projectName = "your project name";
let projectDescription = "your project description";
let author = "your name";
let email = "your email";
let github = "your github repository";
projectName = await _promptly2.default.prompt(`Project Name(${projectName}): `, {
default: projectName
});
projectDescription = await _promptly2.default.prompt(`Project Description(${projectDescription}): `, { default: projectDescription });
author = await _promptly2.default.prompt(`Author Name(${author}): `, {
default: author
});
email = await _promptly2.default.prompt(`Author Email(${email}): `, {
default: email
});
github = await _promptly2.default.prompt(`Github Repository(${github}): `, {
default: github
});
let confirm = await _promptly2.default.confirm("Are you sure?(yes or no)");
if (!confirm) {
doReplace(path);
} else {
walkFile(path, file => {
let input = _fs2.default.readFileSync(file).toString();
_fs2.default.writeFileSync(file, input.replace(/\${PROJECT_NAME}/g, projectName).replace(/\${PROJECT_DESCRIPTION}/g, projectDescription).replace(/\${AUTHOR}/g, author).replace(/\${EMAIL}/g, email).replace(/\${GITHUB}/g, github));
});
//move directory
let realpath = projectName;
if (options && options.path) realpath = options.path;
_fs2.default.renameSync(path, realpath);
print("Install complete");
process.exit();
}
}
async function walkFile(path, callback) {
if (typeof callback !== "function") return;
if (_fs2.default.existsSync(path)) {
if (_fs2.default.statSync(path).isDirectory()) {
//目录
_fs2.default.readdirSync(path).forEach(p => walkFile(_path2.default.join(path, p), callback));
} else {
//文件
if (callback) callback(path);
}
}
}
async function main() {
//VERSION from package.json with babel-plugin-version-transform
_commander2.default.version("1.0.11").usage(`<command> [options]`);
_commander2.default.command("list [name]").description("Show templates").action(doShowList);
_commander2.default.command("install <name>").alias("i").description("Install template name").option("-p, --path <path>", "Install path").action(doInstall);
_commander2.default.parse(process.argv);
if (process.argv.length <= 2) {
_commander2.default.help();
}
}
main();