arnaucube
arnaucube/thoughtsPublic Self-hosted repository
thoughts/node_modules/express/node_modules/qs/lib/stringify.js
node_modules/express/node_modules/qs/lib/stringify.jsRaw
  1'use strict';
  2
  3var Utils = require('./utils');
  4
  5var arrayPrefixGenerators = {
  6    brackets: function brackets(prefix) {
  7        return prefix + '[]';
  8    },
  9    indices: function indices(prefix, key) {
 10        return prefix + '[' + key + ']';
 11    },
 12    repeat: function repeat(prefix) {
 13        return prefix;
 14    }
 15};
 16
 17var defaults = {
 18    delimiter: '&',
 19    strictNullHandling: false,
 20    skipNulls: false,
 21    encode: true,
 22    encoder: Utils.encode
 23};
 24
 25var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots) {
 26    var obj = object;
 27    if (typeof filter === 'function') {
 28        obj = filter(prefix, obj);
 29    } else if (obj instanceof Date) {
 30        obj = obj.toISOString();
 31    } else if (obj === null) {
 32        if (strictNullHandling) {
 33            return encoder ? encoder(prefix) : prefix;
 34        }
 35
 36        obj = '';
 37    }
 38
 39    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || Utils.isBuffer(obj)) {
 40        if (encoder) {
 41            return [encoder(prefix) + '=' + encoder(obj)];
 42        }
 43        return [prefix + '=' + String(obj)];
 44    }
 45
 46    var values = [];
 47
 48    if (typeof obj === 'undefined') {
 49        return values;
 50    }
 51
 52    var objKeys;
 53    if (Array.isArray(filter)) {
 54        objKeys = filter;
 55    } else {
 56        var keys = Object.keys(obj);
 57        objKeys = sort ? keys.sort(sort) : keys;
 58    }
 59
 60    for (var i = 0; i < objKeys.length; ++i) {
 61        var key = objKeys[i];
 62
 63        if (skipNulls && obj[key] === null) {
 64            continue;
 65        }
 66
 67        if (Array.isArray(obj)) {
 68            values = values.concat(stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
 69        } else {
 70            values = values.concat(stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
 71        }
 72    }
 73
 74    return values;
 75};
 76
 77module.exports = function (object, opts) {
 78    var obj = object;
 79    var options = opts || {};
 80    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
 81    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
 82    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
 83    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
 84    var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null;
 85    var sort = typeof options.sort === 'function' ? options.sort : null;
 86    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
 87    var objKeys;
 88    var filter;
 89
 90    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
 91        throw new TypeError('Encoder has to be a function.');
 92    }
 93
 94    if (typeof options.filter === 'function') {
 95        filter = options.filter;
 96        obj = filter('', obj);
 97    } else if (Array.isArray(options.filter)) {
 98        objKeys = filter = options.filter;
 99    }
100
101    var keys = [];
102
103    if (typeof obj !== 'object' || obj === null) {
104        return '';
105    }
106
107    var arrayFormat;
108    if (options.arrayFormat in arrayPrefixGenerators) {
109        arrayFormat = options.arrayFormat;
110    } else if ('indices' in options) {
111        arrayFormat = options.indices ? 'indices' : 'repeat';
112    } else {
113        arrayFormat = 'indices';
114    }
115
116    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
117
118    if (!objKeys) {
119        objKeys = Object.keys(obj);
120    }
121
122    if (sort) {
123        objKeys.sort(sort);
124    }
125
126    for (var i = 0; i < objKeys.length; ++i) {
127        var key = objKeys[i];
128
129        if (skipNulls && obj[key] === null) {
130            continue;
131        }
132
133        keys = keys.concat(stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
134    }
135
136    return keys.join(delimiter);
137};