Skip to main content

eslint-config-isaacscript

Introduction

This is a sharable configuration for ESLint that is intended to be used in TypeScript projects.

The config is environment-agnostic, meaning that it will work in client-side projects (e.g. React), server-side projects (e.g. Node.js), and so on.


Installation

This package is part of the isaacscript-lint meta-linting package. It is recommended that instead of consuming this package directly, you instead list isaacscript-lint as a dependency, as that will install both this config and all of the rule plugins that it depends on.

For installation instructions, see the isaacscript-lint page.


Why Do I Need To Use ESLint?

Presumably, you are a TypeScript user who has used the language for a while. At this point, you have already realized that TypeScript saves you an enormous amount of time. The hours spent troubleshooting run-time errors from typos have become a thing of the past. Good riddance!

But there are many other code problems that do not have to do with types. In the same way that you want to use TypeScript to catch as many bugs as possible, you also want to use ESLint with a config that enables as many good linting rules as possible.

ESLint rules can help catch bugs, but they can also help to make your codebase more consistent and adhere to best-practices within the TypeScript ecosystem. Remember that code is read more often than it is written. If you care about your code being the best that it can possibly be, then using ESLint is a no-brainer!


Why Do I Need eslint-config-isaacscript?

Your codebase deserves to be safe as possible and eslint-config-isaacscript is the most comprehensive ESLint config out there.

Building an ESLint config from scratch takes many, many hours. ESLint has over 250 rules. typescript-eslint has over 125 rules. And that's just the beginning.

Don't bother creating and maintaining a huge ESLint config yourself. We've done the work to:

  • Enable every ESLint rule that we can find from trusted sources that provides value.
  • Weed out the rules that don't apply to TypeScript codebases (because many ESLint rules were written before TypeScript existed).
  • Weed out the rules covered by Prettier (because many ESLint rules were written before Prettier existed).
  • Weed out the rules that are too noisy to provide value (and document them below).

Our Config Philosophy

We want to enable as many lint rules as possible, so that we can catch as many bugs as possible. Of course, this is a tradeoff: with more lint rules, we get more false positives. But in general, a few false positives are worth the time saved from investigating and squashing bugs. (More on false positives later.)

In line with this philosophy, our linting config enables nearly all of the recommended rules from both the core ESLint team and the TypeScript ESLint team, as well as some additional rules that catch even more bugs.

This config also assumes that you are using Prettier to format your TypeScript code, which is considered to be best-practice in the ecosystem. Subsequently, all formatting-related rules that conflict with Prettier are disabled. (However, we use a few formatting-related rules that are not handled by Prettier.)


Auto-Fixing

Deploying this ESLint config on an existing codebase can generate a ton of warnings. Fixing them all might seem overwhelming. While some warnings need to be fixed manually, a ton of ESLint rules have "auto-fixers". This means that the code will fix itself if you run ESLint with the --fix flag. So, by running npx eslint --fix . in the root of your project, you can take care of a lot of the warnings automatically.

Additionally, we recommend that you configure your IDE (i.e. VSCode) to automatically run --fix whenever you save a file.


Dealing with False Positives

Your first reaction to having a bunch of yellow squiggly lines might be to disable any rule that gets in your way. However, even if you think an ESLint warning is superfluous, it is often a sign that your codebase is structured in a bug-prone or non-idiomatic way. Before simply disabling a rule, sometimes it is good to do some research and think carefully if your code can be refactored in some way to be cleaner.

Additionally, some ESLint rules are not about catching bugs, but are about code style and code consistency. If you find the new style to be foreign and weird, it can be tempting to ignore or disable the rule. But before you do that, consider the cost: your codebase will be deviating from others in the TypeScript ecosystem. It is really nice for everyone's code to adhere to the same look and the same standards!

With that said, with so many ESLint rules turned on, you will undoubtedly come across some false positives. You can quickly take care of these by adding a // eslint-disable-next-line insert-rule-name-here comment. And you can automatically add the comment by selecting "Quick Fix" in VSCode, which is mapped to Ctrl + . by default.

If you find yourself adding a lot of disable comments for a specific rule, then turn the rule off for the entire project by adding an entry for it in your .eslintrc.cjs file. Some rules won't make sense for every project and that's okay!


Rule List

Below, we provide documentation for every rule that is disabled. (We take a blacklist approach rather than a whitelist approach.)

Core ESLint Rules

