Skip to content

Commit 237873c

Browse files
authored
Merge pull request webpack-contrib#319 from andreypopp/concise-error-message
Consistent format for syntax errors.
2 parents 9d2941b + 9343ebb commit 237873c

File tree

4 files changed

+71
-2
lines changed

4 files changed

+71
-2
lines changed

lib/processCss.js

+39-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
MIT License http://www.opensource.org/licenses/mit-license.php
33
Author Tobias Koppers @sokra
44
*/
5+
var formatCodeFrame = require("babel-code-frame");
56
var Tokenizer = require("css-selector-tokenizer");
67
var postcss = require("postcss");
78
var loaderUtils = require("loader-utils");
@@ -208,6 +209,43 @@ module.exports = function processCss(inputSource, inputMap, options, callback) {
208209
urlItemRegExp: /___CSS_LOADER_URL___([0-9]+)___/
209210
});
210211
}).catch(function(err) {
211-
callback(err);
212+
if (err.name === 'CssSyntaxError') {
213+
var wrappedError = new CSSLoaderError(
214+
'Syntax Error',
215+
err.reason,
216+
err.line != null && err.column != null
217+
? {line: err.line, column: err.column}
218+
: null,
219+
err.input.source
220+
);
221+
callback(wrappedError);
222+
} else {
223+
callback(err);
224+
}
212225
});
213226
};
227+
228+
function formatMessage(message, loc, source) {
229+
var formatted = message;
230+
if (loc) {
231+
formatted = formatted
232+
+ ' (' + loc.line + ':' + loc.column + ')';
233+
}
234+
if (loc && source) {
235+
formatted = formatted
236+
+ '\n\n' + formatCodeFrame(source, loc.line, loc.column) + '\n';
237+
}
238+
return formatted;
239+
}
240+
241+
function CSSLoaderError(name, message, loc, source, error) {
242+
Error.call(this);
243+
Error.captureStackTrace(this, CSSLoaderError);
244+
this.name = name;
245+
this.error = error;
246+
this.message = formatMessage(message, loc, source);
247+
this.hideStack = true;
248+
}
249+
250+
CSSLoaderError.prototype = Object.create(Error.prototype);
251+
CSSLoaderError.prototype.constructor = CSSLoaderError;

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
"node": ">=0.12.0"
88
},
99
"dependencies": {
10+
"babel-code-frame": "^6.11.0",
1011
"css-selector-tokenizer": "^0.6.0",
1112
"cssnano": ">=2.6.1 <4",
1213
"loader-utils": "~0.2.2",
13-
"object-assign": "^4.0.1",
1414
"lodash.camelcase": "^3.0.1",
15+
"object-assign": "^4.0.1",
1516
"postcss": "^5.0.6",
1617
"postcss-modules-extract-imports": "^1.0.0",
1718
"postcss-modules-local-by-default": "^1.0.1",

test/helpers.js

+17
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ exports.test = function test(name, input, result, query, modules) {
6969
});
7070
};
7171

72+
exports.testError = function test(name, input, onError) {
73+
it(name, function(done) {
74+
runLoader(cssLoader, input, undefined, {}, function(err, output) {
75+
if (!err) {
76+
done(new Error('Expected error to be thrown'));
77+
} else {
78+
try {
79+
onError(err);
80+
} catch (error) {
81+
return done(error);
82+
}
83+
done();
84+
}
85+
});
86+
});
87+
};
88+
7289
exports.testWithMap = function test(name, input, map, result, query, modules) {
7390
it(name, function(done) {
7491
runLoader(cssLoader, input, map, {

test/simpleTest.js

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
/*globals describe */
22

3+
var assert = require('assert');
34
var test = require("./helpers").test;
5+
var testError = require("./helpers").testError;
46
var testMinimize = require("./helpers").testMinimize;
57

68
describe("simple", function() {
@@ -19,4 +21,15 @@ describe("simple", function() {
1921
testMinimize("minimized simple", ".class { a: b c d; }", [
2022
[1, ".class{a:b c d}", ""]
2123
]);
24+
testError("error formatting", ".some {\n invalid css;\n}", function(err) {
25+
assert.equal(err.message, [
26+
'Unknown word (2:2)',
27+
'',
28+
' 1 | .some {',
29+
'> 2 | invalid css;',
30+
' | ^',
31+
' 3 | }',
32+
'',
33+
].join('\n'));
34+
});
2235
});

0 commit comments

Comments
 (0)