Git Product home page Git Product logo

eslint-config-auto's Introduction

eslint-config-auto  NPM version License: MIT

Automatically configure ESLint based on project dependencies

This project got created because I got tired of managing eslint in multiple different projects and trying to keep them all vaguely in sync. It will automatically configure the most appropriate version of the airbnb eslint rules and a curated selection of plugins based on the contents of your project's package.json file each time you run eslint. When you add a new library to your project, the associated plugin will get automatically included.

The aim here is to include a range of mostly reasonable plugins, whilst not being overly restrictive. The recommended configs for each plugin are used with a few exceptions for rules that have been disabled for appearing unduely restrictive or conflicting with other plugins. If you use Prettier then all the formating rules are also omitted by including eslint-config-prettier.

In addition to JavaScript, suport is included for linting TypeScript, HTML, Json, and MarkDown files.

Alternative

If you like the ideas behind this config, but not the AirBnB styleguide, then checkout eslint-config-adjunt. It includes most of the extra plugins used here, but lets you choose your prefered main eslint config.

Contibuting

Suggestions for adding new plugings will be carefully considered against the mostly reasonable standard and usefulness. If you would like to help out, then I would like to add support for Vue and other popular frameworks. Thanks goes to awesome-eslint for having collated the packages this project utalises.

Install

To install this config, run the following command.

npm install eslint-config-auto --save-dev

Configure

Create an .eslintrc file with the following contents.

{
  "extends": ["auto"]
}

You can now include html, json and markdown in the list of files passed to eslint to lint any JavaScript contained.

{
  "scripts": {
    "eslint": "eslint --color --ext .html,.js,.json,.jsx,.md,.ts,.tsx *.* src",
    "eslint:fix": "npm run eslint -- --fix"
  }
}

Install Dependencies

After you have configured eslint to include this package, the first time you run eslint it will output the npm command to install the dependencies required for your project. Copy and paste this command into the console, and you are then ready to start linting.

Rules

AirBNB

The most appropreate version of the AirBNB eslint config will be automatically selected.

Babel

If the project includes Babel in it's devDependencies, then eslint-plugin-babel and eslint-config-airbnb-babel will be loaded and the parser will be set to babel-eslint.

Some project setup utils, such as Create React App, use Babel without including it as a project dependancies. In such cases you can turn Babel support on by adding settings: { babel: true } to your .eslintrc config file.

Code Quality

These two plugins provide a range of code quality rules:

Compat

If settings.compat = true in your .eslintrc, then eslint-plugin-compat is loaded.

Langauges

The following plugins expand esLint to support TypeScript, JSON, and lint code contiained in HTML and MarkDown files:

If the project includes TypeScript, then the rules will adapt to lint typescript files and the parser will be set to @typescript-eslint/parser for ts and tsx filetypes.

When linting code snippets in Markdown files, a few rules relating to globals and unused vars are disabled.

Library Plugins

These plugins will be loaded in based on your project dependencies in package.json. If a supported library is part of your project then it's related esLint plugins will be loaded. The following packages are supported:

Node

If env.node = true in your .eslintrc file, then eslint-plugin-node is loaded.

React

If a project contains React, then a React version of the AirBNB config will be used and if Redux is installed the following extra plugins will be loaded.

Practices

The following esLint plugins enforce good coding practices:

Prettier

If prettier is installed, any rules that may conflict with Prettier will be disabled. The plugin should read you Prettier config from your project's root.

The prettier configs for different eslint plugins are also automatically included based on which eslint plugins have been installed into your project.

Security

These plugins add code security rules to esLint:

Test Libraries

Test plugins are loaded based on which testing tools you have listed in devDependencies of package.json. The following test plugins are supported:

For test files a few rules are turned off, to better to support normal unit test coding styles.

Rules

In the most part the default rules are used for the plugins listed above, with the following exceptions.

Switch-Case

Adds the fallthrough: 'never' option to the newline-between-switch-case rule.

// Good

switch (foo) {
  case 1:
    something()
    break

  case 2:
  case 3:
    somethingElse()
    break

  default:
    defaultThing()
}

Disabled rules

The following rules are disabled due to them being considered unduly restrictive or unhelpful.

  • jest/no-disabled-tests
  • react-redux/prefer-separate-component-file
  • redux-saga/no-unhandled-errors
  • lodash/prefer over native rules
  • lodash-fp/use-fp
  • unicorn/no-array-for-each
  • unicorn/no-fn-reference-in-iterator
  • unicorn/no-array-for-each
  • unicorn/no-reduce
  • unicorn/no-null
  • unicorn/prefer-number-properties
  • unicorn/prefer-optional-catch-binding
  • unicorn/prevent-abbreviations

The following rules are disabled due to clashing with other plugins

  • array-func/prefer-array-from
  • import/order
  • sort-imports

License

Copyright © 2020-21 David J. Bradshaw. Licensed under the MIT License.

eslint-config-auto's People

Contributors

davidjbradshaw avatar iamnewton avatar judicaelandria avatar julius-retzer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

eslint-config-auto's Issues

TypeScript: Support multiple `parserOptions.project` => `tsconfig.json` files

Given have a project that looks like this:

--
  - .eslintrc.js (with `extends: ["auto"]`)
  - tsconfig.json (with  `"exclude": ["test"]`)
  - src/
    - ...
  - test/
    - tsconfig.json (with `"include": ["*.spec.ts"]`)
    - many-tests.spec.ts

Running eslint for the test directory will cause the following error:

/.../test/many-tests.spec.ts
  0:0  error  Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: test/many-tests.spec.ts.
The file must be included in at least one of the projects provided

This is because if you run eslint --print-config test/many-tests.spec.ts you'll see the parserOptions' project looks like this:

  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module",
    "ecmaFeatures": {
      "generators": false,
      "objectLiteralDuplicateProperties": false
    },
    "project": "./tsconfig.json" <-- this should also include ./test/tsconfig.json
  },

Would it be possible to get support for this situation?

Allow prettier to be run directly

When installing eslint-config-prettier but not eslint-plugin-prettier the eslint command returns the following error:

