Skip to content

Commit

Permalink
Merge pull request #319 from andreypopp/concise-error-message
Browse files Browse the repository at this point in the history
Consistent format for syntax errors.
  • Loading branch information
sokra committed Aug 16, 2016
2 parents 9d2941b + 9343ebb commit 237873c
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 2 deletions.
40 changes: 39 additions & 1 deletion lib/processCss.js
Expand Up @@ -2,6 +2,7 @@
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var formatCodeFrame = require("babel-code-frame");
var Tokenizer = require("css-selector-tokenizer");
var postcss = require("postcss");
var loaderUtils = require("loader-utils");
Expand Down Expand Up @@ -208,6 +209,43 @@ module.exports = function processCss(inputSource, inputMap, options, callback) {
urlItemRegExp: /___CSS_LOADER_URL___([0-9]+)___/
});
}).catch(function(err) {
callback(err);
if (err.name === 'CssSyntaxError') {
var wrappedError = new CSSLoaderError(
'Syntax Error',
err.reason,
err.line != null && err.column != null
? {line: err.line, column: err.column}
: null,
err.input.source
);
callback(wrappedError);
} else {
callback(err);
}
});
};

function formatMessage(message, loc, source) {
var formatted = message;
if (loc) {
formatted = formatted
+ ' (' + loc.line + ':' + loc.column + ')';
}
if (loc && source) {
formatted = formatted
+ '\n\n' + formatCodeFrame(source, loc.line, loc.column) + '\n';
}
return formatted;
}

function CSSLoaderError(name, message, loc, source, error) {
Error.call(this);
Error.captureStackTrace(this, CSSLoaderError);
this.name = name;
this.error = error;
this.message = formatMessage(message, loc, source);
this.hideStack = true;
}

CSSLoaderError.prototype = Object.create(Error.prototype);
CSSLoaderError.prototype.constructor = CSSLoaderError;
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -7,11 +7,12 @@
"node": ">=0.12.0"
},
"dependencies": {
"babel-code-frame": "^6.11.0",
"css-selector-tokenizer": "^0.6.0",
"cssnano": ">=2.6.1 <4",
"loader-utils": "~0.2.2",
"object-assign": "^4.0.1",
"lodash.camelcase": "^3.0.1",
"object-assign": "^4.0.1",
"postcss": "^5.0.6",
"postcss-modules-extract-imports": "^1.0.0",
"postcss-modules-local-by-default": "^1.0.1",
Expand Down
17 changes: 17 additions & 0 deletions test/helpers.js
Expand Up @@ -69,6 +69,23 @@ exports.test = function test(name, input, result, query, modules) {
});
};

exports.testError = function test(name, input, onError) {
it(name, function(done) {
runLoader(cssLoader, input, undefined, {}, function(err, output) {
if (!err) {
done(new Error('Expected error to be thrown'));
} else {
try {
onError(err);
} catch (error) {
return done(error);
}
done();
}
});
});
};

exports.testWithMap = function test(name, input, map, result, query, modules) {
it(name, function(done) {
runLoader(cssLoader, input, map, {
Expand Down
13 changes: 13 additions & 0 deletions test/simpleTest.js
@@ -1,6 +1,8 @@
/*globals describe */

var assert = require('assert');
var test = require("./helpers").test;
var testError = require("./helpers").testError;
var testMinimize = require("./helpers").testMinimize;

describe("simple", function() {
Expand All @@ -19,4 +21,15 @@ describe("simple", function() {
testMinimize("minimized simple", ".class { a: b c d; }", [
[1, ".class{a:b c d}", ""]
]);
testError("error formatting", ".some {\n invalid css;\n}", function(err) {
assert.equal(err.message, [
'Unknown word (2:2)',
'',
' 1 | .some {',
'> 2 | invalid css;',
' | ^',
' 3 | }',
'',
].join('\n'));
});
});

0 comments on commit 237873c

Please sign in to comment.