18d3f3824SCedric van Puttenimport { NodePackageManagerForProject } from '@expo/package-manager';
209bb6093SEvan Bacon
309bb6093SEvan Baconimport { CommandError } from '../utils/errors';
4e0694585SCedric van Puttenimport { assertUnexpectedVariadicFlags, parseVariadicArguments } from '../utils/variadic';
509bb6093SEvan Bacon
6*9b1b5ec6SEvan Baconexport type Options = Pick<NodePackageManagerForProject, 'npm' | 'pnpm' | 'yarn' | 'bun'> & {
7c94ad8a2SEvan Bacon  /** Check which packages need to be updated, does not install any provided packages. */
8c94ad8a2SEvan Bacon  check?: boolean;
9c94ad8a2SEvan Bacon  /** Should the dependencies be fixed automatically. */
10c94ad8a2SEvan Bacon  fix?: boolean;
116caf5755SEvan Bacon  /** Should disable install output, used for commands like `prebuild` that run install internally. */
126caf5755SEvan Bacon  silent?: boolean;
13c94ad8a2SEvan Bacon};
1409bb6093SEvan Bacon
1509bb6093SEvan Baconfunction resolveOptions(options: Options): Options {
16c94ad8a2SEvan Bacon  if (options.fix && options.check) {
17c94ad8a2SEvan Bacon    throw new CommandError('BAD_ARGS', 'Specify at most one of: --check, --fix');
18c94ad8a2SEvan Bacon  }
19*9b1b5ec6SEvan Bacon  if ([options.npm, options.pnpm, options.yarn, options.bun].filter(Boolean).length > 1) {
20*9b1b5ec6SEvan Bacon    throw new CommandError('BAD_ARGS', 'Specify at most one of: --npm, --pnpm, --yarn, --bun');
2109bb6093SEvan Bacon  }
2209bb6093SEvan Bacon  return {
2309bb6093SEvan Bacon    ...options,
2409bb6093SEvan Bacon  };
2509bb6093SEvan Bacon}
2609bb6093SEvan Bacon
2709bb6093SEvan Baconexport async function resolveArgsAsync(
2809bb6093SEvan Bacon  argv: string[]
2909bb6093SEvan Bacon): Promise<{ variadic: string[]; options: Options; extras: string[] }> {
3009bb6093SEvan Bacon  const { variadic, extras, flags } = parseVariadicArguments(argv);
3109bb6093SEvan Bacon
32e0694585SCedric van Putten  assertUnexpectedVariadicFlags(
33*9b1b5ec6SEvan Bacon    ['--check', '--fix', '--npm', '--pnpm', '--yarn', '--bun'],
34e0694585SCedric van Putten    { variadic, extras, flags },
35e0694585SCedric van Putten    'npx expo install'
36e0694585SCedric van Putten  );
3709bb6093SEvan Bacon
3809bb6093SEvan Bacon  return {
3909bb6093SEvan Bacon    // Variadic arguments like `npx expo install react react-dom` -> ['react', 'react-dom']
4009bb6093SEvan Bacon    variadic,
4109bb6093SEvan Bacon    options: resolveOptions({
42c94ad8a2SEvan Bacon      fix: !!flags['--fix'],
43c94ad8a2SEvan Bacon      check: !!flags['--check'],
4409bb6093SEvan Bacon      yarn: !!flags['--yarn'],
4509bb6093SEvan Bacon      npm: !!flags['--npm'],
466caf5755SEvan Bacon      pnpm: !!flags['--pnpm'],
47*9b1b5ec6SEvan Bacon      bun: !!flags['--bun'],
4809bb6093SEvan Bacon    }),
4909bb6093SEvan Bacon    extras,
5009bb6093SEvan Bacon  };
5109bb6093SEvan Bacon}
52