1 | # eslint-plugin-unicorn [![Coverage Status](https://codecov.io/gh/sindresorhus/eslint-plugin-unicorn/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/eslint-plugin-unicorn/branch/main) [![npm version](https://img.shields.io/npm/v/eslint-plugin-unicorn.svg?style=flat)](https://npmjs.com/package/eslint-plugin-unicorn)
|
2 |
|
3 | <!-- markdownlint-disable-next-line no-inline-html -->
|
4 | <img src="https://cloud.githubusercontent.com/assets/170270/18659176/1cc373d0-7f33-11e6-890f-0ba35362ee7e.jpg" width="180" align="right" alt="Unicorn">
|
5 |
|
6 | > More than 100 powerful ESLint rules
|
7 |
|
8 | You might want to check out [XO](https://github.com/xojs/xo), which includes this plugin.
|
9 |
|
10 | [**Propose or contribute a new rule ➡**](.github/contributing.md)
|
11 |
|
12 | ## Install
|
13 |
|
14 | ```sh
|
15 | npm install --save-dev eslint eslint-plugin-unicorn
|
16 | ```
|
17 |
|
18 | ## Usage (`eslint.config.js`)
|
19 |
|
20 | **Requires ESLint `>=8.56.0`.**
|
21 |
|
22 | Use a [preset config](#preset-configs-eslintconfigjs) or configure each rule in `eslint.config.js`.
|
23 |
|
24 | If you don't use the preset, ensure you use the same `languageOptions` config as below.
|
25 |
|
26 | ### ES Module (Recommended)
|
27 |
|
28 | ```js
|
29 | import eslintPluginUnicorn from 'eslint-plugin-unicorn';
|
30 | import * as eslintrc from '@eslint/eslintrc';
|
31 |
|
32 | export default [
|
33 | {
|
34 | languageOptions: {
|
35 | globals: eslintrc.Legacy.environments.get('es2024'),
|
36 | },
|
37 | plugins: {
|
38 | unicorn: eslintPluginUnicorn,
|
39 | },
|
40 | rules: {
|
41 | 'unicorn/better-regex': 'error',
|
42 | 'unicorn/…': 'error',
|
43 | },
|
44 | },
|
45 | // …
|
46 | ];
|
47 | ```
|
48 |
|
49 | ### CommonJS
|
50 |
|
51 | ```js
|
52 | 'use strict';
|
53 | const eslintPluginUnicorn = require('eslint-plugin-unicorn');
|
54 | const eslintrc = require('@eslint/eslintrc');
|
55 |
|
56 | module.exports = [
|
57 | {
|
58 | languageOptions: {
|
59 | globals: eslintrc.Legacy.environments.get('es2024'),
|
60 | },
|
61 | plugins: {
|
62 | unicorn: eslintPluginUnicorn,
|
63 | },
|
64 | rules: {
|
65 | 'unicorn/better-regex': 'error',
|
66 | 'unicorn/…': 'error',
|
67 | },
|
68 | },
|
69 | // …
|
70 | ];
|
71 | ```
|
72 |
|
73 | ## Usage (legacy: `.eslintrc.*` or `package.json`)
|
74 |
|
75 | Use a [preset config](#preset-configs-eslintrc-or-packagejson) or configure each rule in `package.json`.
|
76 |
|
77 | If you don't use the preset, ensure you use the same `env` and `parserOptions` config as below.
|
78 |
|
79 | ```json
|
80 | {
|
81 | "name": "my-awesome-project",
|
82 | "eslintConfig": {
|
83 | "env": {
|
84 | "es2024": true
|
85 | },
|
86 | "parserOptions": {
|
87 | "ecmaVersion": "latest",
|
88 | "sourceType": "module"
|
89 | },
|
90 | "plugins": [
|
91 | "unicorn"
|
92 | ],
|
93 | "rules": {
|
94 | "unicorn/better-regex": "error",
|
95 | "unicorn/…": "error"
|
96 | }
|
97 | }
|
98 | }
|
99 | ```
|
100 |
|
101 | ## Rules
|
102 |
|
103 | <!-- Do not manually modify this list. Run: `npm run fix:eslint-docs` -->
|
104 | <!-- begin auto-generated rules list -->
|
105 |
|
106 | 💼 [Configurations](https://github.com/sindresorhus/eslint-plugin-unicorn#preset-configs-eslintconfigjs) enabled in.\
|
107 | ✅ Set in the `recommended` [configuration](https://github.com/sindresorhus/eslint-plugin-unicorn#preset-configs-eslintconfigjs).\
|
108 | 🔧 Automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/user-guide/command-line-interface#--fix).\
|
109 | 💡 Manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
110 |
|
111 | | Name | Description | 💼 | 🔧 | 💡 |
|
112 | | :----------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :- | :- | :- |
|
113 | | [better-regex](docs/rules/better-regex.md) | Improve regexes by making them shorter, consistent, and safer. | ✅ | 🔧 | |
|
114 | | [catch-error-name](docs/rules/catch-error-name.md) | Enforce a specific parameter name in catch clauses. | ✅ | 🔧 | |
|
115 | | [consistent-destructuring](docs/rules/consistent-destructuring.md) | Use destructured variables over properties. | | 🔧 | 💡 |
|
116 | | [consistent-empty-array-spread](docs/rules/consistent-empty-array-spread.md) | Prefer consistent types when spreading a ternary in an array literal. | ✅ | 🔧 | |
|
117 | | [consistent-function-scoping](docs/rules/consistent-function-scoping.md) | Move function definitions to the highest possible scope. | ✅ | | |
|
118 | | [custom-error-definition](docs/rules/custom-error-definition.md) | Enforce correct `Error` subclassing. | | 🔧 | |
|
119 | | [empty-brace-spaces](docs/rules/empty-brace-spaces.md) | Enforce no spaces between braces. | ✅ | 🔧 | |
|
120 | | [error-message](docs/rules/error-message.md) | Enforce passing a `message` value when creating a built-in error. | ✅ | | |
|
121 | | [escape-case](docs/rules/escape-case.md) | Require escape sequences to use uppercase values. | ✅ | 🔧 | |
|
122 | | [expiring-todo-comments](docs/rules/expiring-todo-comments.md) | Add expiration conditions to TODO comments. | ✅ | | |
|
123 | | [explicit-length-check](docs/rules/explicit-length-check.md) | Enforce explicitly comparing the `length` or `size` property of a value. | ✅ | 🔧 | 💡 |
|
124 | | [filename-case](docs/rules/filename-case.md) | Enforce a case style for filenames. | ✅ | | |
|
125 | | [import-style](docs/rules/import-style.md) | Enforce specific import styles per module. | ✅ | | |
|
126 | | [new-for-builtins](docs/rules/new-for-builtins.md) | Enforce the use of `new` for all builtins, except `String`, `Number`, `Boolean`, `Symbol` and `BigInt`. | ✅ | 🔧 | |
|
127 | | [no-abusive-eslint-disable](docs/rules/no-abusive-eslint-disable.md) | Enforce specifying rules to disable in `eslint-disable` comments. | ✅ | | |
|
128 | | [no-anonymous-default-export](docs/rules/no-anonymous-default-export.md) | Disallow anonymous functions and classes as the default export. | ✅ | | 💡 |
|
129 | | [no-array-callback-reference](docs/rules/no-array-callback-reference.md) | Prevent passing a function reference directly to iterator methods. | ✅ | | 💡 |
|
130 | | [no-array-for-each](docs/rules/no-array-for-each.md) | Prefer `for…of` over the `forEach` method. | ✅ | 🔧 | 💡 |
|
131 | | [no-array-method-this-argument](docs/rules/no-array-method-this-argument.md) | Disallow using the `this` argument in array methods. | ✅ | 🔧 | 💡 |
|
132 | | [no-array-push-push](docs/rules/no-array-push-push.md) | Enforce combining multiple `Array#push()` into one call. | ✅ | 🔧 | 💡 |
|
133 | | [no-array-reduce](docs/rules/no-array-reduce.md) | Disallow `Array#reduce()` and `Array#reduceRight()`. | ✅ | | |
|
134 | | [no-await-expression-member](docs/rules/no-await-expression-member.md) | Disallow member access from await expression. | ✅ | 🔧 | |
|
135 | | [no-await-in-promise-methods](docs/rules/no-await-in-promise-methods.md) | Disallow using `await` in `Promise` method parameters. | ✅ | | 💡 |
|
136 | | [no-console-spaces](docs/rules/no-console-spaces.md) | Do not use leading/trailing space between `console.log` parameters. | ✅ | 🔧 | |
|
137 | | [no-document-cookie](docs/rules/no-document-cookie.md) | Do not use `document.cookie` directly. | ✅ | | |
|
138 | | [no-empty-file](docs/rules/no-empty-file.md) | Disallow empty files. | ✅ | | |
|
139 | | [no-for-loop](docs/rules/no-for-loop.md) | Do not use a `for` loop that can be replaced with a `for-of` loop. | ✅ | 🔧 | 💡 |
|
140 | | [no-hex-escape](docs/rules/no-hex-escape.md) | Enforce the use of Unicode escapes instead of hexadecimal escapes. | ✅ | 🔧 | |
|
141 | | [no-instanceof-array](docs/rules/no-instanceof-array.md) | Require `Array.isArray()` instead of `instanceof Array`. | ✅ | 🔧 | |
|
142 | | [no-invalid-fetch-options](docs/rules/no-invalid-fetch-options.md) | Disallow invalid options in `fetch()` and `new Request()`. | ✅ | | |
|
143 | | [no-invalid-remove-event-listener](docs/rules/no-invalid-remove-event-listener.md) | Prevent calling `EventTarget#removeEventListener()` with the result of an expression. | ✅ | | |
|
144 | | [no-keyword-prefix](docs/rules/no-keyword-prefix.md) | Disallow identifiers starting with `new` or `class`. | | | |
|
145 | | [no-lonely-if](docs/rules/no-lonely-if.md) | Disallow `if` statements as the only statement in `if` blocks without `else`. | ✅ | 🔧 | |
|
146 | | [no-magic-array-flat-depth](docs/rules/no-magic-array-flat-depth.md) | Disallow a magic number as the `depth` argument in `Array#flat(…).` | ✅ | | |
|
147 | | [no-negated-condition](docs/rules/no-negated-condition.md) | Disallow negated conditions. | ✅ | 🔧 | |
|
148 | | [no-nested-ternary](docs/rules/no-nested-ternary.md) | Disallow nested ternary expressions. | ✅ | 🔧 | |
|
149 | | [no-new-array](docs/rules/no-new-array.md) | Disallow `new Array()`. | ✅ | 🔧 | 💡 |
|
150 | | [no-new-buffer](docs/rules/no-new-buffer.md) | Enforce the use of `Buffer.from()` and `Buffer.alloc()` instead of the deprecated `new Buffer()`. | ✅ | 🔧 | 💡 |
|
151 | | [no-null](docs/rules/no-null.md) | Disallow the use of the `null` literal. | ✅ | 🔧 | 💡 |
|
152 | | [no-object-as-default-parameter](docs/rules/no-object-as-default-parameter.md) | Disallow the use of objects as default parameters. | ✅ | | |
|
153 | | [no-process-exit](docs/rules/no-process-exit.md) | Disallow `process.exit()`. | ✅ | | |
|
154 | | [no-single-promise-in-promise-methods](docs/rules/no-single-promise-in-promise-methods.md) | Disallow passing single-element arrays to `Promise` methods. | ✅ | 🔧 | 💡 |
|
155 | | [no-static-only-class](docs/rules/no-static-only-class.md) | Disallow classes that only have static members. | ✅ | 🔧 | |
|
156 | | [no-thenable](docs/rules/no-thenable.md) | Disallow `then` property. | ✅ | | |
|
157 | | [no-this-assignment](docs/rules/no-this-assignment.md) | Disallow assigning `this` to a variable. | ✅ | | |
|
158 | | [no-typeof-undefined](docs/rules/no-typeof-undefined.md) | Disallow comparing `undefined` using `typeof`. | ✅ | 🔧 | 💡 |
|
159 | | [no-unnecessary-await](docs/rules/no-unnecessary-await.md) | Disallow awaiting non-promise values. | ✅ | 🔧 | |
|
160 | | [no-unnecessary-polyfills](docs/rules/no-unnecessary-polyfills.md) | Enforce the use of built-in methods instead of unnecessary polyfills. | ✅ | | |
|
161 | | [no-unreadable-array-destructuring](docs/rules/no-unreadable-array-destructuring.md) | Disallow unreadable array destructuring. | ✅ | 🔧 | |
|
162 | | [no-unreadable-iife](docs/rules/no-unreadable-iife.md) | Disallow unreadable IIFEs. | ✅ | | |
|
163 | | [no-unused-properties](docs/rules/no-unused-properties.md) | Disallow unused object properties. | | | |
|
164 | | [no-useless-fallback-in-spread](docs/rules/no-useless-fallback-in-spread.md) | Disallow useless fallback when spreading in object literals. | ✅ | 🔧 | |
|
165 | | [no-useless-length-check](docs/rules/no-useless-length-check.md) | Disallow useless array length check. | ✅ | 🔧 | |
|
166 | | [no-useless-promise-resolve-reject](docs/rules/no-useless-promise-resolve-reject.md) | Disallow returning/yielding `Promise.resolve/reject()` in async functions or promise callbacks | ✅ | 🔧 | |
|
167 | | [no-useless-spread](docs/rules/no-useless-spread.md) | Disallow unnecessary spread. | ✅ | 🔧 | |
|
168 | | [no-useless-switch-case](docs/rules/no-useless-switch-case.md) | Disallow useless case in switch statements. | ✅ | | 💡 |
|
169 | | [no-useless-undefined](docs/rules/no-useless-undefined.md) | Disallow useless `undefined`. | ✅ | 🔧 | |
|
170 | | [no-zero-fractions](docs/rules/no-zero-fractions.md) | Disallow number literals with zero fractions or dangling dots. | ✅ | 🔧 | |
|
171 | | [number-literal-case](docs/rules/number-literal-case.md) | Enforce proper case for numeric literals. | ✅ | 🔧 | |
|
172 | | [numeric-separators-style](docs/rules/numeric-separators-style.md) | Enforce the style of numeric separators by correctly grouping digits. | ✅ | 🔧 | |
|
173 | | [prefer-add-event-listener](docs/rules/prefer-add-event-listener.md) | Prefer `.addEventListener()` and `.removeEventListener()` over `on`-functions. | ✅ | 🔧 | |
|
174 | | [prefer-array-find](docs/rules/prefer-array-find.md) | Prefer `.find(…)` and `.findLast(…)` over the first or last element from `.filter(…)`. | ✅ | 🔧 | 💡 |
|
175 | | [prefer-array-flat](docs/rules/prefer-array-flat.md) | Prefer `Array#flat()` over legacy techniques to flatten arrays. | ✅ | 🔧 | |
|
176 | | [prefer-array-flat-map](docs/rules/prefer-array-flat-map.md) | Prefer `.flatMap(…)` over `.map(…).flat()`. | ✅ | 🔧 | |
|
177 | | [prefer-array-index-of](docs/rules/prefer-array-index-of.md) | Prefer `Array#{indexOf,lastIndexOf}()` over `Array#{findIndex,findLastIndex}()` when looking for the index of an item. | ✅ | 🔧 | 💡 |
|
178 | | [prefer-array-some](docs/rules/prefer-array-some.md) | Prefer `.some(…)` over `.filter(…).length` check and `.{find,findLast}(…)`. | ✅ | 🔧 | 💡 |
|
179 | | [prefer-at](docs/rules/prefer-at.md) | Prefer `.at()` method for index access and `String#charAt()`. | ✅ | 🔧 | 💡 |
|
180 | | [prefer-blob-reading-methods](docs/rules/prefer-blob-reading-methods.md) | Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`. | ✅ | | |
|
181 | | [prefer-code-point](docs/rules/prefer-code-point.md) | Prefer `String#codePointAt(…)` over `String#charCodeAt(…)` and `String.fromCodePoint(…)` over `String.fromCharCode(…)`. | ✅ | | 💡 |
|
182 | | [prefer-date-now](docs/rules/prefer-date-now.md) | Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. | ✅ | 🔧 | |
|
183 | | [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. | ✅ | 🔧 | 💡 |
|
184 | | [prefer-dom-node-append](docs/rules/prefer-dom-node-append.md) | Prefer `Node#append()` over `Node#appendChild()`. | ✅ | 🔧 | |
|
185 | | [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) | Prefer using `.dataset` on DOM elements over calling attribute methods. | ✅ | 🔧 | |
|
186 | | [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) | Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. | ✅ | 🔧 | 💡 |
|
187 | | [prefer-dom-node-text-content](docs/rules/prefer-dom-node-text-content.md) | Prefer `.textContent` over `.innerText`. | ✅ | | 💡 |
|
188 | | [prefer-event-target](docs/rules/prefer-event-target.md) | Prefer `EventTarget` over `EventEmitter`. | ✅ | | |
|
189 | | [prefer-export-from](docs/rules/prefer-export-from.md) | Prefer `export…from` when re-exporting. | ✅ | 🔧 | 💡 |
|
190 | | [prefer-includes](docs/rules/prefer-includes.md) | Prefer `.includes()` over `.indexOf()` and `Array#some()` when checking for existence or non-existence. | ✅ | 🔧 | 💡 |
|
191 | | [prefer-json-parse-buffer](docs/rules/prefer-json-parse-buffer.md) | Prefer reading a JSON file as a buffer. | | 🔧 | |
|
192 | | [prefer-keyboard-event-key](docs/rules/prefer-keyboard-event-key.md) | Prefer `KeyboardEvent#key` over `KeyboardEvent#keyCode`. | ✅ | 🔧 | |
|
193 | | [prefer-logical-operator-over-ternary](docs/rules/prefer-logical-operator-over-ternary.md) | Prefer using a logical operator over a ternary. | ✅ | | 💡 |
|
194 | | [prefer-math-trunc](docs/rules/prefer-math-trunc.md) | Enforce the use of `Math.trunc` instead of bitwise operators. | ✅ | 🔧 | 💡 |
|
195 | | [prefer-modern-dom-apis](docs/rules/prefer-modern-dom-apis.md) | Prefer `.before()` over `.insertBefore()`, `.replaceWith()` over `.replaceChild()`, prefer one of `.before()`, `.after()`, `.append()` or `.prepend()` over `insertAdjacentText()` and `insertAdjacentElement()`. | ✅ | 🔧 | |
|
196 | | [prefer-modern-math-apis](docs/rules/prefer-modern-math-apis.md) | Prefer modern `Math` APIs over legacy patterns. | ✅ | 🔧 | |
|
197 | | [prefer-module](docs/rules/prefer-module.md) | Prefer JavaScript modules (ESM) over CommonJS. | ✅ | 🔧 | 💡 |
|
198 | | [prefer-native-coercion-functions](docs/rules/prefer-native-coercion-functions.md) | Prefer using `String`, `Number`, `BigInt`, `Boolean`, and `Symbol` directly. | ✅ | 🔧 | |
|
199 | | [prefer-negative-index](docs/rules/prefer-negative-index.md) | Prefer negative index over `.length - index` when possible. | ✅ | 🔧 | |
|
200 | | [prefer-node-protocol](docs/rules/prefer-node-protocol.md) | Prefer using the `node:` protocol when importing Node.js builtin modules. | ✅ | 🔧 | |
|
201 | | [prefer-number-properties](docs/rules/prefer-number-properties.md) | Prefer `Number` static properties over global ones. | ✅ | 🔧 | 💡 |
|
202 | | [prefer-object-from-entries](docs/rules/prefer-object-from-entries.md) | Prefer using `Object.fromEntries(…)` to transform a list of key-value pairs into an object. | ✅ | 🔧 | |
|
203 | | [prefer-optional-catch-binding](docs/rules/prefer-optional-catch-binding.md) | Prefer omitting the `catch` binding parameter. | ✅ | 🔧 | |
|
204 | | [prefer-prototype-methods](docs/rules/prefer-prototype-methods.md) | Prefer borrowing methods from the prototype instead of the instance. | ✅ | 🔧 | |
|
205 | | [prefer-query-selector](docs/rules/prefer-query-selector.md) | Prefer `.querySelector()` over `.getElementById()`, `.querySelectorAll()` over `.getElementsByClassName()` and `.getElementsByTagName()`. | ✅ | 🔧 | |
|
206 | | [prefer-reflect-apply](docs/rules/prefer-reflect-apply.md) | Prefer `Reflect.apply()` over `Function#apply()`. | ✅ | 🔧 | |
|
207 | | [prefer-regexp-test](docs/rules/prefer-regexp-test.md) | Prefer `RegExp#test()` over `String#match()` and `RegExp#exec()`. | ✅ | 🔧 | 💡 |
|
208 | | [prefer-set-has](docs/rules/prefer-set-has.md) | Prefer `Set#has()` over `Array#includes()` when checking for existence or non-existence. | ✅ | 🔧 | 💡 |
|
209 | | [prefer-set-size](docs/rules/prefer-set-size.md) | Prefer using `Set#size` instead of `Array#length`. | ✅ | 🔧 | |
|
210 | | [prefer-spread](docs/rules/prefer-spread.md) | Prefer the spread operator over `Array.from(…)`, `Array#concat(…)`, `Array#{slice,toSpliced}()` and `String#split('')`. | ✅ | 🔧 | 💡 |
|
211 | | [prefer-string-raw](docs/rules/prefer-string-raw.md) | Prefer using the `String.raw` tag to avoid escaping `\`. | ✅ | 🔧 | |
|
212 | | [prefer-string-replace-all](docs/rules/prefer-string-replace-all.md) | Prefer `String#replaceAll()` over regex searches with the global flag. | ✅ | 🔧 | |
|
213 | | [prefer-string-slice](docs/rules/prefer-string-slice.md) | Prefer `String#slice()` over `String#substr()` and `String#substring()`. | ✅ | 🔧 | |
|
214 | | [prefer-string-starts-ends-with](docs/rules/prefer-string-starts-ends-with.md) | Prefer `String#startsWith()` & `String#endsWith()` over `RegExp#test()`. | ✅ | 🔧 | 💡 |
|
215 | | [prefer-string-trim-start-end](docs/rules/prefer-string-trim-start-end.md) | Prefer `String#trimStart()` / `String#trimEnd()` over `String#trimLeft()` / `String#trimRight()`. | ✅ | 🔧 | |
|
216 | | [prefer-structured-clone](docs/rules/prefer-structured-clone.md) | Prefer using `structuredClone` to create a deep clone. | ✅ | | 💡 |
|
217 | | [prefer-switch](docs/rules/prefer-switch.md) | Prefer `switch` over multiple `else-if`. | ✅ | 🔧 | |
|
218 | | [prefer-ternary](docs/rules/prefer-ternary.md) | Prefer ternary expressions over simple `if-else` statements. | ✅ | 🔧 | |
|
219 | | [prefer-top-level-await](docs/rules/prefer-top-level-await.md) | Prefer top-level await over top-level promises and async function calls. | ✅ | | 💡 |
|
220 | | [prefer-type-error](docs/rules/prefer-type-error.md) | Enforce throwing `TypeError` in type checking conditions. | ✅ | 🔧 | |
|
221 | | [prevent-abbreviations](docs/rules/prevent-abbreviations.md) | Prevent abbreviations. | ✅ | 🔧 | |
|
222 | | [relative-url-style](docs/rules/relative-url-style.md) | Enforce consistent relative URL style. | ✅ | 🔧 | 💡 |
|
223 | | [require-array-join-separator](docs/rules/require-array-join-separator.md) | Enforce using the separator argument with `Array#join()`. | ✅ | 🔧 | |
|
224 | | [require-number-to-fixed-digits-argument](docs/rules/require-number-to-fixed-digits-argument.md) | Enforce using the digits argument with `Number#toFixed()`. | ✅ | 🔧 | |
|
225 | | [require-post-message-target-origin](docs/rules/require-post-message-target-origin.md) | Enforce using the `targetOrigin` argument with `window.postMessage()`. | | | 💡 |
|
226 | | [string-content](docs/rules/string-content.md) | Enforce better string content. | | 🔧 | 💡 |
|
227 | | [switch-case-braces](docs/rules/switch-case-braces.md) | Enforce consistent brace style for `case` clauses. | ✅ | 🔧 | |
|
228 | | [template-indent](docs/rules/template-indent.md) | Fix whitespace-insensitive template indentation. | ✅ | 🔧 | |
|
229 | | [text-encoding-identifier-case](docs/rules/text-encoding-identifier-case.md) | Enforce consistent case for text encoding identifiers. | ✅ | 🔧 | 💡 |
|
230 | | [throw-new-error](docs/rules/throw-new-error.md) | Require `new` when creating an error. | ✅ | 🔧 | |
|
231 |
|
232 | <!-- end auto-generated rules list -->
|
233 |
|
234 | ### Deprecated Rules
|
235 |
|
236 | See [docs/deprecated-rules.md](docs/deprecated-rules.md)
|
237 |
|
238 | ## Preset configs (`eslint.config.js`)
|
239 |
|
240 | See the [ESLint docs](https://eslint.org/docs/latest/user-guide/configuring/configuration-files-new) for more information about extending config files.
|
241 |
|
242 | **Note**: Preset configs will also enable the correct [language options](https://eslint.org/docs/latest/use/configure/configuration-files-new#configuring-language-options).
|
243 |
|
244 | ### Recommended config
|
245 |
|
246 | This plugin exports a [`recommended` config](configs/recommended.js) that enforces good practices.
|
247 |
|
248 | #### ES Module (Recommended)
|
249 |
|
250 | ```js
|
251 | import eslintPluginUnicorn from 'eslint-plugin-unicorn';
|
252 |
|
253 | export default [
|
254 | // …
|
255 | eslintPluginUnicorn.configs['flat/recommended'],
|
256 | {
|
257 | rules: {
|
258 | 'unicorn/better-regex': 'warn',
|
259 | },
|
260 | },
|
261 | ];
|
262 | ```
|
263 |
|
264 | #### CommonJS
|
265 |
|
266 | ```js
|
267 | 'use strict';
|
268 | const eslintPluginUnicorn = require('eslint-plugin-unicorn');
|
269 |
|
270 | module.exports = [
|
271 | // …
|
272 | eslintPluginUnicorn.configs['flat/recommended'],
|
273 | {
|
274 | rules: {
|
275 | 'unicorn/better-regex': 'warn',
|
276 | },
|
277 | },
|
278 | ];
|
279 | ```
|
280 |
|
281 | ### All config
|
282 |
|
283 | This plugin exports an [`all` config](configs/all.js) that makes use of all rules (except for deprecated ones).
|
284 |
|
285 | #### ES Module (Recommended)
|
286 |
|
287 | ```js
|
288 | import eslintPluginUnicorn from 'eslint-plugin-unicorn';
|
289 |
|
290 | export default [
|
291 | // …
|
292 | eslintPluginUnicorn.configs['flat/all'],
|
293 | {
|
294 | rules: {
|
295 | 'unicorn/better-regex': 'warn',
|
296 | },
|
297 | },
|
298 | ];
|
299 | ```
|
300 |
|
301 | #### CommonJS
|
302 |
|
303 | ```js
|
304 | 'use strict';
|
305 | const eslintPluginUnicorn = require('eslint-plugin-unicorn');
|
306 |
|
307 | module.exports = [
|
308 | // …
|
309 | eslintPluginUnicorn.configs['flat/all'],
|
310 | {
|
311 | rules: {
|
312 | 'unicorn/better-regex': 'warn',
|
313 | },
|
314 | },
|
315 | ];
|
316 | ```
|
317 |
|
318 | ## Preset configs (`.eslintrc.*` or `package.json`)
|
319 |
|
320 | See the [ESLint docs](https://eslint.org/docs/user-guide/configuring/configuration-files#extending-configuration-files) for more information about extending config files.
|
321 |
|
322 | **Note**: Preset configs will also enable the correct [parser options](https://eslint.org/docs/user-guide/configuring/language-options#specifying-parser-options) and [environment](https://eslint.org/docs/user-guide/configuring/language-options#specifying-environments).
|
323 |
|
324 | ### Recommended config
|
325 |
|
326 | This plugin exports a [`recommended` config](configs/recommended.js) that enforces good practices.
|
327 |
|
328 | ```json
|
329 | {
|
330 | "name": "my-awesome-project",
|
331 | "eslintConfig": {
|
332 | "extends": "plugin:unicorn/recommended",
|
333 | "rules": {
|
334 | "unicorn/better-regex": "warn"
|
335 | }
|
336 | }
|
337 | }
|
338 | ```
|
339 |
|
340 | ### All config
|
341 |
|
342 | This plugin exports an [`all` config](configs/all.js) that makes use of all rules (except for deprecated ones).
|
343 |
|
344 | ```json
|
345 | {
|
346 | "name": "my-awesome-project",
|
347 | "eslintConfig": {
|
348 | "extends": "plugin:unicorn/all"
|
349 | }
|
350 | }
|
351 | ```
|
352 |
|
353 | ## Maintainers
|
354 |
|
355 | - [Sindre Sorhus](https://github.com/sindresorhus)
|
356 | - [Fisker Cheung](https://github.com/fisker)
|
357 | - [Bryan Mishkin](https://github.com/bmish)
|
358 | - [futpib](https://github.com/futpib)
|
359 |
|
360 | ### Former
|
361 |
|
362 | - [Jeroen Engels](https://github.com/jfmengels)
|
363 | - [Sam Verschueren](https://github.com/SamVerschueren)
|
364 | - [Adam Babcock](https://github.com/MrHen)
|