From 43dcef13c24f303d37b4bc579a651978fde87e96 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 23 Dec 2018 10:34:24 -0800 Subject: [PATCH 01/19] chore: pin mri@1.1.1 for prev comparison --- bench/index.js | 10 +++++----- bench/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bench/index.js b/bench/index.js index 6cef9ad..7fa920c 100644 --- a/bench/index.js +++ b/bench/index.js @@ -9,10 +9,10 @@ const bench = new Suite(); const args = ['-b', '--bool', '--no-meep', '--multi=baz']; bench - .add('minimist ', () => minimist(args)) - .add('mri (prev) ', () => previous(args)) - .add('mri ', () => mri(args)) - .add('nopt ', () => nopt(args)) - .add('yargs-parser', () => yargs(args)) + .add('minimist ', () => minimist(args)) + .add('mri (1.1.1) ', () => previous(args)) + .add('mri ', () => mri(args)) + .add('nopt ', () => nopt(args)) + .add('yargs-parser ', () => yargs(args)) .on('cycle', e => console.log(String(e.target))) .run(); diff --git a/bench/package.json b/bench/package.json index db3996b..0cd8b82 100644 --- a/bench/package.json +++ b/bench/package.json @@ -2,7 +2,7 @@ "devDependencies": { "benchmark": "^2.1.4", "minimist": "^1.2.0", - "mri": "^0.1.0", + "mri": "1.1.1", "nopt": "^4.0.1", "yargs-parser": "^11.1.1" } From 248d076664234ca0ff4930aaee7a218efb4e2769 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 23 Dec 2018 10:40:59 -0800 Subject: [PATCH 02/19] test: ensure boolean args w/ default - thank you @marvinhagemeister --- test/index.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/index.js b/test/index.js index 88b3738..345356e 100644 --- a/test/index.js +++ b/test/index.js @@ -231,3 +231,18 @@ test('flag default null value', t => { t.same(argv, { foo:true, bar:null, _:[] }); t.end(); }); + +test('flag boolean with default', t => { + const foo = fn(['-t'], { default: { t:true }}); + t.same(foo, { t:true, _:[] }); + t.is(typeof foo.t, 'boolean'); + + const bar = fn(['-t'], { default: { t:false }}); + t.same(bar, { t:true, _:[] }); + t.is(typeof bar.t, 'boolean'); + + const baz = fn(['--no-two'], { default: { two:true }}); + t.same(baz, { two:false, _:[] }); + t.is(typeof baz.two, 'boolean'); + t.end(); +}); From a4759d51a5a5c86b902cf9d5484654fdfb1e2750 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 23 Dec 2018 10:53:08 -0800 Subject: [PATCH 03/19] test: additional typecasting tests w/ defaults --- test/index.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/index.js b/test/index.js index 345356e..458bf53 100644 --- a/test/index.js +++ b/test/index.js @@ -246,3 +246,37 @@ test('flag boolean with default', t => { t.is(typeof baz.two, 'boolean'); t.end(); }); + +test('flag boolean with default & alias', t => { + const alias = { t: ['tt'], two:['toot'] }; + + const foo = fn(['-t'], { alias, default: { t:true }}); + t.same(foo, { t:true, tt:true, _:[] }); + t.is(typeof foo.t, 'boolean'); + + const bar = fn(['-t'], { alias, default: { t:false }}); + t.same(bar, { t:true, tt:true, _:[] }); + t.is(typeof bar.t, 'boolean'); + + const baz = fn(['--no-two'], { alias, default: { two:true }}); + t.same(baz, { two:false, toot:false, _:[] }); + t.is(typeof baz.two, 'boolean'); + + t.end(); +}); + +test('flag boolean with default string & alias', t => { + const foo = fn(['-t'], { default: { t:'hi' }}); + t.same(foo, { t:'', _:[] }); + t.is(typeof foo.t, 'string'); + + const bar = fn(['-t'], { alias:{ t:'tt' }, default: { t:'boo' }}); + t.same(bar, { t:'', tt:'', _:[] }); + t.is(typeof bar.t, 'string'); + + // --no-* overrides + const baz = fn(['--no-two'], { default: { two:'hi' }}); + t.same(baz, { two:false, _:[] }); + t.is(typeof baz.two, 'boolean'); + t.end(); +}); From 94f8c0941088716be3c86b850a40dedbe0a2e520 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 23 Dec 2018 10:58:14 -0800 Subject: [PATCH 04/19] fix: check for boolean value before boolean cast; - Closes #8 --- lib/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.js b/lib/index.js index b4d8a0a..3a9e1c6 100644 --- a/lib/index.js +++ b/lib/index.js @@ -5,8 +5,8 @@ function toArr(any) { function toVal(out, key, val, opts) { var x, old=out[key], nxt=( !!~opts.string.indexOf(key) ? (val == null || val === true ? '' : String(val)) - : !!~opts.boolean.indexOf(key) ? (val === 'false' ? false : val === 'true' || (out._.push((x = +val,x * 0 === 0) ? x : val),!!val)) : typeof val === 'boolean' ? val + : !!~opts.boolean.indexOf(key) ? (val === 'false' ? false : val === 'true' || (out._.push((x = +val,x * 0 === 0) ? x : val),!!val)) : (x = +val,x * 0 === 0) ? x : val ); out[key] = old == null ? nxt : (Array.isArray(old) ? old.concat(nxt) : [old, nxt]); From 40051e689d80f77136ac990dafa2f27cdca48086 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 23 Dec 2018 11:08:01 -0800 Subject: [PATCH 05/19] 1.1.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8114446..0f242f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mri", - "version": "1.1.3", + "version": "1.1.4", "description": "Quickly scan for CLI flags and arguments", "repository": "lukeed/mri", "main": "lib/index.js", From 5437ea5cd9afcfcfe50c1c316aff990cac21231b Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Mon, 23 Mar 2020 21:34:57 -0700 Subject: [PATCH 06/19] fix: ensure default types cascade to alibi; - Closes #10 --- lib/index.js | 10 ++++++++-- test/index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/lib/index.js b/lib/index.js index 3a9e1c6..25fbf07 100644 --- a/lib/index.js +++ b/lib/index.js @@ -46,8 +46,14 @@ module.exports = function (args, opts) { if (defaults) { for (k in opts.default) { - opts.alias[k] = opts.alias[k] || []; - (opts[typeof opts.default[k]] || []).push(k); + name = typeof opts.default[k]; + arr = opts.alias[k] = opts.alias[k] || []; + if (opts[name] !== void 0) { + opts[name].push(k); + for (i=0; i < arr.length; i++) { + opts[name].push(arr[i]); + } + } } } diff --git a/test/index.js b/test/index.js index 458bf53..37abaa5 100644 --- a/test/index.js +++ b/test/index.js @@ -93,6 +93,54 @@ test('flag default and alias', t => { t.end(); }); +test('flag default string w/ alias', t => { + t.deepEqual( + fn(['--arg', '01'], { + alias: { a: ['arg'] }, + default: { arg: '' }, + }), + { _: [], arg: '01', a: '01' } + ); + + t.deepEqual( + fn(['-a', '01'], { + alias: { a: ['arg'] }, + default: { arg: '' }, + }), + { _: [], arg: '01', a: '01' } + ); + + // --- + + t.deepEqual( + fn(['-a', '01'], { + alias: { arg: ['a'] }, + default: { a: '' }, + }), + { _: [], arg: '01', a: '01' } + ); + + t.deepEqual( + fn(['--arg', '01'], { + alias: { arg: ['a'] }, + default: { a: '' }, + }), + { _: [], arg: '01', a: '01' } + ); + + // --- + + t.deepEqual( + fn(['-a', '01'], { + alias: { arg: ['a'] }, + default: { arg: '' }, + }), + { _: [], arg: '01', a: '01' } + ); + + t.end(); +}); + // test('newlines in params' , t => { // var args = fn(['-s', "X\nX"]) // t.deepEqual(args, { _ : [], s : "X\nX" }); From 98637157e3b316b712de96c6ef0b90af96cd2cbd Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Mon, 23 Mar 2020 21:43:23 -0700 Subject: [PATCH 07/19] chore: tiny perf tweak --- lib/index.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/index.js b/lib/index.js index 25fbf07..f17f13a 100644 --- a/lib/index.js +++ b/lib/index.js @@ -36,13 +36,15 @@ module.exports = function (args, opts) { } } - opts.boolean.forEach(key => { - opts.boolean = opts.boolean.concat(opts.alias[key] = opts.alias[key] || []); - }); + for (i=opts.boolean.length; i-- > 0;) { + arr = opts.alias[opts.boolean[i]] || []; + for (j=arr.length; j-- > 0;) opts.boolean.push(arr[j]); + } - opts.string.forEach(key => { - opts.string = opts.string.concat(opts.alias[key] = opts.alias[key] || []); - }); + for (i=opts.string.length; i-- > 0;) { + arr = opts.alias[opts.string[i]] || []; + for (j=arr.length; j-- > 0;) opts.string.push(arr[j]); + } if (defaults) { for (k in opts.default) { From 36e4a2636241b6126317e6427893175f4f421c70 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Mon, 23 Mar 2020 21:44:58 -0700 Subject: [PATCH 08/19] chore: update benchmark results --- readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/readme.md b/readme.md index d9cccb6..cf7730a 100644 --- a/readme.md +++ b/readme.md @@ -145,13 +145,13 @@ Once an unknown flag is encountered, parsing will terminate, regardless of your ## Benchmarks -``` -# Node v10.13.0 +> Running Node.js v10.13.0 -minimist x 324,469 ops/sec ±1.20% (96 runs sampled) -mri x 1,611,167 ops/sec ±0.22% (96 runs sampled) -nopt x 920,029 ops/sec ±1.13% (97 runs sampled) -yargs-parser x 39,542 ops/sec ±1.14% (95 runs sampled) +``` +minimist x 312,417 ops/sec ±0.85% (93 runs sampled) +mri x 1,641,208 ops/sec ±0.24% (93 runs sampled) +nopt x 910,276 ops/sec ±1.11% (88 runs sampled) +yargs-parser x 40,943 ops/sec ±1.37% (93 runs sampled) ``` ## License From 8e0a0f4bb88696a44b62d3d17311828b96a9640a Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Mon, 23 Mar 2020 21:48:57 -0700 Subject: [PATCH 09/19] 1.1.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f242f7..fe2cde7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mri", - "version": "1.1.4", + "version": "1.1.5", "description": "Quickly scan for CLI flags and arguments", "repository": "lukeed/mri", "main": "lib/index.js", From 81d65b65e7f1f07f286d2beab34611366562a836 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Tue, 14 Jul 2020 15:23:51 -0700 Subject: [PATCH 10/19] chore: move lib -> src --- {lib => src}/index.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {lib => src}/index.js (100%) diff --git a/lib/index.js b/src/index.js similarity index 100% rename from lib/index.js rename to src/index.js From dda3343b92b2d96facafaa38f1e55bd1bcbaf7fc Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Tue, 14 Jul 2020 15:25:52 -0700 Subject: [PATCH 11/19] feat: build `module` entry --- package.json | 5 ++++- src/index.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fe2cde7..ac6ca63 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.1.5", "description": "Quickly scan for CLI flags and arguments", "repository": "lukeed/mri", + "module": "lib/index.mjs", "main": "lib/index.js", "license": "MIT", "files": [ @@ -11,12 +12,13 @@ "author": { "name": "Luke Edwards", "email": "luke.edwards05@gmail.com", - "url": "lukeed.com" + "url": "https://lukeed.com" }, "engines": { "node": ">=4" }, "scripts": { + "build": "bundt", "bench": "node bench", "test": "tape test/*.js | tap-spec" }, @@ -31,6 +33,7 @@ "args" ], "devDependencies": { + "bundt": "1.0.2", "tap-spec": "^4.1.1", "tape": "^4.6.3" } diff --git a/src/index.js b/src/index.js index f17f13a..1a233e5 100644 --- a/src/index.js +++ b/src/index.js @@ -12,7 +12,7 @@ function toVal(out, key, val, opts) { out[key] = old == null ? nxt : (Array.isArray(old) ? old.concat(nxt) : [old, nxt]); } -module.exports = function (args, opts) { +export default function (args, opts) { args = args || []; opts = opts || {}; From fcb0555464352a73771d3b5d379ff610bfe65eb0 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Tue, 14 Jul 2020 15:26:45 -0700 Subject: [PATCH 12/19] chore: ignore future `lib` dir --- .gitignore | 3 +++ package.json | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a734e5b..fa297e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ node_modules .DS_Store +*-lock.* *.lock *.log + +/lib diff --git a/package.json b/package.json index ac6ca63..8ff879d 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ ], "devDependencies": { "bundt": "1.0.2", - "tap-spec": "^4.1.1", - "tape": "^4.6.3" + "tap-spec": "4.1.2", + "tape": "4.13.3" } } From b0b8f8e76e93682e2e0ad6e5aaa8a39c668b82fa Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Tue, 14 Jul 2020 15:29:04 -0700 Subject: [PATCH 13/19] chore: add "pretest" for CI --- .travis.yml | 1 - package.json | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7503aad..88a8dbe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ language: node_js node_js: - 6 - - 4 diff --git a/package.json b/package.json index 8ff879d..9171b83 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "scripts": { "build": "bundt", "bench": "node bench", + "pretest": "npm run build", "test": "tape test/*.js | tap-spec" }, "keywords": [ From 52f722e07216412424abf1ec1c01477b0760a29f Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Tue, 14 Jul 2020 15:30:56 -0700 Subject: [PATCH 14/19] 1.1.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9171b83..9aa6cf7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mri", - "version": "1.1.5", + "version": "1.1.6", "description": "Quickly scan for CLI flags and arguments", "repository": "lukeed/mri", "module": "lib/index.mjs", From 908bbfda410920e74f3cc6e1d886bf6758b51a72 Mon Sep 17 00:00:00 2001 From: Marais Rossouw Date: Fri, 10 Sep 2021 03:12:58 +1000 Subject: [PATCH 15/19] chore: migrate from TravisCI to GitHub Action (#16) * ci: moves from travis to github actions * Apply suggestions from code review Co-authored-by: Luke Edwards --- .github/FUNDING.yml | 1 + .github/workflows/ci.yml | 20 ++++++++++++++++++++ .travis.yml | 3 --- readme.md | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..a858fe0 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: lukeed \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..96fa516 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,20 @@ +name: CI + +on: [push, pull_request] + +jobs: + test: + name: Node.js v6 + runs-on: ubuntu-latest + timeout-minutes: 3 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 6 + + - name: Install + run: npm install + + - name: Tests + run: npm test \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 88a8dbe..0000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 6 diff --git a/readme.md b/readme.md index cf7730a..b7dc8ca 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# mri [![Build Status](https://travis-ci.org/lukeed/mri.svg?branch=master)](https://travis-ci.org/lukeed/mri) +# mri [![CI](https://github.com/lukeed/mri/workflows/CI/badge.svg?branch=master&event=push)](https://github.com/lukeed/mri/actions) > Quickly scan for CLI flags and arguments From 48e877c08a4f3078763a38ff0e51ade098bcf379 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 12 Sep 2021 13:32:15 -0700 Subject: [PATCH 16/19] feat: include typescript definitions; - Closes #17 --- index.d.ts | 21 +++++++++++++++++++++ package.json | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..a46e43d --- /dev/null +++ b/index.d.ts @@ -0,0 +1,21 @@ +type Dict = Record; +type Arrayable = T | T[]; +type Default = Dict; + +declare function mri(args?: string[], options?: mri.Options): mri.Argv; + +declare namespace mri { + export interface Options { + boolean?: Arrayable; + string?: Arrayable; + alias?: Dict>; + default?: Dict; + unknown?(flag: string): void; + } + + export type Argv = T & { + _: string[]; + } +} + +export = mri; diff --git a/package.json b/package.json index 9aa6cf7..228494b 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,10 @@ "repository": "lukeed/mri", "module": "lib/index.mjs", "main": "lib/index.js", + "types": "index.d.ts", "license": "MIT", "files": [ + "*.d.ts", "lib" ], "author": { From ca8baaa89c6657d5070860347996a6fc351d2f13 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 12 Sep 2021 15:34:41 -0700 Subject: [PATCH 17/19] chore: update benchmarks; - refresh results (still 10.13.0) - update & lock candidate versions --- bench/index.js | 20 ++++++++++++++++++-- bench/package.json | 8 ++++---- readme.md | 15 +++++++++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/bench/index.js b/bench/index.js index 7fa920c..110d355 100644 --- a/bench/index.js +++ b/bench/index.js @@ -1,10 +1,26 @@ -const nopt = require('nopt'); +const { Suite } = require('benchmark'); const previous = require('mri'); + +console.log('Load Times:'); + +console.time('nopt'); +const nopt = require('nopt'); +console.timeEnd('nopt'); + +console.time('yargs-parser'); const yargs = require('yargs-parser'); -const { Suite } = require('benchmark'); +console.timeEnd('yargs-parser'); + +console.time('minimist'); const minimist = require('minimist'); +console.timeEnd('minimist'); + +console.time('mri'); const mri = require('../lib'); +console.timeEnd('mri'); + +console.log('\nBenchmark:'); const bench = new Suite(); const args = ['-b', '--bool', '--no-meep', '--multi=baz']; diff --git a/bench/package.json b/bench/package.json index 0cd8b82..f567e3f 100644 --- a/bench/package.json +++ b/bench/package.json @@ -1,9 +1,9 @@ { "devDependencies": { - "benchmark": "^2.1.4", - "minimist": "^1.2.0", + "benchmark": "2.1.4", + "minimist": "1.2.5", "mri": "1.1.1", - "nopt": "^4.0.1", - "yargs-parser": "^11.1.1" + "nopt": "5.0.0", + "yargs-parser": "20.2.9" } } diff --git a/readme.md b/readme.md index b7dc8ca..9067e80 100644 --- a/readme.md +++ b/readme.md @@ -148,10 +148,17 @@ Once an unknown flag is encountered, parsing will terminate, regardless of your > Running Node.js v10.13.0 ``` -minimist x 312,417 ops/sec ±0.85% (93 runs sampled) -mri x 1,641,208 ops/sec ±0.24% (93 runs sampled) -nopt x 910,276 ops/sec ±1.11% (88 runs sampled) -yargs-parser x 40,943 ops/sec ±1.37% (93 runs sampled) +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 From e73e9f9d5b02124d14ac17dac2c4801687d3e99a Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sun, 12 Sep 2021 15:35:49 -0700 Subject: [PATCH 18/19] 1.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 228494b..5a224b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mri", - "version": "1.1.6", + "version": "1.2.0", "description": "Quickly scan for CLI flags and arguments", "repository": "lukeed/mri", "module": "lib/index.mjs", From 62b9ce4f25e1f7b476c99858c20882d86c010085 Mon Sep 17 00:00:00 2001 From: Luke Edwards Date: Sat, 20 Jan 2024 08:41:09 -0800 Subject: [PATCH 19/19] chore: add licenses badge --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 9067e80..bff4a04 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# mri [![CI](https://github.com/lukeed/mri/workflows/CI/badge.svg?branch=master&event=push)](https://github.com/lukeed/mri/actions) +# mri [![CI](https://github.com/lukeed/mri/workflows/CI/badge.svg?branch=master&event=push)](https://github.com/lukeed/mri/actions) [![licenses](https://licenses.dev/b/npm/mri)](https://licenses.dev/npm/mri) > Quickly scan for CLI flags and arguments