diff --git a/lib/processCss.js b/lib/processCss.js index c6e8d102..e3847e13 100644 --- a/lib/processCss.js +++ b/lib/processCss.js @@ -49,7 +49,7 @@ var parserPlugin = postcss.plugin("css-loader-parser", function(options) { values.nodes[0].nodes.shift(); var mediaQuery = Tokenizer.stringifyValues(values); if(loaderUtils.isUrlRequest(url, options.root) && options.mode === "global") { - url = loaderUtils.urlToRequest(url, options.root); + url = urlToRequest(url, options.root); } importItems.push({ url: url, @@ -98,7 +98,11 @@ var parserPlugin = postcss.plugin("css-loader-parser", function(options) { } break; case "url": - if (options.url && !/^#/.test(item.url) && loaderUtils.isUrlRequest(item.url, options.root)) { + if (options.url && + !/^#/.test(item.url) && + loaderUtils.isUrlRequest(item.url, options.root) && + !isResourceUrl(item.url) + ) { item.stringType = ""; delete item.innerSpacingBefore; delete item.innerSpacingAfter; @@ -141,7 +145,7 @@ module.exports = function processCss(inputSource, inputMap, options, callback) { var minimize = typeof forceMinimize !== "undefined" ? !!forceMinimize : options.minimize; var customGetLocalIdent = query.getLocalIdent || getLocalIdent; - + var parserOptions = { root: root, mode: options.mode, @@ -158,7 +162,7 @@ module.exports = function processCss(inputSource, inputMap, options, callback) { return url; } if(global) { - return loaderUtils.urlToRequest(url, root); + return urlToRequest(url, root); } } return url; @@ -248,5 +252,19 @@ function CSSLoaderError(name, message, loc, source, error) { this.hideStack = true; } +function urlToRequest(url, root) { + url = loaderUtils.urlToRequest(url, root); + + return isResourceUrl(url) ? trimLocalUrl(url) : url; +} + +function trimLocalUrl(url) { + return url.replace(/\.\/(.+)/, "$1"); +} + +function isResourceUrl(url) { + return /~*res:\/\/(.+)/.test(url); +} + CSSLoaderError.prototype = Object.create(Error.prototype); CSSLoaderError.prototype.constructor = CSSLoaderError;