36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import getCurrentScriptSource from "./getCurrentScriptSource.js";
 | |
| 
 | |
| /**
 | |
|  * @param {string} resourceQuery
 | |
|  * @returns {{ [key: string]: string | boolean }}
 | |
|  */
 | |
| function parseURL(resourceQuery) {
 | |
|   /** @type {{ [key: string]: string }} */
 | |
|   var options = {};
 | |
|   if (typeof resourceQuery === "string" && resourceQuery !== "") {
 | |
|     var searchParams = resourceQuery.slice(1).split("&");
 | |
|     for (var i = 0; i < searchParams.length; i++) {
 | |
|       var pair = searchParams[i].split("=");
 | |
|       options[pair[0]] = decodeURIComponent(pair[1]);
 | |
|     }
 | |
|   } else {
 | |
|     // Else, get the url from the <script> this file was called with.
 | |
|     var scriptSource = getCurrentScriptSource();
 | |
|     var scriptSourceURL;
 | |
|     try {
 | |
|       // The placeholder `baseURL` with `window.location.href`,
 | |
|       // is to allow parsing of path-relative or protocol-relative URLs,
 | |
|       // and will have no effect if `scriptSource` is a fully valid URL.
 | |
|       scriptSourceURL = new URL(scriptSource, self.location.href);
 | |
|     } catch (error) {
 | |
|       // URL parsing failed, do nothing.
 | |
|       // We will still proceed to see if we can recover using `resourceQuery`
 | |
|     }
 | |
|     if (scriptSourceURL) {
 | |
|       options = scriptSourceURL;
 | |
|       options.fromCurrentScript = true;
 | |
|     }
 | |
|   }
 | |
|   return options;
 | |
| }
 | |
| export default parseURL; |