// Load modules // Declare internals var internals = {}; exports.arrayToObject = function (source) { var obj = {}; for (var i = 0, il = source.length; i < il; ++i) { if (typeof source[i] !== 'undefined') { obj[i] = source[i]; } } return obj; }; exports.clone = function (source) { if (typeof source !== 'object' || source === null) { return source; } if (Buffer.isBuffer(source)) { return source.toString(); } var obj = Array.isArray(source) ? [] : {}; for (var i in source) { if (source.hasOwnProperty(i)) { obj[i] = exports.clone(source[i]); } } return obj; }; exports.merge = function (target, source) { if (!source) { return target; } var obj = exports.clone(target); if (Array.isArray(source)) { for (var i = 0, il = source.length; i < il; ++i) { if (typeof source[i] !== 'undefined') { if (typeof obj[i] === 'object') { obj[i] = exports.merge(obj[i], source[i]); } else { obj[i] = source[i]; } } } return obj; } if (Array.isArray(obj)) { obj = exports.arrayToObject(obj); } var keys = Object.keys(source); for (var k = 0, kl = keys.length; k < kl; ++k) { var key = keys[k]; var value = source[key]; if (value && typeof value === 'object') { if (!obj[key]) { obj[key] = exports.clone(value); } else { obj[key] = exports.merge(obj[key], value); } } else { obj[key] = value; } } return obj; }; exports.decode = function (str) { try { return decodeURIComponent(str.replace(/\+/g, ' ')); } catch (e) { return str; } }; exports.compact = function (obj) { if (typeof obj !== 'object' || obj === null) { return obj; } var compacted = {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { if (Array.isArray(obj[key])) { compacted[key] = []; for (var i = 0, l = obj[key].length; i < l; i++) { if (typeof obj[key][i] !== 'undefined') { compacted[key].push(obj[key][i]); } } } else { compacted[key] = exports.compact(obj[key]); } } } return compacted; };