70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | 'use strict' | ||
|  | 
 | ||
|  | import * as utils from '../utils' | ||
|  | 
 | ||
|  | function encode(val) { | ||
|  |     return encodeURIComponent(val) | ||
|  |         .replace(/%40/gi, '@') | ||
|  |         .replace(/%3A/gi, ':') | ||
|  |         .replace(/%24/g, '$') | ||
|  |         .replace(/%2C/gi, ',') | ||
|  |         .replace(/%20/g, '+') | ||
|  |         .replace(/%5B/gi, '[') | ||
|  |         .replace(/%5D/gi, ']') | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Build a URL by appending params to the end | ||
|  |  * | ||
|  |  * @param {string} url The base of the url (e.g., http://www.google.com)
 | ||
|  |  * @param {object} [params] The params to be appended | ||
|  |  * @returns {string} The formatted url | ||
|  |  */ | ||
|  | export default function buildURL(url, params) { | ||
|  |     /* eslint no-param-reassign:0 */ | ||
|  |     if (!params) { | ||
|  |         return url | ||
|  |     } | ||
|  | 
 | ||
|  |     let serializedParams | ||
|  |     if (utils.isURLSearchParams(params)) { | ||
|  |         serializedParams = params.toString() | ||
|  |     } else { | ||
|  |         const parts = [] | ||
|  | 
 | ||
|  |         utils.forEach(params, (val, key) => { | ||
|  |             if (val === null || typeof val === 'undefined') { | ||
|  |                 return | ||
|  |             } | ||
|  | 
 | ||
|  |             if (utils.isArray(val)) { | ||
|  |                 key = `${key}[]` | ||
|  |             } else { | ||
|  |                 val = [val] | ||
|  |             } | ||
|  | 
 | ||
|  |             utils.forEach(val, (v) => { | ||
|  |                 if (utils.isDate(v)) { | ||
|  |                     v = v.toISOString() | ||
|  |                 } else if (utils.isObject(v)) { | ||
|  |                     v = JSON.stringify(v) | ||
|  |                 } | ||
|  |                 parts.push(`${encode(key)}=${encode(v)}`) | ||
|  |             }) | ||
|  |         }) | ||
|  | 
 | ||
|  |         serializedParams = parts.join('&') | ||
|  |     } | ||
|  | 
 | ||
|  |     if (serializedParams) { | ||
|  |         const hashmarkIndex = url.indexOf('#') | ||
|  |         if (hashmarkIndex !== -1) { | ||
|  |             url = url.slice(0, hashmarkIndex) | ||
|  |         } | ||
|  | 
 | ||
|  |         url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams | ||
|  |     } | ||
|  | 
 | ||
|  |     return url | ||
|  | } |