@alexaegis/cli-tools
Version:
Common yargs setup
140 lines (139 loc) • 4.44 kB
JavaScript
;
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;