@flowscripter/dynamic-cli-framework 1.2.2 → 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.
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
@@ -14,12 +14,9 @@ function getConfig() {
14
14
  return {
15
15
  defaults: {
16
16
  command1: {
17
- arg1: [
18
- 1,
19
- 2,
20
- ],
17
+ arg1: [1, 2],
21
18
  arg2: {
22
- "arg3": "foo",
19
+ arg3: "foo",
23
20
  },
24
21
  },
25
22
  command2: {
@@ -52,31 +49,25 @@ function getSubCommand(): SubCommand {
52
49
  return {
53
50
  name: "command2",
54
51
  enableConfiguration: true,
55
- options: [{
56
- name: "arg4",
57
- type: ArgumentValueTypeName.BOOLEAN,
58
- }],
52
+ options: [
53
+ {
54
+ name: "arg4",
55
+ type: ArgumentValueTypeName.BOOLEAN,
56
+ },
57
+ ],
59
58
  positionals: [],
60
59
  execute: async (): Promise<void> => {},
61
60
  };
62
61
  }
63
62
  describe("ConfigurationServiceProvider tests", () => {
64
63
  test("ConfigurationServiceProvider getServiceInfo works", async () => {
65
- const configurationServiceProvider = new ConfigurationServiceProvider(
66
- 100,
67
- false,
68
- true,
69
- );
70
- const serviceInfo = await configurationServiceProvider.getServiceInfo(
71
- getCLIConfig(),
72
- );
64
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, false, true);
65
+ const serviceInfo = await configurationServiceProvider.getServiceInfo(getCLIConfig());
73
66
  expect(serviceInfo.commands.length).toEqual(2);
74
67
  });
75
68
 
76
69
  test("ConfigurationServiceProvider initService with no config works", async () => {
77
- const configurationServiceProvider = new ConfigurationServiceProvider(
78
- 100,
79
- );
70
+ const configurationServiceProvider = new ConfigurationServiceProvider(100);
80
71
 
81
72
  const context = new DefaultContext(getCLIConfig());
82
73
 
@@ -86,11 +77,7 @@ describe("ConfigurationServiceProvider tests", () => {
86
77
  });
87
78
 
88
79
  test("ConfigurationServiceProvider initService with config works", async () => {
89
- const configurationServiceProvider = new ConfigurationServiceProvider(
90
- 100,
91
- false,
92
- true,
93
- );
80
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, false, true);
94
81
 
95
82
  const context = new DefaultContext(getCLIConfig());
96
83
 
@@ -104,19 +91,11 @@ describe("ConfigurationServiceProvider tests", () => {
104
91
 
105
92
  await configurationServiceProvider.initService(context);
106
93
 
107
- expect(
108
- configurationServiceProvider.getConfigString(),
109
- ).toEqual(
110
- JSON.stringify(config, null, 2),
111
- );
94
+ expect(configurationServiceProvider.getConfigString()).toEqual(JSON.stringify(config, null, 2));
112
95
  });
113
96
 
114
97
  test("getDefaultArgumentValues works with config", async () => {
115
- const configurationServiceProvider = new ConfigurationServiceProvider(
116
- 100,
117
- false,
118
- true,
119
- );
98
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, false, true);
120
99
 
121
100
  const context = new DefaultContext(getCLIConfig());
122
101
 
@@ -134,22 +113,13 @@ describe("ConfigurationServiceProvider tests", () => {
134
113
  await configurationServiceProvider.getServiceInfo(getCLIConfig());
135
114
 
136
115
  expect(
137
- await configurationServiceProvider.getDefaultArgumentValues(
138
- getCLIConfig(),
139
- subCommand,
140
- ),
141
- ).toEqual(
142
- config.defaults.command2,
143
- );
116
+ await configurationServiceProvider.getDefaultArgumentValues(getCLIConfig(), subCommand),
117
+ ).toEqual(config.defaults.command2);
144
118
  });
145
119
 
146
120
  test("getDefaultArgumentValues works with env vars", async () => {
147
121
  try {
148
- const configurationServiceProvider = new ConfigurationServiceProvider(
149
- 100,
150
- true,
151
- true,
152
- );
122
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, true, true);
153
123
 
154
124
  const context = new DefaultContext(getCLIConfig());
155
125
 
@@ -161,25 +131,15 @@ describe("ConfigurationServiceProvider tests", () => {
161
131
  await configurationServiceProvider.getServiceInfo(getCLIConfig());
162
132
 
163
133
  expect(
164
- await configurationServiceProvider.getDefaultArgumentValues(
165
- getCLIConfig(),
166
- subCommand,
167
- ),
168
- ).toEqual(
169
- { arg4: "true" },
170
- );
134
+ await configurationServiceProvider.getDefaultArgumentValues(getCLIConfig(), subCommand),
135
+ ).toEqual({ arg4: "true" });
171
136
  } finally {
172
137
  delete process.env["FOO_COMMAND2_ARG4"];
173
138
  }
174
139
  });
175
140
 
176
141
  test("setCommandKeyValueScope works", async () => {
177
- const configurationServiceProvider = new ConfigurationServiceProvider(
178
- 100,
179
- false,
180
- true,
181
- true,
182
- );
142
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, false, true, true);
183
143
  const cliConfig = getCLIConfig();
184
144
  const context = new DefaultContext(cliConfig);
185
145
 
@@ -191,9 +151,7 @@ describe("ConfigurationServiceProvider tests", () => {
191
151
 
192
152
  await fs.writeFile(configLocation, JSON.stringify(config));
193
153
 
194
- const serviceInfo = await configurationServiceProvider.getServiceInfo(
195
- cliConfig,
196
- );
154
+ const serviceInfo = await configurationServiceProvider.getServiceInfo(cliConfig);
197
155
 
198
156
  await configurationServiceProvider.initService(context);
199
157
 
@@ -214,12 +172,7 @@ describe("ConfigurationServiceProvider tests", () => {
214
172
  });
215
173
 
216
174
  test("setServiceKeyValueScope works", async () => {
217
- const configurationServiceProvider = new ConfigurationServiceProvider(
218
- 100,
219
- false,
220
- true,
221
- true,
222
- );
175
+ const configurationServiceProvider = new ConfigurationServiceProvider(100, false, true, true);
223
176
  const cliConfig = getCLIConfig();
224
177
  const context = new DefaultContext(cliConfig);
225
178
 
@@ -231,9 +184,7 @@ describe("ConfigurationServiceProvider tests", () => {
231
184
 
232
185
  await fs.writeFile(configLocation, JSON.stringify(config));
233
186
 
234
- const serviceInfo = await configurationServiceProvider.getServiceInfo(
235
- cliConfig,
236
- );
187
+ const serviceInfo = await configurationServiceProvider.getServiceInfo(cliConfig);
237
188
 
238
189
  await configurationServiceProvider.initService(context);
239
190
 
@@ -254,8 +205,8 @@ describe("ConfigurationServiceProvider tests", () => {
254
205
  });
255
206
 
256
207
  test("secretServiceEnabled requires configEnabled", () => {
257
- expect(
258
- () => new ConfigurationServiceProvider(100, false, false, false, true),
259
- ).toThrow("configEnabled must be true");
208
+ expect(() => new ConfigurationServiceProvider(100, false, false, false, true)).toThrow(
209
+ "configEnabled must be true",
210
+ );
260
211
  });
261
212
  });
@@ -76,9 +76,9 @@ describe("DefaultKeyValueService tests", () => {
76
76
  const keyValueService = new DefaultKeyValueService();
77
77
  keyValueService.setKeyValueData(new Map());
78
78
 
79
- await expect(
80
- keyValueService.setKey("token", "secret", true),
81
- ).rejects.toThrow("no secret service");
79
+ await expect(keyValueService.setKey("token", "secret", true)).rejects.toThrow(
80
+ "no secret service",
81
+ );
82
82
  });
83
83
 
84
84
  test("setKey with isSecret=true stores sentinel", async () => {
@@ -100,9 +100,7 @@ describe("DefaultKeyValueService tests", () => {
100
100
  const secretService = new DefaultSecretService("test-cli", mockApi);
101
101
  secretService.setScope("command_test");
102
102
  const keyValueService = new DefaultKeyValueService(secretService);
103
- keyValueService.setKeyValueData(
104
- new Map([["token", "__SECRET__:command_test_token"]]),
105
- );
103
+ keyValueService.setKeyValueData(new Map([["token", "__SECRET__:command_test_token"]]));
106
104
 
107
105
  mockApi.get.mockResolvedValueOnce("resolved-secret");
108
106
  const value = await keyValueService.getKey("token");
@@ -118,25 +116,17 @@ describe("DefaultKeyValueService tests", () => {
118
116
  const secretService = new DefaultSecretService("test-cli", mockApi);
119
117
  secretService.setScope("command_test");
120
118
  const keyValueService = new DefaultKeyValueService(secretService);
121
- keyValueService.setKeyValueData(
122
- new Map([["token", "__SECRET__:command_test_token"]]),
123
- );
119
+ keyValueService.setKeyValueData(new Map([["token", "__SECRET__:command_test_token"]]));
124
120
 
125
121
  mockApi.get.mockResolvedValueOnce(null);
126
- await expect(keyValueService.getKey("token")).rejects.toThrow(
127
- "Secret not found",
128
- );
122
+ await expect(keyValueService.getKey("token")).rejects.toThrow("Secret not found");
129
123
  });
130
124
 
131
125
  test("getKey with sentinel throws without secret service", async () => {
132
126
  const keyValueService = new DefaultKeyValueService();
133
- keyValueService.setKeyValueData(
134
- new Map([["token", "__SECRET__:command_test_token"]]),
135
- );
127
+ keyValueService.setKeyValueData(new Map([["token", "__SECRET__:command_test_token"]]));
136
128
 
137
- await expect(keyValueService.getKey("token")).rejects.toThrow(
138
- "no secret service",
139
- );
129
+ await expect(keyValueService.getKey("token")).rejects.toThrow("no secret service");
140
130
  });
141
131
 
142
132
  test("deleteKey removes secret from OS store", async () => {
@@ -144,9 +134,7 @@ describe("DefaultKeyValueService tests", () => {
144
134
  const secretService = new DefaultSecretService("test-cli", mockApi);
145
135
  secretService.setScope("command_test");
146
136
  const keyValueService = new DefaultKeyValueService(secretService);
147
- keyValueService.setKeyValueData(
148
- new Map([["token", "__SECRET__:command_test_token"]]),
149
- );
137
+ keyValueService.setKeyValueData(new Map([["token", "__SECRET__:command_test_token"]]));
150
138
 
151
139
  await keyValueService.deleteKey("token");
152
140
  expect(mockApi.delete).toHaveBeenCalledWith({
@@ -36,15 +36,11 @@ describe("DefaultSecretService tests", () => {
36
36
 
37
37
  test("Constructor throws if sanitized service name exceeds 255 chars", () => {
38
38
  const api = createMockSecretsApi();
39
- expect(() => new DefaultSecretService("a".repeat(256), api)).toThrow(
40
- "exceeds 255 characters",
41
- );
39
+ expect(() => new DefaultSecretService("a".repeat(256), api)).toThrow("exceeds 255 characters");
42
40
  });
43
41
 
44
42
  test("setSecret throws without scope", async () => {
45
- await expect(service.setSecret("key", "value")).rejects.toThrow(
46
- "without a scope",
47
- );
43
+ await expect(service.setSecret("key", "value")).rejects.toThrow("without a scope");
48
44
  });
49
45
 
50
46
  test("setSecret constructs correct name and returns it", async () => {
@@ -71,16 +67,14 @@ describe("DefaultSecretService tests", () => {
71
67
 
72
68
  test("setSecret throws if name exceeds 255 chars", async () => {
73
69
  service.setScope("command_test");
74
- await expect(
75
- service.setSecret("a".repeat(250), "value"),
76
- ).rejects.toThrow("exceeds 255 characters");
70
+ await expect(service.setSecret("a".repeat(250), "value")).rejects.toThrow(
71
+ "exceeds 255 characters",
72
+ );
77
73
  });
78
74
 
79
75
  test("setSecret throws if value exceeds 2047 bytes", async () => {
80
76
  service.setScope("command_test");
81
- await expect(
82
- service.setSecret("key", "a".repeat(2048)),
83
- ).rejects.toThrow("exceeds 2047 bytes");
77
+ await expect(service.setSecret("key", "a".repeat(2048))).rejects.toThrow("exceeds 2047 bytes");
84
78
  });
85
79
 
86
80
  test("getSecret delegates to secrets API", async () => {
@@ -130,9 +124,7 @@ describe("DefaultSecretService tests", () => {
130
124
  test("clearScope resets scope", async () => {
131
125
  service.setScope("command_test");
132
126
  service.clearScope();
133
- await expect(service.setSecret("key", "value")).rejects.toThrow(
134
- "without a scope",
135
- );
127
+ await expect(service.setSecret("key", "value")).rejects.toThrow("without a scope");
136
128
  });
137
129
 
138
130
  test("setScope updates scope for subsequent calls", async () => {
@@ -3,12 +3,8 @@ import DefaultContext from "../../../../src/runtime/DefaultContext.ts";
3
3
  import DumpConfigCommand from "../../../../src/service/configuration/command/DumpConfigCommand.ts";
4
4
  import ConfigurationServiceProvider from "../../../../src/service/configuration/ConfigurationServiceProvider.ts";
5
5
  import { getCLIConfig } from "../../../fixtures/CLIConfig.ts";
6
- import {
7
- PRINTER_SERVICE_ID,
8
- } from "../../../../src/api/service/core/PrinterService.ts";
9
- import {
10
- SYNTAX_HIGHLIGHTER_SERVICE_ID,
11
- } from "../../../../src/api/service/core/SyntaxHighlighterService.ts";
6
+ import { PRINTER_SERVICE_ID } from "../../../../src/api/service/core/PrinterService.ts";
7
+ import { SYNTAX_HIGHLIGHTER_SERVICE_ID } from "../../../../src/api/service/core/SyntaxHighlighterService.ts";
12
8
 
13
9
  describe("DumpConfigCommand tests", () => {
14
10
  test("has correct name and description", () => {
@@ -43,18 +39,13 @@ describe("DumpConfigCommand tests", () => {
43
39
  };
44
40
 
45
41
  context.addServiceInstance(PRINTER_SERVICE_ID, mockPrinterService);
46
- context.addServiceInstance(
47
- SYNTAX_HIGHLIGHTER_SERVICE_ID,
48
- mockSyntaxHighlighter,
49
- );
42
+ context.addServiceInstance(SYNTAX_HIGHLIGHTER_SERVICE_ID, mockSyntaxHighlighter);
50
43
 
51
44
  const command = new DumpConfigCommand(configProvider);
52
45
  await command.execute(context);
53
46
 
54
47
  expect(highlightedLang).toEqual("json");
55
48
  expect(highlightedText).toEqual(configProvider.getConfigString());
56
- expect(printedMessage).toEqual(
57
- `highlighted:${configProvider.getConfigString()}\n`,
58
- );
49
+ expect(printedMessage).toEqual(`highlighted:${configProvider.getConfigString()}\n`);
59
50
  });
60
51
  });
@@ -10,13 +10,10 @@ import TtyStyler from "../../../src/terminal/TtyStyler.ts";
10
10
 
11
11
  describe("DataDumpGeneratorServiceProvider tests", () => {
12
12
  test("getServiceInfo returns service and empty commands", async () => {
13
- const dataDumpGeneratorServiceProvider =
14
- new DataDumpGeneratorServiceProvider(100);
13
+ const dataDumpGeneratorServiceProvider = new DataDumpGeneratorServiceProvider(100);
15
14
  const cliConfig = getCLIConfig();
16
15
 
17
- const serviceInfo = await dataDumpGeneratorServiceProvider.getServiceInfo(
18
- cliConfig,
19
- );
16
+ const serviceInfo = await dataDumpGeneratorServiceProvider.getServiceInfo(cliConfig);
20
17
  expect(serviceInfo.commands.length).toEqual(0);
21
18
  expect(serviceInfo.service).toBeDefined();
22
19
  });
@@ -24,8 +21,7 @@ describe("DataDumpGeneratorServiceProvider tests", () => {
24
21
  test("initService sets colorEnabled and colorFunction from PrinterService", async () => {
25
22
  const dummyStdout = new StreamString();
26
23
  const dummyStderr = new StreamString();
27
- const dataDumpGeneratorServiceProvider =
28
- new DataDumpGeneratorServiceProvider(100);
24
+ const dataDumpGeneratorServiceProvider = new DataDumpGeneratorServiceProvider(100);
29
25
  const cliConfig = getCLIConfig();
30
26
  const context = new DefaultContext(cliConfig);
31
27
 
@@ -42,15 +38,13 @@ describe("DataDumpGeneratorServiceProvider tests", () => {
42
38
  ),
43
39
  );
44
40
 
45
- const serviceInfo = await dataDumpGeneratorServiceProvider.getServiceInfo(
46
- cliConfig,
47
- );
41
+ const serviceInfo = await dataDumpGeneratorServiceProvider.getServiceInfo(cliConfig);
48
42
  expect(serviceInfo.commands.length).toEqual(0);
49
43
 
50
44
  await dataDumpGeneratorServiceProvider.initService(context);
51
45
 
52
- const service = serviceInfo
53
- .service as import("../../../src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts").default;
46
+ const service =
47
+ serviceInfo.service as import("../../../src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts").default;
54
48
  expect(service.colorEnabled).toBe(true);
55
49
  expect(typeof service.colorFunction).toBe("function");
56
50
  });
@@ -40,16 +40,7 @@ describe("DefaultDataDumpGeneratorService tests", () => {
40
40
  format: DumpFormat.ASCII,
41
41
  });
42
42
  // "A" + 3 space padding in first group, then 7 groups of 4 spaces
43
- const groups = [
44
- "A ",
45
- " ",
46
- " ",
47
- " ",
48
- " ",
49
- " ",
50
- " ",
51
- " ",
52
- ];
43
+ const groups = ["A ", " ", " ", " ", " ", " ", " ", " "];
53
44
  expect(result).toEqual(groups.join(" "));
54
45
  });
55
46
 
@@ -5,76 +5,11 @@ import WritableStreamString from "../../fixtures/StreamString.ts";
5
5
 
6
6
  // Minimal 1x1 red PNG generated via pngjs
7
7
  const MINIMAL_PNG = new Uint8Array([
8
- 0x89,
9
- 0x50,
10
- 0x4e,
11
- 0x47,
12
- 0x0d,
13
- 0x0a,
14
- 0x1a,
15
- 0x0a,
16
- 0x00,
17
- 0x00,
18
- 0x00,
19
- 0x0d,
20
- 0x49,
21
- 0x48,
22
- 0x44,
23
- 0x52,
24
- 0x00,
25
- 0x00,
26
- 0x00,
27
- 0x01,
28
- 0x00,
29
- 0x00,
30
- 0x00,
31
- 0x01,
32
- 0x08,
33
- 0x06,
34
- 0x00,
35
- 0x00,
36
- 0x00,
37
- 0x1f,
38
- 0x15,
39
- 0xc4,
40
- 0x89,
41
- 0x00,
42
- 0x00,
43
- 0x00,
44
- 0x0d,
45
- 0x49,
46
- 0x44,
47
- 0x41,
48
- 0x54,
49
- 0x78,
50
- 0x01,
51
- 0x63,
52
- 0xf8,
53
- 0xcf,
54
- 0xc0,
55
- 0xf0,
56
- 0x1f,
57
- 0x00,
58
- 0x05,
59
- 0x00,
60
- 0x01,
61
- 0xff,
62
- 0x7b,
63
- 0xe9,
64
- 0xbe,
65
- 0xef,
66
- 0x00,
67
- 0x00,
68
- 0x00,
69
- 0x00,
70
- 0x49,
71
- 0x45,
72
- 0x4e,
73
- 0x44,
74
- 0xae,
75
- 0x42,
76
- 0x60,
77
- 0x82,
8
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
9
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x15, 0xc4,
10
+ 0x89, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x01, 0x63, 0xf8, 0xcf, 0xc0, 0xf0,
11
+ 0x1f, 0x00, 0x05, 0x00, 0x01, 0xff, 0x7b, 0xe9, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
12
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
78
13
  ]);
79
14
 
80
15
  describe("DefaultImagePrinterService tests", () => {
@@ -6,16 +6,13 @@ describe("DefaultPrettyPrinterService tests", () => {
6
6
  test("JSON registered by default", async () => {
7
7
  const prettyPrinterService = new DefaultPrettyPrinterService();
8
8
 
9
- expect(await prettyPrinterService.getRegisteredSyntaxes()).toContain(
10
- "json",
11
- );
9
+ expect(await prettyPrinterService.getRegisteredSyntaxes()).toContain("json");
12
10
  });
13
11
 
14
12
  test("Cannot register a syntax if already registered", () => {
15
13
  const prettyPrinterService = new DefaultPrettyPrinterService();
16
14
 
17
- expect(prettyPrinterService.registerSyntax("jSon", FooSyntax)).rejects
18
- .toThrow();
15
+ expect(prettyPrinterService.registerSyntax("jSon", FooSyntax)).rejects.toThrow();
19
16
  });
20
17
 
21
18
  test("Can register new syntax", async () => {
@@ -28,17 +25,13 @@ describe("DefaultPrettyPrinterService tests", () => {
28
25
  test("Cannot pretty print with unknown syntax", () => {
29
26
  const prettyPrinterService = new DefaultPrettyPrinterService();
30
27
 
31
- expect(() => prettyPrinterService.prettify("foo: 1", "bar"))
32
- .toThrow();
28
+ expect(() => prettyPrinterService.prettify("foo: 1", "bar")).toThrow();
33
29
  });
34
30
 
35
31
  test("Can pretty print with JSON syntax", async () => {
36
32
  const prettyPrinterService = new DefaultPrettyPrinterService();
37
33
 
38
- const prettified = await prettyPrinterService.prettify(
39
- "{foo:1}",
40
- "json",
41
- );
34
+ const prettified = await prettyPrinterService.prettify("{foo:1}", "json");
42
35
  expect(prettified).toEqual('{ "foo": 1 }\n');
43
36
  });
44
37
 
@@ -12,9 +12,7 @@ describe("PrettyPrinterServiceProvider tests", () => {
12
12
  test("PrettyPrinterServiceProvider getServiceInfo and initService works", async () => {
13
13
  const dummyStdout = new StreamString();
14
14
  const dummyStderr = new StreamString();
15
- const prettyPrinterServiceProvider = new PrettyPrinterServiceProvider(
16
- 100,
17
- );
15
+ const prettyPrinterServiceProvider = new PrettyPrinterServiceProvider(100);
18
16
  const cliConfig = getCLIConfig();
19
17
  const context = new DefaultContext(cliConfig);
20
18
 
@@ -31,9 +29,7 @@ describe("PrettyPrinterServiceProvider tests", () => {
31
29
  ),
32
30
  );
33
31
 
34
- const serviceInfo = await prettyPrinterServiceProvider.getServiceInfo(
35
- cliConfig,
36
- );
32
+ const serviceInfo = await prettyPrinterServiceProvider.getServiceInfo(cliConfig);
37
33
  expect(serviceInfo.commands.length).toEqual(0);
38
34
 
39
35
  await prettyPrinterServiceProvider.initService(context);