root: true
parser: espree
parserOptions:
  ecmaVersion: 8
  sourceType: module
  ecmaFeatures:
    globalReturn: false
    impliedStrict: true
    experimentalObjectRestSpread: true
    jsx: true
env:
  browser: true
  node: true
  commonjs: true
  es6: true
  worker: true
  serviceworker: true
rules:
  # About Errors
  for-direction: error
  getter-return: error
  no-async-promise-executor: error
  no-await-in-loop: off
  no-compare-neg-zero: error
  no-cond-assign:
    - error
    - always
  no-console: warn
  no-constant-condition: error
  no-control-regex: error
  no-debugger: error
  no-dupe-args: error
  no-dupe-keys: error
  no-duplicate-case: error
  no-empty:
    - error
    - allowEmptyCatch: false
  no-empty-character-class: error
  no-ex-assign: error
  no-extra-boolean-cast: error
  no-extra-parens:
    - error
    - all
  no-extra-semi: error
  no-func-assign: error
  no-inner-declarations:
    - error
    - both
  no-invalid-regexp:
    - error
    - allowConstructorFlags:
        - u
        - y
  no-irregular-whitespace:
    - error
    - skipStrings: true
      skipComments: true
      skipRegExps: true
      skipTemplates: true
  no-misleading-character-class: error
  no-obj-calls: error
  no-prototype-builtins: error
  no-regex-spaces: error
  no-sparse-arrays: error
  no-template-curly-in-string: error
  no-unexpected-multiline: error
  no-unreachable: error
  no-unsafe-finally: error
  no-unsafe-negation: error
  require-atomic-updates: error
  use-isnan: error
  valid-jsdoc: off
  valid-typeof: error

  # About Best Practices
  accessor-pairs:
    - error
    - setWithoutGet: true
      getWithoutSet: false
  array-callback-return: error
  block-scoped-var: error
  class-methods-use-this: error
  complexity: error
  consistent-return: off
  curly:
    - error
    - multi-line
    - consistent
  default-case: error
  dot-location:
    - error
    - property
  dot-notation: warn
  eqeqeq: error
  guard-for-in: error
  max-classes-per-file:
    - error
    - 1
  no-alert: error
  no-caller: error
  no-case-declarations: error
  no-div-regex: error
  no-else-return: error
  no-empty-function:
    - error
    - allow:
        - constructors
  no-empty-pattern: error
  no-eq-null: error
  no-eval: error
  no-extend-native: error
  no-extra-bind: error
  no-extra-label: error
  no-fallthrough: error
  no-floating-decimal: error
  no-global-assign: error
  no-implicit-coercion: error
  no-implicit-globals: error
  no-implied-eval: error
  no-invalid-this: error
  no-iterator: error
  no-labels: error
  no-lone-blocks: error
  no-loop-func: error
  no-magic-numbers: off
  no-multi-spaces: error
  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: warn
  no-proto: error
  no-redeclare: error
  no-restricted-properties: off
  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: error
  no-unused-expressions:
    - error
    - allowShortCircuit: true
      allowTernary: true
      allowTaggedTemplates: true
  no-unused-labels: error
  no-useless-call: error
  no-useless-concat: error
  no-useless-escape: error
  no-useless-return: error
  no-void: error
  no-warning-comments: warn
  no-with: error
  prefer-promise-reject-errors:
    - error
    - allowEmptyReject: true
  radix: error
  require-await: warn
  require-unicode-regexp: warn
  vars-on-top: off
  wrap-iife:
    - error
    - inside
    - functionPrototypeMethods: true
  yoda: error

  # About Strict Mode
  strict: warn

  # About Variables
  init-declarations: off
  no-delete-var: error
  no-label-var: error
  no-restricted-globals:
    - error
    - event
  no-shadow: warn
  no-shadow-restricted-names: error
  no-undef:
    - error
    - typeof: true
  no-undef-init: error
  no-undefined: off
  no-unused-vars:
    - error
    - ignoreRestSiblings: true
  no-use-before-define:
    - error
    - nofunc

  # About Node.js and CommonJS
  callback-return: warn
  global-require: off
  handle-callback-err:
    - error
    - ^(err|error)$
  no-buffer-constructor: error
  no-mixed-requires:
    - error
    - grouping: true
      allowCall: true
  no-new-require: error
  no-path-concat: error
  no-process-env: off
  no-process-exit: off
  no-restricted-modules: off
  no-sync: off

  # About Stylistic
  array-bracket-newline: off
  array-bracket-spacing:
    - error
    - never
  array-element-newline: off
  block-spacing:
    - error
    - always
  brace-style:
    - error
    - 1tbs
    - allowSingleLine: true
  camelcase: error
  capitalized-comments: off
  comma-dangle:
    - error
    - always-multiline
  comma-spacing: error
  comma-style: error
  computed-property-spacing: error
  consistent-this: off
  eol-last: error
  func-call-spacing: error
  func-name-matching: error
  func-names:
    - error
    - never
  func-style: off
  function-paren-newline: off
  id-blacklist: off
  id-length: off
  id-match: off
  implicit-arrow-linebreak: off
  indent:
    - error
    - tab
    - SwitchCase: 1
      FunctionDeclaration:
        parameters: 1
      FunctionExpression:
        parameters: 1
  jsx-quotes: error
  key-spacing: error
  keyword-spacing: error
  line-comment-position: off
  linebreak-style: warn
  lines-around-comment: off
  lines-between-class-members: off
  max-depth: warn
  max-len:
    - warn
    - code: 160
      tabWidth: 2
      ignoreComments: true
      ignoreUrls: true
      ignoreTemplateLiterals: true
  max-lines:
    - warn
    - max: 800
  max-lines-per-function:
    - warn
    - max: 200
  max-nested-callbacks:
    - warn
    - 4
  max-params:
    - warn
    - 4
  max-statements:
    - warn
    - max: 20
  max-statements-per-line:
    - warn
    - max: 1
  multiline-comment-style: off
  multiline-ternary: off
  new-cap: error
  new-parens: error
  newline-per-chained-call: off
  no-array-constructor: error
  no-bitwise: off
  no-continue: off
  no-inline-comments: off
  no-lonely-if: error
  no-mixed-operators: off
  no-mixed-spaces-and-tabs: error
  no-multi-assign: error
  no-multiple-empty-lines:
    - error
    - max: 1
  no-negated-condition: error
  no-nested-ternary: off
  no-new-object: error
  no-plusplus: off
  no-restricted-syntax:
    - error
    - WithStatement
  no-tabs: off
  no-ternary: off
  no-trailing-spaces: error
  no-underscore-dangle: off
  no-unneeded-ternary: error
  no-whitespace-before-property: error
  nonblock-statement-body-position: off
  object-curly-newline: off
  object-curly-spacing: off
  object-property-newline:
    - error
    - allowMultiplePropertiesPerLine: true
  one-var: off
  one-var-declaration-per-line: error
  operator-assignment: error
  operator-linebreak:
    - error
    - after
    - overrides:
        '?': before
        ':': before
        '&&': ignore
        '||': ignore
  padded-blocks:
    - error
    - never
  padding-line-between-statements: off
  prefer-object-spread: off
  quote-props:
    - error
    - as-needed
  quotes:
    - error
    - single
    - avoidEscape: true
      allowTemplateLiterals: true
  require-jsdoc: off
  semi: error
  semi-spacing: error
  semi-style:
    - error
    - last
  sort-keys: off
  sort-vars: off
  space-before-blocks: error
  space-before-function-paren:
    - error
    - anonymous: always
      named: never
      asyncArrow: always
  space-in-parens: error
  space-infix-ops: error
  space-unary-ops:
    - error
    - words: true
      nonwords: false
  spaced-comment: off
  switch-colon-spacing: error
  template-tag-spacing: error
  unicode-bom: error
  wrap-regex: off

  # About ES6
  arrow-body-style: off
  arrow-parens:
    - warn
    - as-needed
  arrow-spacing: error
  constructor-super: error
  generator-star-spacing:
    - error
    - both
  no-class-assign: error
  no-confusing-arrow: off
  no-const-assign: error
  no-dupe-class-members: error
  no-duplicate-imports: error
  no-new-symbol: error
  no-restricted-imports: off
  no-this-before-super: error
  no-useless-computed-key: error
  no-useless-constructor: error
  no-useless-rename: error
  no-var: error
  object-shorthand: warn
  prefer-arrow-callback: warn
  prefer-const: error
  prefer-destructuring:
    - warn
    - VariableDeclarator:
        array: false
        object: true
      AssignmentExpression:
        array: false
        object: false
    - enforceForRenamedProperties: false
  prefer-numeric-literals: off
  prefer-rest-params: warn
  prefer-spread: error
  prefer-template: warn
  require-yield: error
  rest-spread-spacing: error
  sort-imports: off
  symbol-description: error
  template-curly-spacing: error
  yield-star-spacing:
    - error
    - both
