Updated from some -dev modules to alpha, beta or full releases
[yaffs-website] / node_modules / uncss / node_modules / qs / lib / stringify.js
1 'use strict';
2
3 var Utils = require('./utils');
4
5 var internals = {
6     delimiter: '&',
7     arrayPrefixGenerators: {
8         brackets: function (prefix) {
9             return prefix + '[]';
10         },
11         indices: function (prefix, key) {
12             return prefix + '[' + key + ']';
13         },
14         repeat: function (prefix) {
15             return prefix;
16         }
17     },
18     strictNullHandling: false,
19     skipNulls: false,
20     encode: true
21 };
22
23 internals.stringify = function (object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort) {
24     var obj = object;
25     if (typeof filter === 'function') {
26         obj = filter(prefix, obj);
27     } else if (Utils.isBuffer(obj)) {
28         obj = String(obj);
29     } else if (obj instanceof Date) {
30         obj = obj.toISOString();
31     } else if (obj === null) {
32         if (strictNullHandling) {
33             return encode ? Utils.encode(prefix) : prefix;
34         }
35
36         obj = '';
37     }
38
39     if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
40         if (encode) {
41             return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
42         }
43         return [prefix + '=' + 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(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
69         } else {
70             values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
71         }
72     }
73
74     return values;
75 };
76
77 module.exports = function (object, opts) {
78     var obj = object;
79     var options = opts || {};
80     var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
81     var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
82     var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
83     var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
84     var sort = typeof options.sort === 'function' ? options.sort : null;
85     var objKeys;
86     var filter;
87     if (typeof options.filter === 'function') {
88         filter = options.filter;
89         obj = filter('', obj);
90     } else if (Array.isArray(options.filter)) {
91         objKeys = filter = options.filter;
92     }
93
94     var keys = [];
95
96     if (typeof obj !== 'object' || obj === null) {
97         return '';
98     }
99
100     var arrayFormat;
101     if (options.arrayFormat in internals.arrayPrefixGenerators) {
102         arrayFormat = options.arrayFormat;
103     } else if ('indices' in options) {
104         arrayFormat = options.indices ? 'indices' : 'repeat';
105     } else {
106         arrayFormat = 'indices';
107     }
108
109     var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
110
111     if (!objKeys) {
112         objKeys = Object.keys(obj);
113     }
114
115     if (sort) {
116         objKeys.sort(sort);
117     }
118
119     for (var i = 0; i < objKeys.length; ++i) {
120         var key = objKeys[i];
121
122         if (skipNulls && obj[key] === null) {
123             continue;
124         }
125
126         keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort));
127     }
128
129     return keys.join(delimiter);
130 };