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