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;
 |