diff --git a/packages/metro/package.json b/packages/metro/package.json index f63799227d..706abbaac0 100644 --- a/packages/metro/package.json +++ b/packages/metro/package.json @@ -47,6 +47,7 @@ "mkdirp": "^0.5.1", "request": "^2.79.0", "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", "source-map": "^0.5.6", "temp": "0.8.3", "throat": "^4.1.0", diff --git a/packages/metro/src/Server/__tests__/Server-test.js b/packages/metro/src/Server/__tests__/Server-test.js index c9e02e1246..3510b5d539 100644 --- a/packages/metro/src/Server/__tests__/Server-test.js +++ b/packages/metro/src/Server/__tests__/Server-test.js @@ -301,6 +301,31 @@ describe('processRequest', () => { expect(response.body).toEqual('{"delta": "bundle"}'); }); }); + + it('should include the error message for transform errors', () => { + Serializers.deltaBundle.mockImplementation(async () => { + const transformError = new SyntaxError('test syntax error'); + transformError.type = 'TransformError'; + transformError.filename = 'testFile.js'; + transformError.lineNumber = 123; + throw transformError; + }); + + return makeRequest(requestHandler, 'index.delta?platform=ios').then( + function(response) { + expect(() => JSON.parse(response.body)).not.toThrow(); + const body = JSON.parse(response.body); + expect(body).toMatchObject({ + type: 'TransformError', + message: 'test syntax error', + }); + expect(body.errors).toContainEqual({ + filename: 'testFile.js', + lineNumber: 123, + }); + }, + ); + }); }); describe('/onchange endpoint', () => { diff --git a/packages/metro/src/Server/index.js b/packages/metro/src/Server/index.js index 083b1699de..94f6e76a3c 100644 --- a/packages/metro/src/Server/index.js +++ b/packages/metro/src/Server/index.js @@ -24,6 +24,7 @@ const getOrderedDependencyPaths = require('../lib/getOrderedDependencyPaths'); const mime = require('mime-types'); const parsePlatformFilePath = require('../node-haste/lib/parsePlatformFilePath'); const path = require('path'); +const serializeError = require('serialize-error'); const symbolicate = require('./symbolicate'); const url = require('url'); @@ -746,7 +747,7 @@ class Server { res.writeHead(error.status || 500, { 'Content-Type': 'application/json; charset=UTF-8', }); - res.end(JSON.stringify(formattedError)); + res.end(JSON.stringify(serializeError(formattedError))); this._reporter.update({error, type: 'bundling_error'}); log({ diff --git a/yarn.lock b/yarn.lock index 1a05b8bfce..b320d93798 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4869,6 +4869,10 @@ send@0.13.2: range-parser "~1.0.3" statuses "~1.2.1" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + serve-favicon@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.3.2.tgz#dd419e268de012ab72b319d337f2105013f9381f"