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