Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@thisismanta/pessimist

ThisIsManta229.3kISC3.1.0TypeScript support: included

This is a Node.js library that helps derive process.argv array into a flexible, value-strict, TypeScript-friendly object.

argv, parser, optimist, minimist, yargs

readme

This is a Node.js library that helps derive process.argv array into a flexible, value-strict, TypeScript-friendly object.

import { parseArguments } from '@thisismanta/pessimist'

const { 
  count, dryRun, outputFile, 
  ...positionalArguments
} = parseArguments(
  process.argv.slice(2), 
  {
    // Define the default values
    count: 0,
    dryRun: false,
    outputFile: '',
    exclude: [],
  },
  {
    // Define the special treatments
    aliases: { d: 'dryRun' },
    exclusives: [['dryRun', 'outputFile']],
  }
)

for (const item of Array.from(positionalArguments)) {
  // Consume your positional argument here
}
--count=3 -d --output-file-name=file3 file1 file2 
{
  // From the named arguments
  count: 3,
  dryRun: true,
  outputFile: 'file3',

  // From the positional arguments
  '0': 'file1', 
  '1': 'file2',
  length: 2,

  // From the default values
  exclude: [],
}

Rejecting unknown inputs

The below command argument exits with non-zero code because somethingElse is not defined in the default object (the second parameter of parseArguments function).

--something-else
# Error: Unexpected an unknown argument: --something-else

Therefore it is important to have all the possible field-value arguments defined in the default object.

Auto converting argument names from dash-case to camelCase

The below command arguments are the same because dry-run is transformed into a camel case.

--dryRun  # { dryRun: true }
--dry-run # { dryRun: true }

Auto converting false-like values

--dryRun=false # { dryRun: false }
--dryRun=False
--dryRun=FALSE
--dryRun=n
--dryRun=no
--dryRun=0

Supporting no name prefix

Having no argument prefix negates the Boolean value.

--noDryRun         # { dryRun: false }
--no-dry-run       # { dryRun: false }
--no-dry-run=false # { dryRun: true }

Having no argument prefix clears the string value.

--noOutputFile    # { outputFile: '' }
--no-output-file  # { outputFile: '' }

Having no argument prefix for an array removes the given value from the output array.

--exclude=file1 --exclude=file2 --no-exclude=file1
# { exclude: ['file2'] }

Auto removing duplicate values

--exclude=file1 --exclude=file2 --exclude=file1
# { input: ['file2', 'file1'] }

Note that, unlike _.uniq([...]) and new Set([...]), the order is sorted where the most recent value will appear at the end of the array.

Supporting name aliases

parseArguments(
  process.argv.slice(2), 
  {
    dryRun: false
  },
  {
    aliases: {
      d: 'dryRun',
      commit: '!dryRun'
    }
  }
)
--dryRun # { dryRun: true }
-d       # { dryRun: true }

However, the below command arguments are the opposite because the ! operator negates the value as defined in commit alias.

--commit    # { dryRun: false }
--noCommit  # { dryRun: true }
--no-commit # { dryRun: true }

Supporting single-letter short-hand arguments

parseArguments(
  process.argv.slice(2), 
  {
    verbose: false,
    f: false,
  },
  {
    aliases: {
      v: 'verbose',
    }
  }
)
-vf # { verbose: true, f: true }

Rejecting mutual exclusive names

parseArguments(
  process.argv.slice(2), 
  {
    dryRun: false,
    commit: true,
  },
  {
    exclusives: [['dryRun', 'commit'], ...],
  }
)
--dryRun --commit
# Error: Unexpected mutual exclusive arguments: --dryRun --commit