diff --git a/eslint/babel-eslint-parser/src/parse.js b/eslint/babel-eslint-parser/src/parse.js index 9c0a9a61d199..fc8a27abd116 100644 --- a/eslint/babel-eslint-parser/src/parse.js +++ b/eslint/babel-eslint-parser/src/parse.js @@ -34,7 +34,7 @@ export default function(code, options) { plugins: ["estree"], }, caller: { - name: "babel-eslint", + name: "@babel/eslint-parser", }, }; diff --git a/eslint/babel-eslint-parser/test/babel-eslint-parser.js b/eslint/babel-eslint-parser/test/babel-eslint-parser.js index d3aa67223b18..fb75112dc966 100644 --- a/eslint/babel-eslint-parser/test/babel-eslint-parser.js +++ b/eslint/babel-eslint-parser/test/babel-eslint-parser.js @@ -524,5 +524,11 @@ describe("babylon-to-espree", () => { const a = 1n; `); }); + + it("Dynamic Import", () => { + parseAndAssertSame(` + const a = import('a'); + `); + }); }); }); diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 8fd00cda91fb..e844bb7f91db 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -758,7 +758,7 @@ export default class ExpressionParser extends LValParser { finishCallExpression( node: T, optional: boolean, - ): T { + ): N.Expression { if (node.callee.type === "Import") { if (node.arguments.length !== 1) { this.raise(node.start, "import() requires exactly one argument"); diff --git a/packages/babel-parser/src/parser/lval.js b/packages/babel-parser/src/parser/lval.js index 9a726a36dc2f..383b5f3edc1a 100644 --- a/packages/babel-parser/src/parser/lval.js +++ b/packages/babel-parser/src/parser/lval.js @@ -228,7 +228,7 @@ export default class LValParser extends NodeUtils { toReferencedListDeep( exprList: $ReadOnlyArray, isParenthesizedExpr?: boolean, - ): $ReadOnlyArray { + ): void { this.toReferencedList(exprList, isParenthesizedExpr); for (const expr of exprList) { @@ -236,8 +236,6 @@ export default class LValParser extends NodeUtils { this.toReferencedListDeep(expr.elements); } } - - return exprList; } // Parses spread element. diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 9a7ae0cf5918..fc7640de1764 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -411,4 +411,32 @@ export default (superClass: Class): Class => super.toAssignableObjectExpressionProp(prop, isBinding, isLast); } } + + finishCallExpression( + node: T, + optional: boolean, + ): N.Expression { + super.finishCallExpression(node, optional); + + if (node.callee.type === "Import") { + ((node: N.Node): N.EstreeImportExpression).type = "ImportExpression"; + ((node: N.Node): N.EstreeImportExpression).source = node.arguments[0]; + delete node.arguments; + delete node.callee; + } + + return node; + } + + toReferencedListDeep( + exprList: $ReadOnlyArray, + isParenthesizedExpr?: boolean, + ): void { + // ImportExpressions do not have an arguments array. + if (!exprList) { + return; + } + + super.toReferencedListDeep(exprList, isParenthesizedExpr); + } }; diff --git a/packages/babel-parser/src/types.js b/packages/babel-parser/src/types.js index 71e83d142958..597b2f5d674c 100644 --- a/packages/babel-parser/src/types.js +++ b/packages/babel-parser/src/types.js @@ -1013,7 +1013,7 @@ export type FlowInterfaceType = NodeBase & { body: FlowObjectTypeAnnotation, }; -// estree +// ESTree export type EstreeProperty = NodeBase & { type: "Property", @@ -1039,6 +1039,11 @@ export type EstreeMethodDefinition = NodeBase & { variance?: ?FlowVariance, }; +export type EstreeImportExpression = NodeBase & { + type: "ImportExpression", + source: Expression, +}; + // === === === === // TypeScript // === === === === diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-1/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-2/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-3/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-4/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json index 5a02a61446d2..070d941a7562 100644 --- a/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json +++ b/packages/babel-parser/test/fixtures/core/categorized/invalid-assignment-pattern-5/options.json @@ -1,5 +1,3 @@ { - "plugins": [ - "estree" - ] -} \ No newline at end of file + "plugins": ["estree"] +} diff --git a/packages/babel-parser/test/fixtures/estree/bigInt/options.json b/packages/babel-parser/test/fixtures/estree/bigInt/options.json index da7e9e174f39..0df9db5c35e7 100644 --- a/packages/babel-parser/test/fixtures/estree/bigInt/options.json +++ b/packages/babel-parser/test/fixtures/estree/bigInt/options.json @@ -1,6 +1,3 @@ { - "plugins": [ - "estree", - "bigInt" - ] + "plugins": ["estree", "bigInt"] } diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js new file mode 100644 index 000000000000..7fc63cc0957a --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/input.js @@ -0,0 +1 @@ +const a = import("a"); diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json new file mode 100644 index 000000000000..be4caee8d685 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/basic/output.json @@ -0,0 +1,116 @@ +{ + "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": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 22, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 22 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 6, + "end": 21, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 21 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "a" + }, + "name": "a" + }, + "init": { + "type": "ImportExpression", + "start": 10, + "end": 21, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 21 + } + }, + "source": { + "type": "Literal", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 20 + } + }, + "value": "a", + "raw": "\"a\"" + } + } + } + ], + "kind": "const" + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json new file mode 100644 index 000000000000..9e48801bb9eb --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/dynamic-import/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["estree", "dynamicImport"] +}