61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| // we can't use path.win32.isAbsolute because it also matches paths starting with a forward slash
 | |
| const matchNativeWin32Path = /^[A-Z]:[/\\]|^\\\\/i;
 | |
| 
 | |
| function urlToRequest(url, root) {
 | |
|   // Do not rewrite an empty url
 | |
|   if (url === '') {
 | |
|     return '';
 | |
|   }
 | |
| 
 | |
|   const moduleRequestRegex = /^[^?]*~/;
 | |
|   let request;
 | |
| 
 | |
|   if (matchNativeWin32Path.test(url)) {
 | |
|     // absolute windows path, keep it
 | |
|     request = url;
 | |
|   } else if (root !== undefined && root !== false && /^\//.test(url)) {
 | |
|     // if root is set and the url is root-relative
 | |
|     switch (typeof root) {
 | |
|       // 1. root is a string: root is prefixed to the url
 | |
|       case 'string':
 | |
|         // special case: `~` roots convert to module request
 | |
|         if (moduleRequestRegex.test(root)) {
 | |
|           request = root.replace(/([^~/])$/, '$1/') + url.slice(1);
 | |
|         } else {
 | |
|           request = root + url;
 | |
|         }
 | |
|         break;
 | |
|       // 2. root is `true`: absolute paths are allowed
 | |
|       //    *nix only, windows-style absolute paths are always allowed as they doesn't start with a `/`
 | |
|       case 'boolean':
 | |
|         request = url;
 | |
|         break;
 | |
|       default:
 | |
|         throw new Error(
 | |
|           "Unexpected parameters to loader-utils 'urlToRequest': url = " +
 | |
|             url +
 | |
|             ', root = ' +
 | |
|             root +
 | |
|             '.'
 | |
|         );
 | |
|     }
 | |
|   } else if (/^\.\.?\//.test(url)) {
 | |
|     // A relative url stays
 | |
|     request = url;
 | |
|   } else {
 | |
|     // every other url is threaded like a relative url
 | |
|     request = './' + url;
 | |
|   }
 | |
| 
 | |
|   // A `~` makes the url an module
 | |
|   if (moduleRequestRegex.test(request)) {
 | |
|     request = request.replace(moduleRequestRegex, '');
 | |
|   }
 | |
| 
 | |
|   return request;
 | |
| }
 | |
| 
 | |
| module.exports = urlToRequest;
 |