From c3d0d91a3074faca9d89c026602be50c685ab652 Mon Sep 17 00:00:00 2001 From: Evilebot Tnawi Date: Mon, 22 May 2017 03:21:42 +0300 Subject: [PATCH] fix: source maps path on `windows` (#532) --- lib/loader.js | 21 ++++++--- lib/processCss.js | 2 +- test/sourceMapTest.js | 102 +++++++++++++++++++++++++++++++++++------- 3 files changed, 102 insertions(+), 23 deletions(-) diff --git a/lib/loader.js b/lib/loader.js index ea4d8372..ca856cd3 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -20,8 +20,17 @@ module.exports = function(content, map) { var resolve = createResolver(query.alias); if(sourceMap) { - if (map && typeof map !== "string") { - map = JSON.stringify(map); + if (map) { + if (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 +39,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 +114,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/lib/processCss.js b/lib/processCss.js index 585d37d0..5468fc79 100644 --- a/lib/processCss.js +++ b/lib/processCss.js @@ -48,7 +48,7 @@ var parserPlugin = postcss.plugin("css-loader-parser", function(options) { url = url.url; } else if(url.type === "string") { url = url.value; - } else throw rule.error("Unexpected format" + rule.params); + } else throw rule.error("Unexpected format " + rule.params); if (!url.replace(/\s/g, '').length) { return; } diff --git a/test/sourceMapTest.js b/test/sourceMapTest.js index 3bb84f66..faf7578c 100644 --- a/test/sourceMapTest.js +++ b/test/sourceMapTest.js @@ -10,9 +10,53 @@ 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 exists", ".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; }", ""] + ], + { + sourceMap: false + } + ); + testWithMap("should don't generate sourceMap when `sourceMap: true` and map exists", + ".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 + } + ); + testWithMap("should don't generate sourceMap when `sourceMap: true` and map exists and string", + ".class { a: b c d; }", + JSON.stringify({ file: 'test.css', mappings: 'AAAA,SAAS,SAAS,EAAE', names: [], @@ -20,17 +64,24 @@ describe("source maps", function() { sources: [ '/folder/test.css' ], sourcesContent: [ '.class { a: b c d; }' ], version: 3 - }, - [ - [1, ".class { a: b c d; }", ""] - ], - { - query: "?sourceMap=false" - } - ); + }), + [ + [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: "/" }, resource: "/folder/test.css", request: "/path/css-loader!/folder/test.css", query: "?sourceMap" @@ -47,7 +98,6 @@ describe("source maps", function() { ]); testMap("generate sourceMap (1 loader, relative)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}], - options: { context: "/other-folder/sub" }, resource: "/folder/test.css", request: "/path/css-loader!/folder/test.css", query: "?sourceMap" @@ -64,7 +114,6 @@ describe("source maps", function() { ]); testMap("generate sourceMap (1 loader, data url)", ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,\"); }", undefined, { loaders: [{request: "/path/css-loader"}], - options: { context: "/" }, resource: "/folder/test.css", request: "/path/css-loader!/folder/test.css", query: "?sourceMap" @@ -81,7 +130,6 @@ describe("source maps", function() { ]); testMap("generate sourceMap (1 loader, encoded data url)", ".class { background-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%23007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\"); }", undefined, { loaders: [{request: "/path/css-loader"}], - options: { context: "/" }, resource: "/folder/test.css", request: "/path/css-loader!/folder/test.css", query: "?sourceMap" @@ -98,7 +146,30 @@ describe("source maps", function() { ]); testMap("generate sourceMap (2 loaders)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}, {request: "/path/sass-loader"}], - options: { context: "/" }, + resource: "/folder/test.scss", + request: "/path/css-loader!/path/sass-loader!/folder/test.scss", + query: "?sourceMap" + }, [ + [1, ".class { a: b c d; }", "", { + file: 'test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: [ '/folder/test.scss' ], + sourcesContent: [ '.class { a: b c d; }' ], + version: 3 + }] + ]); + testMap("generate sourceMap (2 loaders) and map exist", ".class { a: b c d; }", { + file: 'test.scss', + mappings: 'AAAA,SAAS,SAAS,EAAE', + names: [], + sourceRoot: '', + sources: [ '/folder/test.scss' ], + sourcesContent: [ '.class { a: b c d; }' ], + version: 3 + }, { + loaders: [{request: "/path/css-loader"}, {request: "/path/sass-loader"}], resource: "/folder/test.scss", request: "/path/css-loader!/path/sass-loader!/folder/test.scss", query: "?sourceMap" @@ -115,7 +186,6 @@ describe("source maps", function() { ]); testMap("don't generate sourceMap (1 loader)", ".class { a: b c d; }", undefined, { loaders: [{request: "/path/css-loader"}], - options: { context: "/" }, resource: "/folder/test.css", request: "/path/css-loader!/folder/test.css", query: "?sourceMap=false"