59naga/chopsticks

View on GitHub
README.md

Summary

Maintainability
Test Coverage
![Chopsticks](https://cloud.githubusercontent.com/assets/1548478/14408405/822af84a-ff2e-11e5-81d9-9d2d05f48911.gif)
---

<p align="right">
  <a href="https://npmjs.org/package/chopsticks">
    <img src="https://img.shields.io/npm/v/chopsticks.svg?style=flat-square">
  </a>
  <a href="https://travis-ci.org/59naga/chopsticks">
    <img src="http://img.shields.io/travis/59naga/chopsticks.svg?style=flat-square">
  </a>
  <a href="https://ci.appveyor.com/project/59naga/chopsticks">
    <img src="https://img.shields.io/appveyor/ci/59naga/chopsticks.svg?style=flat-square">
  </a>
  <a href="https://codeclimate.com/github/59naga/chopsticks/coverage">
    <img src="https://img.shields.io/codeclimate/github/59naga/chopsticks.svg?style=flat-square">
  </a>
  <a href="https://codeclimate.com/github/59naga/chopsticks">
    <img src="https://img.shields.io/codeclimate/coverage/github/59naga/chopsticks.svg?style=flat-square">
  </a>
  <a href="https://gemnasium.com/59naga/chopsticks">
    <img src="https://img.shields.io/gemnasium/59naga/chopsticks.svg?style=flat-square">
  </a>
</p>

Installation
---
```bash
npm install chopsticks --save
```

Usage
---

## `chopsticks(args, opts={})` -> `argv`
- [x] `opts.string`
- [x] `opts.boolean`
- [x] `opts.alias`
- [x] `opts.default`
- [x] `opts.stopEarly`
- [x] `opts.dash` (aka `opts['--']`)
- [x] `opts.unknown`

> [minimist-v1.2.0](https://github.com/substack/minimist#methods) spec completed.

## New features
- [x] Emoji support :+1: - can use emoji to short flags.
  ```bash
  node -e 'console.log(require("minimist")(["-🍣👹👺"]))'
  # { _: [], '�': '�👹👺' }

  node -e 'console.log(require("chopsticks")(["-🍣👹👺"]))'
  # { '🍣': true, '👹': true, '👺': true, _: [] }
  ```

- [x] `opts.unknown=true` - return the detailed object at `argv.unknown`.

  ```js
  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!"
  //   ]
  // }
  ```

- [x] `opts.array` - the specified flag takes the following argument continually. (like a [npm-run-all](https://github.com/mysticatea/npm-run-all#run-a-mix-of-sequential-and-parallel-tasks))

  ```js
  // $ 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']
  //   ]
  // }
  ```

- [x] `opts.object` - if specify flag names, the value of the specify flag is handled as key of the object.

  ```js
  // $ 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`)

- [x] `opts.sentence` - if `true`, argument with right-comma/right-period, is defined in "sentence". (like an [abigail](https://github.com/abigailjs/abigail#usage))

  ```js
  // $ 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']
  //   ]
  // }
  ```

- [x] Relative Filename Flag - if the flag name begins with a dot(e.g. `--./path/to/file`), it handled as a flag name.

  ```js
  // $ 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',
  //   _: []
  // }
  ```

- [x] `opts.nest` - if `true`, recursively parsing the inside of brackets (`[]`). like a [browserify syntax(aka subarg)](https://github.com/substack/subarg#subarg)

  ```js
  // $ 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
---
```bash
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](https://github.com/evanw/node-source-map-support#readme).

```bash
npm install source-map-support --save-dev
```
```js
import 'source-map-support/register';
```
or...
```bash
$ mocha --require source-map-support/register
```

you can check the original line number.

```bash
$ 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

```bash
git clone https://github.com/59naga/chopsticks
cd chopsticks
npm install

npm test
```

License
---
[MIT](http://59naga.mit-license.org/)