Spaces:
Runtime error
Runtime error
| # mri [](https://github.com/lukeed/mri/actions) | |
| > Quickly scan for CLI flags and arguments | |
| This is a [fast](#benchmarks) and lightweight alternative to [`minimist`](https://github.com/substack/minimist) and [`yargs-parser`](https://github.com/yargs/yargs-parser). | |
| It only exists because I find that I usually don't need most of what `minimist` and `yargs-parser` have to offer. However, `mri` is similar _enough_ that it might function as a "drop-in replacement" for you, too! | |
| See [Comparisons](#comparisons) for more info. | |
| ## Install | |
| ```sh | |
| $ npm install --save mri | |
| ``` | |
| ## Usage | |
| ```sh | |
| $ demo-cli --foo --bar=baz -mtv -- hello world | |
| ``` | |
| ```js | |
| const mri = require('mri'); | |
| const argv = process.argv.slice(2); | |
| mri(argv); | |
| //=> { _: ['hello', 'world'], foo:true, bar:'baz', m:true, t:true, v:true } | |
| mri(argv, { boolean:['bar'] }); | |
| //=> { _: ['baz', 'hello', 'world'], foo:true, bar:true, m:true, t:true, v:true } | |
| mri(argv, { | |
| alias: { | |
| b: 'bar', | |
| foo: ['f', 'fuz'] | |
| } | |
| }); | |
| //=> { _: ['hello', 'world'], foo:true, f:true, fuz:true, b:'baz', bar:'baz', m:true, t:true, v:true } | |
| ``` | |
| ## API | |
| ### mri(args, options) | |
| Return: `Object` | |
| #### args | |
| Type: `Array`<br> | |
| Default: `[]` | |
| An array of arguments to parse. For CLI usage, send `process.argv.slice(2)`. See [`process.argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) for info. | |
| #### options.alias | |
| Type: `Object`<br> | |
| Default: `{}` | |
| An object of keys whose values are `String`s or `Array<String>` of aliases. These will be added to the parsed output with matching values. | |
| #### options.boolean | |
| Type: `Array|String`<br> | |
| Default: `[]` | |
| A single key (or array of keys) that should be parsed as `Boolean`s. | |
| #### options.default | |
| Type: `Object`<br> | |
| Default: `{}` | |
| An `key:value` object of defaults. If a default is provided for a key, its type (`typeof`) will be used to cast parsed arguments. | |
| ```js | |
| mri(['--foo', 'bar']); | |
| //=> { _:[], foo:'bar' } | |
| mri(['--foo', 'bar'], { | |
| default: { foo:true, baz:'hello', bat:42 } | |
| }); | |
| //=> { _:['bar'], foo:true, baz:'hello', bat:42 } | |
| ``` | |
| > **Note:** Because `--foo` has a default of `true`, its output is cast to a Boolean. This means that `foo=true`, making `'bar'` an extra argument (`_` key). | |
| #### options.string | |
| Type: `Array|String`<br> | |
| Default: `[]` | |
| A single key (or array of keys) that should be parsed as `String`s. | |
| #### options.unknown | |
| Type: `Function`<br> | |
| Default: `undefined` | |
| Callback that is run when a parsed flag has not been defined as a known key or alias. Its only parameter is the unknown flag itself; eg `--foobar` or `-f`. | |
| Once an unknown flag is encountered, parsing will terminate, regardless of your return value. | |
| > **Note:** `mri` _only_ checks for unknown flags if `options.unknown` **and** `options.alias` are populated. Otherwise, everything will be accepted. | |
| ## Comparisons | |
| #### minimist | |
| - `mri` is 5x faster (see [benchmarks](#benchmarks)) | |
| - Numerical values are cast as `Number`s when possible | |
| - A key (and its aliases) will always honor `opts.boolean` or `opts.string` | |
| - Short flag groups are treated as `Boolean`s by default: | |
| ```js | |
| minimist(['-abc', 'hello']); | |
| //=> { _:[], a:'', b:'', c:'hello' } | |
| mri(['-abc', 'hello']); | |
| //=> { _:[], a:true, b:true, c:'hello' } | |
| ``` | |
| - The `opts.unknown` behaves differently: | |
| - Unlike `minimist`, `mri` will not continue continue parsing after encountering an unknown flag | |
| - Missing `options`: | |
| - `opts.stopEarly` | |
| - `opts['--']` | |
| - Ignores newlines (`\n`) within args (see [test](https://github.com/substack/minimist/blob/master/test/parse.js#L69-L80)) | |
| - Ignores slashBreaks within args (see [test](https://github.com/substack/minimist/blob/master/test/parse.js#L147-L157)) | |
| - Ignores dot-nested flags (see [test](https://github.com/substack/minimist/blob/master/test/parse.js#L180-L197)) | |
| #### yargs-parser | |
| - `mri` is 40x faster (see [benchmarks](#benchmarks)) | |
| - Numerical values are cast as `Number`s when possible | |
| - A key (and its aliases) will always honor `opts.boolean` or `opts.string` | |
| - Missing `options`: | |
| - `opts.array` | |
| - `opts.config` | |
| - `opts.coerce` | |
| - `opts.count` | |
| - `opts.envPrefix` | |
| - `opts.narg` | |
| - `opts.normalize` | |
| - `opts.configuration` | |
| - `opts.number` | |
| - `opts['--']` | |
| - Missing [`parser.detailed()`](https://github.com/yargs/yargs-parser#requireyargs-parserdetailedargs-opts) method | |
| - No [additional configuration](https://github.com/yargs/yargs-parser#configuration) object | |
| - Added [`options.unknown`](#optionsunknown) feature | |
| ## Benchmarks | |
| > Running Node.js v10.13.0 | |
| ``` | |
| Load Times: | |
| nopt 3.179ms | |
| yargs-parser 2.137ms | |
| minimist 0.746ms | |
| mri 0.517ms | |
| Benchmark: | |
| minimist x 328,747 ops/sec ±1.09% (89 runs sampled) | |
| mri x 1,622,801 ops/sec ±0.94% (92 runs sampled) | |
| nopt x 888,223 ops/sec ±0.22% (92 runs sampled) | |
| yargs-parser x 30,538 ops/sec ±0.81% (91 runs sampled) | |
| ``` | |
| ## License | |
| MIT © [Luke Edwards](https://lukeed.com) | |