智能照明系统APP-本地串口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
LightingSystemApp-serial/.svn/pristine/08/08f1ca7051db47df792fad8e4be...

98 lines
2.1 KiB

3 years ago
'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