Options and Inputs
Configuring Options
When registering a option, you can configure its option name, alias, description, and validators, which Mustard supports in the form of parameter lists or objects:
import { Validator } from "mustard-cli/validator";
@Command('run')
class RunCommandHandle implements CommandStruct {
@Option('message')
@Option('message', 'm')
@Option('message', 'message option')
@Option('message', 'm', 'message option')
@Option('message', Validator.Required().String().MinLength(5))
@Option({
name: 'message',
alias: 'm',
description: 'message option',
validator: Validator.Required().String().MinLength(5)
})
private messageOption: string = 'message default value';
public run() {}
}
To split
@Option('message', 'm')
and@Option('message', 'message option')
overloads, if you provide a string which length is less than 3, it will be treated as alias, otherwise it will be treated as description.
Property messageOption
will be parsed as --message
or -m
option, and its default value is message default value
.
Variadic Options
Mustard supports variadic option by @VariadicOption
decorator, it will parse all the rest of the command line arguments into an array. And, it can be configured just like @Option
decorator except validator
:
@Command('run')
class RunCommandHandle implements CommandStruct {
@VariadicOption('projects')
@VariadicOption('projects', 'p')
@VariadicOption('projects', 'projects to handle')
@VariadicOption('projects', 'p', 'projects to handle')
@VariadicOption({
name: 'projects',
alias: 'p',
description: 'projects to handle',
})
private pprojectsToHandle: string[] = [];
public run() {}
}
Property pprojectsToHandle
will be parsed as --projects
or -p
option, and its default value is []
.
$ node index.js run --projects=project1 project2 project3
$ node index.js run --projects=project1 --project=project2 --project=project3
Mustard will use different cli arguments parser libraries depending on the situation, when there's no variadic option and no option alias provided, it will use
yargs-parser
as cli arguments parser , otherwisemri
will be used for performance improvement.
Validator
Mustard provide simple validator by Zod
, you can use it from Validator
namespace.
import { Validator } from "mustard-cli/validator";
Validator.Required().String().MinLength(5);
Validator.Required().String().StartsWith('node-');
Validator.Number().Int();
Validator.Boolean();
enum ValidSource {}
Validator.Optional().Enum(ValidSource)
Restrict Values
type Templates = 'foo' | 'bar';
@Command('run')
class RunCommand implements CommandStruct {
@Option()
template: Template = 'foo';
public run() {}
}
In command registration above, when we execute command like bin run --template=baz
, Mustard doesnot validate if it's from pre-defined valid values, and we cannot add validation from @Validator.Enum()
.
But this can be a common suitation that we'd like to ensure valid user input for some options:
- If we received 'foo' or 'bar', use it;
- If we received
undefined
, use the default value; - If we received any unexpected value, use the default value;
Decorator @Restrict
should help in such cases:
const templates = ['foo', 'bar'] as const;
type RestrictTemplates = typeof templates[number];
@Command('run')
class RunCommand implements CommandStruct {
@Option()
@Restrict(templates)
template: RestrictTemplates = 'foo';
public run() {}
}
Usage:
@Restrict(/* Expected values for this property */)
- When
restrictValues
was specified as array, we need to ensure the provided value was included by it. - When
restrictValues
was an object(Enum usually), we need to ensure the provided value was included in all of its values;