What is eslint-plugin-unicorn?
The eslint-plugin-unicorn package is a set of ESLint rules that aim to improve code quality by enforcing best practices, preventing common mistakes, and suggesting modern syntax and methods. It includes a variety of rules that are not covered by the core ESLint rules or other plugins, focusing on code enhancements and consistency.
What are eslint-plugin-unicorn's main functionalities?
Filename Case
Enforces a specific case for filenames, which can be configured to be kebab-case, camelCase, or snake_case. This helps maintain consistency in the naming of files across a project.
"unicorn/filename-case": ["error", {"case": "kebabCase"}]
Number Literal Case
Enforces lowercase identifier and uppercase value for number literals, improving readability and consistency in the code.
"unicorn/number-literal-case": "error"
Prevent Abbreviations
Discourages the use of abbreviations in variable names, function names, and other identifiers to improve code clarity and readability.
"unicorn/prevent-abbreviations": ["error", {"replacements": {"temp": false, "err": {"error": true}}}]
Better Regex
Suggests simpler and more optimized regular expressions to improve performance and readability.
"unicorn/better-regex": "error"
Consistent Function Scoping
Enforces that functions are defined at the highest possible level, which can help with readability and reduce the complexity of nested functions.
"unicorn/consistent-function-scoping": "error"
Other packages similar to eslint-plugin-unicorn
eslint-plugin-import
This plugin provides linting rules related to ES2015+ import/export syntax, helping to ensure proper import order, naming, and file path correctness. It is similar to eslint-plugin-unicorn in that it enforces best practices, but it focuses specifically on module import and export issues.
eslint-plugin-promise
This plugin enforces best practices for JavaScript promises. It is similar to eslint-plugin-unicorn in its goal to improve code quality, but it focuses specifically on the use of promises and asynchronous code.
eslint-plugin-jsx-a11y
This plugin checks JSX code for accessibility issues, ensuring that web applications are accessible to users with disabilities. While eslint-plugin-unicorn focuses on general JavaScript code quality, eslint-plugin-jsx-a11y focuses on accessibility concerns in React and JSX.
eslint-plugin-react
This plugin provides React-specific linting rules. It is similar to eslint-plugin-unicorn in that it helps maintain code quality and consistency, but it is tailored specifically for React development.
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
Configure it in package.json
.
{
"name": "my-awesome-project",
"eslintConfig": {
"env": {
"es6": true
},
"parserOptions": {
"ecmaVersion": 2021,
"sourceType": "module"
},
"plugins": [
"unicorn"
],
"rules": {
"unicorn/better-regex": "error",
"unicorn/catch-error-name": "error",
"unicorn/consistent-destructuring": "error",
"unicorn/consistent-function-scoping": "error",
"unicorn/custom-error-definition": "off",
"unicorn/empty-brace-spaces": "error",
"unicorn/error-message": "error",
"unicorn/escape-case": "error",
"unicorn/expiring-todo-comments": "error",
"unicorn/explicit-length-check": "error",
"unicorn/filename-case": "error",
"unicorn/import-index": "off",
"unicorn/import-style": "error",
"unicorn/new-for-builtins": "error",
"unicorn/no-abusive-eslint-disable": "error",
"unicorn/no-array-callback-reference": "error",
"unicorn/no-array-for-each": "error",
"unicorn/no-array-method-this-argument": "error",
"unicorn/no-array-push-push": "error",
"unicorn/no-array-reduce": "error",
"unicorn/no-console-spaces": "error",
"unicorn/no-document-cookie": "error",
"unicorn/no-for-loop": "error",
"unicorn/no-hex-escape": "error",
"unicorn/no-instanceof-array": "error",
"unicorn/no-keyword-prefix": "off",
"unicorn/no-lonely-if": "error",
"no-nested-ternary": "off",
"unicorn/no-nested-ternary": "error",
"unicorn/no-new-array": "error",
"unicorn/no-new-buffer": "error",
"unicorn/no-null": "error",
"unicorn/no-object-as-default-parameter": "error",
"unicorn/no-process-exit": "error",
"unicorn/no-static-only-class": "error",
"unicorn/no-this-assignment": "error",
"unicorn/no-unreadable-array-destructuring": "error",
"unicorn/no-unsafe-regex": "off",
"unicorn/no-unused-properties": "off",
"unicorn/no-useless-length-check": "error",
"unicorn/no-useless-spread": "error",
"unicorn/no-useless-undefined": "error",
"unicorn/no-zero-fractions": "error",
"unicorn/number-literal-case": "error",
"unicorn/numeric-separators-style": "error",
"unicorn/prefer-add-event-listener": "error",
"unicorn/prefer-array-find": "error",
"unicorn/prefer-array-flat": "error",
"unicorn/prefer-array-flat-map": "error",
"unicorn/prefer-array-index-of": "error",
"unicorn/prefer-array-some": "error",
"unicorn/prefer-at": "off",
"unicorn/prefer-date-now": "error",
"unicorn/prefer-default-parameters": "error",
"unicorn/prefer-dom-node-append": "error",
"unicorn/prefer-dom-node-dataset": "error",
"unicorn/prefer-dom-node-remove": "error",
"unicorn/prefer-dom-node-text-content": "error",
"unicorn/prefer-includes": "error",
"unicorn/prefer-keyboard-event-key": "error",
"unicorn/prefer-math-trunc": "error",
"unicorn/prefer-modern-dom-apis": "error",
"unicorn/prefer-module": "error",
"unicorn/prefer-negative-index": "error",
"unicorn/prefer-node-protocol": "error",
"unicorn/prefer-number-properties": "error",
"unicorn/prefer-object-from-entries": "error",
"unicorn/prefer-object-has-own": "off",
"unicorn/prefer-optional-catch-binding": "error",
"unicorn/prefer-prototype-methods": "error",
"unicorn/prefer-query-selector": "error",
"unicorn/prefer-reflect-apply": "error",
"unicorn/prefer-regexp-test": "error",
"unicorn/prefer-set-has": "error",
"unicorn/prefer-spread": "error",
"unicorn/prefer-string-replace-all": "off",
"unicorn/prefer-string-slice": "error",
"unicorn/prefer-string-starts-ends-with": "error",
"unicorn/prefer-string-trim-start-end": "error",
"unicorn/prefer-switch": "error",
"unicorn/prefer-ternary": "error",
"unicorn/prefer-top-level-await": "off",
"unicorn/prefer-type-error": "error",
"unicorn/prevent-abbreviations": "error",
"unicorn/require-array-join-separator": "error",
"unicorn/require-number-to-fixed-digits-argument": "error",
"unicorn/require-post-message-target-origin": "error",
"unicorn/string-content": "off",
"unicorn/throw-new-error": "error"
},
"overrides": [
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {
"unicorn/require-post-message-target-origin": "off"
}
}
]
}
}
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-regex | Improve regexes by making them shorter, consistent, and safer. | β
| π§ | |
catch-error-name | Enforce a specific parameter name in catch clauses. | β
| π§ | |
consistent-destructuring | Use destructured variables over properties. | β
| π§ | π‘ |
consistent-function-scoping | Move function definitions to the highest possible scope. | β
| | |
custom-error-definition | Enforce correct Error subclassing. | | π§ | |
empty-brace-spaces | Enforce no spaces between braces. | β
| π§ | |
error-message | Enforce passing a message value when creating a built-in error. | β
| | |
escape-case | Require escape sequences to use uppercase values. | β
| π§ | |
expiring-todo-comments | Add expiration conditions to TODO comments. | β
| | |
explicit-length-check | Enforce explicitly comparing the length or size property of a value. | β
| π§ | π‘ |
filename-case | Enforce a case style for filenames. | β
| | |
import-index | Enforce importing index files with . . | | π§ | |
import-style | Enforce specific import styles per module. | β
| | |
new-for-builtins | Enforce the use of new for all builtins, except String , Number , Boolean , Symbol and BigInt . | β
| π§ | |
no-abusive-eslint-disable | Enforce specifying rules to disable in eslint-disable comments. | β
| | |
no-array-callback-reference | Prevent passing a function reference directly to iterator methods. | β
| | π‘ |
no-array-for-each | Prefer forβ¦of over Array#forEach(β¦) . | β
| π§ | |
no-array-method-this-argument | Disallow using the this argument in array methods. | β
| π§ | π‘ |
no-array-push-push | Enforce combining multiple Array#push() into one call. | β
| π§ | π‘ |
no-array-reduce | Disallow Array#reduce() and Array#reduceRight() . | β
| | |
no-console-spaces | Do not use leading/trailing space between console.log parameters. | β
| π§ | |
no-document-cookie | Do not use document.cookie directly. | β
| | |
no-for-loop | Do not use a for loop that can be replaced with a for-of loop. | β
| π§ | |
no-hex-escape | Enforce the use of Unicode escapes instead of hexadecimal escapes. | β
| π§ | |
no-instanceof-array | Require Array.isArray() instead of instanceof Array . | β
| π§ | |
no-keyword-prefix | Disallow identifiers starting with new or class . | | | |
no-lonely-if | Disallow if statements as the only statement in if blocks without else . | β
| π§ | |
no-nested-ternary | Disallow nested ternary expressions. | β
| π§ | |
no-new-array | Disallow new Array() . | β
| π§ | π‘ |
no-new-buffer | Enforce the use of Buffer.from() and Buffer.alloc() instead of the deprecated new Buffer() . | β
| π§ | π‘ |
no-null | Disallow the use of the null literal. | β
| π§ | π‘ |
no-object-as-default-parameter | Disallow the use of objects as default parameters. | β
| | |
no-process-exit | Disallow process.exit() . | β
| | |
no-static-only-class | Forbid classes that only have static members. | β
| π§ | |
no-this-assignment | Disallow assigning this to a variable. | β
| | |
no-unreadable-array-destructuring | Disallow unreadable array destructuring. | β
| π§ | |
no-unsafe-regex | Disallow unsafe regular expressions. | | | |
no-unused-properties | Disallow unused object properties. | | | |
no-useless-length-check | Disallow useless array length check. | β
| π§ | |
no-useless-spread | Disallow unnecessary spread. | β
| π§ | |
no-useless-undefined | Disallow useless undefined . | β
| π§ | |
no-zero-fractions | Disallow number literals with zero fractions or dangling dots. | β
| π§ | |
number-literal-case | Enforce proper case for numeric literals. | β
| π§ | |
numeric-separators-style | Enforce the style of numeric separators by correctly grouping digits. | β
| π§ | |
prefer-add-event-listener | Prefer .addEventListener() and .removeEventListener() over on -functions. | β
| π§ | |
prefer-array-find | Prefer .find(β¦) over the first element from .filter(β¦) . | β
| π§ | π‘ |
prefer-array-flat | Prefer Array#flat() over legacy techniques to flatten arrays. | β
| π§ | |
prefer-array-flat-map | Prefer .flatMap(β¦) over .map(β¦).flat() . | β
| π§ | |
prefer-array-index-of | Prefer Array#indexOf() over Array#findIndex() when looking for the index of an item. | β
| π§ | π‘ |
prefer-array-some | Prefer .some(β¦) over .filter(β¦).length check and .find(β¦) . | β
| π§ | π‘ |
prefer-at | Prefer .at() method for index access and String#charAt() . | | π§ | π‘ |
prefer-date-now | Prefer Date.now() to get the number of milliseconds since the Unix Epoch. | β
| π§ | |
prefer-default-parameters | Prefer default parameters over reassignment. | β
| π§ | π‘ |
prefer-dom-node-append | Prefer Node#append() over Node#appendChild() . | β
| π§ | |
prefer-dom-node-dataset | Prefer using .dataset on DOM elements over .setAttribute(β¦) . | β
| π§ | |
prefer-dom-node-remove | Prefer childNode.remove() over parentNode.removeChild(childNode) . | β
| π§ | π‘ |
prefer-dom-node-text-content | Prefer .textContent over .innerText . | β
| | π‘ |
prefer-includes | Prefer .includes() over .indexOf() and Array#some() when checking for existence or non-existence. | β
| π§ | π‘ |
prefer-keyboard-event-key | Prefer KeyboardEvent#key over KeyboardEvent#keyCode . | β
| π§ | |
prefer-math-trunc | Enforce the use of Math.trunc instead of bitwise operators. | β
| π§ | π‘ |
prefer-modern-dom-apis | Prefer .before() over .insertBefore() , .replaceWith() over .replaceChild() , prefer one of .before() , .after() , .append() or .prepend() over insertAdjacentText() and insertAdjacentElement() . | β
| π§ | |
prefer-module | Prefer JavaScript modules (ESM) over CommonJS. | β
| π§ | π‘ |
prefer-negative-index | Prefer negative index over .length - index for {String,Array,TypedArray}#slice() , Array#splice() and Array#at() . | β
| π§ | |
prefer-node-protocol | Prefer using the node: protocol when importing Node.js builtin modules. | β
| π§ | |
prefer-number-properties | Prefer Number static properties over global ones. | β
| π§ | π‘ |
prefer-object-from-entries | Prefer using Object.fromEntries(β¦) to transform a list of key-value pairs into an object. | β
| π§ | |
prefer-object-has-own | Prefer Object.hasOwn(β¦) over Object.prototype.hasOwnProperty.call(β¦) . | | π§ | |
prefer-optional-catch-binding | Prefer omitting the catch binding parameter. | β
| π§ | |
prefer-prototype-methods | Prefer borrowing methods from the prototype instead of the instance. | β
| π§ | |
prefer-query-selector | Prefer .querySelector() over .getElementById() , .querySelectorAll() over .getElementsByClassName() and .getElementsByTagName() . | β
| π§ | |
prefer-reflect-apply | Prefer Reflect.apply() over Function#apply() . | β
| π§ | |
prefer-regexp-test | Prefer RegExp#test() over String#match() and RegExp#exec() . | β
| π§ | |
prefer-set-has | Prefer Set#has() over Array#includes() when checking for existence or non-existence. | β
| π§ | π‘ |
prefer-spread | Prefer the spread operator over Array.from(β¦) , Array#concat(β¦) and Array#slice() . | β
| π§ | π‘ |
prefer-string-replace-all | Prefer String#replaceAll() over regex searches with the global flag. | | π§ | |
prefer-string-slice | Prefer String#slice() over String#substr() and String#substring() . | β
| π§ | |
prefer-string-starts-ends-with | Prefer String#startsWith() & String#endsWith() over RegExp#test() . | β
| π§ | π‘ |
prefer-string-trim-start-end | Prefer String#trimStart() / String#trimEnd() over String#trimLeft() / String#trimRight() . | β
| π§ | |
prefer-switch | Prefer switch over multiple else-if . | β
| π§ | |
prefer-ternary | Prefer ternary expressions over simple if-else statements. | β
| π§ | |
prefer-top-level-await | Prefer top-level await over top-level promises and async function calls. | | | π‘ |
prefer-type-error | Enforce throwing TypeError in type checking conditions. | β
| π§ | |
prevent-abbreviations | Prevent abbreviations. | β
| π§ | |
require-array-join-separator | Enforce using the separator argument with Array#join() . | β
| π§ | |
require-number-to-fixed-digits-argument | Enforce using the digits argument with Number#toFixed() . | β
| π§ | |
require-post-message-target-origin | Enforce using the targetOrigin argument with window.postMessage() . | β
| | π‘ |
string-content | Enforce better string content. | | π§ | π‘ |
throw-new-error | Require new when throwing an error. | β
| π§ | |
Deprecated Rules
See docs/deprecated-rules.md
Recommended config
This plugin exports a recommended
config that enforces good practices.
Enable it in your package.json
with the extends
option:
{
"name": "my-awesome-project",
"eslintConfig": {
"extends": "plugin:unicorn/recommended"
}
}
See the ESLint docs for more information about extending config files.
Note: This config will also enable the correct parser options and environment.
Maintainers
Former