From 990675d28e67f92b680c7094b3ceeac9f3bf1ce4 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Fri, 19 May 2017 10:28:42 +0200 Subject: [PATCH] Fix #437: only prohibit 'export type from "module" ' when flow is enabled (#438) (#531) * Only prohibit 'export type' when flow is enabled * Fix lint --- src/parser/statement.js | 4 +- src/plugins/flow.js | 13 +++ .../default-type-with-flow/actual.js | 1 + .../default-type-with-flow/options.json | 5 + .../default-type-without-flow/actual.js | 1 + .../default-type-without-flow/expected.json | 103 ++++++++++++++++++ 6 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/experimental/export-extensions/default-type-with-flow/actual.js create mode 100644 test/fixtures/experimental/export-extensions/default-type-with-flow/options.json create mode 100644 test/fixtures/experimental/export-extensions/default-type-without-flow/actual.js create mode 100644 test/fixtures/experimental/export-extensions/default-type-without-flow/expected.json diff --git a/src/parser/statement.js b/src/parser/statement.js index 488a554b94..d8d0eafb91 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -883,9 +883,7 @@ pp.parseExportDeclaration = function () { pp.isExportDefaultSpecifier = function () { if (this.match(tt.name)) { - return this.state.value !== "type" - && this.state.value !== "async" - && this.state.value !== "interface"; + return this.state.value !== "async"; } if (!this.match(tt._default)) { diff --git a/src/plugins/flow.js b/src/plugins/flow.js index fe6aa0a2ff..78e2f846bb 100644 --- a/src/plugins/flow.js +++ b/src/plugins/flow.js @@ -930,6 +930,19 @@ export default function (instance) { }; }); + instance.extend("isExportDefaultSpecifier", function (inner) { + return function () { + if ( + this.match(tt.name) && + (this.state.value === "type" || this.state.value === "interface") + ) { + return false; + } + + return inner.call(this); + }; + }); + instance.extend("parseConditional", function (inner) { return function (expr, noIn, startPos, startLoc, refNeedsArrowPos) { // only do the expensive clone if there is a question mark diff --git a/test/fixtures/experimental/export-extensions/default-type-with-flow/actual.js b/test/fixtures/experimental/export-extensions/default-type-with-flow/actual.js new file mode 100644 index 0000000000..2086d067fc --- /dev/null +++ b/test/fixtures/experimental/export-extensions/default-type-with-flow/actual.js @@ -0,0 +1 @@ +export type from 'test'; diff --git a/test/fixtures/experimental/export-extensions/default-type-with-flow/options.json b/test/fixtures/experimental/export-extensions/default-type-with-flow/options.json new file mode 100644 index 0000000000..3d735abd0a --- /dev/null +++ b/test/fixtures/experimental/export-extensions/default-type-with-flow/options.json @@ -0,0 +1,5 @@ +{ + "plugins": ["exportExtensions", "flow"], + "sourceType": "module", + "throws": "Unexpected token, expected = (1:17)" +} diff --git a/test/fixtures/experimental/export-extensions/default-type-without-flow/actual.js b/test/fixtures/experimental/export-extensions/default-type-without-flow/actual.js new file mode 100644 index 0000000000..2086d067fc --- /dev/null +++ b/test/fixtures/experimental/export-extensions/default-type-without-flow/actual.js @@ -0,0 +1 @@ +export type from 'test'; diff --git a/test/fixtures/experimental/export-extensions/default-type-without-flow/expected.json b/test/fixtures/experimental/export-extensions/default-type-without-flow/expected.json new file mode 100644 index 0000000000..8b0ad961f6 --- /dev/null +++ b/test/fixtures/experimental/export-extensions/default-type-without-flow/expected.json @@ -0,0 +1,103 @@ +{ + "type": "File", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportNamedDeclaration", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 24 + } + }, + "specifiers": [ + { + "type": "ExportDefaultSpecifier", + "start": 7, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "exported": { + "type": "Identifier", + "start": 7, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 11 + }, + "identifierName": "type" + }, + "name": "type" + } + } + ], + "source": { + "type": "StringLiteral", + "start": 17, + "end": 23, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 23 + } + }, + "extra": { + "rawValue": "test", + "raw": "'test'" + }, + "value": "test" + } + } + ], + "directives": [] + } +} \ No newline at end of file