Blame view

node_modules/loader-utils/lib/urlToRequest.js 1.43 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  "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) {
  	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;