Oops! Something went wrong! :(

eslint-config-auto could not find the following package

  eslint-plugin-prettier

To install the missing package, please run the following command:

npm install eslint-plugin-prettier@latest --save-dev

It would be great if this would work without the plugin version of prettier as recommended by the prettier docs.

My package.json dependencies:

  "devDependencies": {
    "@types/chai": "^4.2.14",
    "@types/mocha": "^8.0.3",
    "@types/node": "^14.14.2",
    "@types/node-fetch": "^2.5.7",
    "@types/test-console": "^1.1.0",
    "@typescript-eslint/eslint-plugin": "^4.13.0",
    "@typescript-eslint/parser": "^4.13.0",
    "babel-eslint": "^10.1.0",
    "chai": "^4.2.0",
    "eslint": "^7.17.0",
    "eslint-config-adjunct": "^4.9.0",
    "eslint-config-airbnb-base": "^14.2.0",
    "eslint-config-airbnb-typescript": "^12.3.1",
    "eslint-config-auto": "^0.6.6",
    "eslint-config-prettier": "^7.2.0",
    "eslint-plugin-array-func": "^3.1.7",
    "eslint-plugin-chai-expect": "^2.2.0",
    "eslint-plugin-chai-friendly": "^0.6.0",
    "eslint-plugin-eslint-comments": "^3.2.0",
    "eslint-plugin-html": "^6.1.1",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-json": "^2.1.2",
    "eslint-plugin-markdown": "^1.0.2",
    "eslint-plugin-mocha": "^8.0.0",
    "eslint-plugin-mocha-cleanup": "^1.9.1",
    "eslint-plugin-no-constructor-bind": "^2.0.4",
    "eslint-plugin-no-secrets": "^0.6.8",
    "eslint-plugin-no-unsanitized": "^3.1.4",
    "eslint-plugin-no-use-extend-native": "^0.5.0",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-optimize-regex": "^1.2.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-scanjs-rules": "^0.2.1",
    "eslint-plugin-security": "^1.4.0",
    "eslint-plugin-simple-import-sort": "^7.0.0",
    "eslint-plugin-sonarjs": "^0.5.0",
    "eslint-plugin-switch-case": "^1.1.2",
    "eslint-plugin-unicorn": "^27.0.0",
    "gts": "^3.0.1",
    "mocha": "^8.2.0",
    "nock": "^13.0.5",
    "nyc": "^15.1.0",
    "prettier": "2.2.1",
    "release-it": "^14.2.2",
    "request": "^2.88.2",
    "test-console": "^1.1.0",
    "ts-node": "^9.0.0",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^4.0.3"
  },
  "dependencies": {
    "@types/base-64": "^0.1.3",
    "@types/jsdom": "^16.2.6",
    "@types/spark-md5": "^3.0.2",
    "base-64": "^1.0.0",
    "isomorphic-unfetch": "^3.1.0",
    "jsdom": "^16.4.0",
    "postcss": "^8.2.4",
    "postcss-import-url": "^6.0.0",
    "postcss-js": "^3.0.3",
    "postcss-url": "^10.1.1",
    "spark-md5": "^3.0.1"
  }

[Yarn] Support for copy-pasting packages

It would be great if we could go from the message:

npm install ${notInstalled.map((pkg) => atLatest(pkg)).join(' ')} --save-dev

to

yarn add -D ${notInstalled.map((pkg) => atLatest(pkg)).join(' ')}

If a yarn.lock file exists in the projects root directory.

Usage in a monorepo

I'm using this in a monorepo, where 99% of the development deps are declared in the root workspace, including ESLint and this config. If I go and run ESLint in one of the sub-workspaces (with yarn run -T eslint), I get the following:

Oops! Something went wrong! :(

eslint-config-auto could not find the following package

  eslint-config-adjunct

To install the missing package, please run the following command:

npm install eslint-config-adjunct@latest --save-dev

I tried aliasing hasAnyDep to moduleNotAvailable, but that has its own fatal side effects. So I went here:

const { packageJson: pkg, path: packagePath } = readPkgUp.sync({
// eslint-disable-next-line security/detect-non-literal-fs-filename
cwd: fs.realpathSync(process.cwd()),
})

And prepended process.cwd() with process.env.npm_package_json ?? , and everything started to work as expected. It's available in npm 7+ and Yarn 3.2.2+. Why did it help? Because -T in yarn run -T means --top-level, so it executes the ESLint binary from the root of the monorepo, and npm_package_json resolves to the package.json which "owns" that binary. I'm not sure how npm handles run commands, but I know that they do hoisting too, so I imagine the behavior should be the same.

This assumes that a project-level eslint is used, not a system-level one, and that eslint-config-auto is installed alongside eslint, not in a sub-workspace, along with every single dependency that eslint-config-auto might look for.

The above is a quick fix that will make monorepos work now, but it's not a complete solution. For example, eslint-config-auto might be installed in the root, and one of the packages might depend on react, and even with this fix it will not pick up React, because hasAnyDep will look only in the root package.json.

The real solution is to find the root of the monorepo, and then go down the tree, merging all dependencies. Note that workspaces can be nested infinitely, it's not just one level. Unfortunately, I wasn't able to find any existing package that does this correctly (they all go down only one level). But I think a good enough version could be to just do a find-up of either yarn.lock, pnpm-lock.yaml or package-lock.json. Here's how Yarn does it, and pnpm. If no lock file is found then fall back to the current behavior.

Or could use a flawed existing library (ignore the "yarn" in its name, it works for any package manager). It's easy and it covers 99.(9)% of use cases, I haven't seen a 3+ level workspace yet.

Thoughts?

typescript is not detected

npx eslint --print-config .json

eslint-config-auto loaded the following packages:

  eslint-plugin-import
  eslint-plugin-jsx-a11y
  eslint-plugin-react
  eslint-plugin-react-hooks
  @typescript-eslint/recommended
  @typescript-eslint/recommended-requiring-type-checking
  eslint-config-airbnb
  eslint-config-airbnb/hooks
  eslint-config-airbnb-typescript
  eslint-config-adjunct

eslint-config-adjunct loaded the following packages:

  eslint-plugin-array-func
  eslint-plugin-eslint-comments
  eslint-plugin-html
  eslint-plugin-json
  eslint-plugin-markdown
  eslint-plugin-no-constructor-bind
  eslint-plugin-no-use-extend-native
  eslint-plugin-optimize-regex
  eslint-plugin-promise
  eslint-plugin-simple-import-sort
  eslint-plugin-switch-case
  eslint-plugin-unicorn
  eslint-plugin-no-secrets
  eslint-plugin-no-unsanitized
  eslint-plugin-scanjs-rules
  eslint-plugin-security
  eslint-plugin-sonarjs
  eslint-plugin-jest
  eslint-plugin-jest-async
  eslint-plugin-jest-dom
  eslint-plugin-testing-library
  eslint-plugin-prettier
  eslint-plugin-testing-library/react
  eslint-config-prettier
  eslint-config-prettier/@typescript-eslint
  eslint-config-prettier/react
  eslint-config-prettier/unicorn
  eslint-test-overrides

the output config:

{
  "env": {
    "jest": true,
    "jest/globals": true,
    "es6": true,
    "node": true
  },
  "globals": {},
  "parser": null,
  "parserOptions": {
    "ecmaVersion": 2021,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true,
      "generators": false,
      "objectLiteralDuplicateProperties": false
    }
  },
  "plugins": [
    "import",
    "react",
    "jsx-a11y",
    "react-hooks",
    "array-func",
    "eslint-comments",
    "html",
    "json",
    "markdown",
    "no-constructor-bind",
    "no-use-extend-native",
    "optimize-regex",
    "promise",
    "simple-import-sort",
    "switch-case",
    "unicorn",
    "no-secrets",
    "no-unsanitized",
    "scanjs-rules",
    "security",
    "sonarjs",
    "jest",
    "jest-async",
    "jest-dom",
    "testing-library",
    "prettier"
  ],
  "rules": {
    "react/jsx-props-no-spreading": [
      "off",
      {
        "html": "enforce",
        "custom": "enforce",
        "explicitSpread": "ignore",
        "exceptions": []
      }
    ],
    "prettier/prettier": [
      "off"
    ],
    "unicorn/empty-brace-spaces": [
      "off"
    ],
    "unicorn/no-nested-ternary": [
      "off"
    ],
    "unicorn/number-literal-case": [
      "off"
    ],
    "react/jsx-child-element-spacing": [
      "off"
    ],
    "react/jsx-closing-bracket-location": [
      "off",
      "line-aligned"
    ],
    "react/jsx-closing-tag-location": [
      "off"
    ],
    "react/jsx-curly-newline": [
      "off",
      {
        "multiline": "consistent",
        "singleline": "consistent"
      }
    ],
    "react/jsx-curly-spacing": [
      "off",
      "never",
      {
        "allowMultiline": true
      }
    ],
    "react/jsx-equals-spacing": [
      "off",
      "never"
    ],
    "react/jsx-first-prop-new-line": [
      "off",
      "multiline-multiprop"
    ],
    "react/jsx-indent": [
      "off",
      2
    ],
    "react/jsx-indent-props": [
      "off",
      2
    ],
    "react/jsx-max-props-per-line": [
      "off",
      {
        "maximum": 1,
        "when": "multiline"
      }
    ],
    "react/jsx-newline": [
      "off"
    ],
    "react/jsx-one-expression-per-line": [
      "off",
      {
        "allow": "single-child"
      }
    ],
    "react/jsx-props-no-multi-spaces": [
      "off"
    ],
    "react/jsx-tag-spacing": [
      "off",
      {
        "closingSlash": "never",
        "beforeSelfClosing": "always",
        "afterOpening": "never",
        "beforeClosing": "never"
      }
    ],
    "react/jsx-wrap-multilines": [
      "off",
      {
        "declaration": "parens-new-line",
        "assignment": "parens-new-line",
        "return": "parens-new-line",
        "arrow": "parens-new-line",
        "condition": "parens-new-line",
        "logical": "parens-new-line",
        "prop": "parens-new-line"
      }
    ],
    "react/jsx-space-before-closing": [
      "off",
      "always"
    ],
    "@typescript-eslint/quotes": [
      0
    ],
    "@typescript-eslint/brace-style": [
      "off"
    ],
    "@typescript-eslint/comma-dangle": [
      "off"
    ],
    "@typescript-eslint/comma-spacing": [
      "off"
    ],
    "@typescript-eslint/func-call-spacing": [
      "off"
    ],
    "@typescript-eslint/indent": [
      "off"
    ],
    "@typescript-eslint/keyword-spacing": [
      "off"
    ],
    "@typescript-eslint/member-delimiter-style": [
      "off"
    ],
    "@typescript-eslint/no-extra-parens": [
      "off"
    ],
    "@typescript-eslint/no-extra-semi": [
      "off"
    ],
    "@typescript-eslint/object-curly-spacing": [
      "off"
    ],
    "@typescript-eslint/semi": [
      "off"
    ],
    "@typescript-eslint/space-before-function-paren": [
      "off"
    ],
    "@typescript-eslint/space-infix-ops": [
      "off"
    ],
    "@typescript-eslint/type-annotation-spacing": [
      "off"
    ],
    "curly": [
      0,
      "multi-line"
    ],
    "lines-around-comment": [
      0
    ],
    "max-len": [
      0,
      100,
      2,
      {
        "ignoreUrls": true,
        "ignoreComments": false,
        "ignoreRegExpLiterals": true,
        "ignoreStrings": true,
        "ignoreTemplateLiterals": true
      }
    ],
    "no-confusing-arrow": [
      0,
      {
        "allowParens": true
      }
    ],
    "no-mixed-operators": [
      0,
      {
        "groups": [
          [
            "%",
            "**"
          ],
          [
            "%",
            "+"
          ],
          [
            "%",
            "-"
          ],
          [
            "%",
            "*"
          ],
          [
            "%",
            "/"
          ],
          [
            "/",
            "*"
          ],
          [
            "&",
            "|",
            "<<",
            ">>",
            ">>>"
          ],
          [
            "==",
            "!=",
            "===",
            "!=="
          ],
          [
            "&&",
            "||"
          ]
        ],
        "allowSamePrecedence": false
      }
    ],
    "no-tabs": [
      0
    ],
    "no-unexpected-multiline": [
      0
    ],
    "quotes": [
      0,
      "single",
      {
        "avoidEscape": true
      }
    ],
    "array-bracket-newline": [
      "off",
      "consistent"
    ],
    "array-bracket-spacing": [
      "off",
      "never"
    ],
    "array-element-newline": [
      "off",
      {
        "multiline": true,
        "minItems": 3
      }
    ],
    "arrow-parens": [
      "off",
      "always"
    ],
    "arrow-spacing": [
      "off",
      {
        "before": true,
        "after": true
      }
    ],
    "block-spacing": [
      "off",
      "always"
    ],
    "brace-style": [
      "off",
      "1tbs",
      {
        "allowSingleLine": true
      }
    ],
    "comma-dangle": [
      "off",
      {
        "arrays": "always-multiline",
        "objects": "always-multiline",
        "imports": "always-multiline",
        "exports": "always-multiline",
        "functions": "always-multiline"
      }
    ],
    "comma-spacing": [
      "off",
      {
        "before": false,
        "after": true
      }
    ],
    "comma-style": [
      "off",
      "last",
      {
        "exceptions": {
          "ArrayExpression": false,
          "ArrayPattern": false,
          "ArrowFunctionExpression": false,
          "CallExpression": false,
          "FunctionDeclaration": false,
          "FunctionExpression": false,
          "ImportDeclaration": false,
          "ObjectExpression": false,
          "ObjectPattern": false,
          "VariableDeclaration": false,
          "NewExpression": false
        }
      }
    ],
    "computed-property-spacing": [
      "off",
      "never"
    ],
    "dot-location": [
      "off",
      "property"
    ],
    "eol-last": [
      "off",
      "always"
    ],
    "func-call-spacing": [
      "off",
      "never"
    ],
    "function-call-argument-newline": [
      "off",
      "consistent"
    ],
    "function-paren-newline": [
      "off",
      "consistent"
    ],
    "generator-star": [
      "off"
    ],
    "generator-star-spacing": [
      "off",
      {
        "before": false,
        "after": true
      }
    ],
    "implicit-arrow-linebreak": [
      "off",
      "beside"
    ],
    "indent": [
      "off",
      2,
      {
        "SwitchCase": 1,
        "VariableDeclarator": 1,
        "outerIIFEBody": 1,
        "FunctionDeclaration": {
          "parameters": 1,
          "body": 1
        },
        "FunctionExpression": {
          "parameters": 1,
          "body": 1
        },
        "CallExpression": {
          "arguments": 1
        },
        "ArrayExpression": 1,
        "ObjectExpression": 1,
        "ImportDeclaration": 1,
        "flatTernaryExpressions": false,
        "ignoredNodes": [
          "JSXElement",
          "JSXElement > *",
          "JSXAttribute",
          "JSXIdentifier",
          "JSXNamespacedName",
          "JSXMemberExpression",
          "JSXSpreadAttribute",
          "JSXExpressionContainer",
          "JSXOpeningElement",
          "JSXClosingElement",
          "JSXFragment",
          "JSXOpeningFragment",
          "JSXClosingFragment",
          "JSXText",
          "JSXEmptyExpression",
          "JSXSpreadChild"
        ],
        "ignoreComments": false,
        "offsetTernaryExpressions": false
      }
    ],
    "jsx-quotes": [
      "off",
      "prefer-double"
    ],
    "key-spacing": [
      "off",
      {
        "beforeColon": false,
        "afterColon": true
      }
    ],
    "keyword-spacing": [
      "off",
      {
        "before": true,
        "after": true,
        "overrides": {
          "return": {
            "after": true
          },
          "throw": {
            "after": true
          },
          "case": {
            "after": true
          }
        }
      }
    ],
    "linebreak-style": [
      "off",
      "unix"
    ],
    "multiline-ternary": [
      "off",
      "never"
    ],
    "newline-per-chained-call": [
      "off",
      {
        "ignoreChainWithDepth": 4
      }
    ],
    "new-parens": [
      "off"
    ],
    "no-arrow-condition": [
      "off"
    ],
    "no-comma-dangle": [
      "off"
    ],
    "no-extra-parens": [
      "off",
      "all",
      {
        "conditionalAssign": true,
        "nestedBinaryExpressions": false,
        "returnAssign": false,
        "ignoreJSX": "all",
        "enforceForArrowConditionals": false
      }
    ],
    "no-extra-semi": [
      "off"
    ],
    "no-floating-decimal": [
      "off"
    ],
    "no-mixed-spaces-and-tabs": [
      "off"
    ],
    "no-multi-spaces": [
      "off",
      {
        "ignoreEOLComments": false
      }
    ],
    "no-multiple-empty-lines": [
      "off",
      {
        "max": 1,
        "maxBOF": 0,
        "maxEOF": 0
      }
    ],
    "no-reserved-keys": [
      "off"
    ],
    "no-space-before-semi": [
      "off"
    ],
    "no-trailing-spaces": [
      "off",
      {
        "skipBlankLines": false,
        "ignoreComments": false
      }
    ],
    "no-whitespace-before-property": [
      "off"
    ],
    "no-wrap-func": [
      "off"
    ],
    "nonblock-statement-body-position": [
      "off",
      "beside",
      {
        "overrides": {}
      }
    ],
    "object-curly-newline": [
      "off",
      {
        "ObjectExpression": {
          "minProperties": 4,
          "multiline": true,
          "consistent": true
        },
        "ObjectPattern": {
          "minProperties": 4,
          "multiline": true,
          "consistent": true
        },
        "ImportDeclaration": {
          "minProperties": 4,
          "multiline": true,
          "consistent": true
        },
        "ExportDeclaration": {
          "minProperties": 4,
          "multiline": true,
          "consistent": true
        }
      }
    ],
    "object-curly-spacing": [
      "off",
      "always"
    ],
    "object-property-newline": [
      "off",
      {
        "allowAllPropertiesOnSameLine": true,
        "allowMultiplePropertiesPerLine": false
      }
    ],
    "one-var-declaration-per-line": [
      "off",
      "always"
    ],
    "operator-linebreak": [
      "off",
      "before",
      {
        "overrides": {
          "=": "none"
        }
      }
    ],
    "padded-blocks": [
      "off",
      {
        "blocks": "never",
        "classes": "never",
        "switches": "never"
      },
      {
        "allowSingleLineBlocks": true
      }
    ],
    "quote-props": [
      "off",
      "as-needed",
      {
        "keywords": false,
        "unnecessary": true,
        "numbers": false
      }
    ],
    "rest-spread-spacing": [
      "off",
      "never"
    ],
    "semi": [
      "off",
      "always"
    ],
    "semi-spacing": [
      "off",
      {
        "before": false,
        "after": true
      }
    ],
    "semi-style": [
      "off",
      "last"
    ],
    "space-after-function-name": [
      "off"
    ],
    "space-after-keywords": [
      "off"
    ],
    "space-before-blocks": [
      "off"
    ],
    "space-before-function-paren": [
      "off",
      {
        "anonymous": "always",
        "named": "never",
        "asyncArrow": "always"
      }
    ],
    "space-before-function-parentheses": [
      "off"
    ],
    "space-before-keywords": [
      "off"
    ],
    "space-in-brackets": [
      "off"
    ],
    "space-in-parens": [
      "off",
      "never"
    ],
    "space-infix-ops": [
      "off"
    ],
    "space-return-throw-case": [
      "off"
    ],
    "space-unary-ops": [
      "off",
      {
        "words": true,
        "nonwords": false,
        "overrides": {}
      }
    ],
    "space-unary-word-ops": [
      "off"
    ],
    "switch-colon-spacing": [
      "off",
      {
        "after": true,
        "before": false
      }
    ],
    "template-curly-spacing": [
      "off"
    ],
    "template-tag-spacing": [
      "off",
      "never"
    ],
    "unicode-bom": [
      "off",
      "never"
    ],
    "wrap-iife": [
      "off",
      "outside",
      {
        "functionPrototypeMethods": false
      }
    ],
    "wrap-regex": [
      "off"
    ],
    "yield-star-spacing": [
      "off",
      "after"
    ],
    "indent-legacy": [
      "off"
    ],
    "no-spaced-func": [
      "off"
    ],
    "testing-library/await-fire-event": [
      0
    ],
    "testing-library/consistent-data-testid": [
      0
    ],
    "testing-library/no-debug": [
      0
    ],
    "testing-library/no-dom-import": [
      0,
      "react"
    ],
    "testing-library/no-manual-cleanup": [
      0
    ],
    "testing-library/no-render-in-setup": [
      0
    ],
    "testing-library/no-await-sync-events": [
      0
    ],
    "testing-library/no-wait-for-empty-callback": [
      0
    ],
    "testing-library/no-wait-for-snapshot": [
      0
    ],
    "testing-library/prefer-explicit-assert": [
      0
    ],
    "testing-library/prefer-presence-queries": [
      0
    ],
    "testing-library/prefer-screen-queries": [
      0
    ],
    "testing-library/prefer-wait-for": [
      0
    ],
    "testing-library/await-async-query": [
      "error"
    ],
    "testing-library/await-async-utils": [
      "error"
    ],
    "testing-library/no-await-sync-query": [
      "error"
    ],
    "testing-library/prefer-find-by": [
      "error"
    ],
    "jest-dom/prefer-checked": [
      "error"
    ],
    "jest-dom/prefer-empty": [
      "error"
    ],
    "jest-dom/prefer-enabled-disabled": [
      "error"
    ],
    "jest-dom/prefer-focus": [
      "error"
    ],
    "jest-dom/prefer-in-document": [
      "error"
    ],
    "jest-dom/prefer-required": [
      "error"
    ],
    "jest-dom/prefer-to-have-attribute": [
      "error"
    ],
    "jest-dom/prefer-to-have-class": [
      "error"
    ],
    "jest-dom/prefer-to-have-style": [
      "error"
    ],
    "jest-dom/prefer-to-have-text-content": [
      "error"
    ],
    "jest-dom/prefer-to-have-value": [
      "error"
    ],
    "jest-async/expect-return": [
      "error"
    ],
    "jest/no-disabled-tests": [
      "off"
    ],
    "jest/consistent-test-it": [
      0
    ],
    "jest/lowercase-name": [
      0
    ],
    "jest/no-conditional-expect": [
      0
    ],
    "jest/no-deprecated-functions": [
      0
    ],
    "jest/no-duplicate-hooks": [
      0
    ],
    "jest/no-expect-resolves": [
      0
    ],
    "jest/no-hooks": [
      0
    ],
    "jest/no-if": [
      0
    ],
    "jest/no-interpolation-in-snapshots": [
      0
    ],
    "jest/no-large-snapshots": [
      0
    ],
    "jest/no-restricted-matchers": [
      0
    ],
    "jest/no-test-return-statement": [
      0
    ],
    "jest/no-truthy-falsy": [
      0
    ],
    "jest/prefer-called-with": [
      0
    ],
    "jest/prefer-expect-assertions": [
      0
    ],
    "jest/prefer-hooks-on-top": [
      0
    ],
    "jest/prefer-inline-snapshots": [
      0
    ],
    "jest/prefer-spy-on": [
      0
    ],
    "jest/prefer-strict-equal": [
      0
    ],
    "jest/prefer-todo": [
      0
    ],
    "jest/require-to-throw-message": [
      0
    ],
    "jest/require-top-level-describe": [
      0
    ],
    "jest/valid-title": [
      0
    ],
    "jest/no-alias-methods": [
      "warn"
    ],
    "jest/prefer-to-be-null": [
      "error"
    ],
    "jest/prefer-to-be-undefined": [
      "error"
    ],
    "jest/prefer-to-contain": [
      "error"
    ],
    "jest/prefer-to-have-length": [
      "error"
    ],
    "jest/expect-expect": [
      "warn"
    ],
    "jest/no-commented-out-tests": [
      "warn"
    ],
    "jest/no-done-callback": [
      "error"
    ],
    "jest/no-export": [
      "error"
    ],
    "jest/no-focused-tests": [
      "error"
    ],
    "jest/no-identical-title": [
      "error"
    ],
    "jest/no-jasmine-globals": [
      "error"
    ],
    "jest/no-jest-import": [
      "error"
    ],
    "jest/no-mocks-import": [
      "error"
    ],
    "jest/no-standalone-expect": [
      "error"
    ],
    "jest/no-test-prefixes": [
      "error"
    ],
    "jest/no-try-expect": [
      "error"
    ],
    "jest/valid-describe": [
      "error"
    ],
    "jest/valid-expect-in-promise": [
      "error"
    ],
    "jest/valid-expect": [
      "error"
    ],
    "sonarjs/no-duplicate-string": [
      "off"
    ],
    "sonarjs/cognitive-complexity": [
      "error"
    ],
    "sonarjs/max-switch-cases": [
      "error"
    ],
    "sonarjs/no-all-duplicated-branches": [
      "error"
    ],
    "sonarjs/no-collapsible-if": [
      "error"
    ],
    "sonarjs/no-collection-size-mischeck": [
      "error"
    ],
    "sonarjs/no-duplicated-branches": [
      "error"
    ],
    "sonarjs/no-element-overwrite": [
      "error"
    ],
    "sonarjs/no-extra-arguments": [
      "error"
    ],
    "sonarjs/no-identical-conditions": [
      "error"
    ],
    "sonarjs/no-identical-functions": [
      "error"
    ],
    "sonarjs/no-identical-expressions": [
      "error"
    ],
    "sonarjs/no-inverted-boolean-check": [
      "error"
    ],
    "sonarjs/no-one-iteration-loop": [
      "error"
    ],
    "sonarjs/no-redundant-boolean": [
      "error"
    ],
    "sonarjs/no-redundant-jump": [
      "error"
    ],
    "sonarjs/no-same-line-conditional": [
      "error"
    ],
    "sonarjs/no-small-switch": [
      "error"
    ],
    "sonarjs/no-unused-collection": [
      "error"
    ],
    "sonarjs/no-use-of-empty-return-value": [
      "error"
    ],
    "sonarjs/no-useless-catch": [
      "error"
    ],
    "sonarjs/prefer-immediate-return": [
      "error"
    ],
    "sonarjs/prefer-object-literal": [
      "error"
    ],
    "sonarjs/prefer-single-boolean-return": [
      "error"
    ],
    "sonarjs/prefer-while": [
      "error"
    ],
    "security/detect-object-injection": [
      0
    ],
    "security/detect-buffer-noassert": [
      "warn"
    ],
    "security/detect-child-process": [
      "warn"
    ],
    "security/detect-disable-mustache-escape": [
      "warn"
    ],
    "security/detect-eval-with-expression": [
      "warn"
    ],
    "security/detect-new-buffer": [
      "warn"
    ],
    "security/detect-no-csrf-before-method-override": [
      "warn"
    ],
    "security/detect-non-literal-fs-filename": [
      "warn"
    ],
    "security/detect-non-literal-regexp": [
      "warn"
    ],
    "security/detect-non-literal-require": [
      "warn"
    ],
    "security/detect-possible-timing-attacks": [
      "warn"
    ],
    "security/detect-pseudoRandomBytes": [
      "warn"
    ],
    "security/detect-unsafe-regex": [
      "warn"
    ],
    "scanjs-rules/accidental_assignment": [
      1
    ],
    "scanjs-rules/assign_to_hostname": [
      1
    ],
    "scanjs-rules/assign_to_href": [
      1
    ],
    "scanjs-rules/assign_to_location": [
      1
    ],
    "scanjs-rules/assign_to_onmessage": [
      1
    ],
    "scanjs-rules/assign_to_pathname": [
      1
    ],
    "scanjs-rules/assign_to_protocol": [
      1
    ],
    "scanjs-rules/assign_to_search": [
      1
    ],
    "scanjs-rules/assign_to_src": [
      1
    ],
    "scanjs-rules/call_Function": [
      1
    ],
    "scanjs-rules/call_addEventListener": [
      0
    ],
    "scanjs-rules/call_addEventListener_deviceproximity": [
      1
    ],
    "scanjs-rules/call_addEventListener_message": [
      0
    ],
    "scanjs-rules/call_connect": [
      1
    ],
    "scanjs-rules/call_eval": [
      1
    ],
    "scanjs-rules/call_execScript": [
      1
    ],
    "scanjs-rules/call_hide": [
      1
    ],
    "scanjs-rules/call_open_remote=true": [
      1
    ],
    "scanjs-rules/call_parseFromString": [
      1
    ],
    "scanjs-rules/call_setImmediate": [
      0
    ],
    "scanjs-rules/call_setInterval": [
      0
    ],
    "scanjs-rules/call_setTimeout": [
      0
    ],
    "scanjs-rules/identifier_indexedDB": [
      1
    ],
    "scanjs-rules/identifier_localStorage": [
      1
    ],
    "scanjs-rules/identifier_sessionStorage": [
      1
    ],
    "scanjs-rules/new_Function": [
      1
    ],
    "scanjs-rules/property_addIdleObserver": [
      1
    ],
    "scanjs-rules/property_createContextualFragment": [
      1
    ],
    "scanjs-rules/property_crypto": [
      1
    ],
    "scanjs-rules/property_geolocation": [
      1
    ],
    "scanjs-rules/property_getUserMedia": [
      1
    ],
    "scanjs-rules/property_indexedDB": [
      1
    ],
    "scanjs-rules/property_localStorage": [
      1
    ],
    "scanjs-rules/property_mgmt": [
      1
    ],
    "scanjs-rules/property_sessionStorage": [
      1
    ],
    "scanjs-rules/call_setAttribute_mozbrowser": [
      0
    ],
    "no-unsanitized/method": [
      "error"
    ],
    "no-unsanitized/property": [
      "error"
    ],
    "no-secrets/no-secrets": [
      "error"
    ],
    "unicorn/filename-case": [
      0
    ],
    "unicorn/prefer-exponentiation-operator": [
      0
    ],
    "unicorn/regex-shorthand": [
      0
    ],
    "unicorn/no-fn-reference-in-iterator": [
      0
    ],
    "unicorn/no-array-for-each": [
      0
    ],
    "unicorn/no-reduce": [
      0
    ],
    "unicorn/no-null": [
      0
    ],
    "unicorn/prefer-number-properties": [
      0
    ],
    "unicorn/prefer-optional-catch-binding": [
      0
    ],
    "unicorn/prevent-abbreviations": [
      0
    ],
    "unicorn/better-regex": [
      "error"
    ],
    "unicorn/catch-error-name": [
      "error"
    ],
    "unicorn/consistent-destructuring": [
      "error"
    ],
    "unicorn/consistent-function-scoping": [
      "error"
    ],
    "unicorn/custom-error-definition": [
      "off"
    ],
    "unicorn/error-message": [
      "error"
    ],
    "unicorn/escape-case": [
      "error"
    ],
    "unicorn/expiring-todo-comments": [
      "error"
    ],
    "unicorn/explicit-length-check": [
      "error"
    ],
    "unicorn/import-index": [
      "off"
    ],
    "unicorn/import-style": [
      "error"
    ],
    "unicorn/new-for-builtins": [
      "error"
    ],
    "unicorn/no-abusive-eslint-disable": [
      "error"
    ],
    "unicorn/no-array-callback-reference": [
      "error"
    ],
    "unicorn/no-array-push-push": [
      "error"
    ],
    "unicorn/no-array-reduce": [
      "error"
    ],
    "unicorn/no-console-spaces": [
      "error"
    ],
    "unicorn/no-for-loop": [
      "error"
    ],
    "unicorn/no-hex-escape": [
      "error"
    ],
    "unicorn/no-instanceof-array": [
      "error"
    ],
    "unicorn/no-keyword-prefix": [
      "off"
    ],
    "unicorn/no-lonely-if": [
      "error"
    ],
    "no-nested-ternary": [
      "off"
    ],
    "unicorn/no-new-array": [
      "error"
    ],
    "unicorn/no-new-buffer": [
      "error"
    ],
    "unicorn/no-object-as-default-parameter": [
      "error"
    ],
    "unicorn/no-process-exit": [
      "error"
    ],
    "unicorn/no-this-assignment": [
      "error"
    ],
    "unicorn/no-unreadable-array-destructuring": [
      "error"
    ],
    "unicorn/no-unsafe-regex": [
      "off"
    ],
    "unicorn/no-unused-properties": [
      "off"
    ],
    "unicorn/no-useless-undefined": [
      "error"
    ],
    "unicorn/no-zero-fractions": [
      "error"
    ],
    "unicorn/numeric-separators-style": [
      "off"
    ],
    "unicorn/prefer-add-event-listener": [
      "error"
    ],
    "unicorn/prefer-array-find": [
      "error"
    ],
    "unicorn/prefer-array-flat-map": [
      "off"
    ],
    "unicorn/prefer-array-index-of": [
      "error"
    ],
    "unicorn/prefer-array-some": [
      "error"
    ],
    "unicorn/prefer-date-now": [
      "error"
    ],
    "unicorn/prefer-default-parameters": [
      "error"
    ],
    "unicorn/prefer-dom-node-append": [
      "error"
    ],
    "unicorn/prefer-dom-node-dataset": [
      "error"
    ],
    "unicorn/prefer-dom-node-remove": [
      "error"
    ],
    "unicorn/prefer-dom-node-text-content": [
      "error"
    ],
    "unicorn/prefer-includes": [
      "error"
    ],
    "unicorn/prefer-keyboard-event-key": [
      "error"
    ],
    "unicorn/prefer-math-trunc": [
      "error"
    ],
    "unicorn/prefer-modern-dom-apis": [
      "error"
    ],
    "unicorn/prefer-negative-index": [
      "error"
    ],
    "unicorn/prefer-query-selector": [
      "error"
    ],
    "unicorn/prefer-reflect-apply": [
      "error"
    ],
    "unicorn/prefer-regexp-test": [
      "error"
    ],
    "unicorn/prefer-set-has": [
      "error"
    ],
    "unicorn/prefer-spread": [
      "error"
    ],
    "unicorn/prefer-string-replace-all": [
      "off"
    ],
    "unicorn/prefer-string-slice": [
      "error"
    ],
    "unicorn/prefer-string-starts-ends-with": [
      "error"
    ],
    "unicorn/prefer-string-trim-start-end": [
      "error"
    ],
    "unicorn/prefer-ternary": [
      "error"
    ],
    "unicorn/prefer-type-error": [
      "error"
    ],
    "unicorn/string-content": [
      "off"
    ],
    "unicorn/throw-new-error": [
      "error"
    ],
    "switch-case/newline-between-switch-case": [
      "error",
      "always",
      {
        "fallthrough": "never"
      }
    ],
    "switch-case/no-case-curly": [
      "error"
    ],
    "simple-import-sort/imports": [
      "error"
    ],
    "simple-import-sort/exports": [
      "error"
    ],
    "sort-imports": [
      "off",
      {
        "ignoreCase": false,
        "ignoreDeclarationSort": false,
        "ignoreMemberSort": false,
        "memberSyntaxSortOrder": [
          "none",
          "all",
          "multiple",
          "single"
        ]
      }
    ],
    "import/order": [
      "off",
      {
        "groups": [
          [
            "builtin",
            "external",
            "internal"
          ]
        ]
      }
    ],
    "promise/prefer-await-to-callbacks": [
      "off"
    ],
    "promise/prefer-await-to-then": [
      "off"
    ],
    "promise/always-return": [
      "error"
    ],
    "promise/no-return-wrap": [
      "error"
    ],
    "promise/param-names": [
      "error"
    ],
    "promise/catch-or-return": [
      "error"
    ],
    "promise/no-native": [
      "off"
    ],
    "promise/no-nesting": [
      "warn"
    ],
    "promise/no-promise-in-callback": [
      "warn"
    ],
    "promise/no-callback-in-promise": [
      "warn"
    ],
    "promise/avoid-new": [
      "off"
    ],
    "promise/no-new-statics": [
      "error"
    ],
    "promise/no-return-in-finally": [
      "warn"
    ],
    "promise/valid-params": [
      "warn"
    ],
    "optimize-regex/optimize-regex": [
      "warn"
    ],
    "no-use-extend-native/no-use-extend-native": [
      "error"
    ],
    "no-constructor-bind/no-constructor-bind": [
      "error"
    ],
    "no-constructor-bind/no-constructor-state": [
      "error"
    ],
    "no-var": [
      0
    ],
    "no-unused-vars": [
      0,
      {
        "vars": "all",
        "args": "after-used",
        "ignoreRestSiblings": true
      }
    ],
    "json/colon-expected": [
      0
    ],
    "json/comma-expected": [
      0
    ],
    "json/comma-or-close-backet-expected": [
      0
    ],
    "json/comma-or-close-brace-expected": [
      0
    ],
    "json/comment-not-permitted": [
      0
    ],
    "json/duplicate-key": [
      0
    ],
    "json/enum-value-mismatch": [
      0
    ],
    "json/invalid-character": [
      0
    ],
    "json/invalid-escape-character": [
      0
    ],
    "json/invalid-unicode": [
      0
    ],
    "json/json": [
      0
    ],
    "json/property-expected": [
      0
    ],
    "json/schema-resolve-error": [
      0
    ],
    "json/trailing-comma": [
      0
    ],
    "json/undefined": [
      0
    ],
    "json/unexpected-end-of-comment": [
      0
    ],
    "json/unexpected-end-of-number": [
      0
    ],
    "json/unexpected-end-of-string": [
      0
    ],
    "json/unknown": [
      0
    ],
    "json/value-expected": [
      0
    ],
    "json/*": [
      "error",
      {
        "allowComments": true
      }
    ],
    "eslint-comments/no-restricted-disable": [
      0
    ],
    "eslint-comments/no-unused-disable": [
      0
    ],
    "eslint-comments/no-use": [
      0
    ],
    "eslint-comments/require-description": [
      0
    ],
    "eslint-comments/disable-enable-pair": [
      "error"
    ],
    "eslint-comments/no-aggregating-enable": [
      "error"
    ],
    "eslint-comments/no-duplicate-disable": [
      "error"
    ],
    "eslint-comments/no-unlimited-disable": [
      "error"
    ],
    "eslint-comments/no-unused-enable": [
      "error"
    ],
    "array-func/prefer-array-from": [
      "off"
    ],
    "array-func/prefer-flat": [
      0
    ],
    "array-func/prefer-flat-map": [
      0
    ],
    "array-func/from-map": [
      "error"
    ],
    "array-func/no-unnecessary-this-arg": [
      "error"
    ],
    "array-func/avoid-reverse": [
      "error"
    ],
    "react/jsx-no-constructed-context-values": [
      0
    ],
    "react-hooks/rules-of-hooks": [
      "error"
    ],
    "react-hooks/exhaustive-deps": [
      "error"
    ],
    "jsx-a11y/anchor-has-content": [
      "error",
      {
        "components": []
      }
    ],
    "jsx-a11y/aria-role": [
      "error",
      {
        "ignoreNonDOM": false
      }
    ],
    "jsx-a11y/aria-props": [
      "error"
    ],
    "jsx-a11y/aria-proptypes": [
      "error"
    ],
    "jsx-a11y/aria-unsupported-elements": [
      "error"
    ],
    "jsx-a11y/alt-text": [
      "error",
      {
        "elements": [
          "img",
          "object",
          "area",
          "input[type=\"image\"]"
        ],
        "img": [],
        "object": [],
        "area": [],
        "input[type=\"image\"]": []
      }
    ],
    "jsx-a11y/img-redundant-alt": [
      "error"
    ],
    "jsx-a11y/label-has-for": [
      "off",
      {
        "components": [],
        "required": {
          "every": [
            "nesting",
            "id"
          ]
        },
        "allowChildren": false
      }
    ],
    "jsx-a11y/label-has-associated-control": [
      "error",
      {
        "labelComponents": [],
        "labelAttributes": [],
        "controlComponents": [],
        "assert": "both",
        "depth": 25
      }
    ],
    "jsx-a11y/control-has-associated-label": [
      "error",
      {
        "labelAttributes": [
          "label"
        ],
        "controlComponents": [],
        "ignoreElements": [
          "audio",
          "canvas",
          "embed",
          "input",
          "textarea",
          "tr",
          "video"
        ],
        "ignoreRoles": [
          "grid",
          "listbox",
          "menu",
          "menubar",
          "radiogroup",
          "row",
          "tablist",
          "toolbar",
          "tree",
          "treegrid"
        ],
        "depth": 5
      }
    ],
    "jsx-a11y/mouse-events-have-key-events": [
      "error"
    ],
    "jsx-a11y/no-access-key": [
      "error"
    ],
    "jsx-a11y/no-onchange": [
      "off"
    ],
    "jsx-a11y/interactive-supports-focus": [
      "error"
    ],
    "jsx-a11y/role-has-required-aria-props": [
      "error"
    ],
    "jsx-a11y/role-supports-aria-props": [
      "error"
    ],
    "jsx-a11y/tabindex-no-positive": [
      "error"
    ],
    "jsx-a11y/heading-has-content": [
      "error",
      {
        "components": [
          ""
        ]
      }
    ],
    "jsx-a11y/html-has-lang": [
      "error"
    ],
    "jsx-a11y/lang": [
      "error"
    ],
    "jsx-a11y/no-distracting-elements": [
      "error",
      {
        "elements": [
          "marquee",
          "blink"
        ]
      }
    ],
    "jsx-a11y/scope": [
      "error"
    ],
    "jsx-a11y/click-events-have-key-events": [
      "error"
    ],
    "jsx-a11y/no-static-element-interactions": [
      "error",
      {
        "handlers": [
          "onClick",
          "onMouseDown",
          "onMouseUp",
          "onKeyPress",
          "onKeyDown",
          "onKeyUp"
        ]
      }
    ],
    "jsx-a11y/no-noninteractive-element-interactions": [
      "error",
      {
        "handlers": [
          "onClick",
          "onMouseDown",
          "onMouseUp",
          "onKeyPress",
          "onKeyDown",
          "onKeyUp"
        ]
      }
    ],
    "jsx-a11y/accessible-emoji": [
      "off"
    ],
    "jsx-a11y/aria-activedescendant-has-tabindex": [
      "error"
    ],
    "jsx-a11y/iframe-has-title": [
      "error"
    ],
    "jsx-a11y/no-autofocus": [
      "error",
      {
        "ignoreNonDOM": true
      }
    ],
    "jsx-a11y/no-redundant-roles": [
      "error"
    ],
    "jsx-a11y/media-has-caption": [
      "error",
      {
        "audio": [],
        "video": [],
        "track": []
      }
    ],
    "jsx-a11y/no-interactive-element-to-noninteractive-role": [
      "error",
      {
        "tr": [
          "none",
          "presentation"
        ]
      }
    ],
    "jsx-a11y/no-noninteractive-element-to-interactive-role": [
      "error",
      {
        "ul": [
          "listbox",
          "menu",
          "menubar",
          "radiogroup",
          "tablist",
          "tree",
          "treegrid"
        ],
        "ol": [
          "listbox",
          "menu",
          "menubar",
          "radiogroup",
          "tablist",
          "tree",
          "treegrid"
        ],
        "li": [
          "menuitem",
          "option",
          "row",
          "tab",
          "treeitem"
        ],
        "table": [
          "grid"
        ],
        "td": [
          "gridcell"
        ]
      }
    ],
    "jsx-a11y/no-noninteractive-tabindex": [
      "error",
      {
        "tags": [],
        "roles": [
          "tabpanel"
        ]
      }
    ],
    "jsx-a11y/anchor-is-valid": [
      "error",
      {
        "components": [
          "Link"
        ],
        "specialLink": [
          "to"
        ],
        "aspects": [
          "noHref",
          "invalidHref",
          "preferButton"
        ]
      }
    ],
    "jsx-a11y/autocomplete-valid": [
      "off",
      {
        "inputComponents": []
      }
    ],
    "no-underscore-dangle": [
      "error",
      {
        "allow": [
          "__REDUX_DEVTOOLS_EXTENSION_COMPOSE__"
        ],
        "allowAfterThis": false,
        "allowAfterSuper": false,
        "enforceInMethodNames": true,
        "allowAfterThisConstructor": false,
        "allowFunctionParams": true
      }
    ],
    "class-methods-use-this": [
      "error",
      {
        "exceptMethods": [
          "render",
          "getInitialState",
          "getDefaultProps",
          "getChildContext",
          "componentWillMount",
          "UNSAFE_componentWillMount",
          "componentDidMount",
          "componentWillReceiveProps",
          "UNSAFE_componentWillReceiveProps",
          "shouldComponentUpdate",
          "componentWillUpdate",
          "UNSAFE_componentWillUpdate",
          "componentDidUpdate",
          "componentWillUnmount",
          "componentDidCatch",
          "getSnapshotBeforeUpdate"
        ]
      }
    ],
    "react/display-name": [
      "off",
      {
        "ignoreTranspilerName": false
      }
    ],
    "react/forbid-prop-types": [
      "error",
      {
        "forbid": [
          "any",
          "array",
          "object"
        ],
        "checkContextTypes": true,
        "checkChildContextTypes": true
      }
    ],
    "react/forbid-dom-props": [
      "off",
      {
        "forbid": []
      }
    ],
    "react/jsx-boolean-value": [
      "error",
      "never",
      {
        "always": []
      }
    ],
    "react/jsx-handler-names": [
      "off",
      {
        "eventHandlerPrefix": "handle",
        "eventHandlerPropPrefix": "on"
      }
    ],
    "react/jsx-key": [
      "off"
    ],
    "react/jsx-no-bind": [
      "error",
      {
        "ignoreRefs": true,
        "allowArrowFunctions": true,
        "allowFunctions": false,
        "allowBind": false,
        "ignoreDOMComponents": true
      }
    ],
    "react/jsx-no-duplicate-props": [
      "error",
      {
        "ignoreCase": true
      }
    ],
    "react/jsx-no-literals": [
      "off",
      {
        "noStrings": true
      }
    ],
    "react/jsx-no-undef": [
      "error"
    ],
    "react/jsx-pascal-case": [
      "error",
      {
        "allowAllCaps": true,
        "ignore": []
      }
    ],
    "react/sort-prop-types": [
      "off",
      {
        "ignoreCase": true,
        "callbacksLast": false,
        "requiredFirst": false,
        "sortShapeProp": true
      }
    ],
    "react/jsx-sort-prop-types": [
      "off"
    ],
    "react/jsx-sort-props": [
      "off",
      {
        "ignoreCase": true,
        "callbacksLast": false,
        "shorthandFirst": false,
        "shorthandLast": false,
        "noSortAlphabetically": false,
        "reservedFirst": true
      }
    ],
    "react/jsx-sort-default-props": [
      "off",
      {
        "ignoreCase": true
      }
    ],
    "react/jsx-uses-react": [
      "error"
    ],
    "react/jsx-uses-vars": [
      "error"
    ],
    "react/no-danger": [
      "warn"
    ],
    "react/no-deprecated": [
      "error"
    ],
    "react/no-did-mount-set-state": [
      "off"
    ],
    "react/no-did-update-set-state": [
      "error"
    ],
    "react/no-will-update-set-state": [
      "error"
    ],
    "react/no-direct-mutation-state": [
      "off"
    ],
    "react/no-is-mounted": [
      "error"
    ],
    "react/no-multi-comp": [
      "off"
    ],
    "react/no-set-state": [
      "off"
    ],
    "react/no-string-refs": [
      "error"
    ],
    "react/no-unknown-property": [
      "error"
    ],
    "react/prefer-es6-class": [
      "error",
      "always"
    ],
    "react/prefer-stateless-function": [
      "error",
      {
        "ignorePureComponents": true
      }
    ],
    "react/prop-types": [
      "error",
      {
        "ignore": [],
        "customValidators": [],
        "skipUndeclared": false
      }
    ],
    "react/react-in-jsx-scope": [
      "error"
    ],
    "react/require-render-return": [
      "error"
    ],
    "react/self-closing-comp": [
      "error"
    ],
    "react/sort-comp": [
      "error",
      {
        "order": [
          "static-variables",
          "static-methods",
          "instance-variables",
          "lifecycle",
          "/^handle.+$/",
          "/^on.+$/",
          "getters",
          "setters",
          "/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/",
          "instance-methods",
          "everything-else",
          "rendering"
        ],
        "groups": {
          "lifecycle": [
            "displayName",
            "propTypes",
            "contextTypes",
            "childContextTypes",
            "mixins",
            "statics",
            "defaultProps",
            "constructor",
            "getDefaultProps",
            "getInitialState",
            "state",
            "getChildContext",
            "getDerivedStateFromProps",
            "componentWillMount",
            "UNSAFE_componentWillMount",
            "componentDidMount",
            "componentWillReceiveProps",
            "UNSAFE_componentWillReceiveProps",
            "shouldComponentUpdate",
            "componentWillUpdate",
            "UNSAFE_componentWillUpdate",
            "getSnapshotBeforeUpdate",
            "componentDidUpdate",
            "componentDidCatch",
            "componentWillUnmount"
          ],
          "rendering": [
            "/^render.+$/",
            "render"
          ]
        }
      }
    ],
    "react/jsx-no-target-blank": [
      "error",
      {
        "enforceDynamicLinks": "always"
      }
    ],
    "react/jsx-filename-extension": [
      "error",
      {
        "extensions": [
          ".jsx"
        ]
      }
    ],
    "react/jsx-no-comment-textnodes": [
      "error"
    ],
    "react/no-render-return-value": [
      "error"
    ],
    "react/require-optimization": [
      "off",
      {
        "allowDecorators": []
      }
    ],
    "react/no-find-dom-node": [
      "error"
    ],
    "react/forbid-component-props": [
      "off",
      {
        "forbid": []
      }
    ],
    "react/forbid-elements": [
      "off",
      {
        "forbid": []
      }
    ],
    "react/no-danger-with-children": [
      "error"
    ],
    "react/no-unused-prop-types": [
      "error",
      {
        "customValidators": [],
        "skipShapeProps": true
      }
    ],
    "react/style-prop-object": [
      "error"
    ],
    "react/no-unescaped-entities": [
      "error"
    ],
    "react/no-children-prop": [
      "error"
    ],
    "react/no-array-index-key": [
      "error"
    ],
    "react/require-default-props": [
      "error",
      {
        "forbidDefaultForRequired": true
      }
    ],
    "react/forbid-foreign-prop-types": [
      "warn",
      {
        "allowInPropTypes": true
      }
    ],
    "react/void-dom-elements-no-children": [
      "error"
    ],
    "react/default-props-match-prop-types": [
      "error",
      {
        "allowRequiredDefaults": false
      }
    ],
    "react/no-redundant-should-component-update": [
      "error"
    ],
    "react/no-unused-state": [
      "error"
    ],
    "react/boolean-prop-naming": [
      "off",
      {
        "propTypeNames": [
          "bool",
          "mutuallyExclusiveTrueProps"
        ],
        "rule": "^(is|has)[A-Z]([A-Za-z0-9]?)+",
        "message": ""
      }
    ],
    "react/no-typos": [
      "error"
    ],
    "react/jsx-curly-brace-presence": [
      "error",
      {
        "props": "never",
        "children": "never"
      }
    ],
    "react/destructuring-assignment": [
      "error",
      "always"
    ],
    "react/no-access-state-in-setstate": [
      "error"
    ],
    "react/button-has-type": [
      "error",
      {
        "button": true,
        "submit": true,
        "reset": false
      }
    ],
    "react/no-this-in-sfc": [
      "error"
    ],
    "react/jsx-max-depth": [
      "off"
    ],
    "react/no-unsafe": [
      "off"
    ],
    "react/jsx-fragments": [
      "error",
      "syntax"
    ],
    "react/state-in-constructor": [
      "error",
      "always"
    ],
    "react/static-property-placement": [
      "error",
      "property assignment"
    ],
    "react/prefer-read-only-props": [
      "off"
    ],
    "react/jsx-no-script-url": [
      "off",
      [
        {
          "name": "Link",
          "props": [
            "to"
          ]
        }
      ]
    ],
    "react/jsx-no-useless-fragment": [
      "off"
    ],
    "react/no-adjacent-inline-elements": [
      "off"
    ],
    "react/function-component-definition": [
      "off",
      {
        "namedComponents": "function-expression",
        "unnamedComponents": "function-expression"
      }
    ],
    "strict": [
      "error",
      "never"
    ],
    "import/no-unresolved": [
      "error",
      {
        "commonjs": true,
        "caseSensitive": true
      }
    ],
    "import/named": [
      "error"
    ],
    "import/default": [
      "off"
    ],
    "import/namespace": [
      "off"
    ],
    "import/export": [
      "error"
    ],
    "import/no-named-as-default": [
      "error"
    ],
    "import/no-named-as-default-member": [
      "error"
    ],
    "import/no-deprecated": [
      "off"
    ],
    "import/no-extraneous-dependencies": [
      "error",
      {
        "devDependencies": [
          "test/**",
          "tests/**",
          "spec/**",
          "**/__tests__/**",
          "**/__mocks__/**",
          "test.{js,jsx}",
          "test-*.{js,jsx}",
          "**/*{.,_}{test,spec}.{js,jsx}",
          "**/jest.config.js",
          "**/jest.setup.js",
          "**/vue.config.js",
          "**/webpack.config.js",
          "**/webpack.config.*.js",
          "**/rollup.config.js",
          "**/rollup.config.*.js",
          "**/gulpfile.js",
          "**/gulpfile.*.js",
          "**/Gruntfile{,.js}",
          "**/protractor.conf.js",
          "**/protractor.conf.*.js",
          "**/karma.conf.js"
        ],
        "optionalDependencies": false
      }
    ],
    "import/no-mutable-exports": [
      "error"
    ],
    "import/no-commonjs": [
      "off"
    ],
    "import/no-amd": [
      "error"
    ],
    "import/no-nodejs-modules": [
      "off"
    ],
    "import/first": [
      "error"
    ],
    "import/imports-first": [
      "off"
    ],
    "import/no-duplicates": [
      "error"
    ],
    "import/no-namespace": [
      "off"
    ],
    "import/extensions": [
      "error",
      "ignorePackages",
      {
        "js": "never",
        "mjs": "never",
        "jsx": "never"
      }
    ],
    "import/newline-after-import": [
      "error"
    ],
    "import/prefer-default-export": [
      "error"
    ],
    "import/no-restricted-paths": [
      "off"
    ],
    "import/max-dependencies": [
      "off",
      {
        "max": 10
      }
    ],
    "import/no-absolute-path": [
      "error"
    ],
    "import/no-dynamic-require": [
      "error"
    ],
    "import/no-internal-modules": [
      "off",
      {
        "allow": []
      }
    ],
    "import/unambiguous": [
      "off"
    ],
    "import/no-webpack-loader-syntax": [
      "error"
    ],
    "import/no-unassigned-import": [
      "off"
    ],
    "import/no-named-default": [
      "error"
    ],
    "import/no-anonymous-default-export": [
      "off",
      {
        "allowArray": false,
        "allowArrowFunction": false,
        "allowAnonymousClass": false,
        "allowAnonymousFunction": false,
        "allowLiteral": false,
        "allowObject": false
      }
    ],
    "import/exports-last": [
      "off"
    ],
    "import/group-exports": [
      "off"
    ],
    "import/no-default-export": [
      "off"
    ],
    "import/no-named-export": [
      "off"
    ],
    "import/no-self-import": [
      "error"
    ],
    "import/no-cycle": [
      "error",
      {
        "maxDepth": "∞",
        "ignoreExternal": false
      }
    ],
    "import/no-useless-path-segments": [
      "error",
      {
        "commonjs": true
      }
    ],
    "import/dynamic-import-chunkname": [
      "off",
      {
        "importFunctions": [],
        "webpackChunknameFormat": "[0-9a-zA-Z-_/.]+"
      }
    ],
    "import/no-relative-parent-imports": [
      "off"
    ],
    "import/no-unused-modules": [
      "off",
      {
        "ignoreExports": [],
        "missingExports": true,
        "unusedExports": true
      }
    ],
    "arrow-body-style": [
      "error",
      "as-needed",
      {
        "requireReturnForObjectLiteral": false
      }
    ],
    "constructor-super": [
      "error"
    ],
    "no-class-assign": [
      "error"
    ],
    "no-const-assign": [
      "error"
    ],
    "no-dupe-class-members": [
      "error"
    ],
    "no-duplicate-imports": [
      "off"
    ],
    "no-new-symbol": [
      "error"
    ],
    "no-restricted-exports": [
      "off",
      {
        "restrictedNamedExports": [
          "default",
          "then"
        ]
      }
    ],
    "no-restricted-imports": [
      "off",
      {
        "paths": [],
        "patterns": []
      }
    ],
    "no-this-before-super": [
      "error"
    ],
    "no-useless-computed-key": [
      "error"
    ],
    "no-useless-constructor": [
      "error"
    ],
    "no-useless-rename": [
      "error",
      {
        "ignoreDestructuring": false,
        "ignoreImport": false,
        "ignoreExport": false
      }
    ],
    "object-shorthand": [
      "error",
      "always",
      {
        "ignoreConstructors": false,
        "avoidQuotes": true
      }
    ],
    "prefer-arrow-callback": [
      "error",
      {
        "allowNamedFunctions": false,
        "allowUnboundThis": true
      }
    ],
    "prefer-const": [
      "error",
      {
        "destructuring": "any",
        "ignoreReadBeforeAssign": true
      }
    ],
    "prefer-destructuring": [
      "error",
      {
        "VariableDeclarator": {
          "array": false,
          "object": true
        },
        "AssignmentExpression": {
          "array": true,
          "object": false
        }
      },
      {
        "enforceForRenamedProperties": false
      }
    ],
    "prefer-numeric-literals": [
      "error"
    ],
    "prefer-reflect": [
      "off"
    ],
    "prefer-rest-params": [
      "error"
    ],
    "prefer-spread": [
      "error"
    ],
    "prefer-template": [
      "error"
    ],
    "require-yield": [
      "error"
    ],
    "symbol-description": [
      "error"
    ],
    "init-declarations": [
      "off"
    ],
    "no-catch-shadow": [
      "off"
    ],
    "no-delete-var": [
      "error"
    ],
    "no-label-var": [
      "error"
    ],
    "no-restricted-globals": [
      "error",
      {
        "name": "isFinite",
        "message": "Use Number.isFinite instead https://github.com/airbnb/javascript#standard-library--isfinite"
      },
      {
        "name": "isNaN",
        "message": "Use Number.isNaN instead https://github.com/airbnb/javascript#standard-library--isnan"
      },
      "addEventListener",
      "blur",
      "close",
      "closed",
      "confirm",
      "defaultStatus",
      "defaultstatus",
      "event",
      "external",
      "find",
      "focus",
      "frameElement",
      "frames",
      "history",
      "innerHeight",
      "innerWidth",
      "length",
      "location",
      "locationbar",
      "menubar",
      "moveBy",
      "moveTo",
      "name",
      "onblur",
      "onerror",
      "onfocus",
      "onload",
      "onresize",
      "onunload",
      "open",
      "opener",
      "opera",
      "outerHeight",
      "outerWidth",
      "pageXOffset",
      "pageYOffset",
      "parent",
      "print",
      "removeEventListener",
      "resizeBy",
      "resizeTo",
      "screen",
      "screenLeft",
      "screenTop",
      "screenX",
      "screenY",
      "scroll",
      "scrollbars",
      "scrollBy",
      "scrollTo",
      "scrollX",
      "scrollY",
      "self",
      "status",
      "statusbar",
      "stop",
      "toolbar",
      "top"
    ],
    "no-shadow": [
      "error"
    ],
    "no-shadow-restricted-names": [
      "error"
    ],
    "no-undef": [
      "error"
    ],
    "no-undef-init": [
      "error"
    ],
    "no-undefined": [
      "off"
    ],
    "no-use-before-define": [
      "error",
      {
        "functions": true,
        "classes": true,
        "variables": true
      }
    ],
    "camelcase": [
      "error",
      {
        "properties": "never",
        "ignoreDestructuring": false,
        "ignoreImports": false,
        "ignoreGlobals": false
      }
    ],
    "capitalized-comments": [
      "off",
      "never",
      {
        "line": {
          "ignorePattern": ".*",
          "ignoreInlineComments": true,
          "ignoreConsecutiveComments": true
        },
        "block": {
          "ignorePattern": ".*",
          "ignoreInlineComments": true,
          "ignoreConsecutiveComments": true
        }
      }
    ],
    "consistent-this": [
      "off"
    ],
    "func-name-matching": [
      "off",
      "always",
      {
        "includeCommonJSModuleExports": false,
        "considerPropertyDescriptor": true
      }
    ],
    "func-names": [
      "warn"
    ],
    "func-style": [
      "off",
      "expression"
    ],
    "id-blacklist": [
      "off"
    ],
    "id-denylist": [
      "off"
    ],
    "id-length": [
      "off"
    ],
    "id-match": [
      "off"
    ],
    "line-comment-position": [
      "off",
      {
        "position": "above",
        "ignorePattern": "",
        "applyDefaultPatterns": true
      }
    ],
    "lines-between-class-members": [
      "error",
      "always",
      {
        "exceptAfterSingleLine": false
      }
    ],
    "lines-around-directive": [
      "error",
      {
        "before": "always",
        "after": "always"
      }
    ],
    "max-depth": [
      "off",
      4
    ],
    "max-lines": [
      "off",
      {
        "max": 300,
        "skipBlankLines": true,
        "skipComments": true
      }
    ],
    "max-lines-per-function": [
      "off",
      {
        "max": 50,
        "skipBlankLines": true,
        "skipComments": true,
        "IIFEs": true
      }
    ],
    "max-nested-callbacks": [
      "off"
    ],
    "max-params": [
      "off",
      3
    ],
    "max-statements": [
      "off",
      10
    ],
    "max-statements-per-line": [
      "off",
      {
        "max": 1
      }
    ],
    "multiline-comment-style": [
      "off",
      "starred-block"
    ],
    "new-cap": [
      "error",
      {
        "newIsCap": true,
        "newIsCapExceptions": [],
        "capIsNew": false,
        "capIsNewExceptions": [
          "Immutable.Map",
          "Immutable.Set",
          "Immutable.List"
        ],
        "properties": true
      }
    ],
    "newline-after-var": [
      "off"
    ],
    "newline-before-return": [
      "off"
    ],
    "no-array-constructor": [
      "error"
    ],
    "no-bitwise": [
      "error"
    ],
    "no-continue": [
      "error"
    ],
    "no-inline-comments": [
      "off"
    ],
    "no-lonely-if": [
      "error"
    ],
    "no-multi-assign": [
      "error"
    ],
    "no-negated-condition": [
      "off"
    ],
    "no-new-object": [
      "error"
    ],
    "no-plusplus": [
      "error"
    ],
    "no-restricted-syntax": [
      "error",
      {
        "selector": "ForInStatement",
        "message": "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array."
      },
      {
        "selector": "ForOfStatement",
        "message": "iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations."
      },
      {
        "selector": "LabeledStatement",
        "message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand."
      },
      {
        "selector": "WithStatement",
        "message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize."
      }
    ],
    "no-ternary": [
      "off"
    ],
    "no-unneeded-ternary": [
      "error",
      {
        "defaultAssignment": false
      }
    ],
    "one-var": [
      "error",
      "never"
    ],
    "operator-assignment": [
      "error",
      "always"
    ],
    "padding-line-between-statements": [
      "off"
    ],
    "prefer-exponentiation-operator": [
      "off"
    ],
    "prefer-object-spread": [
      "error"
    ],
    "require-jsdoc": [
      "off"
    ],
    "sort-keys": [
      "off",
      "asc",
      {
        "caseSensitive": false,
        "natural": true
      }
    ],
    "sort-vars": [
      "off"
    ],
    "spaced-comment": [
      "error",
      "always",
      {
        "line": {
          "exceptions": [
            "-",
            "+"
          ],
          "markers": [
            "=",
            "!",
            "/"
          ]
        },
        "block": {
          "exceptions": [
            "-",
            "+"
          ],
          "markers": [
            "=",
            "!",
            ":",
            "::"
          ],
          "balanced": true
        }
      }
    ],
    "callback-return": [
      "off"
    ],
    "global-require": [
      "error"
    ],
    "handle-callback-err": [
      "off"
    ],
    "no-buffer-constructor": [
      "error"
    ],
    "no-mixed-requires": [
      "off",
      false
    ],
    "no-new-require": [
      "error"
    ],
    "no-path-concat": [
      "error"
    ],
    "no-process-env": [
      "off"
    ],
    "no-process-exit": [
      "off"
    ],
    "no-restricted-modules": [
      "off"
    ],
    "no-sync": [
      "off"
    ],
    "for-direction": [
      "error"
    ],
    "getter-return": [
      "error",
      {
        "allowImplicit": true
      }
    ],
    "no-async-promise-executor": [
      "error"
    ],
    "no-await-in-loop": [
      "error"
    ],
    "no-compare-neg-zero": [
      "error"
    ],
    "no-cond-assign": [
      "error",
      "always"
    ],
    "no-console": [
      "warn"
    ],
    "no-constant-condition": [
      "warn"
    ],
    "no-control-regex": [
      "error"
    ],
    "no-debugger": [
      "error"
    ],
    "no-dupe-args": [
      "error"
    ],
    "no-dupe-else-if": [
      "off"
    ],
    "no-dupe-keys": [
      "error"
    ],
    "no-duplicate-case": [
      "error"
    ],
    "no-empty": [
      "error"
    ],
    "no-empty-character-class": [
      "error"
    ],
    "no-ex-assign": [
      "error"
    ],
    "no-extra-boolean-cast": [
      "error"
    ],
    "no-func-assign": [
      "error"
    ],
    "no-import-assign": [
      "off"
    ],
    "no-inner-declarations": [
      "error"
    ],
    "no-invalid-regexp": [
      "error"
    ],
    "no-irregular-whitespace": [
      "error"
    ],
    "no-loss-of-precision": [
      "off"
    ],
    "no-misleading-character-class": [
      "error"
    ],
    "no-obj-calls": [
      "error"
    ],
    "no-promise-executor-return": [
      "off"
    ],
    "no-prototype-builtins": [
      "error"
    ],
    "no-regex-spaces": [
      "error"
    ],
    "no-setter-return": [
      "off"
    ],
    "no-sparse-arrays": [
      "error"
    ],
    "no-template-curly-in-string": [
      "error"
    ],
    "no-unreachable": [
      "error"
    ],
    "no-unreachable-loop": [
      "off",
      {
        "ignore": []
      }
    ],
    "no-unsafe-finally": [
      "error"
    ],
    "no-unsafe-negation": [
      "error"
    ],
    "no-useless-backreference": [
      "off"
    ],
    "no-negated-in-lhs": [
      "off"
    ],
    "require-atomic-updates": [
      "off"
    ],
    "use-isnan": [
      "error"
    ],
    "valid-jsdoc": [
      "off"
    ],
    "valid-typeof": [
      "error",
      {
        "requireStringLiterals": true
      }
    ],
    "accessor-pairs": [
      "off"
    ],
    "array-callback-return": [
      "error",
      {
        "allowImplicit": true,
        "checkForEach": false
      }
    ],
    "block-scoped-var": [
      "error"
    ],
    "complexity": [
      "off",
      11
    ],
    "consistent-return": [
      "error"
    ],
    "default-case": [
      "error",
      {
        "commentPattern": "^no default$"
      }
    ],
    "default-case-last": [
      "off"
    ],
    "default-param-last": [
      "off"
    ],
    "dot-notation": [
      "error",
      {
        "allowKeywords": true,
        "allowPattern": ""
      }
    ],
    "eqeqeq": [
      "error",
      "always",
      {
        "null": "ignore"
      }
    ],
    "grouped-accessor-pairs": [
      "off"
    ],
    "guard-for-in": [
      "error"
    ],
    "max-classes-per-file": [
      "error",
      1
    ],
    "no-alert": [
      "warn"
    ],
    "no-caller": [
      "error"
    ],
    "no-case-declarations": [
      "error"
    ],
    "no-constructor-return": [
      "off"
    ],
    "no-div-regex": [
      "off"
    ],
    "no-else-return": [
      "error",
      {
        "allowElseIf": false
      }
    ],
    "no-empty-function": [
      "error",
      {
        "allow": [
          "arrowFunctions",
          "functions",
          "methods"
        ]
      }
    ],
    "no-empty-pattern": [
      "error"
    ],
    "no-eq-null": [
      "off"
    ],
    "no-eval": [
      "error"
    ],
    "no-extend-native": [
      "error"
    ],
    "no-extra-bind": [
      "error"
    ],
    "no-extra-label": [
      "error"
    ],
    "no-fallthrough": [
      "error"
    ],
    "no-global-assign": [
      "error",
      {
        "exceptions": []
      }
    ],
    "no-native-reassign": [
      "off"
    ],
    "no-implicit-coercion": [
      "off",
      {
        "boolean": false,
        "number": true,
        "string": true,
        "allow": []
      }
    ],
    "no-implicit-globals": [
      "off"
    ],
    "no-implied-eval": [
      "error"
    ],
    "no-invalid-this": [
      "off"
    ],
    "no-iterator": [
      "error"
    ],
    "no-labels": [
      "error",
      {
        "allowLoop": false,
        "allowSwitch": false
      }
    ],
    "no-lone-blocks": [
      "error"
    ],
    "no-loop-func": [
      "error"
    ],
    "no-magic-numbers": [
      "off",
      {
        "ignore": [],
        "ignoreArrayIndexes": true,
        "enforceConst": true,
        "detectObjects": false
      }
    ],
    "no-multi-str": [
      "error"
    ],
    "no-new": [
      "error"
    ],
    "no-new-func": [
      "error"
    ],
    "no-new-wrappers": [
      "error"
    ],
    "no-octal": [
      "error"
    ],
    "no-octal-escape": [
      "error"
    ],
    "no-param-reassign": [
      "error",
      {
        "props": true,
        "ignorePropertyModificationsFor": [
          "acc",
          "accumulator",
          "e",
          "ctx",
          "context",
          "req",
          "request",
          "res",
          "response",
          "$scope",
          "staticContext"
        ]
      }
    ],
    "no-proto": [
      "error"
    ],
    "no-redeclare": [
      "error"
    ],
    "no-restricted-properties": [
      "error",
      {
        "object": "arguments",
        "property": "callee",
        "message": "arguments.callee is deprecated"
      },
      {
        "object": "global",
        "property": "isFinite",
        "message": "Please use Number.isFinite instead"
      },
      {
        "object": "self",
        "property": "isFinite",
        "message": "Please use Number.isFinite instead"
      },
      {
        "object": "window",
        "property": "isFinite",
        "message": "Please use Number.isFinite instead"
      },
      {
        "object": "global",
        "property": "isNaN",
        "message": "Please use Number.isNaN instead"
      },
      {
        "object": "self",
        "property": "isNaN",
        "message": "Please use Number.isNaN instead"
      },
      {
        "object": "window",
        "property": "isNaN",
        "message": "Please use Number.isNaN instead"
      },
      {
        "property": "__defineGetter__",
        "message": "Please use Object.defineProperty instead."
      },
      {
        "property": "__defineSetter__",
        "message": "Please use Object.defineProperty instead."
      },
      {
        "object": "Math",
        "property": "pow",
        "message": "Use the exponentiation operator (**) instead."
      }
    ],
    "no-return-assign": [
      "error",
      "always"
    ],
    "no-return-await": [
      "error"
    ],
    "no-script-url": [
      "error"
    ],
    "no-self-assign": [
      "error",
      {
        "props": true
      }
    ],
    "no-self-compare": [
      "error"
    ],
    "no-sequences": [
      "error"
    ],
    "no-throw-literal": [
      "error"
    ],
    "no-unmodified-loop-condition": [
      "off"
    ],
    "no-unused-expressions": [
      "error",
      {
        "allowShortCircuit": false,
        "allowTernary": false,
        "allowTaggedTemplates": false,
        "enforceForJSX": false
      }
    ],
    "no-unused-labels": [
      "error"
    ],
    "no-useless-call": [
      "off"
    ],
    "no-useless-catch": [
      "error"
    ],
    "no-useless-concat": [
      "error"
    ],
    "no-useless-escape": [
      "error"
    ],
    "no-useless-return": [
      "error"
    ],
    "no-void": [
      "error"
    ],
    "no-warning-comments": [
      "off",
      {
        "terms": [
          "todo",
          "fixme",
          "xxx"
        ],
        "location": "start"
      }
    ],
    "no-with": [
      "error"
    ],
    "prefer-promise-reject-errors": [
      "error",
      {
        "allowEmptyReject": true
      }
    ],
    "prefer-named-capture-group": [
      "off"
    ],
    "prefer-regex-literals": [
      "off"
    ],
    "radix": [
      "error"
    ],
    "require-await": [
      "off"
    ],
    "require-unicode-regexp": [
      "off"
    ],
    "vars-on-top": [
      "error"
    ],
    "yoda": [
      "error"
    ]
  },
  "settings": {
    "import/resolver": {
      "node": {
        "extensions": [
          ".js",
          ".jsx",
          ".json"
        ]
      }
    },
    "react": {
      "pragma": "React",
      "version": "detect"
    },
    "propWrapperFunctions": [
      "forbidExtraProps",
      "exact",
      "Object.freeze"
    ],
    "import/extensions": [
      ".js",
      ".mjs",
      ".jsx"
    ],
    "import/core-modules": [],
    "import/ignore": [
      "node_modules",
      "\\.(coffee|scss|css|less|hbs|svg|json)$"
    ]
  },
  "ignorePatterns": []
}

package.json

{
  "name": "yorailevi",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.9",
    "@testing-library/react": "^11.2.5",
    "@testing-library/user-event": "^12.8.0",
    "@types/jest": "^26.0.20",
    "@types/node": "^12.20.4",
    "@types/react": "^17.0.2",
    "@types/react-dom": "^17.0.1",
    "install": "^0.13.0",
    "npm": "^7.6.0",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.3",
    "typescript": "^4.2.2",
    "web-vitals": "^1.1.0"
  },
  "scripts": {
    "lint": "eslint --color --ext .html --ext .js --ext .json --ext .jsx --ext .md --ext .ts --ext .tsx src/",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^4.16.1",
    "@typescript-eslint/parser": "^4.16.1",
    "eslint": "^7.21.0",
    "eslint-config-adjunct": "^4.9.0",
    "eslint-config-airbnb": "^18.2.1",
    "eslint-config-airbnb-typescript": "^12.3.1",
    "eslint-config-auto": "^0.6.6",
    "eslint-config-prettier": "^7.2.0",
    "eslint-plugin-array-func": "^3.1.7",
    "eslint-plugin-eslint-comments": "^3.2.0",
    "eslint-plugin-html": "^6.1.1",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jest-async": "^1.0.3",
    "eslint-plugin-jest-dom": "^3.6.5",
    "eslint-plugin-json": "^2.1.2",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-markdown": "^2.0.0",
    "eslint-plugin-no-constructor-bind": "^2.0.4",
    "eslint-plugin-no-secrets": "^0.8.9",
    "eslint-plugin-no-unsanitized": "^3.1.4",
    "eslint-plugin-no-use-extend-native": "^0.5.0",
    "eslint-plugin-optimize-regex": "^1.2.0",
    "eslint-plugin-prettier": "^3.3.1",
    "eslint-plugin-promise": "^4.3.1",
    "eslint-plugin-react": "^7.22.0",
    "eslint-plugin-react-hooks": "^4.2.0",
    "eslint-plugin-scanjs-rules": "^0.2.1",
    "eslint-plugin-security": "^1.4.0",
    "eslint-plugin-simple-import-sort": "^7.0.0",
    "eslint-plugin-sonarjs": "^0.6.0",
    "eslint-plugin-switch-case": "^1.1.2",
    "eslint-plugin-unicorn": "^28.0.2",
    "prettier": "2.2.1"
  }
}

