xref: /expo/packages/@expo/cli/src/run/ios/index.ts (revision 1a3a1db5)
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