{
  "env": {
    "node": true,
    "browser": false
  },
  "rules": {
    // 2-space indentation
    "indent": [2, 2, {"SwitchCase": 1}],
    // Require strings to use single quotes
    "quotes": [2, "single"],
    // Allow only unix line-endings
    "linebreak-style": [2, "unix"],
    // Always require semicolons
    "semi": [2, "always"],
    // Require curly braces for multi-line control statements
    "curly": [2, "multi-line"],
    // Always handle callback error cases
    "handle-callback-err": [2, "^err"],
    // Require JSDoc for all function definitions
    "valid-jsdoc": [2, {
      "requireReturn": false,
      "requireReturnDescription": false,
      "prefer": {
        "return": "returns"
      }
    }],
    "require-jsdoc": [2, {
      "require": {
        "FunctionDeclaration": true
      }
    }],
    "no-redeclare": [2, { "builtinGlobals": true }],
    "no-shadow": [2, { "builtinGlobals": true, "hoist": "all" }],
    // Disallow using variables before they've been defined
    // functions are ok
    "no-use-before-define": [2, "nofunc"],
    "no-shadow-restricted-names": 2,
    "no-extra-semi": 2,
    // Disallow unused variables
    "no-unused-vars": 2,
    "no-undef": 2,
    // Use if () { }
    //       ^ space
    "keyword-spacing": 2,
    // Use if () { }
    //          ^ space
    "space-before-blocks": [2, "always"],
    // eslint can't handle this, so the check is disabled.
    "key-spacing": 0,
    "strict": 0,
    // Do not force dot-notation
    "dot-notation": 0,
    "eol-last": 0,
    "no-new": 0,
    "semi-spacing": 0,
    // Allow multi spaces around operators since they are
    // used for alignment.  This is not consistent in the
    // code.
    "no-multi-spaces": 0,
    "eqeqeq": 0,
    "no-mixed-requires": 0,
    "no-console": 0
  }
}
