-
-
Notifications
You must be signed in to change notification settings - Fork 368
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
filename-case
: Add option for multiple file extensions
#2186
Conversation
The conclusion in #1484 was to just do it by default, but I guess we can have an option for it in case someone complains. But the option should be true by default. |
Bump :) |
Whoops - this completely slipped my mind! I'll try to get back to it in the next couple of weeks. Thanks for the reminder 😅 |
@sindresorhus I've updated this to make the option true by default, but I'm getting failures on It seems there are differences between the updated snapshot file I've pushed and the one the GitHub job produces, but I'm not sure what the best way might be to identify & investigate those differences (especially since they're binary). Weirdly it doesn't look like the snapshot report file is reported as different. |
From what I can remember, I think it has something to do with zlib changes in newer Node.js versions. If you're using Node.js 18, maybe try changing to Node.js 20 and regenerate the snapshots |
That sorted it, thanks! I was actually one Node 16 🙈 but I've also checked 18 and that was producing the wrong snapshot too. 20 has worked. |
test/snapshots/filename-case.mjs.md
Outdated
> Error 1/1 | ||
|
||
`␊ | ||
> 1 | const filename = "foo.SPEC.js";␊ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure about this, .SPEC
not really in extension
, do we really want it to be lowercased?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I'm not sure what you mean here - the purpose of this new option is exactly to treat anything after the first dot as an extension instead of the filename.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@fisker could you clarify your comment here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry not been clear.
Before this PR, this rule check two problems, a) the file base name should match required cases, b) the extension should be lowercased.
For file foo.Test.js
it make sense to enforce .js
to be lowercased(before), but it doesn't make sense to enforce .Test
part to be lowercased(this PR).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, so you're saying you'd rather not enforce any casing on the parts between the first and last .
s in the full file name?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think so, unless you have a better idea.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like treating everything after the first dot as part of a multi-part file extension. That's implied by the name of the option (multipleFileExtensions
). If we'd rather handle it differently, I guess we scrap this PR and start fresh.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like treating everything after the first dot as part of a multi-part file extension.
It doesn't matter how we treat it, but it doesn't make sense to me to enforce foo.Test.js
to be foo.test.js
, at least that's not the purpose of #1268
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, I had no reference to that issue, but if it's not the intent then we probably just want to start fresh here. 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I figure I can be a bit more constructive here -
I think in the context of a rule that enforces file name casing, if we are enforcing lowercase on the last part of the extension then it makes sense to me that it might be useful to offer the option to enforce lowercase on every part of the extension (or "suffix"). Certainly that's the casing that most of the discussed examples in #1484 seem to follow. Ignoring those extra parts entirely means the rule doesn't help users who would prefer to enforce some kind of convention for them, including myself.
Given this change still allows for the original behaviour, I might suggest we go ahead with the behaviour as-is, and could look to improve the rule further in the future by also adding the ability to ignore those extra parts entirely.
Can you add a test for a filename that starts with a dot? |
Done |
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
##### [v55.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v55.0.0) ##### New rules - [`no-length-as-slice-end`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-length-as-slice-end.md) ([#2400](sindresorhus/eslint-plugin-unicorn#2400)) [`3c33820`](sindresorhus/eslint-plugin-unicorn@3c33820) ##### Improvements - Add TypeScript types ([#2382](sindresorhus/eslint-plugin-unicorn#2382)) [`68e0f13`](sindresorhus/eslint-plugin-unicorn@68e0f13) ##### Fixes - `no-single-promise-in-promise-methods`: Remove broken autofix for `Promise.all()` ([#2386](sindresorhus/eslint-plugin-unicorn#2386)) [`8d28b6e`](sindresorhus/eslint-plugin-unicorn@8d28b6e) - `prefer-node-protocol`: Ignore Bun modules ([#2384](sindresorhus/eslint-plugin-unicorn#2384)) [`a45b24a`](sindresorhus/eslint-plugin-unicorn@a45b24a) - `no-negation-in-equality-check`: Ignore boolean type casting ([#2379](sindresorhus/eslint-plugin-unicorn#2379)) [`37e00dd`](sindresorhus/eslint-plugin-unicorn@37e00dd) ##### [v54.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v54.0.0) ##### New rules - [`no-negation-in-equality-check`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-negation-in-equality-check.md) ([#2353](sindresorhus/eslint-plugin-unicorn#2353)) [`8957a03`](sindresorhus/eslint-plugin-unicorn@8957a03) ##### Breaking - `prefer-array-find`: Change [`checkFromLast`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-array-find.md#checkfromlast) default value to `true` ([#2367](sindresorhus/eslint-plugin-unicorn#2367)) [`a449af9`](sindresorhus/eslint-plugin-unicorn@a449af9) ##### Improvements - Add name to flat configs ([#2377](sindresorhus/eslint-plugin-unicorn#2377)) [`ac8536e`](sindresorhus/eslint-plugin-unicorn@ac8536e) - `prefer-array-some`: Check `Array#{findIndex,findLastIndex}()` ([#2370](sindresorhus/eslint-plugin-unicorn#2370)) [`10568ab`](sindresorhus/eslint-plugin-unicorn@10568ab) - `prefer-includes`: Check `.lastIndexOf()` ([#2368](sindresorhus/eslint-plugin-unicorn#2368)) [`d812ad1`](sindresorhus/eslint-plugin-unicorn@d812ad1) - `prefer-string-raw`: Ignore strings in Enums ([#2354](sindresorhus/eslint-plugin-unicorn#2354)) [`175ea04`](sindresorhus/eslint-plugin-unicorn@175ea04) ##### Fixes - Fix edge cases when add `new` to calls ([#2352](sindresorhus/eslint-plugin-unicorn#2352)) [`d8f8161`](sindresorhus/eslint-plugin-unicorn@d8f8161) ##### [v53.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v53.0.0) ##### New rules - [`consistent-empty-array-spread`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/consistent-empty-array-spread.md) ([#2349](sindresorhus/eslint-plugin-unicorn#2349)) [`8d7954c`](sindresorhus/eslint-plugin-unicorn@8d7954c) - [`prefer-string-raw`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-string-raw.md) ([#2339](sindresorhus/eslint-plugin-unicorn#2339)) [`4f1400a`](sindresorhus/eslint-plugin-unicorn@4f1400a) - [`no-invalid-fetch-options`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-invalid-fetch-options.md) ([#2338](sindresorhus/eslint-plugin-unicorn#2338)) [`342aafb`](sindresorhus/eslint-plugin-unicorn@342aafb) - [`no-magic-array-flat-depth`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-magic-array-flat-depth.md) ([#2335](sindresorhus/eslint-plugin-unicorn#2335)) [`bc17428`](sindresorhus/eslint-plugin-unicorn@bc17428) - [`prefer-structured-clone`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-structured-clone.md) ([#2329](sindresorhus/eslint-plugin-unicorn#2329)) [`497519e`](sindresorhus/eslint-plugin-unicorn@497519e) ##### Breaking - Require Node.js 18.18 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) ##### Meta - You can now [sponsor @fisker](https://github.com/sponsors/fisker) for his work on this project ([#2348](sindresorhus/eslint-plugin-unicorn#2348)) [`b82542d`](sindresorhus/eslint-plugin-unicorn@b82542d) ##### Improvements - Support ESLint 9 ([#2250](sindresorhus/eslint-plugin-unicorn#2250)) [`598f57b`](sindresorhus/eslint-plugin-unicorn@598f57b) - `no-array-method-this-argument`: Check `Array.fromAsync()` ([#2330](sindresorhus/eslint-plugin-unicorn#2330)) [`99489b9`](sindresorhus/eslint-plugin-unicorn@99489b9) - `prefer-number-properties`: Add `checkNaN` option ([#2315](sindresorhus/eslint-plugin-unicorn#2315)) [`d30de50`](sindresorhus/eslint-plugin-unicorn@d30de50) - `template-indent`: Support member expression paths in `tags` and `functions` ([#2346](sindresorhus/eslint-plugin-unicorn#2346)) [`aabcf1d`](sindresorhus/eslint-plugin-unicorn@aabcf1d) - `prefer-number-properties`: Don't require by default for `Infinity`/`-Infinity` to be written as `Number.POSITIVE_INFINITY`/`Number.NEGATIVE_INFINITY` ([#2312](sindresorhus/eslint-plugin-unicorn#2312)) [`e0dfed2`](sindresorhus/eslint-plugin-unicorn@e0dfed2) - `escape-case`: Ignore `String.raw` ([#2342](sindresorhus/eslint-plugin-unicorn#2342)) [`45bd444`](sindresorhus/eslint-plugin-unicorn@45bd444) - `no-hex-escape`: Ignore `String.raw` ([#2343](sindresorhus/eslint-plugin-unicorn#2343)) [`cc02a7f`](sindresorhus/eslint-plugin-unicorn@cc02a7f) - `prefer-dom-node-dataset`: Ignore `await`ed `getAttribute` call ([#2334](sindresorhus/eslint-plugin-unicorn#2334)) [`45f23d5`](sindresorhus/eslint-plugin-unicorn@45f23d5) - `prevent-abbreviations`: Support non-ASCII filenames ([#2308](sindresorhus/eslint-plugin-unicorn#2308)) [`28762c8`](sindresorhus/eslint-plugin-unicorn@28762c8) - `throw-new-error`: Check all call expressions instead of just argument of `ThrowStatement` ([#2332](sindresorhus/eslint-plugin-unicorn#2332)) [`1626852`](sindresorhus/eslint-plugin-unicorn@1626852) ##### [v52.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v52.0.0) ##### New rules - [`no-single-promise-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-single-promise-in-promise-methods.md) ([#2258](sindresorhus/eslint-plugin-unicorn#2258)) [`8f0ee89`](sindresorhus/eslint-plugin-unicorn@8f0ee89) - [`no-await-in-promise-methods`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-await-in-promise-methods.md) ([#2259](sindresorhus/eslint-plugin-unicorn#2259)) [`a3be554`](sindresorhus/eslint-plugin-unicorn@a3be554) - [`no-anonymous-default-export`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-anonymous-default-export.md) ([#2273](sindresorhus/eslint-plugin-unicorn#2273)) [`c035216`](sindresorhus/eslint-plugin-unicorn@c035216) ##### Improvements - `filename-case`: Add option for multiple file extensions ([#2186](sindresorhus/eslint-plugin-unicorn#2186)) [`4594020`](sindresorhus/eslint-plugin-unicorn@4594020) - `import-style`: Support `node:` protocol ([#2297](sindresorhus/eslint-plugin-unicorn#2297)) [`c28a086`](sindresorhus/eslint-plugin-unicorn@c28a086) - `prefer-array-find`: Check `array.filter().at(0)` ([#2284](sindresorhus/eslint-plugin-unicorn#2284)) [`e6074fe`](sindresorhus/eslint-plugin-unicorn@e6074fe) - `prefer-prototype-methods`: Check `Object.prototype` methods from `globalThis` ([#2286](sindresorhus/eslint-plugin-unicorn#2286)) [`1792d33`](sindresorhus/eslint-plugin-unicorn@1792d33) - `no-array-callback-reference`: Check logical expressions and check ternaries deeply ([#2289](sindresorhus/eslint-plugin-unicorn#2289)) [`231529a`](sindresorhus/eslint-plugin-unicorn@231529a) ##### Fixes - `prefer-spread`: Fix it to not report on optional chaining ([#2304](sindresorhus/eslint-plugin-unicorn#2304)) [`df1ff1c`](sindresorhus/eslint-plugin-unicorn@df1ff1c) - `no-anonymous-default-export`: Uppercase class name ([#2282](sindresorhus/eslint-plugin-unicorn#2282)) [`5ce4169`](sindresorhus/eslint-plugin-unicorn@5ce4169) ##### [v51.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.1) - `prefer-node-protocol`: Fix false positive on `bun:*` modules ([#2272](sindresorhus/eslint-plugin-unicorn#2272)) [`43fc638`](sindresorhus/eslint-plugin-unicorn@43fc638) ##### [v51.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v51.0.0) ##### Breaking - `consistent-destructuring`: Remove from `recommended` preset ([#2260](sindresorhus/eslint-plugin-unicorn#2260)) [`702d51b`](sindresorhus/eslint-plugin-unicorn@702d51b) ##### Improvements - `no-array-method-this-argument`: Check `Array.from()` ([#2262](sindresorhus/eslint-plugin-unicorn#2262)) [`797caee`](sindresorhus/eslint-plugin-unicorn@797caee) ##### Fixes - `no-thenable`: Fix crash on `{[Symbol.prototype]: 0}` ([#2248](sindresorhus/eslint-plugin-unicorn#2248)) [`3c7d7c0`](sindresorhus/eslint-plugin-unicorn@3c7d7c0) - `prefer-prototype-methods`: Fix argument of `isMethodCall` ([#2247](sindresorhus/eslint-plugin-unicorn#2247)) [`3b504fa`](sindresorhus/eslint-plugin-unicorn@3b504fa) ##### [v50.0.1](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.1) ##### Fixes - `no-unnecessary-polyfills`: Fix missing dependency error ([#2242](sindresorhus/eslint-plugin-unicorn#2242)) [`3df1606`](sindresorhus/eslint-plugin-unicorn@3df16068) ##### [v50.0.0](https://github.com/sindresorhus/eslint-plugin-unicorn/releases/tag/v50.0.0) ##### New rules - [`no-unnecessary-polyfills`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-polyfills.md) ([#1717](sindresorhus/eslint-plugin-unicorn#1717)) [`6788d86`](sindresorhus/eslint-plugin-unicorn@6788d86) ##### Improvements - Support ESLint's new config system ([#1886](sindresorhus/eslint-plugin-unicorn#1886)) [`65711f9`](sindresorhus/eslint-plugin-unicorn@65711f9) - `no-useless-undefined`: Add `checkArrowFunctionBody` option ([#2232](sindresorhus/eslint-plugin-unicorn#2232)) [`9d7048c`](sindresorhus/eslint-plugin-unicorn@9d7048c) - `prefer-negative-index`: Check `TypedArray#subarray()` ([#2237](sindresorhus/eslint-plugin-unicorn#2237)) [`6708a30`](sindresorhus/eslint-plugin-unicorn@6708a30) - `no-useless-undefined`: Ignore React state setters ([#2223](sindresorhus/eslint-plugin-unicorn#2223)) [`42881ba`](sindresorhus/eslint-plugin-unicorn@42881ba) - `prefer-module`: Allow `module` as TSTypeParameter name ([#2213](sindresorhus/eslint-plugin-unicorn#2213)) [`8f61f7c`](sindresorhus/eslint-plugin-unicorn@8f61f7c) ##### Fixes - `string-content`: Fix JSX autofix for newlines, etc. ([#2222](sindresorhus/eslint-plugin-unicorn#2222)) [`b95e75e`](sindresorhus/eslint-plugin-unicorn@b95e75e)
Fixes #1484
I appreciate there's some discussion on #1484 as to how to approach this, and the final suggestion seems to be to ignore anything after the last two dots.
I've gone with the originally suggested approach of a
multipleFileExtensions
option, which will effectively treat anything after the first dot as an extension when enabled.I thought this might be more useful than ignoring those additional parts entirely, as it means the current behaviour (enforcing a specific case for them) is still supported if preferred and executed by default (so backwards compatible), but with the option enabled those parts are enforced as lowercase instead, as the actual extension is already.