UNPKG

app-lib-commond

Version:

便捷命令管理 -【app-lib-commond】

142 lines (116 loc) 4.75 kB
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 }