Rule NameEnabledParent ConfigsNotesSource File
accessor-pairsbase-eslint.js
array-bracket-newlineDisabled because this is handled by Prettier.base-eslint.js
array-bracket-spacingDisabled because this is handled by Prettier.base-eslint.js
array-callback-returnThe checkForEach option is enabled to make the rule stricter.base-eslint.js
array-element-newlineDisabled because this is handled by Prettier.base-eslint.js
arrow-body-stylebase-eslint.js
arrow-parensDisabled because this is handled by Prettier.base-eslint.js
arrow-spacingDisabled because this is handled by Prettier.base-eslint.js
block-scoped-varbase-eslint.js
block-spacingDisabled because this is handled by Prettier.base-eslint.js
brace-styleDisabled because this is handled by Prettier.base-eslint.js
camelcaseSuperseded by the @typescript-eslint/naming-convention rule. (camelcase is used to enforce naming conventions.)base-eslint.js
capitalized-commentsSuperseded by the isaacscript/complete-sentences-jsdoc and isaacscript/complete-sentences-line-comments rules.base-eslint.js
class-methods-use-thisSuperseded by the @typescript-eslint/class-methods-use-this rule.base-eslint.js
comma-dangleDisabled because this is handled by Prettier.base-eslint.js
comma-spacingDisabled because this is handled by Prettier.base-eslint.js
comma-styleDisabled because this is handled by Prettier.base-eslint.js
complexityDisabled since cyclomatic complexity is not a good enough general indicator of code complexity and leads to too many false positives.base-eslint.js
computed-property-spacingDisabled because this is handled by Prettier.base-eslint.js
consistent-returnSuperseded by the @typescript-eslint/consistent-return rule.base-eslint.js
consistent-thisbase-eslint.js
constructor-superDisabled because this is handled by the TypeScript compiler.base-eslint.js
curlyAlways requiring curly braces can partially ward against Apple-style if statement bugs. Additionally, this rule needs to be set to "all" to work properly with eslint-prettier-config.base-eslint.js
default-caseDisabled since it would cause the @typescript-eslint/switch-exhaustiveness-check rule to not work properly.base-eslint.js
default-case-lastbase-eslint.js
default-param-lastSuperseded by the @typescript-eslint/default-param-last rule.base-eslint.js
dot-locationDisabled because this is handled by Prettier.base-eslint.js
dot-notationSuperseded by the @typescript-eslint/dot-notation rule.base-eslint.js
eol-lastDisabled because this is handled by Prettier.base-eslint.js
eqeqeqSuperseded by the isaacscript/eqeqeq-fix rule.base-eslint.js
for-directionbase-eslint.js
func-call-spacingDisabled because this is handled by Prettier.base-eslint.js
func-name-matchingbase-eslint.js
func-namesbase-eslint.js
func-styleDisabled since it is common in the TypeScript ecosystem to use both function forms, depending on the situation.base-eslint.js
function-call-argument-newlineDisabled because this is handled by Prettier.base-eslint.js
function-paren-newlineDisabled because this is handled by Prettier.base-eslint.js
generator-star-spacingDisabled because this is handled by Prettier.base-eslint.js
getter-returnDisabled because this is handled by the TypeScript compiler.base-eslint.js
grouped-accessor-pairsbase-eslint.js
guard-for-inSuperseded by the isaacscript/no-for-in rule.base-eslint.js
id-denylistDisabled since it is expected to be configured with project-specific keywords.base-eslint.js
id-lengthDisabled because short variable names are understandable in many contexts.base-eslint.js
id-matchSuperseded by the @typescript-eslint/naming-convention rule. (id-match is used to enforce naming conventions.)base-eslint.js
implicit-arrow-linebreakDisabled because this is handled by Prettier.base-eslint.js
indentDisabled because this is handled by Prettier.base-eslint.js
init-declarationsSuperseded by the @typescript-eslint/init-declarations rule.base-eslint.js
jsx-quotesDisabled because this is handled by Prettier.base-eslint.js
key-spacingDisabled because this is handled by Prettier.base-eslint.js
keyword-spacingDisabled because this is handled by Prettier.base-eslint.js
line-comment-positionDisabled since it is common in the TypeScript ecosystem to use both types of comments.base-eslint.js
linebreak-styleDisabled because this is handled by Prettier.base-eslint.js
lines-around-commentDisabled because this is handled by Prettier.base-eslint.js
lines-between-class-membersSuperseded by the @typescript-eslint/lines-between-class-members rule.base-eslint.js
logical-assignment-operatorsThe enforceForIfStatements option is enabled to make the rule stricter.base-eslint.js
max-classes-per-filebase-eslint.js
max-depthDisabled since this rule is too prescriptive for general-purpose use.base-eslint.js
max-lenDisabled because this is handled by Prettier.base-eslint.js
max-linesDisabled because enforcing an arbitrary line threshold for every file in a project does not provide much value.base-eslint.js
max-lines-per-functionDisabled because enforcing an arbitrary line threshold for every function in a project does not provide much value.base-eslint.js
max-nested-callbacksbase-eslint.js
max-paramsSuperseded by the @typescript-eslint/max-params rule.base-eslint.js
max-statementsDisabled because enforcing an arbitrary statement threshold for every function in a project does not provide much value.base-eslint.js
max-statements-per-lineDisabled because this is handled by Prettier.base-eslint.js
multiline-comment-styleDisabled because it is conventional to use both kinds of comments in TypeScript projects.base-eslint.js
multiline-ternaryDisabled because this is handled by Prettier.base-eslint.js
new-capbase-eslint.js
new-parensDisabled because this is handled by Prettier.base-eslint.js
newline-per-chained-callDisabled because this is handled by Prettier.base-eslint.js
no-alertbase-eslint.js
no-array-constructorSuperseded by the @typescript-eslint/no-array-constructor rule.base-eslint.js
no-async-promise-executorbase-eslint.js
no-await-in-loopbase-eslint.js
no-bitwisebase-eslint.js
no-callerbase-eslint.js
no-case-declarationsbase-eslint.js
no-class-assignbase-eslint.js
no-compare-neg-zerobase-eslint.js
no-cond-assignbase-eslint.js
no-confusing-arrowDisabled because this is handled by Prettier.base-eslint.js
no-consoleDisabled because command-line programs written in TypeScript commonly write to standard out and standard error.base-eslint.js
no-const-assignDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-constant-binary-expressionbase-eslint.js
no-constant-conditionbase-eslint.js
no-constructor-returnbase-eslint.js
no-continueDisabled because proper use of continues can reduce indentation for long blocks of code in the same way as the early return pattern.base-eslint.js
no-control-regexbase-eslint.js
no-debuggerbase-eslint.js
no-delete-varbase-eslint.js
no-div-regexDisabled since it is incompatible with the unicorn/better-regex rule.base-eslint.js
no-dupe-argsDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-dupe-class-membersDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-dupe-else-ifbase-eslint.js
no-dupe-keysDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-duplicate-casebase-eslint.js
no-duplicate-importsSuperseded by the import/no-duplicates rule (which is provided by the import/recommended config).base-eslint.js
no-else-returnThe allowElseIf option is disabled to make the rule stricter.base-eslint.js
no-emptybase-eslint.js
no-empty-character-classbase-eslint.js
no-empty-functionSuperseded by the @typescript-eslint/no-empty-function rule.base-eslint.js
no-empty-patternbase-eslint.js
no-empty-static-blockbase-eslint.js
no-eq-nullbase-eslint.js
no-evalbase-eslint.js
no-ex-assignbase-eslint.js
no-extend-nativebase-eslint.js
no-extra-bindbase-eslint.js
no-extra-boolean-castbase-eslint.js
no-extra-labelbase-eslint.js
no-extra-parensDisabled because this is handled by Prettier.base-eslint.js
no-extra-semiDisabled because this is handled by Prettier.base-eslint.js
no-fallthroughbase-eslint.js
no-floating-decimalDisabled because this is handled by Prettier.base-eslint.js
no-func-assignDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-global-assignbase-eslint.js
no-implicit-coercionbase-eslint.js
no-implicit-globalsbase-eslint.js
no-implied-evalSuperseded by the @typescript-eslint/no-implied-eval rule.base-eslint.js
no-import-assignDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-inline-commentsDisabled because inline comments are common in the TypeScript ecosystem.base-eslint.js
no-inner-declarationsbase-eslint.js
no-invalid-regexpbase-eslint.js
no-invalid-thisSuperseded by the @typescript-eslint/no-invalid-this rule.base-eslint.js
no-irregular-whitespacebase-eslint.js
no-iteratorbase-eslint.js
no-label-varbase-eslint.js
no-labelsbase-eslint.js
no-lone-blocksbase-eslint.js
no-lonely-ifbase-eslint.js
no-loop-funcSuperseded by the @typescript-eslint/no-loop-func rule.base-eslint.js
no-loss-of-precisionSuperseded by the @typescript-eslint/no-loss-of-precision rule.base-eslint.js
no-magic-numbersSuperseded by the @typescript-eslint/no-magic-numbers rule.base-eslint.js
no-misleading-character-classbase-eslint.js
no-mixed-operatorsDisabled because this is handled by Prettier.base-eslint.js
no-mixed-spaces-and-tabsDisabled because this is handled by Prettier.base-eslint.js
no-multi-assignbase-eslint.js
no-multi-spacesDisabled because this is handled by Prettier.base-eslint.js
no-multi-strbase-eslint.js
no-multiple-empty-linesDisabled because this is handled by Prettier.base-eslint.js
no-negated-conditionSuperseded by the unicorn/no-negated-condition rule.base-eslint.js
no-nested-ternaryunicorn/no-nested-ternary is a modified version of this rule but that version is less strict.base-eslint.js
no-newbase-eslint.js
no-new-funcbase-eslint.js
no-new-native-nonconstructorbase-eslint.js
no-new-symbolDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-new-wrappersbase-eslint.js
no-nonoctal-decimal-escapebase-eslint.js
no-obj-callsDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-object-constructorbase-eslint.js
no-octalbase-eslint.js
no-octal-escapebase-eslint.js
no-param-reassignThe options are copied from Airbnb.base-eslint.js
no-plusplusDisabled because the rule is unnecessary when using Prettier. (Unary operators can lead to errors with minified code, but Prettier adds semicolons automatically.)base-eslint.js
no-promise-executor-returnbase-eslint.js
no-protobase-eslint.js
no-prototype-builtinsbase-eslint.js
no-redeclareDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-regex-spacesbase-eslint.js
no-restricted-exportsThe options are copied from Airbnb.base-eslint.js
no-restricted-globalsThe options are copied from Airbnb.base-eslint.js
no-restricted-importsSuperseded by the @typescript-eslint/no-restricted-imports rule.base-eslint.js
no-restricted-propertiesThe options are copied from Airbnb.base-eslint.js
no-restricted-syntaxDisabled because it is intended for disallowing specific language features per-project.base-eslint.js
no-return-assignThe always option is provided to make the rule stricter.base-eslint.js
no-script-urlbase-eslint.js
no-self-assignbase-eslint.js
no-self-comparebase-eslint.js
no-sequencesDisabled because it can conflict with Prettier.base-eslint.js
no-setter-returnDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-shadowSuperseded by the @typescript-eslint/no-shadow rule.base-eslint.js
no-shadow-restricted-namesbase-eslint.js
no-sparse-arraysbase-eslint.js
no-tabsDisabled because this is handled by Prettier.base-eslint.js
no-template-curly-in-stringbase-eslint.js
no-ternaryDisabled because ternaries are common in the TypeScript ecosystem and can often lead to concise code that is easy to read.base-eslint.js
no-this-before-superDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-throw-literalSuperseded by the @typescript-eslint/no-throw-literal rule.base-eslint.js
no-trailing-spacesDisabled because this is handled by Prettier.base-eslint.js
no-undefDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-undef-initbase-eslint.js
no-undefinedDisabled because in TypeScript, it is common to explicitly check for undefined for the purposes of type narrowing.base-eslint.js
no-underscore-dangleDisabled since it is a common pattern to use underscores to temporarily allow unused variables during development.base-eslint.js
no-unexpected-multilineDisabled because this is handled by Prettier.base-eslint.js
no-unmodified-loop-conditionbase-eslint.js
no-unneeded-ternaryThe defaultAssignment option is disabled to make the rule stricter.base-eslint.js
no-unreachableDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-unreachable-loopbase-eslint.js
no-unsafe-finallybase-eslint.js
no-unsafe-negationDisabled because this is handled by the TypeScript compiler.base-eslint.js
no-unsafe-optional-chainingbase-eslint.js
no-unused-expressionsSuperseded by the @typescript-eslint/no-unused-expressions rule.base-eslint.js
no-unused-labelsbase-eslint.js
no-unused-private-class-membersbase-eslint.js
no-unused-varsSuperseded by the @typescript-eslint/no-unused-vars rule.base-eslint.js
no-use-before-defineSuperseded by the @typescript-eslint/no-use-before-define rule.base-eslint.js
no-useless-backreferencebase-eslint.js
no-useless-callbase-eslint.js
no-useless-catchbase-eslint.js
no-useless-computed-keyThe enforceForClassMembers option is enabled to make the rule stricter.base-eslint.js
no-useless-concatbase-eslint.js
no-useless-constructorSuperseded by the @typescript-eslint/no-useless-constructor rule.base-eslint.js
no-useless-escapebase-eslint.js
no-useless-renamebase-eslint.js
no-useless-returnSuperseded by the no-autofix/no-useless-return rule (since the autofix is usually unwanted).base-eslint.js
no-varbase-eslint.js
no-voidbase-eslint.js
no-warning-commentsSuperseded by the unicorn/expiring-todo-comments rule.base-eslint.js
no-whitespace-before-propertyDisabled because this is handled by Prettier.base-eslint.js
no-withbase-eslint.js
nonblock-statement-body-positionDisabled because this is handled by Prettier.base-eslint.js
object-curly-newlineDisabled because this is handled by Prettier.base-eslint.js
object-curly-spacingDisabled because this is handled by Prettier.base-eslint.js
object-property-newlineDisabled because this is handled by Prettier.base-eslint.js
object-shorthandThe ignoreConstructors option is disabled to make the rule stricter.base-eslint.js
one-varThe never option is provided to disallow multi-variable declarations (since they can be confusing).base-eslint.js
one-var-declaration-per-lineDisabled because this is handled by Prettier.base-eslint.js
operator-assignmentbase-eslint.js
operator-linebreakDisabled because this is handled by Prettier.base-eslint.js
padded-blocksDisabled because this is handled by Prettier.base-eslint.js
padding-line-between-statementsSuperseded by the @typescript-eslint/padding-line-between-statements rule.base-eslint.js
prefer-arrow-callbackbase-eslint.js
prefer-constSuperseded by the no-autofix/prefer-const rule (since the autofix is usually unwanted).base-eslint.js
prefer-destructuringSuperseded by the @typescript-eslint/prefer-destructuring rule.base-eslint.js
prefer-exponentiation-operatorbase-eslint.js
prefer-named-capture-groupDisabled because it is common to have a regex with only a single match, in which case a named capture group can be needlessly verbose (and cause extra type narrowing).base-eslint.js
prefer-numeric-literalsbase-eslint.js
prefer-object-has-ownbase-eslint.js
prefer-object-spreadbase-eslint.js
prefer-promise-reject-errorsSuperseded by the @typescript-eslint/prefer-promise-reject-errors rule.base-eslint.js
prefer-regex-literalsThe disallowRedundantWrapping option is enabled to make the rule stricter.base-eslint.js
prefer-rest-paramsbase-eslint.js
prefer-spreadbase-eslint.js
prefer-templatebase-eslint.js
quote-propsDisabled because this is handled by Prettier.base-eslint.js
quotesDisabled because this is handled by Prettier.base-eslint.js
radixbase-eslint.js
require-atomic-updatesDisabled since Airbnb reports that the rule is "very buggy".base-eslint.js
require-awaitSuperseded by the @typescript-eslint/require-await rule.base-eslint.js
require-unicode-regexpDisabled because requiring the u or the v flag for ASCII text is verbose and cumbersome. (Even though these flags would also enable regex strict mode, the marginal benefit is not worth the verbosity.)base-eslint.js
require-yieldbase-eslint.js
rest-spread-spacingDisabled because this is handled by Prettier.base-eslint.js
semiDisabled because this is handled by Prettier.base-eslint.js
semi-spacingDisabled because this is handled by Prettier.base-eslint.js
semi-styleDisabled because this is handled by Prettier.base-eslint.js
sort-importsDisabled since this is automatically handled by prettier-plugin-organize-imports.base-eslint.js
sort-keysDisabled because object keys are often not meant to be sorted in alphabetical order.base-eslint.js
sort-varsDisabled because variable declarations are often not meant to be sorted in alphabetical order.base-eslint.js
space-before-blocksDisabled because this is handled by Prettier.base-eslint.js
space-before-function-parenDisabled because this is handled by Prettier.base-eslint.js
space-in-parensDisabled because this is handled by Prettier.base-eslint.js
space-infix-opsDisabled because this is handled by Prettier.base-eslint.js
space-unary-opsDisabled because this is handled by Prettier.base-eslint.js
spaced-commentPartially superseded by isaacscript/format-jsdoc-comments and isaacscript/format-line-comments, but those rules do not handle trailing line comments. The markers option is provided to make this rule ignore lines that start with "///".base-eslint.js
strictThe never option is provided to make the rule stricter.base-eslint.js
switch-colon-spacingDisabled because this is handled by Prettier.base-eslint.js
symbol-descriptionbase-eslint.js
template-curly-spacingDisabled because this is handled by Prettier.base-eslint.js
template-tag-spacingDisabled because this is handled by Prettier.base-eslint.js
unicode-bombase-eslint.js
use-isnanbase-eslint.js
valid-typeofbase-eslint.js
vars-on-topbase-eslint.js
wrap-iifeDisabled because this is handled by Prettier.base-eslint.js
wrap-regexDisabled because this is handled by Prettier.base-eslint.js
yield-star-spacingDisabled because this is handled by Prettier.base-eslint.js
yodabase-eslint.js

