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