diff --git a/lib/loader.js b/lib/loader.js index ea4d8372a..d4486d0ab 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -22,6 +22,13 @@ module.exports = function(content, map) { if(sourceMap) { if (map && typeof map !== "string") { map = JSON.stringify(map); + + if (map.sources) { + map.sources = map.sources.map(function (source) { + return source.replace(/\\/g, '/'); + }); + map.sourceRoot = ''; + } } } else { // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it @@ -30,8 +37,8 @@ module.exports = function(content, map) { processCss(content, map, { mode: moduleMode ? "local" : "global", - from: loaderUtils.getRemainingRequest(this), - to: loaderUtils.getCurrentRequest(this), + from: loaderUtils.getRemainingRequest(this).split("!").pop(), + to: loaderUtils.getCurrentRequest(this).split("!").pop(), query: query, minimize: this.minimize, loaderContext: this, @@ -105,11 +112,11 @@ module.exports = function(content, map) { map = result.map; if(map.sources) { map.sources = map.sources.map(function(source) { - return source.split("!").pop(); + return source.split("!").pop().replace(/\\/g, '/'); }, this); map.sourceRoot = ""; } - map.file = map.file.split("!").pop(); + map.file = map.file.split("!").pop().replace(/\\/g, '/'); map = JSON.stringify(map); moduleJs = "exports.push([module.id, " + cssAsString + ", \"\", " + map + "]);"; } else { diff --git a/test/sourceMapTest.js b/test/sourceMapTest.js index 3bb84f660..d48578675 100644 --- a/test/sourceMapTest.js +++ b/test/sourceMapTest.js @@ -10,24 +10,50 @@ describe("source maps", function() { testWithMap("falsy: undefined map doesn't cause an error", ".class { a: b c d; }", undefined, [ [1, ".class { a: b c d; }", ""] ]); - testWithMap("should don't generate sourceMap when `sourceMap: false` and map exist", + testWithMap("should don't generate sourceMap when `sourceMap: false` and map exist", ".class { a: b c d; }", - { - file: 'test.css', - mappings: 'AAAA,SAAS,SAAS,EAAE', - names: [], - sourceRoot: '', - sources: [ '/folder/test.css' ], - sourcesContent: [ '.class { a: b c d; }' ], - version: 3 - }, + { + file: 'test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: [ '/folder/test.css' ], + sourcesContent: [ '.class { a: b c d; }' ], + version: 3 + }, [ [1, ".class { a: b c d; }", ""] ], - { - query: "?sourceMap=false" - } + { + sourceMap: false + } ); + testWithMap("generate sourceMap when `sourceMap: true` and map exist", + ".class { a: b c d; }", + { + file: "test.css", + mappings: "AAAA,SAAS,SAAS,EAAE", + names: [], + sourceRoot: "", + sources: [ "/folder/test.css" ], + sourcesContent: [ ".class { a: b c d; }" ], + version: 3 + }, + [ + [1, ".class { a: b c d; }", "", { + file: "test.css", + mappings: "AAAA,SAAS,SAAS,EAAE", + names: [], + sourceRoot: "", + sources: [ "/folder/test.css" ], + sourcesContent: [ ".class { a: b c d; }" ], + version: 3 + }] + ], + { + sourceMap: true + } + ); testMap("generate sourceMap (1 loader)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}], options: { context: "/" }, @@ -45,6 +71,23 @@ describe("source maps", function() { version: 3 }] ]); + testMap("generate sourceMap (1 loader) with backslash (windows)", ".class { a: b c d; }", undefined, { + loaders: [{request: "C:\\path\\css-loader"}], + options: { context: "\\" }, + resource: "C:\\folder\\test.css", + request: "C:\\path\\css-loader!C:\\folder\\test.css", + query: "?sourceMap" + }, [ + [1, ".class { a: b c d; }", "", { + file: 'C:/folder/test.css', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: [ 'C:/folder/test.css' ], + sourcesContent: [ '.class { a: b c d; }' ], + version: 3 + }] + ]); testMap("generate sourceMap (1 loader, relative)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}], options: { context: "/other-folder/sub" }, @@ -113,6 +156,23 @@ describe("source maps", function() { version: 3 }] ]); + testMap("generate sourceMap (2 loaders) with backslash (windows)", ".class { a: b c d; }", undefined, { + loaders: [{request: "C:\\path\\css-loader"}, {request: "C:\\path\\sass-loader"}], + options: { context: "\\" }, + resource: "C:\\folder\\test.scss", + request: "C:\\path\\css-loader!C:\\path\\sass-loader!C:\\folder\\test.scss", + query: "?sourceMap" + }, [ + [1, ".class { a: b c d; }", "", { + file: 'C:/folder/test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: [ 'C:/folder/test.scss' ], + sourcesContent: [ '.class { a: b c d; }' ], + version: 3 + }] + ]); testMap("don't generate sourceMap (1 loader)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}], options: { context: "/" },