# decarg

> decorator based cli arguments parser

Latest version **1.3.0** (published 2022-08-21) · MIT license · 0 weekly downloads

## Install

```sh
npm install decarg
pnpm add decarg
yarn add decarg
bun add decarg
```

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.3.0 |
| Published | 2022-08-21 |
| First published | 2021-11-13 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 1 |
| Unpacked size | 362.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 1 |
| Author | stagas |
| Maintainers | stagas |
| Keywords | decorator, options, arguments, cli, parser |

## Links

- npm: https://www.npmjs.com/package/decarg
- Repository: https://git@github.com/stagas/decarg
- Homepage: https://github.com/stagas/decarg#readme
- Issues: https://github.com/stagas/decarg/issues
- npm.io page: https://npm.io/package/decarg

## Dependencies (1)

- [reflect-metadata](https://npm.io/package/reflect-metadata.md) ^0.1.13

## Alternatives

- [babylon](https://npm.io/package/babylon.md) — 5.1M weekly downloads
- [csscolorparser](https://npm.io/package/csscolorparser.md) — 3.7M weekly downloads
- [expr-eval-fork](https://npm.io/package/expr-eval-fork.md) — 1.5M weekly downloads
- [@leeoniya/ufuzzy](https://npm.io/package/@leeoniya/ufuzzy.md) — 247.7K weekly downloads
- [xml-parser](https://npm.io/package/xml-parser.md) — 78.4K weekly downloads

## Recent versions

- 1.3.0 (latest) — 2022-08-21
- 1.2.1 — 2022-07-30
- 1.2.0 — 2022-03-16
- 1.1.0 — 2021-12-21
- 1.0.2 — 2021-12-13
- 1.0.1 — 2021-11-13
- 1.0.0 — 2021-11-13

## README

<h1>
decarg <a href="https://npmjs.org/package/decarg"><img src="https://img.shields.io/badge/npm-v1.3.0-F00.svg?colorA=000"/></a> <a href="src"><img src="https://img.shields.io/badge/loc-278-FFF.svg?colorA=000"/></a> <a href="https://cdn.jsdelivr.net/npm/decarg@1.3.0/dist/decarg.min.js"><img src="https://img.shields.io/badge/brotli-4K-333.svg?colorA=000"/></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-F0B.svg?colorA=000"/></a>
</h1>

<p></p>

decorator based cli arguments parser

<h4>
<table><tr><td title="Triple click to select and copy paste">
<code>npm i decarg </code>
</td><td title="Triple click to select and copy paste">
<code>pnpm add decarg </code>
</td><td title="Triple click to select and copy paste">
<code>yarn add decarg</code>
</td></tr></table>
</h4>

## Examples

<details id="example$basic" title="basic" open><summary><span><a href="#example$basic">#</a></span>  <code><strong>basic</strong></code></summary>  <ul>    <details id="source$basic" title="basic source code" ><summary><span><a href="#source$basic">#</a></span>  <code><strong>view source</strong></code></summary>  <a href="example/basic.ts">example/basic.ts</a>  <p>

```ts
import { arg, decarg } from 'decarg'

class Options {
  @arg('<file> [<file>, decarg.]', 'Files to process') file!: string[]

  @arg('--', '[decarg.rest]', 'The rest of the arguments') passArgs = []

  @arg('-f', '--flag', 'Flag about something') flag = false

  @arg('-c', '--count', 'How many times') count = 42

  @arg('-C', 'Choose color', ['blue', 'red', 'yellow']) color = 'blue'

  @arg('-s', '--string', 'Some string') string = 'hmm'

  @arg('--meh', 'Meh') meh: string[] = []

  static examples = {
    '-f foo': 'Convert foo by force',
    '-f foo -s': 'Convert foo by force smoothly',
  }
}

const options = decarg(new Options())

// these fail:

// const options = decarg(new Options(), ['exec'])
// const options = decarg(new Options(), ['exec', '-C'])
// const options = decarg(new Options(), ['exec', '-C=green'])
// const options = decarg(new Options(), ['exec', '-c=not a number'])

// this passes:

// const options = decarg(new Options(), ['exec', 'foo'])

console.log(options)
```

</p>
</details></ul></details>

## API

<p>  <details id="OptionExpectedValueError$49" title="Class" ><summary><span><a href="#OptionExpectedValueError$49">#</a></span>  <code><strong>OptionExpectedValueError</strong></code>    </summary>  <a href="src/errors.ts#L20">src/errors.ts#L20</a>  <ul>        <p>  <details id="constructor$60" title="Constructor" ><summary><span><a href="#constructor$60">#</a></span>  <code><strong>constructor</strong></code><em>(option)</em>    </summary>  <a href="src/errors.ts#L22">src/errors.ts#L22</a>  <ul>    <p>  <details id="new OptionExpectedValueError$61" title="ConstructorSignature" ><summary><span><a href="#new OptionExpectedValueError$61">#</a></span>  <code><strong>new OptionExpectedValueError</strong></code><em>()</em>    </summary>    <ul><p><a href="#OptionExpectedValueError$49">OptionExpectedValueError</a>&lt;<a href="#T$62">T</a>&gt;</p>      <p>  <details id="option$63" title="Parameter" ><summary><span><a href="#option$63">#</a></span>  <code><strong>option</strong></code>    </summary>    <ul><p><span>Option</span>&lt;<a href="#T$62">T</a>&gt;</p>        </ul></details></p>  </ul></details></p>    </ul></details><details id="option$64" title="Property" ><summary><span><a href="#option$64">#</a></span>  <code><strong>option</strong></code>    </summary>  <a href="src/errors.ts#L21">src/errors.ts#L21</a>  <ul><p><span>Option</span>&lt;<a href="#T$62">T</a>&gt;</p>        </ul></details><details id="prepareStackTrace$54" title="Property" ><summary><span><a href="#prepareStackTrace$54">#</a></span>  <code><strong>prepareStackTrace</strong></code>    </summary>  <a href=""></a>  <ul><p><details id="__type$55" title="Function" ><summary><span><a href="#__type$55">#</a></span>  <em>(err, stackTraces)</em>    </summary>    <ul>    <p>    <details id="err$57" title="Parameter" ><summary><span><a href="#err$57">#</a></span>  <code><strong>err</strong></code>    </summary>    <ul><p><span>Error</span></p>        </ul></details><details id="stackTraces$58" title="Parameter" ><summary><span><a href="#stackTraces$58">#</a></span>  <code><strong>stackTraces</strong></code>    </summary>    <ul><p><span>CallSite</span>  []</p>        </ul></details>  <p><strong></strong><em>(err, stackTraces)</em>  &nbsp;=&gt;  <ul>any</ul></p></p>    </ul></details></p>        </ul></details><details id="stackTraceLimit$59" title="Property" ><summary><span><a href="#stackTraceLimit$59">#</a></span>  <code><strong>stackTraceLimit</strong></code>    </summary>  <a href=""></a>  <ul><p>number</p>        </ul></details><details id="captureStackTrace$50" title="Method" ><summary><span><a href="#captureStackTrace$50">#</a></span>  <code><strong>captureStackTrace</strong></code><em>(targetObject, constructorOpt)</em>    </summary>  <a href=""></a>  <ul>    <p>    <details id="targetObject$52" title="Parameter" ><summary><span><a href="#targetObject$52">#</a></span>  <code><strong>targetObject</strong></code>    </summary>    <ul><p>object</p>        </ul></details><details id="constructorOpt$53" title="Parameter" ><summary><span><a href="#constructorOpt$53">#</a></span>  <code><strong>constructorOpt</strong></code>    </summary>    <ul><p><span>Function</span></p>        </ul></details>  <p><strong>captureStackTrace</strong><em>(targetObject, constructorOpt)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>    </ul></details></p></ul></details><details id="OptionHelpRequested$84" title="Class" ><summary><span><a href="#OptionHelpRequested$84">#</a></span>  <code><strong>OptionHelpRequested</strong></code>    </summary>  <a href="src/errors.ts#L49">src/errors.ts#L49</a>  <ul>        <p>  <details id="constructor$95" title="Constructor" ><summary><span><a href="#constructor$95">#</a></span>  <code><strong>constructor</strong></code><em>(options)</em>    </summary>  <a href="src/errors.ts#L50">src/errors.ts#L50</a>  <ul>    <p>  <details id="new OptionHelpRequested$96" title="ConstructorSignature" ><summary><span><a href="#new OptionHelpRequested$96">#</a></span>  <code><strong>new OptionHelpRequested</strong></code><em>()</em>    </summary>    <ul><p><a href="#OptionHelpRequested$84">OptionHelpRequested</a>&lt;<a href="#T$97">T</a>&gt;</p>      <p>  <details id="options$98" title="Parameter" ><summary><span><a href="#options$98">#</a></span>  <code><strong>options</strong></code>    </summary>    <ul><p><span>Options</span>&lt;<a href="#T$97">T</a>&gt;</p>        </ul></details></p>  </ul></details></p>    </ul></details><details id="prepareStackTrace$89" title="Property" ><summary><span><a href="#prepareStackTrace$89">#</a></span>  <code><strong>prepareStackTrace</strong></code>    </summary>  <a href=""></a>  <ul><p><details id="__type$90" title="Function" ><summary><span><a href="#__type$90">#</a></span>  <em>(err, stackTraces)</em>    </summary>    <ul>    <p>    <details id="err$92" title="Parameter" ><summary><span><a href="#err$92">#</a></span>  <code><strong>err</strong></code>    </summary>    <ul><p><span>Error</span></p>        </ul></details><details id="stackTraces$93" title="Parameter" ><summary><span><a href="#stackTraces$93">#</a></span>  <code><strong>stackTraces</strong></code>    </summary>    <ul><p><span>CallSite</span>  []</p>        </ul></details>  <p><strong></strong><em>(err, stackTraces)</em>  &nbsp;=&gt;  <ul>any</ul></p></p>    </ul></details></p>        </ul></details><details id="stackTraceLimit$94" title="Property" ><summary><span><a href="#stackTraceLimit$94">#</a></span>  <code><strong>stackTraceLimit</strong></code>    </summary>  <a href=""></a>  <ul><p>number</p>        </ul></details><details id="captureStackTrace$85" title="Method" ><summary><span><a href="#captureStackTrace$85">#</a></span>  <code><strong>captureStackTrace</strong></code><em>(targetObject, constructorOpt)</em>    </summary>  <a href=""></a>  <ul>    <p>    <details id="targetObject$87" title="Parameter" ><summary><span><a href="#targetObject$87">#</a></span>  <code><strong>targetObject</strong></code>    </summary>    <ul><p>object</p>        </ul></details><details id="constructorOpt$88" title="Parameter" ><summary><span><a href="#constructorOpt$88">#</a></span>  <code><strong>constructorOpt</strong></code>    </summary>    <ul><p><span>Function</span></p>        </ul></details>  <p><strong>captureStackTrace</strong><em>(targetObject, constructorOpt)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>    </ul></details></p></ul></details><details id="OptionInvalidValueError$66" title="Class" ><summary><span><a href="#OptionInvalidValueError$66">#</a></span>  <code><strong>OptionInvalidValueError</strong></code>    </summary>  <a href="src/errors.ts#L35">src/errors.ts#L35</a>  <ul>        <p>  <details id="constructor$77" title="Constructor" ><summary><span><a href="#constructor$77">#</a></span>  <code><strong>constructor</strong></code><em>(option, value)</em>    </summary>  <a href="src/errors.ts#L37">src/errors.ts#L37</a>  <ul>    <p>  <details id="new OptionInvalidValueError$78" title="ConstructorSignature" ><summary><span><a href="#new OptionInvalidValueError$78">#</a></span>  <code><strong>new OptionInvalidValueError</strong></code><em>()</em>    </summary>    <ul><p><a href="#OptionInvalidValueError$66">OptionInvalidValueError</a>&lt;<a href="#T$79">T</a>&gt;</p>      <p>  <details id="option$80" title="Parameter" ><summary><span><a href="#option$80">#</a></span>  <code><strong>option</strong></code>    </summary>    <ul><p><span>Option</span>&lt;<a href="#T$79">T</a>&gt;</p>        </ul></details><details id="value$81" title="Parameter" ><summary><span><a href="#value$81">#</a></span>  <code><strong>value</strong></code>    </summary>    <ul><p>unknown</p>        </ul></details></p>  </ul></details></p>    </ul></details><details id="option$82" title="Property" ><summary><span><a href="#option$82">#</a></span>  <code><strong>option</strong></code>    </summary>  <a href="src/errors.ts#L36">src/errors.ts#L36</a>  <ul><p><span>Option</span>&lt;<a href="#T$79">T</a>&gt;</p>        </ul></details><details id="prepareStackTrace$71" title="Property" ><summary><span><a href="#prepareStackTrace$71">#</a></span>  <code><strong>prepareStackTrace</strong></code>    </summary>  <a href=""></a>  <ul><p><details id="__type$72" title="Function" ><summary><span><a href="#__type$72">#</a></span>  <em>(err, stackTraces)</em>    </summary>    <ul>    <p>    <details id="err$74" title="Parameter" ><summary><span><a href="#err$74">#</a></span>  <code><strong>err</strong></code>    </summary>    <ul><p><span>Error</span></p>        </ul></details><details id="stackTraces$75" title="Parameter" ><summary><span><a href="#stackTraces$75">#</a></span>  <code><strong>stackTraces</strong></code>    </summary>    <ul><p><span>CallSite</span>  []</p>        </ul></details>  <p><strong></strong><em>(err, stackTraces)</em>  &nbsp;=&gt;  <ul>any</ul></p></p>    </ul></details></p>        </ul></details><details id="stackTraceLimit$76" title="Property" ><summary><span><a href="#stackTraceLimit$76">#</a></span>  <code><strong>stackTraceLimit</strong></code>    </summary>  <a href=""></a>  <ul><p>number</p>        </ul></details><details id="captureStackTrace$67" title="Method" ><summary><span><a href="#captureStackTrace$67">#</a></span>  <code><strong>captureStackTrace</strong></code><em>(targetObject, constructorOpt)</em>    </summary>  <a href=""></a>  <ul>    <p>    <details id="targetObject$69" title="Parameter" ><summary><span><a href="#targetObject$69">#</a></span>  <code><strong>targetObject</strong></code>    </summary>    <ul><p>object</p>        </ul></details><details id="constructorOpt$70" title="Parameter" ><summary><span><a href="#constructorOpt$70">#</a></span>  <code><strong>constructorOpt</strong></code>    </summary>    <ul><p><span>Function</span></p>        </ul></details>  <p><strong>captureStackTrace</strong><em>(targetObject, constructorOpt)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>    </ul></details></p></ul></details><details id="OptionValidationError$35" title="Class" ><summary><span><a href="#OptionValidationError$35">#</a></span>  <code><strong>OptionValidationError</strong></code>    </summary>  <a href="src/errors.ts#L8">src/errors.ts#L8</a>  <ul>        <p>  <details id="constructor$46" title="Constructor" ><summary><span><a href="#constructor$46">#</a></span>  <code><strong>constructor</strong></code><em>(message)</em>    </summary>  <a href="src/errors.ts#L9">src/errors.ts#L9</a>  <ul>    <p>  <details id="new OptionValidationError$47" title="ConstructorSignature" ><summary><span><a href="#new OptionValidationError$47">#</a></span>  <code><strong>new OptionValidationError</strong></code><em>()</em>    </summary>    <ul><p><a href="#OptionValidationError$35">OptionValidationError</a></p>      <p>  <details id="message$48" title="Parameter" ><summary><span><a href="#message$48">#</a></span>  <code><strong>message</strong></code>    </summary>    <ul><p>string</p>        </ul></details></p>  </ul></details></p>    </ul></details><details id="prepareStackTrace$40" title="Property" ><summary><span><a href="#prepareStackTrace$40">#</a></span>  <code><strong>prepareStackTrace</strong></code>    </summary>  <a href=""></a>  <ul><p><details id="__type$41" title="Function" ><summary><span><a href="#__type$41">#</a></span>  <em>(err, stackTraces)</em>    </summary>    <ul>    <p>    <details id="err$43" title="Parameter" ><summary><span><a href="#err$43">#</a></span>  <code><strong>err</strong></code>    </summary>    <ul><p><span>Error</span></p>        </ul></details><details id="stackTraces$44" title="Parameter" ><summary><span><a href="#stackTraces$44">#</a></span>  <code><strong>stackTraces</strong></code>    </summary>    <ul><p><span>CallSite</span>  []</p>        </ul></details>  <p><strong></strong><em>(err, stackTraces)</em>  &nbsp;=&gt;  <ul>any</ul></p></p>    </ul></details></p>        </ul></details><details id="stackTraceLimit$45" title="Property" ><summary><span><a href="#stackTraceLimit$45">#</a></span>  <code><strong>stackTraceLimit</strong></code>    </summary>  <a href=""></a>  <ul><p>number</p>        </ul></details><details id="captureStackTrace$36" title="Method" ><summary><span><a href="#captureStackTrace$36">#</a></span>  <code><strong>captureStackTrace</strong></code><em>(targetObject, constructorOpt)</em>    </summary>  <a href=""></a>  <ul>    <p>    <details id="targetObject$38" title="Parameter" ><summary><span><a href="#targetObject$38">#</a></span>  <code><strong>targetObject</strong></code>    </summary>    <ul><p>object</p>        </ul></details><details id="constructorOpt$39" title="Parameter" ><summary><span><a href="#constructorOpt$39">#</a></span>  <code><strong>constructorOpt</strong></code>    </summary>    <ul><p><span>Function</span></p>        </ul></details>  <p><strong>captureStackTrace</strong><em>(targetObject, constructorOpt)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>    </ul></details></p></ul></details><details id="arg$21" title="Function" ><summary><span><a href="#arg$21">#</a></span>  <code><strong>arg</strong></code><em>(description)</em>    </summary>  <a href="src/arg.ts#L7">src/arg.ts#L7</a>  <ul>    <p>    <details id="description$23" title="Parameter" ><summary><span><a href="#description$23">#</a></span>  <code><strong>description</strong></code>    </summary>    <ul><p><span>ArgDescription</span></p>        </ul></details>  <p><strong>arg</strong><em>(description)</em>  &nbsp;=&gt;  <ul>{<p>    <details id="target$26" title="Parameter" ><summary><span><a href="#target$26">#</a></span>  <code><strong>target</strong></code>    </summary>    <ul><p><span>Function</span></p>        </ul></details>  <p><strong></strong><em>(target)</em>  &nbsp;=&gt;  <ul>void</ul></p>  <details id="target$28" title="Parameter" ><summary><span><a href="#target$28">#</a></span>  <code><strong>target</strong></code>    </summary>    <ul><p><span>Object</span></p>        </ul></details><details id="propertyKey$29" title="Parameter" ><summary><span><a href="#propertyKey$29">#</a></span>  <code><strong>propertyKey</strong></code>    </summary>    <ul><p>string | symbol</p>        </ul></details>  <p><strong></strong><em>(target, propertyKey)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>}</ul></p></p>    </ul></details><details id="decarg$1" title="Function" ><summary><span><a href="#decarg$1">#</a></span>  <code><strong>decarg</strong></code><em>(target, argv, { exit, log })</em>    </summary>  <a href="src/index.ts#L17">src/index.ts#L17</a>  <ul>    <p>    <details id="target$4" title="Parameter" ><summary><span><a href="#target$4">#</a></span>  <code><strong>target</strong></code>    </summary>    <ul><p><a href="#T$3">T</a></p>        </ul></details><details id="argv$5" title="Parameter" ><summary><span><a href="#argv$5">#</a></span>  <code><strong>argv</strong></code>  <span><span>&nbsp;=&nbsp;</span>  <code>...</code></span>  </summary>    <ul><p>string  []</p>        </ul></details><details id="overrides$6" title="Parameter" ><summary><span><a href="#overrides$6">#</a></span>  <code><strong>overrides</strong></code>  <span><span>&nbsp;=&nbsp;</span>  <code>{}</code></span>  </summary>    <ul><p>{<p>  <details id="exit$8" title="Property" ><summary><span><a href="#exit$8">#</a></span>  <code><strong>exit</strong></code>    </summary>    <ul><p>undefined | <details id="__type$9" title="Function" ><summary><span><a href="#__type$9">#</a></span>  <em>(code)</em>    </summary>    <ul>    <p>    <details id="code$11" title="Parameter" ><summary><span><a href="#code$11">#</a></span>  <code><strong>code</strong></code>    </summary>    <ul><p>number</p>        </ul></details>  <p><strong></strong><em>(code)</em>  &nbsp;=&gt;  <ul>never</ul></p></p>    </ul></details></p>        </ul></details><details id="log$12" title="Property" ><summary><span><a href="#log$12">#</a></span>  <code><strong>log</strong></code>    </summary>    <ul><p>undefined | {<p>    <details id="data$15" title="Parameter" ><summary><span><a href="#data$15">#</a></span>  <code><strong>data</strong></code>    </summary>    <ul><p>any  []</p>        </ul></details>  <p><strong></strong><em>(data)</em>  &nbsp;=&gt;  <ul>void</ul></p>  <details id="data$17" title="Parameter" ><summary><span><a href="#data$17">#</a></span>  <code><strong>data</strong></code>    </summary>    <ul><p>any  []</p>        </ul></details>  <p><strong></strong><em>(data)</em>  &nbsp;=&gt;  <ul>void</ul></p>  <details id="message$19" title="Parameter" ><summary><span><a href="#message$19">#</a></span>  <code><strong>message</strong></code>    </summary>    <ul><p>any</p>        </ul></details><details id="optionalParams$20" title="Parameter" ><summary><span><a href="#optionalParams$20">#</a></span>  <code><strong>optionalParams</strong></code>    </summary>    <ul><p>any  []</p>        </ul></details>  <p><strong></strong><em>(message, optionalParams)</em>  &nbsp;=&gt;  <ul>void</ul></p></p>}</p>        </ul></details></p>}</p>        </ul></details>  <p><strong>decarg</strong>&lt;<span>T</span>&gt;<em>(target, argv, { exit, log })</em>  &nbsp;=&gt;  <ul>undefined | <a href="#T$3">T</a></ul></p></p>    </ul></details><details id="parse$30" title="Function" ><summary><span><a href="#parse$30">#</a></span>  <code><strong>parse</strong></code><em>(target, argv)</em>    </summary>  <a href="src/parse.ts#L17">src/parse.ts#L17</a>  <ul>    <p>    <details id="target$33" title="Parameter" ><summary><span><a href="#target$33">#</a></span>  <code><strong>target</strong></code>    </summary>    <ul><p><a href="#T$32">T</a></p>        </ul></details><details id="argv$34" title="Parameter" ><summary><span><a href="#argv$34">#</a></span>  <code><strong>argv</strong></code>  <span><span>&nbsp;=&nbsp;</span>  <code>...</code></span>  </summary>    <ul><p>string  []</p>        </ul></details>  <p><strong>parse</strong>&lt;<span>T</span>&gt;<em>(target, argv)</em>  &nbsp;=&gt;  <ul><a href="#T$32">T</a></ul></p></p>    </ul></details></p>

## Credits

- [reflect-metadata](https://npmjs.org/package/reflect-metadata) by [Ron Buckton](https://github.com/github.com) &ndash; Polyfill for Metadata Reflection API

## Contributing

[Fork](https://github.com/stagas/decarg/fork) or [edit](https://github.dev/stagas/decarg) and submit a PR.

All contributions are welcome!

## License

<a href="LICENSE">MIT</a> &copy; 2022 [stagas](https://github.com/stagas)

---
_Source: https://npm.io/package/decarg · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
