eslint-config-ts-strict
Version:
Very strict ESLint config for projects using TypeScript, React and Prettier. ESLint v9 flat config only. Formatting rules disabled to prevent Prettier conflicts.
394 lines (320 loc) • 12.8 kB
JavaScript
export default {
rules: {
// enforces getter/setter pairs in objects
// https://eslint.org/docs/rules/accessor-pairs
"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
// https://eslint.org/docs/rules/block-scoped-var
"block-scoped-var": "error",
// https://eslint.org/docs/latest/rules/camelcase
camelcase: ["off", { properties: "never" }],
// specify the maximum cyclomatic complexity allowed in a program
// https://eslint.org/docs/rules/complexity
complexity: ["off", 20],
// enforce that class methods use "this"
// https://eslint.org/docs/rules/class-methods-use-this
"class-methods-use-this": [
"off",
{
exceptMethods: [],
},
],
// require return statements to either always or never specify values
// https://eslint.org/docs/rules/consistent-return
"consistent-return": "off",
"@typescript-eslint/consistent-return": "error",
// specify curly brace conventions for all control statements
// https://eslint.org/docs/rules/curly
curly: ["error", "multi-line"], // multiline
// require default case in switch statements
// https://eslint.org/docs/rules/default-case
"default-case": ["error", { commentPattern: "^no default$" }],
// Enforce default clauses in switch statements to be last
// https://eslint.org/docs/rules/default-case-last
"default-case-last": "error",
// 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", "always", { null: "ignore" }],
// Require grouped accessor pairs in object literals and classes
// https://eslint.org/docs/rules/grouped-accessor-pairs
"grouped-accessor-pairs": "error",
// make sure for-in loops have an if statement
// https://eslint.org/docs/rules/guard-for-in
"guard-for-in": "error",
// https://eslint.org/docs/latest/rules/logical-assignment-operators
"logical-assignment-operators": [
"error",
"always",
{ enforceForIfStatements: true },
],
// enforce a maximum number of classes per file
// https://eslint.org/docs/rules/max-classes-per-file
"max-classes-per-file": "off",
// disallow the use of alert, confirm, and prompt
// https://eslint.org/docs/rules/no-alert
"no-alert": "warn",
// disallow use of arguments.caller or arguments.callee
// https://eslint.org/docs/rules/no-caller
"no-caller": "error",
// disallow lexical declarations in case/default clauses
// https://eslint.org/docs/rules/no-case-declarations
"no-case-declarations": "error",
// https://eslint.org/docs/latest/rules/no-constant-binary-expression
"no-constant-binary-expression": "error",
// Disallow returning value in constructor
// https://eslint.org/docs/rules/no-constructor-return
"no-constructor-return": "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 destructuring patterns
// https://eslint.org/docs/rules/no-empty-pattern
"no-empty-pattern": "error",
// disallow comparisons to null without a type-checking operator
// https://eslint.org/docs/rules/no-eq-null
"no-eq-null": "off",
// disallow use of eval()
// https://eslint.org/docs/rules/no-eval
"no-eval": "error",
// disallow adding to native types
// https://eslint.org/docs/rules/no-extend-native
"no-extend-native": "error",
// disallow unnecessary function binding
// https://eslint.org/docs/rules/no-extra-bind
"no-extra-bind": "error",
// disallow Unnecessary Labels
// https://eslint.org/docs/rules/no-extra-label
"no-extra-label": "error",
// disallow fallthrough of case statements
// https://eslint.org/docs/rules/no-fallthrough
"no-fallthrough": "error",
// disallow the use of leading or trailing decimal points in numeric literals
// https://eslint.org/docs/rules/no-floating-decimal
"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
// https://eslint.org/docs/rules/no-native-reassign
"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 usage of __iterator__ property
// https://eslint.org/docs/rules/no-iterator
"no-iterator": "error",
// disallow use of labels for anything other than loops and switches
// https://eslint.org/docs/rules/no-labels
"no-labels": ["error", { allowLoop: false, allowSwitch: false }],
// disallow unnecessary nested blocks
// https://eslint.org/docs/rules/no-lone-blocks
"no-lone-blocks": "error",
// disallow use of multiple spaces
// https://eslint.org/docs/rules/no-multi-spaces
// PRETTIER CONFLICT: This rule conflicts with Prettier's spacing decisions
"no-multi-spaces": "off",
// disallow use of multiline strings
// https://eslint.org/docs/rules/no-multi-str
"no-multi-str": "error",
// disallow use of new operator when not part of the assignment or comparison
// https://eslint.org/docs/rules/no-new
"no-new": "error",
// https://eslint.org/docs/latest/rules/no-new-func
"no-new-func": "error",
// disallows creating new instances of String, Number, and Boolean
// https://eslint.org/docs/rules/no-new-wrappers
"no-new-wrappers": "error",
// Disallow \8 and \9 escape sequences in string literals
// https://eslint.org/docs/rules/no-nonoctal-decimal-escape
"no-nonoctal-decimal-escape": "error",
// disallow use of (old style) octal literals
// https://eslint.org/docs/rules/no-octal
"no-octal": "error",
// disallow use of octal escape sequences in string literals, such as
// var foo = 'Copyright \251';
// https://eslint.org/docs/rules/no-octal-escape
"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
"context", // for Koa routing
"req", // for Express requests
"request", // for Express requests
"res", // for Express responses
"response", // for Express responses
"$scope", // for Angular 1 scopes
"staticContext", // for ReactRouter context
],
},
],
// disallow usage of __proto__ property
// https://eslint.org/docs/rules/no-proto
"no-proto": "error",
// disallow certain object properties
// https://eslint.org/docs/rules/no-restricted-properties
"no-restricted-properties": [
"error",
{
object: "arguments",
property: "callee",
message: "arguments.callee is deprecated",
},
{
object: "global",
property: "isFinite",
message: "Please use Number.isFinite instead",
},
{
object: "self",
property: "isFinite",
message: "Please use Number.isFinite instead",
},
{
object: "window",
property: "isFinite",
message: "Please use Number.isFinite instead",
},
{
object: "global",
property: "isNaN",
message: "Please use Number.isNaN instead",
},
{
object: "self",
property: "isNaN",
message: "Please use Number.isNaN instead",
},
{
object: "window",
property: "isNaN",
message: "Please use Number.isNaN instead",
},
{
property: "__defineGetter__",
message: "Please use Object.defineProperty instead.",
},
{
property: "__defineSetter__",
message: "Please use Object.defineProperty instead.",
},
{
object: "Math",
property: "pow",
message: "Use the exponentiation operator (**) instead.",
},
],
// disallow use of assignment in return statement
// https://eslint.org/docs/rules/no-return-assign
"no-return-assign": ["error", "always"],
// disallow use of `javascript:` urls.
// https://eslint.org/docs/rules/no-script-url
"no-script-url": "error",
// disallow self assignment
// https://eslint.org/docs/rules/no-self-assign
"no-self-assign": [
"error",
{
props: true,
},
],
// disallow comparisons where both sides are exactly the same
// https://eslint.org/docs/rules/no-self-compare
"no-self-compare": "error",
// disallow use of comma operator
// https://eslint.org/docs/rules/no-sequences
"no-sequences": "error",
// disallow unmodified conditions of loops
// https://eslint.org/docs/rules/no-unmodified-loop-condition
"no-unmodified-loop-condition": "off",
// disallow unused labels
// https://eslint.org/docs/rules/no-unused-labels
"no-unused-labels": "error",
// disallow unnecessary .call() and .apply()
// https://eslint.org/docs/rules/no-useless-call
"no-useless-call": "off",
// Disallow unnecessary catch clauses
// https://eslint.org/docs/rules/no-useless-catch
"no-useless-catch": "error",
// 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": "error",
// disallow usage of configurable warning terms in comments: e.g. todo
// https://eslint.org/docs/rules/no-warning-comments
"no-warning-comments": [
"off",
{ terms: ["todo", "fixme", "xxx"], location: "start" },
],
// disallow use of the with statement
// https://eslint.org/docs/rules/no-with
"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 }],
// Suggest using named capture group in regular expression
// https://eslint.org/docs/rules/prefer-named-capture-group
"prefer-named-capture-group": "off",
// https://eslint.org/docs/latest/rules/prefer-object-has-own
"prefer-object-has-own": "error",
// https://eslint.org/docs/rules/prefer-regex-literals
"prefer-regex-literals": [
"error",
{
disallowRedundantWrapping: true,
},
],
// require use of the second argument for parseInt()
// https://eslint.org/docs/rules/radix
radix: "error",
// 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
// https://eslint.org/docs/rules/vars-on-top
"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
// https://eslint.org/docs/rules/yoda
yoda: "error",
"no-object-constructor": "error",
},
};