UNPKG

@alexaegis/cli-tools

Version:
140 lines (139 loc) 4.44 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const logging = require("@alexaegis/logging"); const yargs = require("yargs"); const yargsForLogLevelOption = (yargs2) => { const logLevelYargs = yargs2.option("logLevel", { alias: "ll", choices: Object.values(logging.LogLevel), description: "Minimum logLevel", default: logging.LogLevel.INFO, coerce: (value) => { const i = Number.parseInt(value, 10); if (!Number.isNaN(i) && logging.isLogLevelEnumValue(i)) { return i; } else if (logging.isLogLevelEnumKey(value)) { return logging.LogLevel[value]; } else { return logging.LogLevel.INFO; } } }).option("quiet", { alias: ["q", "silent"], description: "Turn off logging", boolean: true, conflicts: ["verbose"] }).option("verbose", { alias: "v", description: "Turn on (almost) all logging", boolean: true, conflicts: ["silent"] }); return logLevelYargs.middleware((args) => { if (args.quiet) { return { logLevel: logging.LogLevel.OFF }; } else if (args.verbose) { return { logLevel: logging.LogLevel.TRACE }; } else { return void 0; } }); }; const yargsForCwdOption = (yargs2) => { return yargs2.option("cwd", { string: true, default: process.cwd(), description: "Override the working-directy, with this you can pretend that the command was called in another directory" }); }; const yargsForDryOption = (yargs2) => { return yargs2.option("dry", { boolean: true, default: false, description: "Don't actually do anything just log" }); }; const yargsForForceOption = (yargs2) => { return yargs2.option("force", { boolean: true, default: false, description: "Disables many safety checks. It can write forcefully, even if that could result in data-loss!" }); }; const yargsForCollectWorkspacePackagesOptions = (yargs2) => { return yargsForDryOption(yargsForForceOption(yargsForCwdOption(yargs2))).option("skipWorkspaceRoot", { boolean: true, default: false, description: "Don't act on the root of the workspace" }).option("onlyWorkspaceRoot", { boolean: true, default: false, description: "Only act on to the root of the workspace." }).option("dependencyCriteria", { default: [], array: true, string: true, description: "Only act on packages that have these dependencies or devDependencies listed in their package.json file. Empty means no such filtering is applied." }); }; const defaultYargsFromPackageJson = (packageJson) => (yarguments) => { let yargs2 = yarguments.help().completion(); if (packageJson) { if (packageJson.version) { yargs2 = yargs2.version(packageJson.version); } let repositoryUrl; if (typeof packageJson.repository === "string") { repositoryUrl = packageJson.repository; } else if (packageJson.repository && typeof packageJson.repository.url === "string") { repositoryUrl = packageJson.repository.url; } if (packageJson.name && packageJson.version && repositoryUrl) { yargs2 = yargs2.epilogue( `${packageJson.name}@${packageJson.version} see project at ${repositoryUrl}` ); } } return yargs2; }; class YargsBuilder { mutators = []; static empty() { return new YargsBuilder(); } /** * Creates a YargsBuilder with some default options: * - enables help * - adds metadata found in packageJson for * - version * - epilogue showing the repository url * * It does not add any options */ static withDefaults(packageJson) { return new YargsBuilder().add(defaultYargsFromPackageJson(packageJson)); } add(mutator) { if (typeof mutator === "function") { this.mutators.push(mutator); } return this; } /*** * usage: pass */ build(args = process.argv.splice(2), cwd) { let y = yargs(args, cwd); for (const mutator of this.mutators) { y = mutator(y); } return y; } } exports.YargsBuilder = YargsBuilder; exports.defaultYargsFromPackageJson = defaultYargsFromPackageJson; exports.yargsForCollectWorkspacePackagesOptions = yargsForCollectWorkspacePackagesOptions; exports.yargsForCwdOption = yargsForCwdOption; exports.yargsForDryOption = yargsForDryOption; exports.yargsForForceOption = yargsForForceOption; exports.yargsForLogLevelOption = yargsForLogLevelOption;