eslint-plugin-no-autofix Rules

Rule NameEnabledParent ConfigsNotesSource File
no-autofix/no-useless-returnIt is common during development to comment out code after an early return. In these cases, the auto-fixer is harmful, since it would require us to manually go put the return statement back after uncommenting the code.base-no-autofix.js
no-autofix/prefer-constIt is common during development to comment out code that modifies a let variable. In these cases, the auto-fixer is harmful, since it would require us to manually go change the const back to a let after uncommenting the code.base-no-autofix.js

@typescript-eslint Rules

Rule NameEnabledParent ConfigsNotesSource File
@typescript-eslint/adjacent-overload-signaturesbase-typescript-eslint.js
@typescript-eslint/array-typeThe default value is array. We choose array-simple because it makes complicated arrays easier to understand. This is worth the cost of deviating from the base rule configuration.base-typescript-eslint.js
@typescript-eslint/await-thenablebase-typescript-eslint.js
@typescript-eslint/ban-ts-commentbase-typescript-eslint.js
@typescript-eslint/ban-tslint-commentbase-typescript-eslint.js
@typescript-eslint/ban-typesbase-typescript-eslint.js
@typescript-eslint/block-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/brace-styleDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/class-literal-property-stylebase-typescript-eslint.js
@typescript-eslint/class-methods-use-thisbase-typescript-eslint.js
@typescript-eslint/comma-dangleDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/comma-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/consistent-generic-constructorsbase-typescript-eslint.js
@typescript-eslint/consistent-indexed-object-stylebase-typescript-eslint.js
@typescript-eslint/consistent-returnDisabled since this is handled by the noImplicitReturns TypeScript compiler flag.base-typescript-eslint.js
@typescript-eslint/consistent-type-assertionsbase-typescript-eslint.js
@typescript-eslint/consistent-type-definitionsbase-typescript-eslint.js
@typescript-eslint/consistent-type-exportsbase-typescript-eslint.js
@typescript-eslint/consistent-type-importsbase-typescript-eslint.js
@typescript-eslint/default-param-lastbase-typescript-eslint.js
@typescript-eslint/dot-notationbase-typescript-eslint.js
@typescript-eslint/explicit-function-return-typeDisabled since it would be to cumbersome to require return types for non-exported functions. (It is more reasonable to require it for exported functions only, since it speeds up the type-checker in large codebases.)base-typescript-eslint.js
@typescript-eslint/explicit-member-accessibilityDisabled since many programs may have internal-only classes that would not benefit from an explicit public/private distinction.base-typescript-eslint.js
@typescript-eslint/explicit-module-boundary-typesbase-typescript-eslint.js
@typescript-eslint/func-call-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/indentDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/init-declarationsDisabled since it is superfluous to require an = undefined during variable initialization (and TypeScript will take care of the non-undefined cases).base-typescript-eslint.js
@typescript-eslint/key-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/keyword-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/lines-around-commentEven though the typescript-eslint team does not recommend using formatting rules, this rule is not handled by Prettier, so we must use ESLint to enforce it.base-typescript-eslint.js
@typescript-eslint/lines-between-class-membersEven though the typescript-eslint team does not recommend using formatting rules, this rule is not handled by Prettier, so we must use ESLint to enforce it.base-typescript-eslint.js
@typescript-eslint/max-paramsDisabled because enforcing an arbitrary parameter number threshold for every function in a project does not provide much value. (Additionally, using TypeScript reduces the value of such a check.)base-typescript-eslint.js
@typescript-eslint/member-delimiter-styleDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/member-orderingDisabled since prescribed class ordering is too project-specific.base-typescript-eslint.js
@typescript-eslint/method-signature-stylebase-typescript-eslint.js
@typescript-eslint/naming-conventionThe options are copied from Airbnb. We also allow a leading underscore, which signifies that the element is temporarily not being used.base-typescript-eslint.js
@typescript-eslint/no-array-constructorbase-typescript-eslint.js
@typescript-eslint/no-array-deletebase-typescript-eslint.js
@typescript-eslint/no-base-to-stringbase-typescript-eslint.js
@typescript-eslint/no-confusing-non-null-assertionbase-typescript-eslint.js
@typescript-eslint/no-confusing-void-expressionbase-typescript-eslint.js
@typescript-eslint/no-dupe-class-membersDisabled since it is superfluous when using TypeScript according to the ESLint documentation.base-typescript-eslint.js
@typescript-eslint/no-duplicate-enum-valuesbase-typescript-eslint.js
@typescript-eslint/no-duplicate-type-constituentsbase-typescript-eslint.js
@typescript-eslint/no-dynamic-deletebase-typescript-eslint.js
@typescript-eslint/no-empty-functionbase-typescript-eslint.js
@typescript-eslint/no-empty-interfaceThe allowSingleExtends option is enabled to allow for the common pattern of using using interfaces to provide an opaque type. (This can be useful with type-builders such as Zod, since z.infer uses Expand, which is sometimes not desired since it can lead to verbose/confusing mouseover tooltips and TypeScript errors.)base-typescript-eslint.js
@typescript-eslint/no-explicit-anybase-typescript-eslint.js
@typescript-eslint/no-extra-non-null-assertionbase-typescript-eslint.js
@typescript-eslint/no-extra-parensDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/no-extra-semiDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/no-extraneous-classbase-typescript-eslint.js
@typescript-eslint/no-floating-promises- The ignoreVoid option is disabled to make the rule stricter. - The rule is disabled in "*.test.ts" files because the built-in Node test runner returns a promise that is not meant to be awaited.base-typescript-eslint.js
@typescript-eslint/no-for-in-arraybase-typescript-eslint.js
@typescript-eslint/no-implied-evalbase-typescript-eslint.js
@typescript-eslint/no-import-type-side-effectsbase-typescript-eslint.js
@typescript-eslint/no-inferrable-typesbase-typescript-eslint.js
@typescript-eslint/no-invalid-thisThe capIsConstructor option is disabled to make the rule stricter.base-typescript-eslint.js
@typescript-eslint/no-invalid-void-typebase-typescript-eslint.js
@typescript-eslint/no-loop-funcbase-typescript-eslint.js
@typescript-eslint/no-loss-of-precisionbase-typescript-eslint.js
@typescript-eslint/no-magic-numbersDisabled since it results in too many false positives.base-typescript-eslint.js
@typescript-eslint/no-meaningless-void-operatorbase-typescript-eslint.js
@typescript-eslint/no-misused-newbase-typescript-eslint.js
@typescript-eslint/no-misused-promisesbase-typescript-eslint.js
@typescript-eslint/no-mixed-enumsbase-typescript-eslint.js
@typescript-eslint/no-namespacebase-typescript-eslint.js
@typescript-eslint/no-non-null-asserted-nullish-coalescingbase-typescript-eslint.js
@typescript-eslint/no-non-null-asserted-optional-chainbase-typescript-eslint.js
@typescript-eslint/no-non-null-assertionbase-typescript-eslint.js
@typescript-eslint/no-redeclareDisabled since it is handled by the combination of the TypeScript compiler and the no-var ESLint rule.base-typescript-eslint.js
@typescript-eslint/no-redundant-type-constituentsbase-typescript-eslint.js
@typescript-eslint/no-require-importsbase-typescript-eslint.js
@typescript-eslint/no-restricted-importsConfigured to prevent importing with some common patterns that are almost always a mistake: - "src" directories (but allowed in test files that are in a separate "tests" directory) - "dist" directories - "index" files (things in the same package should directly import instead of use the public API)base-typescript-eslint.js
@typescript-eslint/no-shadowbase-typescript-eslint.js
@typescript-eslint/no-this-aliasbase-typescript-eslint.js
@typescript-eslint/no-throw-literalbase-typescript-eslint.js
@typescript-eslint/no-type-aliasDisabled because this rule is deprecated.base-typescript-eslint.js
@typescript-eslint/no-unnecessary-boolean-literal-comparebase-typescript-eslint.js
@typescript-eslint/no-unnecessary-conditionbase-typescript-eslint.js
@typescript-eslint/no-unnecessary-qualifierbase-typescript-eslint.js
@typescript-eslint/no-unnecessary-type-argumentsbase-typescript-eslint.js
@typescript-eslint/no-unnecessary-type-assertionbase-typescript-eslint.js
@typescript-eslint/no-unnecessary-type-constraintbase-typescript-eslint.js
@typescript-eslint/no-unsafe-argumentbase-typescript-eslint.js
@typescript-eslint/no-unsafe-assignmentbase-typescript-eslint.js
@typescript-eslint/no-unsafe-callbase-typescript-eslint.js
@typescript-eslint/no-unsafe-declaration-mergingbase-typescript-eslint.js
@typescript-eslint/no-unsafe-enum-comparisonbase-typescript-eslint.js
@typescript-eslint/no-unsafe-member-accessbase-typescript-eslint.js
@typescript-eslint/no-unsafe-returnbase-typescript-eslint.js
@typescript-eslint/no-unsafe-unary-minusbase-typescript-eslint.js
@typescript-eslint/no-unused-expressionsThe allowTaggedTemplates option is enabled to allow the rule to work with libraries like execa.base-typescript-eslint.js
@typescript-eslint/no-unused-varsThe args option is set to all make the rule stricter. Additionally, we ignore things that begin with an underscore, since this matches the behavior of the --noUnusedLocals TypeScript compiler flag.base-typescript-eslint.js
@typescript-eslint/no-use-before-defineDisabled because it can prevent code from being structured sequentially.base-typescript-eslint.js
@typescript-eslint/no-useless-constructorbase-typescript-eslint.js
@typescript-eslint/no-useless-empty-exportbase-typescript-eslint.js
@typescript-eslint/no-useless-template-literalsbase-typescript-eslint.js
@typescript-eslint/no-var-requiresbase-typescript-eslint.js
@typescript-eslint/non-nullable-type-assertion-stylebase-typescript-eslint.js
@typescript-eslint/object-curly-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/padding-line-between-statementsDisabled since it is for inserting extra newlines between specific kinds of statements, which would be project-dependant. (This kind of formatting is not handled by Prettier.)base-typescript-eslint.js
@typescript-eslint/parameter-propertiesbase-typescript-eslint.js
@typescript-eslint/prefer-as-constbase-typescript-eslint.js
@typescript-eslint/prefer-destructuringObject destructuring is enforced but array destructuring is not. This matches usage in the general TypeScript ecosystem.base-typescript-eslint.js
@typescript-eslint/prefer-enum-initializersbase-typescript-eslint.js
@typescript-eslint/prefer-findbase-typescript-eslint.js
@typescript-eslint/prefer-for-ofbase-typescript-eslint.js
@typescript-eslint/prefer-function-typebase-typescript-eslint.js
@typescript-eslint/prefer-includesbase-typescript-eslint.js
@typescript-eslint/prefer-literal-enum-memberbase-typescript-eslint.js
@typescript-eslint/prefer-namespace-keywordbase-typescript-eslint.js
@typescript-eslint/prefer-nullish-coalescingbase-typescript-eslint.js
@typescript-eslint/prefer-optional-chainDisabled because it can modify the type of boolean declarations, which is undesired in some circumstances.base-typescript-eslint.js
@typescript-eslint/prefer-promise-reject-errorsThe allowEmptyReject option is enabled since this is a common pattern.base-typescript-eslint.js
@typescript-eslint/prefer-readonlybase-typescript-eslint.js
@typescript-eslint/prefer-readonly-parameter-typesSuperseded by the isaacscript/prefer-readonly-parameter-types rule.base-typescript-eslint.js
@typescript-eslint/prefer-reduce-type-parameterbase-typescript-eslint.js
@typescript-eslint/prefer-regexp-execDisabled since using the String.match form might make code easier to read.base-typescript-eslint.js
@typescript-eslint/prefer-return-this-typebase-typescript-eslint.js
@typescript-eslint/prefer-string-starts-ends-withbase-typescript-eslint.js
@typescript-eslint/prefer-ts-expect-errorbase-typescript-eslint.js
@typescript-eslint/promise-function-asyncbase-typescript-eslint.js
@typescript-eslint/quotesWe forbid unnecessary backticks by using the options specified in the eslint-config-prettier documentation.base-typescript-eslint.js
@typescript-eslint/require-array-sort-comparebase-typescript-eslint.js
@typescript-eslint/require-awaitbase-typescript-eslint.js
@typescript-eslint/restrict-plus-operandsThe various "allow" options are disabled to make the rule stricter.base-typescript-eslint.js
@typescript-eslint/restrict-template-expressionsDisabled since a common use-case of template strings is to coerce everything to a string.base-typescript-eslint.js
@typescript-eslint/return-awaitEven though the core rule was deprecated, the extended rule uses type information, so it is much better.base-typescript-eslint.js
@typescript-eslint/semiDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/sort-type-constituentsDisabled since in it does not make sense to sort a union alphabetically in many cases.base-typescript-eslint.js
@typescript-eslint/space-before-blocksDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/space-before-function-parenDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/space-infix-opsDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/strict-boolean-expressionsThe allowString and allowNumber options are disabled to make the rule stricter.base-typescript-eslint.js
@typescript-eslint/switch-exhaustiveness-checkThe allowDefaultCaseForExhaustiveSwitch option is disabled and the requireDefaultForNonUnion option is enabled to make the rule stricter.base-typescript-eslint.js
@typescript-eslint/triple-slash-referencebase-typescript-eslint.js
@typescript-eslint/type-annotation-spacingDisabled because this is handled by Prettier.base-typescript-eslint.js
@typescript-eslint/typedefDisabled since it is not recommended by the typescript-eslint team. (They recommend using the noImplicitAny and strictPropertyInitialization TypeScript compiler options instead.)base-typescript-eslint.js
@typescript-eslint/unbound-methodbase-typescript-eslint.js
@typescript-eslint/unified-signaturesbase-typescript-eslint.js
@typescript-eslint/use-unknown-in-catch-callback-variablebase-typescript-eslint.js

