{
  "rules": {
    // common
    "indent": [2, 2, {"SwitchCase": 1}], // specify tab or space width for your code
    "quotes": [2, "double"], // specify whether backticks, double or single quotes should be used
    "linebreak-style": [2, "unix"], // disallow mixed 'LF' and 'CRLF' as linebreaks
    "semi": [2, "always"], // require or disallow use of semicolons instead of ASI
    // errors
    "no-extra-parens": [2, "functions"], // disallow unnecessary parentheses
    "no-unexpected-multiline": [2], // Avoid code that looks like two expressions but is actually one
    "valid-jsdoc": [0], // Ensure JSDoc comments are valid
    // best practices
    "accessor-pairs": [0], // Enforces getter/setter pairs in objects
    "block-scoped-var": [2], // treat var statements as if they were block scoped
    "complexity": [0], // specify the maximum cyclomatic complexity allowed in a program
    "consistent-return": [2], // require return statements to either always or never specify values
    "curly": [2, "all"], // specify curly brace conventions for all control statements
    "default-case": [2], // require default case in switch statements
    "dot-notation": [2], // encourages use of dot notation whenever possible
    "dot-location": [2, "property"], // enforces consistent newlines before or after dots
    "eqeqeq": [2, "smart"], // require the use of === and !==
    "guard-for-in": [2], // make sure for-in loops have an if statement
    "no-alert": [2], // disallow the use of alert, confirm, and prompt
    "no-caller": [2], // disallow use of arguments.caller or arguments.callee
    "no-div-regex": [0], // disallow division operators explicitly at beginning of regular expression
    "no-else-return": [0], // disallow else after a return in an if
    "no-eq-null": [2], // disallow comparisons to null without a type-checking operator
    "no-eval": [2], // disallow use of eval()
    "no-extend-native": [2], // disallow adding to native types
    "no-extra-bind": [2], // disallow unnecessary function binding
    "no-fallthrough": [2], // disallow fallthrough of case statements (recommended)
    "no-floating-decimal": [2], // disallow the use of leading or trailing decimal points in numeric literals
    "no-implicit-coercion": [0], // disallow the type conversions with shorter notations
    "no-implied-eval": [2], // disallow use of eval()-like methods
    "no-invalid-this": [0], // disallow this keywords outside of classes or class-like objects
    "no-iterator": [2], // disallow usage of __iterator__ property
    "no-labels": [2], // disallow use of labeled statements
    "no-lone-blocks": [2], // disallow unnecessary nested blocks
    "no-loop-func": [2], // disallow creation of functions within loops
    "no-multi-spaces": [2], // disallow use of multiple spaces
    "no-multi-str": [2], // disallow use of multiline strings
    "no-native-reassign": [2], // disallow reassignments of native objects
    "no-new-func": [2], // disallow use of new operator for Function object
    "no-new-wrappers": [0], // disallows creating new instances of String,Number, and Boolean
    "no-new": [2], // disallow use of the new operator when not part of an assignment or comparison
    "no-octal-escape": [2], // disallow use of octal escape sequences in string literals, such as var foo = "Copyright \251";
    "no-octal": [2], // disallow use of octal literals (recommended)
    "no-param-reassign": [0, {"props": false}], // disallow reassignment of function parameters
    "no-process-env": [0], // disallow use of process.env
    "no-proto": [2], // disallow usage of __proto__ property
    "no-redeclare": [2, {"builtinGlobals": true}], // disallow declaring the same variable more than once (recommended)
    "no-return-assign": [0], // disallow use of assignment in return statement
    "no-script-url": [2], // disallow use of javascript: urls.
    "no-self-compare": [2], // disallow comparisons where both sides are exactly the same
    "no-sequences": [2], // disallow use of the comma operator
    "no-throw-literal": [1], // restrict what can be thrown as an exception
    "no-unused-expressions": [2], // disallow usage of expressions in statement position
    "no-useless-call": [2], // disallow unnecessary .call() and .apply()
    "no-useless-concat": [2], // disallow unnecessary concatenation of literals or template literals
    "no-void": [2], // disallow use of the void operator
    "no-warning-comments": [0, {"terms": ["todo", "fixme"], "location": "start"}], // disallow usage of configurable warning terms in comments": [2], // e.g. TODO or FIXME
    "no-with": [2], // disallow use of the with statement
    "radix": [2], // require use of the second argument for parseInt()
    "vars-on-top": [0], // require declaration of all vars at the top of their containing scope
    "wrap-iife": [2], // require immediate function invocation to be wrapped in parentheses
    "yoda": [0, "never"], // require or disallow Yoda conditions
    // Variables
    "init-declarations": [0], // enforce or disallow variable initializations at definition
    "no-catch-shadow": [0], // disallow the catch clause parameter name being the same as a variable in the outer scope
    "no-delete-var": [2], // disallow deletion of variables (recommended)
    "no-label-var": [2], // disallow labels that share a name with a variable
    "no-shadow-restricted-names": [2], // disallow shadowing of names such as arguments
    "no-shadow": [2], // disallow declaration of variables already declared in the outer scope
    "no-undef-init": [2], // disallow use of undefined when initializing variables
    "no-undef": [2], // disallow use of undeclared variables unless mentioned in a /*global */ block (recommended)
    "no-undefined": [0], // disallow use of undefined variable
    "no-unused-vars": [2], // disallow declaration of variables that are not used in the code (recommended)
    "no-use-before-define": [2, "nofunc"], // disallow use of variables before they are defined
    // nodejs
    "callback-return": [2, ["callback", "cb", "next"]], // enforce return after a callback
    "handle-callback-err": [2, "^(err\\d?|error\\d?|^.+Err$|^.+Error$)$"], // enforce error handling in callbacks
    "no-mixed-requires": [2, false], // disallow mixing regular variable and require declarations
    "no-new-require": [2], // disallow use of new operator with the require function
    "no-path-concat": [2], // disallow string concatenation with __dirname and __filename
    "no-process-exit": [0], // disallow process.exit()
    "no-restricted-modules": [0], // restrict usage of specified node modules
    "no-sync": [2], // disallow use of synchronous methods
    // Stylistic
    "array-bracket-spacing": [2, "never"], // enforce spacing inside array brackets
    "block-spacing": [2, "never"], // disallow or enforce spaces inside of single line blocks
    "brace-style": [2, "1tbs", { "allowSingleLine": true }], // enforce one true brace style
    "camelcase": [2, {"properties": "always"}], // require camel case names
    "comma-spacing": [2, {"before": false, "after": true}], // enforce spacing before and after comma
    "comma-style": [2, "last"], // enforce one true comma style
    "computed-property-spacing": [2, "never"], // require or disallow padding inside computed properties
    "consistent-this": [2, "self"], // enforce consistent naming when capturing the current execution context
    "eol-last": [2], // enforce newline at the end of file, with no multiple empty lines
    "func-names": [0], // require function expressions to have a name
    "func-style": [2, "declaration"], // enforce use of function declarations or expressions
    "id-length": [2, {"min": 3, "properties": "never", "exceptions": ["Q", "q", "_", "cb", "id", "i", "j"]}], // this option enforces minimum and maximum identifier lengths (variable names, property names etc.)
    "id-match": [0], // require identifiers to match the provided regular expression
    "key-spacing": [2, {"beforeColon": false, "afterColon": true}], // enforce spacing between keys and values in object literal properties
    "keyword-spacing": [2, {}], // require a space after certain keywords
    "lines-around-comment": [0], // enforce empty lines around comments
    "max-nested-callbacks": [2, 6], // specify the maximum depth callbacks can be nested
    "new-cap": [2, {"capIsNewExceptions": ["Router"]}], // require a capital letter for constructors
    "new-parens": [2], // disallow the omission of parentheses when invoking a constructor with no arguments
    "newline-after-var": [2, "always"], // require or disallow an empty newline after variable declarations
    "no-array-constructor": [2], // disallow use of the Array constructor
    "no-continue": [2], // disallow use of the continue statement
    "no-inline-comments": [0], // disallow comments inline after code
    "no-lonely-if": [0], // disallow if as the only statement in an else block
    "no-mixed-spaces-and-tabs": [2], // disallow mixed spaces and tabs for indentation (recommended)
    "no-multiple-empty-lines": [2, {"max": 1}], // disallow multiple empty lines
    "no-nested-ternary": [2], // disallow nested ternary expressions
    "no-new-object": [2], // disallow the use of the Object constructor
    "no-spaced-func": [2], // disallow space between function identifier and application
    "no-ternary": [0], // disallow the use of ternary operators
    "no-trailing-spaces": [2, { "skipBlankLines": true }], // disallow trailing whitespace at the end of lines
    "no-underscore-dangle": [0], // disallow dangling underscores in identifiers
    "no-unneeded-ternary": [2], // disallow the use of Boolean literals in conditional expressions
    "object-curly-spacing": [2, "always"], // require or disallow padding inside curly braces
    "one-var": [0], // require or disallow one variable declaration per function
    "operator-assignment": [0], // require assignment operator shorthand where possible or prohibit it entirely
    "operator-linebreak": [2, "after"], // enforce operators to be placed before or after line breaks
    "padded-blocks": [0, "never"], // enforce padding within blocks
    "quote-props": [2, "consistent"], // require quotes around object literal property names
    "semi-spacing": [2, {"before": false, "after": true}], // enforce spacing before and after semicolons
    "sort-vars": [0], // sort variables within the same declaration block
    "space-before-blocks": [2, "always"], // require or disallow a space before blocks
    "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], // require or disallow a space before function opening parenthesis
    "space-in-parens": [2, "never"], // require or disallow spaces inside parentheses
    "space-infix-ops": [2, {"int32Hint": false}], // require spaces around operators
    "space-return-throw-case": [0], // require a space after return, throw, and case
    "space-unary-ops": [2, {"words": true, "nonwords": false}], // require or disallow spaces before/after unary operators
    "spaced-comment": [2, "always"], // require or disallow a space immediately following the // or /* in a comment
    "wrap-regex": [2] // require regex literals to be wrapped in parentheses
  },
  "env": {
    "node": true,
    "es6": true,
    "mocha": true
  },
  "extends": "eslint:recommended"
}