@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.
- package/README/core-service-providers.md +2 -2
- package/README/development.md +3 -6
- package/README/implementation-details.md +17 -17
- package/README/key-concepts.md +17 -17
- package/README.md +4 -4
- package/bun.lock +0 -2
- package/index.ts +22 -30
- package/package.json +19 -19
- package/src/api/argument/Argument.ts +1 -1
- package/src/api/argument/ArgumentValueTypes.ts +3 -10
- package/src/api/argument/ComplexOption.ts +5 -9
- package/src/api/command/GlobalCommand.ts +1 -4
- package/src/api/service/core/ArgumentPrompterService.ts +1 -3
- package/src/api/service/core/AsciiBannerGeneratorService.ts +1 -4
- package/src/api/service/core/CompletionService.ts +2 -6
- package/src/api/service/core/ImagePrinterService.ts +1 -2
- package/src/api/service/core/KeyValueService.ts +1 -2
- package/src/api/service/core/PrettyPrinterService.ts +1 -4
- package/src/api/service/core/PrinterService.ts +8 -9
- package/src/api/service/core/PrompterService.ts +4 -11
- package/src/api/service/core/ShutdownService.ts +1 -2
- package/src/api/service/core/SyntaxHighlighterService.ts +1 -5
- package/src/api/service/core/Table.ts +7 -25
- package/src/api/service/core/TreePrinterService.ts +1 -2
- package/src/cli/BaseCLI.ts +17 -47
- package/src/cli/DefaultRuntimeCLI.ts +1 -4
- package/src/command/CompletionCommand.ts +19 -45
- package/src/command/MultiCommandCliHelpCommand.ts +45 -92
- package/src/command/SingleCommandCliHelpCommand.ts +17 -28
- package/src/command/UsageCommand.ts +6 -12
- package/src/command/VersionCommand.ts +2 -6
- package/src/launcher.ts +4 -2
- package/src/runtime/DefaultContext.ts +2 -5
- package/src/runtime/argument/ArgumentTypeGuards.ts +1 -3
- package/src/runtime/command/CommandTypeGuards.ts +5 -14
- package/src/runtime/command/CommandValidator.ts +56 -118
- package/src/runtime/parser.ts +13 -17
- package/src/runtime/registry/CommandRegistry.ts +2 -7
- package/src/runtime/registry/DefaultCommandRegistry.ts +32 -84
- package/src/runtime/registry/DefaultServiceProviderRegistry.ts +3 -9
- package/src/runtime/runner.ts +103 -142
- package/src/runtime/scanner.ts +28 -46
- package/src/runtime/values/ValuePopulationResult.ts +1 -2
- package/src/runtime/values/argumentValueMerge.ts +16 -28
- package/src/runtime/values/argumentValueValidation.ts +21 -67
- package/src/runtime/values/globalCommandValuePopulation.ts +9 -18
- package/src/runtime/values/subCommandValuePopulation.ts +42 -65
- package/src/service/argumentPrompter/ArgumentPrompterServiceProvider.ts +3 -10
- package/src/service/argumentPrompter/DefaultArgumentPrompterService.ts +22 -59
- package/src/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.ts +5 -14
- package/src/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.ts +59 -77
- package/src/service/banner/BannerServiceProvider.ts +13 -35
- package/src/service/banner/command/NoBannerCommand.ts +2 -8
- package/src/service/chiselAsciiBannerGenerator/ChiselFontAsciiBannerGeneratorService.ts +5 -10
- package/src/service/completion/CompletionServiceProvider.ts +20 -48
- package/src/service/completion/DefaultCompletionService.ts +17 -56
- package/src/service/completion/shell/ShellHandler.ts +1 -3
- package/src/service/completion/shell/fish.ts +1 -1
- package/src/service/completion/shell/powershell.ts +2 -12
- package/src/service/completion/shell/zsh.ts +1 -1
- package/src/service/configuration/ConfigurationServiceProvider.ts +40 -133
- package/src/service/configuration/DefaultKeyValueService.ts +6 -20
- package/src/service/configuration/DefaultSecretService.ts +10 -14
- package/src/service/configuration/command/ConfigCommand.ts +1 -4
- package/src/service/configuration/command/DumpConfigCommand.ts +9 -21
- package/src/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.ts +5 -14
- package/src/service/dataDumpGenerator/DefaultDataDumpGeneratorService.ts +5 -12
- package/src/service/imagePrinter/DefaultImagePrinterService.ts +1 -5
- package/src/service/imagePrinter/ImagePrinterServiceProvider.ts +1 -4
- package/src/service/prettyPrinter/DefaultPrettyPrinterService.ts +4 -12
- package/src/service/prettyPrinter/PrettyPrinterServiceProvider.ts +3 -10
- package/src/service/printer/DefaultPrinterService.ts +20 -83
- package/src/service/printer/PrinterServiceProvider.ts +3 -11
- package/src/service/printer/command/DarkModeCommand.ts +3 -10
- package/src/service/printer/command/LogLevelCommand.ts +7 -26
- package/src/service/printer/command/NoColorCommand.ts +3 -10
- package/src/service/printer/command/NoHyperlinksCommand.ts +3 -10
- package/src/service/printer/terminal/Progress.ts +99 -90
- package/src/service/printer/terminal/Spinner.ts +7 -26
- package/src/service/prompter/DefaultPrompterService.ts +2 -6
- package/src/service/prompter/PrompterServiceProvider.ts +3 -11
- package/src/service/prompter/command/NoPromptCommand.ts +3 -10
- package/src/service/prompter/prompt/PromptContext.ts +5 -18
- package/src/service/prompter/prompt/promptMultiSelect.ts +6 -21
- package/src/service/prompter/prompt/promptOpenUrl.ts +7 -22
- package/src/service/prompter/prompt/promptSingleSelect.ts +6 -23
- package/src/service/prompter/prompt/promptText.ts +10 -27
- package/src/service/prompter/prompt/promptToggle.ts +8 -8
- package/src/service/shutdown/ShutdownServiceProvider.ts +3 -10
- package/src/service/syntaxHighlighter/DefaultSyntaxHighlighterService.ts +13 -26
- package/src/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.ts +8 -21
- package/src/service/tableGenerator/DefaultTableGeneratorService.ts +44 -68
- package/src/service/tableGenerator/TableGeneratorServiceProvider.ts +7 -16
- package/src/service/treePrinter/DefaultTreePrinterService.ts +2 -7
- package/src/service/treePrinter/TreePrinterServiceProvider.ts +4 -12
- package/src/terminal/ImageRenderer.ts +35 -54
- package/src/terminal/PngDecoder.ts +10 -19
- package/src/terminal/TtyStyler.ts +11 -9
- package/src/terminal/TtyTerminal.ts +2 -10
- package/src/terminal/supportsHyperlinks.ts +4 -10
- package/src/util/configHelper.ts +3 -10
- package/src/util/envVarHelper.ts +50 -88
- package/src/util/helpHelper.ts +123 -193
- package/src/util/logger.ts +12 -42
- package/src/util/runnerHelper.ts +20 -61
- package/tests/cli/BaseCLI.test.ts +23 -80
- package/tests/command/CompletionCommand.test.ts +1 -6
- package/tests/command/MultiCommandCliHelpCommand.test.ts +51 -205
- package/tests/command/SingleCommandCliHelpCommand.test.ts +21 -103
- package/tests/command/UsageCommand.test.ts +4 -10
- package/tests/fixtures/Command.ts +87 -68
- package/tests/fixtures/CommandRegistry.ts +1 -3
- package/tests/fixtures/Context.ts +3 -11
- package/tests/fixtures/ServiceProviderRegistry.ts +1 -1
- package/tests/fixtures/prettierPluginFoo.ts +1 -1
- package/tests/fixtures/util.ts +2 -8
- package/tests/runtime/argument/ArgumentTypeGuards.test.ts +1 -3
- package/tests/runtime/command/CommandValidator.test.ts +881 -604
- package/tests/runtime/parser.test.ts +222 -246
- package/tests/runtime/registry/DefaultCommandRegistry.test.ts +15 -37
- package/tests/runtime/registry/DefaultServiceProviderRegistry.test.ts +2 -8
- package/tests/runtime/runner.test.ts +231 -281
- package/tests/runtime/scanner.test.ts +277 -475
- package/tests/runtime/values/argumentValueMerge.test.ts +133 -81
- package/tests/runtime/values/argumentValueValidation.test.ts +444 -588
- package/tests/runtime/values/globalCommandValuePopulation.test.ts +71 -253
- package/tests/runtime/values/subCommandValuePopulation.test.ts +1342 -1570
- package/tests/service/argumentPrompter/ArgumentPrompterServiceProvider.test.ts +3 -12
- package/tests/service/argumentPrompter/DefaultArgumentPrompterService.test.ts +36 -45
- package/tests/service/asciiBannerGenerator/AsciiBannerGeneratorServiceProvider.test.ts +2 -8
- package/tests/service/asciiBannerGenerator/DefaultAsciiBannerGeneratorService.test.ts +40 -62
- package/tests/service/banner/BannerServiceProvider.test.ts +5 -18
- package/tests/service/banner/command/NoBannerCommand.test.ts +1 -4
- package/tests/service/completion/CompletionServiceProvider.test.ts +145 -214
- package/tests/service/completion/DefaultCompletionService.test.ts +17 -79
- package/tests/service/completion/shell/fish.test.ts +1 -3
- package/tests/service/configuration/ConfigurationServiceProvider.test.ts +26 -75
- package/tests/service/configuration/DefaultKeyValueService.test.ts +9 -21
- package/tests/service/configuration/DefaultSecretService.test.ts +7 -15
- package/tests/service/configuration/command/DumpConfigCommand.test.ts +4 -13
- package/tests/service/dataDumpGenerator/DataDumpGeneratorServiceProvider.test.ts +6 -12
- package/tests/service/dataDumpGenerator/DefaultDataDumpGeneratorService.test.ts +1 -10
- package/tests/service/imagePrinter/DefaultImagePrinterService.test.ts +5 -70
- package/tests/service/prettyPrinter/DefaultPrettyPrinterService.test.ts +4 -11
- package/tests/service/prettyPrinter/PrettyPrinterServiceProvider.test.ts +2 -6
- package/tests/service/printer/DefaultPrinterService.test.ts +57 -255
- package/tests/service/printer/PrinterServiceProvider.test.ts +2 -8
- package/tests/service/printer/command/DarkModeCommand.test.ts +4 -12
- package/tests/service/printer/command/LogLevelCommand.test.ts +4 -17
- package/tests/service/printer/command/NoColorCommand.test.ts +4 -12
- package/tests/service/printer/command/NoHyperlinksCommand.test.ts +7 -21
- package/tests/service/printer/terminal/Progress.test.ts +1 -3
- package/tests/service/printer/terminal/Spinner.test.ts +2 -8
- package/tests/service/prompter/DefaultPrompterService.test.ts +52 -69
- package/tests/service/prompter/PrompterServiceProvider.test.ts +2 -8
- package/tests/service/shutdown/ShutdownServiceProvider.test.ts +1 -3
- package/tests/service/syntaxHighlighter/DefaultSyntaxHighlighterService.test.ts +13 -99
- package/tests/service/syntaxHighlighter/SyntaxHighlighterServiceProvider.test.ts +2 -7
- package/tests/service/tableGenerator/DefaultTableGeneratorService.test.ts +12 -33
- package/tests/service/tableGenerator/TableGeneratorServiceProvider.test.ts +2 -2
- package/tests/service/treePrinter/DefaultTreePrinterService.test.ts +4 -6
- package/tests/service/treePrinter/TreePrinterServiceProvider.test.ts +4 -8
- package/tests/terminal/ImageRenderer.test.ts +2 -11
- package/tests/terminal/PngDecoder.test.ts +2 -6
- package/tests/util/configHelper.test.ts +55 -137
- package/tests/util/envVarHelper.test.ts +46 -110
|
@@ -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
|
-
"
|
|
422
|
-
|
|
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
|
-
"
|
|
473
|
-
|
|
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(
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
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(
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
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
|
-
"
|
|
54
|
-
|
|
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
|
-
"
|
|
67
|
-
|
|
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
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
172
|
-
|
|
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
|
-
//
|
|
176
|
-
const codes = [...firstLine.matchAll(
|
|
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
|
|
197
|
-
|
|
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
|
-
//
|
|
201
|
-
const codes = [...firstLine.matchAll(
|
|
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
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
});
|