eslint-plugin-eslint-comments Rules

Rule NameEnabledParent ConfigsNotesSource File
eslint-comments/disable-enable-pairThe allowWholeFile option is enabled because it is common practice to use "eslint-disable" comments for a whole file.base-eslint-comments.js
eslint-comments/no-aggregating-enablebase-eslint-comments.js
eslint-comments/no-duplicate-disablebase-eslint-comments.js
eslint-comments/no-restricted-disableDisabled because it is only useful in projects that want to prevent disabling specific ESLint rules.base-eslint-comments.js
eslint-comments/no-unlimited-disableDisabled because if a line breaks three or more ESLint rules, then it is useful to use a single "eslint-disable" comment to make things more concise.base-eslint-comments.js
eslint-comments/no-unused-disablebase-eslint-comments.js
eslint-comments/no-unused-enablebase-eslint-comments.js
eslint-comments/no-useDisabled because we want to allow disabling ESLint rules where appropriate.base-eslint-comments.js
eslint-comments/require-descriptionDisabled because requiring descriptions for every ESLint disable would be too cumbersome.base-eslint-comments.js

eslint-plugin-import Rules

Rule NameEnabledParent ConfigsNotesSource File
import/consistent-type-specifier-stylebase-import.js
import/defaultDisabled because this is already handled by the TypeScript compiler.base-import.js
import/dynamic-import-chunknameDisabled because it is only useful in environments that use webpack.base-import.js
import/exportbase-import.js
import/exports-lastDisabled because this style is not generally used.base-import.js
import/extensionsDisabled because this is already handled by the TypeScript compiler.base-import.js
import/firstbase-import.js
import/group-exportsDisabled because this style is not generally used.base-import.js
import/imports-firstDisabled because this rule is deprecated.base-import.js
import/max-dependenciesDisabled since it will trigger false positives in codebases that prefer smaller files.base-import.js
import/namedDisabled because this is already handled by the TypeScript compiler.base-import.js
import/namespaceDisabled because this is already handled by the TypeScript compiler.base-import.js
import/newline-after-importbase-import.js
import/no-absolute-pathbase-import.js
import/no-amdbase-import.js
import/no-anonymous-default-exportDisabled since we disallow default exports elsewhere in this config (in favor of named exports).base-import.js
import/no-commonjsbase-import.js
import/no-cyclebase-import.js
import/no-default-exportThe case against default exports is layed out by Basarat Ali Syed.base-import.js
import/no-deprecatedSuperseded by the deprecation/deprecation rule. (That rule is better because it catches deprecated usage that does not come from import statements specifically.)base-import.js
import/no-duplicatesbase-import.js
import/no-dynamic-requirebase-import.js
import/no-empty-named-blocksbase-import.js
import/no-extraneous-dependenciesThe options are copied from Airbnb. We also add a "scripts" directory entry for "devDependencies".base-import.js
import/no-import-module-exportsbase-import.js
import/no-internal-modulesDisabled since a prescribed import pattern is not generalizable enough across projects.base-import.js
import/no-mutable-exportsbase-import.js
import/no-named-as-defaultbase-import.js
import/no-named-as-default-memberDisabled because this is already handled by the TypeScript compiler.base-import.js
import/no-named-defaultbase-import.js
import/no-named-exportDisabled since we disallow default exports elsewhere in this config (in favor of named exports).base-import.js
import/no-namespaceDisabled since it is too prescriptive for a general audience. (Using import * as is common.)base-import.js
import/no-nodejs-modulesDisabled because it is only used in specific environments (like the browser).base-import.js
import/no-relative-packagesbase-import.js
import/no-relative-parent-importsDisabled since a forward import direction pattern is not generalizable enough across projects.base-import.js
import/no-restricted-pathsDisabled since this rule should only contain a project-specific path restriction.base-import.js
import/no-self-importbase-import.js
import/no-unassigned-importbase-import.js
import/no-unresolvedDisabled because this is already handled by the TypeScript compiler.base-import.js
import/no-unused-modulesDisabled since this check is better performed by the knip tool.base-import.js
import/no-useless-path-segmentsbase-import.js
import/no-webpack-loader-syntaxbase-import.js
import/orderDisabled because this is automatically handled by prettier-plugin-organize-imports.base-import.js
import/prefer-default-exportDisabled because we disallow default exports elsewhere in this config (in favor of named exports).base-import.js
import/unambiguousDisabled because this is already handled by the TypeScript compiler.base-import.js

