npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

arghs

v1.2.3

Published

Small, flexible command-line argument parser

Readme

arghs

Small, flexible command-line argument parser for node.js

Overview

Arghs is so you don't have to write another argument parser for node, like, ever (unless you're reimplementing git, in which case good luck to you), and so you don't have to pull in yet another library with three dozen dependencies to do it for you (and spend hours or days tweaking the config). Arghs is small, fast, flexible, totally self-contained, easy to invoke, and gives you the options you want in easily-accessible form: just a plain old object. It'll even build and format the help text for you.

It won't cook breakfast for you, though — you're on your own there.

Quick start example

parse.js

#!/usr/bin/env node
'use strict';

var parsed = require('arghs')
  .named(['path', 'dest'])
  .options({
    'default-user': 'bool',
    'id': ['array', 'id'],
    'num': ['string', 'n'],
    'post': 'bool',
    'user-id': 'string',
    'verbose': 'count',
  })
  .aliases({
    'd': 'default-user',
    'i': 'id',
    'n': 'num',
    'p': 'post',
    'u': 'user-id',
    'v': 'verbose'
  })
  .help({
    'default-user': 'use default user for request',
    'id': 'use item id(s) for request',
    'num': 'number of items to retrieve',
    'post': 'send POST request instead of GET',
    'user-id': 'use this user id for request',
    'verbose': 'show parsed request parameters'
  })
  .strict({
    named: true,
    unnamed: false,
    unknown: false,
    invalid: true
  })
  .usage('Usage: $1 [OPTIONS...] <PATH> <DEST>\nParse args and display, with PATH and DEST as just...things')
  .parse();

console.log('Args:', parsed);
console.log('Unnamed:', parsed._);
console.log('Unknown:', parsed.$);
console.log('Overflow:', parsed['--']);

or...

parse.js

#!/usr/bin/env node
'use strict';

var parsed = require('arghs')({
  named: ['path', 'dest'],
  options: {
    'default-user': 'bool',
    'id': ['array', 'id'],
    'num': ['string', 'n'],
    'post': 'bool',
    'user-id': 'string',
    'verbose': 'count',
  },
  aliases: {
    'd': 'default-user',
    'i': 'id',
    'n': 'num',
    'p': 'post',
    'u': 'user-id',
    'v': 'verbose'
  },
  help: {
    'default-user': 'use default user for request',
    'id': 'use item id(s) for request',
    'num': 'number of items to retrieve',
    'post': 'send POST request instead of GET',
    'user-id': 'use this user id for request',
    'verbose': 'show parsed request parameters'
  },
  strict: {
    named: true,
    unnamed: false,
    unknown: false,
    invalid: true
  },
  usage: 'Usage: $1 [OPTIONS...] <PATH> <DEST>\nParse args and display, with PATH and DEST as just...things'
}).parse();

console.log('Args:', parsed);
console.log('Unnamed:', parsed._);
console.log('Unknown:', parsed.$);
console.log('Overflow:', parsed['--']);

Try it:

parse.js beep -vv boop --user-id charlie --id=5,10 wiki --post -n 654 --wakka blam -- next -k

You should get:

Args: { verbose: 2,
  id: [ '5', '10' ],
  post: true,
  num: '654',
  userId: 'charlie',
  path: 'beep',
  dest: 'boop' }
Unnamed: [ 'wiki' ]
Unknown: { wakka: 'blam' }
Overflow: [ 'next', '-k' ]

Or just see the help text:

./parse.js --help
Usage: parse.js [OPTIONS...] <PATH> <DEST>
Parse args and display, with PATH and DEST as just...things

Options:
  -d, --default-user  use default user for request
  -h, --help          show this help message and exit
  -i, --id <id>       use item id(s) for request
  -n, --num <n>       number of items to retrieve
  -p, --post          send POST request instead of GET
  -u, --user-id <x>   use this user id for request
  -v, --verbose       show parsed request parameters

Returned object

Let's call it parsed. Any options you specify in options(), and any named positional arguments in named(), will, if given values on the command line, be present in parsed as own, enumerable properties. Additional (unnamed) positional arguments are available as an array at parsed._. Extra (unknown) options and their values are in a POO at parsed.$. Overflow arguments — anything given after -- on the command line — are in an array at parsed['--']. Invalid options (missing values, unknown short options, multiply-specified single options) are at parsed['?'] (unless you're running in strict() mode, in which case the usage message and validation error are printed to stderr and the process exits).

The properties _, $, ?, and -- are non-enumerable, as well, so you can safely iterate over parsed and not accidently pollute something else with extra stuff.

Option types

You've got bool, count, string, and array. Arghs does no type conversions on its own, assuming you'll know better, except for splitting the --option=val1,val2,val3 syntax into an array of ['val1', 'val2', 'val3']. If string options are specified multiple times, the latest value wins, and an error is added to parsed['?'] for that option name. (For bool options, the error is also added, but overwriting true with true is less useful.)

Options not given on the command line are not present as properties in parsed. However, named arguments not given are explicitly set in parsed with a value of undefined. Unknown options given with long syntax (--option) are assumed to consume the following argument as a value (the following non-hyphenated argument, that is — if the next argument begins with --, it's considered invalid). Unknown options with short syntax (-o) are ignored and the error added.

Option syntax

Full options are given with a -- prefix, as in --option. Options of type bool and count consume no additional arguments, where string and array options consume the next non-hyphenated argument as their value (--option value for strings, or --option value1 --option value2 for arrays), or can be given in contiguous form using '=' (as in --option=value for strings, or --option=value1,value2 for arrays). By default, unknown options are considered strings, and are converted to arrays if given multiple times.

You can specify a string or array option as [optionType, paramName] in options(), and the generated help text will use paramName in the option description, as in --option <paramName>. If paramName is not given, 'x' will be used. (See the example above.)

Short options, as in -o, are accepted if there is a corresponding entry in aliases(). Bool and count options can be combined, as in -bcc. String and array options consume the next non-hyphenated argument (-o value for strings, -o value1 -o value2 for arrays). Note: short options cannot use the '=' syntax, so -o=value is invalid.

Compound options (those with a '-' in their name) are by default converted to camelCase properties of parsed. You can also specify 'snake_case' or 'none' by calling compound('snake_case') or specifying compound: 'snake_case' in the configuration object.

Have fun (and stop writing argument parsers)!