1import { ExpoConfig, getAccountUsername, getDefaultTarget, getPackageJson } from '@expo/config'; 2import JsonFile, { JSONValue } from '@expo/json-file'; 3import resolveFrom from 'resolve-from'; 4 5import { memoize } from '../fn'; 6 7const getAccountName = memoize((exp: Pick<ExpoConfig, 'owner'>) => { 8 return getAccountUsername(exp); 9}); 10 11/** @returns true if the expo-dev-client package is found in the project `package.json` file. */ 12export function hasDirectDevClientDependency(projectRoot: string): boolean { 13 const pkg = getPackageJson(projectRoot); 14 return !!pkg.dependencies?.['expo-dev-client'] || !!pkg.devDependencies?.['expo-dev-client']; 15} 16 17const getDevClientVersion = memoize((projectRoot: string): JSONValue | undefined => { 18 try { 19 const devClientPackage = resolveFrom.silent(projectRoot, 'expo-dev-client/package.json'); 20 if (devClientPackage) { 21 return JsonFile.read(devClientPackage).version; 22 } 23 } catch {} 24 return undefined; 25}); 26 27const getProjectType = memoize((projectRoot: string): 'managed' | 'generic' => { 28 return getDefaultTarget(projectRoot) === 'managed' ? 'managed' : 'generic'; 29}); 30 31export default function getDevClientProperties(projectRoot: string, exp: ExpoConfig) { 32 return { 33 account_name: getAccountName({ owner: exp.owner }), 34 dev_client_version: getDevClientVersion(projectRoot), 35 project_type: getProjectType(projectRoot), 36 uptime_ms: process.uptime() * 1000, 37 }; 38} 39