From a179ce9fbba9d263ad783c3b000e95a3a0be5795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Mon, 26 Jun 2023 13:34:24 -0400 Subject: [PATCH] fix: allow new (import(foo)) --- .../babel-parser/src/parser/expression.ts | 6 ++- .../valid-new-parens/input.js | 1 + .../valid-new-parens/output.json | 45 +++++++++++++++++++ .../dynamic-import/valid-new-parens/input.js | 1 + .../valid-new-parens/output.json | 39 ++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/input.js create mode 100644 packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/output.json create mode 100644 packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/input.js create mode 100644 packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/output.json diff --git a/packages/babel-parser/src/parser/expression.ts b/packages/babel-parser/src/parser/expression.ts index 6ef55ced8897..20e498fca2c7 100644 --- a/packages/babel-parser/src/parser/expression.ts +++ b/packages/babel-parser/src/parser/expression.ts @@ -1935,9 +1935,13 @@ export default abstract class ExpressionParser extends LValParser { } parseNewCallee(this: Parser, node: Undone): void { + const isImport = this.match(tt._import); const callee = this.parseNoCallExpr(); node.callee = callee; - if (callee.type === "Import" || callee.type === "ImportExpression") { + if ( + isImport && + (callee.type === "Import" || callee.type === "ImportExpression") + ) { this.raise(Errors.ImportCallNotNewExpression, { at: callee }); } } diff --git a/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/input.js b/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/input.js new file mode 100644 index 000000000000..b93cb0b48994 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/input.js @@ -0,0 +1 @@ +new (import("foo")); diff --git a/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/output.json b/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/output.json new file mode 100644 index 000000000000..c189231f0317 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/dynamic-import-createImportExpression-false/valid-new-parens/output.json @@ -0,0 +1,45 @@ +{ + "type": "File", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "program": { + "type": "Program", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "expression": { + "type": "NewExpression", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":19,"index":19}}, + "callee": { + "type": "CallExpression", + "start":5,"end":18,"loc":{"start":{"line":1,"column":5,"index":5},"end":{"line":1,"column":18,"index":18}}, + "callee": { + "type": "Import", + "start":5,"end":11,"loc":{"start":{"line":1,"column":5,"index":5},"end":{"line":1,"column":11,"index":11}} + }, + "arguments": [ + { + "type": "StringLiteral", + "start":12,"end":17,"loc":{"start":{"line":1,"column":12,"index":12},"end":{"line":1,"column":17,"index":17}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + } + ], + "extra": { + "parenthesized": true, + "parenStart": 4 + } + }, + "arguments": [] + } + } + ], + "directives": [] + } +} diff --git a/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/input.js b/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/input.js new file mode 100644 index 000000000000..b93cb0b48994 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/input.js @@ -0,0 +1 @@ +new (import("foo")); diff --git a/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/output.json b/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/output.json new file mode 100644 index 000000000000..34eaf64851e7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/dynamic-import/valid-new-parens/output.json @@ -0,0 +1,39 @@ +{ + "type": "File", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "program": { + "type": "Program", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":20,"index":20}}, + "expression": { + "type": "NewExpression", + "start":0,"end":19,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":19,"index":19}}, + "callee": { + "type": "ImportExpression", + "start":5,"end":18,"loc":{"start":{"line":1,"column":5,"index":5},"end":{"line":1,"column":18,"index":18}}, + "source": { + "type": "StringLiteral", + "start":12,"end":17,"loc":{"start":{"line":1,"column":12,"index":12},"end":{"line":1,"column":17,"index":17}}, + "extra": { + "rawValue": "foo", + "raw": "\"foo\"" + }, + "value": "foo" + }, + "extra": { + "parenthesized": true, + "parenStart": 4 + } + }, + "arguments": [] + } + } + ], + "directives": [] + } +}