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