More than 200 powerful ESLint rules
You might want to check out XO, which includes this plugin.
Most rules target JavaScript and TypeScript, but some also lint CSS, HTML, JSON, and Markdown when used with the matching ESLint language plugin.
Propose or contribute a new rule ➡
npm install --save-dev eslint eslint-plugin-unicornRequires ESLint >=10.4, flat config, and ESM.
Use a preset config or configure each rule in eslint.config.js.
If you don't use a preset, set the same languageOptions as shown below.
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
import globals from 'globals';
export default [
{
languageOptions: {
globals: globals.builtin,
},
plugins: {
unicorn: eslintPluginUnicorn,
},
rules: {
'unicorn/prefer-module': 'error',
'unicorn/…': 'error',
},
},
// …
];💼 Configurations enabled in.
✅ Set in the recommended configuration.
☑️ Set in the unopinionated configuration.
🔧 Automatically fixable by the --fix CLI option.
💡 Manually fixable by editor suggestions.
| Name | Description | 💼 | 🔧 | 💡 |
|---|---|---|---|---|
| better-dom-traversing | Prefer better DOM traversal APIs. | ✅ ☑️ | 💡 | |
| catch-error-name | Enforce a specific parameter name in catch clauses. | ✅ | 🔧 | |
| class-reference-in-static-methods | Enforce consistent class references in static methods. | ✅ | 💡 | |
| comment-content | Enforce better comment content. | ✅ | 🔧 | |
| consistent-assert | Enforce consistent assertion style with node:assert. |
✅ | 🔧 | |
| consistent-class-member-order | Enforce consistent class member order. | ✅ | 💡 | |
| consistent-compound-words | Enforce consistent spelling of compound words in identifiers. | ✅ ☑️ | 💡 | |
| consistent-date-clone | Prefer passing Date directly to the constructor when cloning. |
✅ ☑️ | 🔧 | |
| consistent-destructuring | Use destructured variables over properties. | 💡 | ||
| consistent-empty-array-spread | Prefer consistent types when spreading a ternary in an array literal. | ✅ | 🔧 | |
| consistent-existence-index-check | Enforce consistent style for element existence checks with indexOf(), lastIndexOf(), findIndex(), and findLastIndex(). |
✅ ☑️ | 🔧 | |
| consistent-export-decorator-position | Enforce consistent decorator position on exported classes. | ✅ ☑️ | 🔧 | |
| consistent-function-scoping | Move function definitions to the highest possible scope. | ✅ | ||
| consistent-function-style | Enforce function syntax by role. | 💡 | ||
| consistent-json-file-read | Enforce consistent JSON file reads before JSON.parse(). |
✅ | 🔧 | |
| consistent-optional-chaining | Enforce consistent optional chaining for same-base member access. | ✅ ☑️ | 💡 | |
| consistent-template-literal-escape | Enforce consistent style for escaping ${ in template literals. |
✅ | 🔧 | |
| custom-error-definition | Enforce correct Error subclassing. |
🔧 | ||
| dom-node-dataset | Enforce consistent style for DOM element dataset access. | ✅ ☑️ | 🔧 | |
| 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 or lowercase values. | ✅ ☑️ | 🔧 | |
| expiring-todo-comments | Add expiration conditions to TODO comments. | ✅ ☑️ | ||
| explicit-length-check | Enforce explicitly comparing the length or size property of a value. |
✅ | 🔧 | 💡 |
| explicit-timer-delay | Enforce or disallow explicit delay argument for setTimeout() and setInterval(). |
✅ ☑️ | 🔧 | |
| filename-case | Enforce a case style for filenames and directory names. | ✅ | ||
| id-match | Require identifiers to match a specified regular expression. | |||
| import-style | Enforce specific import styles per module. | ✅ ☑️ | ||
| isolated-functions | Prevent usage of variables from outside the scope of isolated functions. | ✅ | ||
| max-nested-calls | Limit the depth of nested calls. | ✅ | ||
| 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-accessor-recursion | Disallow recursive access to this within getters and setters. |
✅ ☑️ | ||
| no-anonymous-default-export | Disallow anonymous functions and classes as the default export. | ✅ ☑️ | 💡 | |
| no-array-callback-reference | Prevent passing a function reference directly to iterator methods. | ✅ | 💡 | |
| no-array-fill-with-reference-type | Disallow using reference values as Array#fill() values. |
✅ ☑️ | ||
| no-array-from-fill | Disallow .fill() after Array.from({length: …}). |
✅ ☑️ | ||
| no-array-method-this-argument | Disallow using the this argument in array methods. |
✅ ☑️ | 🔧 | 💡 |
| no-array-reduce | Disallow Array#reduce() and Array#reduceRight(). |
✅ | 🔧 | |
| no-array-reverse | Prefer Array#toReversed() over Array#reverse(). |
✅ ☑️ | 💡 | |
| no-array-sort | Prefer Array#toSorted() over Array#sort(). |
✅ ☑️ | 💡 | |
| no-asterisk-prefix-in-documentation-comments | Disallow asterisk prefixes in documentation comments. | 🔧 | ||
| no-await-expression-member | Disallow member access from await expression. | ✅ | 🔧 | |
| no-await-in-promise-methods | Disallow using await in Promise method parameters. |
✅ ☑️ | 💡 | |
| no-blob-to-file | Disallow unnecessary Blob to File conversion. |
✅ ☑️ | 💡 | |
| no-break-in-nested-loop | Disallow break and continue in nested loops and switches inside loops. |
✅ | ||
| no-canvas-to-image | Prefer drawing canvases directly instead of converting them to images. | ✅ ☑️ | ||
| no-computed-property-existence-check | Disallow dynamic object property existence checks. | ✅ | 💡 | |
| no-confusing-array-splice | Disallow confusing uses of Array#{splice,toSpliced}(). |
✅ | 💡 | |
| no-confusing-array-with | Disallow confusing uses of Array#with(). |
✅ | ||
| no-console-spaces | Do not use leading/trailing space between console.log parameters. |
✅ ☑️ | 🔧 | |
| no-declarations-before-early-exit | Disallow declarations before conditional early exits when they are only used after the exit. | ✅ ☑️ | 🔧 | |
| no-document-cookie | Do not use document.cookie directly. |
✅ ☑️ | ||
| no-duplicate-loops | Disallow .map() and .filter() in for…of and for await…of loop headers. |
✅ | ||
| no-duplicate-set-values | Disallow duplicate values in Set constructor array literals. |
✅ | ||
| no-empty-file | Disallow empty files. | ✅ ☑️ | ||
| no-error-property-assignment | Disallow assigning to built-in error properties. | ✅ ☑️ | ||
| no-exports-in-scripts | Disallow exports in scripts. | ✅ ☑️ | ||
| no-for-each | Prefer for…of over the forEach method. |
✅ ☑️ | 🔧 | 💡 |
| no-for-loop | Do not use a for loop that can be replaced with a for-of loop. |
✅ | 🔧 | |
| no-global-object-property-assignment | Disallow assigning properties on the global object. | ✅ ☑️ | ||
| no-immediate-mutation | Disallow immediate mutation after variable assignment. | ✅ | 🔧 | 💡 |
| no-incorrect-query-selector | Disallow incorrect querySelector() and querySelectorAll() usage. |
✅ | 🔧 | |
| no-incorrect-template-string-interpolation | Disallow incorrect template literal interpolation syntax. | ✅ ☑️ | 💡 | |
| no-instanceof-builtins | Disallow instanceof with built-in objects |
✅ ☑️ | 🔧 | 💡 |
| no-invalid-argument-count | Disallow calling functions with an invalid number of arguments. | ✅ ☑️ | ||
| no-invalid-fetch-options | Disallow invalid options in fetch() and new Request(). |
✅ ☑️ | ||
| no-invalid-file-input-accept | Disallow invalid accept values on file inputs. |
🔧 | ||
| no-invalid-remove-event-listener | Prevent calling EventTarget#removeEventListener() with the result of an expression. |
✅ ☑️ | ||
| no-keyword-prefix | Disallow identifiers starting with new or class. |
|||
| no-late-current-target-access | Disallow accessing event.currentTarget after the synchronous event dispatch has finished. |
✅ | ||
| no-lonely-if | Disallow if statements as the only statement in if blocks without else. |
✅ ☑️ | 🔧 | |
| no-magic-array-flat-depth | Disallow a magic number as the depth argument in Array#flat(…).
|
✅ ☑️ | ||
| no-manually-wrapped-comments | Disallow manually wrapped comments. | 🔧 | ||
| no-mismatched-map-key | Disallow checking a Map key before accessing a different key. | ✅ | ||
| no-named-default | Disallow named usage of default import and export. | ✅ ☑️ | 🔧 | |
| no-negated-array-predicate | Disallow negated array predicate calls. | ✅ ☑️ | 🔧 | |
| no-negated-comparison | Disallow negated comparisons. | ✅ ☑️ | 🔧 | 💡 |
| no-negated-condition | Disallow negated conditions. | ✅ ☑️ | 🔧 | |
| no-negation-in-equality-check | Disallow negated expression in equality check. | ✅ ☑️ | 💡 | |
| 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-object-methods-with-collections | Disallow Object methods with Map or Set. |
✅ | 💡 | |
| no-optional-chaining-on-undeclared-variable | Disallow optional chaining on undeclared variables. | ✅ | ||
| no-process-exit | Disallow process.exit(). |
✅ ☑️ | ||
| no-redundant-comparison | Disallow comparisons made redundant by an equality check in the same logical AND. | ✅ ☑️ | 🔧 | 💡 |
| no-return-array-push | Disallow returning the result of Array#push() with arguments. |
✅ | 💡 | |
| no-single-promise-in-promise-methods | Disallow passing single-element arrays to Promise methods. |
✅ ☑️ | 🔧 | 💡 |
| no-static-only-class | Disallow classes that only have static members. | ✅ ☑️ | 🔧 | |
| no-subtraction-comparison | Prefer comparing values directly over subtracting and comparing to 0. |
✅ ☑️ | 🔧 | 💡 |
| no-thenable | Disallow then property. |
✅ ☑️ | ||
| no-this-assignment | Disallow assigning this to a variable. |
✅ ☑️ | ||
| no-this-outside-of-class | Disallow this outside of classes. |
✅ | ||
| no-top-level-side-effects | Disallow top-level side effects in exported modules. | ✅ ☑️ | ||
| no-typeof-undefined | Disallow comparing undefined using typeof. |
✅ ☑️ | 🔧 | 💡 |
| no-undeclared-class-members | Require class members to be declared. | ✅ | 💡 | |
| no-unnecessary-array-flat-depth | Disallow using 1 as the depth argument of Array#flat(). |
✅ ☑️ | 🔧 | |
| no-unnecessary-array-splice-count | Disallow using .length or Infinity as the deleteCount or skipCount argument of Array#{splice,toSpliced}(). |
✅ ☑️ | 🔧 | |
| no-unnecessary-await | Disallow awaiting non-promise values. | ✅ ☑️ | 🔧 | |
| no-unnecessary-global-this | Disallow unnecessary globalThis references. |
✅ ☑️ | 🔧 | |
| no-unnecessary-nested-ternary | Disallow unnecessary nested ternary expressions. | ✅ ☑️ | 🔧 | |
| no-unnecessary-polyfills | Enforce the use of built-in methods instead of unnecessary polyfills. | ✅ ☑️ | ||
| no-unnecessary-slice-end | Disallow using .length or Infinity as the end argument of {Array,String,TypedArray}#slice(). |
✅ ☑️ | 🔧 | |
| no-unnecessary-splice | Disallow Array#splice() when simpler alternatives exist. |
✅ | 🔧 | |
| no-unreadable-array-destructuring | Disallow unreadable array destructuring. | ✅ ☑️ | 🔧 | |
| no-unreadable-iife | Disallow unreadable IIFEs. | ✅ ☑️ | 💡 | |
| no-unreadable-new-expression | Disallow unreadable new expressions. |
✅ | ||
| no-unreadable-object-destructuring | Disallow unreadable object destructuring. | ✅ ☑️ | ||
| no-unsafe-buffer-conversion | Prevent unsafe use of ArrayBuffer view .buffer. |
✅ ☑️ | 💡 | |
| no-unsafe-dom-html | Disallow unsafe DOM HTML APIs. | |||
| no-unsafe-property-key | Disallow unsafe values as property keys. | ✅ | ||
| no-unsafe-string-replacement | Disallow non-literal replacement values in String#replace() and String#replaceAll(). |
✅ | ||
| no-unused-array-method-return | Disallow ignoring the return value of selected array methods. | ✅ ☑️ | ||
| no-unused-properties | Disallow unused object properties. | |||
| no-useless-boolean-cast | Disallow unnecessary Boolean() casts in array predicate callbacks. |
✅ ☑️ | 🔧 | |
| no-useless-collection-argument | Disallow useless values or fallbacks in Set, Map, WeakSet, or WeakMap. |
✅ ☑️ | 🔧 | 💡 |
| no-useless-concat | Disallow useless concatenation of literals. | ✅ ☑️ | 🔧 | |
| no-useless-else | Disallow else after a statement that exits. |
✅ | 🔧 | |
| no-useless-error-capture-stack-trace | Disallow unnecessary Error.captureStackTrace(…). |
✅ ☑️ | 🔧 | |
| no-useless-fallback-in-spread | Disallow useless fallback when spreading in object literals. | ✅ ☑️ | 🔧 | |
| no-useless-iterator-to-array | Disallow unnecessary .toArray() on iterators. |
✅ ☑️ | 🔧 | 💡 |
| no-useless-length-check | Disallow useless array length check. | ✅ ☑️ | 🔧 | |
| no-useless-promise-resolve-reject | Disallow returning/yielding Promise.resolve/reject() in async functions or promise callbacks |
✅ ☑️ | 🔧 | |
| no-useless-recursion | Disallow simple recursive function calls that can be replaced with a loop. | ✅ | ||
| no-useless-spread | Disallow unnecessary spread. | ✅ ☑️ | 🔧 | 💡 |
| no-useless-switch-case | Disallow useless case in switch statements. | ✅ ☑️ | 💡 | |
| no-useless-template-literals | Disallow useless template literal expressions. | ✅ ☑️ | 🔧 | 💡 |
| 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-add-event-listener-options | Prefer an options object over a boolean in .addEventListener(). |
✅ ☑️ | 🔧 | |
| prefer-array-find | Prefer .find(…) and .findLast(…) over the first or last element from .filter(…). |
✅ ☑️ | 🔧 | 💡 |
| prefer-array-flat | Prefer Array#flat() over legacy techniques to flatten arrays. |
✅ ☑️ | 🔧 | |
| prefer-array-flat-map | Prefer .flatMap(…) over .map(…).flat() and .filter(…).flatMap(…). |
✅ ☑️ | 🔧 | 💡 |
| prefer-array-from-map | Prefer using the Array.from() mapping function argument. |
✅ ☑️ | 🔧 | 💡 |
| prefer-array-index-of | Prefer Array#{indexOf,lastIndexOf}() over Array#{findIndex,findLastIndex}() when looking for the index of an item. |
✅ ☑️ | 🔧 | 💡 |
| prefer-array-last-methods | Prefer last-oriented array methods over Array#reverse() or Array#toReversed() followed by a method. |
✅ ☑️ | 💡 | |
| prefer-array-some | Prefer .some(…) over .filter(…).length check and .{find,findLast,findIndex,findLastIndex}(…). |
✅ ☑️ | 🔧 | 💡 |
| prefer-at | Prefer .at() method for index access and String#charAt(). |
✅ ☑️ | 🔧 | 💡 |
| prefer-await | Prefer await over promise chaining. |
✅ ☑️ | ||
| prefer-bigint-literals | Prefer BigInt literals over the constructor. |
✅ ☑️ | 🔧 | 💡 |
| prefer-blob-reading-methods | Prefer Blob#arrayBuffer() over FileReader#readAsArrayBuffer(…) and Blob#text() over FileReader#readAsText(…). |
✅ ☑️ | ||
| prefer-class-fields | Prefer class field declarations over this assignments in constructors. |
✅ ☑️ | 🔧 | 💡 |
| prefer-classlist-toggle | Prefer using Element#classList.toggle() to toggle class names. |
✅ ☑️ | 🔧 | 💡 |
| prefer-code-point | Prefer String#codePointAt(…) over String#charCodeAt(…) and String.fromCodePoint(…) over String.fromCharCode(…). |
✅ ☑️ | 💡 | |
| 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-direct-iteration | Prefer direct iteration over default iterator method calls. | ✅ ☑️ | 🔧 | |
| prefer-dispose | Prefer using using/await using over manual try/finally resource disposal. |
💡 | ||
| prefer-dom-node-append | Prefer Element#append() over Node#appendChild(). |
✅ ☑️ | 🔧 | |
| prefer-dom-node-html-methods | Prefer .getHTML() and .setHTML() over .innerHTML. |
🔧 | 💡 | |
| prefer-dom-node-remove | Prefer childNode.remove() over parentNode.removeChild(childNode). |
✅ ☑️ | 🔧 | 💡 |
| prefer-dom-node-text-content | Prefer .textContent over .innerText. |
✅ ☑️ | 💡 | |
| prefer-early-return | Prefer early returns over full-function conditional wrapping. | ✅ ☑️ | 🔧 | 💡 |
| prefer-event-target | Prefer EventTarget over EventEmitter. |
✅ ☑️ | ||
| prefer-export-from | Prefer export…from when re-exporting. |
✅ | 🔧 | 💡 |
| prefer-get-or-insert-computed | Prefer .getOrInsertComputed() when the default value has side effects. |
✅ | 🔧 | |
| prefer-global-number-constants | Prefer global numeric constants over Number static properties. |
✅ ☑️ | 🔧 | |
| prefer-global-this | Prefer globalThis over window, self, and global. |
✅ ☑️ | 🔧 | |
| prefer-https | Prefer HTTPS over HTTP. | ✅ | 🔧 | |
| prefer-identifier-import-export-specifiers | Prefer identifiers over string literals in import and export specifiers. | ✅ ☑️ | 🔧 | |
| prefer-import-meta-properties | Prefer import.meta.{dirname,filename} over legacy techniques for getting file paths. |
🔧 | ||
| prefer-includes | Prefer .includes() over .indexOf(), .lastIndexOf(), and Array#some() when checking for existence or non-existence. |
✅ ☑️ | 🔧 | 💡 |
| prefer-includes-over-repeated-comparisons | Prefer .includes() over repeated equality comparisons. |
✅ | ||
| prefer-iterable-in-constructor | Prefer passing iterables directly to constructors instead of filling empty collections. | ✅ ☑️ | 🔧 | |
| prefer-iterator-concat | Prefer Iterator.concat(…) over temporary spread arrays. |
🔧 | 💡 | |
| prefer-iterator-to-array | Prefer Iterator#toArray() over temporary arrays from iterator spreads. |
✅ | 🔧 | 💡 |
| prefer-iterator-to-array-at-end | Prefer moving .toArray() to the end of iterator helper chains. |
✅ ☑️ | 💡 | |
| prefer-keyboard-event-key | Prefer KeyboardEvent#key over deprecated keyboard event properties. |
✅ ☑️ | 🔧 | 💡 |
| prefer-location-assign | Prefer location.assign() over assigning to location.href. |
✅ | 🔧 | |
| prefer-logical-operator-over-ternary | Prefer using a logical operator over a ternary. | ✅ ☑️ | 💡 | |
| prefer-math-abs | Prefer Math.abs() over manual absolute value expressions and symmetric range checks. |
✅ ☑️ | 🔧 | |
| prefer-math-min-max | Prefer Math.min() and Math.max() over ternaries for simple comparisons. |
✅ ☑️ | 🔧 | |
| prefer-math-trunc | Prefer Math.trunc() for truncating numbers. |
✅ ☑️ | 🔧 | 💡 |
| prefer-minimal-ternary | Prefer moving ternaries into the minimal varying part of an expression. | ✅ ☑️ | ||
| prefer-modern-dom-apis | Prefer modern DOM APIs. | ✅ ☑️ | 🔧 | |
| prefer-modern-math-apis | Prefer modern Math APIs over legacy patterns. |
✅ ☑️ | 🔧 | |
| prefer-module | Prefer JavaScript modules (ESM) over CommonJS. | ✅ ☑️ | 🔧 | 💡 |
| prefer-native-coercion-functions | Prefer using String, Number, BigInt, Boolean, and Symbol directly. |
✅ ☑️ | 🔧 | |
| prefer-negative-index | Prefer negative index over .length - index when possible. |
✅ ☑️ | 🔧 | |
| prefer-node-protocol | Prefer using the node: protocol when importing Node.js builtin modules. |
✅ ☑️ | 🔧 | |
| prefer-number-coercion | Prefer Number() over parseFloat() and base-10 parseInt(). |
✅ ☑️ | 💡 | |
| prefer-number-is-safe-integer | Prefer Number.isSafeInteger() over integer checks. |
✅ | 💡 | |
| prefer-number-properties | Prefer Number static methods over global functions and optionally static properties over global constants. |
✅ ☑️ | 🔧 | 💡 |
| prefer-object-define-properties | Prefer Object.defineProperties() over multiple Object.defineProperty() calls. |
✅ ☑️ | 🔧 | |
| prefer-object-destructuring-defaults | Prefer object destructuring defaults over default object literals with spread. | ✅ | 💡 | |
| prefer-object-from-entries | Prefer using Object.fromEntries(…) to transform a list of key-value pairs into an object. |
✅ ☑️ | 🔧 | |
| prefer-object-iterable-methods | Prefer the most specific Object iterable method. |
✅ ☑️ | 🔧 | |
| prefer-optional-catch-binding | Prefer omitting the catch binding parameter. |
✅ ☑️ | 🔧 | |
| prefer-path2d | Prefer Path2D for repeatedly drawn canvas paths. |
✅ ☑️ | ||
| prefer-private-class-fields | Prefer private class fields over the underscore-prefix convention. | ✅ | 🔧 | |
| prefer-prototype-methods | Prefer borrowing methods from the prototype instead of the instance. | ✅ ☑️ | 🔧 | |
| prefer-query-selector | Prefer .querySelector() and .querySelectorAll() over older DOM query methods. |
✅ | 🔧 | |
| prefer-queue-microtask | Prefer queueMicrotask() over process.nextTick(), setImmediate(), and setTimeout(…, 0). |
✅ ☑️ | 🔧 | |
| prefer-reflect-apply | Prefer Reflect.apply() over Function#apply(). |
✅ ☑️ | 🔧 | |
| prefer-regexp-test | Prefer RegExp#test() over String#match(), String#search(), and RegExp#exec(). |
✅ ☑️ | 🔧 | 💡 |
| prefer-response-static-json | Prefer Response.json() over new Response(JSON.stringify()). |
✅ ☑️ | 🔧 | |
| prefer-scoped-selector | Prefer :scope when using element query selector methods. |
✅ | 💡 | |
| prefer-set-has | Prefer Set#has() over Array#includes() when checking for existence or non-existence. |
✅ ☑️ | 🔧 | 💡 |
| prefer-set-size | Prefer using Set#size instead of Array#length. |
✅ ☑️ | 🔧 | |
| prefer-short-arrow-method | Prefer arrow function properties over methods with a single return. | ✅ | 🔧 | |
| prefer-simple-condition-first | Prefer simple conditions first in logical expressions. | ✅ ☑️ | 🔧 | 💡 |
| prefer-simple-sort-comparator | Prefer a simple comparison function for Array#sort(). |
✅ ☑️ | 💡 | |
| prefer-single-array-predicate | Prefer a single Array#some() or Array#every() with a combined predicate. |
✅ ☑️ | 💡 | |
| prefer-single-call | Enforce combining multiple Array#{push,unshift}(), Element#classList.{add,remove}(), and importScripts() into one call. |
✅ ☑️ | 🔧 | 💡 |
| prefer-single-object-destructuring | Prefer a single object destructuring declaration per local const source. | ✅ | 🔧 | |
| prefer-smaller-scope | Prefer declaring variables in the smallest possible scope. | ✅ | 🔧 | |
| prefer-split-limit | Prefer String#split() with a limit. |
✅ ☑️ | 🔧 | |
| prefer-spread | Prefer the spread operator over Array.from(…), Array#concat(…), Array#{slice,toSpliced}(), and trivial for…of copies. |
✅ | 🔧 | 💡 |
| prefer-string-match-all | Prefer String#matchAll() over RegExp#exec() loops. |
✅ ☑️ | 🔧 | |
| prefer-string-pad-start-end | Prefer String#padStart() and String#padEnd() over manual string padding. |
✅ ☑️ | 🔧 | 💡 |
| prefer-string-raw | Prefer using the String.raw tag to avoid escaping \. |
✅ ☑️ | 🔧 | |
| prefer-string-repeat | Prefer String#repeat() for repeated whitespace. |
✅ ☑️ | 🔧 | |
| prefer-string-replace-all | Prefer String#replaceAll() over regex searches with the global flag and String#split().join(). |
✅ ☑️ | 🔧 | |
| 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() and String#indexOf() === 0. |
✅ ☑️ | 🔧 | 💡 |
| prefer-string-trim-start-end | Prefer String#trimStart() / String#trimEnd() over String#trimLeft() / String#trimRight(). |
✅ ☑️ | 🔧 | |
| prefer-structured-clone | Prefer using structuredClone to create a deep clone. |
✅ ☑️ | 💡 | |
| prefer-switch | Prefer switch over multiple else-if. |
✅ ☑️ | 🔧 | |
| prefer-temporal | Prefer Temporal over Date. |
🔧 | 💡 | |
| prefer-ternary | Prefer ternary expressions over simple if-else statements that return or assign values. |
✅ ☑️ | 🔧 | 💡 |
| 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. |
✅ ☑️ | 🔧 | |
| prefer-type-literal-last | Require type literals to be last in union and intersection types. | ✅ ☑️ | 🔧 | |
| prefer-uint8array-base64 | Prefer Uint8Array#toBase64() and Uint8Array.fromBase64() over atob(), btoa(), and Buffer base64 conversions. |
✅ ☑️ | 💡 | |
| prefer-unicode-code-point-escapes | Prefer Unicode code point escapes over legacy escape sequences. | ✅ ☑️ | 🔧 | 💡 |
| prefer-url-href | Prefer URL#href over stringifying a URL. |
✅ ☑️ | 🔧 | |
| prevent-abbreviations | Prevent abbreviations. | ✅ | 🔧 | 💡 |
| relative-url-style | Enforce consistent relative URL style. | ✅ ☑️ | 🔧 | 💡 |
| require-array-join-separator | Enforce using the separator argument with Array#join(). |
✅ ☑️ | 🔧 | |
| require-array-sort-compare | Require a compare function when calling Array#sort() or Array#toSorted(). |
✅ ☑️ | 💡 | |
| require-css-escape | Require CSS.escape() for interpolated values in CSS selectors. |
✅ ☑️ | 🔧 | |
| require-module-attributes | Require non-empty module attributes for imports and exports | ✅ ☑️ | 🔧 | |
| require-module-specifiers | Require non-empty specifier list in import and export statements. | ✅ ☑️ | 🔧 | 💡 |
| require-number-to-fixed-digits-argument | Enforce using the digits argument with Number#toFixed(). |
✅ ☑️ | 🔧 | |
| require-passive-events | Require passive event listeners for high-frequency events. | ✅ ☑️ | 🔧 | |
| require-post-message-target-origin | Enforce using the targetOrigin argument with window.postMessage(). |
💡 | ||
| require-proxy-trap-boolean-return | Require boolean-returning Proxy traps to return booleans. | ✅ ☑️ | 🔧 | |
| string-content | Enforce better string content. | 🔧 | 💡 | |
| switch-case-braces | Enforce consistent brace style for case clauses. |
✅ | 🔧 | |
| switch-case-break-position | Enforce consistent break/return/continue/throw position in case clauses. |
✅ | 🔧 | |
| template-indent | Fix whitespace-insensitive template indentation. | ✅ | 🔧 | |
| text-encoding-identifier-case | Enforce consistent case for text encoding identifiers. | ✅ ☑️ | 🔧 | 💡 |
| throw-new-error | Require new when creating an error. |
✅ ☑️ | 🔧 | |
| try-complexity | Limit the complexity of try blocks. |
While most rules target JavaScript and TypeScript, some also lint other file types when used with the corresponding ESLint language plugin such as @eslint/css, @eslint/json, @eslint/markdown, or @html-eslint/eslint-plugin. Each such rule declares this with the meta.languages field.
These rules work on any file type:
These rules also work on specific non-JavaScript languages:
| Name | CSS | HTML | JSON | Markdown |
|---|---|---|---|---|
expiring-todo-comments |
✅ | ✅ | ✅ | ✅ |
no-empty-file |
✅ | ✅ | ✅ | ✅ |
no-invalid-file-input-accept |
✅ | |||
no-manually-wrapped-comments |
✅ | |||
text-encoding-identifier-case |
✅ | ✅ |
See the list.
See the ESLint docs for more information about extending config files.
Note: Preset configs will also enable the correct language options.
This plugin exports a recommended config that enforces good practices.
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
export default [
// …
eslintPluginUnicorn.configs.recommended,
{
rules: {
'unicorn/prefer-module': 'warn',
},
},
];This plugin exports an all config that enables every rule, except deprecated ones.
import eslintPluginUnicorn from 'eslint-plugin-unicorn';
export default [
// …
eslintPluginUnicorn.configs.all,
{
rules: {
'unicorn/prefer-module': 'warn',
},
},
];