All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning. (Format adopted after v3.0.0.)
addCommand()
for hidden
and isDefault
(#1232)helpOption
(#1248)arguments
to improve auto-generated help in editors (#1235).command()
configuration noHelp
to hidden
(but not remove old support) (#1232).addCommand()
for adding a separately configured command (#764 [#1149]).addHelpCommand()
([#1149])-a -b -p 80
can be written as -abp80
) ([#1145]).parseOption()
includes short flag and long flag expansions ([#1145]).helpInformation()
returns help text as a string, previously a private routine ([#1169]).parse()
implicitly uses process.argv
if arguments not specified ([#1172]).parse()
arguments "from", if not following node conventions (#512 [#1172])commands
property of Command
(#1184)program
property (#1195)createCommand
factory method to simplify subclassing (#1191)command:*
for executable subcommands (#809 [#1149]).args
contains command arguments with just recognised options removed (#1032 [#1138]).option()
([#1119]).allowUnknownOption()
(#802 [#1138]).args
-ab
or --foo=bar
) ([#1145]).parseOptions()
([#1138])args
in returned result renamed operands
and does not include anything after first unknown optionunknown
in returned result has arguments after first unknown option including operands, not just options and values.on('command:*', callback)
and other command events passed (changed) results from .parseOptions
, i.e. operands and unknown ([#1138])this
rather than Command
([#1180]).parseAsync
returns Promise<this>
to be consistent with .parse()
([#1180])@types/node
([#1146])normalize
(the functionality has been integrated into parseOptions
) ([#1145])parseExpectedArgs
is now private ([#1149])If you use .on('command:*')
or more complicated tests to detect an unrecognised subcommand, you may be able to delete the code and rely on the default behaviour.
If you use program.args
or more complicated tests to detect a missing subcommand, you may be able to delete the code and rely on the default behaviour.
If you use .command('*')
to add a default command, you may be be able to switch to isDefault:true
with a named command.
(Released in 5.0.0)
(Released in 5.0.0)
(Released in 5.0.0)
(Released in 5.0.0)
(Released in 5.0.0)
.action()
should include Promise for async ([#1157]).parseAsync
to use instead of .parse
if supply async action handlers (#806 [#1118])ts-node
in tests.exitOverride()
allows override of calls to process.exit
for additional error handling and to keep program running ([#1040]).requiredOptions()
([#1071])command:*
event to include unknown argumentscustomFds
option from call to child_process.spawn
([#1052])If you were previously using code like:
js
if (!program.args.length) ...
a partial replacement is:
js
if (program.rawArgs.length < 3) ...
(Released in 4.0.0)
(Released in 4.0.0)
executableFile
in CommandOptions (#1028)const
rather than var
in README (#1026).command('clone', 'clone description', { executableFile: 'myClone' })
.command
to contrast action handler vs git-style executable. (#938).command
. (#938)-p 80
can also be supplied as -p80
node --harmony myCommand.js clone
.version
(#963)program.version('0.0.1', '-v, --vers', 'output the current version')
.helpOption(flags, description)
routine to customise help flags and description (#963).helpOption('-e, --HELP', 'read more information')
--foo
and --no-foo
--no-foo
on cli now emits option:no-foo
(previously option:foo
)--no-foo
after defining --foo
leaves the default value unchanged (previously set it to false)node --inspect myCommand.js clone
The custom event for a negated option like --no-foo
is option:no-foo
(previously option:foo
).
js
program
.option('--no-foo')
.on('option:no-foo', () => {
console.log('removing foo');
});
When using TypeScript, adding a command does not allow an explicit undefined
for an unwanted executable description (e.g
for a command with an action handler).
js
program
.command('action1', undefined, { noHelp: true }) // No longer valid
.command('action2', { noHelp: true }) // Correct
(Released as 3.0.0)
[#1040]: https://github.com/tj/commander.js/pull/1040 [#1047]: https://github.com/tj/commander.js/pull/1047 [#1048]: https://github.com/tj/commander.js/pull/1048 [#1049]: https://github.com/tj/commander.js/pull/1049 [#1051]: https://github.com/tj/commander.js/pull/1051 [#1052]: https://github.com/tj/commander.js/pull/1052 [#1053]: https://github.com/tj/commander.js/pull/1053 [#1062]: https://github.com/tj/commander.js/pull/1062 [#1071]: https://github.com/tj/commander.js/pull/1071 [#1081]: https://github.com/tj/commander.js/pull/1081 [#1088]: https://github.com/tj/commander.js/issues/1088 [#1091]: https://github.com/tj/commander.js/pull/1091 [#1096]: https://github.com/tj/commander.js/pull/1096 [#1102]: https://github.com/tj/commander.js/pull/1102 [#1118]: https://github.com/tj/commander.js/pull/1118 [#1119]: https://github.com/tj/commander.js/pull/1119 [#1133]: https://github.com/tj/commander.js/pull/1133 [#1138]: https://github.com/tj/commander.js/pull/1138 [#1145]: https://github.com/tj/commander.js/pull/1145 [#1146]: https://github.com/tj/commander.js/pull/1146 [#1149]: https://github.com/tj/commander.js/pull/1149 [#1153]: https://github.com/tj/commander.js/issues/1153 [#1157]: https://github.com/tj/commander.js/pull/1157 [#1159]: https://github.com/tj/commander.js/pull/1159 [#1165]: https://github.com/tj/commander.js/pull/1165 [#1169]: https://github.com/tj/commander.js/pull/1169 [#1172]: https://github.com/tj/commander.js/pull/1172 [#1179]: https://github.com/tj/commander.js/pull/1179 [#1180]: https://github.com/tj/commander.js/pull/1180