@flowscripter/dynamic-cli-framework 1.2.1 → 1.3.0
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
|
@@ -56,14 +56,9 @@ describe("runner tests", () => {
|
|
|
56
56
|
let modifierHasRun = false;
|
|
57
57
|
let subHasRun = false;
|
|
58
58
|
|
|
59
|
-
const globalModifierCommand = getGlobalModifierCommandWithArgument(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
1,
|
|
63
|
-
{
|
|
64
|
-
type: ArgumentValueTypeName.STRING,
|
|
65
|
-
},
|
|
66
|
-
);
|
|
59
|
+
const globalModifierCommand = getGlobalModifierCommandWithArgument("modifierCommand", "c", 1, {
|
|
60
|
+
type: ArgumentValueTypeName.STRING,
|
|
61
|
+
});
|
|
67
62
|
const subCommand = getSubCommand("subCommand", [], []);
|
|
68
63
|
|
|
69
64
|
globalModifierCommand.execute = (): Promise<void> => {
|
|
@@ -75,10 +70,7 @@ describe("runner tests", () => {
|
|
|
75
70
|
return Promise.resolve();
|
|
76
71
|
};
|
|
77
72
|
|
|
78
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
79
|
-
globalModifierCommand,
|
|
80
|
-
subCommand,
|
|
81
|
-
]);
|
|
73
|
+
const commandRegistry = new DefaultCommandRegistry([globalModifierCommand, subCommand]);
|
|
82
74
|
let runResult = await run(
|
|
83
75
|
["--modifierCommand=bar", "subCommand"],
|
|
84
76
|
commandRegistry,
|
|
@@ -191,14 +183,9 @@ describe("runner tests", () => {
|
|
|
191
183
|
let modifierHasRun = false;
|
|
192
184
|
let subHasRun = false;
|
|
193
185
|
|
|
194
|
-
const modifierCommand = getGlobalModifierCommandWithArgument(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
1,
|
|
198
|
-
{
|
|
199
|
-
type: ArgumentValueTypeName.STRING,
|
|
200
|
-
},
|
|
201
|
-
);
|
|
186
|
+
const modifierCommand = getGlobalModifierCommandWithArgument("modifier", "m", 1, {
|
|
187
|
+
type: ArgumentValueTypeName.STRING,
|
|
188
|
+
});
|
|
202
189
|
const option = {
|
|
203
190
|
name: "foo",
|
|
204
191
|
type: ArgumentValueTypeName.STRING,
|
|
@@ -215,10 +202,7 @@ describe("runner tests", () => {
|
|
|
215
202
|
return Promise.resolve();
|
|
216
203
|
};
|
|
217
204
|
|
|
218
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
219
|
-
modifierCommand,
|
|
220
|
-
subCommand,
|
|
221
|
-
]);
|
|
205
|
+
const commandRegistry = new DefaultCommandRegistry([modifierCommand, subCommand]);
|
|
222
206
|
const runResult = await run(
|
|
223
207
|
["--modifier=bar", "command", "--foo", "bar"],
|
|
224
208
|
commandRegistry,
|
|
@@ -236,14 +220,9 @@ describe("runner tests", () => {
|
|
|
236
220
|
let modifierHasRun = false;
|
|
237
221
|
let globalHasRun = false;
|
|
238
222
|
|
|
239
|
-
const modifierCommand = getGlobalModifierCommandWithArgument(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
1,
|
|
243
|
-
{
|
|
244
|
-
type: ArgumentValueTypeName.STRING,
|
|
245
|
-
},
|
|
246
|
-
);
|
|
223
|
+
const modifierCommand = getGlobalModifierCommandWithArgument("modifier", "m", 1, {
|
|
224
|
+
type: ArgumentValueTypeName.STRING,
|
|
225
|
+
});
|
|
247
226
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g", {
|
|
248
227
|
type: ArgumentValueTypeName.STRING,
|
|
249
228
|
});
|
|
@@ -257,10 +236,7 @@ describe("runner tests", () => {
|
|
|
257
236
|
return Promise.resolve();
|
|
258
237
|
};
|
|
259
238
|
|
|
260
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
261
|
-
modifierCommand,
|
|
262
|
-
globalCommand,
|
|
263
|
-
]);
|
|
239
|
+
const commandRegistry = new DefaultCommandRegistry([modifierCommand, globalCommand]);
|
|
264
240
|
const runResult = await run(
|
|
265
241
|
["--modifier=bar", "-g", "bar"],
|
|
266
242
|
commandRegistry,
|
|
@@ -279,22 +255,12 @@ describe("runner tests", () => {
|
|
|
279
255
|
let modifier2HasRun = false;
|
|
280
256
|
let globalHasRun = false;
|
|
281
257
|
|
|
282
|
-
const modifierCommand1 = getGlobalModifierCommandWithArgument(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
},
|
|
289
|
-
);
|
|
290
|
-
const modifierCommand2 = getGlobalModifierCommandWithArgument(
|
|
291
|
-
"modifier2",
|
|
292
|
-
"n",
|
|
293
|
-
2,
|
|
294
|
-
{
|
|
295
|
-
type: ArgumentValueTypeName.STRING,
|
|
296
|
-
},
|
|
297
|
-
);
|
|
258
|
+
const modifierCommand1 = getGlobalModifierCommandWithArgument("modifier1", "m", 1, {
|
|
259
|
+
type: ArgumentValueTypeName.STRING,
|
|
260
|
+
});
|
|
261
|
+
const modifierCommand2 = getGlobalModifierCommandWithArgument("modifier2", "n", 2, {
|
|
262
|
+
type: ArgumentValueTypeName.STRING,
|
|
263
|
+
});
|
|
298
264
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g", {
|
|
299
265
|
type: ArgumentValueTypeName.STRING,
|
|
300
266
|
});
|
|
@@ -337,22 +303,12 @@ describe("runner tests", () => {
|
|
|
337
303
|
let groupHasRun = false;
|
|
338
304
|
let subHasRun = false;
|
|
339
305
|
|
|
340
|
-
const modifierCommand1 = getGlobalModifierCommandWithArgument(
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
},
|
|
347
|
-
);
|
|
348
|
-
const modifierCommand2 = getGlobalModifierCommandWithArgument(
|
|
349
|
-
"modifier2",
|
|
350
|
-
"n",
|
|
351
|
-
2,
|
|
352
|
-
{
|
|
353
|
-
type: ArgumentValueTypeName.STRING,
|
|
354
|
-
},
|
|
355
|
-
);
|
|
306
|
+
const modifierCommand1 = getGlobalModifierCommandWithArgument("modifier1", "m", 1, {
|
|
307
|
+
type: ArgumentValueTypeName.STRING,
|
|
308
|
+
});
|
|
309
|
+
const modifierCommand2 = getGlobalModifierCommandWithArgument("modifier2", "n", 2, {
|
|
310
|
+
type: ArgumentValueTypeName.STRING,
|
|
311
|
+
});
|
|
356
312
|
const subCommand = getSubCommandWithOption("subCommand", true);
|
|
357
313
|
const groupCommand = getGroupCommand("group", [subCommand]);
|
|
358
314
|
|
|
@@ -382,14 +338,7 @@ describe("runner tests", () => {
|
|
|
382
338
|
groupCommand,
|
|
383
339
|
]);
|
|
384
340
|
const runResult = await run(
|
|
385
|
-
[
|
|
386
|
-
"--modifier1=bar1",
|
|
387
|
-
"group",
|
|
388
|
-
"subCommand",
|
|
389
|
-
"--foo",
|
|
390
|
-
"subfoo",
|
|
391
|
-
"--modifier2=bar2",
|
|
392
|
-
],
|
|
341
|
+
["--modifier1=bar1", "group", "subCommand", "--foo", "subfoo", "--modifier2=bar2"],
|
|
393
342
|
commandRegistry,
|
|
394
343
|
getServiceProviderRegistry(),
|
|
395
344
|
undefined,
|
|
@@ -407,14 +356,9 @@ describe("runner tests", () => {
|
|
|
407
356
|
let modifierHasRun = false;
|
|
408
357
|
let defaultHasRun = false;
|
|
409
358
|
|
|
410
|
-
const modifierCommand = getGlobalModifierCommandWithArgument(
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
1,
|
|
414
|
-
{
|
|
415
|
-
type: ArgumentValueTypeName.STRING,
|
|
416
|
-
},
|
|
417
|
-
);
|
|
359
|
+
const modifierCommand = getGlobalModifierCommandWithArgument("modifier", "m", 1, {
|
|
360
|
+
type: ArgumentValueTypeName.STRING,
|
|
361
|
+
});
|
|
418
362
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g");
|
|
419
363
|
|
|
420
364
|
modifierCommand.execute = (): Promise<void> => {
|
|
@@ -426,10 +370,7 @@ describe("runner tests", () => {
|
|
|
426
370
|
return Promise.resolve();
|
|
427
371
|
};
|
|
428
372
|
|
|
429
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
430
|
-
modifierCommand,
|
|
431
|
-
globalCommand,
|
|
432
|
-
]);
|
|
373
|
+
const commandRegistry = new DefaultCommandRegistry([modifierCommand, globalCommand]);
|
|
433
374
|
const runResult = await run(
|
|
434
375
|
["--modifier=bar"],
|
|
435
376
|
commandRegistry,
|
|
@@ -450,14 +391,9 @@ describe("runner tests", () => {
|
|
|
450
391
|
let modifierHasRun = false;
|
|
451
392
|
let defaultHasRun = false;
|
|
452
393
|
|
|
453
|
-
const modifierCommand = getGlobalModifierCommandWithArgument(
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
1,
|
|
457
|
-
{
|
|
458
|
-
type: ArgumentValueTypeName.STRING,
|
|
459
|
-
},
|
|
460
|
-
);
|
|
394
|
+
const modifierCommand = getGlobalModifierCommandWithArgument("modifier", "m", 1, {
|
|
395
|
+
type: ArgumentValueTypeName.STRING,
|
|
396
|
+
});
|
|
461
397
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g");
|
|
462
398
|
|
|
463
399
|
modifierCommand.execute = (): Promise<void> => {
|
|
@@ -469,10 +405,7 @@ describe("runner tests", () => {
|
|
|
469
405
|
return Promise.resolve();
|
|
470
406
|
};
|
|
471
407
|
|
|
472
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
473
|
-
modifierCommand,
|
|
474
|
-
globalCommand,
|
|
475
|
-
]);
|
|
408
|
+
const commandRegistry = new DefaultCommandRegistry([modifierCommand, globalCommand]);
|
|
476
409
|
const runResult = await run(
|
|
477
410
|
["--modifier"],
|
|
478
411
|
commandRegistry,
|
|
@@ -569,11 +502,7 @@ describe("runner tests", () => {
|
|
|
569
502
|
|
|
570
503
|
let globalHasRun = false;
|
|
571
504
|
|
|
572
|
-
const globalModifierCommand = getGlobalModifierCommandWithArgument(
|
|
573
|
-
"modifier",
|
|
574
|
-
"m",
|
|
575
|
-
1,
|
|
576
|
-
);
|
|
505
|
+
const globalModifierCommand = getGlobalModifierCommandWithArgument("modifier", "m", 1);
|
|
577
506
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g");
|
|
578
507
|
|
|
579
508
|
globalModifierCommand.execute = (): Promise<void> => {
|
|
@@ -584,10 +513,7 @@ describe("runner tests", () => {
|
|
|
584
513
|
return Promise.resolve();
|
|
585
514
|
};
|
|
586
515
|
|
|
587
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
588
|
-
globalCommand,
|
|
589
|
-
globalModifierCommand,
|
|
590
|
-
]);
|
|
516
|
+
const commandRegistry = new DefaultCommandRegistry([globalCommand, globalModifierCommand]);
|
|
591
517
|
const runResult = await run(
|
|
592
518
|
["--global", "--modifier"],
|
|
593
519
|
commandRegistry,
|
|
@@ -627,10 +553,7 @@ describe("runner tests", () => {
|
|
|
627
553
|
);
|
|
628
554
|
|
|
629
555
|
expect(runResult.runState).toEqual(RunState.PARSE_ERROR);
|
|
630
|
-
expectStringIncludes(
|
|
631
|
-
streamString.getString(),
|
|
632
|
-
"-f (missing value)",
|
|
633
|
-
);
|
|
556
|
+
expectStringIncludes(streamString.getString(), "-f (missing value)");
|
|
634
557
|
expect(hasRun).toBeFalse();
|
|
635
558
|
});
|
|
636
559
|
|
|
@@ -682,10 +605,7 @@ describe("runner tests", () => {
|
|
|
682
605
|
);
|
|
683
606
|
|
|
684
607
|
expect(runResult.runState).toEqual(RunState.NO_COMMAND);
|
|
685
|
-
expectStringIncludes(
|
|
686
|
-
streamString.getString(),
|
|
687
|
-
"No command specified",
|
|
688
|
-
);
|
|
608
|
+
expectStringIncludes(streamString.getString(), "No command specified");
|
|
689
609
|
expect(hasRun).toBeFalse();
|
|
690
610
|
});
|
|
691
611
|
|
|
@@ -714,14 +634,8 @@ describe("runner tests", () => {
|
|
|
714
634
|
);
|
|
715
635
|
|
|
716
636
|
expect(runResult.runState).toEqual(RunState.NO_COMMAND);
|
|
717
|
-
expectStringIncludes(
|
|
718
|
-
|
|
719
|
-
"No command recognised",
|
|
720
|
-
);
|
|
721
|
-
expectStringIncludes(
|
|
722
|
-
streamString.getString(),
|
|
723
|
-
"Possible matches: command\n",
|
|
724
|
-
);
|
|
637
|
+
expectStringIncludes(streamString.getString(), "No command recognised");
|
|
638
|
+
expectStringIncludes(streamString.getString(), "Possible matches: command\n");
|
|
725
639
|
expect(hasRun).toBeFalse();
|
|
726
640
|
});
|
|
727
641
|
|
|
@@ -797,13 +711,20 @@ describe("runner tests", () => {
|
|
|
797
711
|
});
|
|
798
712
|
|
|
799
713
|
test("Run default based on all args", async () => {
|
|
800
|
-
const command = getSubCommand(
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
714
|
+
const command = getSubCommand(
|
|
715
|
+
"command",
|
|
716
|
+
[
|
|
717
|
+
{
|
|
718
|
+
name: "foo",
|
|
719
|
+
type: ArgumentValueTypeName.STRING,
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
name: "goo",
|
|
723
|
+
type: ArgumentValueTypeName.STRING,
|
|
724
|
+
},
|
|
725
|
+
],
|
|
726
|
+
[],
|
|
727
|
+
);
|
|
807
728
|
const runResult = await run(
|
|
808
729
|
["--foo=f", "--goo=g"],
|
|
809
730
|
new DefaultCommandRegistry([]),
|
|
@@ -820,13 +741,16 @@ describe("runner tests", () => {
|
|
|
820
741
|
const streamString = new StreamString();
|
|
821
742
|
const command = getSubCommand(
|
|
822
743
|
"command",
|
|
823
|
-
[
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
744
|
+
[
|
|
745
|
+
{
|
|
746
|
+
name: "foo",
|
|
747
|
+
type: ArgumentValueTypeName.STRING,
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
name: "goo",
|
|
751
|
+
type: ArgumentValueTypeName.STRING,
|
|
752
|
+
},
|
|
753
|
+
],
|
|
830
754
|
[],
|
|
831
755
|
true,
|
|
832
756
|
);
|
|
@@ -837,10 +761,13 @@ describe("runner tests", () => {
|
|
|
837
761
|
getConfigurationServiceProvider(
|
|
838
762
|
90,
|
|
839
763
|
new Map([
|
|
840
|
-
[
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
764
|
+
[
|
|
765
|
+
"command",
|
|
766
|
+
{
|
|
767
|
+
foo: "f",
|
|
768
|
+
goo: "g",
|
|
769
|
+
},
|
|
770
|
+
],
|
|
844
771
|
]),
|
|
845
772
|
),
|
|
846
773
|
getContext(streamString),
|
|
@@ -848,23 +775,23 @@ describe("runner tests", () => {
|
|
|
848
775
|
);
|
|
849
776
|
|
|
850
777
|
expect(runResult.runState).toEqual(RunState.SUCCESS);
|
|
851
|
-
expectStringIncludes(
|
|
852
|
-
streamString.getString(),
|
|
853
|
-
"Unused args: --bip=b --bop=b",
|
|
854
|
-
);
|
|
778
|
+
expectStringIncludes(streamString.getString(), "Unused args: --bip=b --bop=b");
|
|
855
779
|
});
|
|
856
780
|
|
|
857
781
|
test("Run default command based on some args and treating some args as unused", async () => {
|
|
858
782
|
const streamString = new StreamString();
|
|
859
783
|
const command = getSubCommand(
|
|
860
784
|
"command",
|
|
861
|
-
[
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
785
|
+
[
|
|
786
|
+
{
|
|
787
|
+
name: "foo",
|
|
788
|
+
type: ArgumentValueTypeName.STRING,
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
name: "goo",
|
|
792
|
+
type: ArgumentValueTypeName.STRING,
|
|
793
|
+
},
|
|
794
|
+
],
|
|
868
795
|
[],
|
|
869
796
|
true,
|
|
870
797
|
);
|
|
@@ -876,9 +803,12 @@ describe("runner tests", () => {
|
|
|
876
803
|
getConfigurationServiceProvider(
|
|
877
804
|
90,
|
|
878
805
|
new Map([
|
|
879
|
-
[
|
|
880
|
-
|
|
881
|
-
|
|
806
|
+
[
|
|
807
|
+
"command",
|
|
808
|
+
{
|
|
809
|
+
foo: "f",
|
|
810
|
+
},
|
|
811
|
+
],
|
|
882
812
|
]),
|
|
883
813
|
),
|
|
884
814
|
getContext(streamString),
|
|
@@ -886,21 +816,25 @@ describe("runner tests", () => {
|
|
|
886
816
|
);
|
|
887
817
|
|
|
888
818
|
expect(runResult.runState).toEqual(RunState.SUCCESS);
|
|
889
|
-
expectStringIncludes(
|
|
890
|
-
streamString.getString(),
|
|
891
|
-
"Unused arg: --bip=b",
|
|
892
|
-
);
|
|
819
|
+
expectStringIncludes(streamString.getString(), "Unused arg: --bip=b");
|
|
893
820
|
});
|
|
894
821
|
|
|
895
822
|
test("Fail to parse default command with some unused args and missing required values", async () => {
|
|
896
823
|
const streamString = new StreamString();
|
|
897
|
-
const command = getSubCommand(
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
824
|
+
const command = getSubCommand(
|
|
825
|
+
"command",
|
|
826
|
+
[
|
|
827
|
+
{
|
|
828
|
+
name: "foo",
|
|
829
|
+
type: ArgumentValueTypeName.STRING,
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
name: "goo",
|
|
833
|
+
type: ArgumentValueTypeName.STRING,
|
|
834
|
+
},
|
|
835
|
+
],
|
|
836
|
+
[],
|
|
837
|
+
);
|
|
904
838
|
|
|
905
839
|
const runResult = await run(
|
|
906
840
|
["--bip=b", "--goo=g"],
|
|
@@ -916,14 +850,21 @@ describe("runner tests", () => {
|
|
|
916
850
|
|
|
917
851
|
test("Fail to parse default command with some unused args", async () => {
|
|
918
852
|
const streamString = new StreamString();
|
|
919
|
-
const command = getSubCommand(
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
853
|
+
const command = getSubCommand(
|
|
854
|
+
"command",
|
|
855
|
+
[
|
|
856
|
+
{
|
|
857
|
+
name: "foo",
|
|
858
|
+
type: ArgumentValueTypeName.STRING,
|
|
859
|
+
isOptional: true,
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
name: "goo",
|
|
863
|
+
type: ArgumentValueTypeName.STRING,
|
|
864
|
+
},
|
|
865
|
+
],
|
|
866
|
+
[],
|
|
867
|
+
);
|
|
927
868
|
|
|
928
869
|
const runResult = await run(
|
|
929
870
|
["--bip=b", "--goo=g"],
|
|
@@ -953,10 +894,7 @@ describe("runner tests", () => {
|
|
|
953
894
|
};
|
|
954
895
|
|
|
955
896
|
const subCommand2 = getSubCommand("command2", [], []);
|
|
956
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
957
|
-
subCommand1,
|
|
958
|
-
subCommand2,
|
|
959
|
-
]);
|
|
897
|
+
const commandRegistry = new DefaultCommandRegistry([subCommand1, subCommand2]);
|
|
960
898
|
const runResult = await run(
|
|
961
899
|
["command1", "--foo", "bar", "command2"],
|
|
962
900
|
commandRegistry,
|
|
@@ -966,31 +904,18 @@ describe("runner tests", () => {
|
|
|
966
904
|
);
|
|
967
905
|
|
|
968
906
|
expect(runResult.runState).toEqual(RunState.SUCCESS);
|
|
969
|
-
expectStringIncludes(
|
|
970
|
-
streamString.getString(),
|
|
971
|
-
"Unused arg: command2",
|
|
972
|
-
);
|
|
907
|
+
expectStringIncludes(streamString.getString(), "Unused arg: command2");
|
|
973
908
|
expect(hasRun).toBeTrue();
|
|
974
909
|
});
|
|
975
910
|
|
|
976
911
|
test("Ensure global modifier and global run priority order", async () => {
|
|
977
912
|
const hasRun: string[] = [];
|
|
978
|
-
const modifier1Command = getGlobalModifierCommandWithArgument(
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
},
|
|
985
|
-
);
|
|
986
|
-
const modifier2Command = getGlobalModifierCommandWithArgument(
|
|
987
|
-
"modifier2",
|
|
988
|
-
"2",
|
|
989
|
-
1,
|
|
990
|
-
{
|
|
991
|
-
type: ArgumentValueTypeName.STRING,
|
|
992
|
-
},
|
|
993
|
-
);
|
|
913
|
+
const modifier1Command = getGlobalModifierCommandWithArgument("modifier1", "1", 2, {
|
|
914
|
+
type: ArgumentValueTypeName.STRING,
|
|
915
|
+
});
|
|
916
|
+
const modifier2Command = getGlobalModifierCommandWithArgument("modifier2", "2", 1, {
|
|
917
|
+
type: ArgumentValueTypeName.STRING,
|
|
918
|
+
});
|
|
994
919
|
const globalCommand = getGlobalCommandWithShortAlias("global", "g", {
|
|
995
920
|
type: ArgumentValueTypeName.STRING,
|
|
996
921
|
});
|
|
@@ -1071,41 +996,52 @@ describe("runner tests", () => {
|
|
|
1071
996
|
|
|
1072
997
|
test("Sub-Command run with complex options and explicit arrays", async () => {
|
|
1073
998
|
let hasRun = false;
|
|
1074
|
-
const options = [
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
isArray: true,
|
|
1079
|
-
properties: [{
|
|
1080
|
-
name: "beta",
|
|
1081
|
-
shortAlias: "b",
|
|
999
|
+
const options = [
|
|
1000
|
+
{
|
|
1001
|
+
name: "alpha",
|
|
1002
|
+
shortAlias: "a",
|
|
1082
1003
|
type: ComplexValueTypeName.COMPLEX,
|
|
1083
1004
|
isArray: true,
|
|
1084
|
-
properties: [
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1005
|
+
properties: [
|
|
1006
|
+
{
|
|
1007
|
+
name: "beta",
|
|
1008
|
+
shortAlias: "b",
|
|
1009
|
+
type: ComplexValueTypeName.COMPLEX,
|
|
1010
|
+
isArray: true,
|
|
1011
|
+
properties: [
|
|
1012
|
+
{
|
|
1013
|
+
name: "gamma",
|
|
1014
|
+
shortAlias: "g",
|
|
1015
|
+
type: ArgumentValueTypeName.STRING,
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
name: "delta",
|
|
1019
|
+
shortAlias: "d",
|
|
1020
|
+
type: ArgumentValueTypeName.NUMBER,
|
|
1021
|
+
isArray: true,
|
|
1022
|
+
},
|
|
1023
|
+
],
|
|
1024
|
+
},
|
|
1025
|
+
],
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
name: "epsilon",
|
|
1029
|
+
shortAlias: "e",
|
|
1030
|
+
type: ComplexValueTypeName.COMPLEX,
|
|
1031
|
+
properties: [
|
|
1032
|
+
{
|
|
1033
|
+
name: "gamma",
|
|
1034
|
+
shortAlias: "g",
|
|
1035
|
+
type: ArgumentValueTypeName.STRING,
|
|
1036
|
+
},
|
|
1037
|
+
{
|
|
1038
|
+
name: "delta",
|
|
1039
|
+
shortAlias: "d",
|
|
1040
|
+
type: ArgumentValueTypeName.NUMBER,
|
|
1041
|
+
},
|
|
1042
|
+
],
|
|
1043
|
+
},
|
|
1044
|
+
];
|
|
1109
1045
|
const command = getSubCommand("command", options, []);
|
|
1110
1046
|
|
|
1111
1047
|
command.execute = (): Promise<void> => {
|
|
@@ -1138,50 +1074,64 @@ describe("runner tests", () => {
|
|
|
1138
1074
|
|
|
1139
1075
|
test("Sub-Command run with complex options and positionals", async () => {
|
|
1140
1076
|
let hasRun = false;
|
|
1141
|
-
const options = [
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
isArray: true,
|
|
1146
|
-
properties: [{
|
|
1147
|
-
name: "beta",
|
|
1148
|
-
shortAlias: "b",
|
|
1077
|
+
const options = [
|
|
1078
|
+
{
|
|
1079
|
+
name: "alpha",
|
|
1080
|
+
shortAlias: "a",
|
|
1149
1081
|
type: ComplexValueTypeName.COMPLEX,
|
|
1150
1082
|
isArray: true,
|
|
1151
|
-
properties: [
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1083
|
+
properties: [
|
|
1084
|
+
{
|
|
1085
|
+
name: "beta",
|
|
1086
|
+
shortAlias: "b",
|
|
1087
|
+
type: ComplexValueTypeName.COMPLEX,
|
|
1088
|
+
isArray: true,
|
|
1089
|
+
properties: [
|
|
1090
|
+
{
|
|
1091
|
+
name: "gamma",
|
|
1092
|
+
shortAlias: "g",
|
|
1093
|
+
type: ArgumentValueTypeName.STRING,
|
|
1094
|
+
},
|
|
1095
|
+
{
|
|
1096
|
+
name: "delta",
|
|
1097
|
+
shortAlias: "d",
|
|
1098
|
+
type: ArgumentValueTypeName.NUMBER,
|
|
1099
|
+
isArray: true,
|
|
1100
|
+
},
|
|
1101
|
+
],
|
|
1102
|
+
},
|
|
1103
|
+
],
|
|
1104
|
+
},
|
|
1105
|
+
{
|
|
1106
|
+
name: "epsilon",
|
|
1107
|
+
shortAlias: "e",
|
|
1108
|
+
type: ComplexValueTypeName.COMPLEX,
|
|
1109
|
+
properties: [
|
|
1110
|
+
{
|
|
1111
|
+
name: "gamma",
|
|
1112
|
+
shortAlias: "g",
|
|
1113
|
+
type: ArgumentValueTypeName.STRING,
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
name: "delta",
|
|
1117
|
+
shortAlias: "d",
|
|
1118
|
+
type: ArgumentValueTypeName.NUMBER,
|
|
1119
|
+
},
|
|
1120
|
+
],
|
|
1121
|
+
},
|
|
1122
|
+
];
|
|
1123
|
+
const positionals = [
|
|
1124
|
+
{
|
|
1125
|
+
name: "foo",
|
|
1169
1126
|
type: ArgumentValueTypeName.STRING,
|
|
1170
|
-
},
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
type: ArgumentValueTypeName.
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
type: ArgumentValueTypeName.STRING,
|
|
1179
|
-
}, {
|
|
1180
|
-
name: "bar",
|
|
1181
|
-
type: ArgumentValueTypeName.INTEGER,
|
|
1182
|
-
isVarargMultiple: true,
|
|
1183
|
-
isVarargOptional: true,
|
|
1184
|
-
}];
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
name: "bar",
|
|
1130
|
+
type: ArgumentValueTypeName.INTEGER,
|
|
1131
|
+
isVarargMultiple: true,
|
|
1132
|
+
isVarargOptional: true,
|
|
1133
|
+
},
|
|
1134
|
+
];
|
|
1185
1135
|
|
|
1186
1136
|
const command = getSubCommand("command", options, positionals);
|
|
1187
1137
|
|
|
@@ -1308,10 +1258,7 @@ describe("runner tests", () => {
|
|
|
1308
1258
|
return Promise.resolve();
|
|
1309
1259
|
};
|
|
1310
1260
|
|
|
1311
|
-
const commandRegistry = new DefaultCommandRegistry([
|
|
1312
|
-
modifierCommand,
|
|
1313
|
-
globalCommand,
|
|
1314
|
-
]);
|
|
1261
|
+
const commandRegistry = new DefaultCommandRegistry([modifierCommand, globalCommand]);
|
|
1315
1262
|
const runResult = await run(
|
|
1316
1263
|
["-g", "bar"],
|
|
1317
1264
|
commandRegistry,
|
|
@@ -1320,9 +1267,12 @@ describe("runner tests", () => {
|
|
|
1320
1267
|
90,
|
|
1321
1268
|
new Map<string, ArgumentValues | ArgumentSingleValueType>([
|
|
1322
1269
|
["modifier", "foo"],
|
|
1323
|
-
[
|
|
1324
|
-
|
|
1325
|
-
|
|
1270
|
+
[
|
|
1271
|
+
"irrelevant",
|
|
1272
|
+
{
|
|
1273
|
+
name: "value",
|
|
1274
|
+
},
|
|
1275
|
+
],
|
|
1326
1276
|
]),
|
|
1327
1277
|
),
|
|
1328
1278
|
getContext(new WritableStreamString()),
|