From 68b02a843c2a7968ff768b39812a6b2bca26f214 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Sat, 28 Feb 2015 17:13:18 -0800 Subject: [PATCH] [react-packager] Better transform errors --- .../__tests__/Transformer-test.js | 4 +-- react-packager/src/JSTransformer/index.js | 34 ++++++++++++------- .../src/Packager/__tests__/Packager-test.js | 2 +- react-packager/src/Packager/index.js | 4 +-- transformer.js | 9 ++--- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/react-packager/src/JSTransformer/__tests__/Transformer-test.js b/react-packager/src/JSTransformer/__tests__/Transformer-test.js index cdba0b8b..36d81d8f 100644 --- a/react-packager/src/JSTransformer/__tests__/Transformer-test.js +++ b/react-packager/src/JSTransformer/__tests__/Transformer-test.js @@ -35,7 +35,7 @@ describe('Transformer', function() { callback(null, 'content'); }); - return new Transformer(OPTIONS).loadFileAndTransform([], 'file', {}) + return new Transformer(OPTIONS).loadFileAndTransform('file') .then(function(data) { expect(data).toEqual({ code: 'transformed', @@ -58,7 +58,7 @@ describe('Transformer', function() { callback(null, {error: esprimaError}); }); - return new Transformer(OPTIONS).loadFileAndTransform([], 'foo-file.js', {}) + return new Transformer(OPTIONS).loadFileAndTransform('foo-file.js') .catch(function(error) { expect(error.type).toEqual('TransformError'); expect(error.snippet).toEqual([ diff --git a/react-packager/src/JSTransformer/index.js b/react-packager/src/JSTransformer/index.js index e3e713ee..87cb6e1a 100644 --- a/react-packager/src/JSTransformer/index.js +++ b/react-packager/src/JSTransformer/index.js @@ -78,11 +78,7 @@ Transformer.prototype.invalidateFile = function(filePath) { this._cache.invalidate(filePath); }; -Transformer.prototype.loadFileAndTransform = function( - transformSets, - filePath, - options -) { +Transformer.prototype.loadFileAndTransform = function(filePath) { if (this._failedToStart) { return this._failedToStart; } @@ -92,15 +88,14 @@ Transformer.prototype.loadFileAndTransform = function( return readFile(filePath) .then(function(buffer) { var sourceCode = buffer.toString(); - var opts = _.extend({}, options, {filename: filePath}); + return q.nfbind(workers)({ - transformSets: transformSets, sourceCode: sourceCode, - options: opts, + filename: filePath, }).then( function(res) { if (res.error) { - throw formatEsprimaError(res.error, filePath, sourceCode); + throw formatError(res.error, filePath, sourceCode); } return { @@ -117,11 +112,26 @@ Transformer.prototype.loadFileAndTransform = function( function TransformError() {} util.inherits(TransformError, SyntaxError); -function formatEsprimaError(err, filename, source) { - if (!(err.lineNumber && err.column)) { - return err; +function formatError(err, filename, source) { + if (err.lineNumber && err.column) { + return formatEsprimaError(err, filename, source); + } else { + return formatGenericError(err, filename, source); } +} +function formatGenericError(err, filename) { + var msg = 'TransformError: ' + filename + ': ' + err.message; + var error = new TransformError(); + var stack = err.stack.split('\n').slice(0, -1); + stack.push(msg); + error.stack = stack.join('\n'); + error.message = msg; + error.type = 'TransformError'; + return error; +} + +function formatEsprimaError(err, filename, source) { var stack = err.stack.split('\n'); stack.shift(); diff --git a/react-packager/src/Packager/__tests__/Packager-test.js b/react-packager/src/Packager/__tests__/Packager-test.js index 21af12ca..2e43e91a 100644 --- a/react-packager/src/Packager/__tests__/Packager-test.js +++ b/react-packager/src/Packager/__tests__/Packager-test.js @@ -49,7 +49,7 @@ describe('Packager', function() { }); require('../../JSTransformer').prototype.loadFileAndTransform - .mockImpl(function(tsets, path) { + .mockImpl(function(path) { return q({ code: 'transformed ' + path, sourceCode: 'source ' + path, diff --git a/react-packager/src/Packager/index.js b/react-packager/src/Packager/index.js index 42295acc..123a3913 100644 --- a/react-packager/src/Packager/index.js +++ b/react-packager/src/Packager/index.js @@ -126,9 +126,7 @@ Packager.prototype.getDependencies = function(main) { Packager.prototype._transformModule = function(module) { var resolver = this._resolver; return this._transformer.loadFileAndTransform( - ['es6'], - path.resolve(module.path), - this._opts.transformer || {} + path.resolve(module.path) ).then(function(transformed) { return _.extend( {}, diff --git a/transformer.js b/transformer.js index ffcb80e2..acb586d7 100644 --- a/transformer.js +++ b/transformer.js @@ -16,10 +16,11 @@ var staticTypeSyntax = var visitorList = reactVisitors; -function transform(transformSets, srcTxt) { +function transform(srcTxt, filename) { var options = { es3: true, - sourceType: 'nonStrictModule' + sourceType: 'nonStrictModule', + filename: filename, }; // These tranforms mostly just erase type annotations and static typing @@ -42,8 +43,8 @@ module.exports = function(data, callback) { var result; try { result = transform( - data.transformSets, - data.sourceCode + data.sourceCode, + data.filename ); } catch (e) { return callback(null, {