18d307f52SEvan Baconimport { ProjectConfig } from '@expo/config'; 28d307f52SEvan Baconimport { getEntryPoint } from '@expo/config/paths'; 38d307f52SEvan Baconimport chalk from 'chalk'; 48d307f52SEvan Baconimport path from 'path'; 58d307f52SEvan Bacon 68d307f52SEvan Baconimport { CommandError } from '../../../utils/errors'; 78d307f52SEvan Bacon 8921ca1b4SJon Sampconst supportedPlatforms = ['ios', 'android', 'web', 'none']; 98d307f52SEvan Bacon 10*be2ffbefSEvan Bacon/** @returns the relative entry file for the project. */ 118d307f52SEvan Baconexport function resolveEntryPoint( 128d307f52SEvan Bacon projectRoot: string, 138d307f52SEvan Bacon platform?: string, 148d307f52SEvan Bacon projectConfig?: ProjectConfig 158d307f52SEvan Bacon): string { 16*be2ffbefSEvan Bacon return path.relative( 17*be2ffbefSEvan Bacon projectRoot, 18*be2ffbefSEvan Bacon resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig) 19*be2ffbefSEvan Bacon ); 20*be2ffbefSEvan Bacon} 21*be2ffbefSEvan Bacon 22*be2ffbefSEvan Bacon/** @returns the absolute entry file for the project. */ 23*be2ffbefSEvan Baconexport function resolveAbsoluteEntryPoint( 24*be2ffbefSEvan Bacon projectRoot: string, 25*be2ffbefSEvan Bacon platform?: string, 26*be2ffbefSEvan Bacon projectConfig?: ProjectConfig 27*be2ffbefSEvan Bacon): string { 288d307f52SEvan Bacon if (platform && !supportedPlatforms.includes(platform)) { 298d307f52SEvan Bacon throw new CommandError( 308d307f52SEvan Bacon `Failed to resolve the project's entry file: The platform "${platform}" is not supported.` 318d307f52SEvan Bacon ); 328d307f52SEvan Bacon } 338d307f52SEvan Bacon // TODO(Bacon): support platform extension resolution like .ios, .native 348d307f52SEvan Bacon // const platforms = [platform, 'native'].filter(Boolean) as string[]; 358d307f52SEvan Bacon const platforms: string[] = []; 368d307f52SEvan Bacon 378d307f52SEvan Bacon const entry = getEntryPoint(projectRoot, ['./index'], platforms, projectConfig); 388d307f52SEvan Bacon if (!entry) { 398d307f52SEvan Bacon // NOTE(Bacon): I purposefully don't mention all possible resolutions here since the package.json is the most standard and users should opt towards that. 408d307f52SEvan Bacon throw new CommandError( 418d307f52SEvan Bacon chalk`The project entry file could not be resolved. Please define it in the {bold package.json} "main" field.` 428d307f52SEvan Bacon ); 438d307f52SEvan Bacon } 448d307f52SEvan Bacon 45*be2ffbefSEvan Bacon return entry; 468d307f52SEvan Bacon} 47