@flowscripter/dynamic-cli-framework 1.1.6 → 1.2.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.
Files changed (160) hide show
  1. package/.github/workflows/release-bun-library.yml +1 -0
  2. package/README/core-commands.md +40 -0
  3. package/README/core-service-providers.md +198 -0
  4. package/README/development.md +60 -0
  5. package/README/implementation-details.md +474 -0
  6. package/README/key-concepts.md +751 -0
  7. package/README.md +12 -1413
  8. package/bun.lock +20 -18
  9. package/index.ts +97 -1
  10. package/package.json +8 -7
  11. package/src/api/BaseCLIFeatureOptions.ts +10 -0
  12. package/src/api/CLIConfig.ts +5 -0
  13. package/src/api/RunResult.ts +16 -0
  14. package/src/api/argument/Argument.ts +24 -0
  15. package/src/api/service/ServiceProvider.ts +3 -3
  16. package/src/api/service/core/ArgumentPrompterService.ts +10 -0
  17. package/src/api/service/core/AsciiBannerGeneratorService.ts +44 -7
  18. package/src/api/service/core/CompletionService.ts +36 -0
  19. package/src/api/service/core/DataDumpGeneratorService.ts +27 -0
  20. package/src/api/service/core/ImagePrinterService.ts +26 -0
  21. package/src/api/service/core/KeyValueService.ts +22 -5
  22. package/src/api/service/core/PrinterService.ts +127 -1
  23. package/src/api/service/core/PrompterService.ts +49 -0
  24. package/src/api/service/core/SecretService.ts +27 -0
  25. package/src/api/service/core/ShutdownService.ts +17 -1
  26. package/src/api/service/core/Table.ts +85 -0
  27. package/src/api/service/core/TableGeneratorService.ts +38 -0
  28. package/src/api/service/core/TreePrinterService.ts +11 -0
  29. package/src/cli/BaseCLI.ts +116 -44
  30. package/src/cli/DefaultRuntimeCLI.ts +10 -18
  31. package/src/command/CompletionCommand.ts +179 -0
  32. package/src/command/MultiCommandCliHelpCommand.ts +18 -2
  33. package/src/command/SingleCommandCliHelpCommand.ts +10 -1
  34. package/src/launcher.ts +16 -58
  35. package/src/runtime/command/CommandValidator.ts +3 -3
  36. package/src/runtime/runner.ts +102 -30
  37. package/src/runtime/scanner.ts +18 -15
  38. package/src/runtime/values/argumentValueValidation.ts +49 -5
  39. package/src/runtime/values/globalCommandValuePopulation.ts +1 -1
  40. package/src/runtime/values/subCommandValuePopulation.ts +9 -8
  41. package/src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts +34 -0
  42. package/src/service/argumentPrompter/DefaultArgumentPrompterService.ts +330 -0
  43. package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +1 -1
  44. package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +254 -17
  45. package/src/service/banner/BannerServiceProvider.ts +2 -2
  46. package/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts +85 -0
  47. package/src/service/chiselAsciiBannerGenerator/chisel.flf.json +3 -0
  48. package/src/service/completion/CompletionServiceProvider.ts +212 -0
  49. package/src/service/completion/DefaultCompletionService.ts +364 -0
  50. package/src/service/completion/shell/ShellHandler.ts +16 -0
  51. package/src/service/completion/shell/bash.ts +47 -0
  52. package/src/service/completion/shell/fish.ts +43 -0
  53. package/src/service/completion/shell/powershell.ts +66 -0
  54. package/src/service/completion/shell/zsh.ts +50 -0
  55. package/src/service/configuration/ConfigurationServiceProvider.ts +138 -42
  56. package/src/service/configuration/DefaultKeyValueService.ts +53 -7
  57. package/src/service/configuration/DefaultSecretService.ts +85 -0
  58. package/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts +41 -0
  59. package/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts +80 -0
  60. package/src/service/imagePrinter/DefaultImagePrinterService.ts +23 -0
  61. package/src/service/imagePrinter/ImagePrinterServiceProvider.ts +32 -0
  62. package/src/service/prettyPrinter/PrettyPrinterServiceProvider.ts +1 -1
  63. package/src/service/printer/DefaultPrinterService.ts +147 -27
  64. package/src/service/printer/PrinterServiceProvider.ts +7 -7
  65. package/src/service/printer/command/NoHyperlinksCommand.ts +40 -0
  66. package/src/service/printer/terminal/Progress.ts +21 -4
  67. package/src/service/printer/terminal/Spinner.ts +32 -8
  68. package/src/service/printer/terminal/Theme.ts +1 -1
  69. package/src/service/prompter/DefaultPrompterService.ts +87 -0
  70. package/src/service/prompter/PrompterServiceProvider.ts +36 -0
  71. package/src/service/prompter/command/NoPromptCommand.ts +40 -0
  72. package/src/service/prompter/prompt/PromptContext.ts +47 -0
  73. package/src/service/prompter/prompt/promptAcknowledge.ts +28 -0
  74. package/src/service/prompter/prompt/promptMultiSelect.ts +99 -0
  75. package/src/service/prompter/prompt/promptOpenUrl.ts +97 -0
  76. package/src/service/prompter/prompt/promptSingleSelect.ts +102 -0
  77. package/src/service/prompter/prompt/promptText.ts +107 -0
  78. package/src/service/prompter/prompt/promptToggle.ts +28 -0
  79. package/src/service/shutdown/DefaultShutdownService.ts +13 -0
  80. package/src/service/shutdown/ShutdownServiceProvider.ts +28 -9
  81. package/src/service/shutdown/ShutdownState.ts +5 -0
  82. package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +1 -1
  83. package/src/service/tableGenerator/DefaultTableGeneratorService.ts +415 -0
  84. package/src/service/tableGenerator/TableGeneratorServiceProvider.ts +43 -0
  85. package/src/service/treePrinter/DefaultTreePrinterService.ts +49 -0
  86. package/src/service/treePrinter/TreePrinterServiceProvider.ts +40 -0
  87. package/src/terminal/Ansi.ts +27 -0
  88. package/src/terminal/ImageRenderer.ts +199 -0
  89. package/src/terminal/KeyReader.ts +23 -0
  90. package/src/terminal/PngDecoder.ts +143 -0
  91. package/src/{service/printer/terminal → terminal}/Styler.ts +3 -0
  92. package/src/{service/printer/terminal → terminal}/Terminal.ts +1 -0
  93. package/src/terminal/TtyKeyReader.ts +83 -0
  94. package/src/terminal/TtyStyler.ts +78 -0
  95. package/src/{service/printer/terminal → terminal}/TtyTerminal.ts +9 -1
  96. package/src/terminal/supportsHyperlinks.ts +110 -0
  97. package/src/util/configHelper.ts +2 -2
  98. package/src/util/envVarHelper.ts +2 -2
  99. package/src/util/helpHelper.ts +66 -122
  100. package/src/util/logger.ts +16 -14
  101. package/src/util/runnerHelper.ts +1 -1
  102. package/tests/cli/BaseCLI.test.ts +50 -54
  103. package/tests/command/CompletionCommand.test.ts +68 -0
  104. package/tests/command/UsageCommand.test.ts +3 -2
  105. package/tests/command/VersionCommand.test.ts +3 -2
  106. package/tests/fixtures/Context.ts +9 -2
  107. package/tests/fixtures/util.ts +1 -1
  108. package/tests/runtime/parser.test.ts +9 -7
  109. package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +3 -3
  110. package/tests/runtime/values/argumentValueValidation.test.ts +193 -0
  111. package/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.ts +47 -0
  112. package/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.ts +754 -0
  113. package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +5 -4
  114. package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +163 -3
  115. package/tests/service/asciiBannerGenerator/__snapshots__/DefaultAsciiBannerGeneratorService.test.ts.snap +1 -1
  116. package/tests/service/banner/BannerServiceProvider.test.ts +8 -4
  117. package/tests/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.test.ts +52 -0
  118. package/tests/service/completion/CompletionServiceProvider.test.ts +404 -0
  119. package/tests/service/completion/DefaultCompletionService.test.ts +278 -0
  120. package/tests/service/completion/shell/bash.test.ts +73 -0
  121. package/tests/service/completion/shell/fish.test.ts +62 -0
  122. package/tests/service/completion/shell/powershell.test.ts +59 -0
  123. package/tests/service/completion/shell/zsh.test.ts +60 -0
  124. package/tests/service/configuration/ConfigurationServiceProvider.test.ts +24 -12
  125. package/tests/service/configuration/DefaultKeyValueService.test.ts +118 -16
  126. package/tests/service/configuration/DefaultSecretService.test.ts +148 -0
  127. package/tests/service/configuration/command/ConfigCommand.test.ts +29 -0
  128. package/tests/service/configuration/command/DumpConfigCommand.test.ts +60 -0
  129. package/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.ts +57 -0
  130. package/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.ts +217 -0
  131. package/tests/service/imagePrinter/DefaultImagePrinterService.test.ts +96 -0
  132. package/tests/service/imagePrinter/ImagePrinterServiceProvider.test.ts +17 -0
  133. package/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.ts +2 -2
  134. package/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.ts +5 -4
  135. package/tests/service/printer/DefaultPrinterService.test.ts +233 -2
  136. package/tests/service/printer/PrinterServiceProvider.test.ts +6 -5
  137. package/tests/service/printer/command/DarkModeCommand.test.ts +83 -0
  138. package/tests/service/printer/command/LogLevelCommand.test.ts +7 -5
  139. package/tests/service/printer/command/NoColorCommand.test.ts +83 -0
  140. package/tests/service/printer/command/NoHyperlinksCommand.test.ts +89 -0
  141. package/tests/service/printer/terminal/Progress.test.ts +64 -4
  142. package/tests/service/printer/terminal/Spinner.test.ts +44 -3
  143. package/tests/service/prompter/DefaultPrompterService.test.ts +615 -0
  144. package/tests/service/prompter/PrompterServiceProvider.test.ts +47 -0
  145. package/tests/service/prompter/command/NoPromptCommand.test.ts +58 -0
  146. package/tests/service/shutdown/ShutdownServiceProvider.test.ts +4 -2
  147. package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +3 -2
  148. package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +5 -4
  149. package/tests/service/tableGenerator/DefaultTableGeneratorService.test.ts +363 -0
  150. package/tests/service/tableGenerator/TableGeneratorServiceProvider.test.ts +47 -0
  151. package/tests/service/treePrinter/DefaultTreePrinterService.test.ts +144 -0
  152. package/tests/service/treePrinter/TreePrinterServiceProvider.test.ts +55 -0
  153. package/tests/terminal/ImageRenderer.test.ts +161 -0
  154. package/tests/terminal/PngDecoder.test.ts +223 -0
  155. package/tests/terminal/supportsHyperlinks.test.ts +149 -0
  156. package/tests/util/configHelper.test.ts +4 -4
  157. package/tests/util/logger.test.ts +23 -1
  158. package/tsconfig.json +31 -0
  159. package/src/service/printer/terminal/Ansi.ts +0 -10
  160. package/src/service/printer/terminal/TtyStyler.ts +0 -39
