"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // @flow const chalk_1 = __importDefault(require("chalk")); const fs_1 = __importDefault(require("fs")); const lodash_padend_1 = __importDefault(require("lodash.padend")); const microcli_1 = __importDefault(require("microcli")); // @ts-ignore const omelette_1 = __importDefault(require("omelette")); const path_1 = __importDefault(require("path")); const CLIError = microcli_1.default.CliError; const common_1 = require("./common"); const DEFAULT_RUNFILE_PATH = "./runfile.js"; function requirer(filePath) { return require(path_1.default.resolve(filePath)); } exports.requirer = requirer; function hasAccess(filePath) { return fs_1.default.accessSync(path_1.default.resolve(filePath)); } exports.hasAccess = hasAccess; function getConfig(filePath) { let config; try { config = requirer(filePath).runjs || {}; } catch (error) { config = {}; } return config; } exports.getConfig = getConfig; function load(config, logger, requirer, access) { const runfilePath = config.runfile || DEFAULT_RUNFILE_PATH; // Load requires if given in config if (Array.isArray(config.requires)) { config.requires.forEach(modulePath => { logger.log(chalk_1.default.gray(`Requiring ${modulePath}...`)); requirer(modulePath); }); } // Process runfile logger.log(chalk_1.default.gray(`Processing ${runfilePath}...`)); try { access(runfilePath); } catch (error) { throw new common_1.RunJSError(`No ${runfilePath} defined in ${process.cwd()}`); } const runfile = requirer(runfilePath); if (runfile.default) { return runfile.default; } return runfile; } exports.load = load; function describe(obj, logger, namespace) { if (!namespace) { logger.log(chalk_1.default.yellow("Available tasks:")); } Object.keys(obj).forEach(key => { const value = obj[key]; const nextNamespace = namespace ? `${namespace}:${key}` : key; const help = value.help; if (typeof value === "function") { // Add task name const funcParams = help && help.params; const logArgs = [chalk_1.default.bold(nextNamespace)]; // Add task params if (Array.isArray(funcParams) && funcParams.length) { logArgs[0] += ` [${funcParams.join(" ")}]`; } // Add description if (help && (help.description || typeof help === "string")) { const description = help.description || help; logArgs[0] = lodash_padend_1.default(logArgs[0], 40); // format logArgs.push("-", description.split("\n")[0]); } // Log logger.log(...logArgs); } else if (typeof value === "object") { describe(value, logger, nextNamespace); } }); if (!namespace) { logger.log("\n" + chalk_1.default.blue('Type "run [taskname] --help" to get more info if available.')); } } exports.describe = describe; function tasks(obj, namespace) { let list = []; Object.keys(obj).forEach(key => { const value = obj[key]; const nextNamespace = namespace ? `${namespace}:${key}` : key; if (typeof value === "function") { list.push(nextNamespace); } else if (typeof value === "object") { list = list.concat(tasks(value, nextNamespace)); } }); return list; } function call(obj, args, logger, subtaskName) { const taskName = subtaskName || args[2]; if (typeof obj[taskName] === "function") { const cli = microcli_1.default(args.slice(1), obj[taskName].help, undefined, logger); cli((options, ...params) => { obj[taskName].apply({ options }, params); }); return obj[taskName]; } const namespaces = taskName.split(":"); const rootNamespace = namespaces.shift() || ""; const nextSubtaskName = namespaces.join(":"); if (obj[rootNamespace]) { const calledTask = call(obj[rootNamespace], args, logger, nextSubtaskName); if (calledTask) { return calledTask; } } if (!subtaskName) { throw new common_1.RunJSError(`Task ${taskName} not found`); } } exports.call = call; function autocomplete(config) { const logger = new common_1.SilentLogger(); const completion = omelette_1.default("run "); completion.on("task", ({ reply }) => { const runfile = load(config, logger, requirer, hasAccess); reply(tasks(runfile)); }); completion.init(); } function main() { try { const config = getConfig("./package.json"); autocomplete(config); const runfile = load(config, common_1.logger, requirer, hasAccess); const ARGV = process.argv.slice(); if (ARGV.length > 2) { call(runfile, ARGV, common_1.logger); } else { describe(runfile, common_1.logger); } } catch (error) { if (error instanceof common_1.RunJSError || error instanceof CLIError) { common_1.logger.error(error.message); process.exit(1); } else { common_1.logger.log(error); process.exit(1); } } } exports.main = main; //# sourceMappingURL=script.js.map