@spscommerce/eslint-config-typescript
Version:
SPS official linter configuration for TypeScript.
528 lines (527 loc) • 17.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bestPractices = void 0;
// ✅ = recommended, 🔧 = fixable
exports.bestPractices = {
/**
* enforces getter/setter pairs in objects
* https://eslint.org/docs/rules/accessor-pairs
* Off because getters and setters are forbidden
*/
"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
* Off because `var` is forbidden
*/
"block-scoped-var": "off",
/**
* specify the maximum cyclomatic complexity allowed in a program
* https://eslint.org/docs/rules/complexity
*/
complexity: "off",
/**
* enforce that class methods use "this"
* https://eslint.org/docs/rules/class-methods-use-this
*/
"class-methods-use-this": "error",
/**
* require return statements to either always or never specify values
* https://eslint.org/docs/rules/consistent-return
*/
"consistent-return": "off",
/**
* specify curly brace conventions for all control statements 🔧
* https://eslint.org/docs/rules/curly
*/
curly: ["error", "multi-line"],
/**
* 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",
/**
* enforce default parameters to be last
* https://eslint.org/docs/rules/default-param-last
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/default-param-last.md
*/
"default-param-last": "off",
"@typescript-eslint/default-param-last": "error",
/**
* enforces consistent newlines before or after dots
* https://eslint.org/docs/rules/dot-location
*/
"dot-location": ["error", "property"],
/**
* encourages use of dot notation whenever possible 🔧
* https://eslint.org/docs/rules/dot-notation
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/dot-notation.md
*/
"dot-notation": "off",
"@typescript-eslint/dot-notation": ["error", { allowKeywords: true }],
/**
* 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
* Off because getters and setters are forbidden
*/
"grouped-accessor-pairs": "off",
/**
* make sure for-in loops have an if statement
* https://eslint.org/docs/rules/guard-for-in
* Off because for-in is forbidden
*/
"guard-for-in": "off",
/**
* enforce a maximum number of classes per file
* https://eslint.org/docs/rules/max-classes-per-file
*/
"max-classes-per-file": ["error", 1],
/**
* disallow the use of alert, confirm, and prompt
* https://eslint.org/docs/rules/no-alert
*/
"no-alert": "error",
/**
* 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",
/**
* 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": "off",
/**
* disallow empty functions
* https://eslint.org/docs/rules/no-empty-function
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-empty-function.md
*/
"no-empty-function": "off",
"@typescript-eslint/no-empty-function": "off",
/**
* 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
* Off because it's superceded by eqeqeq
*/
"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",
/**
* disallow implicit type conversions 🔧
* https://eslint.org/docs/rules/no-implicit-coercion
*/
"no-implicit-coercion": [
"error",
{
boolean: false,
number: true,
string: true,
},
],
/**
* disallow var and named functions in global scope
* https://eslint.org/docs/rules/no-implicit-globals
* disabled because it can't distinguish between a file with no imports and a browser script
*/
"no-implicit-globals": "off",
/**
* disallow use of eval()-like methods
* https://eslint.org/docs/rules/no-implied-eval
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-implied-eval.md
*/
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error",
/**
* disallow assignment to imported bindings
* https://eslint.org/docs/rules/no-import-assign
*/
"no-import-assign": "error",
/**
* disallow this keywords outside of classes or class-like objects
* https://eslint.org/docs/rules/no-invalid-this
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-invalid-this.md
*/
"no-invalid-this": "off",
"@typescript-eslint/no-invalid-this": "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",
/**
* disallow unnecessary nested blocks
* https://eslint.org/docs/rules/no-lone-blocks
*/
"no-lone-blocks": "error",
/**
* disallow creation of functions within loops
* https://eslint.org/docs/rules/no-loop-func
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-loop-func.md
*/
"no-loop-func": "off",
"@typescript-eslint/no-loop-func": "error",
/**
* disallow magic numbers
* https://eslint.org/docs/rules/no-magic-numbers
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-magic-numbers.md
*/
"no-magic-numbers": "off",
"@typescript-eslint/no-magic-numbers": [
"error",
{
ignore: [
-1,
0,
1,
2,
],
ignoreArrayIndexes: true,
},
],
/**
* disallow use of multiple spaces 🔧
* https://eslint.org/docs/rules/no-multi-spaces
*/
"no-multi-spaces": "error",
/**
* 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",
/**
* disallow use of new operator for Function object
* https://eslint.org/docs/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
* https://eslint.org/docs/rules/no-octal-escape
*/
"no-octal-escape": "error",
/**
* disallow reassignment of function parameters, and
* 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", "accumulator",
],
},
],
/**
* disallow usage of __proto__ property
* https://eslint.org/docs/rules/no-proto
*/
"no-proto": "error",
/**
* disallow declaring the same variable more than once ✅
* https://eslint.org/docs/rules/no-redeclare
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-redeclare.md
*/
"no-redeclare": "off",
"@typescript-eslint/no-redeclare": "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.",
},
],
/**
* disallow use of assignment in return statement
* https://eslint.org/docs/rules/no-return-assign
*/
"no-return-assign": "error",
/**
* disallow redundant `return await`
* https://eslint.org/docs/rules/no-return-await
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/return-await.md
*/
"no-return-await": "off",
"@typescript-eslint/return-await": "error",
/**
* 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",
/**
* 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",
/**
* restrict what can be thrown as an exception
* https://eslint.org/docs/rules/no-throw-literal
* https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/only-throw-error.mdx
*/
"no-throw-literal": "off",
"@typescript-eslint/only-throw-error": "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
* https://eslint.org/docs/rules/no-unused-expressions
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-expressions.md
*/
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": ["error", { allowTaggedTemplates: false }],
/**
* disallow unused labels ✅ 🔧
* https://eslint.org/docs/rules/no-unused-labels
*/
"no-unused-labels": "error",
/**
* disallow useless backreferences in regular expressions
* https://eslint.org/docs/rules/no-useless-backreference
*/
"no-useless-backreference": "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
* Typing for this rule config seems to be incorrect
*/
"no-void": ["error", { allowAsStatement: true }],
/**
* disallow usage of configurable warning terms in comments: e.g. todo
* https://eslint.org/docs/rules/no-warning-comments
*/
"no-warning-comments": "off",
/**
* disallow use of the with statement ✅
* https://eslint.org/docs/rules/no-with
*/
"no-with": "error",
/**
* require `Object.hasOwn` instead of `Object.prototype.hasOwnProperty.call`
* https://eslint.org/docs/rules/prefer-object-has-own
*/
"prefer-object-has-own": "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",
/**
* disallow use of the `RegExp` constructor in favor of regular expression literals
* https://eslint.org/docs/rules/prefer-regex-literals
*/
"prefer-regex-literals": "error",
/**
* require use of the second argument for parseInt()
* https://eslint.org/docs/rules/radix
*/
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
* https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/require-await.md
*/
"require-await": "off",
"@typescript-eslint/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
* https://eslint.org/docs/rules/vars-on-top
* Off because var is forbidden
*/
"vars-on-top": "off",
/**
* 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",
};