From 641b78de7c8cea25dc28ae3f857f93f40ce12dfe Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Sat, 13 Nov 2021 18:19:57 +0900 Subject: [PATCH 1/4] Add assertions to ExportNamedDeclaration without from --- packages/babel-parser/src/parser/statement.js | 3 + .../invalid-export-without-from/output.json | 3 +- .../valid-export-class/input.js | 1 + .../valid-export-class/output.json | 35 +++++++++++ .../valid-export-function/input.js | 1 + .../valid-export-function/output.json | 38 ++++++++++++ .../valid-export-variable/input.js | 1 + .../valid-export-variable/output.json | 45 ++++++++++++++ .../valid-export-without-from/input.js | 3 + .../valid-export-without-from/output.json | 61 +++++++++++++++++++ 10 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/output.json create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/output.json diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 1170a7a9cc77..23be23b2dc1f 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1824,6 +1824,9 @@ export default class StatementParser extends ExpressionParser { if (isFromRequired || hasSpecifiers || hasDeclaration) { this.checkExport(node, true, false, !!node.source); + if (this.hasPlugin("importAssertions") && node.assertions == null) { + node.assertions = []; + } return this.finishNode(node, "ExportNamedDeclaration"); } diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/invalid-export-without-from/output.json b/packages/babel-parser/test/fixtures/experimental/import-assertions/invalid-export-without-from/output.json index 8e0546403d41..fa605551fac4 100644 --- a/packages/babel-parser/test/fixtures/experimental/import-assertions/invalid-export-without-from/output.json +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/invalid-export-without-from/output.json @@ -56,7 +56,8 @@ } ], "source": null, - "declaration": null + "declaration": null, + "assertions": [] }, { "type": "ExpressionStatement", diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/input.js b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/input.js new file mode 100644 index 000000000000..223d0a8b395b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/input.js @@ -0,0 +1 @@ +export class Foo {} diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/output.json b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/output.json new file mode 100644 index 000000000000..44c625806f04 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-class/output.json @@ -0,0 +1,35 @@ +{ + "type": "File", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "program": { + "type": "Program", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExportNamedDeclaration", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}}, + "specifiers": [], + "source": null, + "declaration": { + "type": "ClassDeclaration", + "start":7,"end":19,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":19}}, + "id": { + "type": "Identifier", + "start":13,"end":16,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":16},"identifierName":"Foo"}, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":17,"end":19,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":19}}, + "body": [] + } + }, + "assertions": [] + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/input.js b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/input.js new file mode 100644 index 000000000000..f99d4277774f --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/input.js @@ -0,0 +1 @@ +export function foo() {} diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/output.json b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/output.json new file mode 100644 index 000000000000..bbcc0210b47b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-function/output.json @@ -0,0 +1,38 @@ +{ + "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", + "interpreter": null, + "body": [ + { + "type": "ExportNamedDeclaration", + "start":0,"end":24,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":24}}, + "specifiers": [], + "source": null, + "declaration": { + "type": "FunctionDeclaration", + "start":7,"end":24,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":24}}, + "id": { + "type": "Identifier", + "start":16,"end":19,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":19},"identifierName":"foo"}, + "name": "foo" + }, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":22,"end":24,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":24}}, + "body": [], + "directives": [] + } + }, + "assertions": [] + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/input.js b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/input.js new file mode 100644 index 000000000000..b30bd489f951 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/input.js @@ -0,0 +1 @@ +export const foo = ""; diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/output.json b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/output.json new file mode 100644 index 000000000000..715b312bb998 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-variable/output.json @@ -0,0 +1,45 @@ +{ + "type": "File", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}}, + "program": { + "type": "Program", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "ExportNamedDeclaration", + "start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}}, + "specifiers": [], + "source": null, + "declaration": { + "type": "VariableDeclaration", + "start":7,"end":22,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":22}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":13,"end":21,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":21}}, + "id": { + "type": "Identifier", + "start":13,"end":16,"loc":{"start":{"line":1,"column":13},"end":{"line":1,"column":16},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "StringLiteral", + "start":19,"end":21,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":21}}, + "extra": { + "rawValue": "", + "raw": "\"\"" + }, + "value": "" + } + } + ], + "kind": "const" + }, + "assertions": [] + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/input.js b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/input.js new file mode 100644 index 000000000000..b8017e6930e7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/input.js @@ -0,0 +1,3 @@ +const foo = ""; + +export { foo }; diff --git a/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/output.json b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/output.json new file mode 100644 index 000000000000..b6f5226f3334 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/import-assertions/valid-export-without-from/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":15}}, + "program": { + "type": "Program", + "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":15}}, + "sourceType": "module", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "declarations": [ + { + "type": "VariableDeclarator", + "start":6,"end":14,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":14}}, + "id": { + "type": "Identifier", + "start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"foo"}, + "name": "foo" + }, + "init": { + "type": "StringLiteral", + "start":12,"end":14,"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":14}}, + "extra": { + "rawValue": "", + "raw": "\"\"" + }, + "value": "" + } + } + ], + "kind": "const" + }, + { + "type": "ExportNamedDeclaration", + "start":17,"end":32,"loc":{"start":{"line":3,"column":0},"end":{"line":3,"column":15}}, + "specifiers": [ + { + "type": "ExportSpecifier", + "start":26,"end":29,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":12}}, + "local": { + "type": "Identifier", + "start":26,"end":29,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":12},"identifierName":"foo"}, + "name": "foo" + }, + "exported": { + "type": "Identifier", + "start":26,"end":29,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":12},"identifierName":"foo"}, + "name": "foo" + } + } + ], + "source": null, + "declaration": null, + "assertions": [] + } + ], + "directives": [] + } +} \ No newline at end of file From 1df6528a51bd39c8a2b9918a3c3d34107cf2a436 Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Tue, 16 Nov 2021 00:28:48 +0900 Subject: [PATCH 2/4] Update packages/babel-parser/src/parser/statement.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- packages/babel-parser/src/parser/statement.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 23be23b2dc1f..243c769b3a3a 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1824,8 +1824,8 @@ export default class StatementParser extends ExpressionParser { if (isFromRequired || hasSpecifiers || hasDeclaration) { this.checkExport(node, true, false, !!node.source); - if (this.hasPlugin("importAssertions") && node.assertions == null) { - node.assertions = []; + if (this.hasPlugin("importAssertions")) { + node.assertions ??= []; } return this.finishNode(node, "ExportNamedDeclaration"); } From baeef1a260a13540b76f152840fd0083fabf6e54 Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Tue, 16 Nov 2021 00:40:01 +0900 Subject: [PATCH 3/4] revert --- packages/babel-parser/src/parser/statement.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 243c769b3a3a..23be23b2dc1f 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1824,8 +1824,8 @@ export default class StatementParser extends ExpressionParser { if (isFromRequired || hasSpecifiers || hasDeclaration) { this.checkExport(node, true, false, !!node.source); - if (this.hasPlugin("importAssertions")) { - node.assertions ??= []; + if (this.hasPlugin("importAssertions") && node.assertions == null) { + node.assertions = []; } return this.finishNode(node, "ExportNamedDeclaration"); } From 6cd651ea9ba455b8c436e7190ee4162ba291558d Mon Sep 17 00:00:00 2001 From: sosukesuzuki Date: Tue, 16 Nov 2021 05:19:55 +0900 Subject: [PATCH 4/4] Refactor --- packages/babel-parser/src/parser/statement.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 23be23b2dc1f..e93754f3c638 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1824,9 +1824,6 @@ export default class StatementParser extends ExpressionParser { if (isFromRequired || hasSpecifiers || hasDeclaration) { this.checkExport(node, true, false, !!node.source); - if (this.hasPlugin("importAssertions") && node.assertions == null) { - node.assertions = []; - } return this.finishNode(node, "ExportNamedDeclaration"); } @@ -1886,6 +1883,9 @@ export default class StatementParser extends ExpressionParser { node.source = null; node.declaration = null; + if (this.hasPlugin("importAssertions")) { + node.assertions = []; + } return true; } @@ -1896,6 +1896,9 @@ export default class StatementParser extends ExpressionParser { if (this.shouldParseExportDeclaration()) { node.specifiers = []; node.source = null; + if (this.hasPlugin("importAssertions")) { + node.assertions = []; + } node.declaration = this.parseExportDeclaration(node); return true; } @@ -2008,12 +2011,8 @@ export default class StatementParser extends ExpressionParser { if (assertions) { node.assertions = assertions; } - } else { - if (expect) { - this.unexpected(); - } else { - node.source = null; - } + } else if (expect) { + this.unexpected(); } this.semicolon();