packages/eslint-config/best-practices/index.js
module.exports = {
rules: {
// // enforces getter/setter pairs in objects
// 'accessor-pairs': 'off',
// enforces return statements in callbacks of array's methods
// https://eslint.org/docs/rules/array-callback-return
'array-callback-return': ['error', { allowImplicit: true }],
// treat var statements as if they were block scoped
'block-scoped-var': 'error',
// specify the maximum cyclomatic complexity allowed in a program
'complexity': ['warn', 31],
// enforce that class methods use "this"
// https://eslint.org/docs/rules/class-methods-use-this
// 'class-methods-use-this': ['error', {
// exceptMethods: [],
// }],
// require return statements to either always or never specify values
// 'consistent-return': 'error',
// specify curly brace conventions for all control statements
'curly': ['error', 'all'],
// // require default case in switch statements
// 'default-case': ['error', { commentPattern: '^no default$' }],
// encourages use of dot notation whenever possible
'dot-notation': ['error', { allowKeywords: true }],
// enforces consistent newlines before or after dots
// https://eslint.org/docs/rules/dot-location
'dot-location': ['error', 'property'],
// require the use of === and !==
// https://eslint.org/docs/rules/eqeqeq
'eqeqeq': ['error', 'allow-null'],
// make sure for-in loops have an if statement
'guard-for-in': 'error',
// // enforce a maximum number of classes per file
// // https://eslint.org/docs/rules/max-classes-per-file
// // TODO: semver-major (eslint 5): enable
// 'max-classes-per-file': ['off', 1],
// // disallow the use of alert, confirm, and prompt
// 'no-alert': 'warn',
// disallow use of arguments.caller or arguments.callee
'no-caller': 'error',
// disallow lexical declarations in case/default clauses
// https://eslint.org/docs/rules/no-case-declarations.html
// 'no-case-declarations': 'error',
// disallow division operators explicitly at beginning of regular expression
// https://eslint.org/docs/rules/no-div-regex
'no-div-regex': 'off',
// disallow else after a return in an if
// https://eslint.org/docs/rules/no-else-return
'no-else-return': ['error', { allowElseIf: false }],
// disallow empty functions, except for standalone funcs/arrows
// https://eslint.org/docs/rules/no-empty-function
'no-empty-function': [
'error',
{
allow: ['arrowFunctions', 'functions', 'methods'],
},
],
// disallow empty destructuring patterns
// https://eslint.org/docs/rules/no-empty-pattern
'no-empty-pattern': 'error',
// // disallow comparisons to null without a type-checking operator
// 'no-eq-null': 'off',
// disallow use of eval()
'no-eval': 'error',
// disallow adding to native types
'no-extend-native': 'error',
// disallow unnecessary function binding
'no-extra-bind': 'error',
// disallow Unnecessary Labels
// https://eslint.org/docs/rules/no-extra-label
'no-extra-label': 'error',
// disallow fallthrough of case statements
'no-fallthrough': 'error',
// disallow the use of leading or trailing decimal points in numeric literals
'no-floating-decimal': 'error',
// // disallow reassignments of native objects or read-only globals
// // https://eslint.org/docs/rules/no-global-assign
// 'no-global-assign': ['error', { exceptions: [] }],
// // deprecated in favor of no-global-assign
// 'no-native-reassign': 'off',
// // disallow implicit type conversions
// // https://eslint.org/docs/rules/no-implicit-coercion
// 'no-implicit-coercion': ['off', {
// boolean: false,
// number: true,
// string: true,
// allow: [],
// }],
// // disallow var and named functions in global scope
// // https://eslint.org/docs/rules/no-implicit-globals
// 'no-implicit-globals': 'off',
// disallow use of eval()-like methods
'no-implied-eval': 'error',
// disallow this keywords outside of classes or class-like objects
'no-invalid-this': 'off',
// disallow usage of __iterator__ property
'no-iterator': 'error',
// // disallow use of labels for anything other then loops and switches
// 'no-labels': ['error', { allowLoop: false, allowSwitch: false }],
// disallow unnecessary nested blocks
'no-lone-blocks': 'error',
// disallow creation of functions within loops
'no-loop-func': 'error',
// // disallow magic numbers
// // https://eslint.org/docs/rules/no-magic-numbers
// 'no-magic-numbers': ['off', {
// ignore: [],
// ignoreArrayIndexes: true,
// enforceConst: true,
// detectObjects: false,
// }],
// disallow use of multiple spaces
'no-multi-spaces': 'error',
// disallow use of multiline strings
'no-multi-str': 'error',
// disallow use of new operator when not part of the assignment or comparison
// 'no-new': 'error',
// disallow use of new operator for Function object
// 'no-new-func': 'error',
// disallows creating new instances of String, Number, and Boolean
'no-new-wrappers': 'error',
// disallow use of (old style) octal literals
'no-octal': 'error',
// // disallow use of octal escape sequences in string literals, such as
// // var foo = 'Copyright \251';
// 'no-octal-escape': 'error',
// // disallow reassignment of function parameters
// // disallow parameter object manipulation except for specific exclusions
// // rule: https://eslint.org/docs/rules/no-param-reassign.html
// 'no-param-reassign': ['error', {
// props: true,
// ignorePropertyModificationsFor: [
// 'acc', // for reduce accumulators
// 'accumulator', // for reduce accumulators
// 'e', // for e.returnvalue
// 'ctx', // for Koa routing
// 'req', // for Express requests
// 'request', // for Express requests
// 'res', // for Express responses
// 'response', // for Express responses
// '$scope', // for Angular 1 scopes
// ]
// }],
// disallow usage of __proto__ property
'no-proto': 'error',
// disallow declaring the same variable more then once
'no-redeclare': 'error',
// disallow certain object properties
// https://eslint.org/docs/rules/no-restricted-properties
'no-restricted-properties': [
'error',
{
object: 'describe',
property: 'only',
},
{
object: 'it',
property: 'only',
},
{
object: 'context',
property: 'only',
},
],
// disallow use of assignment in return statement
'no-return-assign': ['error', 'always'],
// disallow redundant `return await`
'no-return-await': 'error',
// // disallow use of `javascript:` urls.
// 'no-script-url': 'error',
// // disallow self assignment
// // https://eslint.org/docs/rules/no-self-assign
// // TODO: semver-major: props -> true
// 'no-self-assign': ['error', {
// props: false,
// }],
// disallow comparisons where both sides are exactly the same
'no-self-compare': 'error',
// disallow use of comma operator
'no-sequences': 'error',
// restrict what can be thrown as an exception
'no-throw-literal': 'error',
// // disallow unmodified conditions of loops
// // https://eslint.org/docs/rules/no-unmodified-loop-condition
// 'no-unmodified-loop-condition': 'off',
// // disallow usage of expressions in statement position
// 'no-unused-expressions': ['error', {
// allowShortCircuit: false,
// allowTernary: false,
// allowTaggedTemplates: false,
// }],
// disallow unused labels
// https://eslint.org/docs/rules/no-unused-labels
'no-unused-labels': 'error',
// disallow unnecessary .call() and .apply()
'no-useless-call': 'off',
// disallow useless string concatenation
// https://eslint.org/docs/rules/no-useless-concat
'no-useless-concat': 'error',
// // disallow unnecessary string escaping
// // https://eslint.org/docs/rules/no-useless-escape
// 'no-useless-escape': 'error',
// disallow redundant return; keywords
// https://eslint.org/docs/rules/no-useless-return
'no-useless-return': 'error',
// disallow use of void operator
// https://eslint.org/docs/rules/no-void
'no-void': 'off',
// // disallow usage of configurable warning terms in comments: e.g. todo
// 'no-warning-comments': ['off', { terms: ['todo', 'fixme', 'xxx'], location: 'start' }],
// // disallow use of the with statement
// 'no-with': 'error',
// // require using Error objects as Promise rejection reasons
// // https://eslint.org/docs/rules/prefer-promise-reject-errors
// 'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }],
// // require use of the second argument for parseInt()
// radix: 'error',
// // require `await` in `async function` (note: this is a horrible rule that should never be used)
// // https://eslint.org/docs/rules/require-await
// 'require-await': 'off',
// // Enforce the use of u flag on RegExp
// // https://eslint.org/docs/rules/require-unicode-regexp
// 'require-unicode-regexp': 'off',
// // requires to declare all vars on top of their containing scope
// 'vars-on-top': 'error',
// require immediate function invocation to be wrapped in parentheses
// https://eslint.org/docs/rules/wrap-iife.html
'wrap-iife': ['error', 'outside', { functionPrototypeMethods: false }],
// require or disallow Yoda conditions
'yoda': 'error',
},
};