@thisismanta/pessimist
v4.0.2
Published
This is a Node.js library that helps derive `process.argv` into a first-hand-**TypeScript** value-strict object with very minimal configurations.
Maintainers
Readme
This is a Node.js library that helps derive process.argv into a first-hand-TypeScript value-strict object with very minimal configurations.
import { parseArguments } from '@thisismanta/pessimist'
const {
// Types are derived from the default values supplied below
count, dryRun, outputFile,
...positionalArguments
} = parseArguments(process.argv.slice(2),
{
// Define your all possible arguments and their default values here
count: 0,
dryRun: false,
outputFile: '',
exclude: [] as string[],
},
{
// Forward -d to --dryRun (optional)
aliases: { d: 'dryRun' },
// Disallow both --dryRun and --outputFile to be supplied at the same time
exclusives: [['dryRun', 'outputFile']],
}
)
for (const item of Array.from(positionalArguments)) {
// Consume your positional argument here
}--count=3 -d --output-file-name=file3 file1 file2 The above example results in the below object:
{
// 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 arguments
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 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=0Auto negating through 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'] }Notice that 'file1' comes after 'file2' because it appears on the rightmost in the argument.
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 yield the opposite because of the ! operator defined in commit alias above.
--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