eslint-plugin-unicorn

Various awesome ESLint rules

You might want to check out XO, which includes this plugin.

Propose or contribute a new rule ➡

Install

npm install --save-dev eslint eslint-plugin-unicorn

Usage

Use a preset config or configure each rules in package.json.

{
    "name": "my-awesome-project",
    "eslintConfig": {
        "env": {
            "es2022": true
        },
        "parserOptions": {
            "ecmaVersion": "latest",
            "sourceType": "module"
        },
        "plugins": [
            "unicorn"
        ],
        "rules": {
            "unicorn/better-regex": "error",
            "unicorn/…": "error"
        }
    }
}

Rules

Each rule has emojis denoting:

  • ✅ if it belongs to the recommended configuration
  • 🔧 if some problems reported by the rule are automatically fixable by the --fix command line option
  • 💡 if some problems reported by the rule are manually fixable by editor suggestions
Name                                        Description🔧💡
better-regexImprove regexes by making them shorter, consistent, and safer.🔧
catch-error-nameEnforce a specific parameter name in catch clauses.🔧
consistent-destructuringUse destructured variables over properties.🔧💡
consistent-function-scopingMove function definitions to the highest possible scope.
custom-error-definitionEnforce correct Error subclassing.🔧
empty-brace-spacesEnforce no spaces between braces.🔧
error-messageEnforce passing a message value when creating a built-in error.
escape-caseRequire escape sequences to use uppercase values.🔧
expiring-todo-commentsAdd expiration conditions to TODO comments.
explicit-length-checkEnforce explicitly comparing the length or size property of a value.🔧💡
filename-caseEnforce a case style for filenames.
import-styleEnforce specific import styles per module.
new-for-builtinsEnforce the use of new for all builtins, except String, Number, Boolean, Symbol and BigInt.🔧
no-abusive-eslint-disableEnforce specifying rules to disable in eslint-disable comments.
no-array-callback-referencePrevent passing a function reference directly to iterator methods.💡
no-array-for-eachPrefer for…of over the forEach method.🔧💡
no-array-method-this-argumentDisallow using the this argument in array methods.🔧💡
no-array-push-pushEnforce combining multiple Array#push() into one call.🔧💡
no-array-reduceDisallow Array#reduce() and Array#reduceRight().
no-await-expression-memberDisallow member access from await expression.🔧
no-console-spacesDo not use leading/trailing space between console.log parameters.🔧
no-document-cookieDo not use document.cookie directly.
no-empty-fileDisallow empty files.
no-for-loopDo not use a for loop that can be replaced with a for-of loop.🔧
no-hex-escapeEnforce the use of Unicode escapes instead of hexadecimal escapes.🔧
no-instanceof-arrayRequire Array.isArray() instead of instanceof Array.🔧
no-invalid-remove-event-listenerPrevent calling EventTarget#removeEventListener() with the result of an expression.
no-keyword-prefixDisallow identifiers starting with new or class.
no-lonely-ifDisallow if statements as the only statement in if blocks without else.🔧
no-nested-ternaryDisallow nested ternary expressions.🔧
no-new-arrayDisallow new Array().🔧💡
no-new-bufferEnforce the use of Buffer.from() and Buffer.alloc() instead of the deprecated new Buffer().🔧💡
no-nullDisallow the use of the null literal.🔧💡
no-object-as-default-parameterDisallow the use of objects as default parameters.
no-process-exitDisallow process.exit().
no-static-only-classDisallow classes that only have static members.🔧
no-thenableDisallow then property.
no-this-assignmentDisallow assigning this to a variable.
no-unreadable-array-destructuringDisallow unreadable array destructuring.🔧
no-unreadable-iifeDisallow unreadable IIFEs.
no-unsafe-regexDisallow unsafe regular expressions.
no-unused-propertiesDisallow unused object properties.
no-useless-fallback-in-spreadDisallow useless fallback when spreading in object literals.🔧
no-useless-length-checkDisallow useless array length check.🔧
no-useless-promise-resolve-rejectDisallow returning/yielding Promise.resolve/reject() in async functions or promise callbacks🔧
no-useless-spreadDisallow unnecessary spread.🔧
no-useless-switch-caseDisallow useless case in switch statements.💡
no-useless-undefinedDisallow useless undefined.🔧
no-zero-fractionsDisallow number literals with zero fractions or dangling dots.🔧
number-literal-caseEnforce proper case for numeric literals.🔧
numeric-separators-styleEnforce the style of numeric separators by correctly grouping digits.🔧
prefer-add-event-listenerPrefer .addEventListener() and .removeEventListener() over on-functions.🔧
prefer-array-findPrefer .find(…) over the first element from .filter(…).🔧💡
prefer-array-flatPrefer Array#flat() over legacy techniques to flatten arrays.🔧
prefer-array-flat-mapPrefer .flatMap(…) over .map(…).flat().🔧
prefer-array-index-ofPrefer Array#indexOf() over Array#findIndex() when looking for the index of an item.🔧💡
prefer-array-somePrefer .some(…) over .filter(…).length check and .find(…).🔧💡
prefer-atPrefer .at() method for index access and String#charAt().🔧💡
prefer-code-pointPrefer String#codePointAt(…) over String#charCodeAt(…) and String.fromCodePoint(…) over String.fromCharCode(…).💡
prefer-date-nowPrefer Date.now() to get the number of milliseconds since the Unix Epoch.🔧
prefer-default-parametersPrefer default parameters over reassignment.🔧💡
prefer-dom-node-appendPrefer Node#append() over Node#appendChild().🔧
prefer-dom-node-datasetPrefer using .dataset on DOM elements over calling attribute methods.🔧
prefer-dom-node-removePrefer childNode.remove() over parentNode.removeChild(childNode).🔧💡
prefer-dom-node-text-contentPrefer .textContent over .innerText.💡
prefer-export-fromPrefer export…from when re-exporting.🔧💡
prefer-includesPrefer .includes() over .indexOf() and Array#some() when checking for existence or non-existence.🔧💡
prefer-json-parse-bufferPrefer reading a JSON file as a buffer.🔧
prefer-keyboard-event-keyPrefer KeyboardEvent#key over KeyboardEvent#keyCode.🔧
prefer-math-truncEnforce the use of Math.trunc instead of bitwise operators.🔧💡
prefer-modern-dom-apisPrefer .before() over .insertBefore(), .replaceWith() over .replaceChild(), prefer one of .before(), .after(), .append() or .prepend() over insertAdjacentText() and insertAdjacentElement().🔧
prefer-modern-math-apisPrefer modern Math APIs over legacy patterns.🔧
prefer-modulePrefer JavaScript modules (ESM) over CommonJS.🔧💡
prefer-native-coercion-functionsPrefer using String, Number, BigInt, Boolean, and Symbol directly.🔧
prefer-negative-indexPrefer negative index over .length - index for {String,Array,TypedArray}#slice(), Array#splice() and Array#at().🔧
prefer-node-protocolPrefer using the node: protocol when importing Node.js builtin modules.🔧
prefer-number-propertiesPrefer Number static properties over global ones.🔧💡
prefer-object-from-entriesPrefer using Object.fromEntries(…) to transform a list of key-value pairs into an object.🔧
prefer-optional-catch-bindingPrefer omitting the catch binding parameter.🔧
prefer-prototype-methodsPrefer borrowing methods from the prototype instead of the instance.🔧
prefer-query-selectorPrefer .querySelector() over .getElementById(), .querySelectorAll() over .getElementsByClassName() and .getElementsByTagName().🔧
prefer-reflect-applyPrefer Reflect.apply() over Function#apply().🔧
prefer-regexp-testPrefer RegExp#test() over String#match() and RegExp#exec().🔧
prefer-set-hasPrefer Set#has() over Array#includes() when checking for existence or non-existence.🔧💡
prefer-spreadPrefer the spread operator over Array.from(…), Array#concat(…), Array#slice() and String#split('').🔧💡
prefer-string-replace-allPrefer String#replaceAll() over regex searches with the global flag.🔧
prefer-string-slicePrefer String#slice() over String#substr() and String#substring().🔧
prefer-string-starts-ends-withPrefer String#startsWith() & String#endsWith() over RegExp#test().🔧💡
prefer-string-trim-start-endPrefer String#trimStart() / String#trimEnd() over String#trimLeft() / String#trimRight().🔧
prefer-switchPrefer switch over multiple else-if.🔧
prefer-ternaryPrefer ternary expressions over simple if-else statements.🔧
prefer-top-level-awaitPrefer top-level await over top-level promises and async function calls.💡
prefer-type-errorEnforce throwing TypeError in type checking conditions.🔧
prevent-abbreviationsPrevent abbreviations.🔧
relative-url-styleEnforce consistent relative URL style.🔧💡
require-array-join-separatorEnforce using the separator argument with Array#join().🔧
require-number-to-fixed-digits-argumentEnforce using the digits argument with Number#toFixed().🔧
require-post-message-target-originEnforce using the targetOrigin argument with window.postMessage().💡
string-contentEnforce better string content.🔧💡
template-indentFix whitespace-insensitive template indentation.🔧
text-encoding-identifier-caseEnforce consistent case for text encoding identifiers.🔧💡
throw-new-errorRequire new when throwing an error.🔧

Deprecated Rules

See docs/deprecated-rules.md

Preset configs

See the ESLint docs for more information about extending config files.

Note: Preset configs will also enable the correct parser options and environment.

Recommended config

This plugin exports a recommended config that enforces good practices.

{
    "name": "my-awesome-project",
    "eslintConfig": {
        "extends": "plugin:unicorn/recommended"
    }
}

All config

This plugin exports an all config that makes use of all rules (except for deprecated ones).

{
    "name": "my-awesome-project",
    "eslintConfig": {
        "extends": "plugin:unicorn/all"
    }
}

Maintainers

Former