fix: a
This commit is contained in:
75
node_modules/commander/Readme.md
generated
vendored
75
node_modules/commander/Readme.md
generated
vendored
@@ -37,7 +37,7 @@ Read this in other languages: English | [简体中文](./Readme_zh-CN.md)
|
||||
- [.usage](#usage)
|
||||
- [.description and .summary](#description-and-summary)
|
||||
- [.helpOption(flags, description)](#helpoptionflags-description)
|
||||
- [.addHelpCommand()](#addhelpcommand)
|
||||
- [.helpCommand()](#helpcommand)
|
||||
- [More configuration](#more-configuration-2)
|
||||
- [Custom event listeners](#custom-event-listeners)
|
||||
- [Bits and pieces](#bits-and-pieces)
|
||||
@@ -79,7 +79,8 @@ const { program } = require('commander');
|
||||
|
||||
program
|
||||
.option('--first')
|
||||
.option('-s, --separator <char>');
|
||||
.option('-s, --separator <char>')
|
||||
.argument('<string>');
|
||||
|
||||
program.parse();
|
||||
|
||||
@@ -174,7 +175,15 @@ const program = new Command();
|
||||
|
||||
## Options
|
||||
|
||||
Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|').
|
||||
Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). To allow a wider range of short-ish flags than just
|
||||
single characters, you may also have two long options. Examples:
|
||||
|
||||
```js
|
||||
program
|
||||
.option('-p, --port <number>', 'server port number')
|
||||
.option('--trace', 'add extra debugging output')
|
||||
.option('--ws, --workspace <name>', 'use a custom workspace')
|
||||
```
|
||||
|
||||
The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler.
|
||||
|
||||
@@ -678,8 +687,7 @@ async function main() {
|
||||
}
|
||||
```
|
||||
|
||||
A command's options and arguments on the command line are validated when the command is used. Any unknown options or missing arguments will be reported as an error. You can suppress the unknown option checks with `.allowUnknownOption()`. By default, it is not an error to
|
||||
pass more arguments than declared, but you can make this an error with `.allowExcessArguments(false)`.
|
||||
A command's options and arguments on the command line are validated when the command is used. Any unknown options or missing arguments or excess arguments will be reported as an error. You can suppress the unknown option check with `.allowUnknownOption()`. You can suppress the excess arguments check with `.allowExcessArguments()`.
|
||||
|
||||
### Stand-alone executable (sub)commands
|
||||
|
||||
@@ -696,7 +704,7 @@ Example file: [pm](./examples/pm)
|
||||
program
|
||||
.name('pm')
|
||||
.version('0.1.0')
|
||||
.command('install [name]', 'install one or more packages')
|
||||
.command('install [package-names...]', 'install one or more packages')
|
||||
.command('search [query]', 'search with optional query')
|
||||
.command('update', 'update installed packages', { executableFile: 'myUpdateSubCommand' })
|
||||
.command('list', 'list packages installed', { isDefault: true });
|
||||
@@ -904,38 +912,28 @@ program
|
||||
.helpOption('-e, --HELP', 'read more information');
|
||||
```
|
||||
|
||||
### .addHelpCommand()
|
||||
(Or use `.addHelpOption()` to add an option you construct yourself.)
|
||||
|
||||
A help command is added by default if your command has subcommands. You can explicitly turn on or off the implicit help command with `.addHelpCommand()` and `.addHelpCommand(false)`.
|
||||
### .helpCommand()
|
||||
|
||||
A help command is added by default if your command has subcommands. You can explicitly turn on or off the implicit help command with `.helpCommand(true)` and `.helpCommand(false)`.
|
||||
|
||||
You can both turn on and customise the help command by supplying the name and description:
|
||||
|
||||
```js
|
||||
program.addHelpCommand('assist [command]', 'show assistance');
|
||||
program.helpCommand('assist [command]', 'show assistance');
|
||||
```
|
||||
|
||||
(Or use `.addHelpCommand()` to add a command you construct yourself.)
|
||||
|
||||
### More configuration
|
||||
|
||||
The built-in help is formatted using the Help class.
|
||||
You can configure the Help behaviour by modifying data properties and methods using `.configureHelp()`, or by subclassing using `.createHelp()` if you prefer.
|
||||
You can configure the help by modifying data properties and methods using `.configureHelp()`, or by subclassing Help using `.createHelp()` .
|
||||
|
||||
The data properties are:
|
||||
Simple properties include `sortSubcommands`, `sortOptions`, and `showGlobalOptions`. You can add color using the style methods like `styleTitle()`.
|
||||
|
||||
- `helpWidth`: specify the wrap width, useful for unit tests
|
||||
- `sortSubcommands`: sort the subcommands alphabetically
|
||||
- `sortOptions`: sort the options alphabetically
|
||||
- `showGlobalOptions`: show a section with the global options from the parent command(s)
|
||||
|
||||
You can override any method on the [Help](./lib/help.js) class. There are methods getting the visible lists of arguments, options, and subcommands. There are methods for formatting the items in the lists, with each item having a _term_ and _description_. Take a look at `.formatHelp()` to see how they are used.
|
||||
|
||||
Example file: [configure-help.js](./examples/configure-help.js)
|
||||
|
||||
```js
|
||||
program.configureHelp({
|
||||
sortSubcommands: true,
|
||||
subcommandTerm: (cmd) => cmd.name() // Just show the name, instead of short usage.
|
||||
});
|
||||
```
|
||||
For more detail and examples of changing the displayed text, color, and layout see (./docs/help-in-depth.md)
|
||||
|
||||
## Custom event listeners
|
||||
|
||||
@@ -951,22 +949,24 @@ program.on('option:verbose', function () {
|
||||
|
||||
### .parse() and .parseAsync()
|
||||
|
||||
The first argument to `.parse` is the array of strings to parse. You may omit the parameter to implicitly use `process.argv`.
|
||||
Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
||||
|
||||
If the arguments follow different conventions than node you can pass a `from` option in the second parameter:
|
||||
Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
||||
|
||||
- 'node': default, `argv[0]` is the application and `argv[1]` is the script being run, with user parameters after that
|
||||
- 'electron': `argv[1]` varies depending on whether the electron application is packaged
|
||||
- 'user': all of the arguments from the user
|
||||
- `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
||||
- `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
||||
- `'user'`: just user arguments
|
||||
|
||||
For example:
|
||||
|
||||
```js
|
||||
program.parse(process.argv); // Explicit, node conventions
|
||||
program.parse(); // Implicit, and auto-detect electron
|
||||
program.parse(['-f', 'filename'], { from: 'user' });
|
||||
program.parse(); // parse process.argv and auto-detect electron and special node flags
|
||||
program.parse(process.argv); // assume argv[0] is app and argv[1] is script
|
||||
program.parse(['--port', '80'], { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
```
|
||||
|
||||
Use parseAsync instead of parse if any of your action handlers are async.
|
||||
|
||||
### Parsing Configuration
|
||||
|
||||
If the default parsing does not suit your needs, there are some behaviours to support other usage patterns.
|
||||
@@ -1092,8 +1092,9 @@ program.error('Custom processing has failed', { exitCode: 2, code: 'my.custom.er
|
||||
By default, Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override
|
||||
this behaviour and optionally supply a callback. The default override throws a `CommanderError`.
|
||||
|
||||
The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help
|
||||
is not affected by the override which is called after the display.
|
||||
The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`.
|
||||
Commander expects the callback to terminate the normal program flow, and will call `process.exit` if the callback returns.
|
||||
The normal display of error messages or version or help is not affected by the override which is called after the display.
|
||||
|
||||
```js
|
||||
program.exitOverride();
|
||||
@@ -1136,7 +1137,7 @@ There is more information available about:
|
||||
|
||||
## Support
|
||||
|
||||
The current version of Commander is fully supported on Long Term Support versions of Node.js, and requires at least v16.
|
||||
The current version of Commander is fully supported on Long Term Support versions of Node.js, and requires at least v18.
|
||||
(For older versions of Node.js, use an older version of Commander.)
|
||||
|
||||
The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub.
|
||||
|
||||
2
node_modules/commander/esm.mjs
generated
vendored
2
node_modules/commander/esm.mjs
generated
vendored
@@ -12,5 +12,5 @@ export const {
|
||||
Command,
|
||||
Argument,
|
||||
Option,
|
||||
Help
|
||||
Help,
|
||||
} = commander;
|
||||
|
||||
10
node_modules/commander/index.js
generated
vendored
10
node_modules/commander/index.js
generated
vendored
@@ -4,13 +4,11 @@ const { CommanderError, InvalidArgumentError } = require('./lib/error.js');
|
||||
const { Help } = require('./lib/help.js');
|
||||
const { Option } = require('./lib/option.js');
|
||||
|
||||
/**
|
||||
* Expose the root command.
|
||||
*/
|
||||
exports.program = new Command();
|
||||
|
||||
exports = module.exports = new Command();
|
||||
exports.program = exports; // More explicit access to global command.
|
||||
// createArgument, createCommand, and createOption are implicitly available as they are methods on program.
|
||||
exports.createCommand = (name) => new Command(name);
|
||||
exports.createOption = (flags, description) => new Option(flags, description);
|
||||
exports.createArgument = (name, description) => new Argument(name, description);
|
||||
|
||||
/**
|
||||
* Expose classes
|
||||
|
||||
16
node_modules/commander/lib/argument.js
generated
vendored
16
node_modules/commander/lib/argument.js
generated
vendored
@@ -50,7 +50,7 @@ class Argument {
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
* @package
|
||||
*/
|
||||
|
||||
_concatValue(value, previous) {
|
||||
@@ -98,7 +98,9 @@ class Argument {
|
||||
this.argChoices = values.slice();
|
||||
this.parseArg = (arg, previous) => {
|
||||
if (!this.argChoices.includes(arg)) {
|
||||
throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
|
||||
throw new InvalidArgumentError(
|
||||
`Allowed choices are ${this.argChoices.join(', ')}.`,
|
||||
);
|
||||
}
|
||||
if (this.variadic) {
|
||||
return this._concatValue(arg, previous);
|
||||
@@ -110,6 +112,8 @@ class Argument {
|
||||
|
||||
/**
|
||||
* Make argument required.
|
||||
*
|
||||
* @returns {Argument}
|
||||
*/
|
||||
argRequired() {
|
||||
this.required = true;
|
||||
@@ -118,6 +122,8 @@ class Argument {
|
||||
|
||||
/**
|
||||
* Make argument optional.
|
||||
*
|
||||
* @returns {Argument}
|
||||
*/
|
||||
argOptional() {
|
||||
this.required = false;
|
||||
@@ -130,15 +136,13 @@ class Argument {
|
||||
*
|
||||
* @param {Argument} arg
|
||||
* @return {string}
|
||||
* @api private
|
||||
* @private
|
||||
*/
|
||||
|
||||
function humanReadableArgName(arg) {
|
||||
const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');
|
||||
|
||||
return arg.required
|
||||
? '<' + nameOutput + '>'
|
||||
: '[' + nameOutput + ']';
|
||||
return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';
|
||||
}
|
||||
|
||||
exports.Argument = Argument;
|
||||
|
||||
1191
node_modules/commander/lib/command.js
generated
vendored
1191
node_modules/commander/lib/command.js
generated
vendored
File diff suppressed because it is too large
Load Diff
4
node_modules/commander/lib/error.js
generated
vendored
4
node_modules/commander/lib/error.js
generated
vendored
@@ -1,6 +1,5 @@
|
||||
/**
|
||||
* CommanderError class
|
||||
* @class
|
||||
*/
|
||||
class CommanderError extends Error {
|
||||
/**
|
||||
@@ -8,7 +7,6 @@ class CommanderError extends Error {
|
||||
* @param {number} exitCode suggested exit code which could be used with process.exit
|
||||
* @param {string} code an id string representing the error
|
||||
* @param {string} message human-readable description of the error
|
||||
* @constructor
|
||||
*/
|
||||
constructor(exitCode, code, message) {
|
||||
super(message);
|
||||
@@ -23,13 +21,11 @@ class CommanderError extends Error {
|
||||
|
||||
/**
|
||||
* InvalidArgumentError class
|
||||
* @class
|
||||
*/
|
||||
class InvalidArgumentError extends CommanderError {
|
||||
/**
|
||||
* Constructs the InvalidArgumentError class
|
||||
* @param {string} [message] explanation of why argument is invalid
|
||||
* @constructor
|
||||
*/
|
||||
constructor(message) {
|
||||
super(1, 'commander.invalidArgument', message);
|
||||
|
||||
447
node_modules/commander/lib/help.js
generated
vendored
447
node_modules/commander/lib/help.js
generated
vendored
@@ -12,11 +12,24 @@ const { humanReadableArgName } = require('./argument.js');
|
||||
class Help {
|
||||
constructor() {
|
||||
this.helpWidth = undefined;
|
||||
this.minWidthToWrap = 40;
|
||||
this.sortSubcommands = false;
|
||||
this.sortOptions = false;
|
||||
this.showGlobalOptions = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* prepareContext is called by Commander after applying overrides from `Command.configureHelp()`
|
||||
* and just before calling `formatHelp()`.
|
||||
*
|
||||
* Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses.
|
||||
*
|
||||
* @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions
|
||||
*/
|
||||
prepareContext(contextOptions) {
|
||||
this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.
|
||||
*
|
||||
@@ -25,19 +38,14 @@ class Help {
|
||||
*/
|
||||
|
||||
visibleCommands(cmd) {
|
||||
const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden);
|
||||
if (cmd._hasImplicitHelpCommand()) {
|
||||
// Create a command matching the implicit help command.
|
||||
const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/);
|
||||
const helpCommand = cmd.createCommand(helpName)
|
||||
.helpOption(false);
|
||||
helpCommand.description(cmd._helpCommandDescription);
|
||||
if (helpArgs) helpCommand.arguments(helpArgs);
|
||||
const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);
|
||||
const helpCommand = cmd._getHelpCommand();
|
||||
if (helpCommand && !helpCommand._hidden) {
|
||||
visibleCommands.push(helpCommand);
|
||||
}
|
||||
if (this.sortSubcommands) {
|
||||
visibleCommands.sort((a, b) => {
|
||||
// @ts-ignore: overloaded return type
|
||||
// @ts-ignore: because overloaded return type
|
||||
return a.name().localeCompare(b.name());
|
||||
});
|
||||
}
|
||||
@@ -49,12 +57,14 @@ class Help {
|
||||
*
|
||||
* @param {Option} a
|
||||
* @param {Option} b
|
||||
* @returns number
|
||||
* @returns {number}
|
||||
*/
|
||||
compareOptions(a, b) {
|
||||
const getSortKey = (option) => {
|
||||
// WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.
|
||||
return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, '');
|
||||
return option.short
|
||||
? option.short.replace(/^-/, '')
|
||||
: option.long.replace(/^--/, '');
|
||||
};
|
||||
return getSortKey(a).localeCompare(getSortKey(b));
|
||||
}
|
||||
@@ -68,19 +78,23 @@ class Help {
|
||||
|
||||
visibleOptions(cmd) {
|
||||
const visibleOptions = cmd.options.filter((option) => !option.hidden);
|
||||
// Implicit help
|
||||
const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag);
|
||||
const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag);
|
||||
if (showShortHelpFlag || showLongHelpFlag) {
|
||||
let helpOption;
|
||||
if (!showShortHelpFlag) {
|
||||
helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription);
|
||||
} else if (!showLongHelpFlag) {
|
||||
helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription);
|
||||
} else {
|
||||
helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription);
|
||||
// Built-in help option.
|
||||
const helpOption = cmd._getHelpOption();
|
||||
if (helpOption && !helpOption.hidden) {
|
||||
// Automatically hide conflicting flags. Bit dubious but a historical behaviour that is convenient for single-command programs.
|
||||
const removeShort = helpOption.short && cmd._findOption(helpOption.short);
|
||||
const removeLong = helpOption.long && cmd._findOption(helpOption.long);
|
||||
if (!removeShort && !removeLong) {
|
||||
visibleOptions.push(helpOption); // no changes needed
|
||||
} else if (helpOption.long && !removeLong) {
|
||||
visibleOptions.push(
|
||||
cmd.createOption(helpOption.long, helpOption.description),
|
||||
);
|
||||
} else if (helpOption.short && !removeShort) {
|
||||
visibleOptions.push(
|
||||
cmd.createOption(helpOption.short, helpOption.description),
|
||||
);
|
||||
}
|
||||
visibleOptions.push(helpOption);
|
||||
}
|
||||
if (this.sortOptions) {
|
||||
visibleOptions.sort(this.compareOptions);
|
||||
@@ -99,8 +113,14 @@ class Help {
|
||||
if (!this.showGlobalOptions) return [];
|
||||
|
||||
const globalOptions = [];
|
||||
for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) {
|
||||
const visibleOptions = ancestorCmd.options.filter((option) => !option.hidden);
|
||||
for (
|
||||
let ancestorCmd = cmd.parent;
|
||||
ancestorCmd;
|
||||
ancestorCmd = ancestorCmd.parent
|
||||
) {
|
||||
const visibleOptions = ancestorCmd.options.filter(
|
||||
(option) => !option.hidden,
|
||||
);
|
||||
globalOptions.push(...visibleOptions);
|
||||
}
|
||||
if (this.sortOptions) {
|
||||
@@ -119,13 +139,14 @@ class Help {
|
||||
visibleArguments(cmd) {
|
||||
// Side effect! Apply the legacy descriptions before the arguments are displayed.
|
||||
if (cmd._argsDescription) {
|
||||
cmd.registeredArguments.forEach(argument => {
|
||||
argument.description = argument.description || cmd._argsDescription[argument.name()] || '';
|
||||
cmd.registeredArguments.forEach((argument) => {
|
||||
argument.description =
|
||||
argument.description || cmd._argsDescription[argument.name()] || '';
|
||||
});
|
||||
}
|
||||
|
||||
// If there are any arguments with a description then return all the arguments.
|
||||
if (cmd.registeredArguments.find(argument => argument.description)) {
|
||||
if (cmd.registeredArguments.find((argument) => argument.description)) {
|
||||
return cmd.registeredArguments;
|
||||
}
|
||||
return [];
|
||||
@@ -140,11 +161,15 @@ class Help {
|
||||
|
||||
subcommandTerm(cmd) {
|
||||
// Legacy. Ignores custom usage string, and nested commands.
|
||||
const args = cmd.registeredArguments.map(arg => humanReadableArgName(arg)).join(' ');
|
||||
return cmd._name +
|
||||
const args = cmd.registeredArguments
|
||||
.map((arg) => humanReadableArgName(arg))
|
||||
.join(' ');
|
||||
return (
|
||||
cmd._name +
|
||||
(cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +
|
||||
(cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option
|
||||
(args ? ' ' + args : '');
|
||||
(args ? ' ' + args : '')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,7 +204,12 @@ class Help {
|
||||
|
||||
longestSubcommandTermLength(cmd, helper) {
|
||||
return helper.visibleCommands(cmd).reduce((max, command) => {
|
||||
return Math.max(max, helper.subcommandTerm(command).length);
|
||||
return Math.max(
|
||||
max,
|
||||
this.displayWidth(
|
||||
helper.styleSubcommandTerm(helper.subcommandTerm(command)),
|
||||
),
|
||||
);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -193,7 +223,10 @@ class Help {
|
||||
|
||||
longestOptionTermLength(cmd, helper) {
|
||||
return helper.visibleOptions(cmd).reduce((max, option) => {
|
||||
return Math.max(max, helper.optionTerm(option).length);
|
||||
return Math.max(
|
||||
max,
|
||||
this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),
|
||||
);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -207,7 +240,10 @@ class Help {
|
||||
|
||||
longestGlobalOptionTermLength(cmd, helper) {
|
||||
return helper.visibleGlobalOptions(cmd).reduce((max, option) => {
|
||||
return Math.max(max, helper.optionTerm(option).length);
|
||||
return Math.max(
|
||||
max,
|
||||
this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))),
|
||||
);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -221,7 +257,12 @@ class Help {
|
||||
|
||||
longestArgumentTermLength(cmd, helper) {
|
||||
return helper.visibleArguments(cmd).reduce((max, argument) => {
|
||||
return Math.max(max, helper.argumentTerm(argument).length);
|
||||
return Math.max(
|
||||
max,
|
||||
this.displayWidth(
|
||||
helper.styleArgumentTerm(helper.argumentTerm(argument)),
|
||||
),
|
||||
);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
@@ -239,7 +280,11 @@ class Help {
|
||||
cmdName = cmdName + '|' + cmd._aliases[0];
|
||||
}
|
||||
let ancestorCmdNames = '';
|
||||
for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) {
|
||||
for (
|
||||
let ancestorCmd = cmd.parent;
|
||||
ancestorCmd;
|
||||
ancestorCmd = ancestorCmd.parent
|
||||
) {
|
||||
ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;
|
||||
}
|
||||
return ancestorCmdNames + cmdName + ' ' + cmd.usage();
|
||||
@@ -253,7 +298,7 @@ class Help {
|
||||
*/
|
||||
|
||||
commandDescription(cmd) {
|
||||
// @ts-ignore: overloaded return type
|
||||
// @ts-ignore: because overloaded return type
|
||||
return cmd.description();
|
||||
}
|
||||
|
||||
@@ -266,7 +311,7 @@ class Help {
|
||||
*/
|
||||
|
||||
subcommandDescription(cmd) {
|
||||
// @ts-ignore: overloaded return type
|
||||
// @ts-ignore: because overloaded return type
|
||||
return cmd.summary() || cmd.description();
|
||||
}
|
||||
|
||||
@@ -283,15 +328,20 @@ class Help {
|
||||
if (option.argChoices) {
|
||||
extraInfo.push(
|
||||
// use stringify to match the display of the default value
|
||||
`choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
|
||||
`choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,
|
||||
);
|
||||
}
|
||||
if (option.defaultValue !== undefined) {
|
||||
// default for boolean and negated more for programmer than end user,
|
||||
// but show true/false for boolean option as may be for hand-rolled env or config processing.
|
||||
const showDefault = option.required || option.optional ||
|
||||
const showDefault =
|
||||
option.required ||
|
||||
option.optional ||
|
||||
(option.isBoolean() && typeof option.defaultValue === 'boolean');
|
||||
if (showDefault) {
|
||||
extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`);
|
||||
extraInfo.push(
|
||||
`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
// preset for boolean and negated are more for programmer than end user
|
||||
@@ -320,17 +370,20 @@ class Help {
|
||||
if (argument.argChoices) {
|
||||
extraInfo.push(
|
||||
// use stringify to match the display of the default value
|
||||
`choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
|
||||
`choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,
|
||||
);
|
||||
}
|
||||
if (argument.defaultValue !== undefined) {
|
||||
extraInfo.push(`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`);
|
||||
extraInfo.push(
|
||||
`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,
|
||||
);
|
||||
}
|
||||
if (extraInfo.length > 0) {
|
||||
const extraDescripton = `(${extraInfo.join(', ')})`;
|
||||
const extraDescription = `(${extraInfo.join(', ')})`;
|
||||
if (argument.description) {
|
||||
return `${argument.description} ${extraDescripton}`;
|
||||
return `${argument.description} ${extraDescription}`;
|
||||
}
|
||||
return extraDescripton;
|
||||
return extraDescription;
|
||||
}
|
||||
return argument.description;
|
||||
}
|
||||
@@ -345,65 +398,177 @@ class Help {
|
||||
|
||||
formatHelp(cmd, helper) {
|
||||
const termWidth = helper.padWidth(cmd, helper);
|
||||
const helpWidth = helper.helpWidth || 80;
|
||||
const itemIndentWidth = 2;
|
||||
const itemSeparatorWidth = 2; // between term and description
|
||||
function formatItem(term, description) {
|
||||
if (description) {
|
||||
const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
|
||||
return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth);
|
||||
}
|
||||
return term;
|
||||
}
|
||||
function formatList(textArray) {
|
||||
return textArray.join('\n').replace(/^/gm, ' '.repeat(itemIndentWidth));
|
||||
const helpWidth = helper.helpWidth ?? 80; // in case prepareContext() was not called
|
||||
|
||||
function callFormatItem(term, description) {
|
||||
return helper.formatItem(term, termWidth, description, helper);
|
||||
}
|
||||
|
||||
// Usage
|
||||
let output = [`Usage: ${helper.commandUsage(cmd)}`, ''];
|
||||
let output = [
|
||||
`${helper.styleTitle('Usage:')} ${helper.styleUsage(helper.commandUsage(cmd))}`,
|
||||
'',
|
||||
];
|
||||
|
||||
// Description
|
||||
const commandDescription = helper.commandDescription(cmd);
|
||||
if (commandDescription.length > 0) {
|
||||
output = output.concat([helper.wrap(commandDescription, helpWidth, 0), '']);
|
||||
output = output.concat([
|
||||
helper.boxWrap(
|
||||
helper.styleCommandDescription(commandDescription),
|
||||
helpWidth,
|
||||
),
|
||||
'',
|
||||
]);
|
||||
}
|
||||
|
||||
// Arguments
|
||||
const argumentList = helper.visibleArguments(cmd).map((argument) => {
|
||||
return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument));
|
||||
return callFormatItem(
|
||||
helper.styleArgumentTerm(helper.argumentTerm(argument)),
|
||||
helper.styleArgumentDescription(helper.argumentDescription(argument)),
|
||||
);
|
||||
});
|
||||
if (argumentList.length > 0) {
|
||||
output = output.concat(['Arguments:', formatList(argumentList), '']);
|
||||
output = output.concat([
|
||||
helper.styleTitle('Arguments:'),
|
||||
...argumentList,
|
||||
'',
|
||||
]);
|
||||
}
|
||||
|
||||
// Options
|
||||
const optionList = helper.visibleOptions(cmd).map((option) => {
|
||||
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
||||
return callFormatItem(
|
||||
helper.styleOptionTerm(helper.optionTerm(option)),
|
||||
helper.styleOptionDescription(helper.optionDescription(option)),
|
||||
);
|
||||
});
|
||||
if (optionList.length > 0) {
|
||||
output = output.concat(['Options:', formatList(optionList), '']);
|
||||
output = output.concat([
|
||||
helper.styleTitle('Options:'),
|
||||
...optionList,
|
||||
'',
|
||||
]);
|
||||
}
|
||||
|
||||
if (this.showGlobalOptions) {
|
||||
const globalOptionList = helper.visibleGlobalOptions(cmd).map((option) => {
|
||||
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
||||
});
|
||||
if (helper.showGlobalOptions) {
|
||||
const globalOptionList = helper
|
||||
.visibleGlobalOptions(cmd)
|
||||
.map((option) => {
|
||||
return callFormatItem(
|
||||
helper.styleOptionTerm(helper.optionTerm(option)),
|
||||
helper.styleOptionDescription(helper.optionDescription(option)),
|
||||
);
|
||||
});
|
||||
if (globalOptionList.length > 0) {
|
||||
output = output.concat(['Global Options:', formatList(globalOptionList), '']);
|
||||
output = output.concat([
|
||||
helper.styleTitle('Global Options:'),
|
||||
...globalOptionList,
|
||||
'',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// Commands
|
||||
const commandList = helper.visibleCommands(cmd).map((cmd) => {
|
||||
return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd));
|
||||
return callFormatItem(
|
||||
helper.styleSubcommandTerm(helper.subcommandTerm(cmd)),
|
||||
helper.styleSubcommandDescription(helper.subcommandDescription(cmd)),
|
||||
);
|
||||
});
|
||||
if (commandList.length > 0) {
|
||||
output = output.concat(['Commands:', formatList(commandList), '']);
|
||||
output = output.concat([
|
||||
helper.styleTitle('Commands:'),
|
||||
...commandList,
|
||||
'',
|
||||
]);
|
||||
}
|
||||
|
||||
return output.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations.
|
||||
*
|
||||
* @param {string} str
|
||||
* @returns {number}
|
||||
*/
|
||||
displayWidth(str) {
|
||||
return stripColor(str).length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc.
|
||||
*
|
||||
* @param {string} str
|
||||
* @returns {string}
|
||||
*/
|
||||
styleTitle(str) {
|
||||
return str;
|
||||
}
|
||||
|
||||
styleUsage(str) {
|
||||
// Usage has lots of parts the user might like to color separately! Assume default usage string which is formed like:
|
||||
// command subcommand [options] [command] <foo> [bar]
|
||||
return str
|
||||
.split(' ')
|
||||
.map((word) => {
|
||||
if (word === '[options]') return this.styleOptionText(word);
|
||||
if (word === '[command]') return this.styleSubcommandText(word);
|
||||
if (word[0] === '[' || word[0] === '<')
|
||||
return this.styleArgumentText(word);
|
||||
return this.styleCommandText(word); // Restrict to initial words?
|
||||
})
|
||||
.join(' ');
|
||||
}
|
||||
styleCommandDescription(str) {
|
||||
return this.styleDescriptionText(str);
|
||||
}
|
||||
styleOptionDescription(str) {
|
||||
return this.styleDescriptionText(str);
|
||||
}
|
||||
styleSubcommandDescription(str) {
|
||||
return this.styleDescriptionText(str);
|
||||
}
|
||||
styleArgumentDescription(str) {
|
||||
return this.styleDescriptionText(str);
|
||||
}
|
||||
styleDescriptionText(str) {
|
||||
return str;
|
||||
}
|
||||
styleOptionTerm(str) {
|
||||
return this.styleOptionText(str);
|
||||
}
|
||||
styleSubcommandTerm(str) {
|
||||
// This is very like usage with lots of parts! Assume default string which is formed like:
|
||||
// subcommand [options] <foo> [bar]
|
||||
return str
|
||||
.split(' ')
|
||||
.map((word) => {
|
||||
if (word === '[options]') return this.styleOptionText(word);
|
||||
if (word[0] === '[' || word[0] === '<')
|
||||
return this.styleArgumentText(word);
|
||||
return this.styleSubcommandText(word); // Restrict to initial words?
|
||||
})
|
||||
.join(' ');
|
||||
}
|
||||
styleArgumentTerm(str) {
|
||||
return this.styleArgumentText(str);
|
||||
}
|
||||
styleOptionText(str) {
|
||||
return str;
|
||||
}
|
||||
styleArgumentText(str) {
|
||||
return str;
|
||||
}
|
||||
styleSubcommandText(str) {
|
||||
return str;
|
||||
}
|
||||
styleCommandText(str) {
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the pad width from the maximum term length.
|
||||
*
|
||||
@@ -417,46 +582,128 @@ class Help {
|
||||
helper.longestOptionTermLength(cmd, helper),
|
||||
helper.longestGlobalOptionTermLength(cmd, helper),
|
||||
helper.longestSubcommandTermLength(cmd, helper),
|
||||
helper.longestArgumentTermLength(cmd, helper)
|
||||
helper.longestArgumentTermLength(cmd, helper),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the given string to width characters per line, with lines after the first indented.
|
||||
* Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
|
||||
* Detect manually wrapped and indented strings by checking for line break followed by whitespace.
|
||||
*
|
||||
* @param {string} str
|
||||
* @returns {boolean}
|
||||
*/
|
||||
preformatted(str) {
|
||||
return /\n[^\S\r\n]/.test(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the "item", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.
|
||||
*
|
||||
* So "TTT", 5, "DDD DDDD DD DDD" might be formatted for this.helpWidth=17 like so:
|
||||
* TTT DDD DDDD
|
||||
* DD DDD
|
||||
*
|
||||
* @param {string} term
|
||||
* @param {number} termWidth
|
||||
* @param {string} description
|
||||
* @param {Help} helper
|
||||
* @returns {string}
|
||||
*/
|
||||
formatItem(term, termWidth, description, helper) {
|
||||
const itemIndent = 2;
|
||||
const itemIndentStr = ' '.repeat(itemIndent);
|
||||
if (!description) return itemIndentStr + term;
|
||||
|
||||
// Pad the term out to a consistent width, so descriptions are aligned.
|
||||
const paddedTerm = term.padEnd(
|
||||
termWidth + term.length - helper.displayWidth(term),
|
||||
);
|
||||
|
||||
// Format the description.
|
||||
const spacerWidth = 2; // between term and description
|
||||
const helpWidth = this.helpWidth ?? 80; // in case prepareContext() was not called
|
||||
const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent;
|
||||
let formattedDescription;
|
||||
if (
|
||||
remainingWidth < this.minWidthToWrap ||
|
||||
helper.preformatted(description)
|
||||
) {
|
||||
formattedDescription = description;
|
||||
} else {
|
||||
const wrappedDescription = helper.boxWrap(description, remainingWidth);
|
||||
formattedDescription = wrappedDescription.replace(
|
||||
/\n/g,
|
||||
'\n' + ' '.repeat(termWidth + spacerWidth),
|
||||
);
|
||||
}
|
||||
|
||||
// Construct and overall indent.
|
||||
return (
|
||||
itemIndentStr +
|
||||
paddedTerm +
|
||||
' '.repeat(spacerWidth) +
|
||||
formattedDescription.replace(/\n/g, `\n${itemIndentStr}`)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a string at whitespace, preserving existing line breaks.
|
||||
* Wrapping is skipped if the width is less than `minWidthToWrap`.
|
||||
*
|
||||
* @param {string} str
|
||||
* @param {number} width
|
||||
* @param {number} indent
|
||||
* @param {number} [minColumnWidth=40]
|
||||
* @return {string}
|
||||
*
|
||||
* @returns {string}
|
||||
*/
|
||||
boxWrap(str, width) {
|
||||
if (width < this.minWidthToWrap) return str;
|
||||
|
||||
wrap(str, width, indent, minColumnWidth = 40) {
|
||||
// Full \s characters, minus the linefeeds.
|
||||
const indents = ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff';
|
||||
// Detect manually wrapped and indented strings by searching for line break followed by spaces.
|
||||
const manualIndent = new RegExp(`[\\n][${indents}]+`);
|
||||
if (str.match(manualIndent)) return str;
|
||||
// Do not wrap if not enough room for a wrapped column of text (as could end up with a word per line).
|
||||
const columnWidth = width - indent;
|
||||
if (columnWidth < minColumnWidth) return str;
|
||||
const rawLines = str.split(/\r\n|\n/);
|
||||
// split up text by whitespace
|
||||
const chunkPattern = /[\s]*[^\s]+/g;
|
||||
const wrappedLines = [];
|
||||
rawLines.forEach((line) => {
|
||||
const chunks = line.match(chunkPattern);
|
||||
if (chunks === null) {
|
||||
wrappedLines.push('');
|
||||
return;
|
||||
}
|
||||
|
||||
const leadingStr = str.slice(0, indent);
|
||||
const columnText = str.slice(indent).replace('\r\n', '\n');
|
||||
const indentString = ' '.repeat(indent);
|
||||
const zeroWidthSpace = '\u200B';
|
||||
const breaks = `\\s${zeroWidthSpace}`;
|
||||
// Match line end (so empty lines don't collapse),
|
||||
// or as much text as will fit in column, or excess text up to first break.
|
||||
const regex = new RegExp(`\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, 'g');
|
||||
const lines = columnText.match(regex) || [];
|
||||
return leadingStr + lines.map((line, i) => {
|
||||
if (line === '\n') return ''; // preserve empty lines
|
||||
return ((i > 0) ? indentString : '') + line.trimEnd();
|
||||
}).join('\n');
|
||||
let sumChunks = [chunks.shift()];
|
||||
let sumWidth = this.displayWidth(sumChunks[0]);
|
||||
chunks.forEach((chunk) => {
|
||||
const visibleWidth = this.displayWidth(chunk);
|
||||
// Accumulate chunks while they fit into width.
|
||||
if (sumWidth + visibleWidth <= width) {
|
||||
sumChunks.push(chunk);
|
||||
sumWidth += visibleWidth;
|
||||
return;
|
||||
}
|
||||
wrappedLines.push(sumChunks.join(''));
|
||||
|
||||
const nextChunk = chunk.trimStart(); // trim space at line break
|
||||
sumChunks = [nextChunk];
|
||||
sumWidth = this.displayWidth(nextChunk);
|
||||
});
|
||||
wrappedLines.push(sumChunks.join(''));
|
||||
});
|
||||
|
||||
return wrappedLines.join('\n');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip style ANSI escape sequences from the string. In particular, SGR (Select Graphic Rendition) codes.
|
||||
*
|
||||
* @param {string} str
|
||||
* @returns {string}
|
||||
* @package
|
||||
*/
|
||||
|
||||
function stripColor(str) {
|
||||
// eslint-disable-next-line no-control-regex
|
||||
const sgrPattern = /\x1b\[\d*(;\d*)*m/g;
|
||||
return str.replace(sgrPattern, '');
|
||||
}
|
||||
|
||||
exports.Help = Help;
|
||||
exports.stripColor = stripColor;
|
||||
|
||||
84
node_modules/commander/lib/option.js
generated
vendored
84
node_modules/commander/lib/option.js
generated
vendored
@@ -18,7 +18,7 @@ class Option {
|
||||
this.variadic = /\w\.\.\.[>\]]$/.test(flags); // The option can take multiple values.
|
||||
this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
|
||||
const optionFlags = splitOptionFlags(flags);
|
||||
this.short = optionFlags.shortFlag;
|
||||
this.short = optionFlags.shortFlag; // May be a short flag, undefined, or even a long flag (if option has two long flags).
|
||||
this.long = optionFlags.longFlag;
|
||||
this.negate = false;
|
||||
if (this.long) {
|
||||
@@ -74,7 +74,7 @@ class Option {
|
||||
* new Option('--rgb').conflicts('cmyk');
|
||||
* new Option('--js').conflicts(['ts', 'jsx']);
|
||||
*
|
||||
* @param {string | string[]} names
|
||||
* @param {(string | string[])} names
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
@@ -93,7 +93,7 @@ class Option {
|
||||
* .addOption(new Option('--log', 'write logging information to file'))
|
||||
* .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
|
||||
*
|
||||
* @param {Object} impliedOptionValues
|
||||
* @param {object} impliedOptionValues
|
||||
* @return {Option}
|
||||
*/
|
||||
implies(impliedOptionValues) {
|
||||
@@ -158,7 +158,7 @@ class Option {
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
* @package
|
||||
*/
|
||||
|
||||
_concatValue(value, previous) {
|
||||
@@ -180,7 +180,9 @@ class Option {
|
||||
this.argChoices = values.slice();
|
||||
this.parseArg = (arg, previous) => {
|
||||
if (!this.argChoices.includes(arg)) {
|
||||
throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
|
||||
throw new InvalidArgumentError(
|
||||
`Allowed choices are ${this.argChoices.join(', ')}.`,
|
||||
);
|
||||
}
|
||||
if (this.variadic) {
|
||||
return this._concatValue(arg, previous);
|
||||
@@ -205,14 +207,16 @@ class Option {
|
||||
|
||||
/**
|
||||
* Return option name, in a camelcase format that can be used
|
||||
* as a object attribute key.
|
||||
* as an object attribute key.
|
||||
*
|
||||
* @return {string}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
attributeName() {
|
||||
return camelcase(this.name().replace(/^no-/, ''));
|
||||
if (this.negate) {
|
||||
return camelcase(this.name().replace(/^no-/, ''));
|
||||
}
|
||||
return camelcase(this.name());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -220,7 +224,7 @@ class Option {
|
||||
*
|
||||
* @param {string} arg
|
||||
* @return {boolean}
|
||||
* @api private
|
||||
* @package
|
||||
*/
|
||||
|
||||
is(arg) {
|
||||
@@ -233,7 +237,7 @@ class Option {
|
||||
* Options are one of boolean, negated, required argument, or optional argument.
|
||||
*
|
||||
* @return {boolean}
|
||||
* @api private
|
||||
* @package
|
||||
*/
|
||||
|
||||
isBoolean() {
|
||||
@@ -256,7 +260,7 @@ class DualOptions {
|
||||
this.positiveOptions = new Map();
|
||||
this.negativeOptions = new Map();
|
||||
this.dualOptions = new Set();
|
||||
options.forEach(option => {
|
||||
options.forEach((option) => {
|
||||
if (option.negate) {
|
||||
this.negativeOptions.set(option.attributeName(), option);
|
||||
} else {
|
||||
@@ -283,7 +287,7 @@ class DualOptions {
|
||||
|
||||
// Use the value to deduce if (probably) came from the option.
|
||||
const preset = this.negativeOptions.get(optionKey).presetArg;
|
||||
const negativeValue = (preset !== undefined) ? preset : false;
|
||||
const negativeValue = preset !== undefined ? preset : false;
|
||||
return option.negate === (negativeValue === value);
|
||||
}
|
||||
}
|
||||
@@ -293,7 +297,7 @@ class DualOptions {
|
||||
*
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
* @api private
|
||||
* @private
|
||||
*/
|
||||
|
||||
function camelcase(str) {
|
||||
@@ -305,25 +309,59 @@ function camelcase(str) {
|
||||
/**
|
||||
* Split the short and long flag out of something like '-m,--mixed <value>'
|
||||
*
|
||||
* @api private
|
||||
* @private
|
||||
*/
|
||||
|
||||
function splitOptionFlags(flags) {
|
||||
let shortFlag;
|
||||
let longFlag;
|
||||
// Use original very loose parsing to maintain backwards compatibility for now,
|
||||
// which allowed for example unintended `-sw, --short-word` [sic].
|
||||
const flagParts = flags.split(/[ |,]+/);
|
||||
if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift();
|
||||
longFlag = flagParts.shift();
|
||||
// Add support for lone short flag without significantly changing parsing!
|
||||
if (!shortFlag && /^-[^-]$/.test(longFlag)) {
|
||||
// short flag, single dash and single character
|
||||
const shortFlagExp = /^-[^-]$/;
|
||||
// long flag, double dash and at least one character
|
||||
const longFlagExp = /^--[^-]/;
|
||||
|
||||
const flagParts = flags.split(/[ |,]+/).concat('guard');
|
||||
// Normal is short and/or long.
|
||||
if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift();
|
||||
if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift();
|
||||
// Long then short. Rarely used but fine.
|
||||
if (!shortFlag && shortFlagExp.test(flagParts[0]))
|
||||
shortFlag = flagParts.shift();
|
||||
// Allow two long flags, like '--ws, --workspace'
|
||||
// This is the supported way to have a shortish option flag.
|
||||
if (!shortFlag && longFlagExp.test(flagParts[0])) {
|
||||
shortFlag = longFlag;
|
||||
longFlag = undefined;
|
||||
longFlag = flagParts.shift();
|
||||
}
|
||||
|
||||
// Check for unprocessed flag. Fail noisily rather than silently ignore.
|
||||
if (flagParts[0].startsWith('-')) {
|
||||
const unsupportedFlag = flagParts[0];
|
||||
const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags}'`;
|
||||
if (/^-[^-][^-]/.test(unsupportedFlag))
|
||||
throw new Error(
|
||||
`${baseError}
|
||||
- a short flag is a single dash and a single character
|
||||
- either use a single dash and a single character (for a short flag)
|
||||
- or use a double dash for a long option (and can have two, like '--ws, --workspace')`,
|
||||
);
|
||||
if (shortFlagExp.test(unsupportedFlag))
|
||||
throw new Error(`${baseError}
|
||||
- too many short flags`);
|
||||
if (longFlagExp.test(unsupportedFlag))
|
||||
throw new Error(`${baseError}
|
||||
- too many long flags`);
|
||||
|
||||
throw new Error(`${baseError}
|
||||
- unrecognised flag format`);
|
||||
}
|
||||
if (shortFlag === undefined && longFlag === undefined)
|
||||
throw new Error(
|
||||
`option creation failed due to no flags found in '${flags}'.`,
|
||||
);
|
||||
|
||||
return { shortFlag, longFlag };
|
||||
}
|
||||
|
||||
exports.Option = Option;
|
||||
exports.splitOptionFlags = splitOptionFlags;
|
||||
exports.DualOptions = DualOptions;
|
||||
|
||||
9
node_modules/commander/lib/suggestSimilar.js
generated
vendored
9
node_modules/commander/lib/suggestSimilar.js
generated
vendored
@@ -6,7 +6,8 @@ function editDistance(a, b) {
|
||||
// (Simple implementation.)
|
||||
|
||||
// Quick early exit, return worst case.
|
||||
if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length);
|
||||
if (Math.abs(a.length - b.length) > maxDistance)
|
||||
return Math.max(a.length, b.length);
|
||||
|
||||
// distance between prefix substrings of a and b
|
||||
const d = [];
|
||||
@@ -32,7 +33,7 @@ function editDistance(a, b) {
|
||||
d[i][j] = Math.min(
|
||||
d[i - 1][j] + 1, // deletion
|
||||
d[i][j - 1] + 1, // insertion
|
||||
d[i - 1][j - 1] + cost // substitution
|
||||
d[i - 1][j - 1] + cost, // substitution
|
||||
);
|
||||
// transposition
|
||||
if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {
|
||||
@@ -60,7 +61,7 @@ function suggestSimilar(word, candidates) {
|
||||
const searchingOptions = word.startsWith('--');
|
||||
if (searchingOptions) {
|
||||
word = word.slice(2);
|
||||
candidates = candidates.map(candidate => candidate.slice(2));
|
||||
candidates = candidates.map((candidate) => candidate.slice(2));
|
||||
}
|
||||
|
||||
let similar = [];
|
||||
@@ -85,7 +86,7 @@ function suggestSimilar(word, candidates) {
|
||||
|
||||
similar.sort((a, b) => a.localeCompare(b));
|
||||
if (searchingOptions) {
|
||||
similar = similar.map(candidate => `--${candidate}`);
|
||||
similar = similar.map((candidate) => `--${candidate}`);
|
||||
}
|
||||
|
||||
if (similar.length > 1) {
|
||||
|
||||
48
node_modules/commander/package.json
generated
vendored
48
node_modules/commander/package.json
generated
vendored
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "commander",
|
||||
"version": "11.1.0",
|
||||
"version": "13.1.0",
|
||||
"description": "the complete solution for node.js command-line programs",
|
||||
"keywords": [
|
||||
"commander",
|
||||
@@ -16,17 +16,21 @@
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tj/commander.js.git"
|
||||
"url": "git+https://github.com/tj/commander.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "npm run lint:javascript && npm run lint:typescript",
|
||||
"lint:javascript": "eslint index.js esm.mjs \"lib/*.js\" \"tests/**/*.js\"",
|
||||
"lint:typescript": "eslint typings/*.ts tests/*.ts",
|
||||
"test": "jest && npm run typecheck-ts",
|
||||
"test-esm": "node ./tests/esm-imports-test.mjs",
|
||||
"typecheck-ts": "tsd && tsc -p tsconfig.ts.json",
|
||||
"typecheck-js": "tsc -p tsconfig.js.json",
|
||||
"test-all": "npm run test && npm run lint && npm run typecheck-js && npm run test-esm"
|
||||
"check": "npm run check:type && npm run check:lint && npm run check:format",
|
||||
"check:format": "prettier --check .",
|
||||
"check:lint": "eslint .",
|
||||
"check:type": "npm run check:type:js && npm run check:type:ts",
|
||||
"check:type:ts": "tsd && tsc -p tsconfig.ts.json",
|
||||
"check:type:js": "tsc -p tsconfig.js.json",
|
||||
"fix": "npm run fix:lint && npm run fix:format",
|
||||
"fix:format": "prettier --write .",
|
||||
"fix:lint": "eslint --fix .",
|
||||
"test": "jest && npm run check:type:ts",
|
||||
"test-all": "jest && npm run test-esm && npm run check",
|
||||
"test-esm": "node ./tests/esm-imports-test.mjs"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
@@ -56,25 +60,23 @@
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.4.0",
|
||||
"@types/jest": "^29.2.4",
|
||||
"@types/node": "^20.2.5",
|
||||
"@typescript-eslint/eslint-plugin": "^5.47.1",
|
||||
"@typescript-eslint/parser": "^5.47.1",
|
||||
"eslint": "^8.30.0",
|
||||
"eslint-config-standard": "^17.0.0",
|
||||
"eslint-config-standard-with-typescript": "^33.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jest": "^27.1.7",
|
||||
"eslint-plugin-n": "^15.6.0",
|
||||
"eslint-plugin-promise": "^6.1.1",
|
||||
"@types/node": "^22.7.4",
|
||||
"eslint": "^9.17.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-jest": "^28.3.0",
|
||||
"globals": "^15.7.0",
|
||||
"jest": "^29.3.1",
|
||||
"prettier": "^3.2.5",
|
||||
"ts-jest": "^29.0.3",
|
||||
"tsd": "^0.28.1",
|
||||
"typescript": "^5.0.4"
|
||||
"tsd": "^0.31.0",
|
||||
"typescript": "^5.0.4",
|
||||
"typescript-eslint": "^8.12.2"
|
||||
},
|
||||
"types": "typings/index.d.ts",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
"node": ">=18"
|
||||
},
|
||||
"support": true
|
||||
}
|
||||
|
||||
273
node_modules/commander/typings/index.d.ts
generated
vendored
273
node_modules/commander/typings/index.d.ts
generated
vendored
@@ -1,8 +1,6 @@
|
||||
// Type definitions for commander
|
||||
// Original definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
||||
|
||||
// Using method rather than property for method-signature-style, to document method overloads separately. Allow either.
|
||||
/* eslint-disable @typescript-eslint/method-signature-style */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
// This is a trick to encourage editor to suggest the known literals while still
|
||||
@@ -11,7 +9,9 @@
|
||||
// - https://github.com/microsoft/TypeScript/issues/29729
|
||||
// - https://github.com/sindresorhus/type-fest/blob/main/source/literal-union.d.ts
|
||||
// - https://github.com/sindresorhus/type-fest/blob/main/source/primitive.d.ts
|
||||
type LiteralUnion<LiteralType, BaseType extends string | number> = LiteralType | (BaseType & Record<never, never>);
|
||||
type LiteralUnion<LiteralType, BaseType extends string | number> =
|
||||
| LiteralType
|
||||
| (BaseType & Record<never, never>);
|
||||
|
||||
export class CommanderError extends Error {
|
||||
code: string;
|
||||
@@ -24,7 +24,6 @@ export class CommanderError extends Error {
|
||||
* @param exitCode - suggested exit code which could be used with process.exit
|
||||
* @param code - an id string representing the error
|
||||
* @param message - human-readable description of the error
|
||||
* @constructor
|
||||
*/
|
||||
constructor(exitCode: number, code: string, message: string);
|
||||
}
|
||||
@@ -33,13 +32,13 @@ export class InvalidArgumentError extends CommanderError {
|
||||
/**
|
||||
* Constructs the InvalidArgumentError class
|
||||
* @param message - explanation of why argument is invalid
|
||||
* @constructor
|
||||
*/
|
||||
constructor(message: string);
|
||||
}
|
||||
export { InvalidArgumentError as InvalidOptionArgumentError }; // deprecated old name
|
||||
|
||||
export interface ErrorOptions { // optional parameter for error()
|
||||
export interface ErrorOptions {
|
||||
// optional parameter for error()
|
||||
/** an id string representing the error */
|
||||
code?: string;
|
||||
/** suggested exit code which could be used with process.exit */
|
||||
@@ -162,11 +161,6 @@ export class Option {
|
||||
*/
|
||||
env(name: string): this;
|
||||
|
||||
/**
|
||||
* Calculate the full description, including defaultValue etc.
|
||||
*/
|
||||
fullDescription(): string;
|
||||
|
||||
/**
|
||||
* Set the custom handler for processing CLI option arguments into option values.
|
||||
*/
|
||||
@@ -194,7 +188,7 @@ export class Option {
|
||||
|
||||
/**
|
||||
* Return option name, in a camelcase format that can be used
|
||||
* as a object attribute key.
|
||||
* as an object attribute key.
|
||||
*/
|
||||
attributeName(): string;
|
||||
|
||||
@@ -209,12 +203,25 @@ export class Option {
|
||||
export class Help {
|
||||
/** output helpWidth, long lines are wrapped to fit */
|
||||
helpWidth?: number;
|
||||
minWidthToWrap: number;
|
||||
sortSubcommands: boolean;
|
||||
sortOptions: boolean;
|
||||
showGlobalOptions: boolean;
|
||||
|
||||
constructor();
|
||||
|
||||
/*
|
||||
* prepareContext is called by Commander after applying overrides from `Command.configureHelp()`
|
||||
* and just before calling `formatHelp()`.
|
||||
*
|
||||
* Commander just uses the helpWidth and the others are provided for subclasses.
|
||||
*/
|
||||
prepareContext(contextOptions: {
|
||||
error?: boolean;
|
||||
helpWidth?: number;
|
||||
outputHasColors?: boolean;
|
||||
}): void;
|
||||
|
||||
/** Get the command term to show in the list of subcommands. */
|
||||
subcommandTerm(cmd: Command): string;
|
||||
/** Get the command summary to show in the list of subcommands. */
|
||||
@@ -250,14 +257,61 @@ export class Help {
|
||||
longestGlobalOptionTermLength(cmd: Command, helper: Help): number;
|
||||
/** Get the longest argument term length. */
|
||||
longestArgumentTermLength(cmd: Command, helper: Help): number;
|
||||
|
||||
/** Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations. */
|
||||
displayWidth(str: string): number;
|
||||
|
||||
/** Style the titles. Called with 'Usage:', 'Options:', etc. */
|
||||
styleTitle(title: string): string;
|
||||
|
||||
/** Usage: <str> */
|
||||
styleUsage(str: string): string;
|
||||
/** Style for command name in usage string. */
|
||||
styleCommandText(str: string): string;
|
||||
|
||||
styleCommandDescription(str: string): string;
|
||||
styleOptionDescription(str: string): string;
|
||||
styleSubcommandDescription(str: string): string;
|
||||
styleArgumentDescription(str: string): string;
|
||||
/** Base style used by descriptions. */
|
||||
styleDescriptionText(str: string): string;
|
||||
|
||||
styleOptionTerm(str: string): string;
|
||||
styleSubcommandTerm(str: string): string;
|
||||
styleArgumentTerm(str: string): string;
|
||||
|
||||
/** Base style used in terms and usage for options. */
|
||||
styleOptionText(str: string): string;
|
||||
/** Base style used in terms and usage for subcommands. */
|
||||
styleSubcommandText(str: string): string;
|
||||
/** Base style used in terms and usage for arguments. */
|
||||
styleArgumentText(str: string): string;
|
||||
|
||||
/** Calculate the pad width from the maximum term length. */
|
||||
padWidth(cmd: Command, helper: Help): number;
|
||||
|
||||
/**
|
||||
* Wrap the given string to width characters per line, with lines after the first indented.
|
||||
* Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
|
||||
* Wrap a string at whitespace, preserving existing line breaks.
|
||||
* Wrapping is skipped if the width is less than `minWidthToWrap`.
|
||||
*/
|
||||
wrap(str: string, width: number, indent: number, minColumnWidth?: number): string;
|
||||
boxWrap(str: string, width: number): string;
|
||||
|
||||
/** Detect manually wrapped and indented strings by checking for line break followed by whitespace. */
|
||||
preformatted(str: string): boolean;
|
||||
|
||||
/**
|
||||
* Format the "item", which consists of a term and description. Pad the term and wrap the description, indenting the following lines.
|
||||
*
|
||||
* So "TTT", 5, "DDD DDDD DD DDD" might be formatted for this.helpWidth=17 like so:
|
||||
* TTT DDD DDDD
|
||||
* DD DDD
|
||||
*/
|
||||
formatItem(
|
||||
term: string,
|
||||
termWidth: number,
|
||||
description: string,
|
||||
helper: Help,
|
||||
): string;
|
||||
|
||||
/** Generate the built-in help text. */
|
||||
formatHelp(cmd: Command, helper: Help): string;
|
||||
@@ -267,26 +321,34 @@ export type HelpConfiguration = Partial<Help>;
|
||||
export interface ParseOptions {
|
||||
from: 'node' | 'electron' | 'user';
|
||||
}
|
||||
export interface HelpContext { // optional parameter for .help() and .outputHelp()
|
||||
export interface HelpContext {
|
||||
// optional parameter for .help() and .outputHelp()
|
||||
error: boolean;
|
||||
}
|
||||
export interface AddHelpTextContext { // passed to text function used with .addHelpText()
|
||||
export interface AddHelpTextContext {
|
||||
// passed to text function used with .addHelpText()
|
||||
error: boolean;
|
||||
command: Command;
|
||||
}
|
||||
export interface OutputConfiguration {
|
||||
writeOut?(str: string): void;
|
||||
writeErr?(str: string): void;
|
||||
getOutHelpWidth?(): number;
|
||||
getErrHelpWidth?(): number;
|
||||
outputError?(str: string, write: (str: string) => void): void;
|
||||
|
||||
getOutHelpWidth?(): number;
|
||||
getErrHelpWidth?(): number;
|
||||
|
||||
getOutHasColors?(): boolean;
|
||||
getErrHasColors?(): boolean;
|
||||
stripColor?(str: string): string;
|
||||
}
|
||||
|
||||
export type AddHelpTextPosition = 'beforeAll' | 'before' | 'after' | 'afterAll';
|
||||
export type HookEvent = 'preSubcommand' | 'preAction' | 'postAction';
|
||||
// The source is a string so author can define their own too.
|
||||
export type OptionValueSource = LiteralUnion<'default' | 'config' | 'env' | 'cli' | 'implied', string> | undefined;
|
||||
export type OptionValueSource =
|
||||
| LiteralUnion<'default' | 'config' | 'env' | 'cli' | 'implied', string>
|
||||
| undefined;
|
||||
|
||||
export type OptionValues = Record<string, any>;
|
||||
|
||||
@@ -334,7 +396,10 @@ export class Command {
|
||||
* @param opts - configuration options
|
||||
* @returns new command
|
||||
*/
|
||||
command(nameAndArgs: string, opts?: CommandOptions): ReturnType<this['createCommand']>;
|
||||
command(
|
||||
nameAndArgs: string,
|
||||
opts?: CommandOptions,
|
||||
): ReturnType<this['createCommand']>;
|
||||
/**
|
||||
* Define a command, implemented in a separate executable file.
|
||||
*
|
||||
@@ -353,7 +418,11 @@ export class Command {
|
||||
* @param opts - configuration options
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
command(nameAndArgs: string, description: string, opts?: ExecutableCommandOptions): this;
|
||||
command(
|
||||
nameAndArgs: string,
|
||||
description: string,
|
||||
opts?: ExecutableCommandOptions,
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached command.
|
||||
@@ -394,7 +463,12 @@ export class Command {
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
argument<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
argument<T>(
|
||||
flags: string,
|
||||
description: string,
|
||||
fn: (value: string, previous: T) => T,
|
||||
defaultValue?: T,
|
||||
): this;
|
||||
argument(name: string, description?: string, defaultValue?: unknown): this;
|
||||
|
||||
/**
|
||||
@@ -419,23 +493,38 @@ export class Command {
|
||||
arguments(names: string): this;
|
||||
|
||||
/**
|
||||
* Override default decision whether to add implicit help command.
|
||||
* Customise or override default help command. By default a help command is automatically added if your command has subcommands.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program.helpCommand('help [cmd]');
|
||||
* program.helpCommand('help [cmd]', 'show help');
|
||||
* program.helpCommand(false); // suppress default help command
|
||||
* program.helpCommand(true); // add help command even if no subcommands
|
||||
* ```
|
||||
* addHelpCommand() // force on
|
||||
* addHelpCommand(false); // force off
|
||||
* addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
addHelpCommand(enableOrNameAndArgs?: string | boolean, description?: string): this;
|
||||
helpCommand(nameAndArgs: string, description?: string): this;
|
||||
helpCommand(enable: boolean): this;
|
||||
|
||||
/**
|
||||
* Add prepared custom help command.
|
||||
*/
|
||||
addHelpCommand(cmd: Command): this;
|
||||
/** @deprecated since v12, instead use helpCommand */
|
||||
addHelpCommand(nameAndArgs: string, description?: string): this;
|
||||
/** @deprecated since v12, instead use helpCommand */
|
||||
addHelpCommand(enable?: boolean): this;
|
||||
|
||||
/**
|
||||
* Add hook for life cycle event.
|
||||
*/
|
||||
hook(event: HookEvent, listener: (thisCommand: Command, actionCommand: Command) => void | Promise<void>): this;
|
||||
hook(
|
||||
event: HookEvent,
|
||||
listener: (
|
||||
thisCommand: Command,
|
||||
actionCommand: Command,
|
||||
) => void | Promise<void>,
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Register callback to use as replacement for calling process.exit.
|
||||
@@ -513,7 +602,7 @@ export class Command {
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
action(fn: (...args: any[]) => void | Promise<void>): this;
|
||||
action(fn: (this: this, ...args: any[]) => void | Promise<void>): this;
|
||||
|
||||
/**
|
||||
* Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.
|
||||
@@ -528,17 +617,31 @@ export class Command {
|
||||
* ```js
|
||||
* program
|
||||
* .option('-p, --pepper', 'add pepper')
|
||||
* .option('-p, --pizza-type <TYPE>', 'type of pizza') // required option-argument
|
||||
* .option('--pt, --pizza-type <TYPE>', 'type of pizza') // required option-argument
|
||||
* .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default
|
||||
* .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
option(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
||||
option<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
option(
|
||||
flags: string,
|
||||
description?: string,
|
||||
defaultValue?: string | boolean | string[],
|
||||
): this;
|
||||
option<T>(
|
||||
flags: string,
|
||||
description: string,
|
||||
parseArg: (value: string, previous: T) => T,
|
||||
defaultValue?: T,
|
||||
): this;
|
||||
/** @deprecated since v7, instead use choices or a custom function */
|
||||
option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
||||
option(
|
||||
flags: string,
|
||||
description: string,
|
||||
regexp: RegExp,
|
||||
defaultValue?: string | boolean | string[],
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Define a required option, which must have a value after parsing. This usually means
|
||||
@@ -546,10 +649,24 @@ export class Command {
|
||||
*
|
||||
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
|
||||
*/
|
||||
requiredOption(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
||||
requiredOption<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
requiredOption(
|
||||
flags: string,
|
||||
description?: string,
|
||||
defaultValue?: string | boolean | string[],
|
||||
): this;
|
||||
requiredOption<T>(
|
||||
flags: string,
|
||||
description: string,
|
||||
parseArg: (value: string, previous: T) => T,
|
||||
defaultValue?: T,
|
||||
): this;
|
||||
/** @deprecated since v7, instead use choices or a custom function */
|
||||
requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
||||
requiredOption(
|
||||
flags: string,
|
||||
description: string,
|
||||
regexp: RegExp,
|
||||
defaultValue?: string | boolean | string[],
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached option.
|
||||
@@ -574,7 +691,9 @@ export class Command {
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
storeOptionsAsProperties<T extends OptionValues>(): this & T;
|
||||
storeOptionsAsProperties<T extends OptionValues>(storeAsProperties: true): this & T;
|
||||
storeOptionsAsProperties<T extends OptionValues>(
|
||||
storeAsProperties: true,
|
||||
): this & T;
|
||||
storeOptionsAsProperties(storeAsProperties?: boolean): this;
|
||||
|
||||
/**
|
||||
@@ -590,7 +709,11 @@ export class Command {
|
||||
/**
|
||||
* Store option value and where the value came from.
|
||||
*/
|
||||
setOptionValueWithSource(key: string, value: unknown, source: OptionValueSource): this;
|
||||
setOptionValueWithSource(
|
||||
key: string,
|
||||
value: unknown,
|
||||
source: OptionValueSource,
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Get source of option value.
|
||||
@@ -598,7 +721,7 @@ export class Command {
|
||||
getOptionValueSource(key: string): OptionValueSource | undefined;
|
||||
|
||||
/**
|
||||
* Get source of option value. See also .optsWithGlobals().
|
||||
* Get source of option value. See also .optsWithGlobals().
|
||||
*/
|
||||
getOptionValueSourceWithGlobals(key: string): OptionValueSource | undefined;
|
||||
|
||||
@@ -654,43 +777,72 @@ export class Command {
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
* Use parseAsync instead of parse if any of your action handlers are async.
|
||||
*
|
||||
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
||||
*
|
||||
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
||||
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
||||
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
||||
* - `'user'`: just user arguments
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.parse(process.argv);
|
||||
* program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parse(); // parse process.argv and auto-detect electron and special node flags
|
||||
* program.parse(process.argv); // assume argv[0] is app and argv[1] is script
|
||||
* program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
parse(argv?: readonly string[], options?: ParseOptions): this;
|
||||
parse(argv?: readonly string[], parseOptions?: ParseOptions): this;
|
||||
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
|
||||
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
||||
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
||||
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
||||
* - `'user'`: just user arguments
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.parseAsync(process.argv);
|
||||
* program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
* await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags
|
||||
* await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script
|
||||
* await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
* ```
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
parseAsync(argv?: readonly string[], options?: ParseOptions): Promise<this>;
|
||||
parseAsync(
|
||||
argv?: readonly string[],
|
||||
parseOptions?: ParseOptions,
|
||||
): Promise<this>;
|
||||
|
||||
/**
|
||||
* Called the first time parse is called to save state and allow a restore before subsequent calls to parse.
|
||||
* Not usually called directly, but available for subclasses to save their custom state.
|
||||
*
|
||||
* This is called in a lazy way. Only commands used in parsing chain will have state saved.
|
||||
*/
|
||||
saveStateBeforeParse(): void;
|
||||
|
||||
/**
|
||||
* Restore state before parse for calls after the first.
|
||||
* Not usually called directly, but available for subclasses to save their custom state.
|
||||
*
|
||||
* This is called in a lazy way. Only commands used in parsing chain will have state restored.
|
||||
*/
|
||||
restoreStateBeforeParse(): void;
|
||||
|
||||
/**
|
||||
* Parse options from `argv` removing known options,
|
||||
* and return argv split into operands and unknown arguments.
|
||||
*
|
||||
* Side effects: modifies command by storing options. Does not reset state if called again.
|
||||
*
|
||||
* argv => operands, unknown
|
||||
* --known kkk op => [op], []
|
||||
* op --known kkk => [op], []
|
||||
@@ -838,6 +990,12 @@ export class Command {
|
||||
*/
|
||||
helpOption(flags?: string | boolean, description?: string): this;
|
||||
|
||||
/**
|
||||
* Supply your own option to use for the built-in help option.
|
||||
* This is an alternative to using helpOption() to customise the flags and description etc.
|
||||
*/
|
||||
addHelpOption(option: Option): this;
|
||||
|
||||
/**
|
||||
* Output help information and exit.
|
||||
*
|
||||
@@ -854,7 +1012,10 @@ export class Command {
|
||||
* and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
|
||||
*/
|
||||
addHelpText(position: AddHelpTextPosition, text: string): this;
|
||||
addHelpText(position: AddHelpTextPosition, text: (context: AddHelpTextContext) => string): this;
|
||||
addHelpText(
|
||||
position: AddHelpTextPosition,
|
||||
text: (context: AddHelpTextContext) => string,
|
||||
): this;
|
||||
|
||||
/**
|
||||
* Add a listener (callback) for when events occur. (Implemented using EventEmitter.)
|
||||
|
||||
Reference in New Issue
Block a user