@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.
Files changed (166) hide show
  1. package/README/core-service-providers.md +2 -2
  2. package/README/development.md +3 -6
  3. package/README/implementation-details.md +17 -17
  4. package/README/key-concepts.md +17 -17
  5. package/README.md +4 -4
  6. package/bun.lock +0 -2
  7. package/index.ts +22 -30
  8. package/package.json +19 -19
  9. package/src/api/argument/Argument.ts +1 -1
  10. package/src/api/argument/ArgumentValueTypes.ts +3 -10
  11. package/src/api/argument/ComplexOption.ts +5 -9
  12. package/src/api/command/GlobalCommand.ts +1 -4
  13. package/src/api/service/core/ArgumentPrompterService.ts +1 -3
  14. package/src/api/service/core/AsciiBannerGeneratorService.ts +1 -4
  15. package/src/api/service/core/CompletionService.ts +2 -6
  16. package/src/api/service/core/ImagePrinterService.ts +1 -2
  17. package/src/api/service/core/KeyValueService.ts +1 -2
  18. package/src/api/service/core/PrettyPrinterService.ts +1 -4
  19. package/src/api/service/core/PrinterService.ts +8 -9
  20. package/src/api/service/core/PrompterService.ts +4 -11
  21. package/src/api/service/core/ShutdownService.ts +1 -2
  22. package/src/api/service/core/SyntaxHighlighterService.ts +1 -5
  23. package/src/api/service/core/Table.ts +7 -25
  24. package/src/api/service/core/TreePrinterService.ts +1 -2
  25. package/src/cli/BaseCLI.ts +17 -47
  26. package/src/cli/DefaultRuntimeCLI.ts +1 -4
  27. package/src/command/CompletionCommand.ts +19 -45
  28. package/src/command/MultiCommandCliHelpCommand.ts +45 -92
  29. package/src/command/SingleCommandCliHelpCommand.ts +17 -28
  30. package/src/command/UsageCommand.ts +6 -12
  31. package/src/command/VersionCommand.ts +2 -6
  32. package/src/launcher.ts +4 -2
  33. package/src/runtime/DefaultContext.ts +2 -5
  34. package/src/runtime/argument/ArgumentTypeGuards.ts +1 -3
  35. package/src/runtime/command/CommandTypeGuards.ts +5 -14
  36. package/src/runtime/command/CommandValidator.ts +56 -118
  37. package/src/runtime/parser.ts +13 -17
  38. package/src/runtime/registry/CommandRegistry.ts +2 -7
  39. package/src/runtime/registry/DefaultCommandRegistry.ts +32 -84
  40. package/src/runtime/registry/DefaultServiceProviderRegistry.ts +3 -9
  41. package/src/runtime/runner.ts +103 -142
  42. package/src/runtime/scanner.ts +28 -46
  43. package/src/runtime/values/ValuePopulationResult.ts +1 -2
  44. package/src/runtime/values/argumentValueMerge.ts +16 -28
  45. package/src/runtime/values/argumentValueValidation.ts +21 -67
  46. package/src/runtime/values/globalCommandValuePopulation.ts +9 -18
  47. package/src/runtime/values/subCommandValuePopulation.ts +42 -65
  48. package/src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts +3 -10
  49. package/src/service/argumentPrompter/DefaultArgumentPrompterService.ts +22 -59
  50. package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +5 -14
  51. package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +59 -77
  52. package/src/service/banner/BannerServiceProvider.ts +13 -35
  53. package/src/service/banner/command/NoBannerCommand.ts +2 -8
  54. package/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts +5 -10
  55. package/src/service/completion/CompletionServiceProvider.ts +20 -48
  56. package/src/service/completion/DefaultCompletionService.ts +17 -56
  57. package/src/service/completion/shell/ShellHandler.ts +1 -3
  58. package/src/service/completion/shell/fish.ts +1 -1
  59. package/src/service/completion/shell/powershell.ts +2 -12
  60. package/src/service/completion/shell/zsh.ts +1 -1
  61. package/src/service/configuration/ConfigurationServiceProvider.ts +40 -133
  62. package/src/service/configuration/DefaultKeyValueService.ts +6 -20
  63. package/src/service/configuration/DefaultSecretService.ts +10 -14
  64. package/src/service/configuration/command/ConfigCommand.ts +1 -4
  65. package/src/service/configuration/command/DumpConfigCommand.ts +9 -21
  66. package/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts +5 -14
  67. package/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts +5 -12
  68. package/src/service/imagePrinter/DefaultImagePrinterService.ts +1 -5
  69. package/src/service/imagePrinter/ImagePrinterServiceProvider.ts +1 -4
  70. package/src/service/prettyPrinter/DefaultPrettyPrinterService.ts +4 -12
  71. package/src/service/prettyPrinter/PrettyPrinterServiceProvider.ts +3 -10
  72. package/src/service/printer/DefaultPrinterService.ts +20 -83
  73. package/src/service/printer/PrinterServiceProvider.ts +3 -11
  74. package/src/service/printer/command/DarkModeCommand.ts +3 -10
  75. package/src/service/printer/command/LogLevelCommand.ts +7 -26
  76. package/src/service/printer/command/NoColorCommand.ts +3 -10
  77. package/src/service/printer/command/NoHyperlinksCommand.ts +3 -10
  78. package/src/service/printer/terminal/Progress.ts +99 -90
  79. package/src/service/printer/terminal/Spinner.ts +7 -26
  80. package/src/service/prompter/DefaultPrompterService.ts +2 -6
  81. package/src/service/prompter/PrompterServiceProvider.ts +3 -11
  82. package/src/service/prompter/command/NoPromptCommand.ts +3 -10
  83. package/src/service/prompter/prompt/PromptContext.ts +5 -18
  84. package/src/service/prompter/prompt/promptMultiSelect.ts +6 -21
  85. package/src/service/prompter/prompt/promptOpenUrl.ts +7 -22
  86. package/src/service/prompter/prompt/promptSingleSelect.ts +6 -23
  87. package/src/service/prompter/prompt/promptText.ts +10 -27
  88. package/src/service/prompter/prompt/promptToggle.ts +8 -8
  89. package/src/service/shutdown/ShutdownServiceProvider.ts +3 -10
  90. package/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.ts +13 -26
  91. package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +8 -21
  92. package/src/service/tableGenerator/DefaultTableGeneratorService.ts +44 -68
  93. package/src/service/tableGenerator/TableGeneratorServiceProvider.ts +7 -16
  94. package/src/service/treePrinter/DefaultTreePrinterService.ts +2 -7
  95. package/src/service/treePrinter/TreePrinterServiceProvider.ts +4 -12
  96. package/src/terminal/ImageRenderer.ts +35 -54
  97. package/src/terminal/PngDecoder.ts +10 -19
  98. package/src/terminal/TtyStyler.ts +11 -9
  99. package/src/terminal/TtyTerminal.ts +2 -10
  100. package/src/terminal/supportsHyperlinks.ts +4 -10
  101. package/src/util/configHelper.ts +3 -10
  102. package/src/util/envVarHelper.ts +50 -88
  103. package/src/util/helpHelper.ts +123 -193
  104. package/src/util/logger.ts +12 -42
  105. package/src/util/runnerHelper.ts +20 -61
  106. package/tests/cli/BaseCLI.test.ts +23 -80
  107. package/tests/command/CompletionCommand.test.ts +1 -6
  108. package/tests/command/MultiCommandCliHelpCommand.test.ts +51 -205
  109. package/tests/command/SingleCommandCliHelpCommand.test.ts +21 -103
  110. package/tests/command/UsageCommand.test.ts +4 -10
  111. package/tests/fixtures/Command.ts +87 -68
  112. package/tests/fixtures/CommandRegistry.ts +1 -3
  113. package/tests/fixtures/Context.ts +3 -11
  114. package/tests/fixtures/ServiceProviderRegistry.ts +1 -1
  115. package/tests/fixtures/prettierPluginFoo.ts +1 -1
  116. package/tests/fixtures/util.ts +2 -8
  117. package/tests/runtime/argument/ArgumentTypeGuards.test.ts +1 -3
  118. package/tests/runtime/command/CommandValidator.test.ts +881 -604
  119. package/tests/runtime/parser.test.ts +222 -246
  120. package/tests/runtime/registry/DefaultCommandRegistry.test.ts +15 -37
  121. package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +2 -8
  122. package/tests/runtime/runner.test.ts +231 -281
  123. package/tests/runtime/scanner.test.ts +277 -475
  124. package/tests/runtime/values/argumentValueMerge.test.ts +133 -81
  125. package/tests/runtime/values/argumentValueValidation.test.ts +444 -588
  126. package/tests/runtime/values/globalCommandValuePopulation.test.ts +71 -253
  127. package/tests/runtime/values/subCommandValuePopulation.test.ts +1342 -1570
  128. package/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.ts +3 -12
  129. package/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.ts +36 -45
  130. package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +2 -8
  131. package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +40 -62
  132. package/tests/service/banner/BannerServiceProvider.test.ts +5 -18
  133. package/tests/service/banner/command/NoBannerCommand.test.ts +1 -4
  134. package/tests/service/completion/CompletionServiceProvider.test.ts +145 -214
  135. package/tests/service/completion/DefaultCompletionService.test.ts +17 -79
  136. package/tests/service/completion/shell/fish.test.ts +1 -3
  137. package/tests/service/configuration/ConfigurationServiceProvider.test.ts +26 -75
  138. package/tests/service/configuration/DefaultKeyValueService.test.ts +9 -21
  139. package/tests/service/configuration/DefaultSecretService.test.ts +7 -15
  140. package/tests/service/configuration/command/DumpConfigCommand.test.ts +4 -13
  141. package/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.ts +6 -12
  142. package/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.ts +1 -10
  143. package/tests/service/imagePrinter/DefaultImagePrinterService.test.ts +5 -70
  144. package/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.ts +4 -11
  145. package/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.ts +2 -6
  146. package/tests/service/printer/DefaultPrinterService.test.ts +57 -255
  147. package/tests/service/printer/PrinterServiceProvider.test.ts +2 -8
  148. package/tests/service/printer/command/DarkModeCommand.test.ts +4 -12
  149. package/tests/service/printer/command/LogLevelCommand.test.ts +4 -17
  150. package/tests/service/printer/command/NoColorCommand.test.ts +4 -12
  151. package/tests/service/printer/command/NoHyperlinksCommand.test.ts +7 -21
  152. package/tests/service/printer/terminal/Progress.test.ts +1 -3
  153. package/tests/service/printer/terminal/Spinner.test.ts +2 -8
  154. package/tests/service/prompter/DefaultPrompterService.test.ts +52 -69
  155. package/tests/service/prompter/PrompterServiceProvider.test.ts +2 -8
  156. package/tests/service/shutdown/ShutdownServiceProvider.test.ts +1 -3
  157. package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +13 -99
  158. package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +2 -7
  159. package/tests/service/tableGenerator/DefaultTableGeneratorService.test.ts +12 -33
  160. package/tests/service/tableGenerator/TableGeneratorServiceProvider.test.ts +2 -2
  161. package/tests/service/treePrinter/DefaultTreePrinterService.test.ts +4 -6
  162. package/tests/service/treePrinter/TreePrinterServiceProvider.test.ts +4 -8
  163. package/tests/terminal/ImageRenderer.test.ts +2 -11
  164. package/tests/terminal/PngDecoder.test.ts +2 -6
  165. package/tests/util/configHelper.test.ts +55 -137
  166. package/tests/util/envVarHelper.test.ts +46 -110
