2 var numberIsNan = require('number-is-nan');
4 function createArg(key, val, separator) {
5 key = key.replace(/[A-Z]/g, '-$&').toLowerCase();
6 return '--' + key + (val ? separator + val : '');
9 function match(arr, val) {
10 return arr.some(function (x) {
11 return x instanceof RegExp ? x.test(val) : x === val;
15 function createAliasArg(key, val) {
16 return '-' + key + (val ? ' ' + val : '');
19 module.exports = function (input, opts) {
25 var separator = opts.useEquals === false ? ' ' : '=';
27 Object.keys(input).forEach(function (key) {
29 var argFn = createArg;
31 if (Array.isArray(opts.excludes) && match(opts.excludes, key)) {
35 if (Array.isArray(opts.includes) && !match(opts.includes, key)) {
39 if (typeof opts.aliases === 'object' && opts.aliases[key]) {
40 key = opts.aliases[key];
41 argFn = createAliasArg;
45 if (!Array.isArray(val)) {
46 throw new TypeError('Expected key \'_\' to be an array, but found ' + (typeof val));
54 args.push(argFn(key, ''));
57 if (val === false && !opts.ignoreFalse) {
58 args.push(argFn('no-' + key));
61 if (typeof val === 'string') {
62 args.push(argFn(key, val, separator));
65 if (typeof val === 'number' && !numberIsNan(val)) {
66 args.push(argFn(key, String(val), separator));
69 if (Array.isArray(val)) {
70 val.forEach(function (arrVal) {
71 args.push(argFn(key, arrVal, separator));
76 extraArgs.forEach(function (extraArgVal) {
77 args.push(String(extraArgVal));