1c4ef02aeSEvan Baconimport chalk from 'chalk'; 2c4ef02aeSEvan Bacon 3c4ef02aeSEvan Baconimport * as SimControl from '../../../start/platforms/ios/simctl'; 4c4ef02aeSEvan Baconimport prompt from '../../../utils/prompts'; 5c4ef02aeSEvan Baconimport { ConnectedDevice } from '../appleDevice/AppleDevice'; 6c4ef02aeSEvan Bacon 7c4ef02aeSEvan Bacontype AnyDevice = SimControl.Device | ConnectedDevice; 8c4ef02aeSEvan Bacon 9c4ef02aeSEvan Baconfunction isConnectedDevice(item: AnyDevice): item is ConnectedDevice { 10c4ef02aeSEvan Bacon return 'deviceType' in item; 11c4ef02aeSEvan Bacon} 12c4ef02aeSEvan Bacon 13c4ef02aeSEvan Baconfunction isSimControlDevice(item: AnyDevice): item is SimControl.Device { 14c4ef02aeSEvan Bacon return 'state' in item; 15c4ef02aeSEvan Bacon} 16c4ef02aeSEvan Bacon 17c4ef02aeSEvan Bacon/** Format a device for the prompt list. Exposed for testing. */ 18c4ef02aeSEvan Baconexport function formatDeviceChoice(item: AnyDevice): { title: string; value: string } { 19c4ef02aeSEvan Bacon const isConnected = isConnectedDevice(item) && item.deviceType === 'device'; 20c4ef02aeSEvan Bacon const isActive = isSimControlDevice(item) && item.state === 'Booted'; 21*bd710fa0SBartosz Kaszubowski const symbol = isConnected ? (item.connectionType === 'Network' ? ' ' : ' ') : ''; 22c4ef02aeSEvan Bacon const format = isActive ? chalk.bold : (text: string) => text; 23c4ef02aeSEvan Bacon return { 24c4ef02aeSEvan Bacon title: `${symbol}${format(item.name)}${ 25c4ef02aeSEvan Bacon item.osVersion ? chalk.dim(` (${item.osVersion})`) : '' 26c4ef02aeSEvan Bacon }`, 27c4ef02aeSEvan Bacon value: item.udid, 28c4ef02aeSEvan Bacon }; 29c4ef02aeSEvan Bacon} 30c4ef02aeSEvan Bacon 31c4ef02aeSEvan Bacon/** Prompt to select a device from a searchable list of devices. */ 32c4ef02aeSEvan Baconexport async function promptDeviceAsync(devices: AnyDevice[]): Promise<AnyDevice> { 33c4ef02aeSEvan Bacon // --device with no props after 34c4ef02aeSEvan Bacon const { value } = await prompt({ 35c4ef02aeSEvan Bacon type: 'autocomplete', 36c4ef02aeSEvan Bacon name: 'value', 37c4ef02aeSEvan Bacon limit: 11, 38c4ef02aeSEvan Bacon message: 'Select a device', 39c4ef02aeSEvan Bacon choices: devices.map((item) => formatDeviceChoice(item)), 40c4ef02aeSEvan Bacon suggest: (input: any, choices: any) => { 41c4ef02aeSEvan Bacon const regex = new RegExp(input, 'i'); 42c4ef02aeSEvan Bacon return choices.filter((choice: any) => regex.test(choice.title)); 43c4ef02aeSEvan Bacon }, 44c4ef02aeSEvan Bacon }); 45c4ef02aeSEvan Bacon return devices.find((device) => device.udid === value)!; 46c4ef02aeSEvan Bacon} 47