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