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};