Source: cli.js

#!/usr/bin/env node
import { Command } from "commander";
import { generateNewConfig } from "./utils/new-config.js";
import { findConfigFilesInDir, validateProvidedConfigName, generateIndividualTaskFile, parseConfig, selectTaskFromConfig, generateMultiTaskFile, selectConfigNameFromDir, runInVM, } from "./utils/run-file.js";
import chalk from "chalk";
import inquirer from "inquirer";
/**
 * @fileOverview The main file that holds all the logic for the CLI tool.
 * @author Gerard Hernandez
 *
 * @requires     {@link https://www.npmjs.com/package/commander | commander}
 * @requires     {@link https://www.npmjs.com/package/chalk | chalk}
 * @requires     {@link https://www.npmjs.com/package/inquirer | inquirer}
 *
 * @requires     {@link module:run-file~findConfigFilesInDir | findConfigFilesInDir}
 * @requires     {@link module:run-file~validateProvidedConfigName | validateProvidedConfigName}
 * @requires     {@link module:run-file~generateIndividualTaskFile | generateIndividualTaskFile}
 * @requires     {@link module:run-file~parseConfig | parseConfig}
 * @requires     {@link module:run-file~selectTaskFromConfig | selectTaskFromConfig}
 * @requires     {@link module:run-file~generateMultiTaskFile | generateMultiTaskFile}
 * @requires     {@link module:run-file~selectConfigNameFromDir | selectConfigNameFromDir}
 * @requires     {@link module:run-file~runInVM | runInVM}
 */
const program = new Command();
program
    .name("dir")
    .arguments("[name]")
    .option("-a, --all", "Run all tasks in the config file")
    .description("Describe, It Runs, a simple command executor")
    .version("0.0.0")
    .action(async (name, args) => {
    const sanitizedConfigName = await validateProvidedConfigName(name);
    const configFilesInDir = await findConfigFilesInDir();
    let configName;
    if (sanitizedConfigName) {
        configName = sanitizedConfigName;
    }
    else if (configFilesInDir.length > 1) {
        configName = await selectConfigNameFromDir(configFilesInDir);
    }
    else if (configFilesInDir.length === 1) {
        configName = configFilesInDir[0];
    }
    else {
        console.log(chalk.red("✖ No config files found!"));
        const { create } = await inquirer.prompt({
            type: "confirm",
            name: "create",
            message: "Would you like to create a new config file?",
        });
        if (create) {
            await generateNewConfig(undefined, true, true);
            process.exit(0);
        }
    }
    console.log(chalk.yellow(`ℹ Starting runner for config${name ? chalk.blue(" " + name) : ""}:\n`));
    const { options, imports, tasks } = await parseConfig(configName);
    if (!tasks.length) {
        console.log(chalk.red("✖ No tasks found!"));
        process.exit(1);
    }
    const selectedTasks = tasks.length > 1 && !args.all
        ? await selectTaskFromConfig(tasks)
        : !args.all && tasks[0]
            ? [tasks[0]]
            : tasks;
    const taskCode = selectedTasks?.length > 1 || args.all
        ? generateMultiTaskFile(options, imports, selectedTasks)
        : generateIndividualTaskFile(options, imports, selectedTasks);
    runInVM(taskCode);
});
program
    .command("new [name]")
    .option("-e, --example", "Add an example to the run file.")
    .option("-o, --options", "Add an options object to the run file")
    .option("-eo, --example-options", "Add an example and options object to the generated run file.")
    .action((name, options) => {
    console.log(chalk.yellow(`ℹ Starting generator for config${name ? chalk.blue(" " + name) : ""}:\n`));
    const includeOptions = options.options || options.exampleOptions || false;
    const includeSample = options.example || options.exampleOptions || false;
    generateNewConfig(name, includeOptions, includeSample);
});
program.parse(process.argv);