eslint-plugin-perfectionist
eslint-plugin-perfectionist copied to clipboard
Feature: (sort-objects) option for destructuring only
What rule do you want to change?
sort-objects
Describe the problem
We have too many objects that we don't want sorted (e.g. XState machines where properties are grouped logically) to make sort-objects with ignore-pattern and/or ESLint overrides feasible. It would be nice to still have object destructuring available, particularly for React components where currently the props' type get sorted but the prop destructuring does not.
Code example
Input:
const data = {
software: 'iOS',
name: 'iPhone 14 Pro',
};
function Product({ software, name }) { ... }
Expected output:
const data = {
software: 'iOS',
name: 'iPhone 14 Pro',
};
function Product({ name, software }) { ... }
Additional comments
Not sure if it should be an option to sort-objects or a new/split rule. https://github.com/mskelton/eslint-plugin-sort has separate rules for destructuring-properties and object-properties.
Validations
- [X] Read the docs.
- [X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
"perfectionist/sort-objects": [
"error",
{
"ignore-pattern": ["data"]
}
]
Does ignore-pattern solve your problem?
Does
ignore-patternsolve your problem?
Unfortunately not; as I said we have many objects in many different places with many different names/no names that we don't want sorted.
Okay, I know. How about ignore-pattern supports Function to customize?
Okay, I know. How about
ignore-patternsupportsFunctionto customize?
Sure, as long as the function receives enough information to differentiate between "regular" objects and destructuring, regardless of what names they may have or the files they're in. A tiny example of things we want to ignore: https://github.com/statelyai/xstate/blob/main/examples/fetch/src/fetchMachine.ts
Okay, I know. How about
ignore-patternsupportsFunctionto customize?
@azat-io What do you think of this solution?
Thank you for your issue!
Many thanks to @KID-joker for helping to implement this feature.
See example here.
This feature was implemented in 4fa2b3ebd0c7aa747df2e5cb52faa51c95980391 and released in v3.0.0.
If you'd like, you can support the release with a retweet: https://x.com/azat_io_en/status/1815367279191761054
I'm sorry, but the option had to be renamed to destructureOnly in v3.1.0.
The point is that we cannot use functions inside ESLint configs, because the options must be serialisable. New flat configs just don't support functions inside options.
We had to redesign the option a bit and make it a boolean value.