1dfe12d45SEvan Baconimport { getConfig } from '@expo/config';
2dfe12d45SEvan Bacon
3dfe12d45SEvan Baconimport { queryAndGenerateAsync, selectAndGenerateAsync } from './generate';
4dfe12d45SEvan Baconimport { Options } from './resolveOptions';
5dfe12d45SEvan Baconimport { DestinationResolutionProps } from './templates';
6*8a424bebSJames Ideimport { findUpProjectRootOrAssert } from '../utils/findUp';
7*8a424bebSJames Ideimport { setNodeEnv } from '../utils/nodeEnv';
8dfe12d45SEvan Bacon
9dfe12d45SEvan Baconexport async function customizeAsync(files: string[], options: Options, extras: any[]) {
102dd43328SEvan Bacon  setNodeEnv('development');
11dfe12d45SEvan Bacon  // Locate the project root based on the process current working directory.
12dfe12d45SEvan Bacon  // This enables users to run `npx expo customize` from a subdirectory of the project.
13dfe12d45SEvan Bacon  const projectRoot = findUpProjectRootOrAssert(process.cwd());
14dfe12d45SEvan Bacon
156a750d06SEvan Bacon  require('@expo/env').load(projectRoot);
166a750d06SEvan Bacon
17dfe12d45SEvan Bacon  // Get the static path (defaults to 'web/')
18dfe12d45SEvan Bacon  // Doesn't matter if expo is installed or which mode is used.
19dfe12d45SEvan Bacon  const { exp } = getConfig(projectRoot, {
20dfe12d45SEvan Bacon    skipSDKVersionRequirement: true,
21dfe12d45SEvan Bacon  });
22dfe12d45SEvan Bacon
23dfe12d45SEvan Bacon  // Create the destination resolution props which are used in both
24dfe12d45SEvan Bacon  // the query and select functions.
25dfe12d45SEvan Bacon  const props: DestinationResolutionProps = {
26dfe12d45SEvan Bacon    webStaticPath: exp.web?.staticPath ?? 'web',
27dfe12d45SEvan Bacon  };
28dfe12d45SEvan Bacon
29dfe12d45SEvan Bacon  // If the user provided files, we'll generate them without prompting.
30dfe12d45SEvan Bacon  if (files.length) {
31dfe12d45SEvan Bacon    return queryAndGenerateAsync(projectRoot, {
32dfe12d45SEvan Bacon      files,
33dfe12d45SEvan Bacon      props,
34dfe12d45SEvan Bacon      extras,
35dfe12d45SEvan Bacon    });
36dfe12d45SEvan Bacon  }
37dfe12d45SEvan Bacon
38dfe12d45SEvan Bacon  // Otherwise, we'll prompt the user to select which files to generate.
39dfe12d45SEvan Bacon  await selectAndGenerateAsync(projectRoot, {
40dfe12d45SEvan Bacon    props,
41dfe12d45SEvan Bacon    extras,
42dfe12d45SEvan Bacon  });
43dfe12d45SEvan Bacon}
44