60

I am using ESLint for my ES6 program, with the AirBNB rule-set. For good and adequate reasons, I am using the for...of construction in my code, but ESLint objects to it, issuing a no-restricted-syntax error.

The documentation at http://eslint.org/docs/rules/no-restricted-syntax explains how I can specify in my .eslint file the set of syntax-tree nodes that it objects to: for example, if all I dislike is the with statement, I can use:

"no-restricted-syntax": ["warn", "WithStatement"]

But I don't want to specify a whole set of unapproved constructions, I just want to say that I consider one such construction OK. Something conceptually similar to

ESlint.rules['no-restricted-syntax'].removeEntry('ForOfStatement');

Is there a way to do this in the ESLint file? Or, failing that, is there at least a way to get it to tell me what its current no-restricted-syntax configuration is, so I can manually remove ForOfStatement from it?

Mike Taylor
  • 733
  • 1
  • 5
  • 5
  • a shortcut, not the best answer is using the disabling eslint rules with comments for blocks or lines or files. – amir hosein ahmadi Feb 14 '17 at 13:43
  • If you have installed the airbnb ruleset, you can surely look it up in the respective configuration file? – Bergi Feb 14 '17 at 17:18
  • 3
    Thanks, amir. I know how to tell ESLint "ignore this line" or "ignore this rule for this line": I want to be more ambitious, and teach ESLint that I consider the use of `for...of` always OK. – Mike Taylor Feb 15 '17 at 16:08
  • 1
    for those like me, who arrive here via google search, here's a good discussion about why the syntax is restricted in the first place: https://github.com/airbnb/javascript/issues/1271 – Phil Jun 18 '22 at 12:09

2 Answers2

83

Check existing config

Based on the current master branch, eslint-config-airbnb currently disables four syntax forms:

  1. ForInStatement
  2. ForOfStatement
  3. LabeledStatement
  4. WithStatement

You can verify this or see if there are any differences by using ESLint's --print-config CLI flag:

$ eslint --print-config file.js

ESLint will print out the config it would use to lint file.js, and you can find the config for the no-restricted-syntax rule there.

Override no-restricted-syntax

If you want to override Airbnb's preset, you can do so in the rules section of your .eslintrc.json file:

{
    "rules": {
        "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"]
    }
}

There's no way to configure the rule to use the no-restricted-syntax config inherited from Airbnb's preset excepting only a single syntax form.

btmills
  • 4,431
  • 24
  • 22
  • 2
    Thanks, btmills. The bit of a puzzle I was missing was `--print-config`, which at least allows me to hand-craft an `.eslint` rule configuration that makes minimal changes to what I inherited. – Mike Taylor Feb 15 '17 at 16:12
  • 3
    It's a shame there is no way to have `.eslintrc` modify and existing rule configuration rather then replacing it; but since that's how it is, your answer tells me all there is to know. I will Accept it as soon as I find the right button! – Mike Taylor Feb 15 '17 at 16:12
  • 3
    How can I enable `ForInStatement` and `ForOfStatement`? – shinzou Jun 13 '18 at 13:52
  • @shinzou same as above except use `["error", "LabeledStatement", "WithStatement"]` – dlsso Jul 22 '22 at 15:13
0

Add the below lines of code to restrict this error in your application in .eslintrc.js file

module.exports = {
  extends: ['airbnb-base', 'plugin:prettier/recommended'],
  plugins: ['no-only-tests'],
  rules: {
    'no-only-tests/no-only-tests': 2,
    "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"]
  },
};
Jaspal Singh
  • 129
  • 3