eslint-plugin-jsdoc Rules

Rule NameEnabledParent ConfigsNotesSource File
jsdoc/check-accessDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/check-alignmentSuperseded by the isaacscript/limit-jsdoc-comments rule.base-jsdoc.js
jsdoc/check-examplesDisabled since it does not work with ESLint 8.base-jsdoc.js
jsdoc/check-indentationSuperseded by the isaacscript/limit-jsdoc-comments rule.base-jsdoc.js
jsdoc/check-line-alignmentDisabled since this is not a common formatting scheme. It is also not recommended by the plugin authors.base-jsdoc.js
jsdoc/check-param-namesbase-jsdoc.js
jsdoc/check-property-namesDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/check-syntaxDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/check-tag-namesbase-jsdoc.js
jsdoc/check-typesDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/check-valuesbase-jsdoc.js
jsdoc/empty-tagsbase-jsdoc.js
jsdoc/implements-on-classesbase-jsdoc.js
jsdoc/imports-as-dependenciesDisabled since you cannot configure it with a path to the correct "package.json" file.base-jsdoc.js
jsdoc/informative-docsbase-jsdoc.js
jsdoc/match-descriptionSuperseded by the isaacscript/jsdoc-full-sentences rule.base-jsdoc.js
jsdoc/match-nameDisabled because it is only needed for projects with specific JSDoc requirements.base-jsdoc.js
jsdoc/multiline-blocksSuperseded by the isaacscript/limit-jsdoc-comments rule.base-jsdoc.js
jsdoc/newline-after-descriptionSuperseded by the isaacscript/limit-jsdoc-comments rule.base-jsdoc.js
jsdoc/no-bad-blocksDisabled because it provides little value; it only detects JSDoc comments with tags in them.base-jsdoc.js
jsdoc/no-blank-block-descriptionsSuperseded by the isaacscript/format-jsdoc-comments rule.base-jsdoc.js
jsdoc/no-blank-blocksSuperseded by the isaacscript/no-empty-jsdoc rule.base-jsdoc.js
jsdoc/no-defaultsDisabled because it provides little value; the @default tag is rare.base-jsdoc.js
jsdoc/no-missing-syntaxDisabled because it is too project-specific.base-jsdoc.js
jsdoc/no-multi-asterisksSuperseded by the isaacscript/limit-jsdoc-comments rule.base-jsdoc.js
jsdoc/no-restricted-syntaxDisabled because it is intended for disabling of specific language features per-project.base-jsdoc.js
jsdoc/no-typesThe contexts option is set to any to make the rule stricter.base-jsdoc.js
jsdoc/no-undefined-typesDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/require-asterisk-prefixbase-jsdoc.js
jsdoc/require-descriptionDisabled because it is overboard for every function to have a description.base-jsdoc.js
jsdoc/require-description-complete-sentenceSuperseded by the isaacscript/jsdoc-complete-sentences rule.base-jsdoc.js
jsdoc/require-exampleDisabled because it is overboard for every function to require an example.base-jsdoc.js
jsdoc/require-file-overviewDisabled because it is overboard for every file to require an overview.base-jsdoc.js
jsdoc/require-hyphen-before-param-descriptionThe never option is provided to make the rule match the format of the official TypeScript codebase.base-jsdoc.js
jsdoc/require-jsdocDisabled since it is overboard for every function to have a JSDoc comment.base-jsdoc.js
jsdoc/require-paramConfigured to only apply when there are one or more parameters.base-jsdoc.js
jsdoc/require-param-descriptionThe contexts option is set to any to make the rule stricter.base-jsdoc.js
jsdoc/require-param-nameThe contexts option is set to any to make the rule stricter.base-jsdoc.js
jsdoc/require-param-typeDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/require-propertyDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/require-property-descriptionbase-jsdoc.js
jsdoc/require-property-namebase-jsdoc.js
jsdoc/require-property-typeDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/require-returnsDisabled because it is overboard for every function to document every return value.base-jsdoc.js
jsdoc/require-returns-checkDisabled because it is overboard for every function to document every return value.base-jsdoc.js
jsdoc/require-returns-descriptionThe contexts option is set to any to make the rule stricter.base-jsdoc.js
jsdoc/require-returns-typeDisabled because it is not needed in TypeScript.base-jsdoc.js
jsdoc/require-throwsDisabled because it is overboard to document every throw statement.base-jsdoc.js
jsdoc/require-yieldsDisabled because it is overboard to document every yield.base-jsdoc.js
jsdoc/require-yields-checkDisabled because it is overboard to document every yield.base-jsdoc.js
jsdoc/sort-tagsDisabled because it is not very useful. In most cases, a function will only have @param and @return tags, making sorting unnecessary.base-jsdoc.js
jsdoc/tag-linesSuperseded by the isaacscript/format-jsdoc-comments rule.base-jsdoc.js
jsdoc/text-escapingDisabled since it is only useful in certain environments (e.g. when your project converts JSDoc comments to Markdown).base-jsdoc.js
jsdoc/valid-typesDisabled because it is not needed in TypeScript.base-jsdoc.js

