"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const lodash_1 = require("lodash"); const microargs_1 = __importDefault(require("microargs")); const path_1 = __importDefault(require("path")); class CLIError extends Error { } function optionToString(optionName) { return optionName.length === 1 ? `-${optionName}` : `--${optionName}`; } function optionsToString(optionsKeys) { return optionsKeys.map(optionToString).join(" "); } function printHelp(scriptName, annotations, logger) { if (lodash_1.isEmpty(annotations)) { logger.log("Documentation not found"); return null; } const { description, params, options } = annotations; const extra = lodash_1.omit(annotations, ["description", "params", "options"]); const usageOptions = lodash_1.isEmpty(options) ? "" : "[options]"; const usageParams = !Array.isArray(params) || lodash_1.isEmpty(params) ? "" : `[${params.join(" ")}]`; logger.log(`Usage: ${path_1.default.basename(scriptName)} ${usageOptions} ${usageParams}\n`); if (description) { logger.log(`${description}\n`); } if (!lodash_1.isEmpty(options)) { logger.log("Options:\n"); lodash_1.forEach(options, (value, key) => { logger.log(` ${lodash_1.padEnd(optionToString(key), 12)}${value}`); }); } lodash_1.forEach(extra, (value, key) => { logger.log(`\n${lodash_1.capitalize(key)}:\n`); logger.log(`${value}\n`); }); } const Cli = (argv, annotations = {}, help = printHelp, logger = console) => { return (callback) => { const { params, options } = microargs_1.default(argv.slice(2)); const scriptName = path_1.default.basename(argv[1]); if (lodash_1.isString(annotations)) { annotations = { description: annotations }; } if (options.help) { return help(scriptName, annotations, logger); } const annotatedOptionsKeys = (annotations && annotations.options && Object.keys(annotations.options)) || []; const optionsKeys = Object.keys(options); const illegalOptionsKeys = lodash_1.difference(optionsKeys, annotatedOptionsKeys); if (annotatedOptionsKeys.length && illegalOptionsKeys.length) { const msg = `Illegal option: ${optionsToString(illegalOptionsKeys)}\n` + `Available options: ${optionsToString(annotatedOptionsKeys)}\n` + `Type "${scriptName} --help" for more information`; throw new CLIError(msg); } return callback(options, ...params); }; }; Cli.CliError = CLIError; module.exports = Cli; //# sourceMappingURL=index.js.map