nodejs / nodejs/node

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

Ouverte
#57,899 3 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

stale tools
Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
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()

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par lire la règle func-name-matching liée d’ESLint et l’exemple reporters.js lié de Node.js, puis comparez la manière dont sont représentés les descripteurs de ObjectDefineProperty, ObjectDefineProperties et ReflectDefineProperty. C’est terminé lorsqu’une règle personnalisée conserve le matching normal ailleurs, rejette les fonctions de descripteur qui deviennent named value et gère les noms de propriété sous forme de chaînes simples comme indiqué.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
eslint, javascript
Domaine
tooling
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.