StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics https://doi.org/10.1109/TVCG.2020.3030352
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.
StackGenVis/frontend/node_modules/expand-args/index.js

268 lines
5.3 KiB

4 years ago
/*!
* expand-args <https://github.com/jonschlinkert/expand-args>
*
* Copyright (c) 2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
var utils = require('./utils');
var sep = /[=:]/;
function expand(argv, options) {
var opts = utils.merge({}, options);
var res = {};
var segs;
var val;
var key;
if (Array.isArray(argv)) {
argv = argv.reduce(function(acc, val) {
if (typeof val === 'string' && isWindowsPath(val)) {
res._ = res._ || [];
res._.push(val);
return acc;
}
acc.push(val);
return acc;
}, []);
}
argv = preProcess(argv, options);
function merge(key, val) {
if (key === '_') {
res = utils.merge({}, res, val);
} else {
utils.set(res, key, val);
}
}
for (key in argv) {
if (argv.hasOwnProperty(key)) {
val = argv[key];
if (typeof val === 'string' && isWindowsPath(val)) {
res[key] = val;
continue;
}
// '{'a b': true}'
if (sep.test(key) && isBoolean(val)) {
segs = key.split(sep);
val = segs.pop();
key = segs.join('.');
}
val = toBoolean(val);
switch (utils.typeOf(val)) {
case 'object':
res[key] = expand(val);
break;
case 'string':
if (~val.indexOf('|')) {
val = val.split('|');
utils.set(res, key, expandEach(val));
} else if (isUrl(val)) {
utils.set(res, key, expandString(val));
} else if (/\w,\w/.test(val)) {
val = expandString(val);
if (Array.isArray(val) && hasObjects(val)) {
val.forEach(function(ele) {
merge(key, toBoolean(ele));
});
} else {
merge(key, val);
}
} else if (sep.test(val)) {
if (opts.esc && ~opts.esc.indexOf(key)) {
val = val.split('.').join('\\.');
}
var str = key + ':' + val;
segs = str.split(sep);
val = toBoolean(segs.pop());
key = segs.join('.');
utils.set(res, key, expandString(val));
} else {
res[key] = val.split('\\.').join('.');
}
break;
case 'array':
if (hasObjects(val)) {
merge(key, expandEach(val));
} else {
res[key] = val.map(function(ele) {
return toBoolean(ele);
});
}
break;
case 'boolean':
default: {
res[key] = val;
break;
}
}
}
}
return res;
}
function expandString(val) {
if (isUrl(val)) {
return val;
}
if (isPath(val)) {
val = unescape(val);
if (~val.indexOf(':')) {
return toObject(val);
}
if (~val.indexOf(',')) {
return val.split(',');
}
return toBoolean(val);
}
if (/^[\s\w]+$/.test(val)) {
return val;
}
return utils.expand(val, {
toBoolean: true
});
}
function preProcess(argv, options) {
var obj = {};
if (Array.isArray(argv)) {
argv = argv.reduce(function(acc, str) {
if (!/['"]/.test(str)) {
return acc.concat(str.split(' '));
}
return acc.concat(str);
}, []);
argv = argv.map(function(str) {
if (isUrl(str) || /['"]/.test(str)) {
str = str.replace(/^-+/, '');
var m = /[=:.]/.exec(str);
if (m) {
var key = str.slice(0, m.index);
var val = str.slice(m.index + 1);
if (isUrl(val)) {
obj[key] = val;
return;
}
if (/^['"]/.test(val) && /['"]$/.test(val)) {
obj[key] = val.slice(1, val.length - 1);
return;
}
}
return str;
}
if (!/=.*,/.test(str)) {
str = str.split(':').join('=');
}
return str;
});
argv = utils.minimist(argv, options);
}
argv = utils.merge({}, argv, obj);
return utils.omitEmpty(argv);
}
function expandEach(arr) {
var len = arr.length;
var idx = -1;
var res = {};
while (++idx < len) {
utils.merge(res, expand(utils.expand(arr[idx], {toBoolean: true})));
}
return res;
}
function isBoolean(val) {
return val === 'false'
|| val === 'true'
|| val === false
|| val === true;
}
function isUrl(val) {
return /\w+:\/\/\w/.test(val);
}
function isWindowsPath(val) {
return /^\w:[\\\/]/.test(val);
}
function isPath(val) {
return /(?:[\\\/]|\\\.)/.test(val);
}
function unescape(val) {
if (isString(val)) {
return val.split('\\').join('');
}
if (isObject(val)) {
for (var key in val) {
val[key] = unescape(val[key]);
}
return val;
}
if (Array.isArray(val)) {
return val.map(unescape);
}
return val;
}
function isString(val) {
return typeof val === 'string';
}
function toBoolean(val) {
if (val === 'true') val = true;
if (val === 'false') val = false;
return val;
}
function isObject(val) {
return utils.typeOf(val) === 'object';
}
function toObject(str) {
var res = {};
var segs = str.split(':');
var val = segs.pop();
res[segs.join('.')] = val;
return res;
}
function hasObjects(arr) {
var len = arr.length;
var idx = -1;
while (++idx < len) {
if (isObject(arr[idx]) || /[:=|,]/.test(arr[idx])) {
return true;
}
}
return false;
}
/**
* Expose `expand`
*/
module.exports = expand;