1import arg from 'arg';
2import path from 'path';
3
4import { env } from '../../utils/env';
5import { CommandError } from '../../utils/errors';
6import { resolveCustomBooleanArgsAsync } from '../../utils/resolveArgs';
7
8export interface Options {
9  assetsDest?: string;
10  assetCatalogDest?: string;
11  entryFile: string;
12  resetCache: boolean;
13  resetGlobalCache: boolean;
14  transformer?: string;
15  minify?: boolean;
16  config?: string;
17  platform: string;
18  dev: boolean;
19  bundleOutput: string;
20  bundleEncoding?: string;
21  maxWorkers?: number;
22  sourcemapOutput?: string;
23  sourcemapSourcesRoot?: string;
24  sourcemapUseAbsolutePath: boolean;
25  verbose: boolean;
26  unstableTransformProfile: string;
27}
28
29function assertIsBoolean(val: any): asserts val is boolean {
30  if (typeof val !== 'boolean') {
31    throw new CommandError(`Expected boolean, got ${typeof val}`);
32  }
33}
34
35export function resolveOptions(
36  args: arg.Result<arg.Spec>,
37  parsed: Awaited<ReturnType<typeof resolveCustomBooleanArgsAsync>>
38): Options {
39  const dev = parsed.args['--dev'] ?? true;
40  assertIsBoolean(dev);
41
42  const minify = parsed.args['--minify'] ?? !dev;
43  assertIsBoolean(minify);
44
45  const entryFile = args['--entry-file'];
46  if (!entryFile) {
47    throw new CommandError(`Missing required argument: --entry-file`);
48  }
49  const bundleOutput = args['--bundle-output'];
50  if (!bundleOutput) {
51    throw new CommandError(`Missing required argument: --bundle-output`);
52  }
53  return {
54    entryFile,
55    assetCatalogDest: args['--asset-catalog-dest'],
56    platform: args['--platform'] ?? 'ios',
57    transformer: args['--transformer'],
58    // TODO: Support `--dev false`
59    //   dev: false,
60    bundleOutput,
61    bundleEncoding: args['--bundle-encoding'] ?? 'utf8',
62    maxWorkers: args['--max-workers'],
63    sourcemapOutput: args['--sourcemap-output'],
64    sourcemapSourcesRoot: args['--sourcemap-sources-root'],
65    sourcemapUseAbsolutePath: !!parsed.args['--sourcemap-use-absolute-path'],
66    assetsDest: args['--assets-dest'],
67    unstableTransformProfile: args['--unstable-transform-profile'] ?? 'default',
68    resetCache: !!parsed.args['--reset-cache'],
69    resetGlobalCache: false,
70    verbose: args['--verbose'] ?? env.EXPO_DEBUG,
71    config: args['--config'] ? path.resolve(args['--config']) : undefined,
72    dev,
73    minify,
74  };
75}
76