{
  "root" : true,
  "env": {
    "browser" : false,
    "es6"     : true,
    "node"    : true,
    "mocha"   : true
  },
  "plugins" : [],
  "extends": "eslint:recommended",
  "rules": {
    "one-var"                       : [ "warn" , "never"     ], // Disallow declaration of multiple var in one line
    "space-before-blocks"           : [ "warn" , "always"    ], // Enforce space before {}
    "space-before-function-paren"   : [ "warn" , "always"    ], // Enforce space before parenthesis of named function
    "spaced-comment"                : [ "warn" , "always"    ], // Enforce space at the start of comments
    "linebreak-style"               : [ "warn" , "unix"      ], // Use \n as breakline character
    "quote-props"                   : [ "warn" , "as-needed" ], // Only use quotes around properties if key is not ES valid
    "brace-style"                   : [ "warn" , "stroustrup"], // Enforce opening bracket at the end of the line
    "semi"                          : [ "error", "always"    ], // Enforce semi-colon ath end of statements
    "eqeqeq"                        : [ "error", "always"    ], // Enforce usage of === instead of ==
    "dot-location"                  : [ "error", "property"  ], // Enforce the dot be linked to the property instead of the parent
    "curly"                         : [ "error", "all"       ], // Enforce usage of brackets everywhere
    "quotes"                        : [ "error", "single"  , { "avoidEscape": true} ], // Enforce usage of single quotes instead of double
    "no-cond-assign"                : [ "error", "always"    ], // Disallow assignment in condition
    "no-dupe-args"                  :   "error",                // Disallow duplicated arguments in function
    "no-dupe-keys"                  :   "error",                // Disallow duplicated keys in object
    "no-duplicate-case"             :   "error",                // Disallow duplicated case in switch
    "no-empty"                      :   "error",                // Disallow empty blocks
    "no-ex-assign"                  :   "error",                // Disallow reassigning exceptions in catch
    "no-func-assign"                :   "error",                // Disallow reassigning function
    "no-trailing-spaces"            :   "error",
    "no-unused-vars"                :   "error",                // Disallow unused variables
    "no-unreachable"                :   "error",                // Disallow unreachable code
    "array-callback-return"         :   "error",                // Enforce return statements in array functions
    "dot-notation"                  :   "error",                // Enforce dot notation over square brackets
    "block-scoped-var"              :   "error",                // Treat var as Block Scoped (block-scoped-var), why not using "let"? because "let" is 10 times slower than "var"
    "no-sparse-arrays"              :   "warn",                 // Enforce empty slots at the end of array declaration
    "no-irregular-whitespace"       :   "warn",                 // Enforce usage of whitespace
    "camelcase"                     :   "warn",                 // Enforce usage of CamelCase over snake_case
    "no-whitespace-before-property" :   "warn",                 // Disallow whitespace before property
    "indent"                        : [ "warn" , 2, { "SwitchCase"          : 1,
                                                      "MemberExpression"    : 1 }],           // Indent with 2 spaces
    "no-console"                    : [ "error", { "allow"   : [ "warn", "error", "log"] } ], // Disallow console usage for other than warn, error or log
    "keyword-spacing"               : [ "warn" , { "before"  : true, "after" : true }],       // Enforce whitespace before and after keywords
    "max-statements-per-line"       : [ "warn" , { "max"     : 1 }  ],                        // Disallow multiple statements per line
    "key-spacing"                   : [ "warn" , { "beforeColon" : true,
                                                   "afterColon"  : true,
                                                   "align"       : "colon",
                                                   "mode"        : "strict" }]                // Enforce whitespace before and after colon in object
  }
}
