From 7f15375b72ace628ecad6e227119527b72a7ede7 Mon Sep 17 00:00:00 2001 From: Gautam Arora Date: Thu, 28 Oct 2021 10:53:45 +0530 Subject: [PATCH] Update: Follow up commit. --- docs/rules/prefer-object-has-own.md | 7 ++++- lib/rules/index.js | 1 + lib/rules/prefer-object-has-own.js | 36 +++++++++++++++++------- tests/lib/rules/prefer-object-has-own.js | 27 ++++++++++++------ tools/rule-types.json | 1 + 5 files changed, 52 insertions(+), 20 deletions(-) diff --git a/docs/rules/prefer-object-has-own.md b/docs/rules/prefer-object-has-own.md index f8a6f3dd957..c7a8ec3ef64 100644 --- a/docs/rules/prefer-object-has-own.md +++ b/docs/rules/prefer-object-has-own.md @@ -10,8 +10,9 @@ Examples of **incorrect** code for this rule: /*eslint prefer-object-has-own: "error"*/ Object.prototype.hasOwnProperty.call(obj, "a"); +({}).hasOwnProperty(obj,"a"); + let a = Object.prototype.hasOwnProperty; -a.call(obj, "a"); ``` Examples of **correct** code for this rule: @@ -21,3 +22,7 @@ Examples of **correct** code for this rule: Object.hasOwn(obj, "a"); ``` + +## Related Material + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn) diff --git a/lib/rules/index.js b/lib/rules/index.js index ed322a4120a..130b635c972 100644 --- a/lib/rules/index.js +++ b/lib/rules/index.js @@ -255,6 +255,7 @@ module.exports = new LazyLoadingRuleMap(Object.entries({ "prefer-exponentiation-operator": () => require("./prefer-exponentiation-operator"), "prefer-named-capture-group": () => require("./prefer-named-capture-group"), "prefer-numeric-literals": () => require("./prefer-numeric-literals"), + "prefer-object-has-own": () => require("./prefer-object-has-own"), "prefer-object-spread": () => require("./prefer-object-spread"), "prefer-promise-reject-errors": () => require("./prefer-promise-reject-errors"), "prefer-reflect": () => require("./prefer-reflect"), diff --git a/lib/rules/prefer-object-has-own.js b/lib/rules/prefer-object-has-own.js index 7a89907dedd..639859acee8 100644 --- a/lib/rules/prefer-object-has-own.js +++ b/lib/rules/prefer-object-has-own.js @@ -6,6 +6,22 @@ "use strict"; +/** + * Checks to see if a property name object exists in the subtree recursively. + * @param {node} node to evalutate. + * @returns {boolean} `True` if object property exists, false otherwise. + */ +function checkForObject(node) { + if (!node.object) { + return false; + } + if (node.object.name === "Object") { + return true; + } + return checkForObject(node.object); +} + + module.exports = { meta: { type: "suggestion", @@ -17,24 +33,24 @@ module.exports = { }, schema: [], messages: { - useHasOwnMessage: - "Use Object.hasOwn instead of Object.prototype.hasOwnProperty." + useHasOwn: "Prefer using hasOwn property instead of hasOwnProperty." } }, create(context) { - - // declare the state of the rule return { MemberExpression(node) { + const propertyName = node.property.name; + const isObject = checkForObject(node); + const isObjectExpression = + node.object.type === "ObjectExpression"; + if ( - node.property.name === "hasOwnProperty" && - node.object.object.name === "Object" + propertyName === "hasOwnProperty" && + (isObject || isObjectExpression) ) { - const messageId = "useHasOwnMessage"; - context.report({ - messageId, - node + node, + messageId: "useHasOwn" }); } } diff --git a/tests/lib/rules/prefer-object-has-own.js b/tests/lib/rules/prefer-object-has-own.js index 8b18e1c200a..2501822fb45 100644 --- a/tests/lib/rules/prefer-object-has-own.js +++ b/tests/lib/rules/prefer-object-has-own.js @@ -18,11 +18,11 @@ const { RuleTester } = require("../../../lib/rule-tester"); //------------------------------------------------------------------------------ const parserOptions = { - ecmaVersion: 2018, - sourceType: "module" + ecmaVersion: 2022 }; const ruleTester = new RuleTester({ parserOptions }); +const error = { messageId: "useHasOwn" }; ruleTester.run("prefer-object-has-own", rule, { valid: [ @@ -32,12 +32,21 @@ ruleTester.run("prefer-object-has-own", rule, { ` ], invalid: [ - ` - let a = Object.prototype.hasOwnProperty(); - obj.call(); - `, - ` - let a = Object.prototype.hasOwnProperty.call(); - ` + { + code: "Object.prototype.hasOwnProperty", + errors: [error] + }, + { + code: "Object.hasOwnProperty.call(obj, 'foo')", + errors: [error] + }, + { + code: "Object.prototype.hasOwnProperty.call(obj, 'foo')", + errors: [error] + }, + { + code: "({}).hasOwnProperty.call(obj, 'foo')", + errors: [error] + } ] }); diff --git a/tools/rule-types.json b/tools/rule-types.json index 4a71a8b09ed..235f398b818 100644 --- a/tools/rule-types.json +++ b/tools/rule-types.json @@ -242,6 +242,7 @@ "prefer-exponentiation-operator": "suggestion", "prefer-named-capture-group": "suggestion", "prefer-numeric-literals": "suggestion", + "prefer-object-has-own":"suggestion", "prefer-object-spread": "suggestion", "prefer-promise-reject-errors": "suggestion", "prefer-reflect": "suggestion",