{
    "extends": "eslint:recommended",
    "env": {
        "es6": true,
        "node": true,
        "browser": true,
        "mocha": true
    },
    "globals": {
        "window": false,
        "document": false,
        "$": false,
        "System": false,
        "expect": false
    },
    "plugins": [
    ],
    "rules": {
        "accessor-pairs": "error",
        "arrow-spacing": "error",
        "brace-style": [ "error", "1tbs", { "allowSingleLine": true } ],
        "camelcase": [ "error", { "properties": "never" } ],
        "comma-spacing": ["error", { "before": false, "after": true }],
        "curly": [ "error", "all" ],
        "dot-notation": "error",
        "eol-last": ["error", "always"],
        "eqeqeq": ["error", "always"],
        "indent": ["error", 4, { "MemberExpression": "off", "SwitchCase": 1, "ObjectExpression": "first" } ],
        "key-spacing": [ "error", { "beforeColon": false, "afterColon": true, "mode": "minimum" } ],
        "keyword-spacing": [ "error", {} ],
        "no-cond-assign": "error",
        "no-console": ["error", { "allow": ["warn", "error"] }],
        "no-constant-condition": ["error", { "checkLoops": false }],
        "no-eval": "error",
        "no-mixed-spaces-and-tabs": "error",
        "no-multiple-empty-lines": "error",
        "no-prototype-builtins": "off",
        "no-restricted-globals": ["error", "event"],
        "no-restricted-syntax": [
            "error",
            {
                "selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='sort']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression']):not([callee.object.name='mongoUtil'])",
                "message": "Restricted Array Mutation: Use `array.slice().sort(...)` if mutation was not intended, otherwise place on own line."
            },
            {
                "selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='reverse']:not([callee.object.type='CallExpression']):not([callee.object.type='ArrayExpression'])",
                "message": "Restricted Array Mutation: Use `array.slice().reverse(...)` if mutation was not intended, otherwise place on own line."
            },
            {
                "selector": "*:not(ExpressionStatement) > CallExpression[callee.property.name='push']",
                "message": "Restricted Array Mutation: `array.push(...)` returns push count, not array reference, place statement on own line."
            }
        ],
        "no-return-assign": "error",
        "no-trailing-spaces": "error",
        "no-undef": "error",
        "no-unused-expressions": "error",
        "no-unused-vars": ["error", { "vars": "all", "args": "none", "varsIgnorePattern": "^sinonAsPromised$|^debug$|^log$" }],
        "no-use-before-define": [ "error", { "functions": false } ],
        "no-useless-escape": "off",
        "no-with": "error",
        "padding-line-between-statements": [
            "error",
            { "blankLine": "always", "prev": "*", "next": "function" }
        ],
        "semi": [ "error", "always" ],
        "space-before-blocks": [ "error", "always" ],
        "space-before-function-paren": [ "error", { "anonymous": "always", "named": "never", "asyncArrow": "always" } ],
        "space-in-parens": [ "error", "never" ],
        "space-infix-ops": "error",
        "space-unary-ops": [ "error", { "nonwords": false, "overrides": {} } ],
        "spaced-comment": [ "error", "always", {"block": {"exceptions": ["*", "!"], "balanced": true}} ]
    }
}
