1*97e1898cSEvan Baconimport JsonFile from '@expo/json-file';
2*97e1898cSEvan Baconimport resolveFrom from 'resolve-from';
3*97e1898cSEvan Bacon
4*97e1898cSEvan Baconimport { ExpoConfig } from './Config.types';
5*97e1898cSEvan Baconimport { ConfigError } from './Errors';
6*97e1898cSEvan Bacon
7*97e1898cSEvan Bacon/**
8*97e1898cSEvan Bacon * Resolve the Expo SDK Version either from the input Expo config or from the installed
9*97e1898cSEvan Bacon * version of the `expo` package.
10*97e1898cSEvan Bacon */
11*97e1898cSEvan Baconexport function getExpoSDKVersion(
12*97e1898cSEvan Bacon  projectRoot: string,
13*97e1898cSEvan Bacon  exp: Pick<ExpoConfig, 'sdkVersion'> = {}
14*97e1898cSEvan Bacon): string {
15*97e1898cSEvan Bacon  return exp?.sdkVersion ?? getExpoSDKVersionFromPackage(projectRoot);
16*97e1898cSEvan Bacon}
17*97e1898cSEvan Bacon
18*97e1898cSEvan Bacon/**
19*97e1898cSEvan Bacon * Resolve the Expo SDK Version either from the input Expo config or from the installed
20*97e1898cSEvan Bacon * version of the `expo` package.
21*97e1898cSEvan Bacon */
22*97e1898cSEvan Baconfunction getExpoSDKVersionFromPackage(projectRoot: string): string {
23*97e1898cSEvan Bacon  const packageJsonPath = resolveFrom.silent(projectRoot, 'expo/package.json');
24*97e1898cSEvan Bacon  if (!packageJsonPath) {
25*97e1898cSEvan Bacon    throw new ConfigError(
26*97e1898cSEvan Bacon      `Cannot determine which native SDK version your project uses because the module \`expo\` is not installed. Please install it with \`yarn add expo\` and try again.`,
27*97e1898cSEvan Bacon      'MODULE_NOT_FOUND'
28*97e1898cSEvan Bacon    );
29*97e1898cSEvan Bacon  }
30*97e1898cSEvan Bacon  const expoPackageJson = JsonFile.read(packageJsonPath, { json5: true });
31*97e1898cSEvan Bacon  const { version: packageVersion } = expoPackageJson;
32*97e1898cSEvan Bacon
33*97e1898cSEvan Bacon  if (!(typeof packageVersion === 'string')) {
34*97e1898cSEvan Bacon    // This is technically impossible.
35*97e1898cSEvan Bacon    throw new ConfigError(
36*97e1898cSEvan Bacon      `Cannot determine which native SDK version your project uses because the module \`expo\` has an invalid package.json (missing \`version\` field). Try reinstalling node modules and trying again.`,
37*97e1898cSEvan Bacon      'MODULE_NOT_FOUND'
38*97e1898cSEvan Bacon    );
39*97e1898cSEvan Bacon  }
40*97e1898cSEvan Bacon
41*97e1898cSEvan Bacon  const majorVersion = packageVersion.split('.').shift();
42*97e1898cSEvan Bacon  return `${majorVersion}.0.0`;
43*97e1898cSEvan Bacon}
44