You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
'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;
|
|
|