Skip to content

nullishamy/args-ts

Repository files navigation

args.ts

An argument parser, similar to yargs and co, but with superiour typing, extensibility, and ease of use.

Getting started

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!

Documentation

The API docs are hosted here, on Github Pages

About

Argument parsing, built for TypeScript.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages