1*964fdd0aSCedric van Puttenimport assert from 'assert';
2*964fdd0aSCedric van Puttenimport fs from 'fs';
3*964fdd0aSCedric van Puttenimport os from 'os';
4*964fdd0aSCedric van Puttenimport path from 'path';
5*964fdd0aSCedric van Putten
6*964fdd0aSCedric van Putten/**
7*964fdd0aSCedric van Putten * The default Android SDK locations per platform.
8*964fdd0aSCedric van Putten * @see https://developer.android.com/studio/run/emulator-commandline#filedir
9*964fdd0aSCedric van Putten * @see https://developer.android.com/studio/intro/studio-config#optimize-studio-windows
10*964fdd0aSCedric van Putten */
11*964fdd0aSCedric van Puttenconst ANDROID_DEFAULT_LOCATION: Readonly<Partial<Record<NodeJS.Platform, string>>> = {
12*964fdd0aSCedric van Putten  darwin: path.join(os.homedir(), 'Library', 'Android', 'sdk'),
13*964fdd0aSCedric van Putten  linux: path.join(os.homedir(), 'Android', 'sdk'),
14*964fdd0aSCedric van Putten  win32: path.join(os.homedir(), 'AppData', 'Local', 'Android', 'Sdk'),
15*964fdd0aSCedric van Putten};
16*964fdd0aSCedric van Putten
17*964fdd0aSCedric van Putten/**
18*964fdd0aSCedric van Putten * Resolve and validate the root folder where the Android SDK has been installed.
19*964fdd0aSCedric van Putten * This checks both `ANDROID_HOME`, `ANDROID_SDK_ROOT`, and the default path for the current platform.
20*964fdd0aSCedric van Putten * @see https://developer.android.com/studio/command-line/variables
21*964fdd0aSCedric van Putten */
22*964fdd0aSCedric van Puttenexport function assertSdkRoot() {
23*964fdd0aSCedric van Putten  if (process.env.ANDROID_HOME) {
24*964fdd0aSCedric van Putten    assert(
25*964fdd0aSCedric van Putten      fs.existsSync(process.env.ANDROID_HOME),
26*964fdd0aSCedric van Putten      `Failed to resolve the Android SDK path. ANDROID_HOME is set to a non-existing path: ${process.env.ANDROID_HOME}`
27*964fdd0aSCedric van Putten    );
28*964fdd0aSCedric van Putten    return process.env.ANDROID_HOME;
29*964fdd0aSCedric van Putten  }
30*964fdd0aSCedric van Putten
31*964fdd0aSCedric van Putten  if (process.env.ANDROID_SDK_ROOT) {
32*964fdd0aSCedric van Putten    assert(
33*964fdd0aSCedric van Putten      fs.existsSync(process.env.ANDROID_SDK_ROOT),
34*964fdd0aSCedric van Putten      `Failed to resolve the Android SDK path. Deprecated ANDROID_SDK_ROOT is set to a non-existing path: ${process.env.ANDROID_SDK_ROOT}. Use ANDROID_HOME instead.`
35*964fdd0aSCedric van Putten    );
36*964fdd0aSCedric van Putten    return process.env.ANDROID_SDK_ROOT;
37*964fdd0aSCedric van Putten  }
38*964fdd0aSCedric van Putten
39*964fdd0aSCedric van Putten  const defaultLocation = ANDROID_DEFAULT_LOCATION[process.platform];
40*964fdd0aSCedric van Putten  if (defaultLocation) {
41*964fdd0aSCedric van Putten    assert(
42*964fdd0aSCedric van Putten      fs.existsSync(defaultLocation),
43*964fdd0aSCedric van Putten      `Failed to resolve the Android SDK path. Default install location not found: ${defaultLocation}. Use ANDROID_HOME to set the Android SDK location.`
44*964fdd0aSCedric van Putten    );
45*964fdd0aSCedric van Putten    return defaultLocation;
46*964fdd0aSCedric van Putten  }
47*964fdd0aSCedric van Putten
48*964fdd0aSCedric van Putten  return null;
49*964fdd0aSCedric van Putten}
50