@flowscripter/dynamic-cli-framework 1.2.2 → 1.3.1
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/README/core-service-providers.md +2 -2
- package/README/development.md +3 -6
- package/README/implementation-details.md +17 -17
- package/README/key-concepts.md +17 -17
- package/README.md +4 -4
- package/bun.lock +0 -2
- package/index.ts +22 -30
- package/package.json +19 -19
- package/src/api/argument/Argument.ts +1 -1
- package/src/api/argument/ArgumentValueTypes.ts +3 -10
- package/src/api/argument/ComplexOption.ts +5 -9
- package/src/api/command/GlobalCommand.ts +1 -4
- package/src/api/service/core/ArgumentPrompterService.ts +1 -3
- package/src/api/service/core/AsciiBannerGeneratorService.ts +1 -4
- package/src/api/service/core/CompletionService.ts +2 -6
- package/src/api/service/core/ImagePrinterService.ts +1 -2
- package/src/api/service/core/KeyValueService.ts +1 -2
- package/src/api/service/core/PrettyPrinterService.ts +1 -4
- package/src/api/service/core/PrinterService.ts +8 -9
- package/src/api/service/core/PrompterService.ts +4 -11
- package/src/api/service/core/ShutdownService.ts +1 -2
- package/src/api/service/core/SyntaxHighlighterService.ts +1 -5
- package/src/api/service/core/Table.ts +7 -25
- package/src/api/service/core/TreePrinterService.ts +1 -2
- package/src/cli/BaseCLI.ts +17 -47
- package/src/cli/DefaultRuntimeCLI.ts +1 -4
- package/src/command/CompletionCommand.ts +19 -45
- package/src/command/MultiCommandCliHelpCommand.ts +45 -92
- package/src/command/SingleCommandCliHelpCommand.ts +17 -28
- package/src/command/UsageCommand.ts +6 -12
- package/src/command/VersionCommand.ts +2 -6
- package/src/launcher.ts +4 -2
- package/src/runtime/DefaultContext.ts +2 -5
- package/src/runtime/argument/ArgumentTypeGuards.ts +1 -3
- package/src/runtime/command/CommandTypeGuards.ts +5 -14
- package/src/runtime/command/CommandValidator.ts +56 -118
- package/src/runtime/parser.ts +13 -17
- package/src/runtime/registry/CommandRegistry.ts +2 -7
- package/src/runtime/registry/DefaultCommandRegistry.ts +32 -84
- package/src/runtime/registry/DefaultServiceProviderRegistry.ts +3 -9
- package/src/runtime/runner.ts +103 -142
- package/src/runtime/scanner.ts +28 -46
- package/src/runtime/values/ValuePopulationResult.ts +1 -2
- package/src/runtime/values/argumentValueMerge.ts +16 -28
- package/src/runtime/values/argumentValueValidation.ts +21 -67
- package/src/runtime/values/globalCommandValuePopulation.ts +9 -18
- package/src/runtime/values/subCommandValuePopulation.ts +42 -65
- package/src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts +3 -10
- package/src/service/argumentPrompter/DefaultArgumentPrompterService.ts +22 -59
- package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +5 -14
- package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +59 -77
- package/src/service/banner/BannerServiceProvider.ts +13 -35
- package/src/service/banner/command/NoBannerCommand.ts +2 -8
- package/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts +5 -10
- package/src/service/completion/CompletionServiceProvider.ts +20 -48
- package/src/service/completion/DefaultCompletionService.ts +17 -56
- package/src/service/completion/shell/ShellHandler.ts +1 -3
- package/src/service/completion/shell/fish.ts +1 -1
- package/src/service/completion/shell/powershell.ts +2 -12
- package/src/service/completion/shell/zsh.ts +1 -1
- package/src/service/configuration/ConfigurationServiceProvider.ts +40 -133
- package/src/service/configuration/DefaultKeyValueService.ts +6 -20
- package/src/service/configuration/DefaultSecretService.ts +10 -14
- package/src/service/configuration/command/ConfigCommand.ts +1 -4
- package/src/service/configuration/command/DumpConfigCommand.ts +9 -21
- package/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts +5 -14
- package/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts +5 -12
- package/src/service/imagePrinter/DefaultImagePrinterService.ts +1 -5
- package/src/service/imagePrinter/ImagePrinterServiceProvider.ts +1 -4
- package/src/service/prettyPrinter/DefaultPrettyPrinterService.ts +4 -12
- package/src/service/prettyPrinter/PrettyPrinterServiceProvider.ts +3 -10
- package/src/service/printer/DefaultPrinterService.ts +20 -83
- package/src/service/printer/PrinterServiceProvider.ts +3 -11
- package/src/service/printer/command/DarkModeCommand.ts +3 -10
- package/src/service/printer/command/LogLevelCommand.ts +7 -26
- package/src/service/printer/command/NoColorCommand.ts +3 -10
- package/src/service/printer/command/NoHyperlinksCommand.ts +3 -10
- package/src/service/printer/terminal/Progress.ts +99 -90
- package/src/service/printer/terminal/Spinner.ts +7 -26
- package/src/service/prompter/DefaultPrompterService.ts +2 -6
- package/src/service/prompter/PrompterServiceProvider.ts +3 -11
- package/src/service/prompter/command/NoPromptCommand.ts +3 -10
- package/src/service/prompter/prompt/PromptContext.ts +5 -18
- package/src/service/prompter/prompt/promptMultiSelect.ts +6 -21
- package/src/service/prompter/prompt/promptOpenUrl.ts +7 -22
- package/src/service/prompter/prompt/promptSingleSelect.ts +6 -23
- package/src/service/prompter/prompt/promptText.ts +10 -27
- package/src/service/prompter/prompt/promptToggle.ts +8 -8
- package/src/service/shutdown/ShutdownServiceProvider.ts +3 -10
- package/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.ts +13 -26
- package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +8 -21
- package/src/service/tableGenerator/DefaultTableGeneratorService.ts +44 -68
- package/src/service/tableGenerator/TableGeneratorServiceProvider.ts +7 -16
- package/src/service/treePrinter/DefaultTreePrinterService.ts +2 -7
- package/src/service/treePrinter/TreePrinterServiceProvider.ts +4 -12
- package/src/terminal/ImageRenderer.ts +35 -54
- package/src/terminal/PngDecoder.ts +10 -19
- package/src/terminal/TtyStyler.ts +11 -9
- package/src/terminal/TtyTerminal.ts +2 -10
- package/src/terminal/supportsHyperlinks.ts +4 -10
- package/src/util/configHelper.ts +3 -10
- package/src/util/envVarHelper.ts +50 -88
- package/src/util/helpHelper.ts +123 -193
- package/src/util/logger.ts +12 -42
- package/src/util/runnerHelper.ts +20 -61
- package/tests/cli/BaseCLI.test.ts +23 -80
- package/tests/command/CompletionCommand.test.ts +1 -6
- package/tests/command/MultiCommandCliHelpCommand.test.ts +51 -205
- package/tests/command/SingleCommandCliHelpCommand.test.ts +21 -103
- package/tests/command/UsageCommand.test.ts +4 -10
- package/tests/fixtures/Command.ts +87 -68
- package/tests/fixtures/CommandRegistry.ts +1 -3
- package/tests/fixtures/Context.ts +3 -11
- package/tests/fixtures/ServiceProviderRegistry.ts +1 -1
- package/tests/fixtures/prettierPluginFoo.ts +1 -1
- package/tests/fixtures/util.ts +2 -8
- package/tests/runtime/argument/ArgumentTypeGuards.test.ts +1 -3
- package/tests/runtime/command/CommandValidator.test.ts +881 -604
- package/tests/runtime/parser.test.ts +222 -246
- package/tests/runtime/registry/DefaultCommandRegistry.test.ts +15 -37
- package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +2 -8
- package/tests/runtime/runner.test.ts +231 -281
- package/tests/runtime/scanner.test.ts +277 -475
- package/tests/runtime/values/argumentValueMerge.test.ts +133 -81
- package/tests/runtime/values/argumentValueValidation.test.ts +444 -588
- package/tests/runtime/values/globalCommandValuePopulation.test.ts +71 -253
- package/tests/runtime/values/subCommandValuePopulation.test.ts +1342 -1570
- package/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.ts +3 -12
- package/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.ts +36 -45
- package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +2 -8
- package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +40 -62
- package/tests/service/banner/BannerServiceProvider.test.ts +5 -18
- package/tests/service/banner/command/NoBannerCommand.test.ts +1 -4
- package/tests/service/completion/CompletionServiceProvider.test.ts +145 -214
- package/tests/service/completion/DefaultCompletionService.test.ts +17 -79
- package/tests/service/completion/shell/fish.test.ts +1 -3
- package/tests/service/configuration/ConfigurationServiceProvider.test.ts +26 -75
- package/tests/service/configuration/DefaultKeyValueService.test.ts +9 -21
- package/tests/service/configuration/DefaultSecretService.test.ts +7 -15
- package/tests/service/configuration/command/DumpConfigCommand.test.ts +4 -13
- package/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.ts +6 -12
- package/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.ts +1 -10
- package/tests/service/imagePrinter/DefaultImagePrinterService.test.ts +5 -70
- package/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.ts +4 -11
- package/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.ts +2 -6
- package/tests/service/printer/DefaultPrinterService.test.ts +57 -255
- package/tests/service/printer/PrinterServiceProvider.test.ts +2 -8
- package/tests/service/printer/command/DarkModeCommand.test.ts +4 -12
- package/tests/service/printer/command/LogLevelCommand.test.ts +4 -17
- package/tests/service/printer/command/NoColorCommand.test.ts +4 -12
- package/tests/service/printer/command/NoHyperlinksCommand.test.ts +7 -21
- package/tests/service/printer/terminal/Progress.test.ts +1 -3
- package/tests/service/printer/terminal/Spinner.test.ts +2 -8
- package/tests/service/prompter/DefaultPrompterService.test.ts +52 -69
- package/tests/service/prompter/PrompterServiceProvider.test.ts +2 -8
- package/tests/service/shutdown/ShutdownServiceProvider.test.ts +1 -3
- package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +13 -99
- package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +2 -7
- package/tests/service/tableGenerator/DefaultTableGeneratorService.test.ts +12 -33
- package/tests/service/tableGenerator/TableGeneratorServiceProvider.test.ts +2 -2
- package/tests/service/treePrinter/DefaultTreePrinterService.test.ts +4 -6
- package/tests/service/treePrinter/TreePrinterServiceProvider.test.ts +4 -8
- package/tests/terminal/ImageRenderer.test.ts +2 -11
- package/tests/terminal/PngDecoder.test.ts +2 -6
- package/tests/util/configHelper.test.ts +55 -137
- package/tests/util/envVarHelper.test.ts +46 -110
package/src/util/helpHelper.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { distance } from "fastest-levenshtein";
|
|
2
2
|
import type GlobalCommand from "../api/command/GlobalCommand.ts";
|
|
3
3
|
import type GlobalCommandArgument from "../api/argument/GlobalCommandArgument.ts";
|
|
4
|
-
import {
|
|
5
|
-
ArgumentValueTypeName,
|
|
6
|
-
ComplexValueTypeName,
|
|
7
|
-
} from "../api/argument/ArgumentValueTypes.ts";
|
|
4
|
+
import { ArgumentValueTypeName, ComplexValueTypeName } from "../api/argument/ArgumentValueTypes.ts";
|
|
8
5
|
import type SubCommand from "../api/command/SubCommand.ts";
|
|
9
6
|
import type Context from "../api/Context.ts";
|
|
10
7
|
import type UsageExample from "../api/command/UsageExample.ts";
|
|
@@ -62,7 +59,8 @@ function flattenHelpEntry(
|
|
|
62
59
|
if (indentText.length > 0) {
|
|
63
60
|
syntaxTreeChars = isLastSibling ? "└╴" : "├╴";
|
|
64
61
|
}
|
|
65
|
-
syntax =
|
|
62
|
+
syntax =
|
|
63
|
+
HELP_SYNTAX_INDENT +
|
|
66
64
|
printerService.secondary(indentText + syntaxTreeChars) +
|
|
67
65
|
printerService.primary(helpEntry.syntax);
|
|
68
66
|
}
|
|
@@ -75,9 +73,8 @@ function flattenHelpEntry(
|
|
|
75
73
|
rows.push({ syntax, description });
|
|
76
74
|
|
|
77
75
|
if (helpEntry.helpSubEntries !== undefined) {
|
|
78
|
-
const nextIndent =
|
|
79
|
-
(isLastSibling ? " " : "│ ") +
|
|
80
|
-
" ".repeat(helpEntry.subEntryIndent || 0);
|
|
76
|
+
const nextIndent =
|
|
77
|
+
indentText + (isLastSibling ? " " : "│ ") + " ".repeat(helpEntry.subEntryIndent || 0);
|
|
81
78
|
for (let i = 0; i < helpEntry.helpSubEntries.length; i++) {
|
|
82
79
|
const sub = helpEntry.helpSubEntries[i]!;
|
|
83
80
|
flattenHelpEntry(
|
|
@@ -102,23 +99,14 @@ export async function printHelpSections(
|
|
|
102
99
|
for (let i = 0; i < sections.length; i++) {
|
|
103
100
|
const section = sections[i]!;
|
|
104
101
|
if (section.title.length > 0) {
|
|
105
|
-
await printerService.print(
|
|
106
|
-
`${printerService.emphasised(section.title)}\n\n`,
|
|
107
|
-
);
|
|
102
|
+
await printerService.print(`${printerService.emphasised(section.title)}\n\n`);
|
|
108
103
|
}
|
|
109
104
|
|
|
110
105
|
if (section.helpEntries.length === 0) continue;
|
|
111
106
|
|
|
112
107
|
const rows: FlattenedRow[] = [];
|
|
113
108
|
for (const helpEntry of section.helpEntries) {
|
|
114
|
-
flattenHelpEntry(
|
|
115
|
-
printerService,
|
|
116
|
-
helpEntry,
|
|
117
|
-
"",
|
|
118
|
-
true,
|
|
119
|
-
true,
|
|
120
|
-
rows,
|
|
121
|
-
);
|
|
109
|
+
flattenHelpEntry(printerService, helpEntry, "", true, true, rows);
|
|
122
110
|
}
|
|
123
111
|
|
|
124
112
|
const hasDescriptions = rows.some((r) => r.description !== undefined);
|
|
@@ -150,9 +138,7 @@ export async function printHelpSections(
|
|
|
150
138
|
}
|
|
151
139
|
}
|
|
152
140
|
|
|
153
|
-
function getGlobalCommandArgumentForm(
|
|
154
|
-
globalCommandArgument: GlobalCommandArgument,
|
|
155
|
-
): string {
|
|
141
|
+
function getGlobalCommandArgumentForm(globalCommandArgument: GlobalCommandArgument): string {
|
|
156
142
|
let argumentSyntax = "";
|
|
157
143
|
|
|
158
144
|
switch (globalCommandArgument.type) {
|
|
@@ -195,10 +181,7 @@ export function getGlobalArgumentHelpEntry(
|
|
|
195
181
|
const syntax = getGlobalCommandArgumentForm(argument);
|
|
196
182
|
|
|
197
183
|
const notesItems: Array<string> = [];
|
|
198
|
-
if (
|
|
199
|
-
(argument.allowableValues !== undefined) &&
|
|
200
|
-
(argument.allowableValues.length > 0)
|
|
201
|
-
) {
|
|
184
|
+
if (argument.allowableValues !== undefined && argument.allowableValues.length > 0) {
|
|
202
185
|
notesItems.push(`valid values: ${argument.allowableValues.join("|")}`);
|
|
203
186
|
} else {
|
|
204
187
|
switch (argument.type) {
|
|
@@ -212,10 +195,7 @@ export function getGlobalArgumentHelpEntry(
|
|
|
212
195
|
notesItems.push("number value");
|
|
213
196
|
break;
|
|
214
197
|
}
|
|
215
|
-
if (
|
|
216
|
-
(argument.minValueInclusive !== undefined) ||
|
|
217
|
-
(argument.maxValueInclusive !== undefined)
|
|
218
|
-
) {
|
|
198
|
+
if (argument.minValueInclusive !== undefined || argument.maxValueInclusive !== undefined) {
|
|
219
199
|
let range = "..";
|
|
220
200
|
|
|
221
201
|
if (argument.minValueInclusive !== undefined) {
|
|
@@ -275,7 +255,7 @@ export function getSubCommandArgumentsSyntax(subCommand: SubCommand): string {
|
|
|
275
255
|
optionSyntax = `${optionSyntax} <complex_value>`;
|
|
276
256
|
break;
|
|
277
257
|
}
|
|
278
|
-
if (option.isOptional ||
|
|
258
|
+
if (option.isOptional || option.defaultValue !== undefined) {
|
|
279
259
|
optionSyntax = ` [${optionSyntax}]`;
|
|
280
260
|
} else {
|
|
281
261
|
optionSyntax = ` ${optionSyntax}`;
|
|
@@ -325,21 +305,14 @@ function getOptionHelpEntry(
|
|
|
325
305
|
subEntries = [];
|
|
326
306
|
option.properties.forEach((property) => {
|
|
327
307
|
subEntries!.push(
|
|
328
|
-
getOptionHelpEntry(
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
property,
|
|
333
|
-
newSubEntryIndent,
|
|
334
|
-
[...optionAncestry, option],
|
|
335
|
-
),
|
|
308
|
+
getOptionHelpEntry(cliConfig, includeEnvVars, command, property, newSubEntryIndent, [
|
|
309
|
+
...optionAncestry,
|
|
310
|
+
option,
|
|
311
|
+
]),
|
|
336
312
|
);
|
|
337
313
|
});
|
|
338
314
|
} else {
|
|
339
|
-
if (
|
|
340
|
-
(option.allowableValues !== undefined) &&
|
|
341
|
-
(option.allowableValues.length > 0)
|
|
342
|
-
) {
|
|
315
|
+
if (option.allowableValues !== undefined && option.allowableValues.length > 0) {
|
|
343
316
|
notesItems.push(`valid values: ${option.allowableValues.join("|")}`);
|
|
344
317
|
} else {
|
|
345
318
|
switch (option.type) {
|
|
@@ -358,10 +331,7 @@ function getOptionHelpEntry(
|
|
|
358
331
|
}
|
|
359
332
|
}
|
|
360
333
|
}
|
|
361
|
-
if (
|
|
362
|
-
(option.minValueInclusive !== undefined) ||
|
|
363
|
-
(option.maxValueInclusive !== undefined)
|
|
364
|
-
) {
|
|
334
|
+
if (option.minValueInclusive !== undefined || option.maxValueInclusive !== undefined) {
|
|
365
335
|
let range = "..";
|
|
366
336
|
|
|
367
337
|
if (option.minValueInclusive !== undefined) {
|
|
@@ -390,15 +360,11 @@ function getOptionHelpEntry(
|
|
|
390
360
|
notesItems.push("array");
|
|
391
361
|
}
|
|
392
362
|
|
|
393
|
-
if (includeEnvVars &&
|
|
394
|
-
const configurationKey = getSubCommandArgumentConfigurationKey(
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
...(optionAncestry as Array<SubCommandArgument>),
|
|
399
|
-
option as unknown as SubCommandArgument,
|
|
400
|
-
],
|
|
401
|
-
);
|
|
363
|
+
if (includeEnvVars && option.type !== ComplexValueTypeName.COMPLEX) {
|
|
364
|
+
const configurationKey = getSubCommandArgumentConfigurationKey(cliConfig, command, [
|
|
365
|
+
...(optionAncestry as Array<SubCommandArgument>),
|
|
366
|
+
option as unknown as SubCommandArgument,
|
|
367
|
+
]);
|
|
402
368
|
if (configurationKey !== undefined) {
|
|
403
369
|
notesItems.push(`env var: ${configurationKey}`);
|
|
404
370
|
}
|
|
@@ -416,9 +382,7 @@ function getOptionHelpEntry(
|
|
|
416
382
|
|
|
417
383
|
return {
|
|
418
384
|
syntax: `${optionCharacters}${option.name}${
|
|
419
|
-
|
|
420
|
-
? `, ${aliasCharacter}${option.shortAlias}`
|
|
421
|
-
: ""
|
|
385
|
+
option.shortAlias !== undefined ? `, ${aliasCharacter}${option.shortAlias}` : ""
|
|
422
386
|
}`,
|
|
423
387
|
description,
|
|
424
388
|
subEntryIndent: newSubEntryIndent,
|
|
@@ -433,10 +397,7 @@ function getPositionalHelpEntry(
|
|
|
433
397
|
positional: Positional,
|
|
434
398
|
): HelpEntry {
|
|
435
399
|
const notesItems: Array<string> = [];
|
|
436
|
-
if (
|
|
437
|
-
(positional.allowableValues !== undefined) &&
|
|
438
|
-
(positional.allowableValues.length > 0)
|
|
439
|
-
) {
|
|
400
|
+
if (positional.allowableValues !== undefined && positional.allowableValues.length > 0) {
|
|
440
401
|
notesItems.push(`valid values: ${positional.allowableValues.join("|")}`);
|
|
441
402
|
} else {
|
|
442
403
|
switch (positional.type) {
|
|
@@ -454,10 +415,7 @@ function getPositionalHelpEntry(
|
|
|
454
415
|
break;
|
|
455
416
|
}
|
|
456
417
|
}
|
|
457
|
-
if (
|
|
458
|
-
(positional.minValueInclusive !== undefined) ||
|
|
459
|
-
(positional.maxValueInclusive !== undefined)
|
|
460
|
-
) {
|
|
418
|
+
if (positional.minValueInclusive !== undefined || positional.maxValueInclusive !== undefined) {
|
|
461
419
|
let range = "..";
|
|
462
420
|
|
|
463
421
|
if (positional.minValueInclusive !== undefined) {
|
|
@@ -477,13 +435,9 @@ function getPositionalHelpEntry(
|
|
|
477
435
|
}
|
|
478
436
|
|
|
479
437
|
if (includeEnvVars) {
|
|
480
|
-
const configurationKey = getSubCommandArgumentConfigurationKey(
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
[
|
|
484
|
-
positional,
|
|
485
|
-
],
|
|
486
|
-
);
|
|
438
|
+
const configurationKey = getSubCommandArgumentConfigurationKey(cliConfig, command, [
|
|
439
|
+
positional,
|
|
440
|
+
]);
|
|
487
441
|
if (configurationKey !== undefined) {
|
|
488
442
|
notesItems.push(`env var: ${configurationKey}`);
|
|
489
443
|
}
|
|
@@ -511,29 +465,19 @@ export function getCommandArgsHelpSections(
|
|
|
511
465
|
isSingleCommandApp: boolean,
|
|
512
466
|
): Array<HelpSection> {
|
|
513
467
|
const helpSections: Array<HelpSection> = [];
|
|
514
|
-
if (
|
|
468
|
+
if (subCommand.options.length > 0 || subCommand.positionals.length > 0) {
|
|
515
469
|
const argumentsSection: HelpSection = {
|
|
516
470
|
title: `${isSingleCommandApp ? "Command " : ""}Arguments`,
|
|
517
471
|
helpEntries: [],
|
|
518
472
|
};
|
|
519
473
|
subCommand.options.forEach((option) => {
|
|
520
474
|
argumentsSection.helpEntries.push(
|
|
521
|
-
getOptionHelpEntry(
|
|
522
|
-
cliConfig,
|
|
523
|
-
includeEnvVars,
|
|
524
|
-
subCommand,
|
|
525
|
-
option as Option,
|
|
526
|
-
),
|
|
475
|
+
getOptionHelpEntry(cliConfig, includeEnvVars, subCommand, option as Option),
|
|
527
476
|
);
|
|
528
477
|
});
|
|
529
478
|
subCommand.positionals.forEach((positional) => {
|
|
530
479
|
argumentsSection.helpEntries.push(
|
|
531
|
-
getPositionalHelpEntry(
|
|
532
|
-
cliConfig,
|
|
533
|
-
includeEnvVars,
|
|
534
|
-
subCommand,
|
|
535
|
-
positional,
|
|
536
|
-
),
|
|
480
|
+
getPositionalHelpEntry(cliConfig, includeEnvVars, subCommand, positional),
|
|
537
481
|
);
|
|
538
482
|
});
|
|
539
483
|
helpSections.push(argumentsSection);
|
|
@@ -546,27 +490,20 @@ export function getCommandExamplesHelpSections(
|
|
|
546
490
|
subCommand: SubCommand,
|
|
547
491
|
): Array<HelpSection> {
|
|
548
492
|
const helpSections: Array<HelpSection> = [];
|
|
549
|
-
if (
|
|
550
|
-
(subCommand.usageExamples !== undefined) &&
|
|
551
|
-
(subCommand.usageExamples.length > 0)
|
|
552
|
-
) {
|
|
493
|
+
if (subCommand.usageExamples !== undefined && subCommand.usageExamples.length > 0) {
|
|
553
494
|
const usageSection: HelpSection = {
|
|
554
495
|
title: subCommand.usageExamples.length > 1 ? "Examples" : "Example",
|
|
555
496
|
helpEntries: [],
|
|
556
497
|
};
|
|
557
498
|
helpSections.push(usageSection);
|
|
558
499
|
subCommand.usageExamples.forEach((usageExample: UsageExample, index) => {
|
|
559
|
-
if (
|
|
560
|
-
(usageExample.description != null) &&
|
|
561
|
-
(usageExample.description.length > 0)
|
|
562
|
-
) {
|
|
500
|
+
if (usageExample.description != null && usageExample.description.length > 0) {
|
|
563
501
|
usageSection.helpEntries.push({
|
|
564
502
|
syntax: `${printerService.italic(usageExample.description)}:\n`,
|
|
565
503
|
});
|
|
566
504
|
}
|
|
567
505
|
usageSection.helpEntries.push({
|
|
568
|
-
syntax:
|
|
569
|
-
`$ ${context.cliConfig.name} ${subCommand.name} ${usageExample.exampleArguments}`,
|
|
506
|
+
syntax: `$ ${context.cliConfig.name} ${subCommand.name} ${usageExample.exampleArguments}`,
|
|
570
507
|
});
|
|
571
508
|
if (usageExample.output !== undefined) {
|
|
572
509
|
usageExample.output.forEach((output) => {
|
|
@@ -592,23 +529,20 @@ export function getMultiCommandAppSyntax(
|
|
|
592
529
|
groupCommands: ReadonlyArray<GroupCommand>,
|
|
593
530
|
subCommands: ReadonlyArray<SubCommand>,
|
|
594
531
|
): string {
|
|
595
|
-
const globalPrefix =
|
|
596
|
-
? "global_"
|
|
597
|
-
: "";
|
|
532
|
+
const globalPrefix = groupCommands.length > 0 || subCommands.length > 0 ? "global_" : "";
|
|
598
533
|
let syntax = context.cliConfig.name || "";
|
|
599
534
|
if (globalModifierCommands.length > 0) {
|
|
600
535
|
syntax += ` [<${globalPrefix}option>`;
|
|
601
536
|
// dont render global_option arg if none defined
|
|
602
|
-
const noArg = globalModifierCommands.every((
|
|
603
|
-
modifier,
|
|
604
|
-
) => (modifier.argument === undefined));
|
|
537
|
+
const noArg = globalModifierCommands.every((modifier) => modifier.argument === undefined);
|
|
605
538
|
if (!noArg) {
|
|
606
539
|
// render global_option arg in [] if all modifiers have non-optional, non-boolean arg with no default
|
|
607
|
-
const optionArgMandatory = globalModifierCommands.every(
|
|
608
|
-
(modifier
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
540
|
+
const optionArgMandatory = globalModifierCommands.every(
|
|
541
|
+
(modifier) =>
|
|
542
|
+
modifier.argument !== undefined &&
|
|
543
|
+
!modifier.argument.isOptional &&
|
|
544
|
+
modifier.argument.defaultValue === undefined &&
|
|
545
|
+
modifier.argument.type !== ArgumentValueTypeName.BOOLEAN,
|
|
612
546
|
);
|
|
613
547
|
syntax += optionArgMandatory ? " <value>" : " [<value>]";
|
|
614
548
|
}
|
|
@@ -624,94 +558,96 @@ export function getMultiCommandAppSyntax(
|
|
|
624
558
|
const commandClauses: string[] = [];
|
|
625
559
|
if (globalCommands.length > 0) {
|
|
626
560
|
commandClauses.push(`<${globalPrefix}command>`);
|
|
627
|
-
arg = globalCommands.some((
|
|
628
|
-
globalCommand,
|
|
629
|
-
) => (globalCommand.argument !== undefined));
|
|
561
|
+
arg = globalCommands.some((globalCommand) => globalCommand.argument !== undefined);
|
|
630
562
|
if (arg) {
|
|
631
|
-
argOptional = globalCommands.some(
|
|
632
|
-
(globalCommand
|
|
633
|
-
|
|
634
|
-
globalCommand.argument.isOptional) ||
|
|
635
|
-
|
|
563
|
+
argOptional = globalCommands.some(
|
|
564
|
+
(globalCommand) =>
|
|
565
|
+
globalCommand.argument !== undefined &&
|
|
566
|
+
((globalCommand.argument.isOptional !== undefined && globalCommand.argument.isOptional) ||
|
|
567
|
+
globalCommand.argument.defaultValue !== undefined),
|
|
636
568
|
);
|
|
637
|
-
argValueOptional = globalCommands.some(
|
|
638
|
-
(globalCommand
|
|
639
|
-
|
|
569
|
+
argValueOptional = globalCommands.some(
|
|
570
|
+
(globalCommand) =>
|
|
571
|
+
globalCommand.argument !== undefined &&
|
|
572
|
+
globalCommand.argument.type === ArgumentValueTypeName.BOOLEAN,
|
|
640
573
|
);
|
|
641
574
|
}
|
|
642
575
|
}
|
|
643
|
-
if (
|
|
576
|
+
if (groupCommands.length > 0 || subCommands.length > 0) {
|
|
644
577
|
commandClauses.push("<command>");
|
|
645
|
-
arg =
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
578
|
+
arg =
|
|
579
|
+
arg ||
|
|
580
|
+
groupCommands.some((groupCommand) =>
|
|
581
|
+
groupCommand.memberSubCommands.some(
|
|
582
|
+
(memberCommand) =>
|
|
583
|
+
memberCommand.options.length > 0 || memberCommand.positionals.length > 0,
|
|
584
|
+
),
|
|
585
|
+
) ||
|
|
586
|
+
subCommands.some(
|
|
587
|
+
(subCommand) => subCommand.options.length > 0 || subCommand.positionals.length > 0,
|
|
652
588
|
);
|
|
653
589
|
if (arg) {
|
|
654
|
-
argOptional =
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
(
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
)
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
590
|
+
argOptional =
|
|
591
|
+
argOptional ||
|
|
592
|
+
groupCommands.some((groupCommand) =>
|
|
593
|
+
groupCommand.memberSubCommands.some(
|
|
594
|
+
(memberCommand) =>
|
|
595
|
+
memberCommand.options.some(
|
|
596
|
+
(option) =>
|
|
597
|
+
(option.isOptional !== undefined && option.isOptional) ||
|
|
598
|
+
option.defaultValue !== undefined,
|
|
599
|
+
) ||
|
|
600
|
+
memberCommand.positionals.some(
|
|
601
|
+
(positional) =>
|
|
602
|
+
positional.isVarargOptional !== undefined && positional.isVarargOptional,
|
|
603
|
+
),
|
|
604
|
+
),
|
|
605
|
+
) ||
|
|
606
|
+
subCommands.some(
|
|
607
|
+
(subCommand) =>
|
|
608
|
+
subCommand.options.some(
|
|
609
|
+
(option) =>
|
|
610
|
+
(option.isOptional !== undefined && option.isOptional) ||
|
|
611
|
+
option.defaultValue !== undefined,
|
|
612
|
+
) ||
|
|
613
|
+
subCommand.positionals.some(
|
|
614
|
+
(positional) =>
|
|
615
|
+
positional.isVarargOptional !== undefined && positional.isVarargOptional,
|
|
616
|
+
),
|
|
677
617
|
);
|
|
678
|
-
argValueOptional =
|
|
618
|
+
argValueOptional =
|
|
619
|
+
argValueOptional ||
|
|
679
620
|
groupCommands.some((groupCommand) =>
|
|
680
621
|
groupCommand.memberSubCommands.some((memberCommand) =>
|
|
681
|
-
memberCommand.options.some(
|
|
682
|
-
option
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
622
|
+
memberCommand.options.some(
|
|
623
|
+
(option) =>
|
|
624
|
+
option.type === ArgumentValueTypeName.BOOLEAN ||
|
|
625
|
+
memberCommand.positionals.some(
|
|
626
|
+
(positional) => positional.type === ArgumentValueTypeName.BOOLEAN,
|
|
627
|
+
),
|
|
628
|
+
),
|
|
629
|
+
),
|
|
688
630
|
) ||
|
|
689
|
-
subCommands.some(
|
|
690
|
-
subCommand
|
|
691
|
-
option.type ===
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
positional.type === ArgumentValueTypeName.BOOLEAN
|
|
696
|
-
)
|
|
631
|
+
subCommands.some(
|
|
632
|
+
(subCommand) =>
|
|
633
|
+
subCommand.options.some((option) => option.type === ArgumentValueTypeName.BOOLEAN) ||
|
|
634
|
+
subCommand.positionals.some(
|
|
635
|
+
(positional) => positional.type === ArgumentValueTypeName.BOOLEAN,
|
|
636
|
+
),
|
|
697
637
|
);
|
|
698
|
-
multipleArg =
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
)
|
|
706
|
-
)
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
) ||
|
|
712
|
-
subCommand.positionals.some((positional) =>
|
|
713
|
-
positional.isVarargMultiple
|
|
714
|
-
)
|
|
638
|
+
multipleArg =
|
|
639
|
+
multipleArg ||
|
|
640
|
+
groupCommands.some((groupCommand) =>
|
|
641
|
+
groupCommand.memberSubCommands.some(
|
|
642
|
+
(memberCommand) =>
|
|
643
|
+
memberCommand.options.some((option) => option.isArray) ||
|
|
644
|
+
memberCommand.positionals.some((positional) => positional.isVarargMultiple),
|
|
645
|
+
),
|
|
646
|
+
) ||
|
|
647
|
+
subCommands.some(
|
|
648
|
+
(subCommand) =>
|
|
649
|
+
subCommand.options.some((option) => option.isArray) ||
|
|
650
|
+
subCommand.positionals.some((positional) => positional.isVarargMultiple),
|
|
715
651
|
);
|
|
716
652
|
}
|
|
717
653
|
}
|
|
@@ -726,8 +662,8 @@ export function getMultiCommandAppSyntax(
|
|
|
726
662
|
subSyntax += argOptional
|
|
727
663
|
? ` [${argSyntax}]`
|
|
728
664
|
: multipleArg
|
|
729
|
-
|
|
730
|
-
|
|
665
|
+
? ` <${argSyntax}>`
|
|
666
|
+
: ` ${argSyntax}`;
|
|
731
667
|
// check to render multiple arg
|
|
732
668
|
if (multipleArg) {
|
|
733
669
|
subSyntax += "...";
|
|
@@ -745,18 +681,12 @@ export function findPossibleCommandNames(
|
|
|
745
681
|
): string[] {
|
|
746
682
|
const levenCommandArray = new Array<[number, string]>();
|
|
747
683
|
subCommands.forEach((subCommand) => {
|
|
748
|
-
levenCommandArray.push([
|
|
749
|
-
distance(subCommand.name, commandName),
|
|
750
|
-
subCommand.name,
|
|
751
|
-
]);
|
|
684
|
+
levenCommandArray.push([distance(subCommand.name, commandName), subCommand.name]);
|
|
752
685
|
});
|
|
753
686
|
groupCommands.forEach((groupCommand) => {
|
|
754
687
|
groupCommand.memberSubCommands.forEach((memberCommand) => {
|
|
755
688
|
const memberName = `${groupCommand.name}:${memberCommand.name}`;
|
|
756
|
-
levenCommandArray.push([
|
|
757
|
-
distance(memberName, commandName),
|
|
758
|
-
memberName,
|
|
759
|
-
]);
|
|
689
|
+
levenCommandArray.push([distance(memberName, commandName), memberName]);
|
|
760
690
|
});
|
|
761
691
|
});
|
|
762
692
|
return levenCommandArray
|
package/src/util/logger.ts
CHANGED
|
@@ -53,26 +53,22 @@ function wrapDefaultLogger(
|
|
|
53
53
|
return (message, ...optionalParams) => {
|
|
54
54
|
if (message instanceof Function) {
|
|
55
55
|
loggerFunction(
|
|
56
|
-
`${levelPadding} [${loggerName}]${
|
|
57
|
-
LOGGER_NAME_PADDINGS[loggerName]
|
|
58
|
-
} ${message()}`,
|
|
56
|
+
`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${message()}`,
|
|
59
57
|
...optionalParams,
|
|
60
58
|
);
|
|
61
59
|
return;
|
|
62
60
|
}
|
|
63
61
|
if (message instanceof Object) {
|
|
64
62
|
loggerFunction(
|
|
65
|
-
`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${
|
|
66
|
-
|
|
67
|
-
}`,
|
|
63
|
+
`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${JSON.stringify(
|
|
64
|
+
message,
|
|
65
|
+
)}`,
|
|
68
66
|
...optionalParams,
|
|
69
67
|
);
|
|
70
68
|
return;
|
|
71
69
|
}
|
|
72
70
|
loggerFunction(
|
|
73
|
-
`${levelPadding} [${loggerName}]${
|
|
74
|
-
LOGGER_NAME_PADDINGS[loggerName]
|
|
75
|
-
} ${message}`,
|
|
71
|
+
`${levelPadding} [${loggerName}]${LOGGER_NAME_PADDINGS[loggerName]} ${message}`,
|
|
76
72
|
...optionalParams,
|
|
77
73
|
);
|
|
78
74
|
};
|
|
@@ -101,38 +97,16 @@ export default function getLogger(loggerName: string): Logger {
|
|
|
101
97
|
|
|
102
98
|
LOGGER_NAME_PADDINGS[loggerName] = "";
|
|
103
99
|
} else if (LOGGER_NAME_PADDINGS[loggerName] === undefined) {
|
|
104
|
-
LOGGER_NAME_PADDINGS[loggerName] = " ".repeat(
|
|
105
|
-
maxLoggerNameLength - loggerName.length,
|
|
106
|
-
);
|
|
100
|
+
LOGGER_NAME_PADDINGS[loggerName] = " ".repeat(maxLoggerNameLength - loggerName.length);
|
|
107
101
|
}
|
|
108
102
|
|
|
109
103
|
if (debugEnabled) {
|
|
110
104
|
return {
|
|
111
|
-
trace: wrapDefaultLogger(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
),
|
|
116
|
-
debug: wrapDefaultLogger(
|
|
117
|
-
loggerName,
|
|
118
|
-
LEVEL_PADDINGS.DEBUG!,
|
|
119
|
-
defaultLogger.debug,
|
|
120
|
-
),
|
|
121
|
-
info: wrapDefaultLogger(
|
|
122
|
-
loggerName,
|
|
123
|
-
LEVEL_PADDINGS.INFO!,
|
|
124
|
-
defaultLogger.info,
|
|
125
|
-
),
|
|
126
|
-
warn: wrapDefaultLogger(
|
|
127
|
-
loggerName,
|
|
128
|
-
LEVEL_PADDINGS.WARN!,
|
|
129
|
-
defaultLogger.warn,
|
|
130
|
-
),
|
|
131
|
-
error: wrapDefaultLogger(
|
|
132
|
-
loggerName,
|
|
133
|
-
LEVEL_PADDINGS.ERROR!,
|
|
134
|
-
defaultLogger.error,
|
|
135
|
-
),
|
|
105
|
+
trace: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.TRACE!, defaultLogger.trace),
|
|
106
|
+
debug: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.DEBUG!, defaultLogger.debug),
|
|
107
|
+
info: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.INFO!, defaultLogger.info),
|
|
108
|
+
warn: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.WARN!, defaultLogger.warn),
|
|
109
|
+
error: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.ERROR!, defaultLogger.error),
|
|
136
110
|
};
|
|
137
111
|
}
|
|
138
112
|
return {
|
|
@@ -140,10 +114,6 @@ export default function getLogger(loggerName: string): Logger {
|
|
|
140
114
|
debug: () => {},
|
|
141
115
|
info: () => {},
|
|
142
116
|
warn: () => {},
|
|
143
|
-
error: wrapDefaultLogger(
|
|
144
|
-
loggerName,
|
|
145
|
-
LEVEL_PADDINGS.ERROR!,
|
|
146
|
-
defaultLogger.error,
|
|
147
|
-
),
|
|
117
|
+
error: wrapDefaultLogger(loggerName, LEVEL_PADDINGS.ERROR!, defaultLogger.error),
|
|
148
118
|
};
|
|
149
119
|
}
|