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