@avandar/acclimate 0.1.4 → 0.2.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/dist/index.cjs +70 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +70 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -7,6 +7,7 @@ var tsPattern = require('ts-pattern');
|
|
|
7
7
|
var CLIError = class _CLIError extends Error {
|
|
8
8
|
static invalidCLIParamValue(options) {
|
|
9
9
|
return new _CLIError({
|
|
10
|
+
cliName: options.cliName,
|
|
10
11
|
message: options.message ?? `Invalid value for CLI param "${options.paramName}"`,
|
|
11
12
|
code: "invalid_cli_param_value",
|
|
12
13
|
details: { paramName: options.paramName, paramValue: options.paramValue }
|
|
@@ -14,6 +15,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
14
15
|
}
|
|
15
16
|
static missingRequiredOption(options) {
|
|
16
17
|
return new _CLIError({
|
|
18
|
+
cliName: options.cliName,
|
|
17
19
|
message: options.message ?? `Required option "${options.optionName}" is missing`,
|
|
18
20
|
code: "missing_required_option",
|
|
19
21
|
details: { optionName: options.optionName }
|
|
@@ -21,6 +23,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
21
23
|
}
|
|
22
24
|
static missingRequiredPositionalArg(options) {
|
|
23
25
|
return new _CLIError({
|
|
26
|
+
cliName: options.cliName,
|
|
24
27
|
message: options.message ?? `Required positional argument "${options.positionalArgName}" is missing`,
|
|
25
28
|
code: "missing_required_positional_arg",
|
|
26
29
|
details: { positionalArgName: options.positionalArgName }
|
|
@@ -28,6 +31,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
28
31
|
}
|
|
29
32
|
static unknownOption(options) {
|
|
30
33
|
return new _CLIError({
|
|
34
|
+
cliName: options.cliName,
|
|
31
35
|
message: options.message ?? `Option "${options.optionName}" not found`,
|
|
32
36
|
code: "unknown_option",
|
|
33
37
|
details: { optionName: options.optionName }
|
|
@@ -35,6 +39,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
35
39
|
}
|
|
36
40
|
static tooManyPositionalArgs(options) {
|
|
37
41
|
return new _CLIError({
|
|
42
|
+
cliName: options.cliName,
|
|
38
43
|
message: options.message ?? "Too many positional arguments provided.",
|
|
39
44
|
code: "too_many_positional_args",
|
|
40
45
|
details: { count: options.count }
|
|
@@ -42,6 +47,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
42
47
|
}
|
|
43
48
|
static invalidPositionalArgConfig(options) {
|
|
44
49
|
return new _CLIError({
|
|
50
|
+
cliName: options.cliName,
|
|
45
51
|
message: options.message ?? `Positional argument configuration for "${options.positionalArgName}" is invalid`,
|
|
46
52
|
code: "invalid_positional_arg_config",
|
|
47
53
|
details: { positionalArgName: options.positionalArgName }
|
|
@@ -49,27 +55,33 @@ var CLIError = class _CLIError extends Error {
|
|
|
49
55
|
}
|
|
50
56
|
static unknownCommand(options) {
|
|
51
57
|
return new _CLIError({
|
|
58
|
+
cliName: options.cliName,
|
|
52
59
|
message: options.message ?? `Command "${options.commandName}" not found`,
|
|
53
60
|
code: "unknown_command",
|
|
54
61
|
details: { commandName: options.commandName }
|
|
55
62
|
});
|
|
56
63
|
}
|
|
57
|
-
static alreadyRun(options
|
|
64
|
+
static alreadyRun(options) {
|
|
58
65
|
return new _CLIError({
|
|
66
|
+
cliName: options.cliName,
|
|
59
67
|
message: options.message ?? "CLI has already been run",
|
|
60
68
|
code: "already_run",
|
|
61
69
|
details: void 0
|
|
62
70
|
});
|
|
63
71
|
}
|
|
64
72
|
constructor(options) {
|
|
65
|
-
super(`\u274C ${options.message}`);
|
|
73
|
+
super(`\u274C Error running ${options.cliName}: ${options.message}`);
|
|
66
74
|
}
|
|
67
75
|
};
|
|
68
76
|
|
|
69
77
|
// src/AcclimateCLI/AcclimateCLI.ts
|
|
70
78
|
function AcclimateCLI(state) {
|
|
79
|
+
const cliName = state.name;
|
|
71
80
|
return {
|
|
72
81
|
state,
|
|
82
|
+
getName: () => {
|
|
83
|
+
return cliName;
|
|
84
|
+
},
|
|
73
85
|
action: (action) => {
|
|
74
86
|
return AcclimateCLI({
|
|
75
87
|
...state,
|
|
@@ -87,6 +99,7 @@ function AcclimateCLI(state) {
|
|
|
87
99
|
return !p.required;
|
|
88
100
|
})) {
|
|
89
101
|
throw CLIError.invalidPositionalArgConfig({
|
|
102
|
+
cliName,
|
|
90
103
|
positionalArgName: param.name,
|
|
91
104
|
message: "Required positional arguments must be before optional positional arguments"
|
|
92
105
|
});
|
|
@@ -143,6 +156,7 @@ function AcclimateCLI(state) {
|
|
|
143
156
|
const cmd = state.commands[commandName];
|
|
144
157
|
if (!cmd) {
|
|
145
158
|
throw CLIError.unknownCommand({
|
|
159
|
+
cliName,
|
|
146
160
|
commandName,
|
|
147
161
|
message: `Command "${commandName}" not found`
|
|
148
162
|
});
|
|
@@ -178,7 +192,7 @@ function isEmptyObject(obj) {
|
|
|
178
192
|
return Object.keys(obj).length === 0;
|
|
179
193
|
}
|
|
180
194
|
function _validateParsedValue(options) {
|
|
181
|
-
const { parsedValue, paramConfig } = options;
|
|
195
|
+
const { parsedValue, paramConfig, cliName } = options;
|
|
182
196
|
if (paramConfig.validator) {
|
|
183
197
|
const validator = paramConfig.validator;
|
|
184
198
|
const validationResult = validator(parsedValue);
|
|
@@ -186,6 +200,7 @@ function _validateParsedValue(options) {
|
|
|
186
200
|
return parsedValue;
|
|
187
201
|
}
|
|
188
202
|
throw CLIError.invalidCLIParamValue({
|
|
203
|
+
cliName,
|
|
189
204
|
paramName: paramConfig.name,
|
|
190
205
|
paramValue: parsedValue,
|
|
191
206
|
message: typeof validationResult === "string" ? validationResult : void 0
|
|
@@ -194,20 +209,13 @@ function _validateParsedValue(options) {
|
|
|
194
209
|
return parsedValue;
|
|
195
210
|
}
|
|
196
211
|
function _parseAndValidateValue(options) {
|
|
197
|
-
const { inputValue, defaultValue, paramConfig } = options;
|
|
212
|
+
const { cliName, inputValue, defaultValue, paramConfig } = options;
|
|
198
213
|
if (inputValue === void 0) {
|
|
199
214
|
if (defaultValue === void 0) {
|
|
200
|
-
|
|
201
|
-
throw CLIError.missingRequiredOption({
|
|
202
|
-
optionName: paramConfig.name
|
|
203
|
-
});
|
|
204
|
-
} else {
|
|
205
|
-
throw CLIError.missingRequiredPositionalArg({
|
|
206
|
-
positionalArgName: paramConfig.name
|
|
207
|
-
});
|
|
208
|
-
}
|
|
215
|
+
return void 0;
|
|
209
216
|
}
|
|
210
217
|
return _validateParsedValue({
|
|
218
|
+
cliName,
|
|
211
219
|
parsedValue: defaultValue,
|
|
212
220
|
paramConfig
|
|
213
221
|
});
|
|
@@ -222,6 +230,7 @@ function _parseAndValidateValue(options) {
|
|
|
222
230
|
return inputValue;
|
|
223
231
|
});
|
|
224
232
|
return _validateParsedValue({
|
|
233
|
+
cliName,
|
|
225
234
|
parsedValue,
|
|
226
235
|
paramConfig
|
|
227
236
|
});
|
|
@@ -271,8 +280,10 @@ function _runCLIHelper(options) {
|
|
|
271
280
|
cli: commandCLI
|
|
272
281
|
});
|
|
273
282
|
}
|
|
283
|
+
const cliName = cli.getName();
|
|
274
284
|
if (rawPositionalArgs.length > cli.state.positionalArgs.length) {
|
|
275
285
|
throw CLIError.tooManyPositionalArgs({
|
|
286
|
+
cliName,
|
|
276
287
|
count: rawPositionalArgs.length
|
|
277
288
|
});
|
|
278
289
|
}
|
|
@@ -281,10 +292,12 @@ function _runCLIHelper(options) {
|
|
|
281
292
|
const rawVal = rawPositionalArgs[idx];
|
|
282
293
|
if (argConfig.required && rawVal === void 0) {
|
|
283
294
|
throw CLIError.missingRequiredPositionalArg({
|
|
295
|
+
cliName,
|
|
284
296
|
positionalArgName: argConfig.name
|
|
285
297
|
});
|
|
286
298
|
}
|
|
287
299
|
acc[argConfig.name] = _parseAndValidateValue({
|
|
300
|
+
cliName,
|
|
288
301
|
inputValue: rawVal,
|
|
289
302
|
defaultValue: argConfig.defaultValue,
|
|
290
303
|
paramConfig: argConfig
|
|
@@ -300,10 +313,12 @@ function _runCLIHelper(options) {
|
|
|
300
313
|
const rawVal = rawOptionArgs[argConfig.name];
|
|
301
314
|
if (argConfig.required && rawVal === void 0) {
|
|
302
315
|
throw CLIError.missingRequiredOption({
|
|
316
|
+
cliName,
|
|
303
317
|
optionName: argConfig.name
|
|
304
318
|
});
|
|
305
319
|
}
|
|
306
320
|
acc[changeCase.camelCase(argConfig.name)] = _parseAndValidateValue({
|
|
321
|
+
cliName,
|
|
307
322
|
inputValue: rawVal,
|
|
308
323
|
defaultValue: argConfig.defaultValue,
|
|
309
324
|
paramConfig: argConfig
|
|
@@ -319,10 +334,12 @@ function _runCLIHelper(options) {
|
|
|
319
334
|
const rawVal = rawGlobalOptionArgs[argConfig.name];
|
|
320
335
|
if (argConfig.required && rawVal === void 0) {
|
|
321
336
|
throw CLIError.missingRequiredOption({
|
|
337
|
+
cliName,
|
|
322
338
|
optionName: argConfig.name
|
|
323
339
|
});
|
|
324
340
|
}
|
|
325
341
|
acc[changeCase.camelCase(argConfig.name)] = _parseAndValidateValue({
|
|
342
|
+
cliName,
|
|
326
343
|
inputValue: rawVal,
|
|
327
344
|
defaultValue: argConfig.defaultValue,
|
|
328
345
|
paramConfig: argConfig
|
|
@@ -369,10 +386,50 @@ function runCLI(options) {
|
|
|
369
386
|
}
|
|
370
387
|
|
|
371
388
|
// src/Acclimate.ts
|
|
389
|
+
var COLOR_CODES = {
|
|
390
|
+
reset: "\x1B[0m",
|
|
391
|
+
black: "\x1B[30m",
|
|
392
|
+
red: "\x1B[31m",
|
|
393
|
+
green: "\x1B[32m",
|
|
394
|
+
yellow: "\x1B[33m",
|
|
395
|
+
blue: "\x1B[34m",
|
|
396
|
+
magenta: "\x1B[35m",
|
|
397
|
+
cyan: "\x1B[36m",
|
|
398
|
+
white: "\x1B[37m",
|
|
399
|
+
bright_black: "\x1B[90m",
|
|
400
|
+
gray: "\x1B[90m",
|
|
401
|
+
grey: "\x1B[90m",
|
|
402
|
+
bright_red: "\x1B[91m",
|
|
403
|
+
bright_green: "\x1B[92m",
|
|
404
|
+
bright_yellow: "\x1B[93m",
|
|
405
|
+
bright_blue: "\x1B[94m",
|
|
406
|
+
bright_magenta: "\x1B[95m",
|
|
407
|
+
bright_cyan: "\x1B[96m",
|
|
408
|
+
bright_white: "\x1B[97m"
|
|
409
|
+
};
|
|
410
|
+
var PARAM_TOKEN_REGEX = /\$([a-zA-Z0-9_]+)\$/g;
|
|
411
|
+
var COLOR_TOKEN_REGEX = /\|([a-zA-Z_]+)\|/g;
|
|
412
|
+
function interpolateParams(message, params) {
|
|
413
|
+
return message.replace(PARAM_TOKEN_REGEX, (match2, key) => {
|
|
414
|
+
const value = params[key];
|
|
415
|
+
return value ?? match2;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
function applyColors(message) {
|
|
419
|
+
return message.replace(COLOR_TOKEN_REGEX, (match2, colorName) => {
|
|
420
|
+
const code = COLOR_CODES[colorName.toLowerCase()];
|
|
421
|
+
return code ?? match2;
|
|
422
|
+
});
|
|
423
|
+
}
|
|
372
424
|
var Acclimate = {
|
|
373
425
|
createCLI,
|
|
374
426
|
run: (cli) => {
|
|
375
427
|
runCLI({ cli, input: process.argv.slice(2) });
|
|
428
|
+
},
|
|
429
|
+
log: (message, params = {}) => {
|
|
430
|
+
const interpolated = interpolateParams(message, params);
|
|
431
|
+
const colorized = applyColors(interpolated);
|
|
432
|
+
console.log(colorized);
|
|
376
433
|
}
|
|
377
434
|
};
|
|
378
435
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CLIError.ts","../src/AcclimateCLI/AcclimateCLI.ts","../src/AcclimateCLI/createCLI/defaultCLIState.ts","../src/AcclimateCLI/createCLI/createCLI.ts","../src/AcclimateCLI/runCLI/runCLI.ts","../src/Acclimate.ts"],"names":["match","camelCase"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CLIParamDataType } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype CLIErrorInfo =\n | {\n code: \"already_run\";\n details: undefined;\n }\n | {\n code: \"unknown_command\";\n details: { commandName: string };\n }\n | {\n code: \"invalid_positional_arg_config\";\n details: { positionalArgName: string };\n }\n | {\n code: \"too_many_positional_args\";\n details: { count: number };\n }\n | {\n code: \"missing_required_positional_arg\";\n details: { positionalArgName: string };\n }\n | {\n code: \"missing_required_option\";\n details: { optionName: string };\n }\n | {\n code: \"unknown_option\";\n details: {\n optionName: string;\n };\n }\n | {\n code: \"invalid_cli_param_value\";\n details: {\n paramName: string;\n paramValue: CLIParamDataType;\n };\n }\n | { code: \"unknown_error\"; details: undefined };\n\ntype CLIErrorOptions = { message: string } & CLIErrorInfo;\n\nexport class CLIError extends Error {\n static invalidCLIParamValue(options: {\n paramName: string;\n paramValue: CLIParamDataType;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ?? `Invalid value for CLI param \"${options.paramName}\"`,\n code: \"invalid_cli_param_value\",\n details: { paramName: options.paramName, paramValue: options.paramValue },\n });\n }\n static missingRequiredOption(options: {\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ?? `Required option \"${options.optionName}\" is missing`,\n code: \"missing_required_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static missingRequiredPositionalArg(options: {\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ??\n `Required positional argument \"${options.positionalArgName}\" is missing`,\n code: \"missing_required_positional_arg\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownOption(options: {\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? `Option \"${options.optionName}\" not found`,\n code: \"unknown_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static tooManyPositionalArgs(options: {\n count: number;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? \"Too many positional arguments provided.\",\n code: \"too_many_positional_args\",\n details: { count: options.count },\n });\n }\n\n static invalidPositionalArgConfig(options: {\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ??\n `Positional argument configuration for \"${options.positionalArgName}\" is invalid`,\n code: \"invalid_positional_arg_config\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownCommand(options: {\n commandName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? `Command \"${options.commandName}\" not found`,\n code: \"unknown_command\",\n details: { commandName: options.commandName },\n });\n }\n\n static alreadyRun(options: { message?: string } = {}): CLIError {\n return new CLIError({\n message: options.message ?? \"CLI has already been run\",\n code: \"already_run\",\n details: undefined,\n });\n }\n\n constructor(options: CLIErrorOptions) {\n super(`❌ ${options.message}`);\n }\n}\n","import { CLIError } from \"@/CLIError\";\nimport type {\n AddEntry,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionParam,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n} from \"./AcclimateCLI.types\";\nimport type { EmptyObject, Simplify } from \"type-fest\";\n\nexport function AcclimateCLI<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, IAcclimateCLI> | EmptyObject,\n>(\n state: CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >,\n): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n> {\n return {\n state,\n\n action: (\n action: (\n args: Simplify<\n FullCLIArgValues<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams\n >\n >,\n ) => void,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n action,\n });\n },\n\n description: (\n description: string,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n description,\n });\n },\n\n addPositionalArg: <\n PName extends CLIPositionalParamName,\n P extends CLIPositionalParam<PName>,\n >(\n param: P,\n ) => {\n if (\n param.required &&\n state.positionalArgs.some((p) => {\n return !p.required;\n })\n ) {\n throw CLIError.invalidPositionalArgConfig({\n positionalArgName: param.name,\n message:\n \"Required positional arguments must be before optional positional arguments\",\n });\n }\n\n return AcclimateCLI({\n ...state,\n positionalArgs: [\n ...state.positionalArgs,\n { ...param, required: param.required ?? true },\n ],\n } as unknown as CLIState<\n AddEntry<TPositionalParams, P[\"name\"], P>,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addGlobalOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n globalOptionArgs: {\n ...state.globalOptionArgs,\n [param.name]: param,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >);\n },\n\n addOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n optionArgs: { ...state.optionArgs, [param.name]: param },\n } as unknown as CLIState<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addCommand: <C extends CLICommandName, CommandCLI extends IAcclimateCLI>(\n commandName: C,\n cli: CommandCLI,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n > => {\n return AcclimateCLI({\n ...state,\n commands: {\n ...state.commands,\n [commandName]: cli,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n >);\n },\n\n getCommandCLI: <C extends Extract<keyof TCommands, CLICommandName>>(\n commandName: C,\n ): C extends keyof TCommands ? TCommands[C] : never => {\n const cmd = state.commands[commandName];\n if (!cmd) {\n throw CLIError.unknownCommand({\n commandName,\n message: `Command \"${commandName}\" not found`,\n });\n }\n return cmd as C extends keyof TCommands ? TCommands[C] : never;\n },\n };\n}\n","import type { CLIState } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nexport const defaultCLIState: Omit<\n CLIState<EmptyObject, EmptyObject, EmptyObject, EmptyObject>,\n \"name\"\n> = {\n aliases: {},\n description: undefined,\n commands: {},\n positionalArgs: [],\n optionArgs: {},\n globalOptionArgs: {},\n action: () => {},\n};\n","import { AcclimateCLI } from \"../AcclimateCLI\";\nimport { defaultCLIState } from \"./defaultCLIState\";\nimport type { IAcclimateCLI } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\n/**\n * Builder function to create a new CLI instance with a given name.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\nexport function createCLI(\n name: string,\n): IAcclimateCLI<EmptyObject, EmptyObject, EmptyObject, EmptyObject> {\n return AcclimateCLI({ ...defaultCLIState, name });\n}\n","import { camelCase } from \"change-case\";\nimport { match } from \"ts-pattern\";\nimport { CLIError } from \"@/CLIError\";\nimport type {\n AnyCLI,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionAlias,\n CLIOptionParam,\n CLIParam,\n CLIParamDataType,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n ValueOfParam,\n} from \"@/AcclimateCLI/AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nfunction _isValidFullOptionName(name: string): name is CLIFullOptionName {\n return name.startsWith(\"--\");\n}\n\nfunction _isValidOptionAlias(name: string): name is CLIOptionAlias {\n return name.startsWith(\"-\");\n}\n\nfunction isEmptyObject(obj: object): obj is EmptyObject {\n return Object.keys(obj).length === 0;\n}\n\nfunction _validateParsedValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: { parsedValue: PValue; paramConfig: P }): PValue {\n const { parsedValue, paramConfig } = options;\n if (paramConfig.validator) {\n const validator = paramConfig.validator as (\n value: PValue,\n ) => boolean | string;\n const validationResult = validator(parsedValue);\n if (validationResult === true) {\n return parsedValue;\n }\n throw CLIError.invalidCLIParamValue({\n paramName: paramConfig.name,\n paramValue: parsedValue,\n message:\n typeof validationResult === \"string\" ? validationResult : undefined,\n });\n }\n return parsedValue;\n}\n\nfunction _parseAndValidateValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: {\n inputValue: string | undefined;\n defaultValue: PValue | undefined;\n paramConfig: P;\n}): PValue {\n const { inputValue, defaultValue, paramConfig } = options;\n if (inputValue === undefined) {\n // if there is no input value, we use the default value for validation.\n // if there is no default value, we throw an error.\n if (defaultValue === undefined) {\n if (_isValidFullOptionName(paramConfig.name)) {\n throw CLIError.missingRequiredOption({\n optionName: paramConfig.name,\n });\n } else {\n throw CLIError.missingRequiredPositionalArg({\n positionalArgName: paramConfig.name,\n });\n }\n }\n\n // and then just validate it. (no need to parse it first)\n return _validateParsedValue({\n parsedValue: defaultValue,\n paramConfig,\n });\n }\n\n const parsedValue =\n paramConfig.parser ?\n (paramConfig.parser(inputValue) as PValue)\n // if no parser was set, we use the default parser\n : (match(paramConfig.type)\n .with(\"boolean\", () => {\n return inputValue === \"false\" ? false : true;\n })\n .with(\"number\", () => {\n return Number.parseInt(inputValue, 10);\n })\n .with(\"string\", () => {\n return inputValue;\n })\n .exhaustive(() => {\n return inputValue;\n }) as PValue);\n return _validateParsedValue({\n parsedValue,\n paramConfig,\n });\n}\n\nfunction _replaceAliases<\n TGlobalOptionArgs extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TOptionArgs extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TPositionalArgs extends\n | Record<CLIPositionalParamName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>({\n aliasedOptionArgs,\n cli,\n}: {\n aliasedOptionArgs: Record<CLIOptionAlias, string>;\n cli: IAcclimateCLI<\n TGlobalOptionArgs,\n TOptionArgs,\n TPositionalArgs,\n TCommands\n >;\n}): Record<CLIOptionAlias, string> {\n const aliasMap = cli.state.aliases;\n return Object.entries(aliasedOptionArgs).reduce(\n (acc, [aliasKey, value]) => {\n const alias = aliasKey as CLIOptionAlias;\n const optionName = aliasMap[alias] ?? alias;\n acc[optionName] = value;\n return acc;\n },\n {} as Record<CLIOptionAlias, string>,\n );\n}\n\nfunction _runCLIHelper<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>(options: {\n rawPositionalArgs: string[];\n rawOptionArgs: Record<CLIOptionAlias, string>;\n rawGlobalOptionArgs: Record<CLIFullOptionName, string>;\n cli: IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >;\n}): void {\n const { rawGlobalOptionArgs, rawOptionArgs, rawPositionalArgs, cli } = {\n ...options,\n rawGlobalOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawGlobalOptionArgs,\n cli: options.cli,\n }),\n rawOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawOptionArgs,\n\n // TODO(jpsyx): fix that this does not have the CLI may not have all\n cli: options.cli,\n }),\n };\n\n // is the first argument a command?\n const firstArg = rawPositionalArgs[0];\n if (\n firstArg &&\n !isEmptyObject(cli.state.commands) &&\n cli.state.commands[firstArg]\n ) {\n // add the parent's global options to the sub-command\n const commandCLI = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (newCmd, argConfig) => {\n return newCmd.addGlobalOption(argConfig);\n },\n cli.getCommandCLI(firstArg as Extract<keyof TCommands, string>) as AnyCLI,\n );\n\n // run the sub-command\n return _runCLIHelper({\n rawPositionalArgs: rawPositionalArgs.slice(1),\n rawOptionArgs,\n rawGlobalOptionArgs,\n cli: commandCLI,\n });\n }\n\n // build the positional arguments dictionary\n // first check that we haven't supplied too many positional arguments\n if (rawPositionalArgs.length > cli.state.positionalArgs.length) {\n throw CLIError.tooManyPositionalArgs({\n count: rawPositionalArgs.length,\n });\n }\n\n // parse positional arguments\n const parsedPositionalArgs = cli.state.positionalArgs.reduce(\n (acc, argConfig, idx) => {\n const rawVal = rawPositionalArgs[idx];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredPositionalArg({\n positionalArgName: argConfig.name,\n });\n }\n acc[argConfig.name] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the options\n const parsedOptionArgs = Object.values(\n cli.state.optionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n optionName: argConfig.name,\n });\n }\n\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the global options\n const parsedGlobalOptionArgs = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawGlobalOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n optionName: argConfig.name,\n });\n }\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // run the action\n cli.state.action({\n ...parsedPositionalArgs,\n ...parsedOptionArgs,\n ...parsedGlobalOptionArgs,\n } as FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>);\n}\n\n/**\n * Run a CLI instance given an array of inputs.\n *\n * @param options - The options for running the CLI.\n */\nexport function runCLI(options: { input: string[]; cli: AnyCLI }): void {\n const { input, cli } = options;\n const firstOptionIdx = input.findIndex((token) => {\n return token.startsWith(\"-\");\n });\n\n const [rawPositionalArgs, rest] =\n firstOptionIdx === -1 ?\n [input, []]\n : [input.slice(0, firstOptionIdx), input.slice(firstOptionIdx)];\n\n const rawOptionArgs: Record<CLIOptionAlias, string> = {};\n const rawGlobalOptionArgs: Record<CLIFullOptionName, string> = {};\n let currentAlias: CLIOptionAlias | undefined;\n let currentVals: string[] = [];\n\n const { aliases, globalOptionArgs } = cli.state as CLIState<\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIPositionalParamName, CLIOptionParam>,\n Record<CLICommandName, AnyCLI>\n >;\n\n for (const argVal of rest.concat(\"-\")) {\n if (_isValidOptionAlias(argVal)) {\n if (currentAlias) {\n const rawValue = currentVals.join(\" \");\n const optionName = aliases[currentAlias] ?? currentAlias;\n if (\n _isValidFullOptionName(optionName) &&\n !isEmptyObject(globalOptionArgs) &&\n globalOptionArgs[optionName]\n ) {\n rawGlobalOptionArgs[optionName] = rawValue;\n } else {\n rawOptionArgs[optionName] = rawValue;\n }\n }\n currentAlias = argVal;\n currentVals = [];\n } else {\n currentVals.push(argVal);\n }\n }\n\n _runCLIHelper({ rawPositionalArgs, rawOptionArgs, rawGlobalOptionArgs, cli });\n}\n","import { createCLI } from \"./AcclimateCLI\";\nimport { runCLI } from \"./AcclimateCLI/runCLI/runCLI\";\nimport type { AnyCLI, IAcclimateCLI } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype Acclimate = {\n /**\n * Create a new Acclimate CLI instance.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\n createCLI: (name: string) => IAcclimateCLI;\n\n /**\n * Run a CLI instance.\n *\n * It can only be run once. Calling any other methods after `.run()` will\n * throw an error.\n *\n * @param cli - The CLI instance to run.\n */\n run: (cli: AnyCLI) => void;\n};\n\nexport const Acclimate: Acclimate = {\n createCLI,\n run: (cli: AnyCLI) => {\n runCLI({ cli, input: process.argv.slice(2) });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CLIError.ts","../src/AcclimateCLI/AcclimateCLI.ts","../src/AcclimateCLI/createCLI/defaultCLIState.ts","../src/AcclimateCLI/createCLI/createCLI.ts","../src/AcclimateCLI/runCLI/runCLI.ts","../src/Acclimate.ts"],"names":["match","camelCase"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CLIParamDataType } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype CLIErrorInfo =\n | {\n code: \"already_run\";\n details: undefined;\n }\n | {\n code: \"unknown_command\";\n details: { commandName: string };\n }\n | {\n code: \"invalid_positional_arg_config\";\n details: { positionalArgName: string };\n }\n | {\n code: \"too_many_positional_args\";\n details: { count: number };\n }\n | {\n code: \"missing_required_positional_arg\";\n details: { positionalArgName: string };\n }\n | {\n code: \"missing_required_option\";\n details: { optionName: string };\n }\n | {\n code: \"unknown_option\";\n details: {\n optionName: string;\n };\n }\n | {\n code: \"invalid_cli_param_value\";\n details: {\n paramName: string;\n paramValue: CLIParamDataType;\n };\n }\n | { code: \"unknown_error\"; details: undefined };\n\ntype CLIErrorOptions = { cliName: string; message: string } & CLIErrorInfo;\n\nexport class CLIError extends Error {\n static invalidCLIParamValue(options: {\n cliName: string;\n paramName: string;\n paramValue: CLIParamDataType;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ?? `Invalid value for CLI param \"${options.paramName}\"`,\n code: \"invalid_cli_param_value\",\n details: { paramName: options.paramName, paramValue: options.paramValue },\n });\n }\n static missingRequiredOption(options: {\n cliName: string;\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ?? `Required option \"${options.optionName}\" is missing`,\n code: \"missing_required_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static missingRequiredPositionalArg(options: {\n cliName: string;\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ??\n `Required positional argument \"${options.positionalArgName}\" is missing`,\n code: \"missing_required_positional_arg\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownOption(options: {\n cliName: string;\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? `Option \"${options.optionName}\" not found`,\n code: \"unknown_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static tooManyPositionalArgs(options: {\n cliName: string;\n count: number;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? \"Too many positional arguments provided.\",\n code: \"too_many_positional_args\",\n details: { count: options.count },\n });\n }\n\n static invalidPositionalArgConfig(options: {\n cliName: string;\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ??\n `Positional argument configuration for \"${options.positionalArgName}\" is invalid`,\n code: \"invalid_positional_arg_config\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownCommand(options: {\n cliName: string;\n commandName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? `Command \"${options.commandName}\" not found`,\n code: \"unknown_command\",\n details: { commandName: options.commandName },\n });\n }\n\n static alreadyRun(options: {\n cliName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? \"CLI has already been run\",\n code: \"already_run\",\n details: undefined,\n });\n }\n\n constructor(options: CLIErrorOptions) {\n super(`❌ Error running ${options.cliName}: ${options.message}`);\n }\n}\n","import { CLIError } from \"@/CLIError\";\nimport type {\n AddEntry,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionParam,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n} from \"./AcclimateCLI.types\";\nimport type { EmptyObject, Simplify } from \"type-fest\";\n\nexport function AcclimateCLI<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, IAcclimateCLI> | EmptyObject,\n>(\n state: CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >,\n): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n> {\n const cliName = state.name;\n return {\n state,\n\n getName: () => {\n return cliName;\n },\n\n action: (\n action: (\n args: Simplify<\n FullCLIArgValues<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams\n >\n >,\n ) => void,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n action,\n });\n },\n\n description: (\n description: string,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n description,\n });\n },\n\n addPositionalArg: <\n PName extends CLIPositionalParamName,\n P extends CLIPositionalParam<PName>,\n >(\n param: P,\n ) => {\n if (\n param.required &&\n state.positionalArgs.some((p) => {\n return !p.required;\n })\n ) {\n throw CLIError.invalidPositionalArgConfig({\n cliName,\n positionalArgName: param.name,\n message:\n \"Required positional arguments must be before optional positional arguments\",\n });\n }\n\n return AcclimateCLI({\n ...state,\n positionalArgs: [\n ...state.positionalArgs,\n { ...param, required: param.required ?? true },\n ],\n } as unknown as CLIState<\n AddEntry<TPositionalParams, P[\"name\"], P>,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addGlobalOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n globalOptionArgs: {\n ...state.globalOptionArgs,\n [param.name]: param,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >);\n },\n\n addOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n optionArgs: { ...state.optionArgs, [param.name]: param },\n } as unknown as CLIState<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addCommand: <C extends CLICommandName, CommandCLI extends IAcclimateCLI>(\n commandName: C,\n cli: CommandCLI,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n > => {\n return AcclimateCLI({\n ...state,\n commands: {\n ...state.commands,\n [commandName]: cli,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n >);\n },\n\n getCommandCLI: <C extends Extract<keyof TCommands, CLICommandName>>(\n commandName: C,\n ): C extends keyof TCommands ? TCommands[C] : never => {\n const cmd = state.commands[commandName];\n if (!cmd) {\n throw CLIError.unknownCommand({\n cliName,\n commandName,\n message: `Command \"${commandName}\" not found`,\n });\n }\n return cmd as C extends keyof TCommands ? TCommands[C] : never;\n },\n };\n}\n","import type { CLIState } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nexport const defaultCLIState: Omit<\n CLIState<EmptyObject, EmptyObject, EmptyObject, EmptyObject>,\n \"name\"\n> = {\n aliases: {},\n description: undefined,\n commands: {},\n positionalArgs: [],\n optionArgs: {},\n globalOptionArgs: {},\n action: () => {},\n};\n","import { AcclimateCLI } from \"../AcclimateCLI\";\nimport { defaultCLIState } from \"./defaultCLIState\";\nimport type { IAcclimateCLI } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\n/**\n * Builder function to create a new CLI instance with a given name.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\nexport function createCLI(\n name: string,\n): IAcclimateCLI<EmptyObject, EmptyObject, EmptyObject, EmptyObject> {\n return AcclimateCLI({ ...defaultCLIState, name });\n}\n","import { camelCase } from \"change-case\";\nimport { match } from \"ts-pattern\";\nimport { CLIError } from \"@/CLIError\";\nimport type {\n AnyCLI,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionAlias,\n CLIOptionParam,\n CLIParam,\n CLIParamDataType,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n ValueOfParam,\n} from \"@/AcclimateCLI/AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nfunction _isValidFullOptionName(name: string): name is CLIFullOptionName {\n return name.startsWith(\"--\");\n}\n\nfunction _isValidOptionAlias(name: string): name is CLIOptionAlias {\n return name.startsWith(\"-\");\n}\n\nfunction isEmptyObject(obj: object): obj is EmptyObject {\n return Object.keys(obj).length === 0;\n}\n\nfunction _validateParsedValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: { parsedValue: PValue; paramConfig: P; cliName: string }): PValue {\n const { parsedValue, paramConfig, cliName } = options;\n if (paramConfig.validator) {\n const validator = paramConfig.validator as (\n value: PValue,\n ) => boolean | string;\n const validationResult = validator(parsedValue);\n if (validationResult === true) {\n return parsedValue;\n }\n throw CLIError.invalidCLIParamValue({\n cliName,\n paramName: paramConfig.name,\n paramValue: parsedValue,\n message:\n typeof validationResult === \"string\" ? validationResult : undefined,\n });\n }\n return parsedValue;\n}\n\nfunction _parseAndValidateValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: {\n cliName: string;\n inputValue: string | undefined;\n defaultValue: PValue | undefined;\n paramConfig: P;\n}): PValue | undefined {\n const { cliName, inputValue, defaultValue, paramConfig } = options;\n if (inputValue === undefined) {\n if (defaultValue === undefined) {\n return undefined;\n }\n return _validateParsedValue({\n cliName,\n parsedValue: defaultValue,\n paramConfig,\n });\n }\n\n const parsedValue =\n paramConfig.parser ?\n (paramConfig.parser(inputValue) as PValue)\n // if no parser was set, we use the default parser\n : (match(paramConfig.type)\n .with(\"boolean\", () => {\n return inputValue === \"false\" ? false : true;\n })\n .with(\"number\", () => {\n return Number.parseInt(inputValue, 10);\n })\n .with(\"string\", () => {\n return inputValue;\n })\n .exhaustive(() => {\n return inputValue;\n }) as PValue);\n return _validateParsedValue({\n cliName,\n parsedValue,\n paramConfig,\n });\n}\n\nfunction _replaceAliases<\n TGlobalOptionArgs extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TOptionArgs extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TPositionalArgs extends\n | Record<CLIPositionalParamName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>({\n aliasedOptionArgs,\n cli,\n}: {\n aliasedOptionArgs: Record<CLIOptionAlias, string>;\n cli: IAcclimateCLI<\n TGlobalOptionArgs,\n TOptionArgs,\n TPositionalArgs,\n TCommands\n >;\n}): Record<CLIOptionAlias, string> {\n const aliasMap = cli.state.aliases;\n return Object.entries(aliasedOptionArgs).reduce(\n (acc, [aliasKey, value]) => {\n const alias = aliasKey as CLIOptionAlias;\n const optionName = aliasMap[alias] ?? alias;\n acc[optionName] = value;\n return acc;\n },\n {} as Record<CLIOptionAlias, string>,\n );\n}\n\nfunction _runCLIHelper<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>(options: {\n rawPositionalArgs: string[];\n rawOptionArgs: Record<CLIOptionAlias, string>;\n rawGlobalOptionArgs: Record<CLIFullOptionName, string>;\n cli: IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >;\n}): void {\n const { rawGlobalOptionArgs, rawOptionArgs, rawPositionalArgs, cli } = {\n ...options,\n rawGlobalOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawGlobalOptionArgs,\n cli: options.cli,\n }),\n rawOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawOptionArgs,\n\n // TODO(jpsyx): fix that this does not have the CLI may not have all\n cli: options.cli,\n }),\n };\n\n // is the first argument a command?\n const firstArg = rawPositionalArgs[0];\n if (\n firstArg &&\n !isEmptyObject(cli.state.commands) &&\n cli.state.commands[firstArg]\n ) {\n // add the parent's global options to the sub-command\n const commandCLI = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (newCmd, argConfig) => {\n return newCmd.addGlobalOption(argConfig);\n },\n cli.getCommandCLI(firstArg as Extract<keyof TCommands, string>) as AnyCLI,\n );\n\n // run the sub-command\n return _runCLIHelper({\n rawPositionalArgs: rawPositionalArgs.slice(1),\n rawOptionArgs,\n rawGlobalOptionArgs,\n cli: commandCLI,\n });\n }\n\n const cliName = cli.getName();\n\n // build the positional arguments dictionary\n // first check that we haven't supplied too many positional arguments\n if (rawPositionalArgs.length > cli.state.positionalArgs.length) {\n throw CLIError.tooManyPositionalArgs({\n cliName,\n count: rawPositionalArgs.length,\n });\n }\n\n // parse positional arguments\n const parsedPositionalArgs = cli.state.positionalArgs.reduce(\n (acc, argConfig, idx) => {\n const rawVal = rawPositionalArgs[idx];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredPositionalArg({\n cliName,\n positionalArgName: argConfig.name,\n });\n }\n acc[argConfig.name] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the options\n const parsedOptionArgs = Object.values(\n cli.state.optionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n cliName,\n optionName: argConfig.name,\n });\n }\n\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the global options\n const parsedGlobalOptionArgs = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawGlobalOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n cliName,\n optionName: argConfig.name,\n });\n }\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // run the action\n cli.state.action({\n ...parsedPositionalArgs,\n ...parsedOptionArgs,\n ...parsedGlobalOptionArgs,\n } as FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>);\n}\n\n/**\n * Run a CLI instance given an array of inputs.\n *\n * @param options - The options for running the CLI.\n */\nexport function runCLI(options: { input: string[]; cli: AnyCLI }): void {\n const { input, cli } = options;\n const firstOptionIdx = input.findIndex((token) => {\n return token.startsWith(\"-\");\n });\n\n const [rawPositionalArgs, rest] =\n firstOptionIdx === -1 ?\n [input, []]\n : [input.slice(0, firstOptionIdx), input.slice(firstOptionIdx)];\n\n const rawOptionArgs: Record<CLIOptionAlias, string> = {};\n const rawGlobalOptionArgs: Record<CLIFullOptionName, string> = {};\n let currentAlias: CLIOptionAlias | undefined;\n let currentVals: string[] = [];\n\n const { aliases, globalOptionArgs } = cli.state as CLIState<\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIPositionalParamName, CLIOptionParam>,\n Record<CLICommandName, AnyCLI>\n >;\n\n for (const argVal of rest.concat(\"-\")) {\n if (_isValidOptionAlias(argVal)) {\n if (currentAlias) {\n const rawValue = currentVals.join(\" \");\n const optionName = aliases[currentAlias] ?? currentAlias;\n if (\n _isValidFullOptionName(optionName) &&\n !isEmptyObject(globalOptionArgs) &&\n globalOptionArgs[optionName]\n ) {\n rawGlobalOptionArgs[optionName] = rawValue;\n } else {\n rawOptionArgs[optionName] = rawValue;\n }\n }\n currentAlias = argVal;\n currentVals = [];\n } else {\n currentVals.push(argVal);\n }\n }\n\n _runCLIHelper({ rawPositionalArgs, rawOptionArgs, rawGlobalOptionArgs, cli });\n}\n","import { createCLI } from \"./AcclimateCLI\";\nimport { runCLI } from \"./AcclimateCLI/runCLI/runCLI\";\nimport type { AnyCLI, IAcclimateCLI } from \"./AcclimateCLI/AcclimateCLI.types\";\n\nconst COLOR_CODES: Record<string, string> = {\n reset: \"\\x1b[0m\",\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bright_black: \"\\x1b[90m\",\n gray: \"\\x1b[90m\",\n grey: \"\\x1b[90m\",\n bright_red: \"\\x1b[91m\",\n bright_green: \"\\x1b[92m\",\n bright_yellow: \"\\x1b[93m\",\n bright_blue: \"\\x1b[94m\",\n bright_magenta: \"\\x1b[95m\",\n bright_cyan: \"\\x1b[96m\",\n bright_white: \"\\x1b[97m\",\n};\n\nconst PARAM_TOKEN_REGEX = /\\$([a-zA-Z0-9_]+)\\$/g;\nconst COLOR_TOKEN_REGEX = /\\|([a-zA-Z_]+)\\|/g;\n\n/**\n * Replaces `$token$` placeholders with values from `params`.\n * If a token does not exist in `params`, the placeholder is left unchanged.\n */\nfunction interpolateParams(message: string, params: Record<string, string>) {\n return message.replace(PARAM_TOKEN_REGEX, (match, key: string) => {\n const value = params[key];\n return value ?? match;\n });\n}\n\nfunction applyColors(message: string) {\n return message.replace(COLOR_TOKEN_REGEX, (match, colorName: string) => {\n const code = COLOR_CODES[colorName.toLowerCase()];\n return code ?? match;\n });\n}\n\ntype Acclimate = {\n /**\n * Create a new Acclimate CLI instance.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\n createCLI: (name: string) => IAcclimateCLI;\n\n /**\n * Run a CLI instance.\n *\n * It can only be run once. Calling any other methods after `.run()` will\n * throw an error.\n *\n * @param cli - The CLI instance to run.\n */\n run: (cli: AnyCLI) => void;\n\n /**\n * Outputs a message with `console.log`.\n * Supports interpolation using `$varName$` as tokens.\n *\n * Colors can be changed within a message `|<COLOR_NAME>|` tokens.\n * Supported colors are:\n * - black\n * - red\n * - green\n * - yellow\n * - blue\n * - magenta\n * - cyan\n * - white\n * - bright_black|gray|grey\n * - bright_red\n * - bright_green\n * - bright_yellow\n * - bright_blue\n * - bright_magenta\n * - bright_cyan\n * - bright_white\n *\n * The color remains active until another color token is found,\n * or if |reset| is found (which resets the terminal color to the default).\n *\n * @example\n *\n * Acclimate.log(\"Hello $name$\", { name: \"Pablo\" });\n * // \"Hello Pablo\"\n *\n * Acclimate.log(\"|red|Error:|reset| There was an error.\")\n * // \"Error: There was an error.\"\n * // ^ the \"Error:\" portion will be red\n *\n */\n log: (message: string, params?: Record<string, string>) => void;\n};\n\nexport const Acclimate: Acclimate = {\n createCLI,\n run: (cli: AnyCLI) => {\n runCLI({ cli, input: process.argv.slice(2) });\n },\n log: (message: string, params: Record<string, string> = {}) => {\n const interpolated = interpolateParams(message, params);\n const colorized = applyColors(interpolated);\n console.log(colorized);\n },\n};\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -164,7 +164,7 @@ type CLIState<TPositionalParams extends Record<CLIPositionalParamName, CLIPositi
|
|
|
164
164
|
* The aliases for options in the CLI. Keys are aliases and values are the
|
|
165
165
|
* canonical name of the option.
|
|
166
166
|
*/
|
|
167
|
-
aliases: Record<CLIOptionAlias, Extract<keyof TGlobalOptionParams
|
|
167
|
+
aliases: Record<CLIOptionAlias, Extract<keyof _DropNonStringKeys<TGlobalOptionParams & TOptionParams>, CLIFullOptionName>>;
|
|
168
168
|
/** The description of the CLI. */
|
|
169
169
|
description?: string;
|
|
170
170
|
/** The commands of the CLI. */
|
|
@@ -181,6 +181,8 @@ type CLIState<TPositionalParams extends Record<CLIPositionalParamName, CLIPositi
|
|
|
181
181
|
type IAcclimateCLI<TPositionalParams extends Record<CLIPositionalParamName, CLIPositionalParam> | EmptyObject = EmptyObject, TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject = EmptyObject, TGlobalOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject = EmptyObject, TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject = EmptyObject> = {
|
|
182
182
|
/** The internal state of the CLI. */
|
|
183
183
|
state: CLIState<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
184
|
+
/** Get the CLI name. */
|
|
185
|
+
getName: () => string;
|
|
184
186
|
/** Set the description of the CLI. */
|
|
185
187
|
description: (description: string) => IAcclimateCLI<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
186
188
|
action: (action: (args: Simplify<FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>>) => void) => IAcclimateCLI<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
@@ -218,6 +220,43 @@ type Acclimate = {
|
|
|
218
220
|
* @param cli - The CLI instance to run.
|
|
219
221
|
*/
|
|
220
222
|
run: (cli: AnyCLI) => void;
|
|
223
|
+
/**
|
|
224
|
+
* Outputs a message with `console.log`.
|
|
225
|
+
* Supports interpolation using `$varName$` as tokens.
|
|
226
|
+
*
|
|
227
|
+
* Colors can be changed within a message `|<COLOR_NAME>|` tokens.
|
|
228
|
+
* Supported colors are:
|
|
229
|
+
* - black
|
|
230
|
+
* - red
|
|
231
|
+
* - green
|
|
232
|
+
* - yellow
|
|
233
|
+
* - blue
|
|
234
|
+
* - magenta
|
|
235
|
+
* - cyan
|
|
236
|
+
* - white
|
|
237
|
+
* - bright_black|gray|grey
|
|
238
|
+
* - bright_red
|
|
239
|
+
* - bright_green
|
|
240
|
+
* - bright_yellow
|
|
241
|
+
* - bright_blue
|
|
242
|
+
* - bright_magenta
|
|
243
|
+
* - bright_cyan
|
|
244
|
+
* - bright_white
|
|
245
|
+
*
|
|
246
|
+
* The color remains active until another color token is found,
|
|
247
|
+
* or if |reset| is found (which resets the terminal color to the default).
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
*
|
|
251
|
+
* Acclimate.log("Hello $name$", { name: "Pablo" });
|
|
252
|
+
* // "Hello Pablo"
|
|
253
|
+
*
|
|
254
|
+
* Acclimate.log("|red|Error:|reset| There was an error.")
|
|
255
|
+
* // "Error: There was an error."
|
|
256
|
+
* // ^ the "Error:" portion will be red
|
|
257
|
+
*
|
|
258
|
+
*/
|
|
259
|
+
log: (message: string, params?: Record<string, string>) => void;
|
|
221
260
|
};
|
|
222
261
|
declare const Acclimate: Acclimate;
|
|
223
262
|
|
package/dist/index.d.ts
CHANGED
|
@@ -164,7 +164,7 @@ type CLIState<TPositionalParams extends Record<CLIPositionalParamName, CLIPositi
|
|
|
164
164
|
* The aliases for options in the CLI. Keys are aliases and values are the
|
|
165
165
|
* canonical name of the option.
|
|
166
166
|
*/
|
|
167
|
-
aliases: Record<CLIOptionAlias, Extract<keyof TGlobalOptionParams
|
|
167
|
+
aliases: Record<CLIOptionAlias, Extract<keyof _DropNonStringKeys<TGlobalOptionParams & TOptionParams>, CLIFullOptionName>>;
|
|
168
168
|
/** The description of the CLI. */
|
|
169
169
|
description?: string;
|
|
170
170
|
/** The commands of the CLI. */
|
|
@@ -181,6 +181,8 @@ type CLIState<TPositionalParams extends Record<CLIPositionalParamName, CLIPositi
|
|
|
181
181
|
type IAcclimateCLI<TPositionalParams extends Record<CLIPositionalParamName, CLIPositionalParam> | EmptyObject = EmptyObject, TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject = EmptyObject, TGlobalOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject = EmptyObject, TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject = EmptyObject> = {
|
|
182
182
|
/** The internal state of the CLI. */
|
|
183
183
|
state: CLIState<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
184
|
+
/** Get the CLI name. */
|
|
185
|
+
getName: () => string;
|
|
184
186
|
/** Set the description of the CLI. */
|
|
185
187
|
description: (description: string) => IAcclimateCLI<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
186
188
|
action: (action: (args: Simplify<FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>>) => void) => IAcclimateCLI<TPositionalParams, TOptionParams, TGlobalOptionParams, TCommands>;
|
|
@@ -218,6 +220,43 @@ type Acclimate = {
|
|
|
218
220
|
* @param cli - The CLI instance to run.
|
|
219
221
|
*/
|
|
220
222
|
run: (cli: AnyCLI) => void;
|
|
223
|
+
/**
|
|
224
|
+
* Outputs a message with `console.log`.
|
|
225
|
+
* Supports interpolation using `$varName$` as tokens.
|
|
226
|
+
*
|
|
227
|
+
* Colors can be changed within a message `|<COLOR_NAME>|` tokens.
|
|
228
|
+
* Supported colors are:
|
|
229
|
+
* - black
|
|
230
|
+
* - red
|
|
231
|
+
* - green
|
|
232
|
+
* - yellow
|
|
233
|
+
* - blue
|
|
234
|
+
* - magenta
|
|
235
|
+
* - cyan
|
|
236
|
+
* - white
|
|
237
|
+
* - bright_black|gray|grey
|
|
238
|
+
* - bright_red
|
|
239
|
+
* - bright_green
|
|
240
|
+
* - bright_yellow
|
|
241
|
+
* - bright_blue
|
|
242
|
+
* - bright_magenta
|
|
243
|
+
* - bright_cyan
|
|
244
|
+
* - bright_white
|
|
245
|
+
*
|
|
246
|
+
* The color remains active until another color token is found,
|
|
247
|
+
* or if |reset| is found (which resets the terminal color to the default).
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
*
|
|
251
|
+
* Acclimate.log("Hello $name$", { name: "Pablo" });
|
|
252
|
+
* // "Hello Pablo"
|
|
253
|
+
*
|
|
254
|
+
* Acclimate.log("|red|Error:|reset| There was an error.")
|
|
255
|
+
* // "Error: There was an error."
|
|
256
|
+
* // ^ the "Error:" portion will be red
|
|
257
|
+
*
|
|
258
|
+
*/
|
|
259
|
+
log: (message: string, params?: Record<string, string>) => void;
|
|
221
260
|
};
|
|
222
261
|
declare const Acclimate: Acclimate;
|
|
223
262
|
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { match } from 'ts-pattern';
|
|
|
5
5
|
var CLIError = class _CLIError extends Error {
|
|
6
6
|
static invalidCLIParamValue(options) {
|
|
7
7
|
return new _CLIError({
|
|
8
|
+
cliName: options.cliName,
|
|
8
9
|
message: options.message ?? `Invalid value for CLI param "${options.paramName}"`,
|
|
9
10
|
code: "invalid_cli_param_value",
|
|
10
11
|
details: { paramName: options.paramName, paramValue: options.paramValue }
|
|
@@ -12,6 +13,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
12
13
|
}
|
|
13
14
|
static missingRequiredOption(options) {
|
|
14
15
|
return new _CLIError({
|
|
16
|
+
cliName: options.cliName,
|
|
15
17
|
message: options.message ?? `Required option "${options.optionName}" is missing`,
|
|
16
18
|
code: "missing_required_option",
|
|
17
19
|
details: { optionName: options.optionName }
|
|
@@ -19,6 +21,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
19
21
|
}
|
|
20
22
|
static missingRequiredPositionalArg(options) {
|
|
21
23
|
return new _CLIError({
|
|
24
|
+
cliName: options.cliName,
|
|
22
25
|
message: options.message ?? `Required positional argument "${options.positionalArgName}" is missing`,
|
|
23
26
|
code: "missing_required_positional_arg",
|
|
24
27
|
details: { positionalArgName: options.positionalArgName }
|
|
@@ -26,6 +29,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
26
29
|
}
|
|
27
30
|
static unknownOption(options) {
|
|
28
31
|
return new _CLIError({
|
|
32
|
+
cliName: options.cliName,
|
|
29
33
|
message: options.message ?? `Option "${options.optionName}" not found`,
|
|
30
34
|
code: "unknown_option",
|
|
31
35
|
details: { optionName: options.optionName }
|
|
@@ -33,6 +37,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
33
37
|
}
|
|
34
38
|
static tooManyPositionalArgs(options) {
|
|
35
39
|
return new _CLIError({
|
|
40
|
+
cliName: options.cliName,
|
|
36
41
|
message: options.message ?? "Too many positional arguments provided.",
|
|
37
42
|
code: "too_many_positional_args",
|
|
38
43
|
details: { count: options.count }
|
|
@@ -40,6 +45,7 @@ var CLIError = class _CLIError extends Error {
|
|
|
40
45
|
}
|
|
41
46
|
static invalidPositionalArgConfig(options) {
|
|
42
47
|
return new _CLIError({
|
|
48
|
+
cliName: options.cliName,
|
|
43
49
|
message: options.message ?? `Positional argument configuration for "${options.positionalArgName}" is invalid`,
|
|
44
50
|
code: "invalid_positional_arg_config",
|
|
45
51
|
details: { positionalArgName: options.positionalArgName }
|
|
@@ -47,27 +53,33 @@ var CLIError = class _CLIError extends Error {
|
|
|
47
53
|
}
|
|
48
54
|
static unknownCommand(options) {
|
|
49
55
|
return new _CLIError({
|
|
56
|
+
cliName: options.cliName,
|
|
50
57
|
message: options.message ?? `Command "${options.commandName}" not found`,
|
|
51
58
|
code: "unknown_command",
|
|
52
59
|
details: { commandName: options.commandName }
|
|
53
60
|
});
|
|
54
61
|
}
|
|
55
|
-
static alreadyRun(options
|
|
62
|
+
static alreadyRun(options) {
|
|
56
63
|
return new _CLIError({
|
|
64
|
+
cliName: options.cliName,
|
|
57
65
|
message: options.message ?? "CLI has already been run",
|
|
58
66
|
code: "already_run",
|
|
59
67
|
details: void 0
|
|
60
68
|
});
|
|
61
69
|
}
|
|
62
70
|
constructor(options) {
|
|
63
|
-
super(`\u274C ${options.message}`);
|
|
71
|
+
super(`\u274C Error running ${options.cliName}: ${options.message}`);
|
|
64
72
|
}
|
|
65
73
|
};
|
|
66
74
|
|
|
67
75
|
// src/AcclimateCLI/AcclimateCLI.ts
|
|
68
76
|
function AcclimateCLI(state) {
|
|
77
|
+
const cliName = state.name;
|
|
69
78
|
return {
|
|
70
79
|
state,
|
|
80
|
+
getName: () => {
|
|
81
|
+
return cliName;
|
|
82
|
+
},
|
|
71
83
|
action: (action) => {
|
|
72
84
|
return AcclimateCLI({
|
|
73
85
|
...state,
|
|
@@ -85,6 +97,7 @@ function AcclimateCLI(state) {
|
|
|
85
97
|
return !p.required;
|
|
86
98
|
})) {
|
|
87
99
|
throw CLIError.invalidPositionalArgConfig({
|
|
100
|
+
cliName,
|
|
88
101
|
positionalArgName: param.name,
|
|
89
102
|
message: "Required positional arguments must be before optional positional arguments"
|
|
90
103
|
});
|
|
@@ -141,6 +154,7 @@ function AcclimateCLI(state) {
|
|
|
141
154
|
const cmd = state.commands[commandName];
|
|
142
155
|
if (!cmd) {
|
|
143
156
|
throw CLIError.unknownCommand({
|
|
157
|
+
cliName,
|
|
144
158
|
commandName,
|
|
145
159
|
message: `Command "${commandName}" not found`
|
|
146
160
|
});
|
|
@@ -176,7 +190,7 @@ function isEmptyObject(obj) {
|
|
|
176
190
|
return Object.keys(obj).length === 0;
|
|
177
191
|
}
|
|
178
192
|
function _validateParsedValue(options) {
|
|
179
|
-
const { parsedValue, paramConfig } = options;
|
|
193
|
+
const { parsedValue, paramConfig, cliName } = options;
|
|
180
194
|
if (paramConfig.validator) {
|
|
181
195
|
const validator = paramConfig.validator;
|
|
182
196
|
const validationResult = validator(parsedValue);
|
|
@@ -184,6 +198,7 @@ function _validateParsedValue(options) {
|
|
|
184
198
|
return parsedValue;
|
|
185
199
|
}
|
|
186
200
|
throw CLIError.invalidCLIParamValue({
|
|
201
|
+
cliName,
|
|
187
202
|
paramName: paramConfig.name,
|
|
188
203
|
paramValue: parsedValue,
|
|
189
204
|
message: typeof validationResult === "string" ? validationResult : void 0
|
|
@@ -192,20 +207,13 @@ function _validateParsedValue(options) {
|
|
|
192
207
|
return parsedValue;
|
|
193
208
|
}
|
|
194
209
|
function _parseAndValidateValue(options) {
|
|
195
|
-
const { inputValue, defaultValue, paramConfig } = options;
|
|
210
|
+
const { cliName, inputValue, defaultValue, paramConfig } = options;
|
|
196
211
|
if (inputValue === void 0) {
|
|
197
212
|
if (defaultValue === void 0) {
|
|
198
|
-
|
|
199
|
-
throw CLIError.missingRequiredOption({
|
|
200
|
-
optionName: paramConfig.name
|
|
201
|
-
});
|
|
202
|
-
} else {
|
|
203
|
-
throw CLIError.missingRequiredPositionalArg({
|
|
204
|
-
positionalArgName: paramConfig.name
|
|
205
|
-
});
|
|
206
|
-
}
|
|
213
|
+
return void 0;
|
|
207
214
|
}
|
|
208
215
|
return _validateParsedValue({
|
|
216
|
+
cliName,
|
|
209
217
|
parsedValue: defaultValue,
|
|
210
218
|
paramConfig
|
|
211
219
|
});
|
|
@@ -220,6 +228,7 @@ function _parseAndValidateValue(options) {
|
|
|
220
228
|
return inputValue;
|
|
221
229
|
});
|
|
222
230
|
return _validateParsedValue({
|
|
231
|
+
cliName,
|
|
223
232
|
parsedValue,
|
|
224
233
|
paramConfig
|
|
225
234
|
});
|
|
@@ -269,8 +278,10 @@ function _runCLIHelper(options) {
|
|
|
269
278
|
cli: commandCLI
|
|
270
279
|
});
|
|
271
280
|
}
|
|
281
|
+
const cliName = cli.getName();
|
|
272
282
|
if (rawPositionalArgs.length > cli.state.positionalArgs.length) {
|
|
273
283
|
throw CLIError.tooManyPositionalArgs({
|
|
284
|
+
cliName,
|
|
274
285
|
count: rawPositionalArgs.length
|
|
275
286
|
});
|
|
276
287
|
}
|
|
@@ -279,10 +290,12 @@ function _runCLIHelper(options) {
|
|
|
279
290
|
const rawVal = rawPositionalArgs[idx];
|
|
280
291
|
if (argConfig.required && rawVal === void 0) {
|
|
281
292
|
throw CLIError.missingRequiredPositionalArg({
|
|
293
|
+
cliName,
|
|
282
294
|
positionalArgName: argConfig.name
|
|
283
295
|
});
|
|
284
296
|
}
|
|
285
297
|
acc[argConfig.name] = _parseAndValidateValue({
|
|
298
|
+
cliName,
|
|
286
299
|
inputValue: rawVal,
|
|
287
300
|
defaultValue: argConfig.defaultValue,
|
|
288
301
|
paramConfig: argConfig
|
|
@@ -298,10 +311,12 @@ function _runCLIHelper(options) {
|
|
|
298
311
|
const rawVal = rawOptionArgs[argConfig.name];
|
|
299
312
|
if (argConfig.required && rawVal === void 0) {
|
|
300
313
|
throw CLIError.missingRequiredOption({
|
|
314
|
+
cliName,
|
|
301
315
|
optionName: argConfig.name
|
|
302
316
|
});
|
|
303
317
|
}
|
|
304
318
|
acc[camelCase(argConfig.name)] = _parseAndValidateValue({
|
|
319
|
+
cliName,
|
|
305
320
|
inputValue: rawVal,
|
|
306
321
|
defaultValue: argConfig.defaultValue,
|
|
307
322
|
paramConfig: argConfig
|
|
@@ -317,10 +332,12 @@ function _runCLIHelper(options) {
|
|
|
317
332
|
const rawVal = rawGlobalOptionArgs[argConfig.name];
|
|
318
333
|
if (argConfig.required && rawVal === void 0) {
|
|
319
334
|
throw CLIError.missingRequiredOption({
|
|
335
|
+
cliName,
|
|
320
336
|
optionName: argConfig.name
|
|
321
337
|
});
|
|
322
338
|
}
|
|
323
339
|
acc[camelCase(argConfig.name)] = _parseAndValidateValue({
|
|
340
|
+
cliName,
|
|
324
341
|
inputValue: rawVal,
|
|
325
342
|
defaultValue: argConfig.defaultValue,
|
|
326
343
|
paramConfig: argConfig
|
|
@@ -367,10 +384,50 @@ function runCLI(options) {
|
|
|
367
384
|
}
|
|
368
385
|
|
|
369
386
|
// src/Acclimate.ts
|
|
387
|
+
var COLOR_CODES = {
|
|
388
|
+
reset: "\x1B[0m",
|
|
389
|
+
black: "\x1B[30m",
|
|
390
|
+
red: "\x1B[31m",
|
|
391
|
+
green: "\x1B[32m",
|
|
392
|
+
yellow: "\x1B[33m",
|
|
393
|
+
blue: "\x1B[34m",
|
|
394
|
+
magenta: "\x1B[35m",
|
|
395
|
+
cyan: "\x1B[36m",
|
|
396
|
+
white: "\x1B[37m",
|
|
397
|
+
bright_black: "\x1B[90m",
|
|
398
|
+
gray: "\x1B[90m",
|
|
399
|
+
grey: "\x1B[90m",
|
|
400
|
+
bright_red: "\x1B[91m",
|
|
401
|
+
bright_green: "\x1B[92m",
|
|
402
|
+
bright_yellow: "\x1B[93m",
|
|
403
|
+
bright_blue: "\x1B[94m",
|
|
404
|
+
bright_magenta: "\x1B[95m",
|
|
405
|
+
bright_cyan: "\x1B[96m",
|
|
406
|
+
bright_white: "\x1B[97m"
|
|
407
|
+
};
|
|
408
|
+
var PARAM_TOKEN_REGEX = /\$([a-zA-Z0-9_]+)\$/g;
|
|
409
|
+
var COLOR_TOKEN_REGEX = /\|([a-zA-Z_]+)\|/g;
|
|
410
|
+
function interpolateParams(message, params) {
|
|
411
|
+
return message.replace(PARAM_TOKEN_REGEX, (match2, key) => {
|
|
412
|
+
const value = params[key];
|
|
413
|
+
return value ?? match2;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
function applyColors(message) {
|
|
417
|
+
return message.replace(COLOR_TOKEN_REGEX, (match2, colorName) => {
|
|
418
|
+
const code = COLOR_CODES[colorName.toLowerCase()];
|
|
419
|
+
return code ?? match2;
|
|
420
|
+
});
|
|
421
|
+
}
|
|
370
422
|
var Acclimate = {
|
|
371
423
|
createCLI,
|
|
372
424
|
run: (cli) => {
|
|
373
425
|
runCLI({ cli, input: process.argv.slice(2) });
|
|
426
|
+
},
|
|
427
|
+
log: (message, params = {}) => {
|
|
428
|
+
const interpolated = interpolateParams(message, params);
|
|
429
|
+
const colorized = applyColors(interpolated);
|
|
430
|
+
console.log(colorized);
|
|
374
431
|
}
|
|
375
432
|
};
|
|
376
433
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CLIError.ts","../src/AcclimateCLI/AcclimateCLI.ts","../src/AcclimateCLI/createCLI/defaultCLIState.ts","../src/AcclimateCLI/createCLI/createCLI.ts","../src/AcclimateCLI/runCLI/runCLI.ts","../src/Acclimate.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { CLIParamDataType } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype CLIErrorInfo =\n | {\n code: \"already_run\";\n details: undefined;\n }\n | {\n code: \"unknown_command\";\n details: { commandName: string };\n }\n | {\n code: \"invalid_positional_arg_config\";\n details: { positionalArgName: string };\n }\n | {\n code: \"too_many_positional_args\";\n details: { count: number };\n }\n | {\n code: \"missing_required_positional_arg\";\n details: { positionalArgName: string };\n }\n | {\n code: \"missing_required_option\";\n details: { optionName: string };\n }\n | {\n code: \"unknown_option\";\n details: {\n optionName: string;\n };\n }\n | {\n code: \"invalid_cli_param_value\";\n details: {\n paramName: string;\n paramValue: CLIParamDataType;\n };\n }\n | { code: \"unknown_error\"; details: undefined };\n\ntype CLIErrorOptions = { message: string } & CLIErrorInfo;\n\nexport class CLIError extends Error {\n static invalidCLIParamValue(options: {\n paramName: string;\n paramValue: CLIParamDataType;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ?? `Invalid value for CLI param \"${options.paramName}\"`,\n code: \"invalid_cli_param_value\",\n details: { paramName: options.paramName, paramValue: options.paramValue },\n });\n }\n static missingRequiredOption(options: {\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ?? `Required option \"${options.optionName}\" is missing`,\n code: \"missing_required_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static missingRequiredPositionalArg(options: {\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ??\n `Required positional argument \"${options.positionalArgName}\" is missing`,\n code: \"missing_required_positional_arg\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownOption(options: {\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? `Option \"${options.optionName}\" not found`,\n code: \"unknown_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static tooManyPositionalArgs(options: {\n count: number;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? \"Too many positional arguments provided.\",\n code: \"too_many_positional_args\",\n details: { count: options.count },\n });\n }\n\n static invalidPositionalArgConfig(options: {\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message:\n options.message ??\n `Positional argument configuration for \"${options.positionalArgName}\" is invalid`,\n code: \"invalid_positional_arg_config\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownCommand(options: {\n commandName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n message: options.message ?? `Command \"${options.commandName}\" not found`,\n code: \"unknown_command\",\n details: { commandName: options.commandName },\n });\n }\n\n static alreadyRun(options: { message?: string } = {}): CLIError {\n return new CLIError({\n message: options.message ?? \"CLI has already been run\",\n code: \"already_run\",\n details: undefined,\n });\n }\n\n constructor(options: CLIErrorOptions) {\n super(`❌ ${options.message}`);\n }\n}\n","import { CLIError } from \"@/CLIError\";\nimport type {\n AddEntry,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionParam,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n} from \"./AcclimateCLI.types\";\nimport type { EmptyObject, Simplify } from \"type-fest\";\n\nexport function AcclimateCLI<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, IAcclimateCLI> | EmptyObject,\n>(\n state: CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >,\n): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n> {\n return {\n state,\n\n action: (\n action: (\n args: Simplify<\n FullCLIArgValues<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams\n >\n >,\n ) => void,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n action,\n });\n },\n\n description: (\n description: string,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n description,\n });\n },\n\n addPositionalArg: <\n PName extends CLIPositionalParamName,\n P extends CLIPositionalParam<PName>,\n >(\n param: P,\n ) => {\n if (\n param.required &&\n state.positionalArgs.some((p) => {\n return !p.required;\n })\n ) {\n throw CLIError.invalidPositionalArgConfig({\n positionalArgName: param.name,\n message:\n \"Required positional arguments must be before optional positional arguments\",\n });\n }\n\n return AcclimateCLI({\n ...state,\n positionalArgs: [\n ...state.positionalArgs,\n { ...param, required: param.required ?? true },\n ],\n } as unknown as CLIState<\n AddEntry<TPositionalParams, P[\"name\"], P>,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addGlobalOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n globalOptionArgs: {\n ...state.globalOptionArgs,\n [param.name]: param,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >);\n },\n\n addOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n optionArgs: { ...state.optionArgs, [param.name]: param },\n } as unknown as CLIState<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addCommand: <C extends CLICommandName, CommandCLI extends IAcclimateCLI>(\n commandName: C,\n cli: CommandCLI,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n > => {\n return AcclimateCLI({\n ...state,\n commands: {\n ...state.commands,\n [commandName]: cli,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n >);\n },\n\n getCommandCLI: <C extends Extract<keyof TCommands, CLICommandName>>(\n commandName: C,\n ): C extends keyof TCommands ? TCommands[C] : never => {\n const cmd = state.commands[commandName];\n if (!cmd) {\n throw CLIError.unknownCommand({\n commandName,\n message: `Command \"${commandName}\" not found`,\n });\n }\n return cmd as C extends keyof TCommands ? TCommands[C] : never;\n },\n };\n}\n","import type { CLIState } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nexport const defaultCLIState: Omit<\n CLIState<EmptyObject, EmptyObject, EmptyObject, EmptyObject>,\n \"name\"\n> = {\n aliases: {},\n description: undefined,\n commands: {},\n positionalArgs: [],\n optionArgs: {},\n globalOptionArgs: {},\n action: () => {},\n};\n","import { AcclimateCLI } from \"../AcclimateCLI\";\nimport { defaultCLIState } from \"./defaultCLIState\";\nimport type { IAcclimateCLI } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\n/**\n * Builder function to create a new CLI instance with a given name.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\nexport function createCLI(\n name: string,\n): IAcclimateCLI<EmptyObject, EmptyObject, EmptyObject, EmptyObject> {\n return AcclimateCLI({ ...defaultCLIState, name });\n}\n","import { camelCase } from \"change-case\";\nimport { match } from \"ts-pattern\";\nimport { CLIError } from \"@/CLIError\";\nimport type {\n AnyCLI,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionAlias,\n CLIOptionParam,\n CLIParam,\n CLIParamDataType,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n ValueOfParam,\n} from \"@/AcclimateCLI/AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nfunction _isValidFullOptionName(name: string): name is CLIFullOptionName {\n return name.startsWith(\"--\");\n}\n\nfunction _isValidOptionAlias(name: string): name is CLIOptionAlias {\n return name.startsWith(\"-\");\n}\n\nfunction isEmptyObject(obj: object): obj is EmptyObject {\n return Object.keys(obj).length === 0;\n}\n\nfunction _validateParsedValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: { parsedValue: PValue; paramConfig: P }): PValue {\n const { parsedValue, paramConfig } = options;\n if (paramConfig.validator) {\n const validator = paramConfig.validator as (\n value: PValue,\n ) => boolean | string;\n const validationResult = validator(parsedValue);\n if (validationResult === true) {\n return parsedValue;\n }\n throw CLIError.invalidCLIParamValue({\n paramName: paramConfig.name,\n paramValue: parsedValue,\n message:\n typeof validationResult === \"string\" ? validationResult : undefined,\n });\n }\n return parsedValue;\n}\n\nfunction _parseAndValidateValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: {\n inputValue: string | undefined;\n defaultValue: PValue | undefined;\n paramConfig: P;\n}): PValue {\n const { inputValue, defaultValue, paramConfig } = options;\n if (inputValue === undefined) {\n // if there is no input value, we use the default value for validation.\n // if there is no default value, we throw an error.\n if (defaultValue === undefined) {\n if (_isValidFullOptionName(paramConfig.name)) {\n throw CLIError.missingRequiredOption({\n optionName: paramConfig.name,\n });\n } else {\n throw CLIError.missingRequiredPositionalArg({\n positionalArgName: paramConfig.name,\n });\n }\n }\n\n // and then just validate it. (no need to parse it first)\n return _validateParsedValue({\n parsedValue: defaultValue,\n paramConfig,\n });\n }\n\n const parsedValue =\n paramConfig.parser ?\n (paramConfig.parser(inputValue) as PValue)\n // if no parser was set, we use the default parser\n : (match(paramConfig.type)\n .with(\"boolean\", () => {\n return inputValue === \"false\" ? false : true;\n })\n .with(\"number\", () => {\n return Number.parseInt(inputValue, 10);\n })\n .with(\"string\", () => {\n return inputValue;\n })\n .exhaustive(() => {\n return inputValue;\n }) as PValue);\n return _validateParsedValue({\n parsedValue,\n paramConfig,\n });\n}\n\nfunction _replaceAliases<\n TGlobalOptionArgs extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TOptionArgs extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TPositionalArgs extends\n | Record<CLIPositionalParamName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>({\n aliasedOptionArgs,\n cli,\n}: {\n aliasedOptionArgs: Record<CLIOptionAlias, string>;\n cli: IAcclimateCLI<\n TGlobalOptionArgs,\n TOptionArgs,\n TPositionalArgs,\n TCommands\n >;\n}): Record<CLIOptionAlias, string> {\n const aliasMap = cli.state.aliases;\n return Object.entries(aliasedOptionArgs).reduce(\n (acc, [aliasKey, value]) => {\n const alias = aliasKey as CLIOptionAlias;\n const optionName = aliasMap[alias] ?? alias;\n acc[optionName] = value;\n return acc;\n },\n {} as Record<CLIOptionAlias, string>,\n );\n}\n\nfunction _runCLIHelper<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>(options: {\n rawPositionalArgs: string[];\n rawOptionArgs: Record<CLIOptionAlias, string>;\n rawGlobalOptionArgs: Record<CLIFullOptionName, string>;\n cli: IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >;\n}): void {\n const { rawGlobalOptionArgs, rawOptionArgs, rawPositionalArgs, cli } = {\n ...options,\n rawGlobalOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawGlobalOptionArgs,\n cli: options.cli,\n }),\n rawOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawOptionArgs,\n\n // TODO(jpsyx): fix that this does not have the CLI may not have all\n cli: options.cli,\n }),\n };\n\n // is the first argument a command?\n const firstArg = rawPositionalArgs[0];\n if (\n firstArg &&\n !isEmptyObject(cli.state.commands) &&\n cli.state.commands[firstArg]\n ) {\n // add the parent's global options to the sub-command\n const commandCLI = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (newCmd, argConfig) => {\n return newCmd.addGlobalOption(argConfig);\n },\n cli.getCommandCLI(firstArg as Extract<keyof TCommands, string>) as AnyCLI,\n );\n\n // run the sub-command\n return _runCLIHelper({\n rawPositionalArgs: rawPositionalArgs.slice(1),\n rawOptionArgs,\n rawGlobalOptionArgs,\n cli: commandCLI,\n });\n }\n\n // build the positional arguments dictionary\n // first check that we haven't supplied too many positional arguments\n if (rawPositionalArgs.length > cli.state.positionalArgs.length) {\n throw CLIError.tooManyPositionalArgs({\n count: rawPositionalArgs.length,\n });\n }\n\n // parse positional arguments\n const parsedPositionalArgs = cli.state.positionalArgs.reduce(\n (acc, argConfig, idx) => {\n const rawVal = rawPositionalArgs[idx];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredPositionalArg({\n positionalArgName: argConfig.name,\n });\n }\n acc[argConfig.name] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the options\n const parsedOptionArgs = Object.values(\n cli.state.optionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n optionName: argConfig.name,\n });\n }\n\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the global options\n const parsedGlobalOptionArgs = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawGlobalOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n optionName: argConfig.name,\n });\n }\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // run the action\n cli.state.action({\n ...parsedPositionalArgs,\n ...parsedOptionArgs,\n ...parsedGlobalOptionArgs,\n } as FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>);\n}\n\n/**\n * Run a CLI instance given an array of inputs.\n *\n * @param options - The options for running the CLI.\n */\nexport function runCLI(options: { input: string[]; cli: AnyCLI }): void {\n const { input, cli } = options;\n const firstOptionIdx = input.findIndex((token) => {\n return token.startsWith(\"-\");\n });\n\n const [rawPositionalArgs, rest] =\n firstOptionIdx === -1 ?\n [input, []]\n : [input.slice(0, firstOptionIdx), input.slice(firstOptionIdx)];\n\n const rawOptionArgs: Record<CLIOptionAlias, string> = {};\n const rawGlobalOptionArgs: Record<CLIFullOptionName, string> = {};\n let currentAlias: CLIOptionAlias | undefined;\n let currentVals: string[] = [];\n\n const { aliases, globalOptionArgs } = cli.state as CLIState<\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIPositionalParamName, CLIOptionParam>,\n Record<CLICommandName, AnyCLI>\n >;\n\n for (const argVal of rest.concat(\"-\")) {\n if (_isValidOptionAlias(argVal)) {\n if (currentAlias) {\n const rawValue = currentVals.join(\" \");\n const optionName = aliases[currentAlias] ?? currentAlias;\n if (\n _isValidFullOptionName(optionName) &&\n !isEmptyObject(globalOptionArgs) &&\n globalOptionArgs[optionName]\n ) {\n rawGlobalOptionArgs[optionName] = rawValue;\n } else {\n rawOptionArgs[optionName] = rawValue;\n }\n }\n currentAlias = argVal;\n currentVals = [];\n } else {\n currentVals.push(argVal);\n }\n }\n\n _runCLIHelper({ rawPositionalArgs, rawOptionArgs, rawGlobalOptionArgs, cli });\n}\n","import { createCLI } from \"./AcclimateCLI\";\nimport { runCLI } from \"./AcclimateCLI/runCLI/runCLI\";\nimport type { AnyCLI, IAcclimateCLI } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype Acclimate = {\n /**\n * Create a new Acclimate CLI instance.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\n createCLI: (name: string) => IAcclimateCLI;\n\n /**\n * Run a CLI instance.\n *\n * It can only be run once. Calling any other methods after `.run()` will\n * throw an error.\n *\n * @param cli - The CLI instance to run.\n */\n run: (cli: AnyCLI) => void;\n};\n\nexport const Acclimate: Acclimate = {\n createCLI,\n run: (cli: AnyCLI) => {\n runCLI({ cli, input: process.argv.slice(2) });\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CLIError.ts","../src/AcclimateCLI/AcclimateCLI.ts","../src/AcclimateCLI/createCLI/defaultCLIState.ts","../src/AcclimateCLI/createCLI/createCLI.ts","../src/AcclimateCLI/runCLI/runCLI.ts","../src/Acclimate.ts"],"names":["match"],"mappings":"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","file":"index.js","sourcesContent":["import type { CLIParamDataType } from \"./AcclimateCLI/AcclimateCLI.types\";\n\ntype CLIErrorInfo =\n | {\n code: \"already_run\";\n details: undefined;\n }\n | {\n code: \"unknown_command\";\n details: { commandName: string };\n }\n | {\n code: \"invalid_positional_arg_config\";\n details: { positionalArgName: string };\n }\n | {\n code: \"too_many_positional_args\";\n details: { count: number };\n }\n | {\n code: \"missing_required_positional_arg\";\n details: { positionalArgName: string };\n }\n | {\n code: \"missing_required_option\";\n details: { optionName: string };\n }\n | {\n code: \"unknown_option\";\n details: {\n optionName: string;\n };\n }\n | {\n code: \"invalid_cli_param_value\";\n details: {\n paramName: string;\n paramValue: CLIParamDataType;\n };\n }\n | { code: \"unknown_error\"; details: undefined };\n\ntype CLIErrorOptions = { cliName: string; message: string } & CLIErrorInfo;\n\nexport class CLIError extends Error {\n static invalidCLIParamValue(options: {\n cliName: string;\n paramName: string;\n paramValue: CLIParamDataType;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ?? `Invalid value for CLI param \"${options.paramName}\"`,\n code: \"invalid_cli_param_value\",\n details: { paramName: options.paramName, paramValue: options.paramValue },\n });\n }\n static missingRequiredOption(options: {\n cliName: string;\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ?? `Required option \"${options.optionName}\" is missing`,\n code: \"missing_required_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static missingRequiredPositionalArg(options: {\n cliName: string;\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ??\n `Required positional argument \"${options.positionalArgName}\" is missing`,\n code: \"missing_required_positional_arg\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownOption(options: {\n cliName: string;\n optionName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? `Option \"${options.optionName}\" not found`,\n code: \"unknown_option\",\n details: { optionName: options.optionName },\n });\n }\n\n static tooManyPositionalArgs(options: {\n cliName: string;\n count: number;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? \"Too many positional arguments provided.\",\n code: \"too_many_positional_args\",\n details: { count: options.count },\n });\n }\n\n static invalidPositionalArgConfig(options: {\n cliName: string;\n positionalArgName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message:\n options.message ??\n `Positional argument configuration for \"${options.positionalArgName}\" is invalid`,\n code: \"invalid_positional_arg_config\",\n details: { positionalArgName: options.positionalArgName },\n });\n }\n\n static unknownCommand(options: {\n cliName: string;\n commandName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? `Command \"${options.commandName}\" not found`,\n code: \"unknown_command\",\n details: { commandName: options.commandName },\n });\n }\n\n static alreadyRun(options: {\n cliName: string;\n message?: string;\n }): CLIError {\n return new CLIError({\n cliName: options.cliName,\n message: options.message ?? \"CLI has already been run\",\n code: \"already_run\",\n details: undefined,\n });\n }\n\n constructor(options: CLIErrorOptions) {\n super(`❌ Error running ${options.cliName}: ${options.message}`);\n }\n}\n","import { CLIError } from \"@/CLIError\";\nimport type {\n AddEntry,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionParam,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n} from \"./AcclimateCLI.types\";\nimport type { EmptyObject, Simplify } from \"type-fest\";\n\nexport function AcclimateCLI<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, IAcclimateCLI> | EmptyObject,\n>(\n state: CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >,\n): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n> {\n const cliName = state.name;\n return {\n state,\n\n getName: () => {\n return cliName;\n },\n\n action: (\n action: (\n args: Simplify<\n FullCLIArgValues<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams\n >\n >,\n ) => void,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n action,\n });\n },\n\n description: (\n description: string,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n > => {\n return AcclimateCLI({\n ...state,\n description,\n });\n },\n\n addPositionalArg: <\n PName extends CLIPositionalParamName,\n P extends CLIPositionalParam<PName>,\n >(\n param: P,\n ) => {\n if (\n param.required &&\n state.positionalArgs.some((p) => {\n return !p.required;\n })\n ) {\n throw CLIError.invalidPositionalArgConfig({\n cliName,\n positionalArgName: param.name,\n message:\n \"Required positional arguments must be before optional positional arguments\",\n });\n }\n\n return AcclimateCLI({\n ...state,\n positionalArgs: [\n ...state.positionalArgs,\n { ...param, required: param.required ?? true },\n ],\n } as unknown as CLIState<\n AddEntry<TPositionalParams, P[\"name\"], P>,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addGlobalOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n globalOptionArgs: {\n ...state.globalOptionArgs,\n [param.name]: param,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n AddEntry<TGlobalOptionParams, P[\"name\"], P>,\n TCommands\n >);\n },\n\n addOption: <P extends CLIOptionParam>(param: P) => {\n const newAliases = (param.aliases ?? []).reduce(\n (acc, alias) => {\n acc[alias] = param.name;\n return acc;\n },\n {} as Record<`-${string}` | `--${string}`, `--${string}`>,\n );\n return AcclimateCLI<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >({\n ...state,\n aliases: { ...state.aliases, ...newAliases },\n optionArgs: { ...state.optionArgs, [param.name]: param },\n } as unknown as CLIState<\n TPositionalParams,\n AddEntry<TOptionParams, P[\"name\"], P>,\n TGlobalOptionParams,\n TCommands\n >);\n },\n\n addCommand: <C extends CLICommandName, CommandCLI extends IAcclimateCLI>(\n commandName: C,\n cli: CommandCLI,\n ): IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n > => {\n return AcclimateCLI({\n ...state,\n commands: {\n ...state.commands,\n [commandName]: cli,\n },\n } as unknown as CLIState<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n AddEntry<TCommands, C, CommandCLI>\n >);\n },\n\n getCommandCLI: <C extends Extract<keyof TCommands, CLICommandName>>(\n commandName: C,\n ): C extends keyof TCommands ? TCommands[C] : never => {\n const cmd = state.commands[commandName];\n if (!cmd) {\n throw CLIError.unknownCommand({\n cliName,\n commandName,\n message: `Command \"${commandName}\" not found`,\n });\n }\n return cmd as C extends keyof TCommands ? TCommands[C] : never;\n },\n };\n}\n","import type { CLIState } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nexport const defaultCLIState: Omit<\n CLIState<EmptyObject, EmptyObject, EmptyObject, EmptyObject>,\n \"name\"\n> = {\n aliases: {},\n description: undefined,\n commands: {},\n positionalArgs: [],\n optionArgs: {},\n globalOptionArgs: {},\n action: () => {},\n};\n","import { AcclimateCLI } from \"../AcclimateCLI\";\nimport { defaultCLIState } from \"./defaultCLIState\";\nimport type { IAcclimateCLI } from \"../AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\n/**\n * Builder function to create a new CLI instance with a given name.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\nexport function createCLI(\n name: string,\n): IAcclimateCLI<EmptyObject, EmptyObject, EmptyObject, EmptyObject> {\n return AcclimateCLI({ ...defaultCLIState, name });\n}\n","import { camelCase } from \"change-case\";\nimport { match } from \"ts-pattern\";\nimport { CLIError } from \"@/CLIError\";\nimport type {\n AnyCLI,\n CLICommandName,\n CLIFullOptionName,\n CLIOptionAlias,\n CLIOptionParam,\n CLIParam,\n CLIParamDataType,\n CLIPositionalParam,\n CLIPositionalParamName,\n CLIState,\n FullCLIArgValues,\n IAcclimateCLI,\n ValueOfParam,\n} from \"@/AcclimateCLI/AcclimateCLI.types\";\nimport type { EmptyObject } from \"type-fest\";\n\nfunction _isValidFullOptionName(name: string): name is CLIFullOptionName {\n return name.startsWith(\"--\");\n}\n\nfunction _isValidOptionAlias(name: string): name is CLIOptionAlias {\n return name.startsWith(\"-\");\n}\n\nfunction isEmptyObject(obj: object): obj is EmptyObject {\n return Object.keys(obj).length === 0;\n}\n\nfunction _validateParsedValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: { parsedValue: PValue; paramConfig: P; cliName: string }): PValue {\n const { parsedValue, paramConfig, cliName } = options;\n if (paramConfig.validator) {\n const validator = paramConfig.validator as (\n value: PValue,\n ) => boolean | string;\n const validationResult = validator(parsedValue);\n if (validationResult === true) {\n return parsedValue;\n }\n throw CLIError.invalidCLIParamValue({\n cliName,\n paramName: paramConfig.name,\n paramValue: parsedValue,\n message:\n typeof validationResult === \"string\" ? validationResult : undefined,\n });\n }\n return parsedValue;\n}\n\nfunction _parseAndValidateValue<\n P extends CLIParam<string>,\n PValue extends ValueOfParam<P>,\n>(options: {\n cliName: string;\n inputValue: string | undefined;\n defaultValue: PValue | undefined;\n paramConfig: P;\n}): PValue | undefined {\n const { cliName, inputValue, defaultValue, paramConfig } = options;\n if (inputValue === undefined) {\n if (defaultValue === undefined) {\n return undefined;\n }\n return _validateParsedValue({\n cliName,\n parsedValue: defaultValue,\n paramConfig,\n });\n }\n\n const parsedValue =\n paramConfig.parser ?\n (paramConfig.parser(inputValue) as PValue)\n // if no parser was set, we use the default parser\n : (match(paramConfig.type)\n .with(\"boolean\", () => {\n return inputValue === \"false\" ? false : true;\n })\n .with(\"number\", () => {\n return Number.parseInt(inputValue, 10);\n })\n .with(\"string\", () => {\n return inputValue;\n })\n .exhaustive(() => {\n return inputValue;\n }) as PValue);\n return _validateParsedValue({\n cliName,\n parsedValue,\n paramConfig,\n });\n}\n\nfunction _replaceAliases<\n TGlobalOptionArgs extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TOptionArgs extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TPositionalArgs extends\n | Record<CLIPositionalParamName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>({\n aliasedOptionArgs,\n cli,\n}: {\n aliasedOptionArgs: Record<CLIOptionAlias, string>;\n cli: IAcclimateCLI<\n TGlobalOptionArgs,\n TOptionArgs,\n TPositionalArgs,\n TCommands\n >;\n}): Record<CLIOptionAlias, string> {\n const aliasMap = cli.state.aliases;\n return Object.entries(aliasedOptionArgs).reduce(\n (acc, [aliasKey, value]) => {\n const alias = aliasKey as CLIOptionAlias;\n const optionName = aliasMap[alias] ?? alias;\n acc[optionName] = value;\n return acc;\n },\n {} as Record<CLIOptionAlias, string>,\n );\n}\n\nfunction _runCLIHelper<\n TPositionalParams extends\n | Record<CLIPositionalParamName, CLIPositionalParam>\n | EmptyObject,\n TOptionParams extends Record<CLIFullOptionName, CLIOptionParam> | EmptyObject,\n TGlobalOptionParams extends\n | Record<CLIFullOptionName, CLIOptionParam>\n | EmptyObject,\n TCommands extends Record<CLICommandName, AnyCLI> | EmptyObject,\n>(options: {\n rawPositionalArgs: string[];\n rawOptionArgs: Record<CLIOptionAlias, string>;\n rawGlobalOptionArgs: Record<CLIFullOptionName, string>;\n cli: IAcclimateCLI<\n TPositionalParams,\n TOptionParams,\n TGlobalOptionParams,\n TCommands\n >;\n}): void {\n const { rawGlobalOptionArgs, rawOptionArgs, rawPositionalArgs, cli } = {\n ...options,\n rawGlobalOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawGlobalOptionArgs,\n cli: options.cli,\n }),\n rawOptionArgs: _replaceAliases({\n aliasedOptionArgs: options.rawOptionArgs,\n\n // TODO(jpsyx): fix that this does not have the CLI may not have all\n cli: options.cli,\n }),\n };\n\n // is the first argument a command?\n const firstArg = rawPositionalArgs[0];\n if (\n firstArg &&\n !isEmptyObject(cli.state.commands) &&\n cli.state.commands[firstArg]\n ) {\n // add the parent's global options to the sub-command\n const commandCLI = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (newCmd, argConfig) => {\n return newCmd.addGlobalOption(argConfig);\n },\n cli.getCommandCLI(firstArg as Extract<keyof TCommands, string>) as AnyCLI,\n );\n\n // run the sub-command\n return _runCLIHelper({\n rawPositionalArgs: rawPositionalArgs.slice(1),\n rawOptionArgs,\n rawGlobalOptionArgs,\n cli: commandCLI,\n });\n }\n\n const cliName = cli.getName();\n\n // build the positional arguments dictionary\n // first check that we haven't supplied too many positional arguments\n if (rawPositionalArgs.length > cli.state.positionalArgs.length) {\n throw CLIError.tooManyPositionalArgs({\n cliName,\n count: rawPositionalArgs.length,\n });\n }\n\n // parse positional arguments\n const parsedPositionalArgs = cli.state.positionalArgs.reduce(\n (acc, argConfig, idx) => {\n const rawVal = rawPositionalArgs[idx];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredPositionalArg({\n cliName,\n positionalArgName: argConfig.name,\n });\n }\n acc[argConfig.name] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the options\n const parsedOptionArgs = Object.values(\n cli.state.optionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n cliName,\n optionName: argConfig.name,\n });\n }\n\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // parse the global options\n const parsedGlobalOptionArgs = Object.values(\n cli.state.globalOptionArgs as Record<CLIFullOptionName, CLIOptionParam>,\n ).reduce(\n (acc, argConfig) => {\n const rawVal = rawGlobalOptionArgs[argConfig.name];\n if (argConfig.required && rawVal === undefined) {\n throw CLIError.missingRequiredOption({\n cliName,\n optionName: argConfig.name,\n });\n }\n acc[camelCase(argConfig.name)] = _parseAndValidateValue({\n cliName,\n inputValue: rawVal,\n defaultValue: argConfig.defaultValue,\n paramConfig: argConfig,\n });\n return acc;\n },\n {} as Record<string, CLIParamDataType>,\n );\n\n // run the action\n cli.state.action({\n ...parsedPositionalArgs,\n ...parsedOptionArgs,\n ...parsedGlobalOptionArgs,\n } as FullCLIArgValues<TPositionalParams, TOptionParams, TGlobalOptionParams>);\n}\n\n/**\n * Run a CLI instance given an array of inputs.\n *\n * @param options - The options for running the CLI.\n */\nexport function runCLI(options: { input: string[]; cli: AnyCLI }): void {\n const { input, cli } = options;\n const firstOptionIdx = input.findIndex((token) => {\n return token.startsWith(\"-\");\n });\n\n const [rawPositionalArgs, rest] =\n firstOptionIdx === -1 ?\n [input, []]\n : [input.slice(0, firstOptionIdx), input.slice(firstOptionIdx)];\n\n const rawOptionArgs: Record<CLIOptionAlias, string> = {};\n const rawGlobalOptionArgs: Record<CLIFullOptionName, string> = {};\n let currentAlias: CLIOptionAlias | undefined;\n let currentVals: string[] = [];\n\n const { aliases, globalOptionArgs } = cli.state as CLIState<\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIFullOptionName, CLIOptionParam>,\n Record<CLIPositionalParamName, CLIOptionParam>,\n Record<CLICommandName, AnyCLI>\n >;\n\n for (const argVal of rest.concat(\"-\")) {\n if (_isValidOptionAlias(argVal)) {\n if (currentAlias) {\n const rawValue = currentVals.join(\" \");\n const optionName = aliases[currentAlias] ?? currentAlias;\n if (\n _isValidFullOptionName(optionName) &&\n !isEmptyObject(globalOptionArgs) &&\n globalOptionArgs[optionName]\n ) {\n rawGlobalOptionArgs[optionName] = rawValue;\n } else {\n rawOptionArgs[optionName] = rawValue;\n }\n }\n currentAlias = argVal;\n currentVals = [];\n } else {\n currentVals.push(argVal);\n }\n }\n\n _runCLIHelper({ rawPositionalArgs, rawOptionArgs, rawGlobalOptionArgs, cli });\n}\n","import { createCLI } from \"./AcclimateCLI\";\nimport { runCLI } from \"./AcclimateCLI/runCLI/runCLI\";\nimport type { AnyCLI, IAcclimateCLI } from \"./AcclimateCLI/AcclimateCLI.types\";\n\nconst COLOR_CODES: Record<string, string> = {\n reset: \"\\x1b[0m\",\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n bright_black: \"\\x1b[90m\",\n gray: \"\\x1b[90m\",\n grey: \"\\x1b[90m\",\n bright_red: \"\\x1b[91m\",\n bright_green: \"\\x1b[92m\",\n bright_yellow: \"\\x1b[93m\",\n bright_blue: \"\\x1b[94m\",\n bright_magenta: \"\\x1b[95m\",\n bright_cyan: \"\\x1b[96m\",\n bright_white: \"\\x1b[97m\",\n};\n\nconst PARAM_TOKEN_REGEX = /\\$([a-zA-Z0-9_]+)\\$/g;\nconst COLOR_TOKEN_REGEX = /\\|([a-zA-Z_]+)\\|/g;\n\n/**\n * Replaces `$token$` placeholders with values from `params`.\n * If a token does not exist in `params`, the placeholder is left unchanged.\n */\nfunction interpolateParams(message: string, params: Record<string, string>) {\n return message.replace(PARAM_TOKEN_REGEX, (match, key: string) => {\n const value = params[key];\n return value ?? match;\n });\n}\n\nfunction applyColors(message: string) {\n return message.replace(COLOR_TOKEN_REGEX, (match, colorName: string) => {\n const code = COLOR_CODES[colorName.toLowerCase()];\n return code ?? match;\n });\n}\n\ntype Acclimate = {\n /**\n * Create a new Acclimate CLI instance.\n *\n * @param name - The name of the CLI.\n * @returns A new CLI instance.\n */\n createCLI: (name: string) => IAcclimateCLI;\n\n /**\n * Run a CLI instance.\n *\n * It can only be run once. Calling any other methods after `.run()` will\n * throw an error.\n *\n * @param cli - The CLI instance to run.\n */\n run: (cli: AnyCLI) => void;\n\n /**\n * Outputs a message with `console.log`.\n * Supports interpolation using `$varName$` as tokens.\n *\n * Colors can be changed within a message `|<COLOR_NAME>|` tokens.\n * Supported colors are:\n * - black\n * - red\n * - green\n * - yellow\n * - blue\n * - magenta\n * - cyan\n * - white\n * - bright_black|gray|grey\n * - bright_red\n * - bright_green\n * - bright_yellow\n * - bright_blue\n * - bright_magenta\n * - bright_cyan\n * - bright_white\n *\n * The color remains active until another color token is found,\n * or if |reset| is found (which resets the terminal color to the default).\n *\n * @example\n *\n * Acclimate.log(\"Hello $name$\", { name: \"Pablo\" });\n * // \"Hello Pablo\"\n *\n * Acclimate.log(\"|red|Error:|reset| There was an error.\")\n * // \"Error: There was an error.\"\n * // ^ the \"Error:\" portion will be red\n *\n */\n log: (message: string, params?: Record<string, string>) => void;\n};\n\nexport const Acclimate: Acclimate = {\n createCLI,\n run: (cli: AnyCLI) => {\n runCLI({ cli, input: process.argv.slice(2) });\n },\n log: (message: string, params: Record<string, string> = {}) => {\n const interpolated = interpolateParams(message, params);\n const colorized = applyColors(interpolated);\n console.log(colorized);\n },\n};\n"]}
|