@capytale/activity.js 3.0.6 → 3.0.8
Sign up to get free protection for your applications and to get access to all the features.
- package/activity/activityBunch/html/nodes.d.ts.map +1 -1
- package/activity/activityType/activityType.d.ts +6 -0
- package/activity/activityType/activityType.d.ts.map +1 -1
- package/activity/activityType/backend.d.ts +5 -2
- package/activity/activityType/backend.d.ts.map +1 -1
- package/activity/activityType/backend.js +7 -1
- package/activity/activityType/backend.js.map +1 -1
- package/activity/archiver/all/index.d.ts.map +1 -1
- package/api/rest/field.d.ts.map +1 -1
- package/backend/capytale/activityType.d.ts.map +1 -1
- package/backend/capytale/activityType.js +2 -1
- package/backend/capytale/activityType.js.map +1 -1
- package/backend/capytale/auth.d.ts.map +1 -1
- package/backend/capytale/csrf.d.ts.map +1 -1
- package/backend/capytale/evaluation.d.ts.map +1 -1
- package/backend/capytale/me.d.ts.map +1 -1
- package/backend/capytale/resolver.d.ts.map +1 -1
- package/backend/capytale/resolver.js +8 -1
- package/backend/capytale/resolver.js.map +1 -1
- package/bin/cactjs.js +543 -264
- package/entity/utility.d.ts.map +1 -1
- package/package.json +8 -8
package/bin/cactjs.js
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
2
|
'use strict';
|
3
3
|
|
4
|
-
var require$$0 = require('events');
|
5
|
-
var require$$1 = require('child_process');
|
6
|
-
var require$$2 = require('path');
|
7
|
-
var
|
8
|
-
var require$$4 = require('process');
|
4
|
+
var require$$0 = require('node:events');
|
5
|
+
var require$$1 = require('node:child_process');
|
6
|
+
var require$$2 = require('node:path');
|
7
|
+
var require$$3 = require('node:fs');
|
8
|
+
var require$$4 = require('node:process');
|
9
9
|
var crypto = require('crypto');
|
10
|
+
var fs$1 = require('fs');
|
11
|
+
var path$1 = require('path');
|
10
12
|
|
11
13
|
var commander = {};
|
12
14
|
|
@@ -16,7 +18,6 @@ var error = {};
|
|
16
18
|
|
17
19
|
/**
|
18
20
|
* CommanderError class
|
19
|
-
* @class
|
20
21
|
*/
|
21
22
|
|
22
23
|
let CommanderError$3 = class CommanderError extends Error {
|
@@ -25,7 +26,6 @@ let CommanderError$3 = class CommanderError extends Error {
|
|
25
26
|
* @param {number} exitCode suggested exit code which could be used with process.exit
|
26
27
|
* @param {string} code an id string representing the error
|
27
28
|
* @param {string} message human-readable description of the error
|
28
|
-
* @constructor
|
29
29
|
*/
|
30
30
|
constructor(exitCode, code, message) {
|
31
31
|
super(message);
|
@@ -40,13 +40,11 @@ let CommanderError$3 = class CommanderError extends Error {
|
|
40
40
|
|
41
41
|
/**
|
42
42
|
* InvalidArgumentError class
|
43
|
-
* @class
|
44
43
|
*/
|
45
44
|
let InvalidArgumentError$4 = class InvalidArgumentError extends CommanderError$3 {
|
46
45
|
/**
|
47
46
|
* Constructs the InvalidArgumentError class
|
48
47
|
* @param {string} [message] explanation of why argument is invalid
|
49
|
-
* @constructor
|
50
48
|
*/
|
51
49
|
constructor(message) {
|
52
50
|
super(1, 'commander.invalidArgument', message);
|
@@ -111,7 +109,7 @@ let Argument$3 = class Argument {
|
|
111
109
|
}
|
112
110
|
|
113
111
|
/**
|
114
|
-
* @package
|
112
|
+
* @package
|
115
113
|
*/
|
116
114
|
|
117
115
|
_concatValue(value, previous) {
|
@@ -159,7 +157,9 @@ let Argument$3 = class Argument {
|
|
159
157
|
this.argChoices = values.slice();
|
160
158
|
this.parseArg = (arg, previous) => {
|
161
159
|
if (!this.argChoices.includes(arg)) {
|
162
|
-
throw new InvalidArgumentError$3(
|
160
|
+
throw new InvalidArgumentError$3(
|
161
|
+
`Allowed choices are ${this.argChoices.join(', ')}.`,
|
162
|
+
);
|
163
163
|
}
|
164
164
|
if (this.variadic) {
|
165
165
|
return this._concatValue(arg, previous);
|
@@ -171,6 +171,8 @@ let Argument$3 = class Argument {
|
|
171
171
|
|
172
172
|
/**
|
173
173
|
* Make argument required.
|
174
|
+
*
|
175
|
+
* @returns {Argument}
|
174
176
|
*/
|
175
177
|
argRequired() {
|
176
178
|
this.required = true;
|
@@ -179,6 +181,8 @@ let Argument$3 = class Argument {
|
|
179
181
|
|
180
182
|
/**
|
181
183
|
* Make argument optional.
|
184
|
+
*
|
185
|
+
* @returns {Argument}
|
182
186
|
*/
|
183
187
|
argOptional() {
|
184
188
|
this.required = false;
|
@@ -197,9 +201,7 @@ let Argument$3 = class Argument {
|
|
197
201
|
function humanReadableArgName$2(arg) {
|
198
202
|
const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');
|
199
203
|
|
200
|
-
return arg.required
|
201
|
-
? '<' + nameOutput + '>'
|
202
|
-
: '[' + nameOutput + ']';
|
204
|
+
return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';
|
203
205
|
}
|
204
206
|
|
205
207
|
argument.Argument = Argument$3;
|
@@ -236,14 +238,14 @@ let Help$3 = class Help {
|
|
236
238
|
*/
|
237
239
|
|
238
240
|
visibleCommands(cmd) {
|
239
|
-
const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden);
|
241
|
+
const visibleCommands = cmd.commands.filter((cmd) => !cmd._hidden);
|
240
242
|
const helpCommand = cmd._getHelpCommand();
|
241
243
|
if (helpCommand && !helpCommand._hidden) {
|
242
244
|
visibleCommands.push(helpCommand);
|
243
245
|
}
|
244
246
|
if (this.sortSubcommands) {
|
245
247
|
visibleCommands.sort((a, b) => {
|
246
|
-
// @ts-ignore: overloaded return type
|
248
|
+
// @ts-ignore: because overloaded return type
|
247
249
|
return a.name().localeCompare(b.name());
|
248
250
|
});
|
249
251
|
}
|
@@ -255,12 +257,14 @@ let Help$3 = class Help {
|
|
255
257
|
*
|
256
258
|
* @param {Option} a
|
257
259
|
* @param {Option} b
|
258
|
-
* @returns number
|
260
|
+
* @returns {number}
|
259
261
|
*/
|
260
262
|
compareOptions(a, b) {
|
261
263
|
const getSortKey = (option) => {
|
262
264
|
// WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.
|
263
|
-
return option.short
|
265
|
+
return option.short
|
266
|
+
? option.short.replace(/^-/, '')
|
267
|
+
: option.long.replace(/^--/, '');
|
264
268
|
};
|
265
269
|
return getSortKey(a).localeCompare(getSortKey(b));
|
266
270
|
}
|
@@ -283,9 +287,13 @@ let Help$3 = class Help {
|
|
283
287
|
if (!removeShort && !removeLong) {
|
284
288
|
visibleOptions.push(helpOption); // no changes needed
|
285
289
|
} else if (helpOption.long && !removeLong) {
|
286
|
-
visibleOptions.push(
|
290
|
+
visibleOptions.push(
|
291
|
+
cmd.createOption(helpOption.long, helpOption.description),
|
292
|
+
);
|
287
293
|
} else if (helpOption.short && !removeShort) {
|
288
|
-
visibleOptions.push(
|
294
|
+
visibleOptions.push(
|
295
|
+
cmd.createOption(helpOption.short, helpOption.description),
|
296
|
+
);
|
289
297
|
}
|
290
298
|
}
|
291
299
|
if (this.sortOptions) {
|
@@ -305,8 +313,14 @@ let Help$3 = class Help {
|
|
305
313
|
if (!this.showGlobalOptions) return [];
|
306
314
|
|
307
315
|
const globalOptions = [];
|
308
|
-
for (
|
309
|
-
|
316
|
+
for (
|
317
|
+
let ancestorCmd = cmd.parent;
|
318
|
+
ancestorCmd;
|
319
|
+
ancestorCmd = ancestorCmd.parent
|
320
|
+
) {
|
321
|
+
const visibleOptions = ancestorCmd.options.filter(
|
322
|
+
(option) => !option.hidden,
|
323
|
+
);
|
310
324
|
globalOptions.push(...visibleOptions);
|
311
325
|
}
|
312
326
|
if (this.sortOptions) {
|
@@ -325,13 +339,14 @@ let Help$3 = class Help {
|
|
325
339
|
visibleArguments(cmd) {
|
326
340
|
// Side effect! Apply the legacy descriptions before the arguments are displayed.
|
327
341
|
if (cmd._argsDescription) {
|
328
|
-
cmd.registeredArguments.forEach(argument => {
|
329
|
-
argument.description =
|
342
|
+
cmd.registeredArguments.forEach((argument) => {
|
343
|
+
argument.description =
|
344
|
+
argument.description || cmd._argsDescription[argument.name()] || '';
|
330
345
|
});
|
331
346
|
}
|
332
347
|
|
333
348
|
// If there are any arguments with a description then return all the arguments.
|
334
|
-
if (cmd.registeredArguments.find(argument => argument.description)) {
|
349
|
+
if (cmd.registeredArguments.find((argument) => argument.description)) {
|
335
350
|
return cmd.registeredArguments;
|
336
351
|
}
|
337
352
|
return [];
|
@@ -346,11 +361,15 @@ let Help$3 = class Help {
|
|
346
361
|
|
347
362
|
subcommandTerm(cmd) {
|
348
363
|
// Legacy. Ignores custom usage string, and nested commands.
|
349
|
-
const args = cmd.registeredArguments
|
350
|
-
|
364
|
+
const args = cmd.registeredArguments
|
365
|
+
.map((arg) => humanReadableArgName$1(arg))
|
366
|
+
.join(' ');
|
367
|
+
return (
|
368
|
+
cmd._name +
|
351
369
|
(cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +
|
352
370
|
(cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option
|
353
|
-
(args ? ' ' + args : '')
|
371
|
+
(args ? ' ' + args : '')
|
372
|
+
);
|
354
373
|
}
|
355
374
|
|
356
375
|
/**
|
@@ -445,7 +464,11 @@ let Help$3 = class Help {
|
|
445
464
|
cmdName = cmdName + '|' + cmd._aliases[0];
|
446
465
|
}
|
447
466
|
let ancestorCmdNames = '';
|
448
|
-
for (
|
467
|
+
for (
|
468
|
+
let ancestorCmd = cmd.parent;
|
469
|
+
ancestorCmd;
|
470
|
+
ancestorCmd = ancestorCmd.parent
|
471
|
+
) {
|
449
472
|
ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;
|
450
473
|
}
|
451
474
|
return ancestorCmdNames + cmdName + ' ' + cmd.usage();
|
@@ -459,7 +482,7 @@ let Help$3 = class Help {
|
|
459
482
|
*/
|
460
483
|
|
461
484
|
commandDescription(cmd) {
|
462
|
-
// @ts-ignore: overloaded return type
|
485
|
+
// @ts-ignore: because overloaded return type
|
463
486
|
return cmd.description();
|
464
487
|
}
|
465
488
|
|
@@ -472,7 +495,7 @@ let Help$3 = class Help {
|
|
472
495
|
*/
|
473
496
|
|
474
497
|
subcommandDescription(cmd) {
|
475
|
-
// @ts-ignore: overloaded return type
|
498
|
+
// @ts-ignore: because overloaded return type
|
476
499
|
return cmd.summary() || cmd.description();
|
477
500
|
}
|
478
501
|
|
@@ -489,15 +512,20 @@ let Help$3 = class Help {
|
|
489
512
|
if (option.argChoices) {
|
490
513
|
extraInfo.push(
|
491
514
|
// use stringify to match the display of the default value
|
492
|
-
`choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}
|
515
|
+
`choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,
|
516
|
+
);
|
493
517
|
}
|
494
518
|
if (option.defaultValue !== undefined) {
|
495
519
|
// default for boolean and negated more for programmer than end user,
|
496
520
|
// but show true/false for boolean option as may be for hand-rolled env or config processing.
|
497
|
-
const showDefault =
|
521
|
+
const showDefault =
|
522
|
+
option.required ||
|
523
|
+
option.optional ||
|
498
524
|
(option.isBoolean() && typeof option.defaultValue === 'boolean');
|
499
525
|
if (showDefault) {
|
500
|
-
extraInfo.push(
|
526
|
+
extraInfo.push(
|
527
|
+
`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`,
|
528
|
+
);
|
501
529
|
}
|
502
530
|
}
|
503
531
|
// preset for boolean and negated are more for programmer than end user
|
@@ -526,10 +554,13 @@ let Help$3 = class Help {
|
|
526
554
|
if (argument.argChoices) {
|
527
555
|
extraInfo.push(
|
528
556
|
// use stringify to match the display of the default value
|
529
|
-
`choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}
|
557
|
+
`choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`,
|
558
|
+
);
|
530
559
|
}
|
531
560
|
if (argument.defaultValue !== undefined) {
|
532
|
-
extraInfo.push(
|
561
|
+
extraInfo.push(
|
562
|
+
`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`,
|
563
|
+
);
|
533
564
|
}
|
534
565
|
if (extraInfo.length > 0) {
|
535
566
|
const extraDescripton = `(${extraInfo.join(', ')})`;
|
@@ -557,7 +588,11 @@ let Help$3 = class Help {
|
|
557
588
|
function formatItem(term, description) {
|
558
589
|
if (description) {
|
559
590
|
const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
|
560
|
-
return helper.wrap(
|
591
|
+
return helper.wrap(
|
592
|
+
fullText,
|
593
|
+
helpWidth - itemIndentWidth,
|
594
|
+
termWidth + itemSeparatorWidth,
|
595
|
+
);
|
561
596
|
}
|
562
597
|
return term;
|
563
598
|
}
|
@@ -571,12 +606,18 @@ let Help$3 = class Help {
|
|
571
606
|
// Description
|
572
607
|
const commandDescription = helper.commandDescription(cmd);
|
573
608
|
if (commandDescription.length > 0) {
|
574
|
-
output = output.concat([
|
609
|
+
output = output.concat([
|
610
|
+
helper.wrap(commandDescription, helpWidth, 0),
|
611
|
+
'',
|
612
|
+
]);
|
575
613
|
}
|
576
614
|
|
577
615
|
// Arguments
|
578
616
|
const argumentList = helper.visibleArguments(cmd).map((argument) => {
|
579
|
-
return formatItem(
|
617
|
+
return formatItem(
|
618
|
+
helper.argumentTerm(argument),
|
619
|
+
helper.argumentDescription(argument),
|
620
|
+
);
|
580
621
|
});
|
581
622
|
if (argumentList.length > 0) {
|
582
623
|
output = output.concat(['Arguments:', formatList(argumentList), '']);
|
@@ -584,24 +625,39 @@ let Help$3 = class Help {
|
|
584
625
|
|
585
626
|
// Options
|
586
627
|
const optionList = helper.visibleOptions(cmd).map((option) => {
|
587
|
-
return formatItem(
|
628
|
+
return formatItem(
|
629
|
+
helper.optionTerm(option),
|
630
|
+
helper.optionDescription(option),
|
631
|
+
);
|
588
632
|
});
|
589
633
|
if (optionList.length > 0) {
|
590
634
|
output = output.concat(['Options:', formatList(optionList), '']);
|
591
635
|
}
|
592
636
|
|
593
637
|
if (this.showGlobalOptions) {
|
594
|
-
const globalOptionList = helper
|
595
|
-
|
596
|
-
|
638
|
+
const globalOptionList = helper
|
639
|
+
.visibleGlobalOptions(cmd)
|
640
|
+
.map((option) => {
|
641
|
+
return formatItem(
|
642
|
+
helper.optionTerm(option),
|
643
|
+
helper.optionDescription(option),
|
644
|
+
);
|
645
|
+
});
|
597
646
|
if (globalOptionList.length > 0) {
|
598
|
-
output = output.concat([
|
647
|
+
output = output.concat([
|
648
|
+
'Global Options:',
|
649
|
+
formatList(globalOptionList),
|
650
|
+
'',
|
651
|
+
]);
|
599
652
|
}
|
600
653
|
}
|
601
654
|
|
602
655
|
// Commands
|
603
656
|
const commandList = helper.visibleCommands(cmd).map((cmd) => {
|
604
|
-
return formatItem(
|
657
|
+
return formatItem(
|
658
|
+
helper.subcommandTerm(cmd),
|
659
|
+
helper.subcommandDescription(cmd),
|
660
|
+
);
|
605
661
|
});
|
606
662
|
if (commandList.length > 0) {
|
607
663
|
output = output.concat(['Commands:', formatList(commandList), '']);
|
@@ -623,7 +679,7 @@ let Help$3 = class Help {
|
|
623
679
|
helper.longestOptionTermLength(cmd, helper),
|
624
680
|
helper.longestGlobalOptionTermLength(cmd, helper),
|
625
681
|
helper.longestSubcommandTermLength(cmd, helper),
|
626
|
-
helper.longestArgumentTermLength(cmd, helper)
|
682
|
+
helper.longestArgumentTermLength(cmd, helper),
|
627
683
|
);
|
628
684
|
}
|
629
685
|
|
@@ -641,7 +697,8 @@ let Help$3 = class Help {
|
|
641
697
|
|
642
698
|
wrap(str, width, indent, minColumnWidth = 40) {
|
643
699
|
// Full \s characters, minus the linefeeds.
|
644
|
-
const indents =
|
700
|
+
const indents =
|
701
|
+
' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff';
|
645
702
|
// Detect manually wrapped and indented strings by searching for line break followed by spaces.
|
646
703
|
const manualIndent = new RegExp(`[\\n][${indents}]+`);
|
647
704
|
if (str.match(manualIndent)) return str;
|
@@ -656,12 +713,20 @@ let Help$3 = class Help {
|
|
656
713
|
const breaks = `\\s${zeroWidthSpace}`;
|
657
714
|
// Match line end (so empty lines don't collapse),
|
658
715
|
// or as much text as will fit in column, or excess text up to first break.
|
659
|
-
const regex = new RegExp(
|
716
|
+
const regex = new RegExp(
|
717
|
+
`\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`,
|
718
|
+
'g',
|
719
|
+
);
|
660
720
|
const lines = columnText.match(regex) || [];
|
661
|
-
return
|
662
|
-
|
663
|
-
|
664
|
-
|
721
|
+
return (
|
722
|
+
leadingStr +
|
723
|
+
lines
|
724
|
+
.map((line, i) => {
|
725
|
+
if (line === '\n') return ''; // preserve empty lines
|
726
|
+
return (i > 0 ? indentString : '') + line.trimEnd();
|
727
|
+
})
|
728
|
+
.join('\n')
|
729
|
+
);
|
665
730
|
}
|
666
731
|
};
|
667
732
|
|
@@ -764,7 +829,7 @@ let Option$3 = class Option {
|
|
764
829
|
* .addOption(new Option('--log', 'write logging information to file'))
|
765
830
|
* .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
|
766
831
|
*
|
767
|
-
* @param {
|
832
|
+
* @param {object} impliedOptionValues
|
768
833
|
* @return {Option}
|
769
834
|
*/
|
770
835
|
implies(impliedOptionValues) {
|
@@ -829,7 +894,7 @@ let Option$3 = class Option {
|
|
829
894
|
}
|
830
895
|
|
831
896
|
/**
|
832
|
-
* @package
|
897
|
+
* @package
|
833
898
|
*/
|
834
899
|
|
835
900
|
_concatValue(value, previous) {
|
@@ -851,7 +916,9 @@ let Option$3 = class Option {
|
|
851
916
|
this.argChoices = values.slice();
|
852
917
|
this.parseArg = (arg, previous) => {
|
853
918
|
if (!this.argChoices.includes(arg)) {
|
854
|
-
throw new InvalidArgumentError$2(
|
919
|
+
throw new InvalidArgumentError$2(
|
920
|
+
`Allowed choices are ${this.argChoices.join(', ')}.`,
|
921
|
+
);
|
855
922
|
}
|
856
923
|
if (this.variadic) {
|
857
924
|
return this._concatValue(arg, previous);
|
@@ -890,7 +957,7 @@ let Option$3 = class Option {
|
|
890
957
|
*
|
891
958
|
* @param {string} arg
|
892
959
|
* @return {boolean}
|
893
|
-
* @package
|
960
|
+
* @package
|
894
961
|
*/
|
895
962
|
|
896
963
|
is(arg) {
|
@@ -903,7 +970,7 @@ let Option$3 = class Option {
|
|
903
970
|
* Options are one of boolean, negated, required argument, or optional argument.
|
904
971
|
*
|
905
972
|
* @return {boolean}
|
906
|
-
* @package
|
973
|
+
* @package
|
907
974
|
*/
|
908
975
|
|
909
976
|
isBoolean() {
|
@@ -926,7 +993,7 @@ let DualOptions$1 = class DualOptions {
|
|
926
993
|
this.positiveOptions = new Map();
|
927
994
|
this.negativeOptions = new Map();
|
928
995
|
this.dualOptions = new Set();
|
929
|
-
options.forEach(option => {
|
996
|
+
options.forEach((option) => {
|
930
997
|
if (option.negate) {
|
931
998
|
this.negativeOptions.set(option.attributeName(), option);
|
932
999
|
} else {
|
@@ -953,7 +1020,7 @@ let DualOptions$1 = class DualOptions {
|
|
953
1020
|
|
954
1021
|
// Use the value to deduce if (probably) came from the option.
|
955
1022
|
const preset = this.negativeOptions.get(optionKey).presetArg;
|
956
|
-
const negativeValue =
|
1023
|
+
const negativeValue = preset !== undefined ? preset : false;
|
957
1024
|
return option.negate === (negativeValue === value);
|
958
1025
|
}
|
959
1026
|
};
|
@@ -984,7 +1051,8 @@ function splitOptionFlags(flags) {
|
|
984
1051
|
// Use original very loose parsing to maintain backwards compatibility for now,
|
985
1052
|
// which allowed for example unintended `-sw, --short-word` [sic].
|
986
1053
|
const flagParts = flags.split(/[ |,]+/);
|
987
|
-
if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1]))
|
1054
|
+
if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1]))
|
1055
|
+
shortFlag = flagParts.shift();
|
988
1056
|
longFlag = flagParts.shift();
|
989
1057
|
// Add support for lone short flag without significantly changing parsing!
|
990
1058
|
if (!shortFlag && /^-[^-]$/.test(longFlag)) {
|
@@ -1007,7 +1075,8 @@ function editDistance(a, b) {
|
|
1007
1075
|
// (Simple implementation.)
|
1008
1076
|
|
1009
1077
|
// Quick early exit, return worst case.
|
1010
|
-
if (Math.abs(a.length - b.length) > maxDistance)
|
1078
|
+
if (Math.abs(a.length - b.length) > maxDistance)
|
1079
|
+
return Math.max(a.length, b.length);
|
1011
1080
|
|
1012
1081
|
// distance between prefix substrings of a and b
|
1013
1082
|
const d = [];
|
@@ -1033,7 +1102,7 @@ function editDistance(a, b) {
|
|
1033
1102
|
d[i][j] = Math.min(
|
1034
1103
|
d[i - 1][j] + 1, // deletion
|
1035
1104
|
d[i][j - 1] + 1, // insertion
|
1036
|
-
d[i - 1][j - 1] + cost // substitution
|
1105
|
+
d[i - 1][j - 1] + cost, // substitution
|
1037
1106
|
);
|
1038
1107
|
// transposition
|
1039
1108
|
if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {
|
@@ -1061,7 +1130,7 @@ function suggestSimilar$1(word, candidates) {
|
|
1061
1130
|
const searchingOptions = word.startsWith('--');
|
1062
1131
|
if (searchingOptions) {
|
1063
1132
|
word = word.slice(2);
|
1064
|
-
candidates = candidates.map(candidate => candidate.slice(2));
|
1133
|
+
candidates = candidates.map((candidate) => candidate.slice(2));
|
1065
1134
|
}
|
1066
1135
|
|
1067
1136
|
let similar = [];
|
@@ -1086,7 +1155,7 @@ function suggestSimilar$1(word, candidates) {
|
|
1086
1155
|
|
1087
1156
|
similar.sort((a, b) => a.localeCompare(b));
|
1088
1157
|
if (searchingOptions) {
|
1089
|
-
similar = similar.map(candidate => `--${candidate}`);
|
1158
|
+
similar = similar.map((candidate) => `--${candidate}`);
|
1090
1159
|
}
|
1091
1160
|
|
1092
1161
|
if (similar.length > 1) {
|
@@ -1103,7 +1172,7 @@ suggestSimilar$2.suggestSimilar = suggestSimilar$1;
|
|
1103
1172
|
const EventEmitter = require$$0.EventEmitter;
|
1104
1173
|
const childProcess = require$$1;
|
1105
1174
|
const path = require$$2;
|
1106
|
-
const fs =
|
1175
|
+
const fs = require$$3;
|
1107
1176
|
const process$1 = require$$4;
|
1108
1177
|
|
1109
1178
|
const { Argument: Argument$2, humanReadableArgName } = argument;
|
@@ -1162,9 +1231,11 @@ let Command$2 = class Command extends EventEmitter {
|
|
1162
1231
|
this._outputConfiguration = {
|
1163
1232
|
writeOut: (str) => process$1.stdout.write(str),
|
1164
1233
|
writeErr: (str) => process$1.stderr.write(str),
|
1165
|
-
getOutHelpWidth: () =>
|
1166
|
-
|
1167
|
-
|
1234
|
+
getOutHelpWidth: () =>
|
1235
|
+
process$1.stdout.isTTY ? process$1.stdout.columns : undefined,
|
1236
|
+
getErrHelpWidth: () =>
|
1237
|
+
process$1.stderr.isTTY ? process$1.stderr.columns : undefined,
|
1238
|
+
outputError: (str, write) => write(str),
|
1168
1239
|
};
|
1169
1240
|
|
1170
1241
|
this._hidden = false;
|
@@ -1191,7 +1262,8 @@ let Command$2 = class Command extends EventEmitter {
|
|
1191
1262
|
this._helpConfiguration = sourceCommand._helpConfiguration;
|
1192
1263
|
this._exitCallback = sourceCommand._exitCallback;
|
1193
1264
|
this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties;
|
1194
|
-
this._combineFlagAndOptionalValue =
|
1265
|
+
this._combineFlagAndOptionalValue =
|
1266
|
+
sourceCommand._combineFlagAndOptionalValue;
|
1195
1267
|
this._allowExcessArguments = sourceCommand._allowExcessArguments;
|
1196
1268
|
this._enablePositionalOptions = sourceCommand._enablePositionalOptions;
|
1197
1269
|
this._showHelpAfterError = sourceCommand._showHelpAfterError;
|
@@ -1207,6 +1279,7 @@ let Command$2 = class Command extends EventEmitter {
|
|
1207
1279
|
|
1208
1280
|
_getCommandAndAncestors() {
|
1209
1281
|
const result = [];
|
1282
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
1210
1283
|
for (let command = this; command; command = command.parent) {
|
1211
1284
|
result.push(command);
|
1212
1285
|
}
|
@@ -1233,8 +1306,8 @@ let Command$2 = class Command extends EventEmitter {
|
|
1233
1306
|
* .command('stop [service]', 'stop named service, or all if no name supplied');
|
1234
1307
|
*
|
1235
1308
|
* @param {string} nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
1236
|
-
* @param {(
|
1237
|
-
* @param {
|
1309
|
+
* @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable)
|
1310
|
+
* @param {object} [execOpts] - configuration options (for executable)
|
1238
1311
|
* @return {Command} returns new command for action handler, or `this` for executable command
|
1239
1312
|
*/
|
1240
1313
|
|
@@ -1294,8 +1367,8 @@ let Command$2 = class Command extends EventEmitter {
|
|
1294
1367
|
* You can customise the help by overriding Help properties using configureHelp(),
|
1295
1368
|
* or with a subclass of Help by overriding createHelp().
|
1296
1369
|
*
|
1297
|
-
* @param {
|
1298
|
-
* @return {(Command|
|
1370
|
+
* @param {object} [configuration] - configuration options
|
1371
|
+
* @return {(Command | object)} `this` command for chaining, or stored configuration
|
1299
1372
|
*/
|
1300
1373
|
|
1301
1374
|
configureHelp(configuration) {
|
@@ -1320,8 +1393,8 @@ let Command$2 = class Command extends EventEmitter {
|
|
1320
1393
|
* // functions based on what is being written out
|
1321
1394
|
* outputError(str, write) // used for displaying errors, and not used for displaying help
|
1322
1395
|
*
|
1323
|
-
* @param {
|
1324
|
-
* @return {(Command|
|
1396
|
+
* @param {object} [configuration] - configuration options
|
1397
|
+
* @return {(Command | object)} `this` command for chaining, or stored configuration
|
1325
1398
|
*/
|
1326
1399
|
|
1327
1400
|
configureOutput(configuration) {
|
@@ -1360,7 +1433,7 @@ let Command$2 = class Command extends EventEmitter {
|
|
1360
1433
|
* See .command() for creating an attached subcommand which inherits settings from its parent.
|
1361
1434
|
*
|
1362
1435
|
* @param {Command} cmd - new subcommand
|
1363
|
-
* @param {
|
1436
|
+
* @param {object} [opts] - configuration options
|
1364
1437
|
* @return {Command} `this` command for chaining
|
1365
1438
|
*/
|
1366
1439
|
|
@@ -1436,9 +1509,12 @@ let Command$2 = class Command extends EventEmitter {
|
|
1436
1509
|
*/
|
1437
1510
|
|
1438
1511
|
arguments(names) {
|
1439
|
-
names
|
1440
|
-
|
1441
|
-
|
1512
|
+
names
|
1513
|
+
.trim()
|
1514
|
+
.split(/ +/)
|
1515
|
+
.forEach((detail) => {
|
1516
|
+
this.argument(detail);
|
1517
|
+
});
|
1442
1518
|
return this;
|
1443
1519
|
}
|
1444
1520
|
|
@@ -1451,10 +1527,18 @@ let Command$2 = class Command extends EventEmitter {
|
|
1451
1527
|
addArgument(argument) {
|
1452
1528
|
const previousArgument = this.registeredArguments.slice(-1)[0];
|
1453
1529
|
if (previousArgument && previousArgument.variadic) {
|
1454
|
-
throw new Error(
|
1530
|
+
throw new Error(
|
1531
|
+
`only the last argument can be variadic '${previousArgument.name()}'`,
|
1532
|
+
);
|
1455
1533
|
}
|
1456
|
-
if (
|
1457
|
-
|
1534
|
+
if (
|
1535
|
+
argument.required &&
|
1536
|
+
argument.defaultValue !== undefined &&
|
1537
|
+
argument.parseArg === undefined
|
1538
|
+
) {
|
1539
|
+
throw new Error(
|
1540
|
+
`a default value for a required argument is never used: '${argument.name()}'`,
|
1541
|
+
);
|
1458
1542
|
}
|
1459
1543
|
this.registeredArguments.push(argument);
|
1460
1544
|
return this;
|
@@ -1463,6 +1547,7 @@ let Command$2 = class Command extends EventEmitter {
|
|
1463
1547
|
/**
|
1464
1548
|
* Customise or override default help command. By default a help command is automatically added if your command has subcommands.
|
1465
1549
|
*
|
1550
|
+
* @example
|
1466
1551
|
* program.helpCommand('help [cmd]');
|
1467
1552
|
* program.helpCommand('help [cmd]', 'show help');
|
1468
1553
|
* program.helpCommand(false); // suppress default help command
|
@@ -1521,8 +1606,11 @@ let Command$2 = class Command extends EventEmitter {
|
|
1521
1606
|
* @package
|
1522
1607
|
*/
|
1523
1608
|
_getHelpCommand() {
|
1524
|
-
const hasImplicitHelpCommand =
|
1525
|
-
|
1609
|
+
const hasImplicitHelpCommand =
|
1610
|
+
this._addImplicitHelpCommand ??
|
1611
|
+
(this.commands.length &&
|
1612
|
+
!this._actionHandler &&
|
1613
|
+
!this._findCommand('help'));
|
1526
1614
|
|
1527
1615
|
if (hasImplicitHelpCommand) {
|
1528
1616
|
if (this._helpCommand === undefined) {
|
@@ -1668,14 +1756,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1668
1756
|
* Register option if no conflicts found, or throw on conflict.
|
1669
1757
|
*
|
1670
1758
|
* @param {Option} option
|
1671
|
-
* @
|
1759
|
+
* @private
|
1672
1760
|
*/
|
1673
1761
|
|
1674
1762
|
_registerOption(option) {
|
1675
|
-
const matchingOption =
|
1763
|
+
const matchingOption =
|
1764
|
+
(option.short && this._findOption(option.short)) ||
|
1676
1765
|
(option.long && this._findOption(option.long));
|
1677
1766
|
if (matchingOption) {
|
1678
|
-
const matchingFlag =
|
1767
|
+
const matchingFlag =
|
1768
|
+
option.long && this._findOption(option.long)
|
1769
|
+
? option.long
|
1770
|
+
: option.short;
|
1679
1771
|
throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}'
|
1680
1772
|
- already used by option '${matchingOption.flags}'`);
|
1681
1773
|
}
|
@@ -1688,7 +1780,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1688
1780
|
* Register command if no conflicts found, or throw on conflict.
|
1689
1781
|
*
|
1690
1782
|
* @param {Command} command
|
1691
|
-
* @
|
1783
|
+
* @private
|
1692
1784
|
*/
|
1693
1785
|
|
1694
1786
|
_registerCommand(command) {
|
@@ -1696,11 +1788,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1696
1788
|
return [cmd.name()].concat(cmd.aliases());
|
1697
1789
|
};
|
1698
1790
|
|
1699
|
-
const alreadyUsed = knownBy(command).find((name) =>
|
1791
|
+
const alreadyUsed = knownBy(command).find((name) =>
|
1792
|
+
this._findCommand(name),
|
1793
|
+
);
|
1700
1794
|
if (alreadyUsed) {
|
1701
1795
|
const existingCmd = knownBy(this._findCommand(alreadyUsed)).join('|');
|
1702
1796
|
const newCmd = knownBy(command).join('|');
|
1703
|
-
throw new Error(
|
1797
|
+
throw new Error(
|
1798
|
+
`cannot add command '${newCmd}' as already have command '${existingCmd}'`,
|
1799
|
+
);
|
1704
1800
|
}
|
1705
1801
|
|
1706
1802
|
this.commands.push(command);
|
@@ -1723,7 +1819,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1723
1819
|
// --no-foo is special and defaults foo to true, unless a --foo option is already defined
|
1724
1820
|
const positiveLongFlag = option.long.replace(/^--no-/, '--');
|
1725
1821
|
if (!this._findOption(positiveLongFlag)) {
|
1726
|
-
this.setOptionValueWithSource(
|
1822
|
+
this.setOptionValueWithSource(
|
1823
|
+
name,
|
1824
|
+
option.defaultValue === undefined ? true : option.defaultValue,
|
1825
|
+
'default',
|
1826
|
+
);
|
1727
1827
|
}
|
1728
1828
|
} else if (option.defaultValue !== undefined) {
|
1729
1829
|
this.setOptionValueWithSource(name, option.defaultValue, 'default');
|
@@ -1776,11 +1876,14 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1776
1876
|
/**
|
1777
1877
|
* Internal implementation shared by .option() and .requiredOption()
|
1778
1878
|
*
|
1879
|
+
* @return {Command} `this` command for chaining
|
1779
1880
|
* @private
|
1780
1881
|
*/
|
1781
1882
|
_optionEx(config, flags, description, fn, defaultValue) {
|
1782
1883
|
if (typeof flags === 'object' && flags instanceof Option$2) {
|
1783
|
-
throw new Error(
|
1884
|
+
throw new Error(
|
1885
|
+
'To add an Option object use addOption() instead of option() or requiredOption()',
|
1886
|
+
);
|
1784
1887
|
}
|
1785
1888
|
const option = this.createOption(flags, description);
|
1786
1889
|
option.makeOptionMandatory(!!config.mandatory);
|
@@ -1828,20 +1931,26 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1828
1931
|
}
|
1829
1932
|
|
1830
1933
|
/**
|
1831
|
-
|
1832
|
-
|
1833
|
-
|
1834
|
-
|
1835
|
-
|
1836
|
-
|
1837
|
-
|
1838
|
-
|
1839
|
-
|
1840
|
-
|
1841
|
-
|
1934
|
+
* Add a required option which must have a value after parsing. This usually means
|
1935
|
+
* the option must be specified on the command line. (Otherwise the same as .option().)
|
1936
|
+
*
|
1937
|
+
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
|
1938
|
+
*
|
1939
|
+
* @param {string} flags
|
1940
|
+
* @param {string} [description]
|
1941
|
+
* @param {(Function|*)} [parseArg] - custom option processing function or default value
|
1942
|
+
* @param {*} [defaultValue]
|
1943
|
+
* @return {Command} `this` command for chaining
|
1944
|
+
*/
|
1842
1945
|
|
1843
1946
|
requiredOption(flags, description, parseArg, defaultValue) {
|
1844
|
-
return this._optionEx(
|
1947
|
+
return this._optionEx(
|
1948
|
+
{ mandatory: true },
|
1949
|
+
flags,
|
1950
|
+
description,
|
1951
|
+
parseArg,
|
1952
|
+
defaultValue,
|
1953
|
+
);
|
1845
1954
|
}
|
1846
1955
|
|
1847
1956
|
/**
|
@@ -1852,7 +1961,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1852
1961
|
* program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour
|
1853
1962
|
* program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
|
1854
1963
|
*
|
1855
|
-
* @param {boolean} [combine
|
1964
|
+
* @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag.
|
1965
|
+
* @return {Command} `this` command for chaining
|
1856
1966
|
*/
|
1857
1967
|
combineFlagAndOptionalValue(combine = true) {
|
1858
1968
|
this._combineFlagAndOptionalValue = !!combine;
|
@@ -1862,8 +1972,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1862
1972
|
/**
|
1863
1973
|
* Allow unknown options on the command line.
|
1864
1974
|
*
|
1865
|
-
* @param {boolean} [allowUnknown
|
1866
|
-
* for
|
1975
|
+
* @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options.
|
1976
|
+
* @return {Command} `this` command for chaining
|
1867
1977
|
*/
|
1868
1978
|
allowUnknownOption(allowUnknown = true) {
|
1869
1979
|
this._allowUnknownOption = !!allowUnknown;
|
@@ -1873,8 +1983,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1873
1983
|
/**
|
1874
1984
|
* Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
|
1875
1985
|
*
|
1876
|
-
* @param {boolean} [allowExcess
|
1877
|
-
* for
|
1986
|
+
* @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments.
|
1987
|
+
* @return {Command} `this` command for chaining
|
1878
1988
|
*/
|
1879
1989
|
allowExcessArguments(allowExcess = true) {
|
1880
1990
|
this._allowExcessArguments = !!allowExcess;
|
@@ -1886,7 +1996,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1886
1996
|
* subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
|
1887
1997
|
* The default behaviour is non-positional and global options may appear anywhere on the command line.
|
1888
1998
|
*
|
1889
|
-
* @param {boolean} [positional
|
1999
|
+
* @param {boolean} [positional]
|
2000
|
+
* @return {Command} `this` command for chaining
|
1890
2001
|
*/
|
1891
2002
|
enablePositionalOptions(positional = true) {
|
1892
2003
|
this._enablePositionalOptions = !!positional;
|
@@ -1899,8 +2010,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1899
2010
|
* positional options to have been enabled on the program (parent commands).
|
1900
2011
|
* The default behaviour is non-positional and options may appear before or after command-arguments.
|
1901
2012
|
*
|
1902
|
-
* @param {boolean} [passThrough
|
1903
|
-
* for
|
2013
|
+
* @param {boolean} [passThrough] for unknown options.
|
2014
|
+
* @return {Command} `this` command for chaining
|
1904
2015
|
*/
|
1905
2016
|
passThroughOptions(passThrough = true) {
|
1906
2017
|
this._passThroughOptions = !!passThrough;
|
@@ -1913,25 +2024,33 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1913
2024
|
*/
|
1914
2025
|
|
1915
2026
|
_checkForBrokenPassThrough() {
|
1916
|
-
if (
|
1917
|
-
|
2027
|
+
if (
|
2028
|
+
this.parent &&
|
2029
|
+
this._passThroughOptions &&
|
2030
|
+
!this.parent._enablePositionalOptions
|
2031
|
+
) {
|
2032
|
+
throw new Error(
|
2033
|
+
`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`,
|
2034
|
+
);
|
1918
2035
|
}
|
1919
2036
|
}
|
1920
2037
|
|
1921
2038
|
/**
|
1922
|
-
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
2039
|
+
* Whether to store option values as properties on command object,
|
2040
|
+
* or store separately (specify false). In both cases the option values can be accessed using .opts().
|
2041
|
+
*
|
2042
|
+
* @param {boolean} [storeAsProperties=true]
|
2043
|
+
* @return {Command} `this` command for chaining
|
2044
|
+
*/
|
1928
2045
|
|
1929
2046
|
storeOptionsAsProperties(storeAsProperties = true) {
|
1930
2047
|
if (this.options.length) {
|
1931
2048
|
throw new Error('call .storeOptionsAsProperties() before adding options');
|
1932
2049
|
}
|
1933
2050
|
if (Object.keys(this._optionValues).length) {
|
1934
|
-
throw new Error(
|
2051
|
+
throw new Error(
|
2052
|
+
'call .storeOptionsAsProperties() before setting option values',
|
2053
|
+
);
|
1935
2054
|
}
|
1936
2055
|
this._storeOptionsAsProperties = !!storeAsProperties;
|
1937
2056
|
return this;
|
@@ -1941,7 +2060,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1941
2060
|
* Retrieve option value.
|
1942
2061
|
*
|
1943
2062
|
* @param {string} key
|
1944
|
-
* @return {
|
2063
|
+
* @return {object} value
|
1945
2064
|
*/
|
1946
2065
|
|
1947
2066
|
getOptionValue(key) {
|
@@ -1955,7 +2074,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1955
2074
|
* Store option value.
|
1956
2075
|
*
|
1957
2076
|
* @param {string} key
|
1958
|
-
* @param {
|
2077
|
+
* @param {object} value
|
1959
2078
|
* @return {Command} `this` command for chaining
|
1960
2079
|
*/
|
1961
2080
|
|
@@ -1964,13 +2083,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1964
2083
|
}
|
1965
2084
|
|
1966
2085
|
/**
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
|
1973
|
-
|
2086
|
+
* Store option value and where the value came from.
|
2087
|
+
*
|
2088
|
+
* @param {string} key
|
2089
|
+
* @param {object} value
|
2090
|
+
* @param {string} source - expected values are default/config/env/cli/implied
|
2091
|
+
* @return {Command} `this` command for chaining
|
2092
|
+
*/
|
1974
2093
|
|
1975
2094
|
setOptionValueWithSource(key, value, source) {
|
1976
2095
|
if (this._storeOptionsAsProperties) {
|
@@ -1983,24 +2102,24 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
1983
2102
|
}
|
1984
2103
|
|
1985
2104
|
/**
|
1986
|
-
|
1987
|
-
|
1988
|
-
|
1989
|
-
|
1990
|
-
|
1991
|
-
|
2105
|
+
* Get source of option value.
|
2106
|
+
* Expected values are default | config | env | cli | implied
|
2107
|
+
*
|
2108
|
+
* @param {string} key
|
2109
|
+
* @return {string}
|
2110
|
+
*/
|
1992
2111
|
|
1993
2112
|
getOptionValueSource(key) {
|
1994
2113
|
return this._optionValueSources[key];
|
1995
2114
|
}
|
1996
2115
|
|
1997
2116
|
/**
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2117
|
+
* Get source of option value. See also .optsWithGlobals().
|
2118
|
+
* Expected values are default | config | env | cli | implied
|
2119
|
+
*
|
2120
|
+
* @param {string} key
|
2121
|
+
* @return {string}
|
2122
|
+
*/
|
2004
2123
|
|
2005
2124
|
getOptionValueSourceWithGlobals(key) {
|
2006
2125
|
// global overwrites local, like optsWithGlobals
|
@@ -2026,17 +2145,30 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2026
2145
|
}
|
2027
2146
|
parseOptions = parseOptions || {};
|
2028
2147
|
|
2029
|
-
//
|
2030
|
-
if (argv === undefined) {
|
2031
|
-
|
2032
|
-
// @ts-ignore: unknown property
|
2033
|
-
if (process$1.versions && process$1.versions.electron) {
|
2148
|
+
// auto-detect argument conventions if nothing supplied
|
2149
|
+
if (argv === undefined && parseOptions.from === undefined) {
|
2150
|
+
if (process$1.versions?.electron) {
|
2034
2151
|
parseOptions.from = 'electron';
|
2035
2152
|
}
|
2153
|
+
// check node specific options for scenarios where user CLI args follow executable without scriptname
|
2154
|
+
const execArgv = process$1.execArgv ?? [];
|
2155
|
+
if (
|
2156
|
+
execArgv.includes('-e') ||
|
2157
|
+
execArgv.includes('--eval') ||
|
2158
|
+
execArgv.includes('-p') ||
|
2159
|
+
execArgv.includes('--print')
|
2160
|
+
) {
|
2161
|
+
parseOptions.from = 'eval'; // internal usage, not documented
|
2162
|
+
}
|
2163
|
+
}
|
2164
|
+
|
2165
|
+
// default to using process.argv
|
2166
|
+
if (argv === undefined) {
|
2167
|
+
argv = process$1.argv;
|
2036
2168
|
}
|
2037
2169
|
this.rawArgs = argv.slice();
|
2038
2170
|
|
2039
|
-
//
|
2171
|
+
// extract the user args and scriptPath
|
2040
2172
|
let userArgs;
|
2041
2173
|
switch (parseOptions.from) {
|
2042
2174
|
case undefined:
|
@@ -2045,7 +2177,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2045
2177
|
userArgs = argv.slice(2);
|
2046
2178
|
break;
|
2047
2179
|
case 'electron':
|
2048
|
-
// @ts-ignore: unknown property
|
2180
|
+
// @ts-ignore: because defaultApp is an unknown property
|
2049
2181
|
if (process$1.defaultApp) {
|
2050
2182
|
this._scriptPath = argv[1];
|
2051
2183
|
userArgs = argv.slice(2);
|
@@ -2056,12 +2188,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2056
2188
|
case 'user':
|
2057
2189
|
userArgs = argv.slice(0);
|
2058
2190
|
break;
|
2191
|
+
case 'eval':
|
2192
|
+
userArgs = argv.slice(1);
|
2193
|
+
break;
|
2059
2194
|
default:
|
2060
|
-
throw new Error(
|
2195
|
+
throw new Error(
|
2196
|
+
`unexpected parse option { from: '${parseOptions.from}' }`,
|
2197
|
+
);
|
2061
2198
|
}
|
2062
2199
|
|
2063
2200
|
// Find default name for program from arguments.
|
2064
|
-
if (!this._name && this._scriptPath)
|
2201
|
+
if (!this._name && this._scriptPath)
|
2202
|
+
this.nameFromFilename(this._scriptPath);
|
2065
2203
|
this._name = this._name || 'program';
|
2066
2204
|
|
2067
2205
|
return userArgs;
|
@@ -2070,16 +2208,22 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2070
2208
|
/**
|
2071
2209
|
* Parse `argv`, setting options and invoking commands when defined.
|
2072
2210
|
*
|
2073
|
-
*
|
2074
|
-
*
|
2211
|
+
* Use parseAsync instead of parse if any of your action handlers are async.
|
2212
|
+
*
|
2213
|
+
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
2214
|
+
*
|
2215
|
+
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
2216
|
+
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
2217
|
+
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
2218
|
+
* - `'user'`: just user arguments
|
2075
2219
|
*
|
2076
2220
|
* @example
|
2077
|
-
* program.parse(process.argv
|
2078
|
-
* program.parse(); //
|
2221
|
+
* program.parse(); // parse process.argv and auto-detect electron and special node flags
|
2222
|
+
* program.parse(process.argv); // assume argv[0] is app and argv[1] is script
|
2079
2223
|
* program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
2080
2224
|
*
|
2081
2225
|
* @param {string[]} [argv] - optional, defaults to process.argv
|
2082
|
-
* @param {
|
2226
|
+
* @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron
|
2083
2227
|
* @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'
|
2084
2228
|
* @return {Command} `this` command for chaining
|
2085
2229
|
*/
|
@@ -2094,18 +2238,20 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2094
2238
|
/**
|
2095
2239
|
* Parse `argv`, setting options and invoking commands when defined.
|
2096
2240
|
*
|
2097
|
-
*
|
2241
|
+
* Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode!
|
2098
2242
|
*
|
2099
|
-
*
|
2100
|
-
*
|
2243
|
+
* Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`:
|
2244
|
+
* - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that
|
2245
|
+
* - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged
|
2246
|
+
* - `'user'`: just user arguments
|
2101
2247
|
*
|
2102
2248
|
* @example
|
2103
|
-
* await program.parseAsync(process.argv
|
2104
|
-
* await program.parseAsync(); //
|
2249
|
+
* await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags
|
2250
|
+
* await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script
|
2105
2251
|
* await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
2106
2252
|
*
|
2107
2253
|
* @param {string[]} [argv]
|
2108
|
-
* @param {
|
2254
|
+
* @param {object} [parseOptions]
|
2109
2255
|
* @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron'
|
2110
2256
|
* @return {Promise}
|
2111
2257
|
*/
|
@@ -2137,7 +2283,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2137
2283
|
if (sourceExt.includes(path.extname(baseName))) return undefined;
|
2138
2284
|
|
2139
2285
|
// Try all the extensions.
|
2140
|
-
const foundExt = sourceExt.find(ext =>
|
2286
|
+
const foundExt = sourceExt.find((ext) =>
|
2287
|
+
fs.existsSync(`${localBin}${ext}`),
|
2288
|
+
);
|
2141
2289
|
if (foundExt) return `${localBin}${foundExt}`;
|
2142
2290
|
|
2143
2291
|
return undefined;
|
@@ -2148,7 +2296,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2148
2296
|
this._checkForConflictingOptions();
|
2149
2297
|
|
2150
2298
|
// executableFile and executableDir might be full path, or just a name
|
2151
|
-
let executableFile =
|
2299
|
+
let executableFile =
|
2300
|
+
subcommand._executableFile || `${this._name}-${subcommand._name}`;
|
2152
2301
|
let executableDir = this._executableDir || '';
|
2153
2302
|
if (this._scriptPath) {
|
2154
2303
|
let resolvedScriptPath; // resolve possible symlink for installed npm binary
|
@@ -2157,7 +2306,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2157
2306
|
} catch (err) {
|
2158
2307
|
resolvedScriptPath = this._scriptPath;
|
2159
2308
|
}
|
2160
|
-
executableDir = path.resolve(
|
2309
|
+
executableDir = path.resolve(
|
2310
|
+
path.dirname(resolvedScriptPath),
|
2311
|
+
executableDir,
|
2312
|
+
);
|
2161
2313
|
}
|
2162
2314
|
|
2163
2315
|
// Look for a local file in preference to a command in PATH.
|
@@ -2166,9 +2318,15 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2166
2318
|
|
2167
2319
|
// Legacy search using prefix of script name instead of command name
|
2168
2320
|
if (!localFile && !subcommand._executableFile && this._scriptPath) {
|
2169
|
-
const legacyName = path.basename(
|
2321
|
+
const legacyName = path.basename(
|
2322
|
+
this._scriptPath,
|
2323
|
+
path.extname(this._scriptPath),
|
2324
|
+
);
|
2170
2325
|
if (legacyName !== this._name) {
|
2171
|
-
localFile = findFile(
|
2326
|
+
localFile = findFile(
|
2327
|
+
executableDir,
|
2328
|
+
`${legacyName}-${subcommand._name}`,
|
2329
|
+
);
|
2172
2330
|
}
|
2173
2331
|
}
|
2174
2332
|
executableFile = localFile || executableFile;
|
@@ -2194,12 +2352,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2194
2352
|
proc = childProcess.spawn(process$1.execPath, args, { stdio: 'inherit' });
|
2195
2353
|
}
|
2196
2354
|
|
2197
|
-
if (!proc.killed) {
|
2355
|
+
if (!proc.killed) {
|
2356
|
+
// testing mainly to avoid leak warnings during unit tests with mocked spawn
|
2198
2357
|
const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
|
2199
2358
|
signals.forEach((signal) => {
|
2200
|
-
// @ts-ignore
|
2201
2359
|
process$1.on(signal, () => {
|
2202
2360
|
if (proc.killed === false && proc.exitCode === null) {
|
2361
|
+
// @ts-ignore because signals not typed to known strings
|
2203
2362
|
proc.kill(signal);
|
2204
2363
|
}
|
2205
2364
|
});
|
@@ -2208,16 +2367,22 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2208
2367
|
|
2209
2368
|
// By default terminate process when spawned process terminates.
|
2210
2369
|
const exitCallback = this._exitCallback;
|
2211
|
-
proc.on('close', (code
|
2370
|
+
proc.on('close', (code) => {
|
2212
2371
|
code = code ?? 1; // code is null if spawned process terminated due to a signal
|
2213
2372
|
if (!exitCallback) {
|
2214
2373
|
process$1.exit(code);
|
2215
2374
|
} else {
|
2216
|
-
exitCallback(
|
2375
|
+
exitCallback(
|
2376
|
+
new CommanderError$2(
|
2377
|
+
code,
|
2378
|
+
'commander.executeSubCommandAsync',
|
2379
|
+
'(close)',
|
2380
|
+
),
|
2381
|
+
);
|
2217
2382
|
}
|
2218
2383
|
});
|
2219
2384
|
proc.on('error', (err) => {
|
2220
|
-
// @ts-ignore
|
2385
|
+
// @ts-ignore: because err.code is an unknown property
|
2221
2386
|
if (err.code === 'ENOENT') {
|
2222
2387
|
const executableDirMessage = executableDir
|
2223
2388
|
? `searched for local subcommand relative to directory '${executableDir}'`
|
@@ -2227,14 +2392,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2227
2392
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
2228
2393
|
- ${executableDirMessage}`;
|
2229
2394
|
throw new Error(executableMissing);
|
2230
|
-
|
2395
|
+
// @ts-ignore: because err.code is an unknown property
|
2231
2396
|
} else if (err.code === 'EACCES') {
|
2232
2397
|
throw new Error(`'${executableFile}' not executable`);
|
2233
2398
|
}
|
2234
2399
|
if (!exitCallback) {
|
2235
2400
|
process$1.exit(1);
|
2236
2401
|
} else {
|
2237
|
-
const wrappedError = new CommanderError$2(
|
2402
|
+
const wrappedError = new CommanderError$2(
|
2403
|
+
1,
|
2404
|
+
'commander.executeSubCommandAsync',
|
2405
|
+
'(error)',
|
2406
|
+
);
|
2238
2407
|
wrappedError.nestedError = err;
|
2239
2408
|
exitCallback(wrappedError);
|
2240
2409
|
}
|
@@ -2253,7 +2422,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2253
2422
|
if (!subCommand) this.help({ error: true });
|
2254
2423
|
|
2255
2424
|
let promiseChain;
|
2256
|
-
promiseChain = this._chainOrCallSubCommandHook(
|
2425
|
+
promiseChain = this._chainOrCallSubCommandHook(
|
2426
|
+
promiseChain,
|
2427
|
+
subCommand,
|
2428
|
+
'preSubcommand',
|
2429
|
+
);
|
2257
2430
|
promiseChain = this._chainOrCall(promiseChain, () => {
|
2258
2431
|
if (subCommand._executableHandler) {
|
2259
2432
|
this._executeSubCommand(subCommand, operands.concat(unknown));
|
@@ -2281,9 +2454,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2281
2454
|
}
|
2282
2455
|
|
2283
2456
|
// Fallback to parsing the help flag to invoke the help.
|
2284
|
-
return this._dispatchSubcommand(
|
2285
|
-
|
2286
|
-
|
2457
|
+
return this._dispatchSubcommand(
|
2458
|
+
subcommandName,
|
2459
|
+
[],
|
2460
|
+
[this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? '--help'],
|
2461
|
+
);
|
2287
2462
|
}
|
2288
2463
|
|
2289
2464
|
/**
|
@@ -2300,7 +2475,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2300
2475
|
}
|
2301
2476
|
});
|
2302
2477
|
// too many
|
2303
|
-
if (
|
2478
|
+
if (
|
2479
|
+
this.registeredArguments.length > 0 &&
|
2480
|
+
this.registeredArguments[this.registeredArguments.length - 1].variadic
|
2481
|
+
) {
|
2304
2482
|
return;
|
2305
2483
|
}
|
2306
2484
|
if (this.args.length > this.registeredArguments.length) {
|
@@ -2320,7 +2498,12 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2320
2498
|
let parsedValue = value;
|
2321
2499
|
if (value !== null && argument.parseArg) {
|
2322
2500
|
const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`;
|
2323
|
-
parsedValue = this._callParseArg(
|
2501
|
+
parsedValue = this._callParseArg(
|
2502
|
+
argument,
|
2503
|
+
value,
|
2504
|
+
previous,
|
2505
|
+
invalidValueMessage,
|
2506
|
+
);
|
2324
2507
|
}
|
2325
2508
|
return parsedValue;
|
2326
2509
|
};
|
@@ -2385,8 +2568,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2385
2568
|
const hooks = [];
|
2386
2569
|
this._getCommandAndAncestors()
|
2387
2570
|
.reverse()
|
2388
|
-
.filter(cmd => cmd._lifeCycleHooks[event] !== undefined)
|
2389
|
-
.forEach(hookedCommand => {
|
2571
|
+
.filter((cmd) => cmd._lifeCycleHooks[event] !== undefined)
|
2572
|
+
.forEach((hookedCommand) => {
|
2390
2573
|
hookedCommand._lifeCycleHooks[event].forEach((callback) => {
|
2391
2574
|
hooks.push({ hookedCommand, callback });
|
2392
2575
|
});
|
@@ -2442,14 +2625,26 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2442
2625
|
if (operands && this._findCommand(operands[0])) {
|
2443
2626
|
return this._dispatchSubcommand(operands[0], operands.slice(1), unknown);
|
2444
2627
|
}
|
2445
|
-
if (
|
2628
|
+
if (
|
2629
|
+
this._getHelpCommand() &&
|
2630
|
+
operands[0] === this._getHelpCommand().name()
|
2631
|
+
) {
|
2446
2632
|
return this._dispatchHelpCommand(operands[1]);
|
2447
2633
|
}
|
2448
2634
|
if (this._defaultCommandName) {
|
2449
2635
|
this._outputHelpIfRequested(unknown); // Run the help for default command from parent rather than passing to default command
|
2450
|
-
return this._dispatchSubcommand(
|
2636
|
+
return this._dispatchSubcommand(
|
2637
|
+
this._defaultCommandName,
|
2638
|
+
operands,
|
2639
|
+
unknown,
|
2640
|
+
);
|
2451
2641
|
}
|
2452
|
-
if (
|
2642
|
+
if (
|
2643
|
+
this.commands.length &&
|
2644
|
+
this.args.length === 0 &&
|
2645
|
+
!this._actionHandler &&
|
2646
|
+
!this._defaultCommandName
|
2647
|
+
) {
|
2453
2648
|
// probably missing subcommand and no handler, user needs help (and exit)
|
2454
2649
|
this.help({ error: true });
|
2455
2650
|
}
|
@@ -2472,7 +2667,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2472
2667
|
|
2473
2668
|
let promiseChain;
|
2474
2669
|
promiseChain = this._chainOrCallHooks(promiseChain, 'preAction');
|
2475
|
-
promiseChain = this._chainOrCall(promiseChain, () =>
|
2670
|
+
promiseChain = this._chainOrCall(promiseChain, () =>
|
2671
|
+
this._actionHandler(this.processedArgs),
|
2672
|
+
);
|
2476
2673
|
if (this.parent) {
|
2477
2674
|
promiseChain = this._chainOrCall(promiseChain, () => {
|
2478
2675
|
this.parent.emit(commandEvent, operands, unknown); // legacy
|
@@ -2486,7 +2683,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2486
2683
|
this._processArguments();
|
2487
2684
|
this.parent.emit(commandEvent, operands, unknown); // legacy
|
2488
2685
|
} else if (operands.length) {
|
2489
|
-
if (this._findCommand('*')) {
|
2686
|
+
if (this._findCommand('*')) {
|
2687
|
+
// legacy default command
|
2490
2688
|
return this._dispatchSubcommand('*', operands, unknown);
|
2491
2689
|
}
|
2492
2690
|
if (this.listenerCount('command:*')) {
|
@@ -2513,10 +2711,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2513
2711
|
* Find matching command.
|
2514
2712
|
*
|
2515
2713
|
* @private
|
2714
|
+
* @return {Command | undefined}
|
2516
2715
|
*/
|
2517
2716
|
_findCommand(name) {
|
2518
2717
|
if (!name) return undefined;
|
2519
|
-
return this.commands.find(
|
2718
|
+
return this.commands.find(
|
2719
|
+
(cmd) => cmd._name === name || cmd._aliases.includes(name),
|
2720
|
+
);
|
2520
2721
|
}
|
2521
2722
|
|
2522
2723
|
/**
|
@@ -2524,11 +2725,11 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2524
2725
|
*
|
2525
2726
|
* @param {string} arg
|
2526
2727
|
* @return {Option}
|
2527
|
-
* @package
|
2728
|
+
* @package
|
2528
2729
|
*/
|
2529
2730
|
|
2530
2731
|
_findOption(arg) {
|
2531
|
-
return this.options.find(option => option.is(arg));
|
2732
|
+
return this.options.find((option) => option.is(arg));
|
2532
2733
|
}
|
2533
2734
|
|
2534
2735
|
/**
|
@@ -2542,7 +2743,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2542
2743
|
// Walk up hierarchy so can call in subcommand after checking for displaying help.
|
2543
2744
|
this._getCommandAndAncestors().forEach((cmd) => {
|
2544
2745
|
cmd.options.forEach((anOption) => {
|
2545
|
-
if (
|
2746
|
+
if (
|
2747
|
+
anOption.mandatory &&
|
2748
|
+
cmd.getOptionValue(anOption.attributeName()) === undefined
|
2749
|
+
) {
|
2546
2750
|
cmd.missingMandatoryOptionValue(anOption);
|
2547
2751
|
}
|
2548
2752
|
});
|
@@ -2555,23 +2759,21 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2555
2759
|
* @private
|
2556
2760
|
*/
|
2557
2761
|
_checkForConflictingLocalOptions() {
|
2558
|
-
const definedNonDefaultOptions = this.options.filter(
|
2559
|
-
(
|
2560
|
-
|
2561
|
-
|
2562
|
-
return false;
|
2563
|
-
}
|
2564
|
-
return this.getOptionValueSource(optionKey) !== 'default';
|
2762
|
+
const definedNonDefaultOptions = this.options.filter((option) => {
|
2763
|
+
const optionKey = option.attributeName();
|
2764
|
+
if (this.getOptionValue(optionKey) === undefined) {
|
2765
|
+
return false;
|
2565
2766
|
}
|
2566
|
-
|
2767
|
+
return this.getOptionValueSource(optionKey) !== 'default';
|
2768
|
+
});
|
2567
2769
|
|
2568
2770
|
const optionsWithConflicting = definedNonDefaultOptions.filter(
|
2569
|
-
(option) => option.conflictsWith.length > 0
|
2771
|
+
(option) => option.conflictsWith.length > 0,
|
2570
2772
|
);
|
2571
2773
|
|
2572
2774
|
optionsWithConflicting.forEach((option) => {
|
2573
2775
|
const conflictingAndDefined = definedNonDefaultOptions.find((defined) =>
|
2574
|
-
option.conflictsWith.includes(defined.attributeName())
|
2776
|
+
option.conflictsWith.includes(defined.attributeName()),
|
2575
2777
|
);
|
2576
2778
|
if (conflictingAndDefined) {
|
2577
2779
|
this._conflictingOption(option, conflictingAndDefined);
|
@@ -2651,7 +2853,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2651
2853
|
value = args.shift();
|
2652
2854
|
}
|
2653
2855
|
this.emit(`option:${option.name()}`, value);
|
2654
|
-
} else {
|
2856
|
+
} else {
|
2857
|
+
// boolean flag
|
2655
2858
|
this.emit(`option:${option.name()}`);
|
2656
2859
|
}
|
2657
2860
|
activeVariadicOption = option.variadic ? option : null;
|
@@ -2663,7 +2866,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2663
2866
|
if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') {
|
2664
2867
|
const option = this._findOption(`-${arg[1]}`);
|
2665
2868
|
if (option) {
|
2666
|
-
if (
|
2869
|
+
if (
|
2870
|
+
option.required ||
|
2871
|
+
(option.optional && this._combineFlagAndOptionalValue)
|
2872
|
+
) {
|
2667
2873
|
// option with value following in same argument
|
2668
2874
|
this.emit(`option:${option.name()}`, arg.slice(2));
|
2669
2875
|
} else {
|
@@ -2694,12 +2900,19 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2694
2900
|
}
|
2695
2901
|
|
2696
2902
|
// If using positionalOptions, stop processing our options at subcommand.
|
2697
|
-
if (
|
2903
|
+
if (
|
2904
|
+
(this._enablePositionalOptions || this._passThroughOptions) &&
|
2905
|
+
operands.length === 0 &&
|
2906
|
+
unknown.length === 0
|
2907
|
+
) {
|
2698
2908
|
if (this._findCommand(arg)) {
|
2699
2909
|
operands.push(arg);
|
2700
2910
|
if (args.length > 0) unknown.push(...args);
|
2701
2911
|
break;
|
2702
|
-
} else if (
|
2912
|
+
} else if (
|
2913
|
+
this._getHelpCommand() &&
|
2914
|
+
arg === this._getHelpCommand().name()
|
2915
|
+
) {
|
2703
2916
|
operands.push(arg);
|
2704
2917
|
if (args.length > 0) operands.push(...args);
|
2705
2918
|
break;
|
@@ -2727,7 +2940,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2727
2940
|
/**
|
2728
2941
|
* Return an object containing local option values as key-value pairs.
|
2729
2942
|
*
|
2730
|
-
* @return {
|
2943
|
+
* @return {object}
|
2731
2944
|
*/
|
2732
2945
|
opts() {
|
2733
2946
|
if (this._storeOptionsAsProperties) {
|
@@ -2737,7 +2950,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2737
2950
|
|
2738
2951
|
for (let i = 0; i < len; i++) {
|
2739
2952
|
const key = this.options[i].attributeName();
|
2740
|
-
result[key] =
|
2953
|
+
result[key] =
|
2954
|
+
key === this._versionOptionName ? this._version : this[key];
|
2741
2955
|
}
|
2742
2956
|
return result;
|
2743
2957
|
}
|
@@ -2748,13 +2962,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2748
2962
|
/**
|
2749
2963
|
* Return an object containing merged local and global option values as key-value pairs.
|
2750
2964
|
*
|
2751
|
-
* @return {
|
2965
|
+
* @return {object}
|
2752
2966
|
*/
|
2753
2967
|
optsWithGlobals() {
|
2754
2968
|
// globals overwrite locals
|
2755
2969
|
return this._getCommandAndAncestors().reduce(
|
2756
2970
|
(combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()),
|
2757
|
-
{}
|
2971
|
+
{},
|
2758
2972
|
);
|
2759
2973
|
}
|
2760
2974
|
|
@@ -2762,13 +2976,16 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2762
2976
|
* Display error message and exit (or call exitOverride).
|
2763
2977
|
*
|
2764
2978
|
* @param {string} message
|
2765
|
-
* @param {
|
2979
|
+
* @param {object} [errorOptions]
|
2766
2980
|
* @param {string} [errorOptions.code] - an id string representing the error
|
2767
2981
|
* @param {number} [errorOptions.exitCode] - used with process.exit
|
2768
2982
|
*/
|
2769
2983
|
error(message, errorOptions) {
|
2770
2984
|
// output handling
|
2771
|
-
this._outputConfiguration.outputError(
|
2985
|
+
this._outputConfiguration.outputError(
|
2986
|
+
`${message}\n`,
|
2987
|
+
this._outputConfiguration.writeErr,
|
2988
|
+
);
|
2772
2989
|
if (typeof this._showHelpAfterError === 'string') {
|
2773
2990
|
this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`);
|
2774
2991
|
} else if (this._showHelpAfterError) {
|
@@ -2794,11 +3011,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2794
3011
|
if (option.envVar && option.envVar in process$1.env) {
|
2795
3012
|
const optionKey = option.attributeName();
|
2796
3013
|
// Priority check. Do not overwrite cli or options from unknown source (client-code).
|
2797
|
-
if (
|
2798
|
-
|
3014
|
+
if (
|
3015
|
+
this.getOptionValue(optionKey) === undefined ||
|
3016
|
+
['default', 'config', 'env'].includes(
|
3017
|
+
this.getOptionValueSource(optionKey),
|
3018
|
+
)
|
3019
|
+
) {
|
3020
|
+
if (option.required || option.optional) {
|
3021
|
+
// option can take a value
|
2799
3022
|
// keep very simple, optional always takes value
|
2800
3023
|
this.emit(`optionEnv:${option.name()}`, process$1.env[option.envVar]);
|
2801
|
-
} else {
|
3024
|
+
} else {
|
3025
|
+
// boolean
|
2802
3026
|
// keep very simple, only care that envVar defined and not the value
|
2803
3027
|
this.emit(`optionEnv:${option.name()}`);
|
2804
3028
|
}
|
@@ -2815,17 +3039,30 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2815
3039
|
_parseOptionsImplied() {
|
2816
3040
|
const dualHelper = new DualOptions(this.options);
|
2817
3041
|
const hasCustomOptionValue = (optionKey) => {
|
2818
|
-
return
|
3042
|
+
return (
|
3043
|
+
this.getOptionValue(optionKey) !== undefined &&
|
3044
|
+
!['default', 'implied'].includes(this.getOptionValueSource(optionKey))
|
3045
|
+
);
|
2819
3046
|
};
|
2820
3047
|
this.options
|
2821
|
-
.filter(
|
2822
|
-
|
2823
|
-
|
3048
|
+
.filter(
|
3049
|
+
(option) =>
|
3050
|
+
option.implied !== undefined &&
|
3051
|
+
hasCustomOptionValue(option.attributeName()) &&
|
3052
|
+
dualHelper.valueFromOption(
|
3053
|
+
this.getOptionValue(option.attributeName()),
|
3054
|
+
option,
|
3055
|
+
),
|
3056
|
+
)
|
2824
3057
|
.forEach((option) => {
|
2825
3058
|
Object.keys(option.implied)
|
2826
|
-
.filter(impliedKey => !hasCustomOptionValue(impliedKey))
|
2827
|
-
.forEach(impliedKey => {
|
2828
|
-
this.setOptionValueWithSource(
|
3059
|
+
.filter((impliedKey) => !hasCustomOptionValue(impliedKey))
|
3060
|
+
.forEach((impliedKey) => {
|
3061
|
+
this.setOptionValueWithSource(
|
3062
|
+
impliedKey,
|
3063
|
+
option.implied[impliedKey],
|
3064
|
+
'implied',
|
3065
|
+
);
|
2829
3066
|
});
|
2830
3067
|
});
|
2831
3068
|
}
|
@@ -2879,12 +3116,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2879
3116
|
const findBestOptionFromValue = (option) => {
|
2880
3117
|
const optionKey = option.attributeName();
|
2881
3118
|
const optionValue = this.getOptionValue(optionKey);
|
2882
|
-
const negativeOption = this.options.find(
|
2883
|
-
|
2884
|
-
|
2885
|
-
|
2886
|
-
(
|
2887
|
-
)
|
3119
|
+
const negativeOption = this.options.find(
|
3120
|
+
(target) => target.negate && optionKey === target.attributeName(),
|
3121
|
+
);
|
3122
|
+
const positiveOption = this.options.find(
|
3123
|
+
(target) => !target.negate && optionKey === target.attributeName(),
|
3124
|
+
);
|
3125
|
+
if (
|
3126
|
+
negativeOption &&
|
3127
|
+
((negativeOption.presetArg === undefined && optionValue === false) ||
|
3128
|
+
(negativeOption.presetArg !== undefined &&
|
3129
|
+
optionValue === negativeOption.presetArg))
|
3130
|
+
) {
|
2888
3131
|
return negativeOption;
|
2889
3132
|
}
|
2890
3133
|
return positiveOption || option;
|
@@ -2918,11 +3161,14 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2918
3161
|
if (flag.startsWith('--') && this._showSuggestionAfterError) {
|
2919
3162
|
// Looping to pick up the global options too
|
2920
3163
|
let candidateFlags = [];
|
3164
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
2921
3165
|
let command = this;
|
2922
3166
|
do {
|
2923
|
-
const moreFlags = command
|
2924
|
-
.
|
2925
|
-
.
|
3167
|
+
const moreFlags = command
|
3168
|
+
.createHelp()
|
3169
|
+
.visibleOptions(command)
|
3170
|
+
.filter((option) => option.long)
|
3171
|
+
.map((option) => option.long);
|
2926
3172
|
candidateFlags = candidateFlags.concat(moreFlags);
|
2927
3173
|
command = command.parent;
|
2928
3174
|
} while (command && !command._enablePositionalOptions);
|
@@ -2944,7 +3190,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2944
3190
|
if (this._allowExcessArguments) return;
|
2945
3191
|
|
2946
3192
|
const expected = this.registeredArguments.length;
|
2947
|
-
const s =
|
3193
|
+
const s = expected === 1 ? '' : 's';
|
2948
3194
|
const forSubcommand = this.parent ? ` for '${this.name()}'` : '';
|
2949
3195
|
const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`;
|
2950
3196
|
this.error(message, { code: 'commander.excessArguments' });
|
@@ -2962,11 +3208,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
2962
3208
|
|
2963
3209
|
if (this._showSuggestionAfterError) {
|
2964
3210
|
const candidateNames = [];
|
2965
|
-
this.createHelp()
|
2966
|
-
|
2967
|
-
|
2968
|
-
|
2969
|
-
|
3211
|
+
this.createHelp()
|
3212
|
+
.visibleCommands(this)
|
3213
|
+
.forEach((command) => {
|
3214
|
+
candidateNames.push(command.name());
|
3215
|
+
// just visible alias
|
3216
|
+
if (command.alias()) candidateNames.push(command.alias());
|
3217
|
+
});
|
2970
3218
|
suggestion = suggestSimilar(unknownName, candidateNames);
|
2971
3219
|
}
|
2972
3220
|
|
@@ -3007,11 +3255,12 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3007
3255
|
* Set the description.
|
3008
3256
|
*
|
3009
3257
|
* @param {string} [str]
|
3010
|
-
* @param {
|
3258
|
+
* @param {object} [argsDescription]
|
3011
3259
|
* @return {(string|Command)}
|
3012
3260
|
*/
|
3013
3261
|
description(str, argsDescription) {
|
3014
|
-
if (str === undefined && argsDescription === undefined)
|
3262
|
+
if (str === undefined && argsDescription === undefined)
|
3263
|
+
return this._description;
|
3015
3264
|
this._description = str;
|
3016
3265
|
if (argsDescription) {
|
3017
3266
|
this._argsDescription = argsDescription;
|
@@ -3044,18 +3293,27 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3044
3293
|
if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility
|
3045
3294
|
|
3046
3295
|
/** @type {Command} */
|
3296
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
3047
3297
|
let command = this;
|
3048
|
-
if (
|
3298
|
+
if (
|
3299
|
+
this.commands.length !== 0 &&
|
3300
|
+
this.commands[this.commands.length - 1]._executableHandler
|
3301
|
+
) {
|
3049
3302
|
// assume adding alias for last added executable subcommand, rather than this
|
3050
3303
|
command = this.commands[this.commands.length - 1];
|
3051
3304
|
}
|
3052
3305
|
|
3053
|
-
if (alias === command._name)
|
3306
|
+
if (alias === command._name)
|
3307
|
+
throw new Error("Command alias can't be the same as its name");
|
3054
3308
|
const matchingCommand = this.parent?._findCommand(alias);
|
3055
3309
|
if (matchingCommand) {
|
3056
3310
|
// c.f. _registerCommand
|
3057
|
-
const existingCmd = [matchingCommand.name()]
|
3058
|
-
|
3311
|
+
const existingCmd = [matchingCommand.name()]
|
3312
|
+
.concat(matchingCommand.aliases())
|
3313
|
+
.join('|');
|
3314
|
+
throw new Error(
|
3315
|
+
`cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'`,
|
3316
|
+
);
|
3059
3317
|
}
|
3060
3318
|
|
3061
3319
|
command._aliases.push(alias);
|
@@ -3093,11 +3351,13 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3093
3351
|
const args = this.registeredArguments.map((arg) => {
|
3094
3352
|
return humanReadableArgName(arg);
|
3095
3353
|
});
|
3096
|
-
return []
|
3097
|
-
|
3098
|
-
|
3099
|
-
|
3100
|
-
|
3354
|
+
return []
|
3355
|
+
.concat(
|
3356
|
+
this.options.length || this._helpOption !== null ? '[options]' : [],
|
3357
|
+
this.commands.length ? '[command]' : [],
|
3358
|
+
this.registeredArguments.length ? args : [],
|
3359
|
+
)
|
3360
|
+
.join(' ');
|
3101
3361
|
}
|
3102
3362
|
|
3103
3363
|
this._usage = str;
|
@@ -3164,7 +3424,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3164
3424
|
helpInformation(contextOptions) {
|
3165
3425
|
const helper = this.createHelp();
|
3166
3426
|
if (helper.helpWidth === undefined) {
|
3167
|
-
helper.helpWidth =
|
3427
|
+
helper.helpWidth =
|
3428
|
+
contextOptions && contextOptions.error
|
3429
|
+
? this._outputConfiguration.getErrHelpWidth()
|
3430
|
+
: this._outputConfiguration.getOutHelpWidth();
|
3168
3431
|
}
|
3169
3432
|
return helper.formatHelp(this, helper);
|
3170
3433
|
}
|
@@ -3203,13 +3466,18 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3203
3466
|
}
|
3204
3467
|
const context = this._getHelpContext(contextOptions);
|
3205
3468
|
|
3206
|
-
this._getCommandAndAncestors()
|
3469
|
+
this._getCommandAndAncestors()
|
3470
|
+
.reverse()
|
3471
|
+
.forEach((command) => command.emit('beforeAllHelp', context));
|
3207
3472
|
this.emit('beforeHelp', context);
|
3208
3473
|
|
3209
3474
|
let helpInformation = this.helpInformation(context);
|
3210
3475
|
if (deprecatedCallback) {
|
3211
3476
|
helpInformation = deprecatedCallback(helpInformation);
|
3212
|
-
if (
|
3477
|
+
if (
|
3478
|
+
typeof helpInformation !== 'string' &&
|
3479
|
+
!Buffer.isBuffer(helpInformation)
|
3480
|
+
) {
|
3213
3481
|
throw new Error('outputHelp callback must return a string or a Buffer');
|
3214
3482
|
}
|
3215
3483
|
}
|
@@ -3219,7 +3487,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3219
3487
|
this.emit(this._getHelpOption().long); // deprecated
|
3220
3488
|
}
|
3221
3489
|
this.emit('afterHelp', context);
|
3222
|
-
this._getCommandAndAncestors().forEach(command =>
|
3490
|
+
this._getCommandAndAncestors().forEach((command) =>
|
3491
|
+
command.emit('afterAllHelp', context),
|
3492
|
+
);
|
3223
3493
|
}
|
3224
3494
|
|
3225
3495
|
/**
|
@@ -3259,7 +3529,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3259
3529
|
* Returns null if has been disabled with .helpOption(false).
|
3260
3530
|
*
|
3261
3531
|
* @returns {(Option | null)} the help option
|
3262
|
-
* @package
|
3532
|
+
* @package
|
3263
3533
|
*/
|
3264
3534
|
_getHelpOption() {
|
3265
3535
|
// Lazy create help option on demand.
|
@@ -3292,7 +3562,12 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3292
3562
|
help(contextOptions) {
|
3293
3563
|
this.outputHelp(contextOptions);
|
3294
3564
|
let exitCode = process$1.exitCode || 0;
|
3295
|
-
if (
|
3565
|
+
if (
|
3566
|
+
exitCode === 0 &&
|
3567
|
+
contextOptions &&
|
3568
|
+
typeof contextOptions !== 'function' &&
|
3569
|
+
contextOptions.error
|
3570
|
+
) {
|
3296
3571
|
exitCode = 1;
|
3297
3572
|
}
|
3298
3573
|
// message: do not have all displayed text available so only passing placeholder.
|
@@ -3340,7 +3615,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
|
|
3340
3615
|
|
3341
3616
|
_outputHelpIfRequested(args) {
|
3342
3617
|
const helpOption = this._getHelpOption();
|
3343
|
-
const helpRequested = helpOption && args.find(arg => helpOption.is(arg));
|
3618
|
+
const helpRequested = helpOption && args.find((arg) => helpOption.is(arg));
|
3344
3619
|
if (helpRequested) {
|
3345
3620
|
this.outputHelp();
|
3346
3621
|
// (Do not have all displayed text available so only passing placeholder.)
|
@@ -3373,7 +3648,9 @@ function incrementNodeInspectorPort(args) {
|
|
3373
3648
|
if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
|
3374
3649
|
// e.g. --inspect
|
3375
3650
|
debugOption = match[1];
|
3376
|
-
} else if (
|
3651
|
+
} else if (
|
3652
|
+
(match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null
|
3653
|
+
) {
|
3377
3654
|
debugOption = match[1];
|
3378
3655
|
if (/^\d+$/.test(match[3])) {
|
3379
3656
|
// e.g. --inspect=1234
|
@@ -3382,7 +3659,9 @@ function incrementNodeInspectorPort(args) {
|
|
3382
3659
|
// e.g. --inspect=localhost
|
3383
3660
|
debugHost = match[3];
|
3384
3661
|
}
|
3385
|
-
} else if (
|
3662
|
+
} else if (
|
3663
|
+
(match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null
|
3664
|
+
) {
|
3386
3665
|
// e.g. --inspect=localhost:1234
|
3387
3666
|
debugOption = match[1];
|
3388
3667
|
debugHost = match[3];
|
@@ -3435,7 +3714,7 @@ const {
|
|
3435
3714
|
Command,
|
3436
3715
|
Argument,
|
3437
3716
|
Option,
|
3438
|
-
Help
|
3717
|
+
Help,
|
3439
3718
|
} = commander;
|
3440
3719
|
|
3441
3720
|
function genKey(b) {
|
@@ -3516,8 +3795,8 @@ function addKey(file, key, value) {
|
|
3516
3795
|
else {
|
3517
3796
|
content = line + '\n';
|
3518
3797
|
}
|
3519
|
-
if (!fs$1.existsSync(
|
3520
|
-
fs$1.mkdirSync(
|
3798
|
+
if (!fs$1.existsSync(path$1.dirname(file)))
|
3799
|
+
fs$1.mkdirSync(path$1.dirname(file), { recursive: true });
|
3521
3800
|
fs$1.writeFileSync(file, content);
|
3522
3801
|
}
|
3523
3802
|
|
@@ -3531,8 +3810,8 @@ function createPhpFile(file, key) {
|
|
3531
3810
|
const content = `<?php
|
3532
3811
|
// clef de signature
|
3533
3812
|
return "${key}";`;
|
3534
|
-
if (!fs$1.existsSync(
|
3535
|
-
fs$1.mkdirSync(
|
3813
|
+
if (!fs$1.existsSync(path$1.dirname(file)))
|
3814
|
+
fs$1.mkdirSync(path$1.dirname(file), { recursive: true });
|
3536
3815
|
fs$1.writeFileSync(file, content);
|
3537
3816
|
}
|
3538
3817
|
|
@@ -3549,7 +3828,7 @@ program
|
|
3549
3828
|
.option('-v, --var <var>', 'Nom de la variable à ajouter', 'CAPY_SIGN_KEY')
|
3550
3829
|
.action((options) => {
|
3551
3830
|
const key = genKey();
|
3552
|
-
const file =
|
3831
|
+
const file = path$1.resolve(process.cwd(), options.envFile);
|
3553
3832
|
console.log('Génération de clé d\'API', key.hex);
|
3554
3833
|
console.log('Ajout dans le fichier', file);
|
3555
3834
|
addKey(file, options.var, key.hex);
|
@@ -3562,7 +3841,7 @@ program
|
|
3562
3841
|
.option('-v, --var <var>', 'Nom de la variable à lire', 'CAPY_SIGN_KEY')
|
3563
3842
|
.option('-o, --output-file <file>', 'Fichier php à écrire', 'dist/key.php')
|
3564
3843
|
.action((options) => {
|
3565
|
-
const file =
|
3844
|
+
const file = path$1.resolve(process.cwd(), options.envFile);
|
3566
3845
|
const b = extractKey(file, options.var);
|
3567
3846
|
if (b == null) {
|
3568
3847
|
console.error('Impossible de lire la clé');
|
@@ -3570,7 +3849,7 @@ program
|
|
3570
3849
|
}
|
3571
3850
|
const key = genKey(b);
|
3572
3851
|
console.log('Lecture de la clé d\'API', key.hex);
|
3573
|
-
const outFile =
|
3852
|
+
const outFile = path$1.resolve(process.cwd(), options.outputFile);
|
3574
3853
|
console.log('Ecriture dans le fichier', outFile);
|
3575
3854
|
createPhpFile(outFile, key.phpString);
|
3576
3855
|
});
|