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.
		
		
		
		
			
				
					52 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					52 lines
				
				1.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const path = require('path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const matchRelativePath = /^\.\.?[/\\]/;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isAbsolutePath(str) {
							 | 
						||
| 
								 | 
							
								  return path.posix.isAbsolute(str) || path.win32.isAbsolute(str);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isRelativePath(str) {
							 | 
						||
| 
								 | 
							
								  return matchRelativePath.test(str);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function stringifyRequest(loaderContext, request) {
							 | 
						||
| 
								 | 
							
								  const splitted = request.split('!');
							 | 
						||
| 
								 | 
							
								  const context =
							 | 
						||
| 
								 | 
							
								    loaderContext.context ||
							 | 
						||
| 
								 | 
							
								    (loaderContext.options && loaderContext.options.context);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return JSON.stringify(
							 | 
						||
| 
								 | 
							
								    splitted
							 | 
						||
| 
								 | 
							
								      .map((part) => {
							 | 
						||
| 
								 | 
							
								        // First, separate singlePath from query, because the query might contain paths again
							 | 
						||
| 
								 | 
							
								        const splittedPart = part.match(/^(.*?)(\?.*)/);
							 | 
						||
| 
								 | 
							
								        const query = splittedPart ? splittedPart[2] : '';
							 | 
						||
| 
								 | 
							
								        let singlePath = splittedPart ? splittedPart[1] : part;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (isAbsolutePath(singlePath) && context) {
							 | 
						||
| 
								 | 
							
								          singlePath = path.relative(context, singlePath);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (isAbsolutePath(singlePath)) {
							 | 
						||
| 
								 | 
							
								            // If singlePath still matches an absolute path, singlePath was on a different drive than context.
							 | 
						||
| 
								 | 
							
								            // In this case, we leave the path platform-specific without replacing any separators.
							 | 
						||
| 
								 | 
							
								            // @see https://github.com/webpack/loader-utils/pull/14
							 | 
						||
| 
								 | 
							
								            return singlePath + query;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (isRelativePath(singlePath) === false) {
							 | 
						||
| 
								 | 
							
								            // Ensure that the relative path starts at least with ./ otherwise it would be a request into the modules directory (like node_modules).
							 | 
						||
| 
								 | 
							
								            singlePath = './' + singlePath;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return singlePath.replace(/\\/g, '/') + query;
							 | 
						||
| 
								 | 
							
								      })
							 | 
						||
| 
								 | 
							
								      .join('!')
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = stringifyRequest;
							 |