yst-react-cli
Version:
97 lines (84 loc) • 3.81 kB
JavaScript
;
var _utils = require('./utils');
// 创建项目
var axios = require('axios');
var path = require('path');
var inquirer = require('inquirer'); // 命令行选择模版
var downloadGitRepo = require('download-git-repo'); // 下载仓库使用的包,非promise
var _require = require('util'),
promisify = _require.promisify;
var promiseDownloadGitRepo = promisify(downloadGitRepo); // 包装promise
var ncp = require('ncp'); // 用于拷贝下载好的模版,非promise
var promiseNcp = promisify(ncp);
var fs = require('fs'); // 文件操作
var exist = promisify(fs.stat); // 判断是否已存在文件
var _require2 = require('shelljs'),
exec = _require2.exec;
var chalk = require('chalk'); // 美化输出
var _require3 = require('./constants'),
temporaryDownloadDirectory = _require3.temporaryDownloadDirectory,
userInquirer = _require3.userInquirer; // 获取临时下载目录
// 下载模版
var downloadTemplate = async function downloadTemplate(repo, tag) {
var api = 'OnionMister/' + repo;
if (tag) {
api += '#' + tag;
}
var dest = temporaryDownloadDirectory + '/' + repo;
await promiseDownloadGitRepo(api, dest);
return dest;
};
module.exports = async function (projectName) {
var projectExist = await exist(projectName).catch(function (err) {
// 处理除文件已存在之外的其他错误
if (err.code !== 'ENOENT') {
console.log(chalk.redBright.bold(err));
}
});
// 文件已存在
if (projectExist) {
console.log(chalk.redBright.bold('The file has exited!'));
return;
}
try {
// 选择要下载的模版
var _ref = await inquirer.prompt(userInquirer),
template = _ref.template,
description = _ref.description,
author = _ref.author,
packageType = _ref.packageType;
var temporaryDir = await (0, _utils.waitFunLoading)(downloadTemplate, 'download Template...')('yst-react-cli-template');
var packageFile = temporaryDir + '/' + template + '/package.json';
// 找到模版下的package.json,跟用用户选择进行内容更新
if (await exist(packageFile)) {
var data = fs.readFileSync(packageFile).toString();
var json = JSON.parse(data);
json.name = projectName;
json.description = description;
json.author = author;
fs.writeFileSync(packageFile, JSON.stringify(json, null, '\t'), 'utf-8');
}
await promiseNcp(temporaryDir + '/' + template, path.resolve(projectName));
console.log(chalk.green('\nTemplate obtained successfully!\n'));
await exec('cd ' + path.resolve(projectName) + ' && git init && git config --global core.autocrlf input && git add . && git commit -m "Initialize project using yst-react-cli"');
console.log(chalk.green('\nCreated git commit.\n'));
console.log(chalk.blueBright('\nstart install dependencies...\n'));
if (process.platform === 'darwin') {
exec('rm -rf ' + temporaryDownloadDirectory);
} else {
exec('rmdir /S /Q ' + temporaryDownloadDirectory);
}
(0, _utils.installDep)({
dir: path.resolve(projectName),
packageType: packageType
}).then(function () {
console.log(chalk.green('\nSuccess! Created ' + projectName + ' at ' + path.resolve(projectName) + '\n'));
console.log('\nWe suggest that you begin by typing:\n');
console.log(chalk.cyan(' cd'), projectName);
console.log(' ' + chalk.cyan(packageType + ' start'));
console.log('\nHappy hacking!');
});
} catch (err) {
console.log(chalk.redBright.bold(err));
}
};