@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
|
@@ -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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
259
|
-
)
|
|
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
|
-
|
|
81
|
-
)
|
|
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
|
-
|
|
76
|
-
)
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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);
|