extends:
  - "eslint:recommended"
  - "plugin:react/recommended"
  - "plugin:jsx-a11y/recommended"
  - "plugin:import/recommended"

parserOptions:
  ecmaVersion: 2017
  ecmaFeatures:
    jsx: true
  sourceType: "module"

env:
  amd: true
  browser: true
  es6: true
  jquery: true
  node: true

plugins:
  - react
  - "jsx-a11y"

# http://eslint.org/docs/rules/
rules:
  # Possible Errors
  comma-dangle: [2, "always-multiline"]
  no-cond-assign: 2

  # Warning to allow webpack hot reloading to not fail on no-console.
  no-console: [ 1, { allow: ["warn", "error", "trace"] } ]
  no-constant-condition: 2
  no-control-regex: 2
  no-debugger: 2
  no-dupe-args: 2
  no-dupe-keys: 2
  no-duplicate-case: 2
  no-empty: 2
  no-empty-character-class: 2
  no-ex-assign: 2
  no-extra-boolean-cast: 2
  no-extra-parens: 0
  no-extra-semi: 2
  no-func-assign: 2
  no-inner-declarations: [2, functions]
  no-invalid-regexp: 2
  no-irregular-whitespace: 2
  no-negated-in-lhs: 2
  no-obj-calls: 2
  no-regex-spaces: 2
  no-sparse-arrays: 2
  no-unexpected-multiline: 2
  no-unreachable: 2
  use-isnan: 2
  valid-jsdoc: [ 2, {
    "prefer": {
      "return": "returns"
    }
  }]
  valid-typeof: 2

  # Best Practices
  accessor-pairs: 2
  block-scoped-var: 0
  complexity: [2, 10]
  consistent-return: 0
  curly: 2
  default-case: 0
  dot-location: 0
  dot-notation: 2
  eqeqeq: 2
  guard-for-in: 2
  no-alert: 2
  no-caller: 2
  no-case-declarations: 2
  no-div-regex: 2
  no-else-return: 2
  no-empty-pattern: 2
  no-eq-null: 2
  no-eval: 2
  no-extend-native: 2
  no-extra-bind: 2
  no-fallthrough: 2
  no-floating-decimal: 0
  no-implicit-coercion: 0
  no-implied-eval: 2
  no-invalid-this: 0
  no-iterator: 2
  no-labels: 2
  no-lone-blocks: 2
  no-loop-func: 2
  no-magic-number: 0
  no-multi-spaces: 0
  no-multi-str: 2
  no-native-reassign: 2
  no-new-func: 2
  no-new-wrappers: 2
  no-new: 2
  no-octal-escape: 2
  no-octal: 2
  no-proto: 2
  no-redeclare: 2
  no-return-assign: 2
  no-script-url: 2
  no-self-compare: 2
  no-sequences: 0
  no-throw-literal: 0
  no-unused-expressions: 2
  no-useless-call: 2
  no-useless-concat: 2
  no-useless-escape: 2
  no-void: 2
  no-warning-comments: [ 2, { "terms": [ "todo" ], "location": "anywhere" } ]
  no-with: 2
  radix: 2
  vars-on-top: 0
  wrap-iife: 2
  yoda: 0

  # Strict
  strict: 2

  # Variables
  init-declarations: 0
  no-catch-shadow: 2
  no-delete-var: 2
  no-label-var: 2
  no-shadow-restricted-names: 2
  no-shadow: [ 2, { "builtinGlobals": false, "hoist": "all", "allow": [] } ]
  no-undef-init: 2
  no-undef: 2
  no-undefined: 2
  no-unused-vars: 2
  no-use-before-define: 2
  prefer-const: 2

  # Node.js and CommonJS
  callback-return: 2
  global-require: 2
  handle-callback-err: 2
  no-mixed-requires: 2
  no-new-require: 0
  no-path-concat: 2
  no-process-exit: 2
  no-restricted-modules: 0
  no-sync: 0

  # Stylistic Issues
  array-bracket-spacing: [2, always]
  block-spacing: [2, always]
  brace-style: [2, 1tbs]
  camelcase: 2
  comma-spacing: 2
  comma-style: 2
  computed-property-spacing: [2, always]
  consistent-this: [2, "that"]
  eol-last: 2
  func-names: 0
  func-style: 0
  id-length: 0
  id-match: 0
  indent: [2, tab, {"SwitchCase": 1}]
  jsx-quotes: [2, "prefer-double"]
  key-spacing: [2, {"beforeColon": false, "afterColon": true}]
  keyword-spacing: [2, {"before": true, "after": true}]
  linebreak-style: [2, unix]
  lines-around-comment: 0
  max-depth: 2
  max-len: [2, 150, 4]
  max-nested-callbacks: 2
  max-params: 0
  max-statements: [2, 30]
  new-cap: 2
  new-parens: 2
  newline-after-var: 0
  newline-per-chained-call: 0
  no-array-constructor: 2
  no-bitwise: 2
  no-continue: 0
  no-inline-comments: 2
  no-lonely-if: 0
  no-mixed-spaces-and-tabs: [2, "smart-tabs"]
  no-multiple-empty-lines: 2
  no-negated-condition: 2
  no-nested-ternary: 2
  no-new-object: 2
  no-plusplus: 0
  no-restricted-syntax: [
    'error',
    {
      selector: 'CallExpression[callee.name=/^(__)$/][arguments.length!=2]',
      message: 'A textdomain needs to be provided for translation calls.',
    },
    {
      selector: 'CallExpression[callee.name=/^(_x)$/][arguments.length!=3]',
      message: 'A textdomain needs to be provided for translation calls.',
    },
    {
      selector: 'CallExpression[callee.name=/^(_n)$/][arguments.length!=4]',
      message: 'A textdomain needs to be provided for translation calls.',
    },
    {
      selector: 'CallExpression[callee.name=/^(_nx)$/][arguments.length!=5]',
      message: 'A textdomain needs to be provided for translation calls.',
    }
  ]
  no-spaced-func: 2
  no-ternary: 0
  no-trailing-spaces: 2
  no-underscore-dangle: 0
  no-unneeded-ternary: 2
  no-whitespace-before-property: 2
  object-curly-spacing: [2, "always"]
  one-var: 0
  operator-assignment: 0
  operator-linebreak: 2
  padded-blocks: [2, "never"]
  quote-props: [2, "as-needed", {"keywords": true}]
  quotes: [2, double, avoid-escape]
  require-jsdoc: [2, {"require": {"MethodDefinition": true, "ClassDeclaration": true, "ArrowFunctionExpression": true, "FunctionExpression": true}}]
  semi-spacing: 2
  semi: [2, always]
  sort-vars: 0
  space-before-blocks: 2
  space-before-function-paren: [2, "never"]
  space-in-parens: [2, "always", {"exceptions": ["empty"]}]
  space-infix-ops: 2
  space-unary-ops: [2, {"words": false, "nonwords": false, "overrides": { "!": true }}]
  spaced-comment: [2, "always"]
  wrap-regex: 0

  # Accessibility rules. https://github.com/evcohen/eslint-plugin-jsx-a11y
  # Deprecated in v6.1.0 in favor of label-has-associated-control but we still want to require only for/id and not nesting.
  jsx-a11y/label-has-for: [2, { "required": "id" } ]

  # React plugins settings (https://github.com/yannickcr/eslint-plugin-react/tree/master/docs/rules)
  react/jsx-tag-spacing: [2, {"beforeClosing": "never"}]
  react/jsx-pascal-case: 2
  react/jsx-no-bind: 2
  react/jsx-max-props-per-line: [2, {"maximum": 6}] # A high maximum to make sure it is always a smell when it occurs.
  react/jsx-max-depth: [2, {"max": 8}] # A high maximum to make sure it is always a smell when it occurs.
  react/jsx-indent-props: [2, "tab"]
  react/jsx-indent: [2, "tab"]
  react/jsx-first-prop-new-line: [2, "multiline"]
  react/jsx-equals-spacing: 2
  react/jsx-curly-spacing: [2, {"when": "always", "children": true}]
  react/jsx-closing-bracket-location: [2, "line-aligned"]
  react/jsx-boolean-value: [2, "always"]

  react/void-dom-elements-no-children: 2
  react/self-closing-comp: 2
  react/require-default-props: [2, { "ignoreFunctionalComponents": true }]
  react/prefer-es6-class: 2
  react/no-unused-state: 2
  react/no-unused-prop-types: 2
  react/no-this-in-sfc: 2
  react/no-typos: 2
  react/no-render-return-value: 2
  react/no-redundant-should-component-update: 2
  react/no-access-state-in-setstate: 2
  react/forbid-foreign-prop-types: 2
  react/default-props-match-prop-types: 2
  react/button-has-type: 0 # See https://github.com/yannickcr/eslint-plugin-react/issues/1555
  react/boolean-prop-naming: 2

  # Import rules (https://github.com/import-js/eslint-plugin-import)
  import/no-extraneous-dependencies: 2
