henchman-cli
Version:
An all-in-one, interactive command-line tool that simplifies creating, setting up, and managing development projects like Flutter and Node.js while automating repetitive tasks.
110 lines (100 loc) • 3.11 kB
JavaScript
import {program} from 'commander';
import {cliArgument, errorExit, execute, getConfig, invalidCommandExit, menu, validateRequiredTools} from '../core/utils.js';
import {byeMessage, greetMessage, henchman, logo} from '../core/constants.js';
import inquirer from 'inquirer';
export function startCLI() {
const start = program.command('start')
.argument('[config]')
.description('Start a process')
.action(async (_) => {
if (_ !== undefined) {
invalidCommandExit();
} else {
await startMenu();
}
});
cliArgument(
start,
'sim',
'Start android or iOS simulator',
['android', 'ios'],
(args) => startSimMenu(args, true)
);
}
export async function startMenu() {
console.log(logo);
console.log(greetMessage);
const answer = await menu(['Start Android Simulator', 'Start iOS Simulator']);
switch (answer) {
case 'Start Android Simulator':
await startAndroidSim();
break;
case 'Start iOS Simulator':
await startIOSSim();
break;
}
}
export async function startAndroidSim() {
if (!await validateRequiredTools(['emulator'])) {
console.log(byeMessage);
process.exit(1);
}
const config = await getConfig();
let emulator = config.sim?.emulator;
if (emulator === undefined) {
console.log(`${henchman}: Run \`henchman configure\` to set a default emulator`);
const answer = await inquirer.prompt({
type: 'input',
name: 'emulator',
message: `${henchman}: Enter emulator name`
});
if (answer['emulator'] === '') {
errorExit(`${henchman}: Emulator name cannot be empty`);
} else {
emulator = answer['emulator'];
}
}
await execute(
`emulator @${emulator}`,
'Starting Android Simulator'
);
console.log(byeMessage);
}
export async function startIOSSim() {
if (process.platform !== 'darwin') {
console.log(`${henchman}: Command only available on MAC devices`);
} else {
await execute('open -a simulator', 'Starting iOS Simulator');
}
console.log(byeMessage);
}
export async function startSimMenu(args = undefined, greet = false) {
if (greet) {
console.log(logo);
console.log(greetMessage);
}
if (args === undefined) {
const sims = await inquirer.prompt({
type: 'checkbox',
name: 'sims',
message: 'Select simulators:',
choices: ['android', 'ios'],
required: true,
});
if (sims['sims'].includes('ios')) {
await startIOSSim();
}
if (sims['sims'].includes('android')) {
await startAndroidSim();
}
} else {
switch (args) {
case 'android':
await startAndroidSim();
break;
case 'ios':
await startIOSSim();
break;
}
}
}