From 3ba9883abd2877ed4be43b6eb4364e801acbf75e Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sun, 6 Feb 2022 18:16:20 +0530 Subject: [PATCH 1/5] fix: false positive in `camelcase` with combined options Fixes #15572 --- lib/rules/camelcase.js | 3 ++- tests/lib/rules/camelcase.js | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js index 6bb1838a72e..d25e3dac999 100644 --- a/lib/rules/camelcase.js +++ b/lib/rules/camelcase.js @@ -161,7 +161,7 @@ module.exports = { switch (parent.type) { case "Property": return ( - parent.parent.type === "ObjectPattern" && + (parent.parent.type === "ObjectPattern" || parent.parent.type === "ObjectExpression") && parent.value === valueNode && !parent.computed && parent.key.type === "Identifier" && @@ -311,6 +311,7 @@ module.exports = { * It looks unnecessary because declarations are reported. */ for (const reference of variable.references) { + if (reference.init) { continue; // Skip the write references of initializers. } diff --git a/tests/lib/rules/camelcase.js b/tests/lib/rules/camelcase.js index 3a47a1b4b2d..9710f065cf6 100644 --- a/tests/lib/rules/camelcase.js +++ b/tests/lib/rules/camelcase.js @@ -407,6 +407,35 @@ ruleTester.run("camelcase", rule, { code: "class C { snake_case; #snake_case; #snake_case2() {} }", options: [{ properties: "never" }], parserOptions: { ecmaVersion: 2022 } + }, + + // Combinations of `properties` and `ignoreDestructring` + { + code: ` + const { some_property } = obj; + + const foo = ({ some_property }) => { + console.log(some_property) + }; + + function bar({ some_property }) { + console.log(some_property) + }; + `, + options: [{ properties: "never", ignoreDestructuring: true }], + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + }, + + // https://github.com/eslint/eslint/issues/15572 + { + code: ` + const { some_property } = obj; + doSomething({ some_property }); + `, + options: [{ properties: "never", ignoreDestructuring: true }], + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] } ], invalid: [ @@ -1416,6 +1445,26 @@ ruleTester.run("camelcase", rule, { options: [{ properties: "always" }], parserOptions: { ecmaVersion: 2022 }, errors: [{ messageId: "notCamelCasePrivate", data: { name: "snake_case" } }] + }, + + // Combinations of `properties` and `ignoreDestructring` + { + code: ` + const { some_property } = obj; + doSomething({ some_property }); + `, + options: [{ properties: "always", ignoreDestructuring: true }], + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + }, + { + code: ` + const { some_property } = obj; + doSomething({ [some_property]: "bar" }); + `, + options: [{ properties: "never", ignoreDestructuring: true }], + parserOptions: { ecmaVersion: 2022 }, + errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] } ] }); From e7c9c0bcc7fc0130f1d4dbca5168f1fa5d18a0a8 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 10 Feb 2022 06:02:49 +0530 Subject: [PATCH 2/5] test: add mores cases for camelcase rule --- tests/lib/rules/camelcase.js | 53 ++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/tests/lib/rules/camelcase.js b/tests/lib/rules/camelcase.js index 9710f065cf6..9aacc4b0616 100644 --- a/tests/lib/rules/camelcase.js +++ b/tests/lib/rules/camelcase.js @@ -414,17 +414,18 @@ ruleTester.run("camelcase", rule, { code: ` const { some_property } = obj; - const foo = ({ some_property }) => { - console.log(some_property) - }; + const bar = { some_property }; + + obj.some_property = 10; + + const xyz = { some_property: obj.some_property }; - function bar({ some_property }) { + const foo = ({ some_property }) => { console.log(some_property) }; `, options: [{ properties: "never", ignoreDestructuring: true }], - parserOptions: { ecmaVersion: 2022 }, - errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + parserOptions: { ecmaVersion: 2022 } }, // https://github.com/eslint/eslint/issues/15572 @@ -434,8 +435,7 @@ ruleTester.run("camelcase", rule, { doSomething({ some_property }); `, options: [{ properties: "never", ignoreDestructuring: true }], - parserOptions: { ecmaVersion: 2022 }, - errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + parserOptions: { ecmaVersion: 2022 } } ], invalid: [ @@ -1465,6 +1465,43 @@ ruleTester.run("camelcase", rule, { options: [{ properties: "never", ignoreDestructuring: true }], parserOptions: { ecmaVersion: 2022 }, errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + }, + { + code: ` + const { some_property } = obj; + + const bar = { some_property }; + + obj.some_property = 10; + + const xyz = { some_property: obj.some_property }; + + const foo = ({ some_property }) => { + console.log(some_property) + }; + `, + options: [{ properties: "always", ignoreDestructuring: true }], + parserOptions: { ecmaVersion: 2022 }, + errors: [ + { + messageId: "notCamelCase", + data: { name: "some_property" }, + line: 4, + column: 27 + }, + { + messageId: "notCamelCase", + data: { name: "some_property" }, + line: 6, + column: 17 + }, + { + messageId: "notCamelCase", + data: { name: "some_property" }, + line: 8, + column: 27 + } + ] } ] }); From c4a2b53fd062e28b8de45a05fa34294f23b60495 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 10 Feb 2022 06:06:26 +0530 Subject: [PATCH 3/5] chore: update JSDoc comment --- lib/rules/camelcase.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js index d25e3dac999..c8955e7d20c 100644 --- a/lib/rules/camelcase.js +++ b/lib/rules/camelcase.js @@ -146,7 +146,7 @@ module.exports = { /** * Checks if a given binding identifier uses the original name as-is. - * - If it's in object destructuring, the original name is its property name. + * - If it's in object destructuring or object expression, the original name is its property name. * - If it's in import declaration, the original name is its exported name. * @param {ASTNode} node The `Identifier` node to check. * @returns {boolean} `true` if the identifier uses the original name as-is. From b212f8ac4979b615b2cc743129fcf8ee17233585 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 10 Feb 2022 07:13:35 +0530 Subject: [PATCH 4/5] test: add location --- tests/lib/rules/camelcase.js | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/camelcase.js b/tests/lib/rules/camelcase.js index 9aacc4b0616..79c237ce202 100644 --- a/tests/lib/rules/camelcase.js +++ b/tests/lib/rules/camelcase.js @@ -1455,16 +1455,31 @@ ruleTester.run("camelcase", rule, { `, options: [{ properties: "always", ignoreDestructuring: true }], parserOptions: { ecmaVersion: 2022 }, - errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + errors: [ + { + messageId: "notCamelCase", + data: { name: "some_property" }, + line: 3, + column: 27 + } + ] }, { code: ` const { some_property } = obj; + doSomething({ some_property }); doSomething({ [some_property]: "bar" }); `, options: [{ properties: "never", ignoreDestructuring: true }], parserOptions: { ecmaVersion: 2022 }, - errors: [{ messageId: "notCamelCase", data: { name: "some_property" } }] + errors: [ + { + messageId: "notCamelCase", + data: { name: "some_property" }, + line: 4, + column: 28 + } + ] }, { code: ` From 21b3c711f81453e9cddefe9e3adbbfb5b75faea6 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 10 Feb 2022 07:18:53 +0530 Subject: [PATCH 5/5] chore: remove unwanted change --- lib/rules/camelcase.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/rules/camelcase.js b/lib/rules/camelcase.js index c8955e7d20c..e4761466902 100644 --- a/lib/rules/camelcase.js +++ b/lib/rules/camelcase.js @@ -311,7 +311,6 @@ module.exports = { * It looks unnecessary because declarations are reported. */ for (const reference of variable.references) { - if (reference.init) { continue; // Skip the write references of initializers. }