1# Changelog
2
3All notable changes to this project will be documented in this file.
4
5The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.)
7
8<!-- markdownlint-disable MD024 -->
9
10## [5.1.0] (2020-04-25)
11
12### Added
13
14- support for multiple command aliases, the first of which is shown in the auto-generated help ([#531], [#1236])
15- configuration support in `addCommand()` for `hidden` and `isDefault` ([#1232])
16
17### Fixed
18
19- omit masked help flags from the displayed help ([#645], [#1247])
20- remove old short help flag when change help flags using `helpOption` ([#1248])
21
22### Changed
23
24- remove use of `arguments` to improve auto-generated help in editors ([#1235])
25- rename `.command()` configuration `noHelp` to `hidden` (but not remove old support) ([#1232])
26- improvements to documentation
27- update dependencies
28- update tested versions of node
29- eliminate lint errors in TypeScript ([#1208])
30
31## [5.0.0] (2020-03-14)
32
33### Added
34
35* support for nested commands with action-handlers ([#1] [#764] [#1149])
36* `.addCommand()` for adding a separately configured command ([#764] [#1149])
37* allow a non-executable to be set as the default command ([#742] [#1149])
38* implicit help command when there are subcommands (previously only if executables) ([#1149])
39* customise implicit help command with `.addHelpCommand()` ([#1149])
40* display error message for unknown subcommand, by default ([#432] [#1088] [#1149])
41* display help for missing subcommand, by default ([#1088] [#1149])
42* combined short options as single argument may include boolean flags and value flag and value (e.g. `-a -b -p 80` can be written as `-abp80`) ([#1145])
43* `.parseOption()` includes short flag and long flag expansions ([#1145])
44* `.helpInformation()` returns help text as a string, previously a private routine ([#1169])
45* `.parse()` implicitly uses `process.argv` if arguments not specified ([#1172])
46* optionally specify where `.parse()` arguments "from", if not following node conventions ([#512] [#1172])
47* suggest help option along with unknown command error ([#1179])
48* TypeScript definition for `commands` property of `Command` ([#1184])
49* export `program` property ([#1195])
50* `createCommand` factory method to simplify subclassing ([#1191])
51
52### Fixed
53
54* preserve argument order in subcommands ([#508] [#962] [#1138])
55* do not emit `command:*` for executable subcommands ([#809] [#1149])
56* action handler called whether or not there are non-option arguments ([#1062] [#1149])
57* combining option short flag and value in single argument now works for subcommands ([#1145])
58* only add implicit help command when it will not conflict with other uses of argument ([#1153] [#1149])
59* implicit help command works with command aliases ([#948] [#1149])
60* options are validated whether or not there is an action handler ([#1149])
61
62### Changed
63
64* *Breaking* `.args` contains command arguments with just recognised options removed ([#1032] [#1138])
65* *Breaking* display error if required argument for command is missing ([#995] [#1149])
66* tighten TypeScript definition of custom option processing function passed to `.option()` ([#1119])
67* *Breaking* `.allowUnknownOption()` ([#802] [#1138])
68  * unknown options included in arguments passed to command action handler
69  * unknown options included in `.args`
70* only recognised option short flags and long flags are expanded (e.g. `-ab` or `--foo=bar`) ([#1145])
71* *Breaking* `.parseOptions()` ([#1138])
72  * `args` in returned result renamed `operands` and does not include anything after first unknown option
73  * `unknown` in returned result has arguments after first unknown option including operands, not just options and values
74* *Breaking* `.on('command:*', callback)` and other command events passed (changed) results from `.parseOptions`, i.e. operands and unknown  ([#1138])
75* refactor Option from prototype to class ([#1133])
76* refactor Command from prototype to class ([#1159])
77* changes to error handling ([#1165])
78  * throw for author error, not just display message
79  * preflight for variadic error
80  * add tips to missing subcommand executable
81* TypeScript fluent return types changed to be more subclass friendly, return `this` rather than `Command` ([#1180])
82* `.parseAsync` returns `Promise<this>` to be consistent with `.parse()` ([#1180])
83* update dependencies
84
85### Removed
86
87* removed EventEmitter from TypeScript definition for Command, eliminating implicit peer dependency on `@types/node` ([#1146])
88* removed private function `normalize` (the functionality has been integrated into `parseOptions`) ([#1145])
89* `parseExpectedArgs` is now private ([#1149])
90
91### Migration Tips
92
93If 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.
94
95If 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.
96
97If you use `.command('*')` to add a default command, you may be be able to switch to `isDefault:true` with a named command.
98
99## [5.0.0-4] (2020-03-03)
100
101(Released in 5.0.0)
102
103## [5.0.0-3] (2020-02-20)
104
105(Released in 5.0.0)
106
107## [5.0.0-2] (2020-02-10)
108
109(Released in 5.0.0)
110
111## [5.0.0-1] (2020-02-08)
112
113(Released in 5.0.0)
114
115## [5.0.0-0] (2020-02-02)
116
117(Released in 5.0.0)
118
119## [4.1.1] (2020-02-02)
120
121### Fixed
122
123* TypeScript definition for `.action()` should include Promise for async ([#1157])
124
125## [4.1.0] (2020-01-06)
126
127### Added
128
129* two routines to change how option values are handled, and eliminate name clashes with command properties ([#933] [#1102])
130  * see storeOptionsAsProperties and passCommandToAction in README
131* `.parseAsync` to use instead of `.parse` if supply async action handlers ([#806] [#1118])
132
133### Fixed
134
135* Remove trailing blanks from wrapped help text ([#1096])
136
137### Changed
138
139* update dependencies
140* extend security coverage for Commander 2.x to 2020-02-03
141* improvements to README
142* improvements to TypeScript definition documentation
143* move old versions out of main CHANGELOG
144* removed explicit use of `ts-node` in tests
145
146## [4.0.1] (2019-11-12)
147
148### Fixed
149
150* display help when requested, even if there are missing required options ([#1091])
151
152## [4.0.0] (2019-11-02)
153
154### Added
155
156* automatically wrap and indent help descriptions for options and commands ([#1051])
157* `.exitOverride()` allows override of calls to `process.exit` for additional error handling and to keep program running ([#1040])
158* support for declaring required options with `.requiredOptions()` ([#1071])
159* GitHub Actions support ([#1027])
160* translation links in README
161
162### Changed
163
164* dev: switch tests from Sinon+Should to Jest with major rewrite of tests ([#1035])
165* call default subcommand even when there are unknown options ([#1047])
166* *Breaking* Commander is only officially supported on Node 8 and above, and requires Node 6 ([#1053])
167
168### Fixed
169
170* *Breaking* keep command object out of program.args when action handler called ([#1048])
171  * also, action handler now passed array of unknown arguments
172* complain about unknown options when program argument supplied and action handler ([#1049])
173  * this changes parameters to `command:*` event to include unknown arguments
174* removed deprecated `customFds` option from call to `child_process.spawn` ([#1052])
175* rework TypeScript declarations to bring all types into imported namespace ([#1081])
176
177### Migration Tips
178
179#### Testing for no arguments
180
181If you were previously using code like:
182
183```js
184if (!program.args.length) ...
185```
186
187a partial replacement is:
188
189```js
190if (program.rawArgs.length < 3) ...
191```
192
193## [4.0.0-1] Prerelease (2019-10-08)
194
195(Released in 4.0.0)
196
197## [4.0.0-0] Prerelease (2019-10-01)
198
199(Released in 4.0.0)
200
201## [2.20.1] (2019-09-29)
202
203### Fixed
204
205* Improve tracking of executable subcommands.
206
207### Changed
208
209* update development dependencies
210
211## [3.0.2] (2019-09-27)
212
213### Fixed
214
215* Improve tracking of executable subcommands.
216
217### Changed
218
219* update development dependencies
220
221## [3.0.1] (2019-08-30)
222
223### Added
224
225* .name and .usage to README ([#1010])
226* Table of Contents to README ([#1010])
227* TypeScript definition for `executableFile` in CommandOptions ([#1028])
228
229### Changed
230
231* consistently use `const` rather than `var` in README ([#1026])
232
233### Fixed
234
235* help for sub commands with custom executableFile ([#1018])
236
237## [3.0.0] / 2019-08-08
238
239* Add option to specify executable file name ([#999])
240  * e.g. `.command('clone', 'clone description', { executableFile: 'myClone' })`
241* Change docs for `.command` to contrast action handler vs git-style executable. ([#938] [#990])
242* **Breaking** Change TypeScript to use overloaded function for `.command`. ([#938] [#990])
243* Change to use straight quotes around strings in error messages (like 'this' instead of `this') ([#915])
244* Add TypeScript "reference types" for node ([#974])
245* Add support for hyphen as an option argument in subcommands ([#697])
246* Add support for a short option flag and its value to be concatenated for action handler subcommands ([#599])
247  * e.g. `-p 80` can also be supplied as `-p80`
248* Add executable arguments to spawn in win32, for git-style executables ([#611])
249  * e.g. `node --harmony myCommand.js clone`
250* Add parent command as prefix of subcommand in help ([#980])
251* Add optional custom description to `.version` ([#963])
252  * e.g. `program.version('0.0.1', '-v, --vers', 'output the current version')`
253* Add `.helpOption(flags, description)` routine to customise help flags and description ([#963])
254  * e.g. `.helpOption('-e, --HELP', 'read more information')`
255* Fix behavior of --no-* options ([#795])
256  * can now define both `--foo` and `--no-foo`
257  * **Breaking** custom event listeners: `--no-foo` on cli now emits `option:no-foo` (previously `option:foo`)
258  * **Breaking** default value: defining `--no-foo` after defining `--foo` leaves the default value unchanged (previously set it to false)
259  * allow boolean default value, such as from environment ([#987])
260* Increment inspector port for spawned subcommands ([#991])
261  * e.g. `node --inspect myCommand.js clone`
262
263### Migration Tips
264
265The custom event for a negated option like `--no-foo` is `option:no-foo` (previously `option:foo`).
266
267```js
268program
269  .option('--no-foo')
270  .on('option:no-foo', () => {
271    console.log('removing foo');
272  });
273```
274
275When using TypeScript, adding a command does not allow an explicit `undefined` for an unwanted executable description (e.g
276for a command with an action handler).
277
278```js
279program
280  .command('action1', undefined, { noHelp: true }) // No longer valid
281  .command('action2', { noHelp: true }) // Correct
282```
283
284## 3.0.0-0 Prerelease / 2019-07-28
285
286(Released as 3.0.0)
287
288## Older versions
289
290* [2.x](./changelogs/CHANGELOG-2.md)
291* [1.x](./changelogs/CHANGELOG-1.md)
292* [0.x](./changelogs/CHANGELOG-0.md)
293
294[#1]: https://github.com/tj/commander.js/issues/1
295[#432]: https://github.com/tj/commander.js/issues/432
296[#508]: https://github.com/tj/commander.js/issues/508
297[#512]: https://github.com/tj/commander.js/issues/512
298[#531]: https://github.com/tj/commander.js/issues/531
299[#599]: https://github.com/tj/commander.js/issues/599
300[#611]: https://github.com/tj/commander.js/issues/611
301[#645]: https://github.com/tj/commander.js/issues/645
302[#697]: https://github.com/tj/commander.js/issues/697
303[#742]: https://github.com/tj/commander.js/issues/742
304[#764]: https://github.com/tj/commander.js/issues/764
305[#795]: https://github.com/tj/commander.js/issues/795
306[#802]: https://github.com/tj/commander.js/issues/802
307[#806]: https://github.com/tj/commander.js/issues/806
308[#809]: https://github.com/tj/commander.js/issues/809
309[#915]: https://github.com/tj/commander.js/issues/915
310[#938]: https://github.com/tj/commander.js/issues/938
311[#948]: https://github.com/tj/commander.js/issues/948
312[#962]: https://github.com/tj/commander.js/issues/962
313[#963]: https://github.com/tj/commander.js/issues/963
314[#974]: https://github.com/tj/commander.js/issues/974
315[#980]: https://github.com/tj/commander.js/issues/980
316[#987]: https://github.com/tj/commander.js/issues/987
317[#990]: https://github.com/tj/commander.js/issues/990
318[#991]: https://github.com/tj/commander.js/issues/991
319[#993]: https://github.com/tj/commander.js/issues/993
320[#995]: https://github.com/tj/commander.js/issues/995
321[#999]: https://github.com/tj/commander.js/issues/999
322[#1010]: https://github.com/tj/commander.js/pull/1010
323[#1018]: https://github.com/tj/commander.js/pull/1018
324[#1026]: https://github.com/tj/commander.js/pull/1026
325[#1027]: https://github.com/tj/commander.js/pull/1027
326[#1028]: https://github.com/tj/commander.js/pull/1028
327[#1032]: https://github.com/tj/commander.js/issues/1032
328[#1035]: https://github.com/tj/commander.js/pull/1035
329[#1040]: https://github.com/tj/commander.js/pull/1040
330[#1047]: https://github.com/tj/commander.js/pull/1047
331[#1048]: https://github.com/tj/commander.js/pull/1048
332[#1049]: https://github.com/tj/commander.js/pull/1049
333[#1051]: https://github.com/tj/commander.js/pull/1051
334[#1052]: https://github.com/tj/commander.js/pull/1052
335[#1053]: https://github.com/tj/commander.js/pull/1053
336[#1062]: https://github.com/tj/commander.js/pull/1062
337[#1071]: https://github.com/tj/commander.js/pull/1071
338[#1081]: https://github.com/tj/commander.js/pull/1081
339[#1088]: https://github.com/tj/commander.js/issues/1088
340[#1091]: https://github.com/tj/commander.js/pull/1091
341[#1096]: https://github.com/tj/commander.js/pull/1096
342[#1102]: https://github.com/tj/commander.js/pull/1102
343[#1118]: https://github.com/tj/commander.js/pull/1118
344[#1119]: https://github.com/tj/commander.js/pull/1119
345[#1133]: https://github.com/tj/commander.js/pull/1133
346[#1138]: https://github.com/tj/commander.js/pull/1138
347[#1145]: https://github.com/tj/commander.js/pull/1145
348[#1146]: https://github.com/tj/commander.js/pull/1146
349[#1149]: https://github.com/tj/commander.js/pull/1149
350[#1153]: https://github.com/tj/commander.js/issues/1153
351[#1157]: https://github.com/tj/commander.js/pull/1157
352[#1159]: https://github.com/tj/commander.js/pull/1159
353[#1165]: https://github.com/tj/commander.js/pull/1165
354[#1169]: https://github.com/tj/commander.js/pull/1169
355[#1172]: https://github.com/tj/commander.js/pull/1172
356[#1179]: https://github.com/tj/commander.js/pull/1179
357[#1180]: https://github.com/tj/commander.js/pull/1180
358[#1184]: https://github.com/tj/commander.js/pull/1184
359[#1191]: https://github.com/tj/commander.js/pull/1191
360[#1195]: https://github.com/tj/commander.js/pull/1195
361[#1208]: https://github.com/tj/commander.js/pull/1208
362[#1232]: https://github.com/tj/commander.js/pull/1232
363[#1235]: https://github.com/tj/commander.js/pull/1235
364[#1236]: https://github.com/tj/commander.js/pull/1236
365[#1247]: https://github.com/tj/commander.js/pull/1247
366[#1248]: https://github.com/tj/commander.js/pull/1248
367
368[Unreleased]: https://github.com/tj/commander.js/compare/master...develop
369[5.1.0]: https://github.com/tj/commander.js/compare/v5.0.0..v5.1.0
370[5.0.0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0
371[5.0.0-4]: https://github.com/tj/commander.js/compare/v5.0.0-3..v5.0.0-4
372[5.0.0-3]: https://github.com/tj/commander.js/compare/v5.0.0-2..v5.0.0-3
373[5.0.0-2]: https://github.com/tj/commander.js/compare/v5.0.0-1..v5.0.0-2
374[5.0.0-1]: https://github.com/tj/commander.js/compare/v5.0.0-0..v5.0.0-1
375[5.0.0-0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0-0
376[4.1.1]: https://github.com/tj/commander.js/compare/v4.1.0..v4.1.1
377[4.1.0]: https://github.com/tj/commander.js/compare/v4.0.1..v4.1.0
378[4.0.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.0.1
379[4.0.0]: https://github.com/tj/commander.js/compare/v3.0.2..v4.0.0
380[4.0.0-1]: https://github.com/tj/commander.js/compare/v4.0.0-0..v4.0.0-1
381[4.0.0-0]: https://github.com/tj/commander.js/compare/v3.0.2...v4.0.0-0
382[3.0.2]: https://github.com/tj/commander.js/compare/v3.0.1...v3.0.2
383[3.0.1]: https://github.com/tj/commander.js/compare/v3.0.0...v3.0.1
384[3.0.0]: https://github.com/tj/commander.js/compare/v2.20.1...v3.0.0
385[2.20.1]: https://github.com/tj/commander.js/compare/v2.20.0...v2.20.1
386