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