@flowscripter/dynamic-cli-framework 1.0.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 (133) hide show
  1. package/.github/workflows/check-bun-dependencies.yml +9 -0
  2. package/.github/workflows/lint-pr-message.yml +11 -0
  3. package/.github/workflows/release-bun-library.yml +8 -0
  4. package/.github/workflows/validate-bun-library-pr.yml +8 -0
  5. package/LICENSE +21 -0
  6. package/README.md +1475 -0
  7. package/bun.lock +63 -0
  8. package/index.ts +89 -0
  9. package/package.json +23 -0
  10. package/src/api/CLI.ts +17 -0
  11. package/src/api/CLIConfig.ts +19 -0
  12. package/src/api/Context.ts +25 -0
  13. package/src/api/RunResult.ts +142 -0
  14. package/src/api/argument/Argument.ts +36 -0
  15. package/src/api/argument/ArgumentValueTypes.ts +87 -0
  16. package/src/api/argument/ComplexOption.ts +31 -0
  17. package/src/api/argument/GlobalCommandArgument.ts +17 -0
  18. package/src/api/argument/Option.ts +32 -0
  19. package/src/api/argument/Positional.ts +27 -0
  20. package/src/api/argument/SubCommandArgument.ts +20 -0
  21. package/src/api/command/Command.ts +22 -0
  22. package/src/api/command/GlobalCommand.ts +33 -0
  23. package/src/api/command/GlobalModifierCommand.ts +12 -0
  24. package/src/api/command/GroupCommand.ts +20 -0
  25. package/src/api/command/SubCommand.ts +41 -0
  26. package/src/api/command/UsageExample.ts +21 -0
  27. package/src/api/service/ServiceProvider.ts +52 -0
  28. package/src/api/service/core/AsciiBannerGeneratorService.ts +35 -0
  29. package/src/api/service/core/KeyValueService.ts +28 -0
  30. package/src/api/service/core/PrinterService.ts +266 -0
  31. package/src/api/service/core/ShutdownService.ts +12 -0
  32. package/src/api/service/core/SyntaxHighlighterService.ts +42 -0
  33. package/src/cli/BaseCLI.ts +312 -0
  34. package/src/cli/DefaultRuntimeCLI.ts +54 -0
  35. package/src/command/MultiCommandCliHelpCommand.ts +394 -0
  36. package/src/command/SingleCommandCliHelpCommand.ts +183 -0
  37. package/src/command/UsageCommand.ts +35 -0
  38. package/src/command/VersionCommand.ts +22 -0
  39. package/src/launcher.ts +127 -0
  40. package/src/runtime/DefaultContext.ts +32 -0
  41. package/src/runtime/argument/ArgumentTypeGuards.ts +8 -0
  42. package/src/runtime/command/CommandTypeGuards.ts +30 -0
  43. package/src/runtime/command/CommandValidator.ts +549 -0
  44. package/src/runtime/parser.ts +219 -0
  45. package/src/runtime/registry/CommandRegistry.ts +121 -0
  46. package/src/runtime/registry/DefaultCommandRegistry.ts +318 -0
  47. package/src/runtime/registry/DefaultServiceProviderRegistry.ts +26 -0
  48. package/src/runtime/registry/ServiceProviderRegistry.ts +11 -0
  49. package/src/runtime/runner.ts +697 -0
  50. package/src/runtime/scanner.ts +417 -0
  51. package/src/runtime/values/ValuePopulationResult.ts +41 -0
  52. package/src/runtime/values/argumentValueMerge.ts +201 -0
  53. package/src/runtime/values/argumentValueValidation.ts +610 -0
  54. package/src/runtime/values/globalCommandValuePopulation.ts +96 -0
  55. package/src/runtime/values/subCommandValuePopulation.ts +680 -0
  56. package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +45 -0
  57. package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +38 -0
  58. package/src/service/asciiBannerGenerator/standard.flf.json +3 -0
  59. package/src/service/banner/BannerServiceProvider.ts +99 -0
  60. package/src/service/banner/command/NoBannerCommand.ts +42 -0
  61. package/src/service/configuration/ConfigurationServiceProvider.ts +571 -0
  62. package/src/service/configuration/DefaultKeyValueService.ts +60 -0
  63. package/src/service/configuration/command/ConfigCommand.ts +43 -0
  64. package/src/service/configuration/command/DumpConfigCommand.ts +47 -0
  65. package/src/service/printer/DefaultPrinterService.ts +256 -0
  66. package/src/service/printer/PrinterServiceProvider.ts +61 -0
  67. package/src/service/printer/command/DarkModeCommand.ts +43 -0
  68. package/src/service/printer/command/LogLevelCommand.ts +68 -0
  69. package/src/service/printer/command/NoColorCommand.ts +43 -0
  70. package/src/service/printer/terminal/Ansi.ts +10 -0
  71. package/src/service/printer/terminal/Color.ts +14 -0
  72. package/src/service/printer/terminal/Progress.ts +373 -0
  73. package/src/service/printer/terminal/Spinner.ts +100 -0
  74. package/src/service/printer/terminal/Styler.ts +5 -0
  75. package/src/service/printer/terminal/Terminal.ts +8 -0
  76. package/src/service/printer/terminal/Theme.ts +34 -0
  77. package/src/service/printer/terminal/TtyStyler.ts +39 -0
  78. package/src/service/printer/terminal/TtyTerminal.ts +65 -0
  79. package/src/service/shutdown/DefaultShutdownService.ts +9 -0
  80. package/src/service/shutdown/ShutdownServiceProvider.ts +55 -0
  81. package/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.ts +52 -0
  82. package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +51 -0
  83. package/src/util/configHelper.ts +95 -0
  84. package/src/util/envVarHelper.ts +338 -0
  85. package/src/util/helpHelper.ts +751 -0
  86. package/src/util/logger.ts +84 -0
  87. package/src/util/runnerHelper.ts +112 -0
  88. package/tests/cli/BaseCLI.test.ts +344 -0
  89. package/tests/command/MultiCommandCliHelpCommand.test.ts +650 -0
  90. package/tests/command/SingleCommandCliHelpCommand.test.ts +384 -0
  91. package/tests/command/UsageCommand.test.ts +53 -0
  92. package/tests/command/VersionCommand.test.ts +36 -0
  93. package/tests/fixtures/CLIConfig.ts +9 -0
  94. package/tests/fixtures/Command.ts +229 -0
  95. package/tests/fixtures/CommandRegistry.ts +8 -0
  96. package/tests/fixtures/ConfigurationServiceProvider.ts +28 -0
  97. package/tests/fixtures/Context.ts +33 -0
  98. package/tests/fixtures/ServiceProviderRegistry.ts +16 -0
  99. package/tests/fixtures/StreamString.ts +37 -0
  100. package/tests/fixtures/util.ts +41 -0
  101. package/tests/runtime/DefaultContext.test.ts +20 -0
  102. package/tests/runtime/argument/ArgumentTypeGuards.test.ts +49 -0
  103. package/tests/runtime/command/CommandTypeGuards.test.ts +43 -0
  104. package/tests/runtime/command/CommandValidator.test.ts +816 -0
  105. package/tests/runtime/parser.test.ts +766 -0
  106. package/tests/runtime/registry/DefaultCommandRegistry.test.ts +166 -0
  107. package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +42 -0
  108. package/tests/runtime/runner.test.ts +1298 -0
  109. package/tests/runtime/scanner.test.ts +1113 -0
  110. package/tests/runtime/values/argumentValueMerge.test.ts +314 -0
  111. package/tests/runtime/values/argumentValueValidation.test.ts +1020 -0
  112. package/tests/runtime/values/globalCommandValuePopulation.test.ts +662 -0
  113. package/tests/runtime/values/subCommandValuePopulation.test.ts +2658 -0
  114. package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +22 -0
  115. package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +70 -0
  116. package/tests/service/asciiBannerGenerator/__snapshots__/DefaultAsciiBannerGeneratorService.test.ts.snap +22 -0
  117. package/tests/service/asciiBannerGenerator/small.flf.json +3 -0
  118. package/tests/service/configuration/ConfigurationServiceProvider.test.ts +249 -0
  119. package/tests/service/configuration/DefaultKeyValueService.test.ts +65 -0
  120. package/tests/service/launchBanner/BannerServiceProvider.test.ts +49 -0
  121. package/tests/service/launchBanner/__snapshots__/BannerServiceProvider.test.ts.snap +3 -0
  122. package/tests/service/launchBanner/command/NoBannerCommand.test.ts +21 -0
  123. package/tests/service/printer/DefaultPrinterService.test.ts +409 -0
  124. package/tests/service/printer/PrinterServiceProvider.test.ts +29 -0
  125. package/tests/service/printer/command/LogLevelCommand.test.ts +58 -0
  126. package/tests/service/printer/terminal/Progress.test.ts +40 -0
  127. package/tests/service/printer/terminal/Spinner.test.ts +57 -0
  128. package/tests/service/shutdown/ShutdownServiceProvider.test.ts +13 -0
  129. package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +123 -0
  130. package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +41 -0
  131. package/tests/util/configHelper.test.ts +275 -0
  132. package/tests/util/envVarHelper.test.ts +318 -0
  133. package/tests/util/logger.test.ts +10 -0
