diff --git a/eslint/babel-eslint-parser/src/configuration.js b/eslint/babel-eslint-parser/src/configuration.js index 0e4cf5b3209e..cffab4f884ab 100644 --- a/eslint/babel-eslint-parser/src/configuration.js +++ b/eslint/babel-eslint-parser/src/configuration.js @@ -31,7 +31,10 @@ export function normalizeBabelParseConfig(options) { allowReturnOutsideFunction: true, allowSuperOutsideMethod: true, ...options.babelOptions.parserOpts, - plugins: ["estree", ...(options.babelOptions.parserOpts?.plugins ?? [])], + plugins: [ + ["estree", { classFeatures: false }], + ...(options.babelOptions.parserOpts?.plugins ?? []), + ], ranges: true, tokens: true, }, diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 472946209e2d..762ce6c3eae2 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -196,7 +196,10 @@ export default (superClass: Class): Class => parseMaybePrivateName(...args: [boolean]): any { const node = super.parseMaybePrivateName(...args); - if (node.type === "PrivateName") { + if ( + node.type === "PrivateName" && + this.getPluginOption("estree", "classFeatures") + ) { return this.convertPrivateNameToPrivateIdentifier(node); } return node; @@ -214,10 +217,16 @@ export default (superClass: Class): Class => } isPrivateName(node: N.Node): boolean { + if (!this.getPluginOption("estree", "classFeatures")) { + return super.isPrivateName(node); + } return node.type === "PrivateIdentifier"; } getPrivateNameSV(node: N.Node): string { + if (!this.getPluginOption("estree", "classFeatures")) { + return super.getPrivateNameSV(node); + } return node.name; } @@ -277,14 +286,18 @@ export default (superClass: Class): Class => parseClassProperty(...args: [N.ClassProperty]): any { const propertyNode = (super.parseClassProperty(...args): any); - propertyNode.type = "PropertyDefinition"; + if (this.getPluginOption("estree", "classFeatures")) { + propertyNode.type = "PropertyDefinition"; + } return (propertyNode: N.EstreePropertyDefinition); } parseClassPrivateProperty(...args: [N.ClassPrivateProperty]): any { const propertyNode = (super.parseClassPrivateProperty(...args): any); - propertyNode.type = "PropertyDefinition"; - propertyNode.computed = false; + if (this.getPluginOption("estree", "classFeatures")) { + propertyNode.type = "PropertyDefinition"; + propertyNode.computed = false; + } return (propertyNode: N.EstreePropertyDefinition); } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/options.json b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/options.json index 9a3d6c4ac482..45861ad78b1e 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-method/basic/options.json +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/basic/options.json @@ -1,3 +1,8 @@ { - "plugins": ["flow", "jsx", "estree", "classPrivateMethods"] + "plugins": [ + "flow", + "jsx", + ["estree", { "classFeatures": true }], + "classPrivateMethods" + ] } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/input.js b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/input.js new file mode 100644 index 000000000000..95a442a2652d --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/input.js @@ -0,0 +1,4 @@ +class A { + #foo(arg, ...others) {} + static #bar(arg, ...others) {} +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/options.json b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/options.json new file mode 100644 index 000000000000..9a3d6c4ac482 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["flow", "jsx", "estree", "classPrivateMethods"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/output.json b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/output.json new file mode 100644 index 000000000000..10ed427db9e2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-method/not-enabled/output.json @@ -0,0 +1,118 @@ +{ + "type": "File", + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":70,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":70,"loc":{"start":{"line":1,"column":8},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "MethodDefinition", + "start":12,"end":35,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":25}}, + "static": false, + "key": { + "type": "PrivateName", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "id": { + "type": "Identifier", + "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"foo"}, + "name": "foo" + } + }, + "kind": "method", + "value": { + "type": "FunctionExpression", + "start":16,"end":35,"loc":{"start":{"line":2,"column":6},"end":{"line":2,"column":25}}, + "id": null, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "start":17,"end":20,"loc":{"start":{"line":2,"column":7},"end":{"line":2,"column":10},"identifierName":"arg"}, + "name": "arg" + }, + { + "type": "RestElement", + "start":22,"end":31,"loc":{"start":{"line":2,"column":12},"end":{"line":2,"column":21}}, + "argument": { + "type": "Identifier", + "start":25,"end":31,"loc":{"start":{"line":2,"column":15},"end":{"line":2,"column":21},"identifierName":"others"}, + "name": "others" + } + } + ], + "body": { + "type": "BlockStatement", + "start":33,"end":35,"loc":{"start":{"line":2,"column":23},"end":{"line":2,"column":25}}, + "body": [] + } + }, + "computed": false + }, + { + "type": "MethodDefinition", + "start":38,"end":68,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":32}}, + "static": true, + "key": { + "type": "PrivateName", + "start":45,"end":49,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "id": { + "type": "Identifier", + "start":46,"end":49,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":13},"identifierName":"bar"}, + "name": "bar" + } + }, + "kind": "method", + "value": { + "type": "FunctionExpression", + "start":49,"end":68,"loc":{"start":{"line":3,"column":13},"end":{"line":3,"column":32}}, + "id": null, + "generator": false, + "async": false, + "expression": false, + "params": [ + { + "type": "Identifier", + "start":50,"end":53,"loc":{"start":{"line":3,"column":14},"end":{"line":3,"column":17},"identifierName":"arg"}, + "name": "arg" + }, + { + "type": "RestElement", + "start":55,"end":64,"loc":{"start":{"line":3,"column":19},"end":{"line":3,"column":28}}, + "argument": { + "type": "Identifier", + "start":58,"end":64,"loc":{"start":{"line":3,"column":22},"end":{"line":3,"column":28},"identifierName":"others"}, + "name": "others" + } + } + ], + "body": { + "type": "BlockStatement", + "start":66,"end":68,"loc":{"start":{"line":3,"column":30},"end":{"line":3,"column":32}}, + "body": [] + } + }, + "computed": false + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json index 05648e46404b..b78bd034b69a 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/basic/options.json @@ -1,3 +1,3 @@ { - "plugins": ["estree", "classPrivateProperties"] + "plugins": [["estree", { "classFeatures": true }], "classPrivateProperties"] } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json index 273df01c4f4e..59d8dfe89bbe 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/flow/options.json @@ -1,3 +1,7 @@ { - "plugins": ["flow", "estree", "classPrivateProperties"] + "plugins": [ + "flow", + ["estree", { "classFeatures": true }], + "classPrivateProperties" + ] } diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/input.js b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/input.js new file mode 100644 index 000000000000..6124cfdbf4c5 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/input.js @@ -0,0 +1,4 @@ +class A { + #foo = "bar"; + static #bar = foo; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/options.json new file mode 100644 index 000000000000..b78bd034b69a --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["estree", { "classFeatures": true }], "classPrivateProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/output.json b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/output.json new file mode 100644 index 000000000000..23c1a61c1202 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/not-enabled/output.json @@ -0,0 +1,61 @@ +{ + "type": "File", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":48,"loc":{"start":{"line":1,"column":8},"end":{"line":4,"column":1}}, + "body": [ + { + "type": "PropertyDefinition", + "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, + "static": false, + "key": { + "type": "PrivateIdentifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, + "name": "foo" + }, + "value": { + "type": "Literal", + "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, + "value": "bar", + "raw": "\"bar\"" + }, + "computed": false + }, + { + "type": "PropertyDefinition", + "start":28,"end":46,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":20}}, + "static": true, + "key": { + "type": "PrivateIdentifier", + "start":35,"end":39,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":13}}, + "name": "bar" + }, + "value": { + "type": "Identifier", + "start":42,"end":45,"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":19},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json index b2f3ef5307a6..adab610a4371 100644 --- a/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json +++ b/packages/babel-parser/test/fixtures/estree/class-private-property/typescript/options.json @@ -1,3 +1,7 @@ { - "plugins": ["typescript", "estree", "classPrivateProperties"] + "plugins": [ + "typescript", + ["estree", { "classFeatures": true }], + "classPrivateProperties" + ] } diff --git a/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json b/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json index 78ec974b4f47..db0123b564cc 100644 --- a/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json +++ b/packages/babel-parser/test/fixtures/estree/class-property/basic/options.json @@ -1,3 +1,3 @@ { - "plugins": ["estree", "classProperties"] + "plugins": [["estree", { "classFeatures": true }], "classProperties"] } diff --git a/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/input.js b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/input.js new file mode 100644 index 000000000000..48edb1bb1ba9 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/input.js @@ -0,0 +1,6 @@ +class A { + foo = "bar"; + [bar] = foo; + static "qux" = "quux"; + static [quux] = "qux"; +} diff --git a/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/options.json b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/options.json new file mode 100644 index 000000000000..78ec974b4f47 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["estree", "classProperties"] +} diff --git a/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/output.json b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/output.json new file mode 100644 index 000000000000..9af1141579ba --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/class-property/not-enabled/output.json @@ -0,0 +1,96 @@ +{ + "type": "File", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "program": { + "type": "Program", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ClassDeclaration", + "start":0,"end":91,"loc":{"start":{"line":1,"column":0},"end":{"line":6,"column":1}}, + "id": { + "type": "Identifier", + "start":6,"end":7,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":7},"identifierName":"A"}, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start":8,"end":91,"loc":{"start":{"line":1,"column":8},"end":{"line":6,"column":1}}, + "body": [ + { + "type": "ClassProperty", + "start":12,"end":24,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":14}}, + "static": false, + "key": { + "type": "Identifier", + "start":12,"end":15,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":5},"identifierName":"foo"}, + "name": "foo" + }, + "computed": false, + "value": { + "type": "Literal", + "start":18,"end":23,"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":13}}, + "value": "bar", + "raw": "\"bar\"" + } + }, + { + "type": "ClassProperty", + "start":27,"end":39,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":14}}, + "static": false, + "computed": true, + "key": { + "type": "Identifier", + "start":28,"end":31,"loc":{"start":{"line":3,"column":3},"end":{"line":3,"column":6},"identifierName":"bar"}, + "name": "bar" + }, + "value": { + "type": "Identifier", + "start":35,"end":38,"loc":{"start":{"line":3,"column":10},"end":{"line":3,"column":13},"identifierName":"foo"}, + "name": "foo" + } + }, + { + "type": "ClassProperty", + "start":42,"end":64,"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":24}}, + "static": true, + "key": { + "type": "Literal", + "start":49,"end":54,"loc":{"start":{"line":4,"column":9},"end":{"line":4,"column":14}}, + "value": "qux", + "raw": "\"qux\"" + }, + "computed": false, + "value": { + "type": "Literal", + "start":57,"end":63,"loc":{"start":{"line":4,"column":17},"end":{"line":4,"column":23}}, + "value": "quux", + "raw": "\"quux\"" + } + }, + { + "type": "ClassProperty", + "start":67,"end":89,"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":24}}, + "static": true, + "computed": true, + "key": { + "type": "Identifier", + "start":75,"end":79,"loc":{"start":{"line":5,"column":10},"end":{"line":5,"column":14},"identifierName":"quux"}, + "name": "quux" + }, + "value": { + "type": "Literal", + "start":83,"end":88,"loc":{"start":{"line":5,"column":18},"end":{"line":5,"column":23}}, + "value": "qux", + "raw": "\"qux\"" + } + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json b/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json index 2af3c274c73d..666b0fc1e83d 100644 --- a/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json +++ b/packages/babel-parser/test/fixtures/estree/private-in/basic/output.json @@ -21,21 +21,24 @@ "start":8,"end":75,"loc":{"start":{"line":1,"column":8},"end":{"line":6,"column":1}}, "body": [ { - "type": "PropertyDefinition", + "type": "ClassPrivateProperty", "start":12,"end":25,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":15}}, "static": false, "key": { - "type": "PrivateIdentifier", + "type": "PrivateName", "start":12,"end":16,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":6}}, - "name": "foo" + "id": { + "type": "Identifier", + "start":13,"end":16,"loc":{"start":{"line":2,"column":3},"end":{"line":2,"column":6},"identifierName":"foo"}, + "name": "foo" + } }, "value": { "type": "Literal", "start":19,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":14}}, "value": "bar", "raw": "\"bar\"" - }, - "computed": false + } }, { "type": "MethodDefinition", @@ -73,9 +76,13 @@ "type": "BinaryExpression", "start":57,"end":68,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":22}}, "left": { - "type": "PrivateIdentifier", + "type": "PrivateName", "start":57,"end":61,"loc":{"start":{"line":4,"column":11},"end":{"line":4,"column":15}}, - "name": "foo" + "id": { + "type": "Identifier", + "start":58,"end":61,"loc":{"start":{"line":4,"column":12},"end":{"line":4,"column":15},"identifierName":"foo"}, + "name": "foo" + } }, "operator": "in", "right": {