qs 5.1.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.travis.yml CHANGED
@@ -3,5 +3,6 @@ language: node_js
3
3
  node_js:
4
4
  - 0.10
5
5
  - 4.0
6
+ - 4
6
7
 
7
8
  sudo: false
package/README.md CHANGED
@@ -201,7 +201,7 @@ Qs.parse('a[][b]=c');
201
201
  Qs.stringify(object, [options]);
202
202
  ```
203
203
 
204
- When stringifying, **qs** always URI encodes output. Objects are stringified as you would expect:
204
+ When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect:
205
205
 
206
206
  ```javascript
207
207
  Qs.stringify({ a: 'b' });
@@ -210,6 +210,13 @@ Qs.stringify({ a: { b: 'c' } });
210
210
  // 'a%5Bb%5D=c'
211
211
  ```
212
212
 
213
+ This encoding can be disabled by setting the `encode` option to `false`:
214
+
215
+ ```javascript
216
+ Qs.stringify({ a: { b: 'c' } }, { encode: false });
217
+ // 'a[b]=c'
218
+ ```
219
+
213
220
  Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage.
214
221
 
215
222
  When arrays are stringified, by default they are given explicit indices:
package/dist/qs.js CHANGED
@@ -228,11 +228,13 @@ var internals = {
228
228
  return prefix;
229
229
  }
230
230
  },
231
- strictNullHandling: false
231
+ strictNullHandling: false,
232
+ skipNulls: false,
233
+ encode: true
232
234
  };
233
235
 
234
236
 
235
- internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, filter) {
237
+ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter) {
236
238
 
237
239
  if (typeof filter === 'function') {
238
240
  obj = filter(prefix, obj);
@@ -245,7 +247,7 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
245
247
  }
246
248
  else if (obj === null) {
247
249
  if (strictNullHandling) {
248
- return Utils.encode(prefix);
250
+ return encode ? Utils.encode(prefix) : prefix;
249
251
  }
250
252
 
251
253
  obj = '';
@@ -255,7 +257,10 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
255
257
  typeof obj === 'number' ||
256
258
  typeof obj === 'boolean') {
257
259
 
258
- return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
260
+ if (encode) {
261
+ return [Utils.encode(prefix) + '=' + Utils.encode(obj)];
262
+ }
263
+ return [prefix + '=' + obj];
259
264
  }
260
265
 
261
266
  var values = [];
@@ -268,11 +273,17 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
268
273
  for (var i = 0, il = objKeys.length; i < il; ++i) {
269
274
  var key = objKeys[i];
270
275
 
276
+ if (skipNulls &&
277
+ obj[key] === null) {
278
+
279
+ continue;
280
+ }
281
+
271
282
  if (Array.isArray(obj)) {
272
- values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, filter));
283
+ values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
273
284
  }
274
285
  else {
275
- values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, filter));
286
+ values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
276
287
  }
277
288
  }
278
289
 
@@ -285,6 +296,8 @@ module.exports = function (obj, options) {
285
296
  options = options || {};
286
297
  var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
287
298
  var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
299
+ var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
300
+ var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
288
301
  var objKeys;
289
302
  var filter;
290
303
  if (typeof options.filter === 'function') {
@@ -319,9 +332,17 @@ module.exports = function (obj, options) {
319
332
  if (!objKeys) {
320
333
  objKeys = Object.keys(obj);
321
334
  }
335
+
322
336
  for (var i = 0, il = objKeys.length; i < il; ++i) {
323
337
  var key = objKeys[i];
324
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, filter));
338
+
339
+ if (skipNulls &&
340
+ obj[key] === null) {
341
+
342
+ continue;
343
+ }
344
+
345
+ keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
325
346
  }
326
347
 
327
348
  return keys.join(delimiter);
package/lib/stringify.js CHANGED
@@ -27,7 +27,7 @@ var internals = {
27
27
  };
28
28
 
29
29
 
30
- internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter) {
30
+ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort) {
31
31
 
32
32
  if (typeof filter === 'function') {
33
33
  obj = filter(prefix, obj);
@@ -62,7 +62,14 @@ internals.stringify = function (obj, prefix, generateArrayPrefix, strictNullHand
62
62
  return values;
63
63
  }
64
64
 
65
- var objKeys = Array.isArray(filter) ? filter : Object.keys(obj);
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
+
66
73
  for (var i = 0, il = objKeys.length; i < il; ++i) {
67
74
  var key = objKeys[i];
68
75
 
@@ -91,6 +98,7 @@ module.exports = function (obj, options) {
91
98
  var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
92
99
  var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
93
100
  var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
101
+ var sort = typeof options.sort === 'function' ? options.sort : null;
94
102
  var objKeys;
95
103
  var filter;
96
104
  if (typeof options.filter === 'function') {
@@ -126,6 +134,10 @@ module.exports = function (obj, options) {
126
134
  objKeys = Object.keys(obj);
127
135
  }
128
136
 
137
+ if (sort) {
138
+ objKeys.sort(sort);
139
+ }
140
+
129
141
  for (var i = 0, il = objKeys.length; i < il; ++i) {
130
142
  var key = objKeys[i];
131
143
 
@@ -135,7 +147,7 @@ module.exports = function (obj, options) {
135
147
  continue;
136
148
  }
137
149
 
138
- keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter));
150
+ keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort));
139
151
  }
140
152
 
141
153
  return keys.join(delimiter);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "qs",
3
3
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
4
4
  "homepage": "https://github.com/hapijs/qs",
5
- "version": "5.1.0",
5
+ "version": "5.2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/hapijs/qs.git"
package/test/stringify.js CHANGED
@@ -278,4 +278,16 @@ describe('stringify()', function () {
278
278
  expect(Qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false })).to.equal('a=b&c');
279
279
  done();
280
280
  });
281
+
282
+ it('can sort the keys', function (done) {
283
+
284
+ var sort = function alphabeticalSort (a, b) {
285
+
286
+ return a.localeCompare(b);
287
+ };
288
+
289
+ expect(Qs.stringify({ a: 'c', z: 'y', b : 'f' }, { sort : sort })).to.equal('a=c&b=f&z=y');
290
+ expect(Qs.stringify({ a: 'c', z: { j: 'a', i:'b' }, b : 'f' }, { sort : sort })).to.equal('a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a');
291
+ done();
292
+ });
281
293
  });