From c58cc754123647f0eb234d4d976729a846f25adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 4 Jun 2020 17:35:13 -0400 Subject: [PATCH] disallow `from` as identifier after `export default` --- .../babel-parser/src/parser/error-message.js | 2 + packages/babel-parser/src/parser/statement.js | 11 ++++++ .../default-default-asi/input.js | 2 + .../default-default-asi/options.json | 4 ++ .../default-default-asi/output.json | 37 +++++++++++++++++++ .../input.js | 0 .../options.json | 0 .../output.json | 3 ++ 8 files changed, 59 insertions(+) create mode 100644 packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/output.json rename packages/babel-parser/test/fixtures/experimental/export-extensions/{default-from => invalid-default-from-identifier}/input.js (100%) rename packages/babel-parser/test/fixtures/experimental/export-extensions/{default-from => invalid-default-from-identifier}/options.json (100%) rename packages/babel-parser/test/fixtures/experimental/export-extensions/{default-from => invalid-default-from-identifier}/output.json (86%) diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index 033fe814e87f..430c44289213 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -42,6 +42,8 @@ export const ErrorMessages = Object.freeze({ DuplicateRegExpFlags: "Duplicate regular expression flag", ElementAfterRest: "Rest element must be last element", EscapedCharNotAnIdentifier: "Invalid Unicode escape", + ExportDefaultFromAsIdentifier: + "'from' is not allowed as an identifier after 'export default'", ForInOfLoopInitializer: "%0 loop variable declaration may not have an initializer", GeneratorInSingleStatementContext: diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 288bf34afdd0..3fadf245b643 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1924,6 +1924,17 @@ export default class StatementParser extends ExpressionParser { if (isDefault) { // Default exports this.checkDuplicateExports(node, "default"); + if (this.hasPlugin("exportDefaultFrom")) { + const declaration = ((node: any): N.ExportDefaultDeclaration) + .declaration; + if ( + declaration.type === "Identifier" && + declaration.name === "from" && + declaration.end - declaration.start === 4 // does not contain escape + ) { + this.raise(declaration.start, Errors.ExportDefaultFromAsIdentifier); + } + } } else if (node.specifiers && node.specifiers.length) { // Named exports for (const specifier of node.specifiers) { diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/input.js b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/input.js new file mode 100644 index 000000000000..3b8c1ebc1ca0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/input.js @@ -0,0 +1,2 @@ +export default from +"bar"; diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/options.json b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/options.json new file mode 100644 index 000000000000..164d90422fb2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "plugins": ["exportDefaultFrom"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/output.json b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/output.json new file mode 100644 index 000000000000..de0d1cce86c4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-default-asi/output.json @@ -0,0 +1,37 @@ +{ + "type": "File", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":6}}, + "program": { + "type": "Program", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":6}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExportNamedDeclaration", + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":6}}, + "specifiers": [ + { + "type": "ExportDefaultSpecifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":14}}, + "exported": { + "type": "Identifier", + "start":7,"end":14,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":14},"identifierName":"default"}, + "name": "default" + } + } + ], + "source": { + "type": "StringLiteral", + "start":20,"end":25,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":5}}, + "extra": { + "rawValue": "bar", + "raw": "\"bar\"" + }, + "value": "bar" + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/input.js b/packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/input.js rename to packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/input.js diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/options.json b/packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/options.json similarity index 100% rename from packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/options.json rename to packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/options.json diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/output.json b/packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/output.json similarity index 86% rename from packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/output.json rename to packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/output.json index efa51a6eeef9..cc0e24e848fe 100644 --- a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-from/output.json +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/invalid-default-from-identifier/output.json @@ -1,6 +1,9 @@ { "type": "File", "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "errors": [ + "SyntaxError: 'from' is not allowed as an identifier after 'export default' (1:15)" + ], "program": { "type": "Program", "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}},