An argument parser, similar to yargs and co, but with superiour typing, extensibility, and ease of use.
First, install the package from npm: npm i args.ts
.
Then, you can get up and running with the following sample:
import { Args, ParserOpts, a } from 'args.ts'
export const parserOpts: ParserOpts = {
programName: 'program-name',
programDescription: 'program description',
programVersion: 'v1.0',
}
const parser = new Args(parserOpts)
// Short arguments are optional, long arguments are required
.arg(['--long-arg', '-l'], a.string())
// You can chain calls to type to change how it is parsed
// and this will reflect in the parsed types, if appropriate
.arg(['--optional'], a.string().optional())
const result = await parser.parse('-l "hello world"')
// Make sure we only parsed args, and did not accept a subcommand etc
if (result.mode !== 'args') {
throw new Error('expected args')
}
const args = result.args
// { 'long-arg': 'hello world', optional: undefined }
args.ts can parse Numbers, Booleans and Strings by default, but you can add your own types with the Custom type, or with a custom argument class:
// Must use "verbose style" returns in callbacks
const myCustomCallback = async (value: string): Promise<CoercionResult<number>> => {
if (value == 'success') {
return {
ok: true,
passedValue: value,
returnedValue: 69
}
}
return {
ok: false,
passedValue: value,
error: new Error('error whilst parsing')
}
}
// Then, use the custom parser:
parser.arg(['--custom'], a.custom(myCustomCallback))
// Can use "compact" returns through the inherited helper
class CustomParseClass extends Argument<number> {
constructor () {
super('custom')
}
public async coerce (value: string): Promise<CoercionResult<number>> {
if (value === 'success') {
return this.ok(value, 69)
}
return this.err(value, new Error('error whilst coercing'))
}
}
// Then, use the custom parser
parser.arg(['--custom'], new CustomParseClass())
These fetchers can both be async, and the parser will await all promises returned.
You can look at the examples/
directory and the tests for a more up to date and feature complete usage guide!
The API docs are hosted here, on Github Pages