/chopsticks

More greedy argument parser like a minimist!

Primary LanguageJavaScript

Chopsticks

Installation

npm install chopsticks --save

Usage

chopsticks(args, opts={}) -> argv

  • opts.string
  • opts.boolean
  • opts.alias
  • opts.default
  • opts.stopEarly
  • opts.dash (aka opts['--'])
  • opts.unknown

minimist-v1.2.0 spec completed.

New features

  • Emoji support 👍 - can use emoji to short flags.

    node -e 'console.log(require("minimist")(["-🍣👹👺"]))'
    # { _: [], '�': '�👹👺' }
    
    node -e 'console.log(require("chopsticks")(["-🍣👹👺"]))'
    # { '🍣': true, '👹': true, '👺': true, _: [] }
  • opts.unknown=true - return the detailed object at argv.unknown.

    parse(['-f', 'true', '--no-foo', 'true', 'noop!', '--', 'huh'], { unknown: true });
    // {
    //   "_": [
    //     "huh"
    //   ],
    //   "unknown": [
    //     Flag { type: 'short', name: 'f', value: 'true' },
    //     Flag { type: 'long', name: 'foo', value: false },
    //     "true",
    //     "noop!"
    //   ]
    // }
  • opts.array - the specified flag takes the following argument continually. (like a npm-run-all)

    // $ node program.js -s cover lint report -s foo bar baz -- huh
    parse(process.argv.slice(2), { array: 's' });
    // {
    //   "_": [
    //     "huh"
    //   ],
    //   "s": [
    //     ['cover', 'lint', 'report'],
    //     ['foo', 'bar', 'baz']
    //   ]
    // }
  • opts.object - if specify flag names, the value of the specify flag is handled as key of the object.

    // $ node program.js -x one --y.two foo -z=three.baz
    parse(process.argv.slice(2), { object: ['x', 'y', 'z'] });
    // {
    //   _: [],
    //   x: {
    //     one: true,
    //   },
    //   y: {
    //     two: 'foo',
    //   },
    //   z: {
    //     three: {
    //       baz: true,
    //     },
    //   },
    // },

    if true, will handle all long flag without equal signs as object (e.g. affects --foo, not -f or --foo=bar)

  • opts.sentence - if true, argument with right-comma/right-period, is defined in "sentence". (like an abigail)

    // $ node program.js lorem. cover, lint, report. 'foo bar', baz. huh -- huh
    parse(process.argv.slice(2), { sentence: true });
    // {
    //   "_": [
    //     "huh",
    //     "huh"
    //   ],
    //   "sentence": [
    //     ['lorem'],
    //     ['cover', 'lint', 'report'],
    //     ['foo bar', 'baz']
    //   ]
    // }
  • Relative Filename Flag - if the flag name begins with a dot(e.g. --./path/to/file), it handled as a flag name.

    // $ node program.js --use-popular-plugin --./my-extra-plugin.js customValue
    parse(process.argv.slice(2));
    // {
    //   'use-popular-plugin': true,
    //   './my-extra-plugin.js': 'customValue',
    //   _: []
    // }
  • opts.nest - if true, recursively parsing the inside of brackets ([]). like a browserify syntax(aka subarg)

    // $ node program.js rawr --beep [ boop -a 3 ] -n4 --robots [ -x 8 -y 6 ]
    parse(process.argv.slice(2), { nest: true });
    // { _: [ 'rawr' ],
    // beep: { _: [ 'boop' ], a: 3 },
    // n: 4,
    // robots: { _: [], x: 8, y: 6 } }

Stacktrace was broken

node
> require('chopsticks')('error')
# TypeError: args is not an array
# at n.u.createClass.value (/path/to/chopsticks/lib/index.js:1:59798)

published code is compressed and the source map is provided. sourcemap isn't supported on NodeJS(current v5.10.0). but this resolved in the node-source-map-support.

npm install source-map-support --save-dev
import 'source-map-support/register';

or...

$ mocha --require source-map-support/register

you can check the original line number.

$ node
require('source-map-support/register');
require('chopsticks')('error');
# TypeError: args is not an array
#    at n.u.createClass.value (/Users/59naga/Downloads/chopsticks/src/Chopsticks.js:58:13)

Development

Requirement global

  • NodeJS v5.10.0
  • Npm v3.8.3
git clone https://github.com/59naga/chopsticks
cd chopsticks
npm install

npm test

License

MIT