{
    "plugins": [
        "@typescript-eslint",
        "you-dont-need-lodash-underscore",
        "eslint-plugin-simple-import-sort"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:you-dont-need-lodash-underscore/compatible-warn",
        "plugin:@typescript-eslint/recommended",
        "plugin:@typescript-eslint/recommended-requiring-type-checking",
        "prettier"
    ],
    "parserOptions": {
        "ecmaVersion": 2021,
        "warnOnUnsupportedTypeScriptVersion": false,
        "project": ["./tsconfig.lint.json"]
    },
    "rules": {
        "no-invalid-this": "off",
        "no-dupe-class-members": "off",
        "no-extra-boolean-cast": [
            "error",
            {
                "enforceForLogicalOperands": true
            }
        ],
        "no-unsafe-negation": [
            "error",
            {
                "enforceForOrderingRelations": true
            }
        ],
        "use-isnan": [
            "error",
            {
                "enforceForIndexOf": true
            }
        ],
        "valid-typeof": [
            "error",
            {
                "requireStringLiterals": true
            }
        ],
        "no-template-curly-in-string": "error",
        "no-useless-backreference": "error",
        "require-atomic-updates": "error",
        "accessor-pairs": "error",
        "array-callback-return": "error",
        "default-case": "error",
        "default-case-last": "error",
        "eqeqeq": ["error", "smart"],
        "grouped-accessor-pairs": ["error", "getBeforeSet"],
        "guard-for-in": "error",
        "no-alert": "error",
        "no-constructor-return": "error",
        "no-div-regex": "error",
        "no-else-return": "error",
        "no-eq-null": "error",
        "no-eval": "error",
        "no-extend-native": "error",
        "no-extra-bind": "error",
        "no-implicit-coercion": "error",
        "no-implicit-globals": "error",
        "no-labels": "error",
        "no-lone-blocks": "error",
        "no-loop-func": "error",
        "no-multi-str": "error",
        "no-new": "error",
        "no-new-func": "error",
        "no-new-wrappers": "error",
        "no-octal-escape": "error",
        "no-param-reassign": "error",
        "no-proto": "error",
        "no-redeclare": [
            "error",
            {
                "builtinGlobals": true
            }
        ],
        "no-return-assign": "error",
        "no-script-url": "error",
        "no-self-compare": "error",
        "no-sequences": "error",
        "no-unmodified-loop-condition": "error",
        "no-useless-call": "error",
        "no-useless-concat": "error",
        "no-useless-return": "error",
        "no-void": "error",
        "prefer-named-capture-group": "error",
        "prefer-promise-reject-errors": "error",
        "prefer-regex-literals": "error",
        "radix": "error",
        "require-unicode-regexp": "error",
        "no-undef-init": "error",
        "no-undefined": "error",
        "no-duplicate-imports": [
            "error",
            {
                "includeExports": true
            }
        ],
        "no-useless-computed-key": [
            "error",
            {
                "enforceForClassMembers": true
            }
        ],
        "no-useless-rename": "error",
        "no-var": "error",
        "object-shorthand": "error",
        "prefer-const": "error",
        "prefer-numeric-literals": "error",
        "prefer-rest-params": "error",
        "prefer-spread": "error",
        "prefer-template": "error",
        "symbol-description": "error",
        "no-ternary": "error",
        "simple-import-sort/imports": "error",
        "simple-import-sort/exports": "error",
        "@typescript-eslint/explicit-module-boundary-types": "error",
        "@typescript-eslint/prefer-namespace-keyword": "off",
        "@typescript-eslint/no-unused-vars": "off",
        "@typescript-eslint/require-await": "off",
        "@typescript-eslint/ban-ts-comment": [
            "error",
            {
                "ts-expect-error": false
            }
        ],
        "@typescript-eslint/explicit-member-accessibility": "error",
        "@typescript-eslint/no-floating-promises": [
            "error",
            {
                "ignoreVoid": false
            }
        ],
        "@typescript-eslint/restrict-plus-operands": [
            "error",
            {
                "checkCompoundAssignments": true
            }
        ],
        "@typescript-eslint/restrict-template-expressions": [
            "error",
            {
                "allowBoolean": true
            }
        ],
        "@typescript-eslint/unified-signatures": "error",
        "@typescript-eslint/array-type": "error",
        "@typescript-eslint/class-literal-property-style": "error",
        "@typescript-eslint/consistent-type-assertions": [
            "error",
            {
                "assertionStyle": "as",
                "objectLiteralTypeAssertions": "allow-as-parameter"
            }
        ],
        "@typescript-eslint/consistent-type-definitions": ["error", "interface"],
        "@typescript-eslint/explicit-function-return-type": [
            "error",
            {
                "allowExpressions": true
            }
        ],
        "@typescript-eslint/member-ordering": "error",
        "@typescript-eslint/method-signature-style": "error",
        "@typescript-eslint/no-base-to-string": "error",
        "@typescript-eslint/no-dynamic-delete": "error",
        "@typescript-eslint/no-extraneous-class": "error",
        "@typescript-eslint/no-invalid-void-type": "error",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-throw-literal": "error",
        "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
        "@typescript-eslint/no-unnecessary-condition": "error",
        "@typescript-eslint/no-unnecessary-qualifier": "error",
        "@typescript-eslint/no-unnecessary-type-arguments": "error",
        "@typescript-eslint/no-unused-vars-experimental": [
            "error",
            {
                "ignoreArgsIfArgsAfterAreUsed": true
            }
        ],
        "@typescript-eslint/prefer-for-of": "error",
        "@typescript-eslint/prefer-function-type": "error",
        "@typescript-eslint/prefer-includes": "error",
        "@typescript-eslint/prefer-nullish-coalescing": "error",
        "@typescript-eslint/prefer-optional-chain": "error",
        "@typescript-eslint/prefer-readonly": "error",
        "@typescript-eslint/prefer-reduce-type-parameter": "error",
        "@typescript-eslint/prefer-string-starts-ends-with": "error",
        "@typescript-eslint/prefer-ts-expect-error": "error",
        "@typescript-eslint/promise-function-async": "error",
        "@typescript-eslint/require-array-sort-compare": "error",
        "@typescript-eslint/strict-boolean-expressions": "error",
        "@typescript-eslint/switch-exhaustiveness-check": "error",
        "@typescript-eslint/default-param-last": "error",
        "@typescript-eslint/dot-notation": "error",
        "@typescript-eslint/lines-between-class-members": "error",
        "@typescript-eslint/no-dupe-class-members": "error",
        "@typescript-eslint/no-invalid-this": "error",
        "@typescript-eslint/no-unused-expressions": "error",
        "@typescript-eslint/no-use-before-define": "error",
        "@typescript-eslint/no-useless-constructor": "error",
        "@typescript-eslint/return-await": "error",
        "@typescript-eslint/no-confusing-non-null-assertion": "error",
        "@typescript-eslint/ban-tslint-comment": "error"
    },
    "overrides": [
        {
            "files": ["index.js"],
            "rules": {
                "@typescript-eslint/no-require-imports": "off"
            }
        },
        {
            "files": ["*.js"],
            "rules": {
                "@typescript-eslint/explicit-module-boundary-types": "off",
                "@typescript-eslint/explicit-member-accessibility": "off",
                "@typescript-eslint/explicit-function-return-type": "off",
                "@typescript-eslint/no-unsafe-assignment": "off",
                "@typescript-eslint/no-unsafe-member-access": "off",
                "@typescript-eslint/no-unsafe-return": "off",
                "@typescript-eslint/no-unsafe-call": "off",
                "@typescript-eslint/restrict-template-expressions": "off",
                "@typescript-eslint/strict-boolean-expressions": "off",
                "@typescript-eslint/prefer-readonly-parameter-types": "off",
                "@typescript-eslint/no-unnecessary-condition": "off",
                "@typescript-eslint/restrict-plus-operands": "off"
            }
        },
        {
            "files": ["*.json"],
            "rules": {
                "@typescript-eslint/no-unused-expressions": "off"
            }
        }
    ]
}
