root: true
env:
  browser: true
  es6: true
extends:
  - 'eslint:recommended'
  - 'plugin:@typescript-eslint/recommended'
  - 'plugin:jest/recommended'
  - 'plugin:prettier/recommended'
  - 'plugin:jest-dom/recommended'
globals:
  Atomics: readonly
  SharedArrayBuffer: readonly
parser: '@typescript-eslint/parser'
parserOptions:
  ecmaVersion: 2018
  sourceType: module
  project:
    - './tsconfig.json'
ignorePatterns: # mirrors tsconfig.json's exclude
    - '**/__tests__'
    - '**/*.d.ts'
plugins:
  - '@typescript-eslint'
  - prettier
  - jest-dom
  - unicorn
rules:
  "@typescript-eslint/explicit-function-return-type":
    - off
  "@typescript-eslint/no-explicit-any":
    - off
  "@typescript-eslint/explicit-module-boundary-types":
    - error

  default-case:
    - error
  indent:
    - error
    - 2
    - SwitchCase: 1
  linebreak-style:
    - error
    - unix
  quotes:
    - error
    - double
    - avoid-escape
  semi:
    - error
    - always
  dot-location:
    - error
    - property

  camelcase:
    # - error
    - "off"

  unicorn/filename-case:
    - error
    - case: camelCase

  "@typescript-eslint/array-type":
    - error
    - default: array-simple
      readonly: array-simple

  "@typescript-eslint/consistent-indexed-object-style":
    - error
    - index-signature

  "@typescript-eslint/sort-type-union-intersection-members":
    - error

  "@typescript-eslint/consistent-type-imports":
    - error

  "@typescript-eslint/no-floating-promises":
    - error

  "@typescript-eslint/naming-convention":
    - error

    - selector: default
      format: [camelCase]

    - selector: method
      modifiers: [private]
      format: [camelCase]
      leadingUnderscore: require
    - selector: method
      modifiers: [protected]
      format: [camelCase]
      leadingUnderscore: require

    - selector: variable
      format: [camelCase]
      trailingUnderscore: forbid
      leadingUnderscore: forbid

    - selector: parameter
      format: [camelCase]
      trailingUnderscore: allow
      leadingUnderscore: forbid

    - selector: [enum, enumMember]
      format: [PascalCase]

    - selector: typeLike
      format: [PascalCase]
      custom:
        regex: "(t|T)ype$"
        match: false
