siesta-lite
Version:
Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers
101 lines (74 loc) • 3.31 kB
JavaScript
/*
Siesta 5.6.1
Copyright(c) 2009-2022 Bryntum AB
https://bryntum.com/contact
https://bryntum.com/products/siesta/license
*/
Role('Siesta.Launcher.Role.CanProcessArguments', {
methods : {
processArguments : function (args) {
var options = {}
var argv = []
var positionalGroups = {}
var currentOption
var addOption = function (name, value, optionsBag) {
if (optionsBag.hasOwnProperty(name)) {
var prevValue = optionsBag[ name ]
if (!(prevValue instanceof Array)) optionsBag[ name ] = [ prevValue ]
optionsBag[ name ].push(value)
} else
optionsBag[ name ] = value
currentOption = null
}
for (var i = 0; i < args.length; i++) {
var arg = args[ i ]
var match = /^\s*--([\w_\-\.]+)(?=\=(.*)|$)/.exec(arg)
// we get a switch like, --option or --option=value
if (match) {
var optionName = match[ 1 ]
var optionValue = match[ 2 ]
var groupMatch
if (groupMatch = /([\w_-]+)\.([\w_-]+)/.exec(optionName)) {
var groupName = groupMatch[ 1 ]
if (!positionalGroups[ groupName ]) positionalGroups[ groupName ] = []
positionalGroups[ groupName ].push('--' + groupMatch[ 2 ] + (optionValue != null ? '=' + optionValue : ''))
}
// dealing with current state first
// option w/o values get `new Boolean(true)` as value
if (currentOption) addOption(currentOption, new Boolean(true), options)
// now processing a new match
if (optionValue != undefined)
addOption(optionName, optionValue, options)
else
currentOption = optionName
} else
if (currentOption)
addOption(currentOption, arg, options)
else
argv.push(arg)
}
// option w/o values get `new Boolean(true)` as value
if (currentOption) addOption(currentOption, new Boolean(true), options)
var groups = {}
var regularOptions = {}
var match
for (var name in options) {
if (match = /([\w_-]+)\.([\w_-]+)/.exec(name)) {
var groupName = match[ 1 ]
var optionName = match[ 2 ]
var group = groups[ groupName ] = groups[ groupName ] || {}
addOption(optionName, options[ name ], group)
} else {
regularOptions[ name ] = options[ name ]
}
}
return {
options : regularOptions,
argv : argv,
groups : groups,
positionalGroups : positionalGroups
}
}
}
// eof methods
})