UNPKG

rs-runner

Version:

RS is a CLI tool for quickly detecting package.json scripts, and running them.

397 lines (396 loc) 18.6 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.runDirectoryScript = exports.removeDirectoryScript = exports.addNewDirectoryScript = exports.getDirectoryScripts = exports.getGlobalScripts = exports.removeGlobalScript = exports.addNewGlobalScript = exports.interactiveMode = exports.runRunnerCommand = exports.runGlobalScript = exports.runPackageScript = exports.detectRunner = exports.listScripts = exports.getPackageJsonScripts = void 0; var fs = __importStar(require("fs")); var chalk_1 = __importDefault(require("chalk")); var child_process_1 = require("child_process"); var path_1 = __importDefault(require("path")); var output_1 = require("./output"); var inquirer_1 = __importDefault(require("inquirer")); var os = __importStar(require("os")); var types_1 = require("../types"); var getPackageJsonScripts = function () { var packageJsonPath = path_1.default.join(process.cwd(), 'package.json'); if (!fs.existsSync(packageJsonPath)) { return {}; } var packageJson = fs.readFileSync(packageJsonPath, 'utf8'); var packageJsonObj = JSON.parse(packageJson); return packageJsonObj.scripts || {}; }; exports.getPackageJsonScripts = getPackageJsonScripts; var listScripts = function () { var globalScripts = (0, exports.getGlobalScripts)(); var directoryScripts = (0, exports.getDirectoryScripts)(); var globalOutput = Object.keys(globalScripts).map(function (script) { return chalk_1.default.green("".concat(script)) + chalk_1.default.gray(': ') + chalk_1.default.white(globalScripts[script]); }); var directoryOutput = Object.keys(directoryScripts).map(function (script) { return chalk_1.default.green("".concat(script)) + chalk_1.default.gray(': ') + chalk_1.default.white(directoryScripts[script]); }); try { var packageJsonScripts_1 = (0, exports.getPackageJsonScripts)(); var packageOutput = Object.keys(packageJsonScripts_1).map(function (script) { return chalk_1.default.green("".concat(script)) + chalk_1.default.gray(': ') + chalk_1.default.white(packageJsonScripts_1[script]); }); var runner = (0, exports.detectRunner)(); var runnerOutput = runner ? output_1.runnerColors[runner](runner) : null; (0, output_1.output)("Package.json".concat(runnerOutput ? " (".concat(runnerOutput, "):") : ':', "\n"), 'blue'); (0, output_1.output)(packageOutput.join('\n')); } catch (error) { output_1.output.error("No package.json found"); } if (directoryOutput.length > 0) { (0, output_1.output)("\nDirectory scripts (".concat(process.cwd(), "):\n"), 'blue'); (0, output_1.output)(directoryOutput.join('\n')); } if (globalOutput.length === 0) { output_1.output.warn('\nNo global scripts found'); return; } (0, output_1.output)('\nGlobal scripts:\n', 'blue'); (0, output_1.output)(globalOutput.join('\n')); }; exports.listScripts = listScripts; var detectRunner = function () { for (var _i = 0, _a = Object.entries(types_1.runners); _i < _a.length; _i++) { var _b = _a[_i], runner = _b[0], lockFiles = _b[1]; if (lockFiles.some(function (lockFile) { return fs.existsSync(lockFile); })) { return runner; } } return null; }; exports.detectRunner = detectRunner; var runPackageScript = function (script) { var runner = (0, exports.detectRunner)(); if (!runner) { output_1.output.error('No package manager detected. Please ensure you have a lock file (package-lock.json, yarn.lock, etc.)'); return; } var command = "".concat(runner, " run ").concat(script); (0, output_1.output)("Executing: ".concat(command), 'green'); var childProcess = (0, child_process_1.spawn)(command, { stdio: 'inherit', shell: true }); childProcess.on('error', function (error) { output_1.output.error("Error executing script: ".concat(error.message)); }); childProcess.on('exit', function (code) { if (code !== 0) { output_1.output.error("Script exited with code ".concat(code)); } }); }; exports.runPackageScript = runPackageScript; var runGlobalScript = function (script) { var globalScripts = (0, exports.getGlobalScripts)(); if (!globalScripts[script]) { output_1.output.warn("Global script not found: ".concat(script)); return; } var command = globalScripts[script]; (0, output_1.output)("Executing global script: ".concat(command), 'green'); var childProcess = (0, child_process_1.spawn)(command, { stdio: 'inherit', shell: true }); childProcess.on('error', function (error) { output_1.output.error("Error executing global script: ".concat(error.message)); }); childProcess.on('exit', function (code) { if (code !== 0) { output_1.output.error("Global script exited with code ".concat(code)); } }); }; exports.runGlobalScript = runGlobalScript; var runRunnerCommand = function (script) { var runner = (0, exports.detectRunner)(); if (!runner) { output_1.output.error('No package manager detected. Please ensure you have a lock file (package-lock.json, yarn.lock, etc.)'); return; } var command = "".concat(runner, " ").concat(script); (0, output_1.output)("Executing command: ".concat(command), 'green'); var childProcess = (0, child_process_1.spawn)(command, { stdio: 'inherit', shell: true }); childProcess.on('error', function (error) { output_1.output.error("Error executing ".concat(runner, " command: ").concat(error.message)); }); childProcess.on('exit', function (code) { if (code !== 0) { output_1.output.error("".concat(runner, " command exited with code ").concat(code)); } }); }; exports.runRunnerCommand = runRunnerCommand; var interactiveMode = function () { return __awaiter(void 0, void 0, void 0, function () { var packageScripts, globalScripts, directoryScripts, choices, selection; return __generator(this, function (_a) { switch (_a.label) { case 0: packageScripts = (0, exports.getPackageJsonScripts)(); globalScripts = (0, exports.getGlobalScripts)(); directoryScripts = (0, exports.getDirectoryScripts)(); choices = []; if (Object.keys(packageScripts).length > 0) { choices.push(new inquirer_1.default.Separator('--- Package Scripts ---')); choices.push.apply(choices, Object.keys(packageScripts).map(function (script) { return ({ name: "".concat(script), value: { type: 'package', script: script } }); })); } if (Object.keys(directoryScripts).length > 0) { choices.push(new inquirer_1.default.Separator('--- Directory Scripts ---')); choices.push.apply(choices, Object.keys(directoryScripts).map(function (script) { return ({ name: "".concat(script), value: { type: 'directory', script: script } }); })); } if (Object.keys(globalScripts).length > 0) { choices.push(new inquirer_1.default.Separator('--- Global Scripts ---')); choices.push.apply(choices, Object.keys(globalScripts).map(function (script) { return ({ name: "".concat(script), value: { type: 'global', script: script } }); })); } return [4 /*yield*/, inquirer_1.default.prompt([{ type: 'list', name: 'selection', message: 'Select a script to run:', choices: choices, loop: false, }])]; case 1: selection = (_a.sent()).selection; if (selection.type === 'package') { (0, exports.runPackageScript)(selection.script); } else if (selection.type === 'directory') { (0, exports.runDirectoryScript)(selection.script); } else { (0, exports.runGlobalScript)(selection.script); } return [2 /*return*/]; } }); }); }; exports.interactiveMode = interactiveMode; var getConfigPath = function () { var homedir = os.homedir(); var configDir = path_1.default.join(homedir, '.rs-runner'); var configPath = path_1.default.join(configDir, 'config.json'); // Ensure the config directory exists if (!fs.existsSync(configDir)) { fs.mkdirSync(configDir, { recursive: true }); } return configPath; }; var validateConfig = function (config) { return config && typeof config === 'object' && config.globalScripts && typeof config.globalScripts === 'object' && (!config.directoryScripts || typeof config.directoryScripts === 'object'); }; var getConfig = function () { var configPath = getConfigPath(); if (fs.existsSync(configPath)) { var configFile = fs.readFileSync(configPath, 'utf8'); var config = JSON.parse(configFile); return validateConfig(config) ? config : null; } return null; }; var writeConfig = function (newConfig) { fs.writeFileSync(getConfigPath(), JSON.stringify(newConfig, null, 2), 'utf8'); }; var addNewGlobalScript = function (key, value) { var config = getConfig(); if (!config) { config = { globalScripts: {}, directoryScripts: {} }; } if (!config.globalScripts) { config.globalScripts = {}; } if (config.globalScripts.hasOwnProperty(key)) { output_1.output.warn("Global script '".concat(key, "' already exists. Overwriting...")); } config.globalScripts[key] = value; writeConfig(config); var updatedConfig = getConfig(); if (updatedConfig && updatedConfig.globalScripts[key] === value) { (0, output_1.output)("Global script '".concat(key, "' added successfully."), 'green'); (0, output_1.output)(JSON.stringify(updatedConfig.globalScripts, null, 2), 'blue'); } else { output_1.output.error('Error: Failed to add to config.'); } }; exports.addNewGlobalScript = addNewGlobalScript; var removeGlobalScript = function (key) { var config = getConfig(); if (!config) { output_1.output.warn('No global scripts configuration found.'); return; } if (config.globalScripts && config.globalScripts.hasOwnProperty(key)) { delete config.globalScripts[key]; writeConfig(config); (0, output_1.output)("Global script '".concat(key, "' removed successfully."), 'green'); } else { (0, output_1.output)("Global script '".concat(key, "' not found."), 'yellow'); } }; exports.removeGlobalScript = removeGlobalScript; var getGlobalScripts = function () { var config = getConfig(); if (config && config.globalScripts) { return config.globalScripts; } return {}; }; exports.getGlobalScripts = getGlobalScripts; var getDirectoryScripts = function () { var config = getConfig(); var currentDir = process.cwd(); if (config && config.directoryScripts && config.directoryScripts[currentDir]) { return config.directoryScripts[currentDir]; } return {}; }; exports.getDirectoryScripts = getDirectoryScripts; var addNewDirectoryScript = function (key, value) { var _a, _b; var config = getConfig(); var currentDir = process.cwd(); if (!config) { config = { globalScripts: {}, directoryScripts: {}, }; } if (!config.directoryScripts) { config.directoryScripts = {}; } if (!config.directoryScripts[currentDir]) { config.directoryScripts[currentDir] = {}; } if (config.directoryScripts[currentDir].hasOwnProperty(key)) { output_1.output.warn("Directory script '".concat(key, "' already exists for ").concat(currentDir, ". Overwriting...")); } config.directoryScripts[currentDir][key] = value; writeConfig(config); var updatedConfig = getConfig(); if (updatedConfig && ((_b = (_a = updatedConfig.directoryScripts) === null || _a === void 0 ? void 0 : _a[currentDir]) === null || _b === void 0 ? void 0 : _b[key]) === value) { (0, output_1.output)("Directory script '".concat(key, "' added successfully for ").concat(currentDir), 'green'); (0, output_1.output)(JSON.stringify(updatedConfig.directoryScripts[currentDir], null, 2), 'blue'); } else { output_1.output.error('Error: Failed to add directory script to config.'); } }; exports.addNewDirectoryScript = addNewDirectoryScript; var removeDirectoryScript = function (key) { var config = getConfig(); var currentDir = process.cwd(); if (!config || !config.directoryScripts || !config.directoryScripts[currentDir]) { output_1.output.warn('No directory scripts found for current directory.'); return; } if (config.directoryScripts[currentDir].hasOwnProperty(key)) { delete config.directoryScripts[currentDir][key]; // Clean up empty directory entries if (Object.keys(config.directoryScripts[currentDir]).length === 0) { delete config.directoryScripts[currentDir]; } writeConfig(config); (0, output_1.output)("Directory script '".concat(key, "' removed successfully."), 'green'); } else { (0, output_1.output)("Directory script '".concat(key, "' not found in current directory."), 'yellow'); } }; exports.removeDirectoryScript = removeDirectoryScript; var runDirectoryScript = function (script) { var directoryScripts = (0, exports.getDirectoryScripts)(); if (!directoryScripts[script]) { output_1.output.warn("Directory script not found: ".concat(script)); return; } var command = directoryScripts[script]; (0, output_1.output)("Executing directory script: ".concat(command), 'green'); var childProcess = (0, child_process_1.spawn)(command, { stdio: 'inherit', shell: true }); childProcess.on('error', function (error) { output_1.output.error("Error executing directory script: ".concat(error.message)); }); childProcess.on('exit', function (code) { if (code !== 0) { output_1.output.error("Directory script exited with code ".concat(code)); } }); }; exports.runDirectoryScript = runDirectoryScript;