1*c4ef02aeSEvan Baconimport { sync as globSync } from 'glob';
2*c4ef02aeSEvan Bacon
3*c4ef02aeSEvan Baconimport { CommandError } from '../../../utils/errors';
4*c4ef02aeSEvan Baconimport { ProjectInfo } from '../XcodeBuild.types';
5*c4ef02aeSEvan Bacon
6*c4ef02aeSEvan Baconconst ignoredPaths = ['**/@(Carthage|Pods|vendor|node_modules)/**'];
7*c4ef02aeSEvan Bacon
8*c4ef02aeSEvan Baconfunction findXcodeProjectPaths(
9*c4ef02aeSEvan Bacon  projectRoot: string,
10*c4ef02aeSEvan Bacon  extension: 'xcworkspace' | 'xcodeproj'
11*c4ef02aeSEvan Bacon): string[] {
12*c4ef02aeSEvan Bacon  return globSync(`ios/*.${extension}`, {
13*c4ef02aeSEvan Bacon    absolute: true,
14*c4ef02aeSEvan Bacon    cwd: projectRoot,
15*c4ef02aeSEvan Bacon    ignore: ignoredPaths,
16*c4ef02aeSEvan Bacon  });
17*c4ef02aeSEvan Bacon}
18*c4ef02aeSEvan Bacon
19*c4ef02aeSEvan Bacon/** Return the path and type of Xcode project in the given folder. */
20*c4ef02aeSEvan Baconexport function resolveXcodeProject(projectRoot: string): ProjectInfo {
21*c4ef02aeSEvan Bacon  let paths = findXcodeProjectPaths(projectRoot, 'xcworkspace');
22*c4ef02aeSEvan Bacon  if (paths.length) {
23*c4ef02aeSEvan Bacon    return {
24*c4ef02aeSEvan Bacon      // Use full path instead of relative project root so that warnings and errors contain full paths as well, this helps with filtering.
25*c4ef02aeSEvan Bacon      // Also helps keep things consistent in monorepos.
26*c4ef02aeSEvan Bacon      name: paths[0],
27*c4ef02aeSEvan Bacon      // name: path.relative(projectRoot, paths[0]),
28*c4ef02aeSEvan Bacon      isWorkspace: true,
29*c4ef02aeSEvan Bacon    };
30*c4ef02aeSEvan Bacon  }
31*c4ef02aeSEvan Bacon  paths = findXcodeProjectPaths(projectRoot, 'xcodeproj');
32*c4ef02aeSEvan Bacon  if (paths.length) {
33*c4ef02aeSEvan Bacon    return { name: paths[0], isWorkspace: false };
34*c4ef02aeSEvan Bacon  }
35*c4ef02aeSEvan Bacon  throw new CommandError(
36*c4ef02aeSEvan Bacon    'IOS_MALFORMED',
37*c4ef02aeSEvan Bacon    `Xcode project not found in project: ${projectRoot}. You can generate a project with \`npx expo prebuild\``
38*c4ef02aeSEvan Bacon  );
39*c4ef02aeSEvan Bacon}
40