Skip to content

Commit

Permalink
Add support for Android dotcommands. (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
itsspriyansh authored Aug 19, 2024
1 parent 8e6d44d commit 61711ef
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 4 deletions.
96 changes: 96 additions & 0 deletions src/commands/android/dotcommands.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import colors from 'ansi-colors';
import {spawnSync} from 'child_process';
import * as dotenv from 'dotenv';
import path from 'path';

import {ANDROID_DOTCOMMANDS} from '../../constants';
import Logger from '../../logger';
import {getPlatformName} from '../../utils';
import {Platform, SdkBinary} from './interfaces';
import {checkJavaInstallation, getBinaryLocation, getBinaryNameForOS, getSdkRootFromEnv} from './utils/common';

export class AndroidDotCommand {
dotcmd: string;
args: string[];
sdkRoot: string;
rootDir: string;
platform: Platform;
androidHomeInGlobalEnv: boolean;

constructor(dotcmd: string, argv: string[], rootDir = process.cwd()) {
this.dotcmd = dotcmd;
this.args = argv.slice(1);
this.sdkRoot = '';
this.rootDir = rootDir;
this.platform = getPlatformName();
this.androidHomeInGlobalEnv = false;
}

async run(): Promise<boolean> {
if (!ANDROID_DOTCOMMANDS.includes(this.dotcmd)) {
Logger.log(colors.red(`Unknown dot command passed: ${this.dotcmd}\n`));

Logger.log('Run Android SDK command line tools using the following command:');
Logger.log(colors.cyan('npx @nightwatch/mobile-helper <DOTCMD> [options|args]\n'));

Logger.log(`Available Dot Commands: ${colors.magenta(ANDROID_DOTCOMMANDS.join(', '))}`);
Logger.log(`(Example command: ${colors.gray('npx @nightwatch/mobile-helper android.emulator @nightwatch-android-11')})\n`);

return false;
}

const javaInstalled = checkJavaInstallation(this.rootDir);
if (!javaInstalled) {
return false;
}

this.loadEnvFromDotEnv();

const sdkRootEnv = getSdkRootFromEnv(this.rootDir, this.androidHomeInGlobalEnv);
if (!sdkRootEnv) {
Logger.log(`Run: ${colors.cyan('npx @nightwatch/mobile-helper android --standalone')} to fix this issue.`);
Logger.log(`(Remove the ${colors.gray('--standalone')} flag from the above command if using the tool for testing.)\n`);

return false;
}
this.sdkRoot = sdkRootEnv;

return this.executeDotCommand();
}

loadEnvFromDotEnv(): void {
this.androidHomeInGlobalEnv = 'ANDROID_HOME' in process.env;
dotenv.config({path: path.join(this.rootDir, '.env')});
}

buildCommand(): string {
const binaryName = this.dotcmd.split('.')[1] as SdkBinary;
const binaryLocation = getBinaryLocation(this.sdkRoot, this.platform, binaryName, true);

let cmd: string;
if (binaryLocation === 'PATH') {
const binaryFullName = getBinaryNameForOS(this.platform, binaryName);
cmd = `${binaryFullName}`;
} else {
const binaryFullName = path.basename(binaryLocation);
const binaryDirPath = path.dirname(binaryLocation);
cmd = path.join(binaryDirPath, binaryFullName);
}

return cmd;
}

executeDotCommand(): boolean {
const cmd = this.buildCommand();
const result = spawnSync(cmd, this.args, {stdio: 'inherit'});

if (result.error) {
console.error(result.error);

return false;
}

return result.status === 0;
}
}

9 changes: 7 additions & 2 deletions src/commands/android/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import {AndroidSetup} from './androidSetup';
import {Options} from './interfaces';
import {AndroidSubcommand} from './subcommands';
import {getSubcommandHelp} from './utils/common';
import {AndroidDotCommand} from './dotcommands';

export function handleAndroidCommand(args: string[], options: Options): void {
if (args.length === 1) {
export function handleAndroidCommand(args: string[], options: Options, argv: string[]): void {
if (args[0].includes('.')) {
// Here args[0] represents the android dot command
const androidDotCommand = new AndroidDotCommand(args[0], argv, process.cwd());
androidDotCommand.run();
} else if (args.length === 1) {
const androidSetup = new AndroidSetup(options);
androidSetup.run();
} else if (args.length === 2) {
Expand Down
1 change: 1 addition & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export const AVAILABLE_COMMANDS = ['android', 'ios'];
export const ANDROID_DOTCOMMANDS = ['android.emulator', 'android.avdmanager', 'android.sdkmanager', 'android.adb'];
4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ export const run = () => {
console.log(`${colors.red('No command passed.')}\n`);
}
showHelp();
} else if (args[0] === 'android') {
handleAndroidCommand(args, options);
} else if (args[0].split('.')[0] === 'android') {
handleAndroidCommand(args, options, argv);
} else if (args[0] === 'ios') {
if (args.length > 1) {
// ios command does not accept subcommands.
Expand Down

0 comments on commit 61711ef

Please sign in to comment.