Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81146 views
1
// Load modules
2
3
var Utils = require('./utils');
4
5
6
// Declare internals
7
8
var internals = {
9
delimiter: '&',
10
arrayPrefixGenerators: {
11
brackets: function (prefix, key) {
12
13
return prefix + '[]';
14
},
15
indices: function (prefix, key) {
16
17
return prefix + '[' + key + ']';
18
},
19
repeat: function (prefix, key) {
20
21
return prefix;
22
}
23
},
24
strictNullHandling: false
25
};
26
27
28
internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) {
29
30
if (typeof filter === 'function') {
31
obj = filter(prefix, obj);
32
}
33
else if (Utils.isBuffer(obj)) {
34
obj = obj.toString();
35
}
36
else if (obj instanceof Date) {
37
obj = obj.toISOString();
38
}
39
else if (obj === null) {
40
if (strictNullHandling) {
41
return Utils.encode(prefix);
42
}
43
44
obj = '';
45
}
46
47
if (typeof obj === 'string' ||
48
typeof obj === 'number' ||
49
typeof obj === 'boolean') {
50
51
return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
52
}
53
54
var values = [];
55
56
if (typeof obj === 'undefined') {
57
return values;
58
}
59
60
var objKeys = Array.isArray(filter) ? filter : Object.keys(obj);
61
for (var i = 0, il = objKeys.length; i < il; ++i) {
62
var key = objKeys[i];
63
64
if (Array.isArray(obj)) {
65
values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter));
66
}
67
else {
68
values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter));
69
}
70
}
71
72
return values;
73
};
74
75
76
module.exports = function (obj, options) {
77
78
options = options || {};
79
var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
80
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
81
var objKeys;
82
var filter;
83
if (typeof options.filter === 'function') {
84
filter = options.filter;
85
obj = filter('', obj);
86
}
87
else if (Array.isArray(options.filter)) {
88
objKeys = filter = options.filter;
89
}
90
91
var keys = [];
92
93
if (typeof obj !== 'object' ||
94
obj === null) {
95
96
return '';
97
}
98
99
var arrayFormat;
100
if (options.arrayFormat in internals.arrayPrefixGenerators) {
101
arrayFormat = options.arrayFormat;
102
}
103
else if ('indices' in options) {
104
arrayFormat = options.indices ? 'indices' : 'repeat';
105
}
106
else {
107
arrayFormat = 'indices';
108
}
109
110
var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
111
112
if (!objKeys) {
113
objKeys = Object.keys(obj);
114
}
115
for (var i = 0, il = objKeys.length; i < il; ++i) {
116
var key = objKeys[i];
117
keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter));
118
}
119
120
return keys.join(delimiter);
121
};
122
123