eslint-plugin-n Rules

Rule NameEnabledParent ConfigsNotesSource File
n/callback-returnDisabled since stylistic rules from this plugin are not used.base-n.js
n/exports-styleDisabled since stylistic rules from this plugin are not used.base-n.js
n/file-extension-in-importThis rule is helpful to automatically fix file extensions in import statements throughout an entire codebase.base-n.js
n/global-requireDisabled since stylistic rules from this plugin are not used.base-n.js
n/handle-callback-errbase-n.js
n/no-callback-literalbase-n.js
n/no-deprecated-apibase-n.js
n/no-exports-assignbase-n.js
n/no-extraneous-importDisabled since it is handled by the TypeScript compiler.base-n.js
n/no-extraneous-requireDisabled since require statements are not used in TypeScript code.base-n.js
n/no-hide-core-modulesDisabled because this rule is deprecated.base-n.js
n/no-missing-importDisabled since it is handled by the TypeScript compiler.base-n.js
n/no-missing-requirebase-n.js
n/no-mixed-requiresDisabled since stylistic rules from this plugin are not used.base-n.js
n/no-new-requirebase-n.js
n/no-path-concatbase-n.js
n/no-process-envDisabled since stylistic rules from this plugin are not used.base-n.js
n/no-process-exitDisabled because using process.exit is common to exit command-line applications without verbose output.base-n.js
n/no-restricted-importDisabled since stylistic rules from this plugin are not used.base-n.js
n/no-restricted-requireDisabled since stylistic rules from this plugin are not used.base-n.js
n/no-syncDisabled since stylistic rules from this plugin are not used.base-n.js
n/no-unpublished-binbase-n.js
n/no-unpublished-importAn exception is made for files in a "scripts" directory, since those should be allowed to import from "devDependencies".base-n.js
n/no-unpublished-requirebase-n.js
n/no-unsupported-featuresDisabled because this rule is deprecated.base-n.js
n/no-unsupported-features/es-builtinsDisabled because it is assumed that we are running on modern versions of Node.js.base-n.js
n/no-unsupported-features/es-syntaxDisabled because it is assumed that our transpiler or runtime has support for the latest version of ESM.base-n.js
n/no-unsupported-features/node-builtinsDisabled since it is handled by the TypeScript compiler.base-n.js
n/prefer-global/bufferDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/consoleDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/processDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/text-decoderDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/text-encoderDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/urlDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-global/url-search-paramsDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-promises/dnsDisabled since stylistic rules from this plugin are not used.base-n.js
n/prefer-promises/fsDisabled since stylistic rules from this plugin are not used.base-n.js
n/process-exit-as-throwbase-n.js
n/shebangDisabled since it does not work very well with TypeScript. (It needs project-specific configuration depending on where the output directory is located.)base-n.js

