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