@@ -10,10 +10,10 @@ describe('parseQuery', () => {
1010
1111 it ( 'works with leading ?' , ( ) => {
1212 expect ( parseQuery ( '?foo=a' ) ) . toEqual ( {
13- foo : 'a' ,
13+ foo : [ 'a' ] ,
1414 } )
1515 expect ( parseQuery ( 'foo=a' ) ) . toEqual ( {
16- foo : 'a' ,
16+ foo : [ 'a' ] ,
1717 } )
1818 expect ( parseQuery ( '?' ) ) . toEqual ( { } )
1919 } )
@@ -27,28 +27,28 @@ describe('parseQuery', () => {
2727
2828 it ( 'decodes values in query' , ( ) => {
2929 expect ( parseQuery ( 'e=%25' ) ) . toEqual ( {
30- e : '%' ,
30+ e : [ '%' ] ,
3131 } )
3232 } )
3333
3434 it ( 'parses empty string values' , ( ) => {
3535 expect ( parseQuery ( 'e=&c=a' ) ) . toEqual ( {
36- e : '' ,
37- c : 'a' ,
36+ e : [ '' ] ,
37+ c : [ 'a' ] ,
3838 } )
3939 } )
4040
4141 it ( 'allows = inside values' , ( ) => {
4242 expect ( parseQuery ( 'e=c=a' ) ) . toEqual ( {
43- e : 'c=a' ,
43+ e : [ 'c=a' ] ,
4444 } )
4545 } )
4646
4747 it ( 'parses empty values as null' , ( ) => {
4848 expect ( parseQuery ( 'e&b&c=a' ) ) . toEqual ( {
49- e : null ,
50- b : null ,
51- c : 'a' ,
49+ e : [ null ] ,
50+ b : [ null ] ,
51+ c : [ 'a' ] ,
5252 } )
5353 } )
5454
@@ -69,13 +69,13 @@ describe('parseQuery', () => {
6969
7070 it ( 'decodes the + as space' , ( ) => {
7171 expect ( parseQuery ( 'a+b=c+d' ) ) . toEqual ( {
72- 'a b' : 'c d' ,
72+ 'a b' : [ 'c d' ] ,
7373 } )
7474 } )
7575
7676 it ( 'decodes the encoded + as +' , ( ) => {
7777 expect ( parseQuery ( 'a%2Bb=c%2Bd' ) ) . toEqual ( {
78- 'a+b' : 'c+d' ,
78+ 'a+b' : [ 'c+d' ] ,
7979 } )
8080 } )
8181
@@ -96,33 +96,33 @@ describe('parseQuery', () => {
9696 it ( 'does not pollute the prototype with __proto__' , ( ) => {
9797 const result = parseQuery ( '__proto__=polluted' ) as Record < string , unknown >
9898 expect ( Object . getPrototypeOf ( result ) ) . toBe ( null )
99- expect ( result [ '__proto__' ] ) . toBe ( 'polluted' )
99+ expect ( result [ '__proto__' ] ) . toEqual ( [ 'polluted' ] )
100100 expect ( ( { } as Record < string , unknown > ) . polluted ) . toBeUndefined ( )
101101 } )
102102
103103 it ( 'treats constructor as a regular key' , ( ) => {
104104 const result = parseQuery ( 'constructor=foo' )
105105 expect ( Object . getPrototypeOf ( result ) ) . toBe ( null )
106- expect ( result ) . toEqual ( { constructor : 'foo' } )
106+ expect ( result ) . toEqual ( { constructor : [ 'foo' ] } )
107107 expect ( Object . prototype . constructor ) . toBe ( Object )
108108 } )
109109} )
110110
111111describe ( 'normalizeQuery' , ( ) => {
112112 it ( 'removes keys with undefined values' , ( ) => {
113- expect ( normalizeQuery ( { a : undefined , b : 'x' } ) ) . toEqual ( { b : 'x' } )
113+ expect ( normalizeQuery ( { a : undefined , b : 'x' } ) ) . toEqual ( { b : [ 'x' ] } )
114114 } )
115115
116- it ( 'preserves null values' , ( ) => {
117- expect ( normalizeQuery ( { a : null } ) ) . toEqual ( { a : null } )
116+ it ( 'wraps null values in an array ' , ( ) => {
117+ expect ( normalizeQuery ( { a : null } ) ) . toEqual ( { a : [ null ] } )
118118 } )
119119
120120 it ( 'coerces numbers to strings' , ( ) => {
121- expect ( normalizeQuery ( { a : 1 } ) ) . toEqual ( { a : '1' } )
121+ expect ( normalizeQuery ( { a : 1 } ) ) . toEqual ( { a : [ '1' ] } )
122122 } )
123123
124- it ( 'preserves string values' , ( ) => {
125- expect ( normalizeQuery ( { a : 'x' } ) ) . toEqual ( { a : 'x' } )
124+ it ( 'wraps string values in an array ' , ( ) => {
125+ expect ( normalizeQuery ( { a : 'x' } ) ) . toEqual ( { a : [ 'x' ] } )
126126 } )
127127
128128 it ( 'coerces values inside arrays' , ( ) => {
@@ -137,6 +137,10 @@ describe('normalizeQuery', () => {
137137 } )
138138 } )
139139
140+ it ( 'keeps existing arrays' , ( ) => {
141+ expect ( normalizeQuery ( { a : [ 'x' ] , b : [ ] } ) ) . toEqual ( { a : [ 'x' ] , b : [ ] } )
142+ } )
143+
140144 it ( 'handles empty / undefined input' , ( ) => {
141145 expect ( normalizeQuery ( undefined ) ) . toEqual ( { } )
142146 expect ( normalizeQuery ( { } ) ) . toEqual ( { } )
0 commit comments