xref: /expo/packages/@expo/cli/src/utils/variadic.ts (revision af644ed4)
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