{
  "env": {
    "browser": true,
    "commonjs": true,
    "es2021": true,
    "node": true,
    "jest": true
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": "tsconfig.json",
    "sourceType": "module"
  },
  "plugins": [
    "import"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended"
  ],
  "rules": {
    "linebreak-style": ["error", "unix"],
    "no-empty": 1,
    "no-useless-catch": 1,
    "no-prototype-builtins": 1,
    "no-constant-condition": 0,
    "no-useless-escape": 0,
    "no-console": "error",
    "no-restricted-globals": [
      "error",
      {
        "name": "global",
        "message": "Use `globalThis` instead"
      },
      {
        "name": "window",
        "message": "Use `globalThis` instead"
      }
    ],
    "require-yield": 0,
    "eqeqeq": ["error", "smart"],
    "spaced-comment": [
      "warn",
      "always",
      {
        "line": {
          "exceptions": ["-"]
        },
        "block": {
          "exceptions": ["*"]
        },
        "markers": ["/"]
      }
    ],
    "capitalized-comments": [
      "warn",
      "always",
      {
        "ignoreInlineComments": true,
        "ignoreConsecutiveComments": true
      }
    ],
    "curly": [
      "error",
      "multi-line",
      "consistent"
    ],
    "import/order": [
      "error",
      {
        "groups": [
          "type",
          "builtin",
          "external",
          "internal",
          "index",
          "sibling",
          "parent",
          "object"
        ],
        "pathGroups": [
          {
            "pattern": "@",
            "group": "internal"
          },
          {
            "pattern": "@/**",
            "group": "internal"
          }
        ],
        "pathGroupsExcludedImportTypes": [
          "type"
        ],
        "newlines-between": "never"
      }
    ],
    "@typescript-eslint/no-namespace": 0,
    "@typescript-eslint/no-explicit-any": 0,
    "@typescript-eslint/explicit-module-boundary-types": 0,
    "@typescript-eslint/no-unused-vars": [
      "warn",
      {
        "varsIgnorePattern": "^_",
        "argsIgnorePattern": "^_"
      }
    ],
    "@typescript-eslint/no-inferrable-types": 0,
    "@typescript-eslint/no-non-null-assertion": 0,
    "@typescript-eslint/no-this-alias": 0,
    "@typescript-eslint/no-var-requires": 0,
    "@typescript-eslint/no-empty-function": 0,
    "@typescript-eslint/no-empty-interface": 0,
    "@typescript-eslint/consistent-type-imports": ["error"],
    "@typescript-eslint/consistent-type-exports": ["error"],
    "no-throw-literal": "off",
    "@typescript-eslint/no-throw-literal": "off",
    "@typescript-eslint/no-floating-promises": ["error", {
      "ignoreVoid": true,
      "ignoreIIFE": true
    }],
    "@typescript-eslint/no-misused-promises": ["error", {
      "checksVoidReturn": false
    }],
    "@typescript-eslint/await-thenable": ["error"],
    "@typescript-eslint/naming-convention": [
      "error",
      {
        "selector": "default",
        "format": ["camelCase"],
        "leadingUnderscore": "allow",
        "trailingUnderscore": "allowSingleOrDouble"
      },
      {
        "selector": "function",
        "format": ["camelCase", "PascalCase"],
        "leadingUnderscore": "allow",
        "trailingUnderscore": "allowSingleOrDouble"
      },
      {
        "selector": "variable",
        "format": ["camelCase", "UPPER_CASE", "PascalCase"],
        "leadingUnderscore": "allow",
        "trailingUnderscore": "allowSingleOrDouble"
      },
      {
        "selector": "parameter",
        "format": ["camelCase"],
        "leadingUnderscore": "allow",
        "trailingUnderscore": "allowSingleOrDouble"
      },
      {
        "selector": "typeLike",
        "format": ["PascalCase"],
        "trailingUnderscore": "allowSingleOrDouble"
      },
      {
        "selector": "enumMember",
        "format": ["PascalCase", "UPPER_CASE"]
      },
      {
        "selector": "objectLiteralProperty",
        "format": null
      },
      {
        "selector": "typeProperty",
        "format": null
      }
    ],
    "@typescript-eslint/ban-ts-comment": [
      "error",
      {
        "ts-ignore": "allow-with-description"
      }
    ]
  }
}