From ef0e3a052837dc29d99170b96a48caf47ece38b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 13 Apr 2020 19:12:22 -0400 Subject: [PATCH 1/3] fix: report missing plugins on type exports --- packages/babel-parser/src/parser/statement.js | 25 ++++++++++++++++--- .../expect-plugin/export-interface/input.js | 1 + .../export-interface/options.json | 7 ++++++ .../expect-plugin/export-type-named/input.js | 2 ++ .../export-type-named/options.json | 7 ++++++ .../flow/expect-plugin/export-type/input.js | 1 + .../expect-plugin/export-type/options.json | 7 ++++++ .../fixtures/flow/expect-plugin/options.json | 4 +++ .../expect-plugin/export-interface/input.js | 1 + .../export-interface/options.json | 4 +++ .../expect-plugin/export-type-named/input.js | 2 ++ .../export-type-named/options.json | 4 +++ .../expect-plugin/export-type/input.js | 1 + .../expect-plugin/export-type/options.json | 4 +++ .../typescript/expect-plugin/options.json | 3 +++ 15 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/input.js create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/options.json create mode 100644 packages/babel-parser/test/fixtures/flow/expect-plugin/options.json create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/input.js create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/options.json create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/input.js create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/options.json create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/input.js create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/options.json create mode 100644 packages/babel-parser/test/fixtures/typescript/expect-plugin/options.json diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 32ad1a30d28b..a3ec32add44d 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1834,10 +1834,27 @@ export default class StatementParser extends ExpressionParser { isExportDefaultSpecifier(): boolean { if (this.match(tt.name)) { - return this.state.value !== "async" && this.state.value !== "let"; - } - - if (!this.match(tt._default)) { + if (this.state.value === "async" || this.state.value === "let") { + return false; + } + if ( + (this.state.value === "type" || this.state.value === "interface") && + !this.state.containsEsc + ) { + const l = this.lookahead(); + // If we see any variable name other than `from` after `type` keyword, + // we consider it as flow/typescript type exports + // note that this approach may fail on some pedentic cases + // export type from = number + if ( + (l.type === tt.name && l.value !== "from") || + l.type === tt.braceL + ) { + this.expectOnePlugin(["flow", "typescript"]); + return false; + } + } + } else if (!this.match(tt._default)) { return false; } diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/input.js b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/input.js new file mode 100644 index 000000000000..39df3b83f7e9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/input.js @@ -0,0 +1 @@ +export interface Foo {} diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/options.json b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/options.json new file mode 100644 index 000000000000..3f1eb56acdfa --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-interface/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx" + ], + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/input.js b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/input.js new file mode 100644 index 000000000000..2bece0a4af63 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/input.js @@ -0,0 +1,2 @@ +var Foo; +export type { Foo }; diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/options.json b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/options.json new file mode 100644 index 000000000000..80ced9a61c4f --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type-named/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx" + ], + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (2:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/input.js b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/input.js new file mode 100644 index 000000000000..191a99ee3073 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/input.js @@ -0,0 +1 @@ +export type Foo = number; diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/options.json b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/options.json new file mode 100644 index 000000000000..3f1eb56acdfa --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/export-type/options.json @@ -0,0 +1,7 @@ +{ + "sourceType": "module", + "plugins": [ + "jsx" + ], + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/flow/expect-plugin/options.json b/packages/babel-parser/test/fixtures/flow/expect-plugin/options.json new file mode 100644 index 000000000000..21c10b585e47 --- /dev/null +++ b/packages/babel-parser/test/fixtures/flow/expect-plugin/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "plugins": ["jsx"] +} diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/input.js b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/input.js new file mode 100644 index 000000000000..39df3b83f7e9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/input.js @@ -0,0 +1 @@ +export interface Foo {} diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/options.json b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/options.json new file mode 100644 index 000000000000..6638a1d3d788 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-interface/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/input.js b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/input.js new file mode 100644 index 000000000000..2bece0a4af63 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/input.js @@ -0,0 +1,2 @@ +var Foo; +export type { Foo }; diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/options.json b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/options.json new file mode 100644 index 000000000000..afcf32448a2c --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type-named/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (2:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/input.js b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/input.js new file mode 100644 index 000000000000..191a99ee3073 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/input.js @@ -0,0 +1 @@ +export type Foo = number; diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/options.json b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/options.json new file mode 100644 index 000000000000..6638a1d3d788 --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/export-type/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "module", + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'flow, typescript' (1:7)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/typescript/expect-plugin/options.json b/packages/babel-parser/test/fixtures/typescript/expect-plugin/options.json new file mode 100644 index 000000000000..2104ca43283f --- /dev/null +++ b/packages/babel-parser/test/fixtures/typescript/expect-plugin/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} From b56d1658c918b86165d210264cad2706647fd178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 13 Apr 2020 19:22:49 -0400 Subject: [PATCH 2/3] nit refactors --- packages/babel-parser/src/parser/statement.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index a3ec32add44d..d55e467a4772 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1834,11 +1834,12 @@ export default class StatementParser extends ExpressionParser { isExportDefaultSpecifier(): boolean { if (this.match(tt.name)) { - if (this.state.value === "async" || this.state.value === "let") { + const value = this.state.value; + if (value === "async" || value === "let") { return false; } if ( - (this.state.value === "type" || this.state.value === "interface") && + (value === "type" || value === "interface") && !this.state.containsEsc ) { const l = this.lookahead(); From 6d3cdb62a6c1e73e50ee863e05de7864300d9e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 14 Apr 2020 15:21:34 +0200 Subject: [PATCH 3/3] Update packages/babel-parser/src/parser/statement.js [skip ci] Co-Authored-By: Brian Ng --- packages/babel-parser/src/parser/statement.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index d55e467a4772..5b1d1077712e 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1845,7 +1845,7 @@ export default class StatementParser extends ExpressionParser { const l = this.lookahead(); // If we see any variable name other than `from` after `type` keyword, // we consider it as flow/typescript type exports - // note that this approach may fail on some pedentic cases + // note that this approach may fail on some pedantic cases // export type from = number if ( (l.type === tt.name && l.value !== "from") ||