1import * as Log from '../log'; 2import { CommandError } from '../utils/errors'; 3 4/** Given a list of CLI args, return a sorted set of args based on categories used in a complex command. */ 5export function parseVariadicArguments(argv: string[]): { 6 variadic: string[]; 7 extras: string[]; 8 flags: Record<string, boolean>; 9} { 10 const variadic: string[] = []; 11 const flags: Record<string, boolean> = {}; 12 13 for (const arg of argv) { 14 if (!arg.startsWith('-')) { 15 variadic.push(arg); 16 } else if (arg === '--') { 17 break; 18 } else { 19 flags[arg] = true; 20 } 21 } 22 23 // Everything after `--` that is not an option is passed to the underlying install command. 24 const extras: string[] = []; 25 26 const extraOperator = argv.indexOf('--'); 27 if (extraOperator > -1 && argv.length > extraOperator + 1) { 28 const extraArgs = argv.slice(extraOperator + 1); 29 if (extraArgs.includes('--')) { 30 throw new CommandError('BAD_ARGS', 'Unexpected multiple --'); 31 } 32 extras.push(...extraArgs); 33 Log.debug('Extra arguments: ' + extras.join(', ')); 34 } 35 36 Log.debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, flags, extras); 37 38 return { 39 variadic, 40 flags, 41 extras, 42 }; 43} 44 45export function assertUnexpectedObjectKeys(keys: string[], obj: Record<string, any>): void { 46 const unexpectedKeys = Object.keys(obj).filter((key) => !keys.includes(key)); 47 if (unexpectedKeys.length > 0) { 48 throw new CommandError('BAD_ARGS', `Unexpected: ${unexpectedKeys.join(', ')}`); 49 } 50} 51