basically the parser option is null and it doesn't apply ts,tsx rules despite typescript being installed and available in package.json.
windows 10, powershell

Plugin forces to install `eslint-plugin-prettier`

We use this plugin for about a year, but in recent time, when setting up new project, the auto plugin forces us to install eslint-plugin-prettier, wich is not mentioned anywhere and it is not the prefered way how to use prettier with eslint (prettier docs) - in short, there should be only eslint-config-prettier installed and Prettier should be run by IDE.

I tried different versions of installed eslint and prettier plugins versions, but cannot figured out how to be able to run eslint without eslint-plugin-prettier. It seems to be problem with eslint-config-adjunct that expects eslint-plugin prettier to be installed.

We use yarn, typescript, Next.js.

This is script that runs eslint:

    "lint": "eslint --color --ext .html,.js,.json,.jsx,.md,.ts,.tsx *.* pages components",
    "lint:fix": "yarn lint --fix"

And this is the error I get when running yarn lint.

eslint-config-auto loaded the following packages:

  eslint-plugin-import
  eslint-plugin-jsx-a11y
  eslint-plugin-react
  eslint-plugin-react-hooks
  @typescript-eslint/recommended
  @typescript-eslint/recommended-requiring-type-checking
  eslint-config-airbnb
  eslint-config-airbnb/hooks
  eslint-config-airbnb-typescript
  eslint-config-adjunct