@@ -8,8 +8,8 @@ import {
8
8
  } from "../../fixtures/util.ts";
9
9
  import DefaultPrinterService from "../../../src/service/printer/DefaultPrinterService.ts";
10
10
  import { Icon, Level } from "../../../src/api/service/core/PrinterService.ts";
11
- import TtyTerminal from "../../../src/service/printer/terminal/TtyTerminal.ts";
12
- import TtyStyler from "../../../src/service/printer/terminal/TtyStyler.ts";
11
+ import TtyTerminal from "../../../src/terminal/TtyTerminal.ts";
12
+ import TtyStyler from "../../../src/terminal/TtyStyler.ts";
13
13
  import StreamString from "../../fixtures/StreamString.ts";
14
14
 
15
15
  describe("DefaultPrinterService tests", () => {
@@ -21,6 +21,7 @@ describe("DefaultPrinterService tests", () => {
21
21
  dummyStderr.writableStream,
22
22
  true,
23
23
  true,
24
+ new TtyTerminal(dummyStdout.writeStream),
24
25
  new TtyTerminal(dummyStderr.writeStream),
25
26
  new TtyStyler(3),
26
27
  );
@@ -39,6 +40,7 @@ describe("DefaultPrinterService tests", () => {
39
40
  dummyStderr.writableStream,
40
41
  true,
41
42
  true,
43
+ new TtyTerminal(dummyStdout.writeStream),
42
44
  new TtyTerminal(dummyStderr.writeStream),
43
45
  new TtyStyler(3),
44
46
  );
@@ -118,6 +120,7 @@ describe("DefaultPrinterService tests", () => {
118
120
  dummyStderr.writableStream,
119
121
  true,
120
122
  true,
123
+ new TtyTerminal(dummyStdout.writeStream),
121
124
  new TtyTerminal(dummyStderr.writeStream),
122
125
  new TtyStyler(3),
123
126
  );
@@ -185,6 +188,7 @@ describe("DefaultPrinterService tests", () => {
185
188
  dummyStderr.writableStream,
186
189
  true,
187
190
  true,
191
+ new TtyTerminal(dummyStdout.writeStream),
188
192
  new TtyTerminal(dummyStderr.writeStream),
189
193
  new TtyStyler(3),
190
194
  );
@@ -206,6 +210,7 @@ describe("DefaultPrinterService tests", () => {
206
210
  dummyStderr.writableStream,
207
211
  true,
208
212
  true,
213
+ new TtyTerminal(dummyStdout.writeStream),
209
214
  new TtyTerminal(dummyStderr.writeStream),
210
215
  new TtyStyler(3),
211
216
  );
@@ -224,6 +229,7 @@ describe("DefaultPrinterService tests", () => {
224
229
  dummyStderr.writableStream,
225
230
  true,
226
231
  true,
232
+ new TtyTerminal(dummyStdout.writeStream),
227
233
  new TtyTerminal(dummyStderr.writeStream),
228
234
  new TtyStyler(3),
229
235
  );
@@ -242,6 +248,7 @@ describe("DefaultPrinterService tests", () => {
242
248
  dummyStderr.writableStream,
243
249
  true,
244
250
  true,
251
+ new TtyTerminal(dummyStdout.writeStream),
245
252
  new TtyTerminal(dummyStderr.writeStream),
246
253
  new TtyStyler(3),
247
254
  );
@@ -268,6 +275,7 @@ describe("DefaultPrinterService tests", () => {
268
275
  dummyStderr.writableStream,
269
276
  true,
270
277
  true,
278
+ new TtyTerminal(dummyStdout.writeStream),
271
279
  new TtyTerminal(dummyStderr.writeStream),
272
280
  new TtyStyler(3),
273
281
  );
@@ -313,6 +321,7 @@ describe("DefaultPrinterService tests", () => {
313
321
  dummyStderr.writableStream,
314
322
  true,
315
323
  true,
324
+ new TtyTerminal(dummyStdout.writeStream),
316
325
  new TtyTerminal(dummyStderr.writeStream),
317
326
  new TtyStyler(3),
318
327
  );
@@ -341,6 +350,7 @@ describe("DefaultPrinterService tests", () => {
341
350
  dummyStderr.writableStream,
342
351
  true,
343
352
  true,
353
+ new TtyTerminal(dummyStdout.writeStream),
344
354
  new TtyTerminal(dummyStderr.writeStream),
345
355
  new TtyStyler(3),
346
356
  );
@@ -369,6 +379,7 @@ describe("DefaultPrinterService tests", () => {
369
379
  dummyStderr.writableStream,
370
380
  true,
371
381
  true,
382
+ new TtyTerminal(dummyStdout.writeStream),
372
383
  new TtyTerminal(dummyStderr.writeStream),
373
384
  new TtyStyler(3),
374
385
  );
@@ -434,6 +445,7 @@ describe("DefaultPrinterService tests", () => {
434
445
  dummyStderr.writableStream,
435
446
  true,
436
447
  true,
448
+ new TtyTerminal(dummyStdout.writeStream),
437
449
  new TtyTerminal(dummyStderr.writeStream),
438
450
  new TtyStyler(3),
439
451
  );
@@ -462,6 +474,7 @@ describe("DefaultPrinterService tests", () => {
462
474
  dummyStderr.writableStream,
463
475
  true,
464
476
  true,
477
+ new TtyTerminal(dummyStdout.writeStream),
465
478
  new TtyTerminal(dummyStderr.writeStream),
466
479
  new TtyStyler(3),
467
480
  );
@@ -494,4 +507,222 @@ describe("DefaultPrinterService tests", () => {
494
507
  "bar1",
495
508
  );
496
509
  });
510
+
511
+ test("backgroundBlue with colorLevel 3 and colorEnabled produces background ANSI code", () => {
512
+ const dummyStdout = new StreamString();
513
+ const dummyStderr = new StreamString();
514
+ const printerService = new DefaultPrinterService(
515
+ dummyStdout.writableStream,
516
+ dummyStderr.writableStream,
517
+ true,
518
+ true,
519
+ new TtyTerminal(dummyStdout.writeStream),
520
+ new TtyTerminal(dummyStderr.writeStream),
521
+ new TtyStyler(3),
522
+ );
523
+ printerService.colorEnabled = true;
524
+ const result = printerService.backgroundBlue("text");
525
+ expect(result).toStartWith("\x1b[48;2;");
526
+ expect(result).toEndWith("\x1b[49m");
527
+ });
528
+
529
+ test("backgroundColor with colorLevel 3 produces background ANSI code", () => {
530
+ const dummyStdout = new StreamString();
531
+ const dummyStderr = new StreamString();
532
+ const printerService = new DefaultPrinterService(
533
+ dummyStdout.writableStream,
534
+ dummyStderr.writableStream,
535
+ true,
536
+ true,
537
+ new TtyTerminal(dummyStdout.writeStream),
538
+ new TtyTerminal(dummyStderr.writeStream),
539
+ new TtyStyler(3),
540
+ );
541
+ printerService.colorEnabled = true;
542
+ const result = printerService.backgroundColor("text", "#268bd2");
543
+ expect(result).toStartWith("\x1b[48;2;");
544
+ expect(result).toEndWith("\x1b[49m");
545
+ });
546
+
547
+ test("backgroundColor with invalid color throws", () => {
548
+ const dummyStdout = new StreamString();
549
+ const dummyStderr = new StreamString();
550
+ const printerService = new DefaultPrinterService(
551
+ dummyStdout.writableStream,
552
+ dummyStderr.writableStream,
553
+ true,
554
+ true,
555
+ new TtyTerminal(dummyStdout.writeStream),
556
+ new TtyTerminal(dummyStderr.writeStream),
557
+ new TtyStyler(3),
558
+ );
559
+ printerService.colorEnabled = true;
560
+ expect(() => printerService.backgroundColor("text", "invalid")).toThrow(
561
+ "Invalid color: invalid",
562
+ );
563
+ });
564
+
565
+ test("backgroundBlue with colorEnabled false returns plain text", () => {
566
+ const dummyStdout = new StreamString();
567
+ const dummyStderr = new StreamString();
568
+ const printerService = new DefaultPrinterService(
569
+ dummyStdout.writableStream,
570
+ dummyStderr.writableStream,
571
+ true,
572
+ true,
573
+ new TtyTerminal(dummyStdout.writeStream),
574
+ new TtyTerminal(dummyStderr.writeStream),
575
+ new TtyStyler(3),
576
+ );
577
+ printerService.colorEnabled = false;
578
+ const result = printerService.backgroundBlue("text");
579
+ expectStringEquals(result, "text");
580
+ });
581
+
582
+ test("all named background methods produce background ANSI codes when colorEnabled", () => {
583
+ const dummyStdout = new StreamString();
584
+ const dummyStderr = new StreamString();
585
+ const printerService = new DefaultPrinterService(
586
+ dummyStdout.writableStream,
587
+ dummyStderr.writableStream,
588
+ true,
589
+ true,
590
+ new TtyTerminal(dummyStdout.writeStream),
591
+ new TtyTerminal(dummyStderr.writeStream),
592
+ new TtyStyler(3),
593
+ );
594
+ printerService.colorEnabled = true;
595
+ for (
596
+ const method of [
597
+ "backgroundYellow",
598
+ "backgroundOrange",
599
+ "backgroundRed",
600
+ "backgroundMagenta",
601
+ "backgroundViolet",
602
+ "backgroundBlue",
603
+ "backgroundCyan",
604
+ "backgroundGreen",
605
+ ] as const
606
+ ) {
607
+ const result = printerService[method]("text");
608
+ expect(result).toStartWith("\x1b[48;2;");
609
+ expect(result).toEndWith("\x1b[49m");
610
+ }
611
+ });
612
+
613
+ test("all semantic background methods produce background ANSI codes when colorEnabled", () => {
614
+ const dummyStdout = new StreamString();
615
+ const dummyStderr = new StreamString();
616
+ const printerService = new DefaultPrinterService(
617
+ dummyStdout.writableStream,
618
+ dummyStderr.writableStream,
619
+ true,
620
+ true,
621
+ new TtyTerminal(dummyStdout.writeStream),
622
+ new TtyTerminal(dummyStderr.writeStream),
623
+ new TtyStyler(3),
624
+ );
625
+ printerService.colorEnabled = true;
626
+ for (
627
+ const method of [
628
+ "backgroundPrimary",
629
+ "backgroundSecondary",
630
+ "backgroundEmphasised",
631
+ "backgroundSelected",
632
+ ] as const
633
+ ) {
634
+ const result = printerService[method]("text");
635
+ expect(result).toStartWith("\x1b[48;2;");
636
+ expect(result).toEndWith("\x1b[49m");
637
+ }
638
+ });
639
+
640
+ test("hyperlinksEnabled defaults to true", () => {
641
+ const dummyStdout = new StreamString();
642
+ const dummyStderr = new StreamString();
643
+ const printerService = new DefaultPrinterService(
644
+ dummyStdout.writableStream,
645
+ dummyStderr.writableStream,
646
+ true,
647
+ true,
648
+ new TtyTerminal(dummyStdout.writeStream),
649
+ new TtyTerminal(dummyStderr.writeStream),
650
+ new TtyStyler(3),
651
+ );
652
+ expect(printerService.hyperlinksEnabled).toBeTrue();
653
+ });
654
+
655
+ test("hyperlink with hyperlinksEnabled returns OSC 8 wrapped text", () => {
656
+ const dummyStdout = new StreamString();
657
+ const dummyStderr = new StreamString();
658
+ const printerService = new DefaultPrinterService(
659
+ dummyStdout.writableStream,
660
+ dummyStderr.writableStream,
661
+ true,
662
+ true,
663
+ new TtyTerminal(dummyStdout.writeStream),
664
+ new TtyTerminal(dummyStderr.writeStream),
665
+ new TtyStyler(3),
666
+ );
667
+ const result = printerService.hyperlink(
668
+ "click here",
669
+ "https://example.com",
670
+ );
671
+ expect(result).toEqual(
672
+ "\x1b]8;;\x68ttps://example.com\x07click here\x1b]8;;\x07",
673
+ );
674
+ });
675
+
676
+ test("hyperlink with hyperlinksEnabled false returns url", () => {
677
+ const dummyStdout = new StreamString();
678
+ const dummyStderr = new StreamString();
679
+ const printerService = new DefaultPrinterService(
680
+ dummyStdout.writableStream,
681
+ dummyStderr.writableStream,
682
+ true,
683
+ true,
684
+ new TtyTerminal(dummyStdout.writeStream),
685
+ new TtyTerminal(dummyStderr.writeStream),
686
+ new TtyStyler(3),
687
+ );
688
+ printerService.hyperlinksEnabled = false;
689
+ const result = printerService.hyperlink(
690
+ "click here",
691
+ "https://example.com",
692
+ );
693
+ expect(result).toEqual("click here: https://example.com");
694
+ });
695
+
696
+ test("all background methods return plain text when colorEnabled is false", () => {
697
+ const dummyStdout = new StreamString();
698
+ const dummyStderr = new StreamString();
699
+ const printerService = new DefaultPrinterService(
700
+ dummyStdout.writableStream,
701
+ dummyStderr.writableStream,
702
+ true,
703
+ true,
704
+ new TtyTerminal(dummyStdout.writeStream),
705
+ new TtyTerminal(dummyStderr.writeStream),
706
+ new TtyStyler(3),
707
+ );
708
+ printerService.colorEnabled = false;
709
+ for (
710
+ const method of [
711
+ "backgroundPrimary",
712
+ "backgroundSecondary",
713
+ "backgroundEmphasised",
714
+ "backgroundSelected",
715
+ "backgroundYellow",
716
+ "backgroundOrange",
717
+ "backgroundRed",
718
+ "backgroundMagenta",
719
+ "backgroundViolet",
720
+ "backgroundBlue",
721
+ "backgroundCyan",
722
+ "backgroundGreen",
723
+ ] as const
724
+ ) {
725
+ expectStringEquals(printerService[method]("text"), "text");
726
+ }
727
+ });
497
728
  });
@@ -4,13 +4,13 @@ import { getCLIConfig } from "../../fixtures/CLIConfig.ts";
4
4
  import PrinterServiceProvider from "../../../src/service/printer/PrinterServiceProvider.ts";
5
5
  import { SHUTDOWN_SERVICE_ID } from "../../../src/api/service/core/ShutdownService.ts";
6
6
  import DefaultShutdownService from "../../../src/service/shutdown/DefaultShutdownService.ts";
7
- import TtyTerminal from "../../../src/service/printer/terminal/TtyTerminal.ts";
7
+ import TtyTerminal from "../../../src/terminal/TtyTerminal.ts";
8
8
  import StreamString from "../../fixtures/StreamString.ts";
9
- import TtyStyler from "../../../src/service/printer/terminal/TtyStyler.ts";
9
+ import TtyStyler from "../../../src/terminal/TtyStyler.ts";
10
10
  import DefaultPrinterService from "../../../src/service/printer/DefaultPrinterService.ts";
11
11
 
12
12
  describe("PrinterServiceProvider tests", () => {
13
- test("PrinterServiceProvider provide works", async () => {
13
+ test("PrinterServiceProvider getServiceInfo works", async () => {
14
14
  const streamString = new StreamString();
15
15
  const printerService = new DefaultPrinterService(
16
16
  streamString.writableStream,
@@ -18,6 +18,7 @@ describe("PrinterServiceProvider tests", () => {
18
18
  true,
19
19
  true,
20
20
  new TtyTerminal(streamString.writeStream),
21
+ new TtyTerminal(streamString.writeStream),
21
22
  new TtyStyler(3),
22
23
  );
23
24
 
@@ -33,7 +34,7 @@ describe("PrinterServiceProvider tests", () => {
33
34
  new DefaultShutdownService(),
34
35
  );
35
36
 
36
- const serviceInfo = await printerServiceProvider.provide(cliConfig);
37
- expect(serviceInfo.commands.length).toEqual(3);
37
+ const serviceInfo = await printerServiceProvider.getServiceInfo(cliConfig);
38
+ expect(serviceInfo.commands.length).toEqual(4);
38
39
  });
39
40
  });
@@ -0,0 +1,83 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import DefaultContext from "../../../../src/runtime/DefaultContext.ts";
3
+ import DarkModeCommand from "../../../../src/service/printer/command/DarkModeCommand.ts";
4
+ import { getCLIConfig } from "../../../fixtures/CLIConfig.ts";
5
+ import PrinterServiceProvider from "../../../../src/service/printer/PrinterServiceProvider.ts";
6
+ import ShutdownServiceProvider from "../../../../src/service/shutdown/ShutdownServiceProvider.ts";
7
+ import { SHUTDOWN_SERVICE_ID } from "../../../../src/api/service/core/ShutdownService.ts";
8
+ import TtyTerminal from "../../../../src/terminal/TtyTerminal.ts";
9
+ import StreamString from "../../../fixtures/StreamString.ts";
10
+ import DefaultPrinterService from "../../../../src/service/printer/DefaultPrinterService.ts";
11
+ import TtyStyler from "../../../../src/terminal/TtyStyler.ts";
12
+
13
+ describe("DarkModeCommand tests", () => {
14
+ test("execute sets darkMode to true when argumentValue is true", async () => {
15
+ const streamString = new StreamString();
16
+ const printerService = new DefaultPrinterService(
17
+ streamString.writableStream,
18
+ streamString.writableStream,
19
+ true,
20
+ true,
21
+ new TtyTerminal(streamString.writeStream),
22
+ new TtyTerminal(streamString.writeStream),
23
+ new TtyStyler(3),
24
+ );
25
+ const printerServiceProvider = new PrinterServiceProvider(
26
+ 100,
27
+ printerService,
28
+ );
29
+ const cliConfig = getCLIConfig();
30
+ const context = new DefaultContext(cliConfig);
31
+
32
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
33
+ const shutdownService =
34
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
35
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
36
+
37
+ await printerServiceProvider.getServiceInfo(cliConfig);
38
+
39
+ const command = new DarkModeCommand(printerServiceProvider, 100);
40
+
41
+ expect(printerServiceProvider.printerService!.darkMode).toEqual(false);
42
+
43
+ await command.execute(context, true);
44
+
45
+ expect(printerServiceProvider.printerService!.darkMode).toEqual(true);
46
+
47
+ await ShutdownServiceProvider.shutdown();
48
+ });
49
+
50
+ test("execute sets darkMode to false when argumentValue is false", async () => {
51
+ const streamString = new StreamString();
52
+ const printerService = new DefaultPrinterService(
53
+ streamString.writableStream,
54
+ streamString.writableStream,
55
+ true,
56
+ true,
57
+ new TtyTerminal(streamString.writeStream),
58
+ new TtyTerminal(streamString.writeStream),
59
+ new TtyStyler(3),
60
+ );
61
+ const printerServiceProvider = new PrinterServiceProvider(
62
+ 100,
63
+ printerService,
64
+ );
65
+ const cliConfig = getCLIConfig();
66
+ const context = new DefaultContext(cliConfig);
67
+
68
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
69
+ const shutdownService =
70
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
71
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
72
+
73
+ await printerServiceProvider.getServiceInfo(cliConfig);
74
+
75
+ const command = new DarkModeCommand(printerServiceProvider, 100);
76
+
77
+ await command.execute(context, false);
78
+
79
+ expect(printerServiceProvider.printerService!.darkMode).toEqual(false);
80
+
81
+ await ShutdownServiceProvider.shutdown();
82
+ });
83
+ });
@@ -6,10 +6,10 @@ import PrinterServiceProvider from "../../../../src/service/printer/PrinterServi
6
6
  import { Level } from "../../../../src/api/service/core/PrinterService.ts";
7
7
  import ShutdownServiceProvider from "../../../../src/service/shutdown/ShutdownServiceProvider.ts";
8
8
  import { SHUTDOWN_SERVICE_ID } from "../../../../src/api/service/core/ShutdownService.ts";
9
- import TtyTerminal from "../../../../src/service/printer/terminal/TtyTerminal.ts";
9
+ import TtyTerminal from "../../../../src/terminal/TtyTerminal.ts";
10
10
  import StreamString from "../../../fixtures/StreamString.ts";
11
11
  import DefaultPrinterService from "../../../../src/service/printer/DefaultPrinterService.ts";
12
- import TtyStyler from "../../../../src/service/printer/terminal/TtyStyler.ts";
12
+ import TtyStyler from "../../../../src/terminal/TtyStyler.ts";
13
13
 
14
14
  describe("LogLevelCommand tests", () => {
15
15
  test("LogLevelCommand works", async () => {
@@ -20,6 +20,7 @@ describe("LogLevelCommand tests", () => {
20
20
  true,
21
21
  true,
22
22
  new TtyTerminal(streamString.writeStream),
23
+ new TtyTerminal(streamString.writeStream),
23
24
  new TtyStyler(3),
24
25
  );
25
26
  const printerServiceProvider = new PrinterServiceProvider(
@@ -30,12 +31,13 @@ describe("LogLevelCommand tests", () => {
30
31
  const context = new DefaultContext(cliConfig);
31
32
 
32
33
  const shutdownServiceProvider = new ShutdownServiceProvider(1);
33
- const shutdownService = (await shutdownServiceProvider.provide(cliConfig))
34
- .service!;
34
+ const shutdownService =
35
+ (await shutdownServiceProvider.getServiceInfo(cliConfig))
36
+ .service!;
35
37
 
36
38
  context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
37
39
 
38
- await printerServiceProvider.provide(cliConfig);
40
+ await printerServiceProvider.getServiceInfo(cliConfig);
39
41
 
40
42
  const logLevelCommand = new LogLevelCommand(printerServiceProvider, 100);
41
43
 
@@ -0,0 +1,83 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import DefaultContext from "../../../../src/runtime/DefaultContext.ts";
3
+ import NoColorCommand from "../../../../src/service/printer/command/NoColorCommand.ts";
4
+ import { getCLIConfig } from "../../../fixtures/CLIConfig.ts";
5
+ import PrinterServiceProvider from "../../../../src/service/printer/PrinterServiceProvider.ts";
6
+ import ShutdownServiceProvider from "../../../../src/service/shutdown/ShutdownServiceProvider.ts";
7
+ import { SHUTDOWN_SERVICE_ID } from "../../../../src/api/service/core/ShutdownService.ts";
8
+ import TtyTerminal from "../../../../src/terminal/TtyTerminal.ts";
9
+ import StreamString from "../../../fixtures/StreamString.ts";
10
+ import DefaultPrinterService from "../../../../src/service/printer/DefaultPrinterService.ts";
11
+ import TtyStyler from "../../../../src/terminal/TtyStyler.ts";
12
+
13
+ describe("NoColorCommand tests", () => {
14
+ test("execute sets colorEnabled to false when argumentValue is true", async () => {
15
+ const streamString = new StreamString();
16
+ const printerService = new DefaultPrinterService(
17
+ streamString.writableStream,
18
+ streamString.writableStream,
19
+ true,
20
+ true,
21
+ new TtyTerminal(streamString.writeStream),
22
+ new TtyTerminal(streamString.writeStream),
23
+ new TtyStyler(3),
24
+ );
25
+ const printerServiceProvider = new PrinterServiceProvider(
26
+ 100,
27
+ printerService,
28
+ );
29
+ const cliConfig = getCLIConfig();
30
+ const context = new DefaultContext(cliConfig);
31
+
32
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
33
+ const shutdownService =
34
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
35
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
36
+
37
+ await printerServiceProvider.getServiceInfo(cliConfig);
38
+
39
+ const command = new NoColorCommand(printerServiceProvider, 100);
40
+
41
+ expect(printerServiceProvider.printerService!.colorEnabled).toEqual(true);
42
+
43
+ await command.execute(context, true);
44
+
45
+ expect(printerServiceProvider.printerService!.colorEnabled).toEqual(false);
46
+
47
+ await ShutdownServiceProvider.shutdown();
48
+ });
49
+
50
+ test("execute sets colorEnabled to true when argumentValue is false", async () => {
51
+ const streamString = new StreamString();
52
+ const printerService = new DefaultPrinterService(
53
+ streamString.writableStream,
54
+ streamString.writableStream,
55
+ true,
56
+ true,
57
+ new TtyTerminal(streamString.writeStream),
58
+ new TtyTerminal(streamString.writeStream),
59
+ new TtyStyler(3),
60
+ );
61
+ const printerServiceProvider = new PrinterServiceProvider(
62
+ 100,
63
+ printerService,
64
+ );
65
+ const cliConfig = getCLIConfig();
66
+ const context = new DefaultContext(cliConfig);
67
+
68
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
69
+ const shutdownService =
70
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
71
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
72
+
73
+ await printerServiceProvider.getServiceInfo(cliConfig);
74
+
75
+ const command = new NoColorCommand(printerServiceProvider, 100);
76
+
77
+ await command.execute(context, false);
78
+
79
+ expect(printerServiceProvider.printerService!.colorEnabled).toEqual(true);
80
+
81
+ await ShutdownServiceProvider.shutdown();
82
+ });
83
+ });
@@ -0,0 +1,89 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import DefaultContext from "../../../../src/runtime/DefaultContext.ts";
3
+ import NoHyperlinksCommand from "../../../../src/service/printer/command/NoHyperlinksCommand.ts";
4
+ import { getCLIConfig } from "../../../fixtures/CLIConfig.ts";
5
+ import PrinterServiceProvider from "../../../../src/service/printer/PrinterServiceProvider.ts";
6
+ import ShutdownServiceProvider from "../../../../src/service/shutdown/ShutdownServiceProvider.ts";
7
+ import { SHUTDOWN_SERVICE_ID } from "../../../../src/api/service/core/ShutdownService.ts";
8
+ import TtyTerminal from "../../../../src/terminal/TtyTerminal.ts";
9
+ import StreamString from "../../../fixtures/StreamString.ts";
10
+ import DefaultPrinterService from "../../../../src/service/printer/DefaultPrinterService.ts";
11
+ import TtyStyler from "../../../../src/terminal/TtyStyler.ts";
12
+
13
+ describe("NoHyperlinksCommand tests", () => {
14
+ test("execute sets hyperlinksEnabled to false when argumentValue is true", async () => {
15
+ const streamString = new StreamString();
16
+ const printerService = new DefaultPrinterService(
17
+ streamString.writableStream,
18
+ streamString.writableStream,
19
+ true,
20
+ true,
21
+ new TtyTerminal(streamString.writeStream),
22
+ new TtyTerminal(streamString.writeStream),
23
+ new TtyStyler(3),
24
+ );
25
+ const printerServiceProvider = new PrinterServiceProvider(
26
+ 100,
27
+ printerService,
28
+ );
29
+ const cliConfig = getCLIConfig();
30
+ const context = new DefaultContext(cliConfig);
31
+
32
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
33
+ const shutdownService =
34
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
35
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
36
+
37
+ await printerServiceProvider.getServiceInfo(cliConfig);
38
+
39
+ const command = new NoHyperlinksCommand(printerServiceProvider, 100);
40
+
41
+ expect(printerServiceProvider.printerService!.hyperlinksEnabled).toEqual(
42
+ true,
43
+ );
44
+
45
+ await command.execute(context, true);
46
+
47
+ expect(printerServiceProvider.printerService!.hyperlinksEnabled).toEqual(
48
+ false,
49
+ );
50
+
51
+ await ShutdownServiceProvider.shutdown();
52
+ });
53
+
54
+ test("execute sets hyperlinksEnabled to true when argumentValue is false", async () => {
55
+ const streamString = new StreamString();
56
+ const printerService = new DefaultPrinterService(
57
+ streamString.writableStream,
58
+ streamString.writableStream,
59
+ true,
60
+ true,
61
+ new TtyTerminal(streamString.writeStream),
62
+ new TtyTerminal(streamString.writeStream),
63
+ new TtyStyler(3),
64
+ );
65
+ const printerServiceProvider = new PrinterServiceProvider(
66
+ 100,
67
+ printerService,
68
+ );
69
+ const cliConfig = getCLIConfig();
70
+ const context = new DefaultContext(cliConfig);
71
+
72
+ const shutdownServiceProvider = new ShutdownServiceProvider(1);
73
+ const shutdownService =
74
+ (await shutdownServiceProvider.getServiceInfo(cliConfig)).service!;
75
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
76
+
77
+ await printerServiceProvider.getServiceInfo(cliConfig);
78
+
79
+ const command = new NoHyperlinksCommand(printerServiceProvider, 100);
80
+
81
+ await command.execute(context, false);
82
+
83
+ expect(printerServiceProvider.printerService!.hyperlinksEnabled).toEqual(
84
+ true,
85
+ );
86
+
87
+ await ShutdownServiceProvider.shutdown();
88
+ });
89
+ });