@@ -183,41 +183,37 @@ export class VsoClient {
183183 return url . resolve ( this . baseUrl , path . join ( this . basePath , relativeUrl ) ) ;
184184 }
185185
186- private getSerializedObject ( queryValue : any , object : any ) : string {
187- let value :string = "" ;
188- let first :boolean = true ;
189-
190- for ( let property in object ) {
191- if ( object . hasOwnProperty ( property ) ) {
192- let prop = object [ property ] ;
193- let valueString = this . getValueString ( property , prop ) ;
194- if ( first && prop !== undefined ) {
195- value += valueString ;
196- first = false ;
197- } else if ( prop !== undefined ) {
198- value += "&" + valueString ;
186+ private queryParamsToStringHelper ( queryParams : any , prefix : string ) : string {
187+ if ( queryParams === undefined ) {
188+ return '' ;
189+ }
190+ let queryString : string = '' ;
191+
192+ if ( typeof ( queryParams ) !== 'string' ) {
193+ for ( let property in queryParams ) {
194+ if ( queryParams . hasOwnProperty ( property ) ) {
195+ const prop = queryParams [ property ] ;
196+ const newPrefix = prefix + encodeURIComponent ( property . toString ( ) ) + '.' ;
197+ queryString += this . queryParamsToStringHelper ( prop , newPrefix ) ;
199198 }
200199 }
201200 }
202201
203- if ( value == "" ) {
204- value += queryValue + "=" + object . toString ( ) ;
202+ if ( queryString === '' && prefix . length > 0 ) {
203+ // Will always need to chop period off of end of prefix
204+ queryString = prefix . slice ( 0 , - 1 ) + '=' + encodeURIComponent ( queryParams . toString ( ) ) + '&' ;
205205 }
206- return value ;
206+ return queryString ;
207207 }
208208
209- private getValueString ( queryValue , value ) {
210- let valueString = null ;
211- if ( typeof ( value ) === 'object' ) {
212- valueString = this . getSerializedObject ( queryValue , value ) ;
213- } else {
214- valueString = queryValue + "=" + encodeURIComponent ( value ) ;
215- }
216- return valueString ;
209+ private queryParamsToString ( queryParams : any ) : string {
210+ const queryString : string = '?' + this . queryParamsToStringHelper ( queryParams , '' ) ;
211+
212+ // Will always need to slice either a ? or & off of the end
213+ return queryString . slice ( 0 , - 1 ) ;
217214 }
218215
219216 protected getRequestUrl ( routeTemplate : string , area : string , resource : string , routeValues : any , queryParams ?: any ) : string {
220-
221217 // Add area/resource route values (based on the location)
222218 routeValues = routeValues || { } ;
223219 if ( ! routeValues . area ) {
@@ -230,22 +226,12 @@ export class VsoClient {
230226 // Replace templated route values
231227 let relativeUrl = this . replaceRouteValues ( routeTemplate , routeValues ) ;
232228
233- //append query parameters to the end
234- let first = true ;
235- for ( let queryValue in queryParams ) {
236- if ( queryParams [ queryValue ] != null ) {
237- let value = queryParams [ queryValue ] ;
238- let valueString = this . getValueString ( queryValue , value ) ;
239- if ( first ) {
240- relativeUrl += "?" + valueString ;
241- first = false ;
242- } else {
243- relativeUrl += "&" + valueString ;
244- }
245- }
229+ // Append query parameters to the end
230+ if ( queryParams ) {
231+ relativeUrl += this . queryParamsToString ( queryParams ) ;
246232 }
247233
248- //resolve the relative url with the base
234+ // Resolve the relative url with the base
249235 return url . resolve ( this . baseUrl , path . join ( this . basePath , relativeUrl ) ) ;
250236 }
251237
0 commit comments