1export function parseCommand(cmd) { 2 const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' '); 3 const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/); 4 const bregex = /\.*[\][<>]/g; 5 const firstCommand = splitCommand.shift(); 6 if (!firstCommand) 7 throw new Error(`No command found in: ${cmd}`); 8 const parsedCommand = { 9 cmd: firstCommand.replace(bregex, ''), 10 demanded: [], 11 optional: [], 12 }; 13 splitCommand.forEach((cmd, i) => { 14 let variadic = false; 15 cmd = cmd.replace(/\s/g, ''); 16 if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) 17 variadic = true; 18 if (/^\[/.test(cmd)) { 19 parsedCommand.optional.push({ 20 cmd: cmd.replace(bregex, '').split('|'), 21 variadic, 22 }); 23 } 24 else { 25 parsedCommand.demanded.push({ 26 cmd: cmd.replace(bregex, '').split('|'), 27 variadic, 28 }); 29 } 30 }); 31 return parsedCommand; 32} 33