import { isDate , isObject } from './util' ; function encode ( val ) { return encodeURIComponent ( val ) . replace ( /%40/g , '@' ) . replace ( /%3A/gi , ':' ) . replace ( /%24/g , '$' ) . replace ( /%2C/gi , ',' ) . replace ( /%20/g , '+' ) . replace ( /%5B/gi , '[' ) . replace ( /%5D/gi , ']' ) ; } export function buildURL ( url , funcName , params ? ) { if ( ! url ) { throw new Error ( 'url must exist!' ) ; } if ( ! params ) { url = url + '?callback=' + funcName ; return url ; } const parts = [ ] ; Object . keys ( params ) . forEach ( key => { let val = params [ key ] ; if ( val === null || val === 'undefined' ) { return ; } let values ; if ( Array . isArray ( val ) ) { values = val ; key += '[]' ; } else { values = [ val ] ; } values . forEach ( val => { if ( isDate ( val ) ) { val = val . toISOString ( ) ; } else if ( isObject ( val ) ) { val = JSON . stringify ( val ) ; } parts . push ( `${ encode ( key ) }=${ encode ( val ) }` ) ; } ) ; } ) ; let serializedParams = parts . join ( '&' ) ; if ( serializedParams ) { const markIndex = url . indexOf ( '#' ) ; if ( markIndex !== - 1 ) { url = url . slice ( 0 , markIndex ) ; } url += ( url . indexOf ( '?' ) === - 1 ? '?' : '&' ) + serializedParams + '&callback=' + funcName ; } return url ; }