{
    "root": true,
    "plugins": ["import"],
    "extends": ["eslint:recommended"],
    "parserOptions": {
        "sourceType": "module",
        "allowImportExportEverywhere": true
    },
    "ignorePatterns": ["node_modules/*", "dist/*"],
    "env": { "browser": true, "es6": true, "node": true },
    "rules": {
        "generator-star-spacing": "off",
        "arrow-parens": "off",
        "one-var": "off",
        "no-console": "warn",
        "no-debugger": "warn",

        // Possible Errors
        "no-extra-parens": ["error", "all", { "returnAssign": false }],
        "import/first": "off",
        "import/named": "error",
        "import/namespace": "error",
        "import/default": "error",
        "import/export": "error",
        "import/extensions": "off",
        "import/no-unresolved": "off",
        "import/no-extraneous-dependencies": "off",
        "prefer-promise-reject-errors": "off",
        "template-curly-spacing": "off",

        // Best Practices
        "eqeqeq": "error",
        "no-invalid-this": "error",
        "no-return-assign": ["error", "except-parens"],
        "no-unused-expressions": ["error", { "allowTernary": true }],
        "no-useless-concat": "error",
        "no-useless-return": "error",

        // Variable
        "init-declarations": "error",
        "no-use-before-define": "error",

        // Stylistic Issues
        "array-bracket-newline": [
            "error",
            { "multiline": true, "minItems": null }
        ],
        "array-bracket-spacing": "error",
        "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
        "block-spacing": "error",
        "comma-dangle": "error",
        "comma-spacing": "error",
        "comma-style": "error",
        "computed-property-spacing": "error",
        "func-call-spacing": "error",
        "implicit-arrow-linebreak": ["error", "beside"],
        "indent": ["error", 2],
        "keyword-spacing": "error",
        "no-lonely-if": "error",
        "no-mixed-operators": "error",
        "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }],
        "no-tabs": "error",
        "no-unneeded-ternary": "error",
        "no-whitespace-before-property": "error",
        "nonblock-statement-body-position": "error",
        "object-property-newline": [
            "error",
            { "allowAllPropertiesOnSameLine": true }
        ],
        "quote-props": ["error", "consistent"],
        "quotes": ["error", "single"],
        "semi": ["error", "never"],
        "semi-spacing": "error",
        "space-before-blocks": "error",
        "space-before-function-paren": "error",
        "space-in-parens": "error",
        "space-infix-ops": "error",
        "space-unary-ops": "error",
        "padding-line-between-statements": [
            "error",
            { "blankLine": "always", "prev": "*", "next": "return" }
        ],

        // ES6
        "arrow-spacing": "error",
        "no-confusing-arrow": "error",
        "no-duplicate-imports": "error",
        "no-var": "error",
        "object-shorthand": "error",
        "prefer-const": "error",
        "prefer-template": "error"
    },
    "overrides": [
        {
            "files": ["**/*.ts", "**/*.tsx"],
            "extends": [
                "eslint:recommended",
                "plugin:@typescript-eslint/eslint-recommended",
                "plugin:@typescript-eslint/recommended"
            ],
            "parser": "@typescript-eslint/parser",
            "parserOptions": {
                "ecmaFeatures": { "jsx": true },
                "ecmaVersion": 2018,
                "sourceType": "module"
            },
            "plugins": ["@typescript-eslint"],
            "rules": {
                "indent": "off",
                "@typescript-eslint/no-explicit-any": "off",
                "@typescript-eslint/indent": ["error", 2]
            }
        }
    ]
}
