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