UNPKG

18.8 kBMarkdownView Raw
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<!-- markdownlint-disable MD004 -->
10
11## [7.2.0] (2021-03-26)
12
13### Added
14
15- TypeScript typing for `parent` property on `Command` ([#1475])
16- TypeScript typing for `.attributeName()` on `Option` ([#1483])
17- support information in package ([#1477])
18
19### Changed
20
21- improvements to error messages, README, and tests
22- update dependencies
23
24## [7.1.0] (2021-02-15)
25
26### Added
27
28- support for named imports from ECMAScript modules ([#1440])
29- add `.cjs` to list of expected script file extensions ([#1449])
30- allow using option choices and variadic together ([#1454])
31
32### Fixed
33
34- replace use of deprecated `process.mainModule` ([#1448])
35- regression for legacy `command('*')` and call when command line includes options ([#1464])
36- regression for `on('command:*', ...)` and call when command line includes unknown options ([#1464])
37- display best error for combination of unknown command and unknown option (i.e. unknown command) ([#1464])
38
39### Changed
40
41- make TypeScript typings tests stricter ([#1453])
42- improvements to README and tests
43
44## [7.0.0] (2021-01-15)
45
46### Added
47
48- `.enablePositionalOptions()` to let program and subcommand reuse same option ([#1427])
49- `.passThroughOptions()` to pass options through to other programs without needing `--` ([#1427])
50- `.allowExcessArguments(false)` to show an error message if there are too many command-arguments on command line for the action handler ([#1409])
51- `.configureOutput()` to modify use of stdout and stderr or customise display of errors ([#1387])
52- use `.addHelpText()` to add text before or after the built-in help, for just current command or also for all subcommands ([#1296])
53- enhance Option class ([#1331])
54 - allow hiding options from help
55 - allow restricting option arguments to a list of choices
56 - allow setting how default value is shown in help
57- `.createOption()` to support subclassing of automatically created options (like `.createCommand()`) ([#1380])
58- refactor the code generating the help into a separate public Help class ([#1365])
59 - support sorting subcommands and options in help
60 - support specifying wrap width (columns)
61 - allow subclassing Help class
62 - allow configuring Help class without subclassing
63
64### Changed
65
66- *Breaking:* options are stored safely by default, not as properties on the command ([#1409])
67 - this especially affects accessing options on program, use `program.opts()`
68 - revert behaviour with `.storeOptionsAsProperties()`
69- *Breaking:* action handlers are passed options and command separately ([#1409])
70- deprecated callback parameter to `.help()` and `.outputHelp()` (removed from README) ([#1296])
71- *Breaking:* errors now displayed using `process.stderr.write()` instead of `console.error()`
72- deprecate `.on('--help')` (removed from README) ([#1296])
73- initialise the command description to empty string (previously undefined) ([#1365])
74- document and annotate deprecated routines ([#1349])
75
76### Fixed
77
78- wrapping bugs in help ([#1365])
79 - first line of command description was wrapping two characters early
80 - pad width calculation was not including help option and help command
81 - pad width calculation was including hidden options and commands
82- improve backwards compatibility for custom command event listeners ([#1403])
83
84### Deleted
85
86- *Breaking:* `.passCommandToAction()` ([#1409])
87 - no longer needed as action handler is passed options and command
88- *Breaking:* "extra arguments" parameter to action handler ([#1409])
89 - if being used to detect excess arguments, there is now an error available by setting `.allowExcessArguments(false)`
90
91### Migration Tips
92
93The biggest change is the parsed option values. Previously the options were stored by default as properties on the command object, and now the options are stored separately.
94
95If you wish to restore the old behaviour and get running quickly you can call `.storeOptionsAsProperties()`.
96To allow you to move to the new code patterns incrementally, the action handler will be passed the command _twice_,
97to match the new "options" and "command" parameters (see below).
98
99**program options**
100
101Use the `.opts()` method to access the options. This is available on any command but is used most with the program.
102
103```js
104program.option('-d, --debug');
105program.parse();
106// Old code before Commander 7
107if (program.debug) console.log(`Program name is ${program.name()}`);
108```
109
110```js
111// New code
112const options = program.opts();
113if (options.debug) console.log(`Program name is ${program.name()}`);
114```
115
116**action handler**
117
118The action handler gets passed a parameter for each command-argument you declared. Previously by default the next parameter was the command object with the options as properties. Now the next two parameters are instead the options and the command. If you
119only accessed the options there may be no code changes required.
120
121```js
122program
123 .command('compress <filename>')
124 .option('-t, --trace')
125 // Old code before Commander 7
126 .action((filename, cmd)) => {
127 if (cmd.trace) console.log(`Command name is ${cmd.name()}`);
128 });
129```
130
131```js
132 // New code
133 .action((filename, options, command)) => {
134 if (options.trace) console.log(`Command name is ${command.name()}`);
135 });
136```
137
138If you already set `.storeOptionsAsProperties(false)` you may still need to adjust your code.
139
140```js
141program
142 .command('compress <filename>')
143 .storeOptionsAsProperties(false)
144 .option('-t, --trace')
145 // Old code before Commander 7
146 .action((filename, command)) => {
147 if (command.opts().trace) console.log(`Command name is ${command.name()}`);
148 });
149```
150
151```js
152 // New code
153 .action((filename, options, command)) => {
154 if (command.opts().trace) console.log(`Command name is ${command.name()}`);
155 });
156```
157
158## [7.0.0-2] (2020-12-14)
159
160(Released in 7.0.0)
161
162## [7.0.0-1] (2020-11-21)
163
164(Released in 7.0.0)
165
166## [7.0.0-0] (2020-10-25)
167
168(Released in 7.0.0)
169
170## [6.2.1] (2020-12-13)
171
172### Fixed
173
174- some tests failed if directory path included a space ([1390])
175
176## [6.2.0] (2020-10-25)
177
178### Added
179
180- added 'tsx' file extension for stand-alone executable subcommands ([#1368])
181- documented second parameter to `.description()` to describe command arguments ([#1353])
182- documentation of special cases with options taking varying numbers of option-arguments ([#1332])
183- documentation for terminology ([#1361])
184
185### Fixed
186
187- add missing TypeScript definition for `.addHelpCommand()' ([#1375])
188- removed blank line after "Arguments:" in help, to match "Options:" and "Commands:" ([#1360])
189
190### Changed
191
192- update dependencies
193
194## [6.1.0] (2020-08-28)
195
196### Added
197
198- include URL to relevant section of README for error for potential conflict between Command properties and option values ([#1306])
199- `.combineFlagAndOptionalValue(false)` to ease upgrade path from older versions of Commander ([#1326])
200- allow disabling the built-in help option using `.helpOption(false)` ([#1325])
201- allow just some arguments in `argumentDescription` to `.description()` ([#1323])
202
203### Changed
204
205- tidy async test and remove lint override ([#1312])
206
207### Fixed
208
209- executable subcommand launching when script path not known ([#1322])
210
211## [6.0.0] (2020-07-21)
212
213### Added
214
215- add support for variadic options ([#1250])
216- allow options to be added with just a short flag ([#1256])
217 - *Breaking* the option property has same case as flag. e.g. flag `-n` accessed as `opts().n` (previously uppercase)
218- *Breaking* throw an error if there might be a clash between option name and a Command property, with advice on how to resolve ([#1275])
219
220### Fixed
221
222- Options which contain -no- in the middle of the option flag should not be treated as negatable. ([#1301])
223
224## [6.0.0-0] (2020-06-20)
225
226(Released in 6.0.0)
227
228## [5.1.0] (2020-04-25)
229
230### Added
231
232- support for multiple command aliases, the first of which is shown in the auto-generated help ([#531], [#1236])
233- configuration support in `addCommand()` for `hidden` and `isDefault` ([#1232])
234
235### Fixed
236
237- omit masked help flags from the displayed help ([#645], [#1247])
238- remove old short help flag when change help flags using `helpOption` ([#1248])
239
240### Changed
241
242- remove use of `arguments` to improve auto-generated help in editors ([#1235])
243- rename `.command()` configuration `noHelp` to `hidden` (but not remove old support) ([#1232])
244- improvements to documentation
245- update dependencies
246- update tested versions of node
247- eliminate lint errors in TypeScript ([#1208])
248
249## [5.0.0] (2020-03-14)
250
251### Added
252
253* support for nested commands with action-handlers ([#1] [#764] [#1149])
254* `.addCommand()` for adding a separately configured command ([#764] [#1149])
255* allow a non-executable to be set as the default command ([#742] [#1149])
256* implicit help command when there are subcommands (previously only if executables) ([#1149])
257* customise implicit help command with `.addHelpCommand()` ([#1149])
258* display error message for unknown subcommand, by default ([#432] [#1088] [#1149])
259* display help for missing subcommand, by default ([#1088] [#1149])
260* 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])
261* `.parseOption()` includes short flag and long flag expansions ([#1145])
262* `.helpInformation()` returns help text as a string, previously a private routine ([#1169])
263* `.parse()` implicitly uses `process.argv` if arguments not specified ([#1172])
264* optionally specify where `.parse()` arguments "from", if not following node conventions ([#512] [#1172])
265* suggest help option along with unknown command error ([#1179])
266* TypeScript definition for `commands` property of `Command` ([#1184])
267* export `program` property ([#1195])
268* `createCommand` factory method to simplify subclassing ([#1191])
269
270### Fixed
271
272* preserve argument order in subcommands ([#508] [#962] [#1138])
273* do not emit `command:*` for executable subcommands ([#809] [#1149])
274* action handler called whether or not there are non-option arguments ([#1062] [#1149])
275* combining option short flag and value in single argument now works for subcommands ([#1145])
276* only add implicit help command when it will not conflict with other uses of argument ([#1153] [#1149])
277* implicit help command works with command aliases ([#948] [#1149])
278* options are validated whether or not there is an action handler ([#1149])
279
280### Changed
281
282* *Breaking* `.args` contains command arguments with just recognised options removed ([#1032] [#1138])
283* *Breaking* display error if required argument for command is missing ([#995] [#1149])
284* tighten TypeScript definition of custom option processing function passed to `.option()` ([#1119])
285* *Breaking* `.allowUnknownOption()` ([#802] [#1138])
286 * unknown options included in arguments passed to command action handler
287 * unknown options included in `.args`
288* only recognised option short flags and long flags are expanded (e.g. `-ab` or `--foo=bar`) ([#1145])
289* *Breaking* `.parseOptions()` ([#1138])
290 * `args` in returned result renamed `operands` and does not include anything after first unknown option
291 * `unknown` in returned result has arguments after first unknown option including operands, not just options and values
292* *Breaking* `.on('command:*', callback)` and other command events passed (changed) results from `.parseOptions`, i.e. operands and unknown ([#1138])
293* refactor Option from prototype to class ([#1133])
294* refactor Command from prototype to class ([#1159])
295* changes to error handling ([#1165])
296 * throw for author error, not just display message
297 * preflight for variadic error
298 * add tips to missing subcommand executable
299* TypeScript fluent return types changed to be more subclass friendly, return `this` rather than `Command` ([#1180])
300* `.parseAsync` returns `Promise<this>` to be consistent with `.parse()` ([#1180])
301* update dependencies
302
303### Removed
304
305* removed EventEmitter from TypeScript definition for Command, eliminating implicit peer dependency on `@types/node` ([#1146])
306* removed private function `normalize` (the functionality has been integrated into `parseOptions`) ([#1145])
307* `parseExpectedArgs` is now private ([#1149])
308
309### Migration Tips
310
311If 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.
312
313If 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.
314
315If you use `.command('*')` to add a default command, you may be be able to switch to `isDefault:true` with a named command.
316
317If you want to continue combining short options with optional values as though they were boolean flags, set `combineFlagAndOptionalValue(false)`
318to expand `-fb` to `-f -b` rather than `-f b`.
319
320## [5.0.0-4] (2020-03-03)
321
322(Released in 5.0.0)
323
324## [5.0.0-3] (2020-02-20)
325
326(Released in 5.0.0)
327
328## [5.0.0-2] (2020-02-10)
329
330(Released in 5.0.0)
331
332## [5.0.0-1] (2020-02-08)
333
334(Released in 5.0.0)
335
336## [5.0.0-0] (2020-02-02)
337
338(Released in 5.0.0)
339
340## Older versions
341
342* [4.x](./changelogs/CHANGELOG-4.md)
343* [3.x](./changelogs/CHANGELOG-3.md)
344* [2.x](./changelogs/CHANGELOG-2.md)
345* [1.x](./changelogs/CHANGELOG-1.md)
346* [0.x](./changelogs/CHANGELOG-0.md)
347
348[#1]: https://github.com/tj/commander.js/issues/1
349[#432]: https://github.com/tj/commander.js/issues/432
350[#508]: https://github.com/tj/commander.js/issues/508
351[#512]: https://github.com/tj/commander.js/issues/512
352[#531]: https://github.com/tj/commander.js/issues/531
353[#645]: https://github.com/tj/commander.js/issues/645
354[#742]: https://github.com/tj/commander.js/issues/742
355[#764]: https://github.com/tj/commander.js/issues/764
356[#802]: https://github.com/tj/commander.js/issues/802
357[#809]: https://github.com/tj/commander.js/issues/809
358[#948]: https://github.com/tj/commander.js/issues/948
359[#962]: https://github.com/tj/commander.js/issues/962
360[#995]: https://github.com/tj/commander.js/issues/995
361[#1032]: https://github.com/tj/commander.js/issues/1032
362[#1062]: https://github.com/tj/commander.js/pull/1062
363[#1088]: https://github.com/tj/commander.js/issues/1088
364[#1119]: https://github.com/tj/commander.js/pull/1119
365[#1133]: https://github.com/tj/commander.js/pull/1133
366[#1138]: https://github.com/tj/commander.js/pull/1138
367[#1145]: https://github.com/tj/commander.js/pull/1145
368[#1146]: https://github.com/tj/commander.js/pull/1146
369[#1149]: https://github.com/tj/commander.js/pull/1149
370[#1153]: https://github.com/tj/commander.js/issues/1153
371[#1159]: https://github.com/tj/commander.js/pull/1159
372[#1165]: https://github.com/tj/commander.js/pull/1165
373[#1169]: https://github.com/tj/commander.js/pull/1169
374[#1172]: https://github.com/tj/commander.js/pull/1172
375[#1179]: https://github.com/tj/commander.js/pull/1179
376[#1180]: https://github.com/tj/commander.js/pull/1180
377[#1184]: https://github.com/tj/commander.js/pull/1184
378[#1191]: https://github.com/tj/commander.js/pull/1191
379[#1195]: https://github.com/tj/commander.js/pull/1195
380[#1208]: https://github.com/tj/commander.js/pull/1208
381[#1232]: https://github.com/tj/commander.js/pull/1232
382[#1235]: https://github.com/tj/commander.js/pull/1235
383[#1236]: https://github.com/tj/commander.js/pull/1236
384[#1247]: https://github.com/tj/commander.js/pull/1247
385[#1248]: https://github.com/tj/commander.js/pull/1248
386[#1250]: https://github.com/tj/commander.js/pull/1250
387[#1256]: https://github.com/tj/commander.js/pull/1256
388[#1275]: https://github.com/tj/commander.js/pull/1275
389[#1296]: https://github.com/tj/commander.js/pull/1296
390[#1301]: https://github.com/tj/commander.js/issues/1301
391[#1306]: https://github.com/tj/commander.js/pull/1306
392[#1312]: https://github.com/tj/commander.js/pull/1312
393[#1322]: https://github.com/tj/commander.js/pull/1322
394[#1323]: https://github.com/tj/commander.js/pull/1323
395[#1325]: https://github.com/tj/commander.js/pull/1325
396[#1326]: https://github.com/tj/commander.js/pull/1326
397[#1331]: https://github.com/tj/commander.js/pull/1331
398[#1332]: https://github.com/tj/commander.js/pull/1332
399[#1349]: https://github.com/tj/commander.js/pull/1349
400[#1353]: https://github.com/tj/commander.js/pull/1353
401[#1360]: https://github.com/tj/commander.js/pull/1360
402[#1361]: https://github.com/tj/commander.js/pull/1361
403[#1365]: https://github.com/tj/commander.js/pull/1365
404[#1368]: https://github.com/tj/commander.js/pull/1368
405[#1375]: https://github.com/tj/commander.js/pull/1375
406[#1380]: https://github.com/tj/commander.js/pull/1380
407[#1387]: https://github.com/tj/commander.js/pull/1387
408[#1390]: https://github.com/tj/commander.js/pull/1390
409[#1403]: https://github.com/tj/commander.js/pull/1403
410[#1409]: https://github.com/tj/commander.js/pull/1409
411[#1427]: https://github.com/tj/commander.js/pull/1427
412[#1440]: https://github.com/tj/commander.js/pull/1440
413[#1448]: https://github.com/tj/commander.js/pull/1448
414[#1449]: https://github.com/tj/commander.js/pull/1449
415[#1453]: https://github.com/tj/commander.js/pull/1453
416[#1454]: https://github.com/tj/commander.js/pull/1454
417[#1464]: https://github.com/tj/commander.js/pull/1464
418[#1475]: https://github.com/tj/commander.js/pull/1475
419[#1477]: https://github.com/tj/commander.js/pull/1477
420[#1483]: https://github.com/tj/commander.js/pull/1483
421
422[Unreleased]: https://github.com/tj/commander.js/compare/master...develop
423[7.2.0]: https://github.com/tj/commander.js/compare/v7.1.0...v7.2.0
424[7.1.0]: https://github.com/tj/commander.js/compare/v7.0.0...v7.1.0
425[7.0.0]: https://github.com/tj/commander.js/compare/v6.2.1...v7.0.0
426[7.0.0-2]: https://github.com/tj/commander.js/compare/v7.0.0-1...v7.0.0-2
427[7.0.0-1]: https://github.com/tj/commander.js/compare/v7.0.0-0...v7.0.0-1
428[7.0.0-0]: https://github.com/tj/commander.js/compare/v6.2.0...v7.0.0-0
429[6.2.1]: https://github.com/tj/commander.js/compare/v6.2.0..v6.2.1
430[6.2.0]: https://github.com/tj/commander.js/compare/v6.1.0..v6.2.0
431[6.1.0]: https://github.com/tj/commander.js/compare/v6.0.0..v6.1.0
432[6.0.0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0
433[6.0.0-0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0-0
434[5.1.0]: https://github.com/tj/commander.js/compare/v5.0.0..v5.1.0
435[5.0.0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0
436[5.0.0-4]: https://github.com/tj/commander.js/compare/v5.0.0-3..v5.0.0-4
437[5.0.0-3]: https://github.com/tj/commander.js/compare/v5.0.0-2..v5.0.0-3
438[5.0.0-2]: https://github.com/tj/commander.js/compare/v5.0.0-1..v5.0.0-2
439[5.0.0-1]: https://github.com/tj/commander.js/compare/v5.0.0-0..v5.0.0-1
440[5.0.0-0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0-0