From 61ec5ce95791ff88203b4015b16a84f6583e3fa0 Mon Sep 17 00:00:00 2001 From: Dennis Czombera Date: Fri, 13 Apr 2018 00:07:41 +0200 Subject: [PATCH] Provide better error message for invalid default export declaration (#7717) --- packages/babylon/src/parser/statement.js | 9 ++ .../export-default-class-declaration/input.js | 1 + .../output.json | 98 +++++++++++++++++ .../export-default-class-expression/input.js | 1 + .../output.json | 102 ++++++++++++++++++ .../input.js | 3 + .../options.json | 3 + .../input.js | 3 + .../options.json | 3 + .../input.js | 3 + .../options.json | 3 + 11 files changed, 229 insertions(+) create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/input.js create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/output.json create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/input.js create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/output.json create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/input.js create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/options.json create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/input.js create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/options.json create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/input.js create mode 100644 packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/options.json diff --git a/packages/babylon/src/parser/statement.js b/packages/babylon/src/parser/statement.js index 68f9cd0d75..8919221897 100644 --- a/packages/babylon/src/parser/statement.js +++ b/packages/babylon/src/parser/statement.js @@ -1417,6 +1417,15 @@ export default class StatementParser extends ExpressionParser { } else if (this.match(tt.at)) { this.parseDecorators(false); return this.parseClass(expr, true, true); + } else if ( + this.match(tt._let) || + this.match(tt._const) || + this.match(tt._var) + ) { + this.raise( + this.state.start, + "Only expressions, functions or classes are allowed as the `default` export.", + ); } else { const res = this.parseMaybeAssign(); this.semicolon(); diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/input.js b/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/input.js new file mode 100644 index 0000000000..7804111002 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/input.js @@ -0,0 +1 @@ +export default class Foo {} diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/output.json b/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/output.json new file mode 100644 index 0000000000..ed3482551f --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-class-declaration/output.json @@ -0,0 +1,98 @@ +{ + "type": "File", + "start": 0, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 0, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "declaration": { + "type": "ClassDeclaration", + "start": 15, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 15 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "id": { + "type": "Identifier", + "start": 21, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 24 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 25, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 25 + }, + "end": { + "line": 1, + "column": 27 + } + }, + "body": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/input.js b/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/input.js new file mode 100644 index 0000000000..caaf4f896e --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/input.js @@ -0,0 +1 @@ +export default (class Foo {}); diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/output.json b/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/output.json new file mode 100644 index 0000000000..a5cf3095a9 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-class-expression/output.json @@ -0,0 +1,102 @@ +{ + "type": "File", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 0, + "end": 30, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 30 + } + }, + "declaration": { + "type": "ClassExpression", + "start": 16, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "id": { + "type": "Identifier", + "start": 22, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 22 + }, + "end": { + "line": 1, + "column": 25 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 26, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 26 + }, + "end": { + "line": 1, + "column": 28 + } + }, + "body": [] + }, + "extra": { + "parenthesized": true, + "parenStart": 15 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/input.js b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/input.js new file mode 100644 index 0000000000..945b019ea1 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/input.js @@ -0,0 +1,3 @@ +export default const Foo = () => { + return `
Hola
`; +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/options.json b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/options.json new file mode 100644 index 0000000000..371aabd618 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Only expressions, functions or classes are allowed as the `default` export. (1:15)" +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/input.js b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/input.js new file mode 100644 index 0000000000..b186094605 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/input.js @@ -0,0 +1,3 @@ +export default let Foo = () => { + return `
Hola
`; +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/options.json b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/options.json new file mode 100644 index 0000000000..371aabd618 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration2/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Only expressions, functions or classes are allowed as the `default` export. (1:15)" +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/input.js b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/input.js new file mode 100644 index 0000000000..03791d0e9e --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/input.js @@ -0,0 +1,3 @@ +export default var Foo = () => { + return `
Hola
`; +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/options.json b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/options.json new file mode 100644 index 0000000000..371aabd618 --- /dev/null +++ b/packages/babylon/test/fixtures/es2015/modules/export-default-variable-declaration3/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Only expressions, functions or classes are allowed as the `default` export. (1:15)" +} \ No newline at end of file