Skip to content

Commit 28d5ec1

Browse files
author
刘祺
committed
pass CssSyntaxError and Error details to gutil.PluginError
1 parent 2cdf9a8 commit 28d5ec1

File tree

2 files changed

+36
-16
lines changed

2 files changed

+36
-16
lines changed

index.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,25 @@ module.exports = function (processors, options) {
7474
}
7575

7676
function handleError (error) {
77-
var errorOptions = { fileName: file.path, showStack: true }
78-
if (error.name === 'CssSyntaxError') {
79-
error = error.message + '\n\n' + error.showSourceCode() + '\n'
80-
errorOptions.showStack = false
77+
var errorOptions = { fileName: file.path }
78+
if (error instanceof Object) {
79+
errorOptions.error = error
80+
if (error.name === 'CssSyntaxError') {
81+
var input = error.input || {};
82+
errorOptions.fileName = error.file || input.file || file.path
83+
errorOptions.lineNumber = error.line || input.line
84+
errorOptions.showStack = false
85+
errorOptions.showProperties = false
86+
error = error.message + '\n\n' + error.showSourceCode() + '\n'
87+
} else {
88+
errorOptions.showStack = true
89+
error = error.message || error
90+
}
8191
}
8292
// Prevent stream’s unhandled exception from
8393
// being suppressed by Promise
8494
setImmediate(function () {
85-
cb(new gutil.PluginError('gulp-postcss', error, errorOptions))
95+
cb(new gutil.PluginError('gulp-postcss', String(error), errorOptions))
8696
})
8797
}
8898

test.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var sourceMaps = require('gulp-sourcemaps')
77
var postcss = require('./index')
88
var proxyquire = require('proxyquire')
99
var sinon = require('sinon')
10+
var path = require('path')
1011

1112
it('should pass file when it isNull()', function (cb) {
1213
var stream = postcss([ doubler ])
@@ -53,14 +54,15 @@ it('should correctly wrap postcss errors', function (cb) {
5354
stream.on('error', function (err) {
5455
assert.ok(err instanceof gutil.PluginError)
5556
assert.equal(err.plugin, 'gulp-postcss')
57+
assert.equal(err.lineNumber, 1)
5658
assert.equal(err.showStack, false)
57-
assert.equal(err.fileName, 'testpath')
59+
assert.equal(err.fileName, path.resolve('testpath'))
5860
cb()
5961
})
6062

6163
stream.write(new gutil.File({
6264
contents: new Buffer('a {'),
63-
path: 'testpath'
65+
path: path.resolve('testpath')
6466
}))
6567

6668
stream.end()
@@ -74,15 +76,15 @@ it('should respond with error on stream files', function (cb) {
7476
stream.on('error', function (err) {
7577
assert.ok(err instanceof gutil.PluginError)
7678
assert.equal(err.plugin, 'gulp-postcss')
77-
assert.equal(err.showStack, true)
78-
assert.equal(err.fileName, 'testpath')
79+
assert.equal(err.message, 'Streams are not supported!')
80+
assert.equal(err.fileName, path.resolve('testpath'))
7981
cb()
8082
})
8183

8284
var streamFile = {
8385
isStream: function () { return true },
8486
isNull: function() { return false },
85-
path: 'testpath'
87+
path: path.resolve('testpath')
8688
};
8789

8890
stream.write(streamFile)
@@ -114,7 +116,7 @@ it('should generate source maps', function (cb) {
114116

115117
write.on('data', function (file) {
116118
assert.equal(file.sourceMap.mappings, 'AAAA,IAAI,aAAY,CAAZ,aAAY,CAAZ,aAAY,CAAZ,YAAY,EAAE')
117-
assert(/sourceMappingURL=data:application\/json;base64/.test(file.contents.toString()))
119+
assert(/sourceMappingURL=data:application\/json;(?:charset=\w+;)?base64/.test(file.contents.toString()))
118120
cb()
119121
})
120122

@@ -158,12 +160,19 @@ it('should correctly generate relative source map', function (cb) {
158160
describe('PostCSS Guidelines', function () {
159161

160162
var sandbox = sinon.sandbox.create()
161-
var CssSyntaxError = function (message, sourceCode) {
163+
var CssSyntaxError = function (message, source) {
162164
this.name = 'CssSyntaxError'
163165
this.message = message
164-
this.sourceCode = sourceCode
166+
this.source = source
165167
this.showSourceCode = function () {
166-
return this.sourceCode
168+
return this.source
169+
}
170+
this.toString = function(){
171+
let code = this.showSourceCode();
172+
if ( code ) {
173+
code = '\n\n' + code + '\n';
174+
}
175+
return this.name + ': ' + this.message + code;
167176
}
168177
}
169178
var postcssStub = {
@@ -238,12 +247,13 @@ describe('PostCSS Guidelines', function () {
238247
it('should not output js stack trace for `CssSyntaxError`', function (cb) {
239248

240249
var stream = postcss([ doubler ])
241-
var cssSyntaxError = new CssSyntaxError('message', 'sourceCode')
250+
var cssSyntaxError = new CssSyntaxError('messageText', 'sourceCode')
242251
postcssStub.process.returns(Promise.reject(cssSyntaxError))
243252

244253
stream.on('error', function (error) {
245254
assert.equal(error.showStack, false)
246-
assert.equal(error.message, 'message' + '\n\nsourceCode\n')
255+
assert.equal(error.message, 'messageText\n\nsourceCode\n')
256+
assert.equal(error.source, 'sourceCode')
247257
cb()
248258
})
249259

0 commit comments

Comments
 (0)