|
|
@ -3,31 +3,150 @@ |
|
|
|
|
|
|
|
var commander = require('commander'); |
|
|
|
var tslib = require('tslib'); |
|
|
|
var path = require('path'); |
|
|
|
var os = require('os'); |
|
|
|
var ini = require('ini'); |
|
|
|
var fs = require('fs-extra'); |
|
|
|
var chalk = require('chalk'); |
|
|
|
var uuid = require('uuid'); |
|
|
|
var path = require('path'); |
|
|
|
var os = require('os'); |
|
|
|
var download = require('download-git-repo'); |
|
|
|
var ejs = require('ejs'); |
|
|
|
var ini = require('ini'); |
|
|
|
var fetch = require('node-fetch'); |
|
|
|
var qs = require('qs'); |
|
|
|
|
|
|
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } |
|
|
|
|
|
|
|
var path__default = /*#__PURE__*/_interopDefaultLegacy(path); |
|
|
|
var os__default = /*#__PURE__*/_interopDefaultLegacy(os); |
|
|
|
var ini__default = /*#__PURE__*/_interopDefaultLegacy(ini); |
|
|
|
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); |
|
|
|
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk); |
|
|
|
var uuid__default = /*#__PURE__*/_interopDefaultLegacy(uuid); |
|
|
|
var path__default = /*#__PURE__*/_interopDefaultLegacy(path); |
|
|
|
var os__default = /*#__PURE__*/_interopDefaultLegacy(os); |
|
|
|
var download__default = /*#__PURE__*/_interopDefaultLegacy(download); |
|
|
|
var ejs__default = /*#__PURE__*/_interopDefaultLegacy(ejs); |
|
|
|
var ini__default = /*#__PURE__*/_interopDefaultLegacy(ini); |
|
|
|
var fetch__default = /*#__PURE__*/_interopDefaultLegacy(fetch); |
|
|
|
var qs__default = /*#__PURE__*/_interopDefaultLegacy(qs); |
|
|
|
|
|
|
|
var config = { |
|
|
|
dir: path__default["default"].join(os__default["default"].homedir(), '.pp'), |
|
|
|
configPath: path__default["default"].join(os__default["default"].homedir(), '.pp', '.pprc') |
|
|
|
configPath: path__default["default"].join(os__default["default"].homedir(), '.pp', '.pprc'), |
|
|
|
listPath: path__default["default"].join(os__default["default"].homedir(), '.pp', '.listrc') |
|
|
|
}; |
|
|
|
|
|
|
|
function writeErrorFile(content, path) { |
|
|
|
if (path === void 0) { path = "pp.error.log"; } |
|
|
|
if (typeof content == 'string') |
|
|
|
syncWriteFile(path, content); |
|
|
|
if (typeof content == "object" && content.toString) |
|
|
|
syncWriteFile(path, content.toString()); |
|
|
|
if (typeof content == "object" && content.toLocaleString) |
|
|
|
syncWriteFile(path, content.toLocaleString()); |
|
|
|
} |
|
|
|
function syncWriteFile(path, content, encoding) { |
|
|
|
if (encoding === void 0) { encoding = "utf-8"; } |
|
|
|
return fs__default["default"].writeFileSync(path, content, encoding); |
|
|
|
} |
|
|
|
function readIniFile(path, encoding) { |
|
|
|
if (encoding === void 0) { encoding = "utf-8"; } |
|
|
|
return ini__default["default"].parse(fs__default["default"].readFileSync(path, encoding)); |
|
|
|
} |
|
|
|
function writeIniFile(path, data) { |
|
|
|
fs__default["default"].writeFileSync(path, ini__default["default"].stringify(data)); |
|
|
|
} |
|
|
|
|
|
|
|
var dataPath = config.listPath; |
|
|
|
var Lists = readIniFile(dataPath); |
|
|
|
var Data = (function () { |
|
|
|
function Data() { |
|
|
|
} |
|
|
|
Data.getInstance = function () { |
|
|
|
if (!Data.instance) { |
|
|
|
Data.instance = new Data(); |
|
|
|
} |
|
|
|
return Data.instance; |
|
|
|
}; |
|
|
|
Data.prototype.getData = function () { |
|
|
|
if (!Lists) { |
|
|
|
Lists = {}; |
|
|
|
} |
|
|
|
return Lists; |
|
|
|
}; |
|
|
|
Data.prototype.sync = function () { |
|
|
|
writeIniFile(dataPath, Lists); |
|
|
|
}; |
|
|
|
Data.prototype.remove = function (name) { |
|
|
|
var data = this.getData(); |
|
|
|
if (data[name]) { |
|
|
|
delete data[name]; |
|
|
|
this.sync(); |
|
|
|
return true; |
|
|
|
} |
|
|
|
return false; |
|
|
|
}; |
|
|
|
Data.prototype.findOne = function (name) { |
|
|
|
var data = this.getData(); |
|
|
|
return data[name]; |
|
|
|
}; |
|
|
|
Data.prototype.addUrl = function (opts) { |
|
|
|
var data = this.getData(); |
|
|
|
if (!data[opts.name]) { |
|
|
|
var _data = Object.assign({}, opts); |
|
|
|
delete _data.name; |
|
|
|
data[opts.name] = _data; |
|
|
|
} |
|
|
|
this.sync(); |
|
|
|
}; |
|
|
|
return Data; |
|
|
|
}()); |
|
|
|
|
|
|
|
var configPath = config.configPath; |
|
|
|
var configData = readIniFile(configPath); |
|
|
|
var Config = (function () { |
|
|
|
function Config() { |
|
|
|
} |
|
|
|
Config.getInstance = function () { |
|
|
|
if (!Config.instance) { |
|
|
|
Config.instance = new Config(); |
|
|
|
} |
|
|
|
return Config.instance; |
|
|
|
}; |
|
|
|
Config.prototype.getData = function () { |
|
|
|
if (!configData) { |
|
|
|
configData = {}; |
|
|
|
} |
|
|
|
return configData; |
|
|
|
}; |
|
|
|
Config.prototype.sync = function () { |
|
|
|
writeIniFile(configPath, configData); |
|
|
|
}; |
|
|
|
Config.prototype.setGiteeToken = function (token) { |
|
|
|
var gitee = this.getGitee(); |
|
|
|
gitee.token = token; |
|
|
|
this.sync(); |
|
|
|
}; |
|
|
|
Config.prototype.reomveGitee = function () { |
|
|
|
var config = this.getData(); |
|
|
|
delete config.gitee; |
|
|
|
this.sync(); |
|
|
|
}; |
|
|
|
Config.prototype.getGitee = function () { |
|
|
|
var config = this.getData(); |
|
|
|
if (!config.gitee) |
|
|
|
config.gitee = {}; |
|
|
|
return config.gitee; |
|
|
|
}; |
|
|
|
return Config; |
|
|
|
}()); |
|
|
|
|
|
|
|
try { |
|
|
|
fs__default["default"].ensureDirSync(config.dir); |
|
|
|
fs__default["default"].ensureFileSync(config.configPath); |
|
|
|
fs__default["default"].ensureFileSync(config.listPath); |
|
|
|
} |
|
|
|
catch (e) { |
|
|
|
throw e; |
|
|
|
} |
|
|
|
|
|
|
|
function walkDir(dir, cb) { |
|
|
|
function _walk(_dir) { |
|
|
|
if (_dir === void 0) { _dir = '.'; } |
|
|
@ -46,7 +165,7 @@ function walkDir(dir, cb) { |
|
|
|
return _walk(); |
|
|
|
} |
|
|
|
function isExist(file) { |
|
|
|
var result = false; |
|
|
|
var result; |
|
|
|
try { |
|
|
|
fs__default["default"].accessSync(file, fs__default["default"].constants.F_OK | fs__default["default"].constants.R_OK | fs__default["default"].constants.W_OK); |
|
|
|
result = true; |
|
|
@ -71,6 +190,8 @@ function writefile(fromDir, toDir, opts, force) { |
|
|
|
console.log(chalk__default["default"].red("安全起见,不覆写已存在的目录")); |
|
|
|
return; |
|
|
|
} |
|
|
|
var errorFile = []; |
|
|
|
var errors = []; |
|
|
|
walkDir(fromDir, function (file) { |
|
|
|
var fromRes = path__default["default"].resolve(fromDir, file); |
|
|
|
var toRes = path__default["default"].resolve(toDir, file); |
|
|
@ -78,66 +199,111 @@ function writefile(fromDir, toDir, opts, force) { |
|
|
|
var originRoot = fs__default["default"].readFileSync(fromRes, { |
|
|
|
encoding: "utf8", |
|
|
|
}); |
|
|
|
var html = ejs__default["default"].render(originRoot, opts); |
|
|
|
fs__default["default"].writeFileSync(toRes, html); |
|
|
|
try { |
|
|
|
var html = ejs__default["default"].render(originRoot, opts); |
|
|
|
fs__default["default"].writeFileSync(toRes, html); |
|
|
|
} |
|
|
|
catch (e) { |
|
|
|
errorFile.push(toRes); |
|
|
|
errors.push(e); |
|
|
|
} |
|
|
|
}); |
|
|
|
console.log(chalk__default["default"].green("写入完成")); |
|
|
|
if (errorFile.length) { |
|
|
|
console.log(chalk__default["default"].red('以下文件写入失败:')); |
|
|
|
var errorInfo_1 = '错误如下:\n\n'; |
|
|
|
errorFile.forEach(function (errFile, index) { |
|
|
|
console.log(chalk__default["default"].red(errFile)); |
|
|
|
errorInfo_1 += "=========================" + '\n'; |
|
|
|
errorInfo_1 += errFile + '\n\n'; |
|
|
|
errorInfo_1 += errors[index].toString() + '\n'; |
|
|
|
errorInfo_1 += "=========================" + '\n'; |
|
|
|
}); |
|
|
|
var errorPath = path__default["default"].resolve(toDir, "./.pp.error.log"); |
|
|
|
writeErrorFile(errorInfo_1, errorPath); |
|
|
|
console.log(chalk__default["default"].red("详情请查看: " + errorPath)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function readFile(path, encoding) { |
|
|
|
if (encoding === void 0) { encoding = "utf-8"; } |
|
|
|
return fs__default["default"].readFileSync(path, encoding); |
|
|
|
} |
|
|
|
function readIniFile(path, encoding) { |
|
|
|
if (encoding === void 0) { encoding = "utf-8"; } |
|
|
|
return ini__default["default"].parse(fs__default["default"].readFileSync(path, encoding)); |
|
|
|
} |
|
|
|
function writeIniFile(path, data) { |
|
|
|
fs__default["default"].writeFileSync(path, ini__default["default"].stringify(data)); |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
fs__default["default"].ensureDirSync(config.dir); |
|
|
|
fs__default["default"].ensureFileSync(config.configPath); |
|
|
|
} |
|
|
|
catch (e) { |
|
|
|
throw e; |
|
|
|
} |
|
|
|
var Opts = readIniFile(config.configPath); |
|
|
|
function onLogin(token) { |
|
|
|
var result = Object.assign({}, Opts); |
|
|
|
if (!result.token) |
|
|
|
result.token = {}; |
|
|
|
result.token.gitee = token; |
|
|
|
writeIniFile(config.configPath, result); |
|
|
|
Config.getInstance().setGiteeToken(token); |
|
|
|
console.log(chalk__default["default"].green("已保存gitee的私人令牌")); |
|
|
|
} |
|
|
|
function onLogOut() { |
|
|
|
Config.getInstance().reomveGitee(); |
|
|
|
console.log(chalk__default["default"].green("已清除gitee")); |
|
|
|
} |
|
|
|
function Whoami() { |
|
|
|
console.log(chalk__default["default"].green("gitee token: ") + chalk__default["default"].greenBright(Opts.token.gitee)); |
|
|
|
var giteeConfig = Config.getInstance().getGitee(); |
|
|
|
var token = giteeConfig.token; |
|
|
|
if (token) { |
|
|
|
console.log(chalk__default["default"].green("gitee token: ") + chalk__default["default"].greenBright(token)); |
|
|
|
} |
|
|
|
else { |
|
|
|
console.log(chalk__default["default"].green("您尚未保存gitee token")); |
|
|
|
} |
|
|
|
} |
|
|
|
function sync() { |
|
|
|
return tslib.__awaiter(this, void 0, void 0, function () { |
|
|
|
var giteeConfig, token, params, requestInfo, res; |
|
|
|
return tslib.__generator(this, function (_a) { |
|
|
|
switch (_a.label) { |
|
|
|
case 0: |
|
|
|
giteeConfig = Config.getInstance().getGitee(); |
|
|
|
token = giteeConfig.token; |
|
|
|
params = qs__default["default"].stringify({ |
|
|
|
access_token: token |
|
|
|
}); |
|
|
|
requestInfo = new fetch.Request('https://gitee.com/api/v5/gists?' + params, { |
|
|
|
method: "GET" |
|
|
|
}); |
|
|
|
return [4, fetch__default["default"](requestInfo)]; |
|
|
|
case 1: return [4, (_a.sent()).json()]; |
|
|
|
case 2: |
|
|
|
res = _a.sent(); |
|
|
|
console.log(res); |
|
|
|
return [2]; |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
function onList(opt) { |
|
|
|
if (!Opts.list || !Object.keys(Opts.list).length) { |
|
|
|
var data = Data.getInstance().getData(); |
|
|
|
var keys = Object.keys(data); |
|
|
|
if (!data || !keys.length) { |
|
|
|
console.log("暂无模板列表,请自行体添加"); |
|
|
|
return; |
|
|
|
} |
|
|
|
Object.keys(Opts.list).forEach(function (key) { |
|
|
|
var value = Opts.list[key]; |
|
|
|
keys.forEach(function (key) { |
|
|
|
var value = data[key]; |
|
|
|
if (opt === null || opt === void 0 ? void 0 : opt.all) { |
|
|
|
console.log(value.name + (value.desc ? "(" + value.desc + ")" : "") + (": " + value.url)); |
|
|
|
console.log(key + (value.desc ? "(" + value.desc + ")" : "") + (": " + value.url)); |
|
|
|
} |
|
|
|
else { |
|
|
|
console.log(value.name + (value.desc ? "(" + value.desc + ")" : "")); |
|
|
|
console.log(key + (value.desc ? "(" + value.desc + ")" : "")); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
function onClone(target, opts) { |
|
|
|
if (!Opts.list || !Opts.list[target]) { |
|
|
|
function onCopy(templateDir, opts) { |
|
|
|
if (!isExist(templateDir)) { |
|
|
|
console.log(chalk__default["default"].red("请提供模板目录")); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (isExist(opts.targetDir)) { |
|
|
|
console.log(chalk__default["default"].red("安全起见,不覆写已存在的目录,请先删除相同目录文件夹")); |
|
|
|
return; |
|
|
|
} |
|
|
|
writefile(templateDir, opts.targetDir); |
|
|
|
} |
|
|
|
function onClone(name, opts) { |
|
|
|
var item = Data.getInstance().findOne(name); |
|
|
|
if (!item) { |
|
|
|
console.log("请先添加项目"); |
|
|
|
return; |
|
|
|
} |
|
|
|
var data = Opts.list[target]; |
|
|
|
var tempPath = path__default["default"].join(os__default["default"].tmpdir(), "pp-" + uuid__default["default"].v4()); |
|
|
|
var to = opts.dir; |
|
|
|
var git_url = "direct:" + data.url; |
|
|
|
var git_url = "direct:" + item.url; |
|
|
|
if (isExist(to)) { |
|
|
|
console.log(chalk__default["default"].red("安全起见,不覆写已存在的目录,请先删除相同目录文件夹")); |
|
|
|
return; |
|
|
@ -154,10 +320,8 @@ function onClone(target, opts) { |
|
|
|
}); |
|
|
|
} |
|
|
|
function onRemove(name) { |
|
|
|
var result = Object.assign({}, Opts); |
|
|
|
if (result.list && result.list[name]) { |
|
|
|
delete result.list[name]; |
|
|
|
writeIniFile(config.configPath, result); |
|
|
|
var status = Data.getInstance().remove(name); |
|
|
|
if (status) { |
|
|
|
console.log(chalk__default["default"].green("删除成功")); |
|
|
|
} |
|
|
|
else { |
|
|
@ -165,26 +329,17 @@ function onRemove(name) { |
|
|
|
} |
|
|
|
} |
|
|
|
function onAdd(url, opt) { |
|
|
|
var result = Object.assign({}, Opts); |
|
|
|
var http = /^(http|https)\:\/\//g; |
|
|
|
var git = /(git|root)\@/g; |
|
|
|
if (!git.test(url) && !http.test(url)) { |
|
|
|
console.error(chalk__default["default"].red("请添加正确的Git仓库地址")); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!result.list) |
|
|
|
result.list = {}; |
|
|
|
if (result.list[opt.name]) { |
|
|
|
console.error(chalk__default["default"].red("名字重复,当前存在:")); |
|
|
|
onList(); |
|
|
|
return; |
|
|
|
} |
|
|
|
result.list[opt.name] = tslib.__assign(tslib.__assign({}, opt), { url: url }); |
|
|
|
writeIniFile(config.configPath, result); |
|
|
|
Data.getInstance().addUrl(tslib.__assign(tslib.__assign({}, opt), { url: url })); |
|
|
|
console.log(chalk__default["default"].green("添加成功")); |
|
|
|
} |
|
|
|
function onCheck() { |
|
|
|
console.log(readFile(config.configPath)); |
|
|
|
console.log(JSON.stringify(Data.getInstance().getData())); |
|
|
|
} |
|
|
|
|
|
|
|
var program = new commander.Command(); |
|
|
@ -193,6 +348,8 @@ program.helpOption("-h --help", "显示帮助信息"); |
|
|
|
program.showHelpAfterError("( pp -h 查看帮助信息)"); |
|
|
|
program.command("login <token>").description("本地保存Gitee的私人令牌").action(onLogin); |
|
|
|
program.command("whoami").description("查看私人令牌").action(Whoami); |
|
|
|
program.command("logout").description("删除私人令牌").action(onLogOut); |
|
|
|
program.command("sync").description("同步模板列表").action(sync); |
|
|
|
program.command("list").option('-a --all').description("查看所有模板列表").action(onList); |
|
|
|
program.command("check").description("查看配置文件").action(onCheck); |
|
|
|
program |
|
|
@ -203,9 +360,10 @@ program |
|
|
|
.description("添加一个模板仓库") |
|
|
|
.action(onAdd); |
|
|
|
program |
|
|
|
.command("rm <name>") |
|
|
|
.command("remove <name>") |
|
|
|
.description("删除一个模板仓库") |
|
|
|
.action(onRemove); |
|
|
|
program.command("clone <name>").requiredOption("-d --dir <target>", "目标路径").description("克隆模板仓库").action(onClone); |
|
|
|
program.command("copy <templateDir>").requiredOption("-d --targetDir <targetDir>", "目标路径").description("简单文件夹克隆").action(onCopy); |
|
|
|
program.parse(process.argv); |
|
|
|
//# sourceMappingURL=pp.cjs.js.map
|
|
|
|