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