rs-runner
Version:
RS is a CLI tool for quickly detecting package.json scripts, and running them.
112 lines (96 loc) • 2.87 kB
text/typescript
import { Command } from 'commander';
import chalk from 'chalk';
import { version } from '../package.json';
import { listScripts } from './lib/display';
import {
addNewDirectoryScript,
addNewGlobalScript,
getDirectoryScripts,
getGlobalScripts,
removeDirectoryScript,
removeGlobalScript,
} from './lib/scripts';
import { interactiveMode } from './lib/interactive';
import { getPackageJsonScripts } from './lib/pm';
import { runDirectoryScript, runGlobalScript, runPackageScript, runRunnerCommand } from './lib/run';
const program = new Command();
const description = 'CLI tool for detecting and running package.json scripts';
program
.name('RS')
.description(description)
.version(version, '-v, --version')
.option('-l, --list', 'List all scripts')
.option('-h, --help', 'Show help')
.option('-i, --interactive', 'Run in interactive mode')
.option('-a, --add <key> <value>', 'Add new global script')
.option('-d, --delete [key]', 'Delete global script')
.option('--add-dir <key> <value>', 'Add new directory script')
.option('--delete-dir [key]', 'Delete directory script');
program.argument('[script]', 'Script to run').action((script: string | undefined) => {
if (program.opts().help) {
program.outputHelp();
return;
}
if (program.opts().list) {
listScripts();
return;
}
if (program.opts().add) {
const key = program.opts().add;
if (program.args.length < 1) {
console.warn(chalk.yellow('Please specify a value for the script'));
return;
}
const value = program.args.slice(0).join(' ');
addNewGlobalScript(key, value);
return;
}
if (program.opts().addDir) {
const key = program.opts().addDir;
if (program.args.length < 1) {
console.warn(chalk.yellow('Please specify a value for the directory script'));
return;
}
const value = program.args.slice(0).join(' ');
addNewDirectoryScript(key, value);
return;
}
if (program.opts().delete) {
const key = program.opts().delete;
removeGlobalScript(key);
return;
}
if (program.opts().deleteDir) {
const key = program.opts().deleteDir;
removeDirectoryScript(key);
return;
}
if (program.opts().interactive) {
interactiveMode();
return;
}
if (!script) {
listScripts();
return;
}
// Order of check is
// package.json -> directory -> global -> runner <command>
const packageJsonScripts = getPackageJsonScripts();
if (packageJsonScripts[script]) {
runPackageScript(script);
return;
}
const directoryScripts = getDirectoryScripts();
if (directoryScripts[script]) {
runDirectoryScript(script);
return;
}
const globalScripts = getGlobalScripts();
if (globalScripts[script]) {
runGlobalScript(script);
return;
}
runRunnerCommand(script);
});
program.parse(process.argv);