@ainc/script
Version:
Script compiler for typescript
133 lines • 4.07 kB
JavaScript
/**
*****************************************
* Created by edonet@163.com
* Created on 2022-01-01 11:47:45
*****************************************
*/
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Parser = void 0;
/**
*****************************************
* 加载依赖
*****************************************
*/
const stdout_1 = require("@ainc/stdout");
/**
*****************************************
* 遍历参数
*****************************************
*/
function each(argv, callback) {
let key = '';
let args = [];
for (let idx = 0, len = argv.length; idx < len; idx++) {
const value = argv[idx];
if (value.charAt(0) === '-') {
// 执行回调
(key || args.length) && callback(key, args);
// 更新值
key = value;
args = [];
}
else {
args.push(value);
}
}
// 执行回调
(key || args.length) && callback(key, args);
}
/**
*****************************************
* 参数解析器
*****************************************
*/
class Parser {
/** 初始化对象 */
constructor(options) {
const names = Object.keys(options);
const rules = new Map();
// 遍历配置
names.forEach(name => {
const rule = { name, type: 'string', ...options[name] };
// 添加规则
rule.name && rules.set(rule.name, rule);
rule.alias && rules.set(rule.alias, rule);
});
// 更新规则
this.rules = rules;
}
/** 解析参数 */
parse(argv) {
const rest = [];
const result = { argv: rest };
// 遍历参数
each(argv, (key, args) => {
// 未命名参数
if (!key) {
return rest.push(...args);
}
// 获取规则
const rule = (key.startsWith('--') ?
this.rules.get(key.slice(2)) :
key.charAt(0) === '-' ?
this.rules.get(key.slice(1)) :
null);
// 未定义解析规则
if (!rule) {
return rest.push(...args);
}
// 解析参数类型
switch (rule.type) {
case 'boolean':
result[rule.name] = true;
break;
case 'string':
result[rule.name] = args.shift() || '';
break;
case 'number':
result[rule.name] = parseInt(args.shift() || '0') || 0;
break;
case 'array':
result[rule.name] = (result[rule.name] || []).concat(args);
return;
default:
break;
}
// 添加剩余参数
args.length && rest.push(...args);
});
// 返回结果
return result;
}
/** 打印帮助信息 */
print(info) {
const { name, usage, version, description } = info;
const keys = new Set(['_']);
const table = new stdout_1.Table();
// 打印信息
console.log(`\n Usage: ${name} ${usage || ''}`);
version && console.log(` Version: ${version}`);
description && console.log(`\n ${description}`);
// 生成选项列表
this.rules.forEach(({ name, alias, description }) => {
if (!name || keys.has(name)) {
return;
}
// 添加映射
keys.add(name);
// 获取别名
alias = alias && alias !== '_' ? '-' + alias + ', ' : ' ';
// 添加项
table.add(` ${alias}--${name}`, description || '');
});
// 打印选项
if (table.length) {
table.print('\n Options:');
}
// 结束信息
console.log('');
}
}
exports.Parser = Parser;
//# sourceMappingURL=argv.js.map