{
    "root": true,
    "env": {
        "browser": true,
        "es2019": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/recommended",
        "plugin:@typescript-eslint/strict",
        "plugin:@typescript-eslint/strict-type-checked",
        "prettier"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaFeatures": {},
        "ecmaVersion": 13,
        "sourceType": "module",
        "project": "./tsconfig.json"
    },
    "plugins": [
        "@typescript-eslint"
    ],
    "rules": {
        // possible problems
        "array-callback-return": "error",
        "no-await-in-loop": "off",
        "no-constant-binary-expression": "error",
        "no-constructor-return": "error",
        "no-constant-condition": "off",
        "no-duplicate-imports": "error",
        "no-new-native-nonconstructor": "error",
        "no-self-compare": "error",
        "no-template-curly-in-string": "error",
        "no-unmodified-loop-condition": "error",
        "no-unreachable-loop": "error",
        "no-unused-private-class-members": "error",
        "no-unused-vars": [
            "off",
            {
                "argsIgnorePattern": "^_"
            }
        ],
        "no-use-before-define": "off",
        "require-atomic-updates": "error",
        // suggestions
        "accessor-pairs": "error",
        "arrow-body-style": "error",
        "block-scoped-var": "error",
        "camelcase": "off",
        "class-methods-use-this": "error",
        "complexity": "off",
        "consistent-return": "error",
        "consistent-this": "error",
        "curly": "error",
        "default-case": "off",
        "default-case-last": "off",
        "default-param-last": "error",
        "dot-notation": "off",
        "eqeqeq": ["error", "smart"],
        "func-name-matching": "error",
        "func-names": ["error", "always"],
        "func-style": ["error", "declaration"],
        "grouped-accessor-pairs": "error",
        "guard-for-in": "error",
        "id-denylist": "off",
        "id-length": "off",
        "id-match": "off",
        "init-declarations": "off",
        "@typescript-eslint/init-declarations": ["error", "always"],
        "logical-assignment-operators": ["error", "always"],

        "prefer-spread": "off",

        "no-unused-labels": "error",
        "no-labels": "off",
        "no-empty-pattern": "off",
        "no-inner-declarations": "off",
        "no-extra-label": "off",

        "radix": "error",
        "require-await": "off",

        // Layout & Formatting
        "line-comment-position": ["error", { "position": "above" }],

        "@typescript-eslint/no-unused-vars": "off",
        "@typescript-eslint/no-explicit-any": "off",
        "@typescript-eslint/no-empty-interface": "off",
        "@typescript-eslint/ban-types": "error",
        "@typescript-eslint/no-non-null-assertion": "off",
        "@typescript-eslint/no-var-requires": "off",
        "@typescript-eslint/no-unsafe-assignment": "off",
        "@typescript-eslint/no-unnecessary-condition": "off",
        "@typescript-eslint/no-unsafe-member-access": "off",
        "@typescript-eslint/no-unsafe-call": "off",
        "@typescript-eslint/no-unsafe-argument": "off",
        "@typescript-eslint/consistent-type-assertions": ["error", { "assertionStyle": "as", "objectLiteralTypeAssertions": "allow" }],
        "@typescript-eslint/no-unsafe-return": "off",
        "@typescript-eslint/prefer-promise-reject-errors": "off",
        "@typescript-eslint/unified-signatures": "off"
    }
}
