@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
@@ -13,20 +13,14 @@ function getMockArgumentPrompterService(): ArgumentPrompterService {
13
13
 
14
14
  describe("ArgumentPrompterServiceProvider tests", () => {
15
15
  test("ArgumentPrompterServiceProvider has correct serviceId", () => {
16
- const provider = new ArgumentPrompterServiceProvider(
17
- 100,
18
- getMockArgumentPrompterService(),
19
- );
16
+ const provider = new ArgumentPrompterServiceProvider(100, getMockArgumentPrompterService());
20
17
 
21
18
  expect(provider.serviceId).toEqual(ARGUMENT_PROMPTER_SERVICE_ID);
22
19
  });
23
20
 
24
21
  test("ArgumentPrompterServiceProvider getServiceInfo returns no commands", async () => {
25
22
  const argPrompterService = getMockArgumentPrompterService();
26
- const provider = new ArgumentPrompterServiceProvider(
27
- 100,
28
- argPrompterService,
29
- );
23
+ const provider = new ArgumentPrompterServiceProvider(100, argPrompterService);
30
24
  const cliConfig = getCLIConfig();
31
25
 
32
26
  const serviceInfo = await provider.getServiceInfo(cliConfig);
@@ -36,10 +30,7 @@ describe("ArgumentPrompterServiceProvider tests", () => {
36
30
  });
37
31
 
38
32
  test("ArgumentPrompterServiceProvider initService resolves", async () => {
39
- const provider = new ArgumentPrompterServiceProvider(
40
- 100,
41
- getMockArgumentPrompterService(),
42
- );
33
+ const provider = new ArgumentPrompterServiceProvider(100, getMockArgumentPrompterService());
43
34
  const context = new DefaultContext(getCLIConfig());
44
35
 
45
36
  await expect(provider.initService(context)).resolves.toBeUndefined();
@@ -1,10 +1,7 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
  import DefaultArgumentPrompterService from "../../../src/service/argumentPrompter/DefaultArgumentPrompterService.ts";
3
3
  import type PrompterService from "../../../src/api/service/core/PrompterService.ts";
4
- import type {
5
- Prompt,
6
- PromptResult,
7
- } from "../../../src/api/service/core/PrompterService.ts";
4
+ import type { Prompt, PromptResult } from "../../../src/api/service/core/PrompterService.ts";
8
5
  import type { ParseResult } from "../../../src/runtime/parser.ts";
9
6
  import { InvalidArgumentReason } from "../../../src/api/RunResult.ts";
10
7
  import {
@@ -26,16 +23,12 @@ class MockPrompterService implements PrompterService {
26
23
  prompt(promptDef: Prompt): Promise<PromptResult> {
27
24
  const result = this.#responses.get(promptDef.name);
28
25
  if (!result) {
29
- return Promise.reject(
30
- new Error(`No mock response for prompt: ${promptDef.name}`),
31
- );
26
+ return Promise.reject(new Error(`No mock response for prompt: ${promptDef.name}`));
32
27
  }
33
28
  return Promise.resolve(result);
34
29
  }
35
30
 
36
- async promptAll(
37
- prompts: ReadonlyArray<Prompt>,
38
- ): Promise<ReadonlyArray<PromptResult>> {
31
+ async promptAll(prompts: ReadonlyArray<Prompt>): Promise<ReadonlyArray<PromptResult>> {
39
32
  const results: PromptResult[] = [];
40
33
  for (const p of prompts) {
41
34
  results.push(await this.prompt(p));
@@ -168,9 +161,7 @@ describe("DefaultArgumentPrompterService tests", () => {
168
161
 
169
162
  const result = await service.promptForMissingArguments(parseResult);
170
163
  expect(result.invalidArguments.length).toEqual(0);
171
- expect(
172
- (result.populatedArgumentValues as Record<string, unknown>)["foo"],
173
- ).toEqual("bar");
164
+ expect((result.populatedArgumentValues as Record<string, unknown>)["foo"]).toEqual("bar");
174
165
  });
175
166
 
176
167
  test("missing BOOLEAN option prompts TOGGLE", async () => {
@@ -201,9 +192,7 @@ describe("DefaultArgumentPrompterService tests", () => {
201
192
 
202
193
  const result = await service.promptForMissingArguments(parseResult);
203
194
  expect(result.invalidArguments.length).toEqual(0);
204
- expect(
205
- (result.populatedArgumentValues as Record<string, unknown>)["flag"],
206
- ).toEqual(true);
195
+ expect((result.populatedArgumentValues as Record<string, unknown>)["flag"]).toEqual(true);
207
196
  });
208
197
 
209
198
  test("missing option with allowableValues prompts SINGLE_SELECT", async () => {
@@ -235,9 +224,7 @@ describe("DefaultArgumentPrompterService tests", () => {
235
224
 
236
225
  const result = await service.promptForMissingArguments(parseResult);
237
226
  expect(result.invalidArguments.length).toEqual(0);
238
- expect(
239
- (result.populatedArgumentValues as Record<string, unknown>)["color"],
240
- ).toEqual("blue");
227
+ expect((result.populatedArgumentValues as Record<string, unknown>)["color"]).toEqual("blue");
241
228
  });
242
229
 
243
230
  test("missing INTEGER option coerces string to number", async () => {
@@ -268,9 +255,7 @@ describe("DefaultArgumentPrompterService tests", () => {
268
255
 
269
256
  const result = await service.promptForMissingArguments(parseResult);
270
257
  expect(result.invalidArguments.length).toEqual(0);
271
- expect(
272
- (result.populatedArgumentValues as Record<string, unknown>)["count"],
273
- ).toEqual(42);
258
+ expect((result.populatedArgumentValues as Record<string, unknown>)["count"]).toEqual(42);
274
259
  });
275
260
 
276
261
  test("SubCommand with multiple missing values prompts for each", async () => {
@@ -417,10 +402,9 @@ describe("DefaultArgumentPrompterService tests", () => {
417
402
  ],
418
403
  };
419
404
 
420
- const command = makeSubCommand(
421
- "test",
422
- [complexOption as unknown as SubCommand["options"][number]],
423
- );
405
+ const command = makeSubCommand("test", [
406
+ complexOption as unknown as SubCommand["options"][number],
407
+ ]);
424
408
 
425
409
  const parseResult: ParseResult = {
426
410
  command,
@@ -468,10 +452,9 @@ describe("DefaultArgumentPrompterService tests", () => {
468
452
  ],
469
453
  };
470
454
 
471
- const command = makeSubCommand(
472
- "test",
473
- [complexOption as unknown as SubCommand["options"][number]],
474
- );
455
+ const command = makeSubCommand("test", [
456
+ complexOption as unknown as SubCommand["options"][number],
457
+ ]);
475
458
 
476
459
  const parseResult: ParseResult = {
477
460
  command,
@@ -546,13 +529,17 @@ describe("DefaultArgumentPrompterService tests", () => {
546
529
  prompter.addResponse("file", "/tmp/data.txt");
547
530
  const service = new DefaultArgumentPrompterService(prompter);
548
531
 
549
- const command = makeSubCommand("test", [], [
550
- {
551
- name: "file",
552
- description: "file path",
553
- type: ArgumentValueTypeName.STRING,
554
- },
555
- ]);
532
+ const command = makeSubCommand(
533
+ "test",
534
+ [],
535
+ [
536
+ {
537
+ name: "file",
538
+ description: "file path",
539
+ type: ArgumentValueTypeName.STRING,
540
+ },
541
+ ],
542
+ );
556
543
 
557
544
  const parseResult: ParseResult = {
558
545
  command,
@@ -725,14 +712,18 @@ describe("DefaultArgumentPrompterService tests", () => {
725
712
  return Promise.resolve(resp as PromptResult);
726
713
  };
727
714
 
728
- const command = makeSubCommand("test", [], [
729
- {
730
- name: "files",
731
- description: "file paths",
732
- type: ArgumentValueTypeName.STRING,
733
- isVarargMultiple: true,
734
- },
735
- ]);
715
+ const command = makeSubCommand(
716
+ "test",
717
+ [],
718
+ [
719
+ {
720
+ name: "files",
721
+ description: "file paths",
722
+ type: ArgumentValueTypeName.STRING,
723
+ isVarargMultiple: true,
724
+ },
725
+ ],
726
+ );
736
727
 
737
728
  const parseResult: ParseResult = {
738
729
  command,
@@ -5,17 +5,11 @@ import AsciiBannerGeneratorServiceProvider from "../../../src/service/asciiBanne
5
5
 
6
6
  describe("AsciiBannerGeneratorServiceProvider tests", () => {
7
7
  test("AsciiBannerGeneratorServiceProvider getServiceInfo and initService works", async () => {
8
- const asciiBannerGeneratorServiceProvider =
9
- new AsciiBannerGeneratorServiceProvider(
10
- 100,
11
- );
8
+ const asciiBannerGeneratorServiceProvider = new AsciiBannerGeneratorServiceProvider(100);
12
9
  const cliConfig = getCLIConfig();
13
10
  const context = new DefaultContext(cliConfig);
14
11
 
15
- const serviceInfo = await asciiBannerGeneratorServiceProvider
16
- .getServiceInfo(
17
- cliConfig,
18
- );
12
+ const serviceInfo = await asciiBannerGeneratorServiceProvider.getServiceInfo(cliConfig);
19
13
  expect(serviceInfo.commands.length).toEqual(0);
20
14
 
21
15
  await asciiBannerGeneratorServiceProvider.initService(context);
@@ -5,67 +5,49 @@ import DefaultAsciiBannerGeneratorService from "../../../src/service/asciiBanner
5
5
  import smallFont from "./small.flf.json" with { type: "json" };
6
6
  describe("DefaultAsciiBannerGeneratorService tests", () => {
7
7
  test("standard font registered by default", () => {
8
- const asciiBannerGeneratorService =
9
- new DefaultAsciiBannerGeneratorService();
8
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
10
9
 
11
- expect(asciiBannerGeneratorService.getRegisteredFonts()).toEqual([
12
- "standard",
13
- ]);
10
+ expect(asciiBannerGeneratorService.getRegisteredFonts()).toEqual(["standard"]);
14
11
  });
15
12
 
16
13
  test("Cannot register a font if already registered", () => {
17
- const asciiBannerGeneratorService =
18
- new DefaultAsciiBannerGeneratorService();
14
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
19
15
 
20
- expect(() =>
21
- asciiBannerGeneratorService.registerFont("standard", smallFont.font)
22
- )
23
- .toThrow();
16
+ expect(() => asciiBannerGeneratorService.registerFont("standard", smallFont.font)).toThrow();
24
17
  });
25
18
 
26
19
  test("Can register new font", () => {
27
- const asciiBannerGeneratorService =
28
- new DefaultAsciiBannerGeneratorService();
20
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
29
21
 
30
22
  asciiBannerGeneratorService.registerFont("small", smallFont.font);
31
- expect(asciiBannerGeneratorService.getRegisteredFonts()).toEqual([
32
- "standard",
33
- "small",
34
- ]);
23
+ expect(asciiBannerGeneratorService.getRegisteredFonts()).toEqual(["standard", "small"]);
35
24
  });
36
25
 
37
26
  test("Cannot generate with unknown font", () => {
38
- const asciiBannerGeneratorService =
39
- new DefaultAsciiBannerGeneratorService();
27
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
40
28
 
41
- expect(asciiBannerGeneratorService.generate("foo", { fontName: "small" }))
42
- .rejects
43
- .toThrow();
29
+ expect(asciiBannerGeneratorService.generate("foo", { fontName: "small" })).rejects.toThrow();
44
30
  });
45
31
 
46
32
  test("Can generate with standard font", async () => {
47
- const asciiBannerGeneratorService =
48
- new DefaultAsciiBannerGeneratorService();
33
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
49
34
 
50
35
  asciiBannerGeneratorService.registerFont("small", smallFont.font);
51
36
 
52
- const generated = await asciiBannerGeneratorService.generate(
53
- "foo",
54
- { fontName: "standard" },
55
- );
37
+ const generated = await asciiBannerGeneratorService.generate("foo", {
38
+ fontName: "standard",
39
+ });
56
40
  expect(generated).toMatchSnapshot();
57
41
  });
58
42
 
59
43
  test("Can generate with newly registered font", async () => {
60
- const asciiBannerGeneratorService =
61
- new DefaultAsciiBannerGeneratorService();
44
+ const asciiBannerGeneratorService = new DefaultAsciiBannerGeneratorService();
62
45
 
63
46
  asciiBannerGeneratorService.registerFont("small", smallFont.font);
64
47
 
65
- const generated = await asciiBannerGeneratorService.generate(
66
- "foo",
67
- { fontName: "small" },
68
- );
48
+ const generated = await asciiBannerGeneratorService.generate("foo", {
49
+ fontName: "small",
50
+ });
69
51
  expect(generated).toMatchSnapshot();
70
52
  });
71
53
 
@@ -145,13 +127,12 @@ describe("DefaultAsciiBannerGeneratorService tests", () => {
145
127
  },
146
128
  },
147
129
  });
148
- const lines = result.trim().split("\n").filter((l) =>
149
- l.includes("\x1b[38;2;")
150
- );
151
- const firstCodes = lines.map((l) =>
152
- // deno-lint-ignore no-control-regex
153
- l.match(/\x1b\[38;2;(\d+;\d+;\d+)m/)?.[1]
154
- );
130
+ const lines = result
131
+ .trim()
132
+ .split("\n")
133
+ .filter((l) => l.includes("\x1b[38;2;"));
134
+ const ansiRe = /\x1b\[38;2;(\d+;\d+;\d+)m/; // oxlint-disable-line no-control-regex
135
+ const firstCodes = lines.map((l) => l.match(ansiRe)?.[1]);
155
136
  const unique = new Set(firstCodes.filter(Boolean));
156
137
  expect(unique.size).toBeGreaterThan(1);
157
138
  });
@@ -168,14 +149,13 @@ describe("DefaultAsciiBannerGeneratorService tests", () => {
168
149
  },
169
150
  },
170
151
  });
171
- const lines = result.trim().split("\n").filter((l) =>
172
- l.includes("\x1b[38;2;")
173
- );
152
+ const lines = result
153
+ .trim()
154
+ .split("\n")
155
+ .filter((l) => l.includes("\x1b[38;2;"));
174
156
  const firstLine = lines[0]!;
175
- // deno-lint-ignore no-control-regex
176
- const codes = [...firstLine.matchAll(/\x1b\[38;2;(\d+;\d+;\d+)m/g)].map((
177
- m,
178
- ) => m[1]);
157
+ const ansiReG = /\x1b\[38;2;(\d+;\d+;\d+)m/g; // oxlint-disable-line no-control-regex
158
+ const codes = [...firstLine.matchAll(ansiReG)].map((m) => m[1]);
179
159
  const unique = new Set(codes);
180
160
  expect(unique.size).toBeGreaterThan(1);
181
161
  });
@@ -193,14 +173,13 @@ describe("DefaultAsciiBannerGeneratorService tests", () => {
193
173
  },
194
174
  });
195
175
  expect(result).toContain("\x1b[38;2;");
196
- const lines = result.trim().split("\n").filter((l) =>
197
- l.includes("\x1b[38;2;")
198
- );
176
+ const lines = result
177
+ .trim()
178
+ .split("\n")
179
+ .filter((l) => l.includes("\x1b[38;2;"));
199
180
  const firstLine = lines[0]!;
200
- // deno-lint-ignore no-control-regex
201
- const codes = [...firstLine.matchAll(/\x1b\[38;2;(\d+;\d+;\d+)m/g)].map((
202
- m,
203
- ) => m[1]);
181
+ const ansiReG2 = /\x1b\[38;2;(\d+;\d+;\d+)m/g; // oxlint-disable-line no-control-regex
182
+ const codes = [...firstLine.matchAll(ansiReG2)].map((m) => m[1]);
204
183
  const unique = new Set(codes);
205
184
  expect(unique.size).toBeGreaterThan(1);
206
185
  });
@@ -217,13 +196,12 @@ describe("DefaultAsciiBannerGeneratorService tests", () => {
217
196
  },
218
197
  },
219
198
  });
220
- const lines = result.trim().split("\n").filter((l) =>
221
- l.includes("\x1b[38;2;")
222
- );
223
- const firstCodes = lines.map((l) =>
224
- // deno-lint-ignore no-control-regex
225
- l.match(/\x1b\[38;2;(\d+;\d+;\d+)m/)?.[1]
226
- );
199
+ const lines = result
200
+ .trim()
201
+ .split("\n")
202
+ .filter((l) => l.includes("\x1b[38;2;"));
203
+ const ansiRe2 = /\x1b\[38;2;(\d+;\d+;\d+)m/; // oxlint-disable-line no-control-regex
204
+ const firstCodes = lines.map((l) => l.match(ansiRe2)?.[1]);
227
205
  const unique = new Set(firstCodes.filter(Boolean));
228
206
  expect(unique.size).toBeGreaterThan(1);
229
207
  });
@@ -12,16 +12,12 @@ import TtyStyler from "../../../src/terminal/TtyStyler.ts";
12
12
  import { getConfigurationServiceProvider } from "../../fixtures/ConfigurationServiceProvider.ts";
13
13
 
14
14
  // FIGlet font is converted to a JSON string and embedded in a simple JSON file: `{ "font": "<figlet font definition>" }`
15
- import smallFont from "../asciiBannerGenerator/small.flf.json" with {
16
- type: "json",
17
- };
15
+ import smallFont from "../asciiBannerGenerator/small.flf.json" with { type: "json" };
18
16
 
19
17
  describe("BannerServiceProvider tests", () => {
20
18
  test("BannerServiceProvider getServiceInfo works", async () => {
21
19
  const bannerServiceProvider = new BannerServiceProvider(100);
22
- const serviceInfo = await bannerServiceProvider.getServiceInfo(
23
- getCLIConfig(),
24
- );
20
+ const serviceInfo = await bannerServiceProvider.getServiceInfo(getCLIConfig());
25
21
  expect(serviceInfo.commands.length).toEqual(1);
26
22
  });
27
23
 
@@ -43,10 +39,7 @@ describe("BannerServiceProvider tests", () => {
43
39
  const context = new DefaultContext(getCLIConfig());
44
40
 
45
41
  context.addServiceInstance(PRINTER_SERVICE_ID, printer);
46
- context.addServiceInstance(
47
- ASCII_BANNER_GENERATOR_SERVICE_ID,
48
- asciiBannerGenerator,
49
- );
42
+ context.addServiceInstance(ASCII_BANNER_GENERATOR_SERVICE_ID, asciiBannerGenerator);
50
43
 
51
44
  const bannerServiceProvider = new BannerServiceProvider(100);
52
45
  await bannerServiceProvider.initService(context);
@@ -74,17 +67,11 @@ describe("BannerServiceProvider tests", () => {
74
67
  const context = new DefaultContext(getCLIConfig("mpeg-sdl-tool"));
75
68
 
76
69
  context.addServiceInstance(PRINTER_SERVICE_ID, printer);
77
- context.addServiceInstance(
78
- ASCII_BANNER_GENERATOR_SERVICE_ID,
79
- asciiBannerGenerator,
80
- );
70
+ context.addServiceInstance(ASCII_BANNER_GENERATOR_SERVICE_ID, asciiBannerGenerator);
81
71
 
82
72
  asciiBannerGenerator.registerFont("small", smallFont.font);
83
73
 
84
- const configurationServiceProvider = getConfigurationServiceProvider(
85
- 100,
86
- new Map(),
87
- );
74
+ const configurationServiceProvider = getConfigurationServiceProvider(100, new Map());
88
75
  configurationServiceProvider.configLocation = "config.yaml";
89
76
 
90
77
  const bannerServiceProvider = new BannerServiceProvider(
@@ -11,10 +11,7 @@ describe("NoBannerCommand tests", () => {
11
11
 
12
12
  expect(bannerServiceProvider.printBanner).toBeTrue();
13
13
 
14
- await noBannerCommand.execute(
15
- new DefaultContext(getCLIConfig()),
16
- true,
17
- );
14
+ await noBannerCommand.execute(new DefaultContext(getCLIConfig()), true);
18
15
 
19
16
  expect(bannerServiceProvider.printBanner).toBeFalse();
20
17
  });