@@ -0,0 +1,409 @@
1
+ import { describe, test } from "bun:test";
2
+ import {
3
+ expectBytesEquals,
4
+ expectStringEquals,
5
+ expectStringIncludes,
6
+ sleep,
7
+ write,
8
+ } from "../../fixtures/util.ts";
9
+ import DefaultPrinterService from "../../../src/service/printer/DefaultPrinterService.ts";
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";
13
+ import StreamString from "../../fixtures/StreamString.ts";
14
+
15
+ describe("DefaultPrinterService Tests", () => {
16
+ test("Color disabled works", async () => {
17
+ const dummyStdout = new StreamString();
18
+ const dummyStderr = new StreamString();
19
+ const printerService = new DefaultPrinterService(
20
+ dummyStdout.writableStream,
21
+ dummyStderr.writableStream,
22
+ true,
23
+ true,
24
+ new TtyTerminal(dummyStderr.writeStream),
25
+ new TtyStyler(3),
26
+ );
27
+ printerService.colorEnabled = false;
28
+
29
+ await printerService.info(`hello ${printerService.blue("world")}`);
30
+
31
+ expectStringEquals(dummyStderr.getString(), "hello world");
32
+ });
33
+
34
+ test("Color enabled works", async () => {
35
+ const dummyStdout = new StreamString();
36
+ const dummyStderr = new StreamString();
37
+ const printerService = new DefaultPrinterService(
38
+ dummyStdout.writableStream,
39
+ dummyStderr.writableStream,
40
+ true,
41
+ true,
42
+ new TtyTerminal(dummyStderr.writeStream),
43
+ new TtyStyler(3),
44
+ );
45
+ printerService.colorEnabled = true;
46
+ printerService.darkMode = true;
47
+ await printerService.info(`hello ${printerService.blue("world")}`);
48
+ expectBytesEquals(
49
+ dummyStderr.getString(),
50
+ new Uint8Array([
51
+ 27,
52
+ 91,
53
+ 51,
54
+ 56,
55
+ 59,
56
+ 50,
57
+ 59,
58
+ 49,
59
+ 51,
60
+ 49,
61
+ 59,
62
+ 49,
63
+ 52,
64
+ 56,
65
+ 59,
66
+ 49,
67
+ 53,
68
+ 48,
69
+ 109,
70
+ 104,
71
+ 101,
72
+ 108,
73
+ 108,
74
+ 111,
75
+ 32,
76
+ 27,
77
+ 91,
78
+ 51,
79
+ 56,
80
+ 59,
81
+ 50,
82
+ 59,
83
+ 51,
84
+ 56,
85
+ 59,
86
+ 49,
87
+ 51,
88
+ 57,
89
+ 59,
90
+ 50,
91
+ 49,
92
+ 48,
93
+ 109,
94
+ 119,
95
+ 111,
96
+ 114,
97
+ 108,
98
+ 100,
99
+ 27,
100
+ 91,
101
+ 51,
102
+ 57,
103
+ 109,
104
+ 27,
105
+ 91,
106
+ 51,
107
+ 57,
108
+ 109,
109
+ ]),
110
+ );
111
+ });
112
+
113
+ test("stdout writable accessible", async () => {
114
+ const dummyStdout = new StreamString();
115
+ const dummyStderr = new StreamString();
116
+ const printerService = new DefaultPrinterService(
117
+ dummyStdout.writableStream,
118
+ dummyStderr.writableStream,
119
+ true,
120
+ true,
121
+ new TtyTerminal(dummyStderr.writeStream),
122
+ new TtyStyler(3),
123
+ );
124
+ printerService.colorEnabled = false;
125
+
126
+ await write(printerService.stdoutWritable, "hello world");
127
+
128
+ expectStringEquals(dummyStdout.getString(), "hello world");
129
+ });
130
+
131
+ test("stderr writable accessible", async () => {
132
+ const dummyStdout = new StreamString();
133
+ const dummyStderr = new StreamString();
134
+ const printerService = new DefaultPrinterService(
135
+ dummyStdout.writableStream,
136
+ dummyStderr.writableStream,
137
+ true,
138
+ true,
139
+ new TtyTerminal(dummyStderr.writeStream),
140
+ new TtyStyler(3),
141
+ );
142
+ printerService.colorEnabled = false;
143
+
144
+ await write(printerService.stderrWritable, "hello world");
145
+
146
+ expectStringEquals(dummyStderr.getString(), "hello world");
147
+ });
148
+
149
+ test("Printing to stdout and stderr works", async () => {
150
+ const dummyStdout = new StreamString();
151
+ const dummyStderr = new StreamString();
152
+ const printerService = new DefaultPrinterService(
153
+ dummyStdout.writableStream,
154
+ dummyStderr.writableStream,
155
+ true,
156
+ true,
157
+ new TtyTerminal(dummyStderr.writeStream),
158
+ new TtyStyler(3),
159
+ );
160
+ printerService.colorEnabled = false;
161
+
162
+ await printerService.print("hello stdout\n");
163
+ await printerService.info("hello stderr\n");
164
+
165
+ expectStringEquals(
166
+ dummyStdout.getString(),
167
+ "hello stdout\n",
168
+ );
169
+ expectStringEquals(
170
+ dummyStderr.getString(),
171
+ "hello stderr\n",
172
+ );
173
+ });
174
+
175
+ test("Level filtering works", async () => {
176
+ const dummyStdout = new StreamString();
177
+ const dummyStderr = new StreamString();
178
+ const printerService = new DefaultPrinterService(
179
+ dummyStdout.writableStream,
180
+ dummyStderr.writableStream,
181
+ true,
182
+ true,
183
+ new TtyTerminal(dummyStderr.writeStream),
184
+ new TtyStyler(3),
185
+ );
186
+ printerService.colorEnabled = false;
187
+
188
+ await printerService.debug("hello debug 1\n");
189
+ await printerService.info("hello info 1\n");
190
+ await printerService.warn("hello warn 1\n");
191
+
192
+ expectStringEquals(
193
+ dummyStderr.getString(),
194
+ "hello info 1\nhello warn 1\n",
195
+ );
196
+
197
+ await printerService.setLevel(Level.WARN);
198
+
199
+ await printerService.debug("hello debug 2\n");
200
+ await printerService.info("hello info 2\n");
201
+ await printerService.warn("hello warn 2\n");
202
+
203
+ expectStringEquals(
204
+ dummyStderr.getString(),
205
+ "hello info 1\nhello warn 1\nhello warn 2\n",
206
+ );
207
+
208
+ await printerService.setLevel(Level.DEBUG);
209
+
210
+ await printerService.debug("hello debug 3\n");
211
+ await printerService.info("hello info 3\n");
212
+ await printerService.warn("hello warn 3\n");
213
+
214
+ expectStringEquals(
215
+ dummyStderr.getString(),
216
+ "hello info 1\nhello warn 1\nhello warn 2\nhello debug 3\nhello info 3\nhello warn 3\n",
217
+ );
218
+ });
219
+
220
+ test("Icons work on stderr", async () => {
221
+ const dummyStdout = new StreamString();
222
+ const dummyStderr = new StreamString();
223
+ const printerService = new DefaultPrinterService(
224
+ dummyStdout.writableStream,
225
+ dummyStderr.writableStream,
226
+ true,
227
+ true,
228
+ new TtyTerminal(dummyStderr.writeStream),
229
+ new TtyStyler(3),
230
+ );
231
+ printerService.colorEnabled = false;
232
+
233
+ await printerService.info("hello info", Icon.INFORMATION);
234
+
235
+ expectStringEquals(
236
+ dummyStderr.getString(),
237
+ "ℹ hello info",
238
+ );
239
+
240
+ await printerService.info("hello success", Icon.SUCCESS);
241
+
242
+ expectStringEquals(
243
+ dummyStderr.getString(),
244
+ "ℹ hello info✔ hello success",
245
+ );
246
+ });
247
+
248
+ test("Icons work on stdout", async () => {
249
+ const dummyStdout = new StreamString();
250
+ const dummyStderr = new StreamString();
251
+ const printerService = new DefaultPrinterService(
252
+ dummyStdout.writableStream,
253
+ dummyStderr.writableStream,
254
+ true,
255
+ true,
256
+ new TtyTerminal(dummyStderr.writeStream),
257
+ new TtyStyler(3),
258
+ );
259
+ printerService.colorEnabled = false;
260
+
261
+ await printerService.print("hello info", Icon.INFORMATION);
262
+
263
+ expectStringEquals(
264
+ dummyStdout.getString(),
265
+ "ℹ hello info",
266
+ );
267
+
268
+ await printerService.print("hello success", Icon.SUCCESS);
269
+
270
+ expectStringEquals(
271
+ dummyStdout.getString(),
272
+ "ℹ hello info✔ hello success",
273
+ );
274
+ });
275
+
276
+ test("Spinner works", async () => {
277
+ const dummyStdout = new StreamString();
278
+ const dummyStderr = new StreamString();
279
+ const printerService = new DefaultPrinterService(
280
+ dummyStdout.writableStream,
281
+ dummyStderr.writableStream,
282
+ true,
283
+ true,
284
+ new TtyTerminal(dummyStderr.writeStream),
285
+ new TtyStyler(3),
286
+ );
287
+ printerService.colorEnabled = false;
288
+
289
+ await printerService.showSpinner("hello world");
290
+ await sleep(150);
291
+ await printerService.hideSpinner();
292
+
293
+ expectBytesEquals(
294
+ dummyStderr.getString(),
295
+ new Uint8Array([
296
+ 27,
297
+ 91,
298
+ 63,
299
+ 50,
300
+ 53,
301
+ 108,
302
+ 27,
303
+ 91,
304
+ 50,
305
+ 75,
306
+ 27,
307
+ 91,
308
+ 71,
309
+ 226,
310
+ 160,
311
+ 139,
312
+ 32,
313
+ 104,
314
+ 101,
315
+ 108,
316
+ 108,
317
+ 111,
318
+ 32,
319
+ 119,
320
+ 111,
321
+ 114,
322
+ 108,
323
+ 100,
324
+ 27,
325
+ 91,
326
+ 50,
327
+ 75,
328
+ 27,
329
+ 91,
330
+ 71,
331
+ 27,
332
+ 91,
333
+ 63,
334
+ 50,
335
+ 53,
336
+ 104,
337
+ ]),
338
+ );
339
+ });
340
+
341
+ test("Progress bar works", async () => {
342
+ const dummyStdout = new StreamString();
343
+ const dummyStderr = new StreamString();
344
+ const printerService = new DefaultPrinterService(
345
+ dummyStdout.writableStream,
346
+ dummyStderr.writableStream,
347
+ true,
348
+ true,
349
+ new TtyTerminal(dummyStderr.writeStream),
350
+ new TtyStyler(3),
351
+ );
352
+ printerService.colorEnabled = false;
353
+
354
+ const handle = await printerService.showProgressBar("bits", "foo", 150, 35);
355
+ await sleep(50);
356
+ printerService.updateProgressBar(handle, 50);
357
+ await sleep(50);
358
+ await printerService.hideProgressBar(handle);
359
+ expectStringIncludes(
360
+ dummyStderr.getString(),
361
+ "foo",
362
+ );
363
+ expectStringIncludes(
364
+ dummyStderr.getString(),
365
+ "bits",
366
+ );
367
+ });
368
+
369
+ test("Multiple progress bars work", async () => {
370
+ const dummyStdout = new StreamString();
371
+ const dummyStderr = new StreamString();
372
+ const printerService = new DefaultPrinterService(
373
+ dummyStdout.writableStream,
374
+ dummyStderr.writableStream,
375
+ true,
376
+ true,
377
+ new TtyTerminal(dummyStderr.writeStream),
378
+ new TtyStyler(3),
379
+ );
380
+ printerService.colorEnabled = false;
381
+
382
+ const handle1 = await printerService.showProgressBar("bits", "foo");
383
+ await sleep(50);
384
+ const handle2 = await printerService.showProgressBar("megaflops", "bar");
385
+ await sleep(50);
386
+ printerService.updateProgressBar(handle1, 25, "foo1");
387
+ await sleep(50);
388
+ printerService.updateProgressBar(handle2, 50, "bar1");
389
+ await sleep(50);
390
+ await printerService.hideProgressBar(handle1);
391
+ await printerService.hideProgressBar(handle2);
392
+ expectStringIncludes(
393
+ dummyStderr.getString(),
394
+ "bits",
395
+ );
396
+ expectStringIncludes(
397
+ dummyStderr.getString(),
398
+ "megaflops",
399
+ );
400
+ expectStringIncludes(
401
+ dummyStderr.getString(),
402
+ "foo1",
403
+ );
404
+ expectStringIncludes(
405
+ dummyStderr.getString(),
406
+ "bar1",
407
+ );
408
+ });
409
+ });
@@ -0,0 +1,29 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import DefaultContext from "../../../src/runtime/DefaultContext.ts";
3
+ import { getCLIConfig } from "../../fixtures/CLIConfig.ts";
4
+ import PrinterServiceProvider from "../../../src/service/printer/PrinterServiceProvider.ts";
5
+ import { SHUTDOWN_SERVICE_ID } from "../../../src/api/service/core/ShutdownService.ts";
6
+ import DefaultShutdownService from "../../../src/service/shutdown/DefaultShutdownService.ts";
7
+ import TtyTerminal from "../../../src/service/printer/terminal/TtyTerminal.ts";
8
+ import StreamString from "../../fixtures/StreamString.ts";
9
+
10
+ describe("PrinterServiceProvider Tests", () => {
11
+ test("PrinterServiceProvider provide works", async () => {
12
+ const streamString = new StreamString();
13
+ const printerServiceProvider = new PrinterServiceProvider(
14
+ 100,
15
+ streamString.writableStream,
16
+ new TtyTerminal(streamString.writeStream),
17
+ );
18
+ const cliConfig = getCLIConfig();
19
+ const context = new DefaultContext(cliConfig);
20
+
21
+ context.addServiceInstance(
22
+ SHUTDOWN_SERVICE_ID,
23
+ new DefaultShutdownService(),
24
+ );
25
+
26
+ const serviceInfo = await printerServiceProvider.provide(cliConfig);
27
+ expect(serviceInfo.commands.length).toEqual(3);
28
+ });
29
+ });
@@ -0,0 +1,58 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import DefaultContext from "../../../../src/runtime/DefaultContext.ts";
3
+ import LogLevelCommand from "../../../../src/service/printer/command/LogLevelCommand.ts";
4
+ import { getCLIConfig } from "../../../fixtures/CLIConfig.ts";
5
+ import PrinterServiceProvider from "../../../../src/service/printer/PrinterServiceProvider.ts";
6
+ import { Level } from "../../../../src/api/service/core/PrinterService.ts";
7
+ import ShutdownServiceProvider from "../../../../src/service/shutdown/ShutdownServiceProvider.ts";
8
+ import { SHUTDOWN_SERVICE_ID } from "../../../../src/api/service/core/ShutdownService.ts";
9
+ import TtyTerminal from "../../../../src/service/printer/terminal/TtyTerminal.ts";
10
+ import StreamString from "../../../fixtures/StreamString.ts";
11
+ import DefaultPrinterService from "../../../../src/service/printer/DefaultPrinterService.ts";
12
+ import TtyStyler from "../../../../src/service/printer/terminal/TtyStyler.ts";
13
+
14
+ describe("LogLevelCommand Tests", () => {
15
+ test("LogLevelCommand works", async () => {
16
+ const streamString = new StreamString();
17
+ const printerService = new DefaultPrinterService(
18
+ streamString.writableStream,
19
+ streamString.writableStream,
20
+ true,
21
+ true,
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 = (await shutdownServiceProvider.provide(cliConfig))
34
+ .service!;
35
+
36
+ context.addServiceInstance(SHUTDOWN_SERVICE_ID, shutdownService);
37
+
38
+ await printerServiceProvider.provide(cliConfig);
39
+
40
+ const logLevelCommand = new LogLevelCommand(printerServiceProvider, 100);
41
+
42
+ expect(
43
+ printerServiceProvider.printerService!.getLevel(),
44
+ ).toEqual(
45
+ Level.INFO,
46
+ );
47
+
48
+ await logLevelCommand.execute(context, "ERROR");
49
+
50
+ expect(
51
+ printerServiceProvider.printerService!.getLevel(),
52
+ ).toEqual(
53
+ Level.ERROR,
54
+ );
55
+
56
+ await ShutdownServiceProvider.shutdown();
57
+ });
58
+ });
@@ -0,0 +1,40 @@
1
+ import { describe, test } from "bun:test";
2
+ import Progress from "../../../../src/service/printer/terminal/Progress.ts";
3
+ import { sleep } from "../../../fixtures/util.ts";
4
+ import TtyTerminal from "../../../../src/service/printer/terminal/TtyTerminal.ts";
5
+ import StreamString from "../../../fixtures/StreamString.ts";
6
+ import TtyStyler from "../../../../src/service/printer/terminal/TtyStyler.ts";
7
+
8
+ describe("Progress Tests", () => {
9
+ test("Progress works", async () => {
10
+ const streamString = new StreamString();
11
+ const terminal = new TtyTerminal(streamString.writeStream);
12
+ const progress = new Progress(terminal, new TtyStyler(3));
13
+
14
+ const handle = progress.add("foo", "bar", 100, 0);
15
+ await sleep(150);
16
+ progress.update(handle, 50, "bar2");
17
+ await sleep(150);
18
+ progress.update(handle, 150, "bar3");
19
+ await sleep(150);
20
+ await progress.hide(handle);
21
+ });
22
+
23
+ test("Multiple progress works", async () => {
24
+ const streamString = new StreamString();
25
+ const terminal = new TtyTerminal(streamString.writeStream);
26
+ const progress = new Progress(terminal, new TtyStyler(3));
27
+
28
+ const handle1 = progress.add("foo1", "bar2", 100, 0);
29
+ const handle2 = progress.add("foo2", "bar2", 200, 0);
30
+ await sleep(150);
31
+ progress.update(handle1, 50, "bar3");
32
+ await sleep(150);
33
+ progress.update(handle2, 100, "bar4");
34
+ await sleep(150);
35
+ progress.update(handle1, 50, "bar3");
36
+ progress.update(handle2, 200, "bar5 very long string now");
37
+ await sleep(150);
38
+ await progress.hideAll();
39
+ });
40
+ });
@@ -0,0 +1,57 @@
1
+ import { describe, test } from "bun:test";
2
+ import Spinner from "../../../../src/service/printer/terminal/Spinner.ts";
3
+ import {
4
+ expectStringEquals,
5
+ expectStringIncludes,
6
+ sleep,
7
+ } from "../../../fixtures/util.ts";
8
+ import TtyTerminal from "../../../../src/service/printer/terminal/TtyTerminal.ts";
9
+ import StreamString from "../../../fixtures/StreamString.ts";
10
+ import TtyStyler from "../../../../src/service/printer/terminal/TtyStyler.ts";
11
+
12
+ describe("Spinner Tests", () => {
13
+ test("Spinner works", async () => {
14
+ const streamString = new StreamString();
15
+ const terminal = new TtyTerminal(streamString.writeStream);
16
+ const spinner = new Spinner(terminal, new TtyStyler(3));
17
+
18
+ await spinner.show();
19
+ await sleep(250);
20
+ await spinner.hide();
21
+
22
+ expectStringEquals(streamString.getString(), "⠋⠙");
23
+ });
24
+
25
+ test("Calling show and hide multiple times works", async () => {
26
+ const streamString = new StreamString();
27
+ const terminal = new TtyTerminal(streamString.writeStream);
28
+ const spinner = new Spinner(terminal, new TtyStyler(3));
29
+
30
+ await spinner.show();
31
+ await sleep(50);
32
+ await spinner.show();
33
+ await sleep(50);
34
+ await spinner.hide();
35
+ await sleep(50);
36
+ await spinner.hide();
37
+ });
38
+
39
+ test("Updating the spinner message works", async () => {
40
+ const streamString = new StreamString();
41
+ const terminal = new TtyTerminal(streamString.writeStream);
42
+ const spinner = new Spinner(terminal, new TtyStyler(3));
43
+
44
+ await spinner.show();
45
+ await sleep(150);
46
+ await spinner.show("foo");
47
+ await sleep(120);
48
+ await spinner.show("bar");
49
+ await sleep(120);
50
+ await spinner.show();
51
+ await sleep(120);
52
+ await spinner.hide();
53
+
54
+ expectStringIncludes(streamString.getString(), "foo");
55
+ expectStringIncludes(streamString.getString(), "bar");
56
+ });
57
+ });
@@ -0,0 +1,13 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import ShutdownServiceProvider from "../../../src/service/shutdown/ShutdownServiceProvider.ts";
3
+ import { getCLIConfig } from "../../fixtures/CLIConfig.ts";
4
+
5
+ describe("ShutdownServiceProvider Tests", () => {
6
+ test("ShutdownServiceProvider provide works", async () => {
7
+ const shutdownServiceProvider = new ShutdownServiceProvider(100);
8
+ const serviceInfo = await shutdownServiceProvider.provide(getCLIConfig());
9
+ expect(serviceInfo.commands.length).toEqual(0);
10
+
11
+ await ShutdownServiceProvider.shutdown();
12
+ });
13
+ });