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