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