@@ -60,7 +60,7 @@ export class HttpRequest implements HttpMessage, Endpoint {
60
60
if ( this . port ) {
61
61
hostname += `:${ this . port } ` ;
62
62
}
63
- let queryString = this . query ? this . buildQueryString ( ) : "" ;
63
+ let queryString = this . query ? buildQueryString ( this . query ) : "" ;
64
64
if ( queryString && queryString [ 0 ] !== "?" ) {
65
65
queryString = `?${ queryString } ` ;
66
66
}
@@ -72,41 +72,45 @@ export class HttpRequest implements HttpMessage, Endpoint {
72
72
...this ,
73
73
headers : { ...this . headers }
74
74
} ) ;
75
- if ( cloned . query ) cloned . query = this . cloneQuery ( cloned . query ) ;
75
+ if ( cloned . query ) cloned . query = cloneQuery ( cloned . query ) ;
76
76
return cloned ;
77
77
}
78
+ }
78
79
79
- private cloneQuery ( query : QueryParameterBag ) : QueryParameterBag {
80
- return Object . keys ( query ) . reduce (
81
- ( carry : QueryParameterBag , paramName : string ) => {
82
- const param = query [ paramName ] ;
83
- return {
84
- ...carry ,
85
- [ paramName ] : Array . isArray ( param ) ? [ ...param ] : param
86
- } ;
87
- } ,
88
- { }
89
- ) ;
90
- }
80
+ function cloneQuery ( query : QueryParameterBag ) : QueryParameterBag {
81
+ return Object . keys ( query ) . reduce (
82
+ ( carry : QueryParameterBag , paramName : string ) => {
83
+ const param = query [ paramName ] ;
84
+ return {
85
+ ...carry ,
86
+ [ paramName ] : Array . isArray ( param ) ? [ ...param ] : param
87
+ } ;
88
+ } ,
89
+ { }
90
+ ) ;
91
+ }
91
92
92
- private buildQueryString ( ) : string {
93
- const parts : string [ ] = [ ] ;
94
- for ( let key of Object . keys ( this . query || { } ) . sort ( ) ) {
95
- const value = this . query [ key ] ;
96
- key = escapeUri ( key ) ;
93
+ function buildQueryString ( query : QueryParameterBag ) : string {
94
+ const queryEntries = Object . entries ( query || ( { } as QueryParameterBag ) )
95
+ . map ( ( [ key , value ] ) : [ string , string | Array < string > | null ] => [
96
+ escapeUri ( key ) ,
97
+ value
98
+ ] )
99
+ . map ( ( [ key , value ] ) => {
97
100
if ( Array . isArray ( value ) ) {
98
- for ( let i = 0 , iLen = value . length ; i < iLen ; i ++ ) {
99
- parts . push ( `${ key } =${ escapeUri ( value [ i ] ) } ` ) ;
100
- }
101
+ return value . map ( val => `${ key } =${ escapeUri ( val ) } ` ) ;
101
102
} else {
102
103
let qsEntry = key ;
103
104
if ( value || typeof value === "string" ) {
104
105
qsEntry += `=${ escapeUri ( value ) } ` ;
105
106
}
106
- parts . push ( qsEntry ) ;
107
+ return [ qsEntry ] ;
107
108
}
108
- }
109
+ } )
110
+ . reduce ( ( accummulator , entry ) => {
111
+ accummulator . push ( ...entry ) ;
112
+ return accummulator ;
113
+ } , [ ] as Array < String > ) ;
109
114
110
- return parts . join ( "&" ) ;
111
- }
115
+ return queryEntries . join ( "&" ) ;
112
116
}
0 commit comments