1c4ef02aeSEvan Bacon#!/usr/bin/env node 2c4ef02aeSEvan Baconimport arg from 'arg'; 3c4ef02aeSEvan Baconimport chalk from 'chalk'; 4c4ef02aeSEvan Baconimport path from 'path'; 5c4ef02aeSEvan Bacon 68a424bebSJames Ideimport { XcodeConfiguration } from './XcodeBuild.types'; 7c4ef02aeSEvan Baconimport { Command } from '../../../bin/cli'; 8c4ef02aeSEvan Baconimport { assertWithOptionsArgs, printHelp } from '../../utils/args'; 9c4ef02aeSEvan Baconimport { logCmdError } from '../../utils/errors'; 10c4ef02aeSEvan Bacon 11c4ef02aeSEvan Baconexport const expoRunIos: Command = async (argv) => { 12c4ef02aeSEvan Bacon const rawArgsMap: arg.Spec = { 13c4ef02aeSEvan Bacon // Types 14c4ef02aeSEvan Bacon '--help': Boolean, 15c4ef02aeSEvan Bacon '--no-build-cache': Boolean, 16c4ef02aeSEvan Bacon '--no-install': Boolean, 17c4ef02aeSEvan Bacon '--no-bundler': Boolean, 18c4ef02aeSEvan Bacon '--configuration': String, 19c4ef02aeSEvan Bacon 20c4ef02aeSEvan Bacon '--port': Number, 21c4ef02aeSEvan Bacon // Aliases 22c4ef02aeSEvan Bacon '-p': '--port', 23c4ef02aeSEvan Bacon 24c4ef02aeSEvan Bacon '-h': '--help', 25c4ef02aeSEvan Bacon }; 26c4ef02aeSEvan Bacon const args = assertWithOptionsArgs(rawArgsMap, { 27c4ef02aeSEvan Bacon argv, 28c4ef02aeSEvan Bacon 29c4ef02aeSEvan Bacon permissive: true, 30c4ef02aeSEvan Bacon }); 31c4ef02aeSEvan Bacon 32c4ef02aeSEvan Bacon // '-d' -> '--device': Boolean, 33c4ef02aeSEvan Bacon // '--scheme': String, 34c4ef02aeSEvan Bacon 35c4ef02aeSEvan Bacon if (args['--help']) { 36c4ef02aeSEvan Bacon printHelp( 37c4ef02aeSEvan Bacon `Run the iOS app binary locally`, 38c4ef02aeSEvan Bacon `npx expo run:ios`, 39c4ef02aeSEvan Bacon [ 40c4ef02aeSEvan Bacon `--no-build-cache Clear the native derived data before building`, 41c4ef02aeSEvan Bacon `--no-install Skip installing dependencies`, 42c4ef02aeSEvan Bacon `--no-bundler Skip starting the Metro bundler`, 43c4ef02aeSEvan Bacon `--scheme [scheme] Scheme to build`, 44c4ef02aeSEvan Bacon chalk`--configuration <configuration> Xcode configuration to use. Debug or Release. {dim Default: Debug}`, 45c4ef02aeSEvan Bacon `-d, --device [device] Device name or UDID to build the app on`, 46c4ef02aeSEvan Bacon chalk`-p, --port <port> Port to start the Metro bundler on. {dim Default: 8081}`, 47c4ef02aeSEvan Bacon `-h, --help Usage info`, 48c4ef02aeSEvan Bacon ].join('\n'), 49c4ef02aeSEvan Bacon [ 50c4ef02aeSEvan Bacon '', 51c4ef02aeSEvan Bacon chalk` Build for production (unsigned) with the {bold Release} configuration:`, 52c4ef02aeSEvan Bacon chalk` {dim $} npx expo run:ios --configuration Release`, 53c4ef02aeSEvan Bacon '', 54c4ef02aeSEvan Bacon ].join('\n') 55c4ef02aeSEvan Bacon ); 56c4ef02aeSEvan Bacon } 57c4ef02aeSEvan Bacon 58*1a3a1db5SEvan Bacon const { resolveStringOrBooleanArgsAsync } = await import('../../utils/resolveArgs.js'); 59c4ef02aeSEvan Bacon const parsed = await resolveStringOrBooleanArgsAsync(argv ?? [], rawArgsMap, { 60c4ef02aeSEvan Bacon '--scheme': Boolean, 61c4ef02aeSEvan Bacon '--device': Boolean, 62c4ef02aeSEvan Bacon '-d': '--device', 63c4ef02aeSEvan Bacon }).catch(logCmdError); 64c4ef02aeSEvan Bacon 65*1a3a1db5SEvan Bacon const { runIosAsync } = await import('./runIosAsync.js'); 66c4ef02aeSEvan Bacon return runIosAsync(path.resolve(parsed.projectRoot), { 67c4ef02aeSEvan Bacon // Parsed options 68c4ef02aeSEvan Bacon buildCache: !args['--no-build-cache'], 69c4ef02aeSEvan Bacon install: !args['--no-install'], 70c4ef02aeSEvan Bacon bundler: !args['--no-bundler'], 71c4ef02aeSEvan Bacon port: args['--port'], 72c4ef02aeSEvan Bacon 73c4ef02aeSEvan Bacon // Custom parsed args 74c4ef02aeSEvan Bacon device: parsed.args['--device'], 75c4ef02aeSEvan Bacon scheme: parsed.args['--scheme'], 76c4ef02aeSEvan Bacon configuration: parsed.args['--configuration'] as XcodeConfiguration, 77c4ef02aeSEvan Bacon }).catch(logCmdError); 78c4ef02aeSEvan Bacon}; 79