@@ -11,7 +11,7 @@ module.exports = {
11
11
return replace . call ( value , percentTwenties , '+' ) ;
12
12
} ,
13
13
RFC3986 : function ( value ) {
14
- return value ;
14
+ return String ( value ) ;
15
15
}
16
16
} ,
17
17
RFC1738 : 'RFC1738' ,
@@ -87,14 +87,15 @@ var parseObject = function (chain, val, options) {
87
87
var obj ;
88
88
var root = chain [ i ] ;
89
89
90
- if ( root === '[]' ) {
91
- obj = [ ] ;
92
- obj = obj . concat ( leaf ) ;
90
+ if ( root === '[]' && options . parseArrays ) {
91
+ obj = [ ] . concat ( leaf ) ;
93
92
} else {
94
93
obj = options . plainObjects ? Object . create ( null ) : { } ;
95
94
var cleanRoot = root . charAt ( 0 ) === '[' && root . charAt ( root . length - 1 ) === ']' ? root . slice ( 1 , - 1 ) : root ;
96
95
var index = parseInt ( cleanRoot , 10 ) ;
97
- if (
96
+ if ( ! options . parseArrays && cleanRoot === '' ) {
97
+ obj = { 0 : leaf } ;
98
+ } else if (
98
99
! isNaN ( index )
99
100
&& root !== cleanRoot
100
101
&& String ( index ) === cleanRoot
@@ -103,7 +104,7 @@ var parseObject = function (chain, val, options) {
103
104
) {
104
105
obj = [ ] ;
105
106
obj [ index ] = leaf ;
106
- } else {
107
+ } else if ( cleanRoot !== '__proto__' ) {
107
108
obj [ cleanRoot ] = leaf ;
108
109
}
109
110
}
@@ -214,32 +215,38 @@ var utils = require('./utils');
214
215
var formats = require ( './formats' ) ;
215
216
216
217
var arrayPrefixGenerators = {
217
- brackets : function brackets ( prefix ) { // eslint-disable-line func-name-matching
218
+ brackets : function brackets ( prefix ) {
218
219
return prefix + '[]' ;
219
220
} ,
220
- indices : function indices ( prefix , key ) { // eslint-disable-line func-name-matching
221
+ indices : function indices ( prefix , key ) {
221
222
return prefix + '[' + key + ']' ;
222
223
} ,
223
- repeat : function repeat ( prefix ) { // eslint-disable-line func-name-matching
224
+ repeat : function repeat ( prefix ) {
224
225
return prefix ;
225
226
}
226
227
} ;
227
228
229
+ var isArray = Array . isArray ;
230
+ var push = Array . prototype . push ;
231
+ var pushToArray = function ( arr , valueOrArray ) {
232
+ push . apply ( arr , isArray ( valueOrArray ) ? valueOrArray : [ valueOrArray ] ) ;
233
+ } ;
234
+
228
235
var toISO = Date . prototype . toISOString ;
229
236
230
237
var defaults = {
231
238
delimiter : '&' ,
232
239
encode : true ,
233
240
encoder : utils . encode ,
234
241
encodeValuesOnly : false ,
235
- serializeDate : function serializeDate ( date ) { // eslint-disable-line func-name-matching
242
+ serializeDate : function serializeDate ( date ) {
236
243
return toISO . call ( date ) ;
237
244
} ,
238
245
skipNulls : false ,
239
246
strictNullHandling : false
240
247
} ;
241
248
242
- var stringify = function stringify ( // eslint-disable-line func-name-matching
249
+ var stringify = function stringify (
243
250
object ,
244
251
prefix ,
245
252
generateArrayPrefix ,
@@ -258,7 +265,9 @@ var stringify = function stringify( // eslint-disable-line func-name-matching
258
265
obj = filter ( prefix , obj ) ;
259
266
} else if ( obj instanceof Date ) {
260
267
obj = serializeDate ( obj ) ;
261
- } else if ( obj === null ) {
268
+ }
269
+
270
+ if ( obj === null ) {
262
271
if ( strictNullHandling ) {
263
272
return encoder && ! encodeValuesOnly ? encoder ( prefix , defaults . encoder ) : prefix ;
264
273
}
@@ -281,7 +290,7 @@ var stringify = function stringify( // eslint-disable-line func-name-matching
281
290
}
282
291
283
292
var objKeys ;
284
- if ( Array . isArray ( filter ) ) {
293
+ if ( isArray ( filter ) ) {
285
294
objKeys = filter ;
286
295
} else {
287
296
var keys = Object . keys ( obj ) ;
@@ -295,8 +304,8 @@ var stringify = function stringify( // eslint-disable-line func-name-matching
295
304
continue ;
296
305
}
297
306
298
- if ( Array . isArray ( obj ) ) {
299
- values = values . concat ( stringify (
307
+ if ( isArray ( obj ) ) {
308
+ pushToArray ( values , stringify (
300
309
obj [ key ] ,
301
310
generateArrayPrefix ( prefix , key ) ,
302
311
generateArrayPrefix ,
@@ -311,7 +320,7 @@ var stringify = function stringify( // eslint-disable-line func-name-matching
311
320
encodeValuesOnly
312
321
) ) ;
313
322
} else {
314
- values = values . concat ( stringify (
323
+ pushToArray ( values , stringify (
315
324
obj [ key ] ,
316
325
prefix + ( allowDots ? '.' + key : '[' + key + ']' ) ,
317
326
generateArrayPrefix ,
@@ -335,7 +344,7 @@ module.exports = function (object, opts) {
335
344
var obj = object ;
336
345
var options = opts ? utils . assign ( { } , opts ) : { } ;
337
346
338
- if ( options . encoder !== null && options . encoder !== undefined && typeof options . encoder !== 'function' ) {
347
+ if ( options . encoder !== null && typeof options . encoder !== ' undefined' && typeof options . encoder !== 'function' ) {
339
348
throw new TypeError ( 'Encoder has to be a function.' ) ;
340
349
}
341
350
@@ -360,7 +369,7 @@ module.exports = function (object, opts) {
360
369
if ( typeof options . filter === 'function' ) {
361
370
filter = options . filter ;
362
371
obj = filter ( '' , obj ) ;
363
- } else if ( Array . isArray ( options . filter ) ) {
372
+ } else if ( isArray ( options . filter ) ) {
364
373
filter = options . filter ;
365
374
objKeys = filter ;
366
375
}
@@ -396,8 +405,7 @@ module.exports = function (object, opts) {
396
405
if ( skipNulls && obj [ key ] === null ) {
397
406
continue ;
398
407
}
399
-
400
- keys = keys . concat ( stringify (
408
+ pushToArray ( keys , stringify (
401
409
obj [ key ] ,
402
410
key ,
403
411
generateArrayPrefix ,
@@ -475,8 +483,8 @@ var merge = function merge(target, source, options) {
475
483
if ( typeof source !== 'object' ) {
476
484
if ( Array . isArray ( target ) ) {
477
485
target . push ( source ) ;
478
- } else if ( typeof target === 'object' ) {
479
- if ( options . plainObjects || options . allowPrototypes || ! has . call ( Object . prototype , source ) ) {
486
+ } else if ( target && typeof target === 'object' ) {
487
+ if ( ( options && ( options . plainObjects || options . allowPrototypes ) ) || ! has . call ( Object . prototype , source ) ) {
480
488
target [ source ] = true ;
481
489
}
482
490
} else {
@@ -486,7 +494,7 @@ var merge = function merge(target, source, options) {
486
494
return target ;
487
495
}
488
496
489
- if ( typeof target !== 'object' ) {
497
+ if ( ! target || typeof target !== 'object' ) {
490
498
return [ target ] . concat ( source ) ;
491
499
}
492
500
@@ -498,8 +506,9 @@ var merge = function merge(target, source, options) {
498
506
if ( Array . isArray ( target ) && Array . isArray ( source ) ) {
499
507
source . forEach ( function ( item , i ) {
500
508
if ( has . call ( target , i ) ) {
501
- if ( target [ i ] && typeof target [ i ] === 'object' ) {
502
- target [ i ] = merge ( target [ i ] , item , options ) ;
509
+ var targetItem = target [ i ] ;
510
+ if ( targetItem && typeof targetItem === 'object' && item && typeof item === 'object' ) {
511
+ target [ i ] = merge ( targetItem , item , options ) ;
503
512
} else {
504
513
target . push ( item ) ;
505
514
}
@@ -580,6 +589,7 @@ var encode = function encode(str) {
580
589
581
590
i += 1 ;
582
591
c = 0x10000 + ( ( ( c & 0x3FF ) << 10 ) | ( string . charCodeAt ( i ) & 0x3FF ) ) ;
592
+ /* eslint operator-linebreak: [2, "before"] */
583
593
out += hexTable [ 0xF0 | ( c >> 18 ) ]
584
594
+ hexTable [ 0x80 | ( ( c >> 12 ) & 0x3F ) ]
585
595
+ hexTable [ 0x80 | ( ( c >> 6 ) & 0x3F ) ]
0 commit comments