Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add @babel/eslint-plugin/no-undef to fix no-undef with accessor props #16023

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions eslint/babel-eslint-plugin/README.md
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
@@ -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
@@ -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
@@ -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;" },
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This already works, but I added a test to make sure.

],
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
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
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
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