Initial commit
[yaffs-website] / node_modules / tiny-lr / 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) {
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 = Array.isArray(filter) ? filter : Object.keys(obj);
66     for (var i = 0, il = objKeys.length; i < il; ++i) {
67         var key = objKeys[i];
68
69         if (skipNulls &&
70             obj[key] === null) {
71
72             continue;
73         }
74
75         if (Array.isArray(obj)) {
76             values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
77         }
78         else {
79             values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
80         }
81     }
82
83     return values;
84 };
85
86
87 module.exports = function (obj, options) {
88
89     options = options || {};
90     var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
91     var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
92     var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
93     var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
94     var objKeys;
95     var filter;
96     if (typeof options.filter === 'function') {
97         filter = options.filter;
98         obj = filter('', obj);
99     }
100     else if (Array.isArray(options.filter)) {
101         objKeys = filter = options.filter;
102     }
103
104     var keys = [];
105
106     if (typeof obj !== 'object' ||
107         obj === null) {
108
109         return '';
110     }
111
112     var arrayFormat;
113     if (options.arrayFormat in internals.arrayPrefixGenerators) {
114         arrayFormat = options.arrayFormat;
115     }
116     else if ('indices' in options) {
117         arrayFormat = options.indices ? 'indices' : 'repeat';
118     }
119     else {
120         arrayFormat = 'indices';
121     }
122
123     var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
124
125     if (!objKeys) {
126         objKeys = Object.keys(obj);
127     }
128
129     for (var i = 0, il = objKeys.length; i < il; ++i) {
130         var key = objKeys[i];
131
132         if (skipNulls &&
133             obj[key] === null) {
134
135             continue;
136         }
137
138         keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
139     }
140
141     return keys.join(delimiter);
142 };