@capytale/activity.js 3.0.7 → 3.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/activity/activityBunch/html/nodes.d.ts.map +1 -1
- package/activity/activityType/backend.d.ts +3 -1
- package/activity/activityType/backend.d.ts.map +1 -1
- package/activity/activityType/backend.js +4 -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 +6 -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
|
});
|