diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 32ad1a30d28b..5b1d1077712e 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1834,10 +1834,28 @@ 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)) { + const value = this.state.value; + if (value === "async" || value === "let") { + return false; + } + if ( + (value === "type" || 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 pedantic 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" +}