---
extends:
  - eslint:recommended
  - plugin:@typescript-eslint/recommended
  - plugin:react/recommended
  - plugin:react-hooks/recommended

plugins:
  - "@typescript-eslint"
  - react
  - react-hooks

parser: "@typescript-eslint/parser"

globals:
  page: true
  browser: true
  context: true
  jestPuppeteer: true
  BASE_URL: true

rules:
  # Code quality rules
  eqeqeq: error
  "@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: 'never' }]
  "@typescript-eslint/no-empty-function": ["error", { "allow": ["arrowFunctions"] }]
  "@typescript-eslint/no-explicit-any": off # Allow explicit any to make incremental TypeScript adoption easier.
  # TODO: use strict ruleset which includes no-non-null-assertion.
  # Not possible while strictNullChecks is disabled in tsconfig.
  "@typescript-eslint/no-non-null-assertion": "error"
  no-unused-vars: off
  "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_", "destructuredArrayIgnorePattern": "^_" }]
  no-use-before-define: off
  "@typescript-eslint/no-use-before-define": ["error", { "functions": false }]
  "@typescript-eslint/no-var-requires": off # Remove this override once all files use ES6 style imports.
  prefer-const: ["error", {"destructuring": "all"}]
  react/no-array-index-key: error
  react/prop-types: off # Remove this override once all props have been typed using PropTypes or TypeScript.

  # Code style rules
  arrow-parens: ["error", "always"]
  no-unneeded-ternary: ["error", { "defaultAssignment": true }]
  quote-props: ["error", "as-needed"]

overrides:
  - files: ["*.ts", "*.tsx"]
    rules:
      "@typescript-eslint/explicit-function-return-type": "error"

parserOptions:
  ecmaVersion: 6
  sourceType: module
  ecmaFeatures:
    modules: true

env:
  es6: true
  browser: true
  node: true
  jest: true

settings:
  react:
    version: detect
