'use strict'
|
|
/**
|
* Properly parse the given array in regards to object strings
|
* e.g. [ '--headers={Foo:', '5,', 'bar:', '6}' ] -> [ '--headers={"Foo": 5, "bar": 6}' ]
|
* @param {Array} args
|
*/
|
function splitArgObjects (args) {
|
const newArgs = []
|
let index = 0
|
|
while (index < args.length) {
|
const arg = args[index]
|
|
if (arg.indexOf('{') !== -1) {
|
const temp = []
|
|
while (args[index].indexOf('}') === -1) {
|
temp.push(args[index])
|
index++
|
}
|
temp.push(args[index])
|
|
newArgs.push(temp.join(' ').replace(/([\w\d-]+):\s*([\w\d-]*)/g, '"$1": "$2"'))
|
} else {
|
newArgs.push(arg)
|
}
|
|
index++
|
}
|
|
return newArgs
|
}
|
|
const parse = function parse (args = [], options = {}) {
|
if (!args.length) {
|
args = process.argv.slice(2)
|
}
|
|
if (args[0] && args[0].match(/node$/)) {
|
args = args.slice(2)
|
}
|
|
const newArgs = splitArgObjects(args)
|
function parseArgs (args, obj) {
|
// Check if end reached
|
if (!args.length) {
|
return obj
|
}
|
|
const arg = args[0]
|
|
// if statement match conditions:
|
// 1. --key=value || -key=value
|
// 2. --no-key
|
// 3. --key value|nothing
|
// else add to unknown arr
|
if (/^(--|-).+=/.test(arg)) {
|
const match = arg.match(/^(--|-)([^=]+)=([\s\S]*)$/)
|
// Set key(match[2]) = value(match[3])
|
obj[match[2]] = match[3]
|
} else if (/^--no-.+/.test(arg)) {
|
// Set key = true
|
obj[arg.match(/^--no-(.+)/)[1]] = false
|
} else if (/^(--|-).+/.test(arg)) {
|
const key = arg.match(/^(--|-)(.+)/)[2]
|
const next = args[1]
|
|
// If next value exist and not prefixed with - or --
|
if (next && !/^(-|--)/.test(next)) {
|
obj[key] = next
|
return parseArgs(args.slice(2), obj)
|
} else {
|
obj[key] = true
|
}
|
} else {
|
obj.unknown.push(arg)
|
}
|
|
return parseArgs(args.slice(1), obj)
|
}
|
|
const parseResult = parseArgs(newArgs, { unknown: [] })
|
|
// Covert to proper type
|
for (let prop in parseResult) {
|
try {
|
parseResult[prop] = JSON.parse(parseResult[prop])
|
} catch (e) {
|
continue
|
}
|
}
|
|
return parseResult
|
}
|
|
module.exports = parse
|