nodejs / nodejs/node

Replacement/improvement of `func-name-matching` eslint rule

Open
#57,899 3 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

stale tools
Dominant language
JavaScript
Stars
122k
Forks
37.3k
Avg merge
4d 2h
Merged PRs (30d)
283

Description

There are quite a few places where a property is defined like this:

ObjectDefineProperty(someObject, 'someFunction', {
  __proto__: null,
  value: function() {
    /* `someObject.someFunction`'s body */
  },
});

As result, we end up with quite a few functions named value:

someObject.someFunction.name === 'value'

There is a func-name-matching rule in eslint that enforces function names to match the property names. However, in these cases, this rule rejects correct code and insists that these functions must be named value, to the point that in some places we have them explicitly named like this: https://github.com/nodejs/node/blob/cb5f671a34da32e3c2d70d7f3e7f869cda6b806b/lib/test/reporters.js#L56

I think, it would be nice to have a custom linter rule that:

  • works the same way as func-name-matching everywhere outside of ObjectDefineProperty, ObjectDefineProperties, and ReflectDefineProperty
  • in the descriptors in these functions, the rule should be reversed: it should not allow the function to end up with a name value
  • (ideally) if property name(s) is defined as plain string, the function name must match this string

I'm not familiar with eslint rules definitions but the original func-name-matching rule seems to be defined here: https://github.com/eslint/eslint/blob/e8f8d57bd6c0d95f9f25db8c5b3ff72de42488b7/lib/rules/func-name-matching.js.

The rule already has considerPropertyDescriptor option, but it's not applicable here because:

  • it recognizes the normal form of these functions (Object.defineProperty) but not primordials (ObjectDefineProperty)
  • it still allows both implicitly inherited name (value: function() {) and concise notation (value() {)
  • it also disables the rule inside of Object.create()

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading ESLint's linked func-name-matching rule and the linked Node.js reporters.js example, then compare how ObjectDefineProperty, ObjectDefineProperties, and ReflectDefineProperty descriptors are represented. Done means a custom rule preserves normal matching elsewhere, rejects descriptor functions that become named value, and handles plain-string property names as specified.

Written by the indexing model from the issue text.

Assessment

Tech stack
eslint, javascript
Domain
tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.