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  generateStaticViewConfigs: boolean;
28}
29
30function assertIsBoolean(val: any): asserts val is boolean {
31  if (typeof val !== 'boolean') {
32    throw new CommandError(`Expected boolean, got ${typeof val}`);
33  }
34}
35
36export function resolveOptions(
37  args: arg.Result<arg.Spec>,
38  parsed: Awaited<ReturnType<typeof resolveCustomBooleanArgsAsync>>
39): Options {
40  const dev = parsed.args['--dev'] ?? true;
41  assertIsBoolean(dev);
42
43  const generateStaticViewConfigs = parsed.args['--generate-static-view-configs'] ?? true;
44  assertIsBoolean(generateStaticViewConfigs);
45
46  const minify = parsed.args['--minify'] ?? true;
47  assertIsBoolean(minify);
48
49  const entryFile = args['--entry-file'];
50  if (!entryFile) {
51    throw new CommandError(`Missing required argument: --entry-file`);
52  }
53  const bundleOutput = args['--bundle-output'];
54  if (!bundleOutput) {
55    throw new CommandError(`Missing required argument: --bundle-output`);
56  }
57  return {
58    entryFile,
59    assetCatalogDest: args['--asset-catalog-dest'],
60    platform: args['--platform'] ?? 'ios',
61    transformer: args['--transformer'],
62    // TODO: Support `--dev false`
63    //   dev: false,
64    bundleOutput,
65    bundleEncoding: args['--bundle-encoding'] ?? 'utf8',
66    maxWorkers: args['--max-workers'],
67    sourcemapOutput: args['--sourcemap-output'],
68    sourcemapSourcesRoot: args['--sourcemap-sources-root'],
69    sourcemapUseAbsolutePath: !!parsed.args['--sourcemap-use-absolute-path'],
70    assetsDest: args['--assets-dest'],
71    unstableTransformProfile: args['--unstable-transform-profile'],
72    resetCache: !!parsed.args['--reset-cache'],
73    resetGlobalCache: false,
74    verbose: args['--verbose'] ?? env.EXPO_DEBUG,
75    config: args['--config'] ? path.resolve(args['--config']) : undefined,
76    dev,
77    generateStaticViewConfigs,
78    minify,
79  };
80}
81