# https://eslint.org/
env: # https://eslint.org/docs/user-guide/configuring#specifying-environments
  es6: true
  node: true
extends:
- eslint:recommended
- plugin:@typescript-eslint/eslint-recommended
- plugin:@typescript-eslint/recommended
plugins:
- "@typescript-eslint"
parser: "@typescript-eslint/parser"
parserOptions:
  sourceType: module
  project: ./tsconfig.json
rules: # https://eslint.org/docs/rules/
  accessor-pairs: error
  array-bracket-newline:
  - error
  - consistent
  array-bracket-spacing:
  - error
  - never
  array-callback-return: error
  arrow-body-style: 'off'
  arrow-parens:
  - error
  - always
  arrow-spacing:
  - error
  - after: true
    before: true
  block-scoped-var: error
  block-spacing: error
  brace-style: 'off' # see "@typescript-eslint/brace-style"
  callback-return: error
  capitalized-comments: 'off'
  class-methods-use-this: error
  comma-dangle:
  - error
  - always-multiline
  comma-spacing:
  - error
  - after: true
    before: false
  comma-style:
  - error
  - last
  complexity:
  - error
  computed-property-spacing:
  - error
  - never
  consistent-return: 'off'
  consistent-this: error
  curly: error
  default-case: 'off'
  dot-location:
  - error
  - property
  dot-notation:
  - error
  - allowPattern: "^_"
  eol-last: error
  eqeqeq: error
  for-direction: error
  func-call-spacing: error
  func-name-matching: error
  func-names:
  - error
  - never
  func-style:
  - error
  - declaration
  function-paren-newline:
  - error
  - multiline-arguments
  generator-star-spacing: error
  getter-return: error
  global-require: error
  guard-for-in: error
  handle-callback-err: error
  id-blacklist: error
  id-length: error
  id-match: error
  implicit-arrow-linebreak:
  - error
  - below
  indent:
  - error
  - 4
  - SwitchCase: 1
  indent-legacy: 'off'
  init-declarations: error
  jsx-quotes: error
  key-spacing: error
  keyword-spacing:
  - error
  line-comment-position: 'off'
  linebreak-style:
  - error
  - unix
  lines-around-comment: 'off'
  lines-around-directive: error
  lines-between-class-members:
  - error
  - always
  - exceptAfterSingleLine: true
  max-depth: error
  max-len: 'off'
  max-lines: 'off'
  max-nested-callbacks: error
  max-params: 'off'
  max-statements: 'off'
  max-statements-per-line: error
  multiline-comment-style:
  - error
  - separate-lines
  multiline-ternary: error
  new-cap: error
  new-parens: error
  newline-after-var: 'off'
  newline-before-return: 'off'
  no-alert: error
  no-array-constructor: error
  no-await-in-loop: error
  no-bitwise: error
  no-buffer-constructor: error
  no-caller: error
  no-catch-shadow: error
  no-confusing-arrow: error
  no-continue: 'off'
  no-div-regex: error
  no-duplicate-imports: error
  no-else-return: 'off'
  no-empty-function: 'off'
  no-eq-null: error
  no-eval: error
  no-extend-native: error
  no-extra-bind: error
  no-extra-label: error
  no-extra-parens: error
  no-extra-semi: error
  no-floating-decimal: error
  no-implicit-coercion: error
  no-implicit-globals: error
  no-implied-eval: error
  no-inline-comments: 'off'
  no-invalid-this: error
  no-iterator: error
  no-label-var: error
  no-labels: error
  no-lonely-if: error
  no-loop-func: error
  no-magic-numbers: 'off'
  no-mixed-operators: error
  no-mixed-requires: error
  no-multi-assign: error
  no-multi-spaces: error
  no-multi-str: error
  no-multiple-empty-lines:
  - error
  - max: 1
  no-native-reassign: error
  no-negated-condition: 'off'
  no-negated-in-lhs: error
  no-nested-ternary: error
  no-new: error
  no-new-func: error
  no-new-object: error
  no-new-require: error
  no-new-wrappers: error
  no-octal-escape: error
  no-param-reassign: 'off'
  no-path-concat: error
  no-plusplus: 'off'
  no-process-env: 'off'
  no-process-exit: error
  no-proto: error
  no-prototype-builtins: 'off'
  no-restricted-globals: error
  no-restricted-imports: error
  no-restricted-modules: error
  no-restricted-properties: error
  no-restricted-syntax: error
  no-return-assign: error
  no-return-await: error
  no-script-url: error
  no-self-compare: error
  no-sequences: error
  no-shadow: error
  no-shadow-restricted-names: error
  no-spaced-func: error
  no-sync: 'off'
  no-tabs: 'off'
  no-template-curly-in-string: error
  no-ternary: error
  no-throw-literal: error
  no-trailing-spaces: error
  no-undef-init: error
  no-undefined: 'off'
  no-underscore-dangle: 'off'
  no-unmodified-loop-condition: error
  no-unneeded-ternary: error
  no-unused-expressions: error
  no-use-before-define: 'off'
  no-useless-call: error
  no-useless-computed-key: error
  no-useless-concat: error
  no-useless-constructor: error
  no-useless-rename: error
  no-useless-return: error
  no-var: error
  no-void: error
  no-warning-comments: error
  no-whitespace-before-property: error
  no-with: error
  nonblock-statement-body-position: error
  object-curly-newline: 'off'
  object-curly-spacing:
  - error
  - never
  object-property-newline: error
  object-shorthand: 'off'
  one-var: 'off'
  one-var-declaration-per-line: error
  operator-assignment: error
  operator-linebreak: error
  padded-blocks: 'off'
  padding-line-between-statements: error
  prefer-arrow-callback: error
  prefer-const: error
  prefer-destructuring: error
  prefer-numeric-literals: error
  prefer-promise-reject-errors: error
  prefer-reflect: error
  prefer-rest-params: error
  prefer-spread: error
  prefer-template: error
  quote-props: 'off'
  quotes: 'off'
  radix: error
  require-await: error
  require-jsdoc: error
  rest-spread-spacing:
  - error
  - never
  semi: 'off' # see "@typescript-eslint/semi"
  semi-spacing: error
  semi-style:
  - error
  - last
  sort-imports:
  - error
  - ignoreCase: false
    ignoreDeclarationSort: true
  sort-keys: 'off'
  sort-vars: error
  space-before-blocks: error
  space-before-function-paren: 'off'
  space-in-parens:
  - error
  - never
  space-infix-ops: error
  space-unary-ops: error
  spaced-comment:
  - error
  - always
  strict: error
  switch-colon-spacing: error
  symbol-description: error
  template-curly-spacing:
  - error
  - never
  template-tag-spacing: error
  unicode-bom:
  - error
  - never
  valid-jsdoc:
  - error
  - prefer:
      arg: param
      argument: param
      return: returns
      yield: yields
      exception: throws
    requireReturn: false
    requireParamType: false
    requireReturnType: false
  vars-on-top: error
  wrap-iife: error
  wrap-regex: error
  yield-star-spacing: error
  yoda:
  - error
  - never

  # @typescript-eslint plugin
  "@typescript-eslint/ban-ts-ignore": 'off'
  "@typescript-eslint/brace-style":
  - error
  - 1tbs
  "@typescript-eslint/member-delimiter-style":
  - error
  - multiline:
      delimiter: semi
      requireLast: true
    singleline:
      delimiter: semi
      requireLast: true
  "@typescript-eslint/no-empty-interface": 'off'
  "@typescript-eslint/no-floating-promises": error
  "@typescript-eslint/no-use-before-define":
  - error
  - functions: false
  "@typescript-eslint/semi": error
  "@typescript-eslint/strict-boolean-expressions":
  - error
  - allowString: false
    allowNumber: false
    allowNullableObject: false
