You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					38 lines
				
				855 B
			
		
		
			
		
	
	
					38 lines
				
				855 B
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { URL } = require('url') | ||
|  | 
 | ||
|  | const BASE_URL = 'http://localhost' | ||
|  | 
 | ||
|  | /** | ||
|  |  * Parse URL | ||
|  |  * | ||
|  |  * @param {(Object|String)} url | ||
|  |  * @param {Object} [query] | ||
|  |  * @return {URL} | ||
|  |  */ | ||
|  | module.exports = function parseURL (url, query) { | ||
|  |   if ((typeof url === 'string' || Object.prototype.toString.call(url) === '[object String]') && url.startsWith('//')) { | ||
|  |     url = BASE_URL + url | ||
|  |   } | ||
|  |   const result = typeof url === 'object' | ||
|  |     ? Object.assign(new URL(BASE_URL), url) | ||
|  |     : new URL(url, BASE_URL) | ||
|  | 
 | ||
|  |   const merged = Object.assign({}, url.query, query) | ||
|  |   for (const key in merged) { | ||
|  |     const value = merged[key] | ||
|  | 
 | ||
|  |     if (Array.isArray(value)) { | ||
|  |       result.searchParams.delete(key) | ||
|  |       for (const param of value) { | ||
|  |         result.searchParams.append(key, param) | ||
|  |       } | ||
|  |     } else { | ||
|  |       result.searchParams.set(key, value) | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return result | ||
|  | } |