1*8df9096fSEvan Baconimport { ExpoConfig, getAccountUsername, getDefaultTarget, getPackageJson } from '@expo/config'; 28d307f52SEvan Baconimport JsonFile, { JSONValue } from '@expo/json-file'; 38d307f52SEvan Baconimport resolveFrom from 'resolve-from'; 48d307f52SEvan Bacon 58d307f52SEvan Baconimport { memoize } from '../fn'; 68d307f52SEvan Bacon 78d307f52SEvan Baconconst getAccountName = memoize((exp: Pick<ExpoConfig, 'owner'>) => { 88d307f52SEvan Bacon return getAccountUsername(exp); 98d307f52SEvan Bacon}); 108d307f52SEvan Bacon 11*8df9096fSEvan Bacon/** @returns true if the expo-dev-client package is found in the project `package.json` file. */ 12*8df9096fSEvan Baconexport function hasDirectDevClientDependency(projectRoot: string): boolean { 13*8df9096fSEvan Bacon const pkg = getPackageJson(projectRoot); 14*8df9096fSEvan Bacon return !!pkg.dependencies?.['expo-dev-client'] || !!pkg.devDependencies?.['expo-dev-client']; 15*8df9096fSEvan Bacon} 16*8df9096fSEvan Bacon 178d307f52SEvan Baconconst getDevClientVersion = memoize((projectRoot: string): JSONValue | undefined => { 188d307f52SEvan Bacon try { 198d307f52SEvan Bacon const devClientPackage = resolveFrom.silent(projectRoot, 'expo-dev-client/package.json'); 208d307f52SEvan Bacon if (devClientPackage) { 218d307f52SEvan Bacon return JsonFile.read(devClientPackage).version; 228d307f52SEvan Bacon } 238d307f52SEvan Bacon } catch {} 248d307f52SEvan Bacon return undefined; 258d307f52SEvan Bacon}); 268d307f52SEvan Bacon 278d307f52SEvan Baconconst getProjectType = memoize((projectRoot: string): 'managed' | 'generic' => { 288d307f52SEvan Bacon return getDefaultTarget(projectRoot) === 'managed' ? 'managed' : 'generic'; 298d307f52SEvan Bacon}); 308d307f52SEvan Bacon 318d307f52SEvan Baconexport default function getDevClientProperties(projectRoot: string, exp: ExpoConfig) { 328d307f52SEvan Bacon return { 338d307f52SEvan Bacon account_name: getAccountName({ owner: exp.owner }), 348d307f52SEvan Bacon dev_client_version: getDevClientVersion(projectRoot), 358d307f52SEvan Bacon project_type: getProjectType(projectRoot), 368d307f52SEvan Bacon uptime_ms: process.uptime() * 1000, 378d307f52SEvan Bacon }; 388d307f52SEvan Bacon} 39