@@ -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 = HELP_SYNTAX_INDENT +
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 = indentText +
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 || (option.defaultValue !== undefined)) {
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
- cliConfig,
330
- includeEnvVars,
331
- command,
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 && (option.type !== ComplexValueTypeName.COMPLEX)) {
394
- const configurationKey = getSubCommandArgumentConfigurationKey(
395
- cliConfig,
396
- command,
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
- (option.shortAlias !== undefined)
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
- cliConfig,
482
- command,
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 ((subCommand.options.length > 0) || (subCommand.positionals.length > 0)) {
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 = ((groupCommands.length > 0) || (subCommands.length > 0))
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((modifier) =>
608
- (modifier.argument !== undefined) &&
609
- !modifier.argument.isOptional &&
610
- (modifier.argument.defaultValue === undefined) &&
611
- modifier.argument.type !== ArgumentValueTypeName.BOOLEAN
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((globalCommand) =>
632
- (globalCommand.argument !== undefined) &&
633
- (((globalCommand.argument.isOptional !== undefined) &&
634
- globalCommand.argument.isOptional) ||
635
- (globalCommand.argument.defaultValue !== undefined))
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((globalCommand) =>
638
- (globalCommand.argument !== undefined) &&
639
- (globalCommand.argument.type === ArgumentValueTypeName.BOOLEAN)
569
+ argValueOptional = globalCommands.some(
570
+ (globalCommand) =>
571
+ globalCommand.argument !== undefined &&
572
+ globalCommand.argument.type === ArgumentValueTypeName.BOOLEAN,
640
573
  );
641
574
  }
642
575
  }
643
- if ((groupCommands.length > 0) || (subCommands.length > 0)) {
576
+ if (groupCommands.length > 0 || subCommands.length > 0) {
644
577
  commandClauses.push("<command>");
645
- arg = arg || groupCommands.some((groupCommand) =>
646
- groupCommand.memberSubCommands.some((memberCommand) =>
647
- memberCommand.options.length > 0 || memberCommand.positionals.length > 0
648
- )
649
- ) ||
650
- subCommands.some((subCommand) =>
651
- subCommand.options.length > 0 || subCommand.positionals.length > 0
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 = argOptional || groupCommands.some((groupCommand) =>
655
- groupCommand.memberSubCommands.some((memberCommand) =>
656
- memberCommand.options.some((option) =>
657
- ((option.isOptional !== undefined) && option.isOptional) ||
658
- (option.defaultValue !== undefined)
659
- ) ||
660
- memberCommand.positionals.some((
661
- positional,
662
- ) => ((positional.isVarargOptional !== undefined) &&
663
- positional.isVarargOptional)
664
- )
665
- )
666
- ) ||
667
- subCommands.some((subCommand) =>
668
- subCommand.options.some((option) =>
669
- ((option.isOptional !== undefined) && option.isOptional) ||
670
- (option.defaultValue !== undefined)
671
- ) ||
672
- subCommand.positionals.some((
673
- positional,
674
- ) => ((positional.isVarargOptional !== undefined) &&
675
- positional.isVarargOptional)
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 = argValueOptional ||
618
+ argValueOptional =
619
+ argValueOptional ||
679
620
  groupCommands.some((groupCommand) =>
680
621
  groupCommand.memberSubCommands.some((memberCommand) =>
681
- memberCommand.options.some((option) =>
682
- option.type === ArgumentValueTypeName.BOOLEAN ||
683
- memberCommand.positionals.some((positional) =>
684
- positional.type === ArgumentValueTypeName.BOOLEAN
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((subCommand) =>
690
- subCommand.options.some((option) =>
691
- option.type ===
692
- ArgumentValueTypeName.BOOLEAN
693
- ) ||
694
- subCommand.positionals.some((positional) =>
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 = multipleArg || groupCommands.some((groupCommand) =>
699
- groupCommand.memberSubCommands.some((memberCommand) =>
700
- memberCommand.options.some((option) =>
701
- option.isArray
702
- ) ||
703
- memberCommand.positionals.some((positional) =>
704
- positional.isVarargMultiple
705
- )
706
- )
707
- ) ||
708
- subCommands.some((subCommand) =>
709
- subCommand.options.some((option) =>
710
- option.isArray
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
- ? ` <${argSyntax}>`
730
- : ` ${argSyntax}`;
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
@@ -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
- JSON.stringify(message)
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
- loggerName,
113
- LEVEL_PADDINGS.TRACE!,
114
- defaultLogger.trace,
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
  }