env:
  browser: true
  commonjs: true
  es6: true
  node: true
  mocha: true
plugins:
  - lodash
  - jsdoc
  - node
  - react
extends: 'standard'
parserOptions:
  sourceType: 'script'
  ecmaFeatures:
    jsx: true
settings:
  jsdoc:
    additionalTagNames:
      customTags:
        - fulfil
rules:

  # Possible Errors

  no-console:
    - off
  no-empty:
    - error
  no-extra-semi:
    - error
  no-negated-in-lhs:
    - error
  no-prototype-builtins:
    - error
  valid-jsdoc:
    - error
    - requireReturn: false
      requireReturnDescription: false
      requireReturnType: true
      requireParamDescription: true
      preferType:
        boolean: "Boolean"
        number: "Number"
        object: "Object"
        string: "String"
        array: "Array"
      prefer:
        arg: "param"
        return: "returns"

  # Best Practices

  array-callback-return:
    - error
  block-scoped-var:
    - error
  class-methods-use-this:
    - error
  complexity:
    - off
  consistent-return:
    - error
  curly:
    - error
  default-case:
    - error
  dot-notation:
    - error
  guard-for-in:
    - error
  no-alert:
    - error
  no-case-declarations:
    - error
  no-div-regex:
    - error
  no-else-return:
    - error
  no-empty-function:
    - error
  no-eq-null:
    - error
  no-extra-label:
    - error
  no-implicit-coercion:
    - error
  no-implicit-globals:
    - error
  no-loop-func:
    - error
  no-magic-numbers:
    - error
  no-native-reassign:
    - error
  no-param-reassign:
    - error
  no-restricted-properties:
    - error
    - property: __proto__
  no-return-await:
    - error
  no-script-url:
    - error
  no-unused-expressions:
    - error
  no-unused-labels:
    - error
  no-useless-concat:
    - error
  no-void:
    - error
  no-warning-comments:
    - off
  radix:
    - error
  vars-on-top:
    - off

  # Strict mode

  strict:
    - error
    - global

  # Variables

  init-declarations:
    - error
    - always
  no-catch-shadow:
    - error
  no-restricted-globals:
    - error
    - event
  no-shadow:
    - error
  no-undefined:
    - error
  no-unused-vars:
    - error
  no-use-before-define:
    - error

  # NodeJS and CommonJS

  callback-return:
    - error
  global-require:
    - off
  no-mixed-requires:
    - error
  no-process-env:
    - off
  no-process-exit:
    - off
  no-sync:
    - off

  # Stylistic Issues

  array-bracket-spacing:
    - error
    - always
  capitalized-comments:
    - error
    - always
    - ignoreConsecutiveComments: true
  comma-spacing:
    - error
    - before: false
      after: true
  computed-property-spacing:
    - error
    - never
  consistent-this:
    - error
    - self
  func-name-matching:
    - error
    - always
  func-names:
    - error
    - never
  func-style:
    - error
    - expression
  id-blacklist:
    - error
  id-length:
    - error
    - min: 2
      exceptions:
        - "_"
  id-match:
    - error
    - "^[_0-9A-Za-z\\$]+$"
  line-comment-position:
    - error
    - position: above
  linebreak-style:
    - error
    - unix
  lines-around-comment:
    - error
    - beforeBlockComment: true
      afterBlockComment: false
      beforeLineComment: true
      afterLineComment: false
      allowBlockStart: true
      allowBlockEnd: false
      allowObjectStart: true
      allowObjectEnd: false
      allowArrayStart: true
      allowArrayEnd: false
  lines-around-directive:
    - error
    - always
  max-len:
    - error
    - code: 130
      comments: 150
      ignoreComments: false
      ignoreTrailingComments: false
      ignoreUrls: true
  max-params:
    - off
  max-statements-per-line:
    - error
    - max: 1
  multiline-ternary:
    - off
  newline-per-chained-call:
    - off
  no-bitwise:
    - error
  no-continue:
    - error
  no-inline-comments:
    - error
  no-lonely-if:
    - error
  no-mixed-operators:
    - error
  no-multi-assign:
    - error
  no-negated-condition:
    - error
  no-nested-ternary:
    - error
  no-plusplus:
    - error
  no-restricted-syntax:
    - error
    - WithStatement
    - ForInStatement
  no-spaced-func:
    - error
  no-underscore-dangle:
    - error
    - allowAfterThis: false
  object-curly-newline:
    - error
    - minProperties: 3
      consistent: true
  object-curly-spacing:
    - error
    - always
  one-var-declaration-per-line:
    - error
    - always
  operator-assignment:
    - error
    - always
  quotes:
    - error
    - single
  quote-props:
    - error
    - as-needed
  require-jsdoc:
    - error
    - require:
        FunctionDeclaration: true
        ClassDeclaration: true
        MethodDefinition: true
        ArrowFunctionExpression: true
  space-before-function-paren:
    - error
    - anonymous: always
      named: always
      asyncArrow: always
  template-tag-spacing:
    - error
    - always
  unicode-bom:
    - error

  # ECMAScript 6

  arrow-parens:
    - error
    - always
  arrow-spacing:
    - error
    - before: true
      after: true
  generator-star-spacing:
    - error
    - before: true
      after: false
  no-confusing-arrow:
    - error
  no-var:
    - error
  object-shorthand:
    - error
    - always
  prefer-const:
    - error
  prefer-spread:
    - error
  prefer-numeric-literals:
    - error
  prefer-rest-params:
    - error
  prefer-template:
    - error
  prefer-arrow-callback:
    - error
    - allowNamedFunctions: false
  require-yield:
    - error
  symbol-description:
    - error

  # Lodash

  lodash/chain-style:
    - error
    - explicit
  lodash/identity-shorthand:
    - error
    - always
  lodash/import-scope:
    - error
    - full
  lodash/matches-prop-shorthand:
    - error
    - always
  lodash/matches-shorthand:
    - error
    - always
  lodash/no-commit:
    - error
  lodash/path-style:
    - error
    - array
  lodash/prefer-compact:
    - error
  lodash/prefer-filter:
    - error
    - 5
  lodash/prefer-flat-map:
    - error
  lodash/prefer-invoke-map:
    - error
  lodash/prefer-map:
    - error
  lodash/prefer-reject:
    - error
  lodash/prefer-thru:
    - error
  lodash/prefer-wrapper-method:
    - error
  lodash/prop-shorthand:
    - error
    - always
  lodash/prefer-constant:
    - error
    - true
    - true
  lodash/prefer-get:
    - error
    - 2
  lodash/prefer-includes:
    - error
    - includeNative: true
  lodash/prefer-is-nil:
    - error
  lodash/prefer-lodash-chain:
    - error
  lodash/prefer-lodash-method:
    - error
  lodash/prefer-lodash-typecheck:
    - error
  lodash/prefer-matches:
    - error
    - 3
  lodash/prefer-noop:
    - error
  lodash/prefer-over-quantifier:
    - error
  lodash/prefer-startswith:
    - error
  lodash/prefer-times:
    - error

  # JSDoc

  jsdoc/check-param-names:
    - error
  jsdoc/check-tag-names:
    - error
  jsdoc/newline-after-description:
    - error
  jsdoc/require-example:
    - error
  jsdoc/require-hyphen-before-param-description:
    - error
  jsdoc/require-param:
    - error
  jsdoc/require-param-description:
    - error
  jsdoc/require-param-type:
    - error
  jsdoc/require-returns-type:
    - error

  # Node

  node/no-deprecated-api:
    - error
  node/no-missing-import:
    - error
  node/no-missing-require:
    - error
  node/process-exit-as-throw:
    - error
  node/no-extraneous-require:
    - error
  node/no-extraneous-import:
    - error

  # React

  react/jsx-uses-vars:
    - error

overrides:
  files: ['*.jsx']
  rules:
    require-jsdoc:
    - off
