82 lines
1.7 KiB
JavaScript
82 lines
1.7 KiB
JavaScript
'use strict';
|
|
var numberIsNan = require('number-is-nan');
|
|
|
|
function createArg(key, val, separator) {
|
|
key = key.replace(/[A-Z]/g, '-$&').toLowerCase();
|
|
return '--' + key + (val ? separator + val : '');
|
|
}
|
|
|
|
function match(arr, val) {
|
|
return arr.some(function (x) {
|
|
return x instanceof RegExp ? x.test(val) : x === val;
|
|
});
|
|
}
|
|
|
|
function createAliasArg(key, val) {
|
|
return '-' + key + (val ? ' ' + val : '');
|
|
}
|
|
|
|
module.exports = function (input, opts) {
|
|
var args = [];
|
|
var extraArgs = [];
|
|
|
|
opts = opts || {};
|
|
|
|
var separator = opts.useEquals === false ? ' ' : '=';
|
|
|
|
Object.keys(input).forEach(function (key) {
|
|
var val = input[key];
|
|
var argFn = createArg;
|
|
|
|
if (Array.isArray(opts.excludes) && match(opts.excludes, key)) {
|
|
return;
|
|
}
|
|
|
|
if (Array.isArray(opts.includes) && !match(opts.includes, key)) {
|
|
return;
|
|
}
|
|
|
|
if (typeof opts.aliases === 'object' && opts.aliases[key]) {
|
|
key = opts.aliases[key];
|
|
argFn = createAliasArg;
|
|
}
|
|
|
|
if (key === '_') {
|
|
if (!Array.isArray(val)) {
|
|
throw new TypeError('Expected key \'_\' to be an array, but found ' + (typeof val));
|
|
}
|
|
|
|
extraArgs = val;
|
|
return;
|
|
}
|
|
|
|
if (val === true) {
|
|
args.push(argFn(key, ''));
|
|
}
|
|
|
|
if (val === false && !opts.ignoreFalse) {
|
|
args.push(argFn('no-' + key));
|
|
}
|
|
|
|
if (typeof val === 'string') {
|
|
args.push(argFn(key, val, separator));
|
|
}
|
|
|
|
if (typeof val === 'number' && !numberIsNan(val)) {
|
|
args.push(argFn(key, String(val), separator));
|
|
}
|
|
|
|
if (Array.isArray(val)) {
|
|
val.forEach(function (arrVal) {
|
|
args.push(argFn(key, arrVal, separator));
|
|
});
|
|
}
|
|
});
|
|
|
|
extraArgs.forEach(function (extraArgVal) {
|
|
args.push(String(extraArgVal));
|
|
});
|
|
|
|
return args;
|
|
};
|