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.
106 lines (97 loc) • 3.16 kB
JavaScript
import {cliArgument, getArgumentByMenu, getPath, invalidCommandExit, menu, validateRequiredTools} from '../core/utils.js';
import {gitIgnoreByArgument} from '../languages/git.js';
import {nodeStructureByArgument} from '../languages/node.js';
import {setupFlutterAppStructure, setupFlutterPackageStructure} from '../languages/flutter.js';
import {byeMessage, greetMessage, logo} from '../core/constants.js';
import {program} from 'commander';
export function setupCLI() {
const setup = program.command('setup')
.argument('[config]')
.description('Setup folder structure for selected language')
.action(async (_) => {
console.log(logo);
console.log(greetMessage);
if (_ !== undefined) {
invalidCommandExit();
} else {
await setupMenu();
}
});
cliArgument(
setup,
'flutter',
'Setup folder structure for flutter project',
['app', 'package'],
(args) => flutterSetupMenu(args, true),
);
cliArgument(
setup,
'node',
'Setup folder structure for node project',
['empty', 'server', 'cli'],
(args) => nodeSetupMenu(args, true),
);
cliArgument(
setup,
'git',
'Setup .gitignore for git repository',
['general', 'flutter', 'node', 'python', 'unity'],
(args) => gitSetupMenu(args, true),
);
}
export async function gitSetupMenu(argument = undefined, greet = false) {
argument = await getArgumentByMenu(
['general', 'flutter', 'node', 'python', 'unity'],
argument,
greet
);
const dir = await getPath();
await gitIgnoreByArgument(argument, dir);
console.log(byeMessage);
}
export async function nodeSetupMenu(argument = undefined, greet = false) {
argument = await getArgumentByMenu(['empty', 'server', 'cli'], argument, greet);
// Server and CLI setups require npm
if (argument === 'server' || argument === 'cli') {
if (!await validateRequiredTools(['npm'])) {
console.log(byeMessage);
process.exit(1);
}
}
const dir = await getPath();
await nodeStructureByArgument(argument, dir);
console.log(byeMessage);
}
export async function flutterSetupMenu(argument = undefined, greet = false) {
argument = await getArgumentByMenu(['app', 'package'], argument, greet);
const dir = await getPath();
switch (argument) {
case 'app':
await setupFlutterAppStructure(dir);
break;
case 'package':
await setupFlutterPackageStructure(dir);
break;
}
console.log(byeMessage);
}
export async function setupMenu() {
console.log(logo);
console.log(greetMessage);
const answer = await menu([
'Flutter',
'Node',
'Git',
],);
switch (answer) {
case 'Flutter':
await flutterSetupMenu();
break;
case 'Node':
await nodeSetupMenu();
break;
case 'Git':
await gitSetupMenu();
break;
}
}