{
    "env": {
        "browser": true,
        "node": true,
        "commonjs": false,
        "shared-node-browser": false,
        "es6": true,
        "worker": false,
        "amd": false,
        "mocha": true,
        "jasmine": false,
        "jest": false,
        "phantomjs": false,
        "protractor": false,
        "qunit": false,
        "jquery": false,
        "prototypejs": false,
        "shelljs": false,
        "meteor": false,
        "mongo": false,
        "applescript": false,
        "nashorn": false,
        "serviceworker": false,
        "atomtest": false,
        "embertest": false,
        "webextensions": false,
        "greasemonkey": false
    },
    "root": true,
    "parser": "@typescript-eslint/parser",
    "extends": ["eslint:recommended", "plugin:mocha/recommended", "plugin:@typescript-eslint/recommended"],
    "plugins": ["@typescript-eslint", "mocha"],
    "parserOptions": {
        "sourceType": "module",
        "allowImportExportEverywhere": true,
        "ecmaVersion": 2021,
        "ecmaFeatures": {
            "impliedStrict": true
        }
    },
    "rules": {
        // Enforcing
        "indent": ["error", 2],
        "block-spacing": ["error", "never"],
        "keyword-spacing": ["error", {"before": true, "after": true}],
        "no-multi-spaces": ["error"],
        "linebreak-style": ["error", "unix"],
        "quotes": ["error", "single"],
        "semi": ["error", "always"],
        "no-bitwise": ["error"],
        "camelcase": ["off"],
        "curly": ["error"],
        "eqeqeq": ["error"],
        "guard-for-in": ["error"],
        "wrap-iife": ["error"],
        "no-use-before-define": ["off"],
        "new-cap": ["error", { "properties": false }],
        "no-caller": ["error"],
        "no-empty": ["error"],
        "no-new": ["error"],
        "no-plusplus": ["off"],
        "no-undef": ["error"],
        "no-unused-vars": ["off"],
        "max-params": ["error", 10],
        "max-depth": ["error", 5],
        "max-statements": ["error", 40],
        "complexity": ["error", 8],
        "max-len": ["error", {"code": 120, "comments": 140}],
        "no-var": ["off"],

        // Relaxing
        "no-debugger": ["error"],
        "no-eq-null": ["error"],
        "no-eval": ["error"],
        "no-iterator": ["error"],
        "no-loop-func": ["off"],
        "no-multi-str": ["error"],
        "require-yield": ["error"],
        "valid-typeof": ["error"],
        "no-proto": ["error"],
        "no-script-url": ["error"],
        "no-shadow": ["error"],
        "dot-notation": ["error"],
        "no-new-func": ["error"],
        "no-new-object": ["error"],
        "mocha/no-mocha-arrows": ["off"],
        "mocha/no-setup-in-describe": ["off"],
        "mocha/no-hooks-for-single-case": ["off"],
        "prefer-const": "off",

        // Required by TypeScript
        "no-empty-function": "off",

        // TypeScript
        "@typescript-eslint/no-unused-vars": "off",
        "@typescript-eslint/no-empty-function": ["error", {"allow": ["arrowFunctions", "methods", "asyncMethods"]}],
        "@typescript-eslint/ban-types": ["error", {
            "types": {"{}": false, "Function": false, "Object": false},
            "extendDefaults": true
        }],
        "@typescript-eslint/no-namespace": "off",
        "@typescript-eslint/no-var-requires": "off",
        "@typescript-eslint/no-explicit-any": "off",
        "@typescript-eslint/no-shadow": "error"
    },
    // Custom Globals
    "globals": {
      "require"  : false,
      "module"   : false,
      "Promise"  : false,
      "GLOBAL"   : false,
      "angular"  : false,
      "moment"   : false,
      "inject"   : false,
      "config"   : false,
      "spyOn"    : false,
      "mock"     : false,
      "expect"   : false,
      "$"        : false,
      "sinon"    : false,
      "NodeJS"   : true
    },        // additional predefined global variables
    "overrides": [
        {
            "files": ["*.ts"],
            "rules": {
                "semi": "off",
                "no-shadow": "off",
                "no-undef": "off"
            }
        }
    ]
}