eslint-config-adjunct loaded the following packages:

  eslint-plugin-array-func
  eslint-plugin-const-case
  eslint-plugin-eslint-comments
  eslint-plugin-html
  eslint-plugin-json
  eslint-plugin-markdown
  eslint-plugin-no-constructor-bind
  eslint-plugin-no-use-extend-native
  eslint-plugin-optimize-regex
  eslint-plugin-promise
  eslint-plugin-simple-import-sort
  eslint-plugin-sonarjs
  eslint-plugin-switch-case
  eslint-plugin-unicorn
  eslint-plugin-no-secrets
  eslint-plugin-no-unsanitized
  eslint-plugin-pii
  eslint-plugin-scanjs-rules
  eslint-plugin-security
  eslint-plugin-xss
  eslint-plugin-lodash
  eslint-plugin-lodash-fp
  eslint-config-prettier
  eslint-test-overrides


Oops! Something went wrong! :(

ESLint: 8.47.0

ESLint couldn't find the plugin "eslint-plugin-prettier".


(The package "eslint-plugin-prettier" was not found when loaded as a Node module from the directory "/Users/radoslavzeman/repos/bratislava.github.io".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

    npm install eslint-plugin-prettier@latest --save-dev

The plugin "eslint-plugin-prettier" was referenced from the config file in ".eslintrc.js » eslint-config-auto » /[...]/node_modules/eslint-config-auto/rules/adjunct.js » eslint-config-adjunct » /[...]/node_modules/eslint-config-auto/node_modules/eslint-config-adjunct/rules/prettier.js".

If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.

error Command failed with exit code 2.

Do you have some suggestions how to fix this problem? Thanks!

Doesn't work in VS Code when project is in a subfolder

Hello, I tried this plugin. It works in the terminal, but it crashes in VS Code.

The error:

Uncaught exception received.
TypeError: Cannot read config file: projectPath/node_modules/eslint-config-auto/index.js
Error: Cannot destructure property 'packageJson' of 'readPkgUp.sync(...)' as it is undefined.
Referenced from: projectPath/.eslintrc.json
    at Object.<anonymous> (projectPath/node_modules/eslint-config-adjunct/lib/utils.js:12:22)
    at Module._compile (node:internal/modules/cjs/loader:1163:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1216:10)
    at Module.load (node:internal/modules/cjs/loader:1035:32)
    at Module._load (node:internal/modules/cjs/loader:876:12)
    at Function.c._load (node:electron/js2c/asar_bundle:5:13343)
    at Module.require (node:internal/modules/cjs/loader:1059:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (projectPath/node_modules/eslint-config-adjunct/configs.js:1:23)
    at Module._compile (node:internal/modules/cjs/loader:1163:14)

This is my config:

{
  "extends": [
    "auto"
  ]
}

And these are the used packages:

image

Add Vue

Add '@vue/airbnband@vue/typescript/recommended`

Add MDX

Add support for MDX files

Eslint in VS Code

Hi,

I don't have any error/warning appearing in VS Code (ESLint plugin) whereas it works perfectly in command line. I'm not sure the simplified .eslintrc.json is the cause or if there is a configuration to do. Is this supposed to work in VS Code too?

Cheers,
Fabrice

auto config errors out after [email protected]

I am trying this auto config out, there seem to have been a recent change that might be causing this error (below)
https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md#version-800-2021-02-21

Error: Cannot read config file: D:\source\playZone\YoraiLevi.github.io\node_modules\eslint-config-prettier\@typescript-eslint.js     
Error: "prettier/@typescript-eslint" has been merged into "prettier" in eslint-config-prettier 8.0.0. See: https://github.com/prettier/eslint-config-prettier/blob/main/CHANGELOG.md#version-800-2021-02-21
Referenced from: D:\source\playZone\YoraiLevi.github.io\node_modules\eslint-config-adjunct\rules\prettier.js
    at Object.<anonymous> (D:\source\playZone\YoraiLevi.github.io\node_modules\eslint-config-prettier\@typescript-eslint.js:1:69)    
    at Module._compile (C:\ProgramData\nvm\v14.15.1\node_modules\eslint\node_modules\v8-compile-cache\v8-compile-cache.js:192:30)    
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at module.exports (C:\ProgramData\nvm\v14.15.1\node_modules\eslint\node_modules\import-fresh\index.js:32:59)
    at loadJSConfigFile (C:\ProgramData\nvm\v14.15.1\node_modules\eslint\node_modules\@eslint\eslintrc\lib\config-array-factory.js:225:16)
    at loadConfigFile (C:\ProgramData\nvm\v14.15.1\node_modules\eslint\node_modules\@eslint\eslintrc\lib\config-array-factory.js:309:20)
    at ConfigArrayFactory._loadConfigData (C:\ProgramData\nvm\v14.15.1\node_modules\eslint\node_modules\@eslint\eslintrc\lib\config-array-factory.js:609:42)

npm install [email protected] resolves the issue

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.