azat-io / eslint-plugin-perfectionist

🦄 ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
https://eslint-plugin-perfectionist.azat.io
MIT License
1.62k stars 28 forks source link

Feature: (sort-objects) option for destructuring only #126

Open jl-compileit opened 1 month ago

jl-compileit commented 1 month ago

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

KID-joker commented 1 month ago
"perfectionist/sort-objects": [
      "error",
      {
        "ignore-pattern": ["data"]
      }
]

Does ignore-pattern solve your problem?

jl-compileit commented 1 month ago

Does ignore-pattern solve 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.

KID-joker commented 1 month ago

Okay, I know. How about ignore-pattern supports Function to customize?

jl-compileit commented 1 month ago

Okay, I know. How about ignore-pattern supports Function to 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

KID-joker commented 1 month ago

Okay, I know. How about ignore-pattern supports Function to customize?

@azat-io What do you think of this solution?