diff --git a/src/Module.ts b/src/Module.ts index bd675619b1a..265b519c240 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -140,7 +140,8 @@ function tryParse(module: Module, Parser: typeof acorn.Parser, acornOptions: aco module.error( { code: 'PARSE_ERROR', - message + message, + parserError: err }, err.pos ); diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index dde8c504e0f..4e66afb16df 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -4,6 +4,7 @@ import { EventEmitter } from 'events'; export const VERSION: string; export interface RollupError extends RollupLogProps { + parserError?: Error; stack?: string; watchFiles?: string[]; } diff --git a/test/function/samples/double-default-export/_config.js b/test/function/samples/double-default-export/_config.js index c1a58edbcc7..792dad2d2db 100644 --- a/test/function/samples/double-default-export/_config.js +++ b/test/function/samples/double-default-export/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `Duplicate export 'default'`, + parserError: { + loc: { + column: 7, + line: 2 + }, + message: "Duplicate export 'default' (2:7)", + pos: 25, + raisedAt: 34 + }, pos: 25, watchFiles: [path.resolve(__dirname, 'main.js'), path.resolve(__dirname, 'foo.js')], loc: { diff --git a/test/function/samples/double-named-export/_config.js b/test/function/samples/double-named-export/_config.js index 246fd8efee6..e9d7d5d5f54 100644 --- a/test/function/samples/double-named-export/_config.js +++ b/test/function/samples/double-named-export/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `Duplicate export 'foo'`, + parserError: { + loc: { + column: 9, + line: 3 + }, + message: "Duplicate export 'foo' (3:9)", + pos: 38, + raisedAt: 43 + }, pos: 38, watchFiles: [path.resolve(__dirname, 'main.js'), path.resolve(__dirname, 'foo.js')], loc: { diff --git a/test/function/samples/double-named-reexport/_config.js b/test/function/samples/double-named-reexport/_config.js index c8a2cb35685..8fae7ea261a 100644 --- a/test/function/samples/double-named-reexport/_config.js +++ b/test/function/samples/double-named-reexport/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `Duplicate export 'foo'`, + parserError: { + loc: { + column: 9, + line: 3 + }, + message: "Duplicate export 'foo' (3:9)", + pos: 38, + raisedAt: 43 + }, pos: 38, watchFiles: [path.resolve(__dirname, 'main.js'), path.resolve(__dirname, 'foo.js')], loc: { diff --git a/test/function/samples/duplicate-import-fails/_config.js b/test/function/samples/duplicate-import-fails/_config.js index b631dd140a0..e31695fba5f 100644 --- a/test/function/samples/duplicate-import-fails/_config.js +++ b/test/function/samples/duplicate-import-fails/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `Identifier 'a' has already been declared`, + parserError: { + loc: { + column: 9, + line: 2 + }, + message: "Identifier 'a' has already been declared (2:9)", + pos: 36, + raisedAt: 39 + }, pos: 36, watchFiles: [path.resolve(__dirname, 'main.js')], loc: { diff --git a/test/function/samples/duplicate-import-specifier-fails/_config.js b/test/function/samples/duplicate-import-specifier-fails/_config.js index 0ec688bf439..02e51693dc4 100644 --- a/test/function/samples/duplicate-import-specifier-fails/_config.js +++ b/test/function/samples/duplicate-import-specifier-fails/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `Identifier 'a' has already been declared`, + parserError: { + loc: { + column: 12, + line: 1 + }, + message: "Identifier 'a' has already been declared (1:12)", + pos: 12, + raisedAt: 15 + }, pos: 12, watchFiles: [path.resolve(__dirname, 'main.js')], loc: { diff --git a/test/function/samples/error-parse-json/_config.js b/test/function/samples/error-parse-json/_config.js index b0974b84a66..e9a3c2fe6a6 100644 --- a/test/function/samples/error-parse-json/_config.js +++ b/test/function/samples/error-parse-json/_config.js @@ -6,6 +6,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: 'Unexpected token (Note that you need rollup-plugin-json to import JSON files)', + parserError: { + loc: { + column: 8, + line: 2 + }, + message: 'Unexpected token (2:8)', + pos: 10, + raisedAt: 11 + }, pos: 10, watchFiles: [path.resolve(__dirname, 'main.js'), path.resolve(__dirname, 'file.json')], loc: { diff --git a/test/function/samples/error-parse-unknown-extension/_config.js b/test/function/samples/error-parse-unknown-extension/_config.js index 15659ced761..a9949efb4ef 100644 --- a/test/function/samples/error-parse-unknown-extension/_config.js +++ b/test/function/samples/error-parse-unknown-extension/_config.js @@ -7,6 +7,15 @@ module.exports = { code: 'PARSE_ERROR', message: 'Unexpected token (Note that you need plugins to import files that are not JavaScript)', + parserError: { + loc: { + column: 0, + line: 1 + }, + message: 'Unexpected token (1:0)', + pos: 0, + raisedAt: 1 + }, pos: 0, watchFiles: [path.resolve(__dirname, 'main.js'), path.resolve(__dirname, 'file.css')], loc: { diff --git a/test/function/samples/export-not-at-top-level-fails/_config.js b/test/function/samples/export-not-at-top-level-fails/_config.js index 657b4222cd3..17680e24306 100644 --- a/test/function/samples/export-not-at-top-level-fails/_config.js +++ b/test/function/samples/export-not-at-top-level-fails/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `'import' and 'export' may only appear at the top level`, + parserError: { + loc: { + column: 2, + line: 2 + }, + message: "'import' and 'export' may only appear at the top level (2:2)", + pos: 19, + raisedAt: 25 + }, pos: 19, watchFiles: [path.resolve(__dirname, 'main.js')], loc: { diff --git a/test/function/samples/import-not-at-top-level-fails/_config.js b/test/function/samples/import-not-at-top-level-fails/_config.js index 46b1434602a..a6da4dffaad 100644 --- a/test/function/samples/import-not-at-top-level-fails/_config.js +++ b/test/function/samples/import-not-at-top-level-fails/_config.js @@ -5,6 +5,15 @@ module.exports = { error: { code: 'PARSE_ERROR', message: `'import' and 'export' may only appear at the top level`, + parserError: { + loc: { + column: 2, + line: 2 + }, + message: "'import' and 'export' may only appear at the top level (2:2)", + pos: 19, + raisedAt: 25 + }, pos: 19, watchFiles: [path.resolve(__dirname, 'main.js')], loc: { diff --git a/test/utils.js b/test/utils.js index 2506c74d9d7..b8159f292c2 100644 --- a/test/utils.js +++ b/test/utils.js @@ -13,11 +13,19 @@ exports.normaliseOutput = normaliseOutput; exports.runTestSuiteWithSamples = runTestSuiteWithSamples; exports.assertDirectoriesAreEqual = assertDirectoriesAreEqual; -function compareError(actual, expected) { - delete actual.stack; - actual = Object.assign({}, actual, { - message: actual.message +function normaliseError(error) { + delete error.stack; + return Object.assign({}, error, { + message: error.message }); +} + +function compareError(actual, expected) { + actual = normaliseError(actual); + + if (actual.parserError) { + actual.parserError = normaliseError(actual.parserError); + } if (actual.frame) { actual.frame = actual.frame.replace(/\s+$/gm, '');