Initial commit
[yaffs-website] / node_modules / body-parser / node_modules / qs / lib / stringify.js
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     skipNulls: false,
26     encode: true
27 };
28
29
30 internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort) {
31
32     if (typeof filter === 'function') {
33         obj = filter(prefix, obj);
34     }
35     else if (Utils.isBuffer(obj)) {
36         obj = obj.toString();
37     }
38     else if (obj instanceof Date) {
39         obj = obj.toISOString();
40     }
41     else if (obj === null) {
42         if (strictNullHandling) {
43             return encode ? Utils.encode(prefix) : prefix;
44         }
45
46         obj = '';
47     }
48
49     if (typeof obj === 'string' ||
50         typeof obj === 'number' ||
51         typeof obj === 'boolean') {
52
53         if (encode) {
54             return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
55         }
56         return [prefix + '=' + obj];
57     }
58
59     var values = [];
60
61     if (typeof obj === 'undefined') {
62         return values;
63     }
64
65     var objKeys;
66     if (Array.isArray(filter)) {
67         objKeys = filter;
68     } else {
69         var keys = Object.keys(obj);
70         objKeys = sort ? keys.sort(sort) : keys;
71     }
72
73     for (var i = 0, il = objKeys.length; i < il; ++i) {
74         var key = objKeys[i];
75
76         if (skipNulls &&
77             obj[key] === null) {
78
79             continue;
80         }
81
82         if (Array.isArray(obj)) {
83             values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
84         }
85         else {
86             values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
87         }
88     }
89
90     return values;
91 };
92
93
94 module.exports = function (obj, options) {
95
96     options = options || {};
97     var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
98     var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
99     var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
100     var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
101     var sort = typeof options.sort === 'function' ? options.sort : null;
102     var objKeys;
103     var filter;
104     if (typeof options.filter === 'function') {
105         filter = options.filter;
106         obj = filter('', obj);
107     }
108     else if (Array.isArray(options.filter)) {
109         objKeys = filter = options.filter;
110     }
111
112     var keys = [];
113
114     if (typeof obj !== 'object' ||
115         obj === null) {
116
117         return '';
118     }
119
120     var arrayFormat;
121     if (options.arrayFormat in internals.arrayPrefixGenerators) {
122         arrayFormat = options.arrayFormat;
123     }
124     else if ('indices' in options) {
125         arrayFormat = options.indices ? 'indices' : 'repeat';
126     }
127     else {
128         arrayFormat = 'indices';
129     }
130
131     var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
132
133     if (!objKeys) {
134         objKeys = Object.keys(obj);
135     }
136
137     if (sort) {
138         objKeys.sort(sort);
139     }
140
141     for (var i = 0, il = objKeys.length; i < il; ++i) {
142         var key = objKeys[i];
143
144         if (skipNulls &&
145             obj[key] === null) {
146
147             continue;
148         }
149
150         keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort));
151     }
152
153     return keys.join(delimiter);
154 };