Skip to content

Commit

Permalink
Add @babel/eslint-plugin/no-undef for accessor props (#16023)
Browse files Browse the repository at this point in the history
* Add `@babel/eslint-plugin/no-undef` for accessor props

* Fix computed key case

* add test

---------

Co-authored-by: Babel Bot <30521560+liuxingbaoyu@users.noreply.github.com>
  • Loading branch information
nicolo-ribaudo and liuxingbaoyu committed Nov 28, 2023
1 parent 7c29fbc commit 4e6e3cf
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 1 deletion.
2 changes: 2 additions & 0 deletions eslint/babel-eslint-plugin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ original ones as well!).
"rules": {
"@babel/new-cap": "error",
"@babel/no-invalid-this": "error",
"@babel/no-undef": "error",
"@babel/no-unused-expressions": "error",
"@babel/object-curly-spacing": "error",
"@babel/semi": "error"
Expand All @@ -43,6 +44,7 @@ Each rule corresponds to a core `eslint` rule and has the same options.

- `@babel/new-cap`: handles decorators (`@Decorator`)
- `@babel/no-invalid-this`: handles class fields and private class methods (`class A { a = this.b; }`)
- `@babel/no-undef`: handles class accessor properties (`class A { accessor x = 2 }`)
- `@babel/no-unused-expressions`: handles `do` expressions
- `@babel/object-curly-spacing`: handles `export * as x from "mod";` (馃洜)
- `@babel/semi`: Handles class properties (馃洜)
Expand Down
3 changes: 3 additions & 0 deletions eslint/babel-eslint-plugin/src/index.cjs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const newCap = require("./rules/new-cap.cjs");
const noInvalidThis = require("./rules/no-invalid-this.cjs");
const noUndef = require("./rules/no-undef.cjs");
const noUnusedExpressions = require("./rules/no-unused-expressions.cjs");
const objectCurlySpacing = require("./rules/object-curly-spacing.cjs");
const semi = require("./rules/semi.cjs");
Expand All @@ -12,6 +13,7 @@ const meta = {
const rules = {
"new-cap": newCap,
"no-invalid-this": noInvalidThis,
"no-undef": noUndef,
"no-unused-expressions": noUnusedExpressions,
"object-curly-spacing": objectCurlySpacing,
semi,
Expand All @@ -20,6 +22,7 @@ const rules = {
const rulesConfig = {
"new-cap": "off",
"no-invalid-this": "off",
"no-undef": "off",
"no-unused-expressions": "off",
"object-curly-spacing": "off",
semi: "off",
Expand Down
22 changes: 22 additions & 0 deletions eslint/babel-eslint-plugin/src/rules/no-undef.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const ruleComposer = require("eslint-rule-composer");
const eslint = require("eslint");

const rule = new eslint.Linter().getRules().get("no-undef");

/**
* Returns whether a node is under a decorator or not.
* @param {ASTNode} node CallExpression node
* @returns {Boolean} Returns true if the node is under a decorator.
*/
function isAccessorFieldName(node) {
return (
node.parent.type === "ClassAccessorProperty" &&
node.parent.key === node &&
!node.parent.computed
);
}

module.exports = ruleComposer.filterReports(
rule,
problem => !isAccessorFieldName(problem.node),
);
27 changes: 27 additions & 0 deletions eslint/babel-eslint-plugin/test/rules/no-undef.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import rule from "../../lib/rules/no-undef.cjs";
import RuleTester from "../../../babel-eslint-shared-fixtures/utils/RuleTester.js";

const ruleTester = new RuleTester();
ruleTester.run("@babel/no-undef", rule, {
valid: [
{ code: "class MyClass { accessor x = 2 }" },
{
code: "var x; class MyClass { accessor [x] = 2 }",
},
{ code: "using x = 2; x;" },
],
invalid: [
{
code: "class MyClass { accessor x = y }",
errors: [{ message: "'y' is not defined." }],
},
{
code: "{ using x = 2; } x;",
errors: [{ message: "'x' is not defined." }],
},
{
code: "class MyClass { accessor [x] = 2 }",
errors: [{ message: "'x' is not defined." }],
},
],
});
3 changes: 2 additions & 1 deletion eslint/babel-eslint-shared-fixtures/config/babel.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ module.exports = {
plugins: [
"@babel/plugin-syntax-export-default-from",
"@babel/plugin-transform-class-properties",
["@babel/plugin-proposal-decorators", { version: "2021-12" }],
["@babel/plugin-proposal-decorators", { version: "2023-05" }],
["@babel/plugin-proposal-pipeline-operator", { proposal: "minimal" }],
"@babel/plugin-transform-private-methods",
"@babel/plugin-proposal-do-expressions",
"@babel/plugin-proposal-explicit-resource-management",
],
};
1 change: 1 addition & 0 deletions eslint/babel-eslint-shared-fixtures/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"@babel/eslint-parser": "workspace:^",
"@babel/plugin-proposal-decorators": "workspace:^",
"@babel/plugin-proposal-do-expressions": "workspace:^",
"@babel/plugin-proposal-explicit-resource-management": "workspace:^",
"@babel/plugin-proposal-pipeline-operator": "workspace:^",
"@babel/plugin-syntax-export-default-from": "workspace:^",
"@babel/plugin-transform-class-properties": "workspace:^",
Expand Down
1 change: 1 addition & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ __metadata:
"@babel/eslint-parser": "workspace:^"
"@babel/plugin-proposal-decorators": "workspace:^"
"@babel/plugin-proposal-do-expressions": "workspace:^"
"@babel/plugin-proposal-explicit-resource-management": "workspace:^"
"@babel/plugin-proposal-pipeline-operator": "workspace:^"
"@babel/plugin-syntax-export-default-from": "workspace:^"
"@babel/plugin-transform-class-properties": "workspace:^"
Expand Down

0 comments on commit 4e6e3cf

Please sign in to comment.