@@ -34,13 +34,29 @@ const processParams = (params: [string, string][]): [string, string][] => {
3434 const isEncodingRequired =
3535 encodeMode === "enable" || ( encodeMode === "auto" && needsEncoding ( value ) )
3636
37- const encodedKey = isEncodingRequired ? encodeParam ( key ) : key
3837 const encodedValue = isEncodingRequired ? encodeParam ( value ) : value
3938
40- return [ encodedKey , encodedValue ]
39+ return [ key , encodedValue ]
4140 } )
4241}
4342
43+ const buildQueryString = ( params : [ string , string ] [ ] ) : string =>
44+ params . map ( ( [ k , v ] ) => `${ encodeURIComponent ( k ) } =${ v } ` ) . join ( "&" )
45+
46+ const combineWithExistingSearch = ( urlObj : URL , queryString : string ) : URL => {
47+ const existingSearch =
48+ urlObj . search . length > 1 ? urlObj . search . substring ( 1 ) : ""
49+
50+ urlObj . search = pipe (
51+ existingSearch ,
52+ O . fromPredicate ( ( s ) => s . length > 0 ) ,
53+ O . map ( ( s ) => `${ s } &${ queryString } ` ) ,
54+ O . getOrElse ( ( ) => queryString )
55+ )
56+
57+ return urlObj
58+ }
59+
4460const updateUrl = (
4561 url : string ,
4662 params : [ string , string ] [ ]
@@ -50,10 +66,17 @@ const updateUrl = (
5066 ( ) => new URL ( url ) ,
5167 ( e ) => new Error ( `Invalid URL: ${ e } ` )
5268 ) ,
53- E . map ( ( u ) => {
54- processParams ( params ) . forEach ( ( [ k , v ] ) => u . searchParams . append ( k , v ) )
55- return decodeURIComponent ( u . toString ( ) )
56- } )
69+ E . map ( ( urlObj ) => {
70+ const processedParams = processParams ( params )
71+
72+ if ( processedParams . length > 0 ) {
73+ const queryString = buildQueryString ( processedParams )
74+ return combineWithExistingSearch ( urlObj , queryString )
75+ }
76+
77+ return urlObj
78+ } ) ,
79+ E . map ( ( u ) => u . toString ( ) )
5780 )
5881
5982export const preProcessRelayRequest = ( req : RelayRequest ) : RelayRequest =>
0 commit comments