UNPKG

@ainc/script

Version:

Script compiler for typescript

133 lines 4.07 kB
/** ***************************************** * Created by edonet@163.com * Created on 2022-01-01 11:47:45 ***************************************** */ 'use strict'; 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