eslint-plugin-unicorn Rules

Rule NameEnabledParent ConfigsNotesSource File
unicorn/better-regexbase-unicorn.js
unicorn/catch-error-namebase-unicorn.js
unicorn/consistent-destructuringDisabled because it has too many false positives.base-unicorn.js
unicorn/consistent-function-scopingbase-unicorn.js
unicorn/custom-error-definitionbase-unicorn.js
unicorn/empty-brace-spacesDisabled because this is handled by Prettier.base-unicorn.js
unicorn/error-messagebase-unicorn.js
unicorn/escape-casebase-unicorn.js
unicorn/expiring-todo-commentsbase-unicorn.js
unicorn/explicit-length-checkbase-unicorn.js
unicorn/filename-caseDisabled since projects may use different file naming conventions.base-unicorn.js
unicorn/import-indexDisabled because this rule is deprecated.base-unicorn.js
unicorn/import-stylebase-unicorn.js
unicorn/new-for-builtinsbase-unicorn.js
unicorn/no-abusive-eslint-disableSuperseded by the eslint-comments/no-unlimited-disable rule.base-unicorn.js
unicorn/no-array-callback-referenceDisabled since it is not helpful when using TypeScript.base-unicorn.js
unicorn/no-array-for-eachbase-unicorn.js
unicorn/no-array-instanceofDisabled because this rule is deprecated.base-unicorn.js
unicorn/no-array-method-this-argumentbase-unicorn.js
unicorn/no-array-push-pushbase-unicorn.js
unicorn/no-array-reducebase-unicorn.js
unicorn/no-await-expression-memberbase-unicorn.js
unicorn/no-console-spacesbase-unicorn.js
unicorn/no-document-cookiebase-unicorn.js
unicorn/no-empty-filebase-unicorn.js
unicorn/no-fn-reference-in-iteratorDisabled because this rule is deprecated.base-unicorn.js
unicorn/no-for-loopbase-unicorn.js
unicorn/no-hex-escapebase-unicorn.js
unicorn/no-instanceof-arraybase-unicorn.js
unicorn/no-invalid-remove-event-listenerbase-unicorn.js
unicorn/no-keyword-prefixDisabled because it is common to prefix variables with "new".base-unicorn.js
unicorn/no-lonely-ifbase-unicorn.js
unicorn/no-negated-conditionbase-unicorn.js
unicorn/no-nested-ternaryDisabled because this is handled by Prettier.base-unicorn.js
unicorn/no-new-arraybase-unicorn.js
unicorn/no-new-bufferbase-unicorn.js
unicorn/no-nullbase-unicorn.js
unicorn/no-object-as-default-parameterbase-unicorn.js
unicorn/no-process-exitDisabled because using process.exit is common to exit command-line applications without verbose output.base-unicorn.js
unicorn/no-reduceDisabled because this rule is deprecated.base-unicorn.js
unicorn/no-static-only-classbase-unicorn.js
unicorn/no-thenablebase-unicorn.js
unicorn/no-this-assignmentSuperseded by the @typescript-eslint/no-this-alias rule.base-unicorn.js
unicorn/no-typeof-undefinedbase-unicorn.js
unicorn/no-unnecessary-awaitbase-unicorn.js
unicorn/no-unnecessary-polyfillsbase-unicorn.js
unicorn/no-unreadable-array-destructuringbase-unicorn.js
unicorn/no-unreadable-iifebase-unicorn.js
unicorn/no-unsafe-regexDisabled because this rule is deprecated.base-unicorn.js
unicorn/no-unused-propertiesbase-unicorn.js
unicorn/no-useless-fallback-in-spreadbase-unicorn.js
unicorn/no-useless-length-checkbase-unicorn.js
unicorn/no-useless-promise-resolve-rejectbase-unicorn.js
unicorn/no-useless-spreadbase-unicorn.js
unicorn/no-useless-switch-casebase-unicorn.js
unicorn/no-useless-undefinedDisabled since it does not work properly with TypeScript.base-unicorn.js
unicorn/no-zero-fractionsbase-unicorn.js
unicorn/number-literal-caseDisabled because this is handled by Prettier.base-unicorn.js
unicorn/numeric-separators-stylebase-unicorn.js
unicorn/prefer-add-event-listenerbase-unicorn.js
unicorn/prefer-array-findbase-unicorn.js
unicorn/prefer-array-flatbase-unicorn.js
unicorn/prefer-array-flat-mapbase-unicorn.js
unicorn/prefer-array-index-ofbase-unicorn.js
unicorn/prefer-array-somebase-unicorn.js
unicorn/prefer-atbase-unicorn.js
unicorn/prefer-blob-reading-methodsbase-unicorn.js
unicorn/prefer-code-pointbase-unicorn.js
unicorn/prefer-datasetDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-date-nowbase-unicorn.js
unicorn/prefer-default-parametersbase-unicorn.js
unicorn/prefer-dom-node-appendbase-unicorn.js
unicorn/prefer-dom-node-datasetbase-unicorn.js
unicorn/prefer-dom-node-removebase-unicorn.js
unicorn/prefer-dom-node-text-contentbase-unicorn.js
unicorn/prefer-event-keyDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-event-targetbase-unicorn.js
unicorn/prefer-exponentiation-operatorDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-export-frombase-unicorn.js
unicorn/prefer-flat-mapDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-includesbase-unicorn.js
unicorn/prefer-json-parse-bufferDisabled because the rule is not compatible with TypeScript.base-unicorn.js
unicorn/prefer-keyboard-event-keybase-unicorn.js
unicorn/prefer-logical-operator-over-ternarybase-unicorn.js
unicorn/prefer-math-truncbase-unicorn.js
unicorn/prefer-modern-dom-apisbase-unicorn.js
unicorn/prefer-modern-math-apisbase-unicorn.js
unicorn/prefer-modulebase-unicorn.js
unicorn/prefer-native-coercion-functionsbase-unicorn.js
unicorn/prefer-negative-indexbase-unicorn.js
unicorn/prefer-node-appendDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-node-protocolbase-unicorn.js
unicorn/prefer-node-removeDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-number-propertiesbase-unicorn.js
unicorn/prefer-object-from-entriesbase-unicorn.js
unicorn/prefer-object-has-ownDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-optional-catch-bindingbase-unicorn.js
unicorn/prefer-prototype-methodsbase-unicorn.js
unicorn/prefer-query-selectorbase-unicorn.js
unicorn/prefer-reflect-applybase-unicorn.js
unicorn/prefer-regexp-testbase-unicorn.js
unicorn/prefer-replace-allDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-set-hasbase-unicorn.js
unicorn/prefer-set-sizebase-unicorn.js
unicorn/prefer-spreadbase-unicorn.js
unicorn/prefer-starts-ends-withDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-string-replace-allbase-unicorn.js
unicorn/prefer-string-slicebase-unicorn.js
unicorn/prefer-string-starts-ends-withbase-unicorn.js
unicorn/prefer-string-trim-start-endbase-unicorn.js
unicorn/prefer-switchbase-unicorn.js
unicorn/prefer-ternarybase-unicorn.js
unicorn/prefer-text-contentDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-top-level-awaitbase-unicorn.js
unicorn/prefer-trim-start-endDisabled because this rule is deprecated.base-unicorn.js
unicorn/prefer-type-errorbase-unicorn.js
unicorn/prevent-abbreviationsDisabled since it is common to use the variable name of "i".base-unicorn.js
unicorn/regex-shorthandDisabled because this rule is deprecated.base-unicorn.js
unicorn/relative-url-stylebase-unicorn.js
unicorn/require-array-join-separatorbase-unicorn.js
unicorn/require-number-to-fixed-digits-argumentbase-unicorn.js
unicorn/require-post-message-target-originDisabled since it is not recommended by the plugin authors.base-unicorn.js
unicorn/string-contentDisabled since string content enforcement is too project-specific.base-unicorn.js
unicorn/switch-case-bracesbase-unicorn.js
unicorn/template-indentbase-unicorn.js
unicorn/text-encoding-identifier-casebase-unicorn.js
unicorn/throw-new-errorbase-unicorn.js