app-lib-commond
Version:
便捷命令管理 -【app-lib-commond】
142 lines (116 loc) • 4.75 kB
JavaScript
const { log } = require('app-lib-log');
const { writeFileSync, getRootPath, yesOrNo } = require('app-lib-node');
const { exec } = require('app-lib-exec');
// 数据存储路径
const storePath = getRootPath('./src/db.json');
// 获取数据
const getStoreData = () => require(storePath);
// 设置数据
const setStoreData = (data) => writeFileSync(storePath, JSON.stringify(data, null, 2));
const INNER_COMMOND = ['ls', 'add', 'del'];
const getCommond = (name, data) => (data || getStoreData() || []).find(item => item.name === name);
/**
* 查看命令
*/
const listCommonds = () => log.T(getStoreData())
/**
* 添加命令
*/
const addCommonds = async () => {
let [ name, ...args] = process.argv.slice(3);
let commond = args.join(' '); // 解析是空格的命令
if (!name) {
return log.mwn('add', 'not exist name')
}
if (INNER_COMMOND.includes(name)) {
return log.mwn('add', `${name} is inner commond name,can't add !`)
}
if (!commond) {
return log.mwn('add', 'not exist commond')
}
let existCommonds = getStoreData();
const existCommond = getCommond(name, existCommonds);
if (existCommond) {
if (commond === existCommond.commond) return log.mwn(`exist name [${name}] and commond [${existCommond.commond}]`);
let res = await yesOrNo(`you sure update [${name}] from [${existCommond.commond}] to [${commond}] `)
if (!res) return log.mwn(`give up update name [${name}] and commond [${existCommond.commond}]`);
// 设置更新的命令值
existCommond.commond = commond;
}
log.ms(`${existCommond ? "update" : 'add'} success name [${name}] and commond [${commond}]`);
let newCommonds = existCommond ? existCommonds : [{ name, commond }].concat(existCommonds);
setStoreData(newCommonds);
log.T(newCommonds);
}
/**
* 删除命令
*/
const delCommonds = () => {
let [name] = process.argv.slice(3);
if (!name) {
return log.mwn('del', 'name is empty!')
}
const existCommond = getCommond(name);
if (!existCommond) {
return log.mwn('del', `not exist [${name}]`)
}
let data = getStoreData();
let newData = data.filter(item => item.name !== name);
setStoreData(newData);
log.ms(`del commond ${name} finish`);
log.T(newData);
}
// 正则匹配 开头 %arg+数字+% 结尾表述为参数 不实用@符号 ps命令行中有自己的定义 不能解析到入参
const PARAM_REG = new RegExp("^%arg+([0-9]*)+[%]");
// 目前支持5个参数
const getCommplateCommond = (commond, arg1, arg2, arg3, arg4, arg5) => {
// 替换参数名称
let newCommond = commond.split(' ').map(v => {
let isParam =PARAM_REG.test(v);
let argIndex= PARAM_REG.exec(v)?.[1];
return isParam ? v.replace(PARAM_REG, "${arg") + argIndex+'}' : v
}).join(' ');
// newCommond = `\`${newCommond}\``;
return eval(`\`${newCommond}\``)
}
const exeCommond = async (commond, arg = []) => {
let complateCommond = getCommplateCommond.apply(null, [commond, ...arg])
log.mi("execute commond:", complateCommond)
let [exeConmd, ...param] = complateCommond.split(' ');
await exec(exeConmd, param.filter(v=>!!v),{stdio:"inherit"});
}
const showDefaut = () => {
log.mi("--------------------wellcome appbir commonds execute manager--------------------------------")
log.mi("usage","[ app --help ] show support commond >")
log.mi("usage","[ app ls] show custom commond >")
log.mi("usage","[ app customName] excute custom commond >")
log.mi("--------------------------------------------------------------------------------------------")
return 0;
}
// 全部匹配
// 注意 参数中如果存在空格 则会被解析为两个参数 添加引号也没有用
// app commonNames arg1 arg2 arg3 'asdasda arg4'
// let [commondName, ...arg] = process.argv.slice(2);
// 解析为 [ 'arg1', 'arg2', 'arg3', 'asdasda', 'arg4' ]
const allAction = async () => {
let [name, ...arg] = process.argv.slice(2);
// 校验名称是否存在
if (!name) return showDefaut();
// 名称为内置 则不进行天津
if (INNER_COMMOND.includes(name)) return;
// 不存配置
const existCommond = getCommond(name);
if (!existCommond || !existCommond.commond) {
log.mwn(`no config [${name}] commond`);
log.T(getStoreData());
return 0;
}
// 执行命令
await exeCommond(existCommond.commond, arg)
}
module.exports = {
listCommonds,
addCommonds,
delCommonds,
allAction
}