Skip to content

Instantly share code, notes, and snippets.

@alshdavid
Created November 4, 2022 07:13
Show Gist options
  • Save alshdavid/fac4b922472f79aeb96a4d6fdb6c59c5 to your computer and use it in GitHub Desktop.
Save alshdavid/fac4b922472f79aeb96a4d6fdb6c59c5 to your computer and use it in GitHub Desktop.
Simple argument parsing function for Node.js

Usage

const args = parseArgs(process.argv.splice(2))
const args = parseArgs(['--foo', 'one'])

console.log(args.foo) // ['one']
const args = parseArgs(['--foo', 'one', '--fizz', '--buzz', '--foo', 'two'])

console.log(args.foo) // ['one', 'two']
console.log(args.fizz) // ['true']
console.log(args.buzz) // ['true']
const args = parseArgs(['--foo', '--bar', 'one', 'fizzbuzz'])

console.log(args.foo) // ['true']
console.log(args.bar) // ['one']
console.log(args._) // ['fizzbuzz']

TypeScript

const args = parseArgs<['foo', 'bar']>(process.argv.splice(2))

args.foo // fine
args.bar // fine
args.fizz // type error
/**
* @param {Array.<string>} argsList
* @returns {Object.<string,string[]>}
*/
export function parseArgs(argsList) {
const args = {
_: []
}
for (let i = 0; i < argsList.length; i++) {
const completeSymbol = argsList[i]
const strippedSymbol = completeSymbol.replace('-', '').replace('-', '')
if (completeSymbol.startsWith('-')) {
if (!(strippedSymbol in args)) {
args[strippedSymbol] = []
}
const nextSymbol = argsList[i+1]
if (nextSymbol === undefined || nextSymbol.startsWith('-')) {
args[strippedSymbol].push(true)
} else {
args[strippedSymbol].push(nextSymbol)
i++
}
continue
}
args._.push(strippedSymbol)
}
return args
}
export type ParsedArgs<T extends Array<string>> = {
[K in T[number]]: string[]
}
export function parseArgs(argsList: string[]): ParsedArgs<['_']> & { [key: string]: string[] | undefined }
export function parseArgs<T extends Array<string>>(argsList: string[]): ParsedArgs<['_']> & ParsedArgs<T>
export function parseArgs<T extends Array<string>>(argsList: string[]): ParsedArgs<['_']> & ParsedArgs<T> {
const args: ParsedArgs<['_']> = {
_: []
}
for (let i = 0; i < argsList.length; i++) {
const completeSymbol = argsList[i]
const strippedSymbol = completeSymbol.replace('-', '').replace('-', '')
if (completeSymbol.startsWith('-')) {
if (!(strippedSymbol in args)) {
args[strippedSymbol] = []
}
const nextSymbol = argsList[i+1]
if (nextSymbol === undefined || nextSymbol.startsWith('-')) {
args[strippedSymbol].push(true)
} else {
args[strippedSymbol].push(nextSymbol)
i++
}
continue
}
args._.push(strippedSymbol)
}
return args as ParsedArgs<['_']> & ParsedArgs<T>
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment