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