eslint-plugin-perfectionist 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/index.d.ts +242 -21
  2. package/dist/index.js +3 -1
  3. package/dist/index.mjs +2 -0
  4. package/dist/rules/sort-array-includes.js +108 -107
  5. package/dist/rules/sort-array-includes.mjs +100 -100
  6. package/dist/rules/sort-astro-attributes.js +6 -0
  7. package/dist/rules/sort-astro-attributes.mjs +6 -0
  8. package/dist/rules/sort-classes-utils.js +71 -0
  9. package/dist/rules/sort-classes-utils.mjs +75 -1
  10. package/dist/rules/sort-classes.js +231 -79
  11. package/dist/rules/sort-classes.mjs +229 -69
  12. package/dist/rules/sort-classes.types.js +71 -0
  13. package/dist/rules/sort-classes.types.mjs +71 -0
  14. package/dist/rules/sort-enums.js +11 -15
  15. package/dist/rules/sort-enums.mjs +11 -11
  16. package/dist/rules/sort-imports.js +28 -0
  17. package/dist/rules/sort-imports.mjs +28 -0
  18. package/dist/rules/sort-interfaces.js +6 -0
  19. package/dist/rules/sort-interfaces.mjs +6 -0
  20. package/dist/rules/sort-intersection-types.js +20 -0
  21. package/dist/rules/sort-intersection-types.mjs +20 -0
  22. package/dist/rules/sort-jsx-props.js +6 -0
  23. package/dist/rules/sort-jsx-props.mjs +6 -0
  24. package/dist/rules/sort-object-types.js +6 -0
  25. package/dist/rules/sort-object-types.mjs +6 -0
  26. package/dist/rules/sort-objects.js +34 -43
  27. package/dist/rules/sort-objects.mjs +28 -30
  28. package/dist/rules/sort-sets.js +48 -0
  29. package/dist/rules/sort-sets.mjs +47 -0
  30. package/dist/rules/sort-svelte-attributes.js +6 -0
  31. package/dist/rules/sort-svelte-attributes.mjs +6 -0
  32. package/dist/rules/sort-union-types.js +20 -0
  33. package/dist/rules/sort-union-types.mjs +20 -0
  34. package/dist/rules/sort-variable-declarations.js +8 -9
  35. package/dist/rules/sort-variable-declarations.mjs +6 -5
  36. package/dist/rules/sort-vue-attributes.js +6 -0
  37. package/dist/rules/sort-vue-attributes.mjs +6 -0
  38. package/dist/utils/compare.js +0 -6
  39. package/dist/utils/compare.mjs +0 -6
  40. package/dist/utils/sort-nodes-by-dependencies.js +30 -0
  41. package/dist/utils/sort-nodes-by-dependencies.mjs +28 -0
  42. package/dist/utils/validate-groups-configuration.js +19 -0
  43. package/dist/utils/validate-groups-configuration.mjs +17 -0
  44. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
1
  'use strict'
2
+ const validateGroupsConfiguration = require('../utils/validate-groups-configuration.js')
2
3
  const createEslintRule = require('../utils/create-eslint-rule.js')
3
4
  const getGroupNumber = require('../utils/get-group-number.js')
4
5
  const getSourceCode = require('../utils/get-source-code.js')
@@ -83,6 +84,25 @@ const sortUnionTypes = createEslintRule.createEslintRule({
83
84
  order: 'asc',
84
85
  groups: [],
85
86
  })
87
+ validateGroupsConfiguration.validateGroupsConfiguration(
88
+ options.groups,
89
+ [
90
+ 'intersection',
91
+ 'conditional',
92
+ 'function',
93
+ 'operator',
94
+ 'keyword',
95
+ 'literal',
96
+ 'nullish',
97
+ 'unknown',
98
+ 'import',
99
+ 'object',
100
+ 'named',
101
+ 'tuple',
102
+ 'union',
103
+ ],
104
+ [],
105
+ )
86
106
  let sourceCode = getSourceCode.getSourceCode(context)
87
107
  let nodes = node.types.map(type => {
88
108
  let { getGroup, defineGroup } = useGroups.useGroups(options.groups)
@@ -1,3 +1,4 @@
1
+ import { validateGroupsConfiguration } from '../utils/validate-groups-configuration.mjs'
1
2
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
2
3
  import { getGroupNumber } from '../utils/get-group-number.mjs'
3
4
  import { getSourceCode } from '../utils/get-source-code.mjs'
@@ -82,6 +83,25 @@ const sortUnionTypes = createEslintRule({
82
83
  order: 'asc',
83
84
  groups: [],
84
85
  })
86
+ validateGroupsConfiguration(
87
+ options.groups,
88
+ [
89
+ 'intersection',
90
+ 'conditional',
91
+ 'function',
92
+ 'operator',
93
+ 'keyword',
94
+ 'literal',
95
+ 'nullish',
96
+ 'unknown',
97
+ 'import',
98
+ 'object',
99
+ 'named',
100
+ 'tuple',
101
+ 'union',
102
+ ],
103
+ [],
104
+ )
85
105
  let sourceCode = getSourceCode(context)
86
106
  let nodes = node.types.map(type => {
87
107
  let { getGroup, defineGroup } = useGroups(options.groups)
@@ -1,15 +1,14 @@
1
1
  'use strict'
2
+ const sortNodesByDependencies = require('../utils/sort-nodes-by-dependencies.js')
2
3
  const createEslintRule = require('../utils/create-eslint-rule.js')
3
4
  const getSourceCode = require('../utils/get-source-code.js')
4
5
  const toSingleLine = require('../utils/to-single-line.js')
5
6
  const rangeToDiff = require('../utils/range-to-diff.js')
6
7
  const getSettings = require('../utils/get-settings.js')
7
- const isPositive = require('../utils/is-positive.js')
8
8
  const sortNodes = require('../utils/sort-nodes.js')
9
9
  const makeFixes = require('../utils/make-fixes.js')
10
10
  const complete = require('../utils/complete.js')
11
11
  const pairwise = require('../utils/pairwise.js')
12
- const compare = require('../utils/compare.js')
13
12
  const sortVariableDeclarations = createEslintRule.createEslintRule({
14
13
  name: 'sort-variable-declarations',
15
14
  meta: {
@@ -118,8 +117,13 @@ const sortVariableDeclarations = createEslintRule.createEslintRule({
118
117
  name,
119
118
  }
120
119
  })
120
+ let sortedNodes = sortNodesByDependencies.sortNodesByDependencies(
121
+ sortNodes.sortNodes(nodes, options),
122
+ )
121
123
  pairwise.pairwise(nodes, (left, right) => {
122
- if (isPositive.isPositive(compare.compare(left, right, options))) {
124
+ let indexOfLeft = sortedNodes.indexOf(left)
125
+ let indexOfRight = sortedNodes.indexOf(right)
126
+ if (indexOfLeft > indexOfRight) {
123
127
  context.report({
124
128
  messageId: 'unexpectedVariableDeclarationsOrder',
125
129
  data: {
@@ -128,12 +132,7 @@ const sortVariableDeclarations = createEslintRule.createEslintRule({
128
132
  },
129
133
  node: right.node,
130
134
  fix: fixer =>
131
- makeFixes.makeFixes(
132
- fixer,
133
- nodes,
134
- sortNodes.sortNodes(nodes, options),
135
- sourceCode,
136
- ),
135
+ makeFixes.makeFixes(fixer, nodes, sortedNodes, sourceCode),
137
136
  })
138
137
  }
139
138
  })
@@ -1,14 +1,13 @@
1
+ import { sortNodesByDependencies } from '../utils/sort-nodes-by-dependencies.mjs'
1
2
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
2
3
  import { getSourceCode } from '../utils/get-source-code.mjs'
3
4
  import { toSingleLine } from '../utils/to-single-line.mjs'
4
5
  import { rangeToDiff } from '../utils/range-to-diff.mjs'
5
6
  import { getSettings } from '../utils/get-settings.mjs'
6
- import { isPositive } from '../utils/is-positive.mjs'
7
7
  import { sortNodes } from '../utils/sort-nodes.mjs'
8
8
  import { makeFixes } from '../utils/make-fixes.mjs'
9
9
  import { complete } from '../utils/complete.mjs'
10
10
  import { pairwise } from '../utils/pairwise.mjs'
11
- import { compare } from '../utils/compare.mjs'
12
11
  const sortVariableDeclarations = createEslintRule({
13
12
  name: 'sort-variable-declarations',
14
13
  meta: {
@@ -117,8 +116,11 @@ const sortVariableDeclarations = createEslintRule({
117
116
  name,
118
117
  }
119
118
  })
119
+ let sortedNodes = sortNodesByDependencies(sortNodes(nodes, options))
120
120
  pairwise(nodes, (left, right) => {
121
- if (isPositive(compare(left, right, options))) {
121
+ let indexOfLeft = sortedNodes.indexOf(left)
122
+ let indexOfRight = sortedNodes.indexOf(right)
123
+ if (indexOfLeft > indexOfRight) {
122
124
  context.report({
123
125
  messageId: 'unexpectedVariableDeclarationsOrder',
124
126
  data: {
@@ -126,8 +128,7 @@ const sortVariableDeclarations = createEslintRule({
126
128
  right: toSingleLine(right.name),
127
129
  },
128
130
  node: right.node,
129
- fix: fixer =>
130
- makeFixes(fixer, nodes, sortNodes(nodes, options), sourceCode),
131
+ fix: fixer => makeFixes(fixer, nodes, sortedNodes, sourceCode),
131
132
  })
132
133
  }
133
134
  })
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
  const path = require('node:path')
3
+ const validateGroupsConfiguration = require('../utils/validate-groups-configuration.js')
3
4
  const createEslintRule = require('../utils/create-eslint-rule.js')
4
5
  const getGroupNumber = require('../utils/get-group-number.js')
5
6
  const getSourceCode = require('../utils/get-source-code.js')
@@ -111,6 +112,11 @@ const sortVueAttributes = createEslintRule.createEslintRule({
111
112
  order: 'asc',
112
113
  groups: [],
113
114
  })
115
+ validateGroupsConfiguration.validateGroupsConfiguration(
116
+ options.groups,
117
+ ['multiline', 'shorthand', 'unknown'],
118
+ Object.keys(options.customGroups),
119
+ )
114
120
  let parts = node.attributes.reduce(
115
121
  (accumulator, attribute) => {
116
122
  if (
@@ -1,4 +1,5 @@
1
1
  import path from 'node:path'
2
+ import { validateGroupsConfiguration } from '../utils/validate-groups-configuration.mjs'
2
3
  import { createEslintRule } from '../utils/create-eslint-rule.mjs'
3
4
  import { getGroupNumber } from '../utils/get-group-number.mjs'
4
5
  import { getSourceCode } from '../utils/get-source-code.mjs'
@@ -110,6 +111,11 @@ const sortVueAttributes = createEslintRule({
110
111
  order: 'asc',
111
112
  groups: [],
112
113
  })
114
+ validateGroupsConfiguration(
115
+ options.groups,
116
+ ['multiline', 'shorthand', 'unknown'],
117
+ Object.keys(options.customGroups),
118
+ )
113
119
  let parts = node.attributes.reduce(
114
120
  (accumulator, attribute) => {
115
121
  if (
@@ -2,12 +2,6 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
3
3
  const naturalCompare = require('natural-compare-lite')
4
4
  let compare = (a, b, options) => {
5
- var _a, _b
6
- if ((_a = b.dependencies) == null ? void 0 : _a.includes(a.name)) {
7
- return -1
8
- } else if ((_b = a.dependencies) == null ? void 0 : _b.includes(b.name)) {
9
- return 1
10
- }
11
5
  let orderCoefficient = options.order === 'asc' ? 1 : -1
12
6
  let sortingFunction
13
7
  let formatString =
@@ -1,11 +1,5 @@
1
1
  import naturalCompare from 'natural-compare-lite'
2
2
  let compare = (a, b, options) => {
3
- var _a, _b
4
- if ((_a = b.dependencies) == null ? void 0 : _a.includes(a.name)) {
5
- return -1
6
- } else if ((_b = a.dependencies) == null ? void 0 : _b.includes(b.name)) {
7
- return 1
8
- }
9
3
  let orderCoefficient = options.order === 'asc' ? 1 : -1
10
4
  let sortingFunction
11
5
  let formatString =
@@ -0,0 +1,30 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
3
+ let sortNodesByDependencies = nodes => {
4
+ let result = []
5
+ let visitedNodes = /* @__PURE__ */ new Set()
6
+ let inProcessNodes = /* @__PURE__ */ new Set()
7
+ let visitNode = node => {
8
+ if (visitedNodes.has(node)) {
9
+ return
10
+ }
11
+ if (inProcessNodes.has(node)) {
12
+ return
13
+ }
14
+ inProcessNodes.add(node)
15
+ let dependentNodes = nodes.filter(n =>
16
+ node.dependencies.includes(n.dependencyName ?? n.name),
17
+ )
18
+ for (let dependentNode of dependentNodes) {
19
+ visitNode(dependentNode)
20
+ }
21
+ visitedNodes.add(node)
22
+ inProcessNodes.delete(node)
23
+ result.push(node)
24
+ }
25
+ for (let node of nodes) {
26
+ visitNode(node)
27
+ }
28
+ return result
29
+ }
30
+ exports.sortNodesByDependencies = sortNodesByDependencies
@@ -0,0 +1,28 @@
1
+ let sortNodesByDependencies = nodes => {
2
+ let result = []
3
+ let visitedNodes = /* @__PURE__ */ new Set()
4
+ let inProcessNodes = /* @__PURE__ */ new Set()
5
+ let visitNode = node => {
6
+ if (visitedNodes.has(node)) {
7
+ return
8
+ }
9
+ if (inProcessNodes.has(node)) {
10
+ return
11
+ }
12
+ inProcessNodes.add(node)
13
+ let dependentNodes = nodes.filter(n =>
14
+ node.dependencies.includes(n.dependencyName ?? n.name),
15
+ )
16
+ for (let dependentNode of dependentNodes) {
17
+ visitNode(dependentNode)
18
+ }
19
+ visitedNodes.add(node)
20
+ inProcessNodes.delete(node)
21
+ result.push(node)
22
+ }
23
+ for (let node of nodes) {
24
+ visitNode(node)
25
+ }
26
+ return result
27
+ }
28
+ export { sortNodesByDependencies }
@@ -0,0 +1,19 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
3
+ let validateGroupsConfiguration = (
4
+ groups,
5
+ allowedPredefinedGroups,
6
+ allowedCustomGroups,
7
+ ) => {
8
+ let allowedGroupsSet = /* @__PURE__ */ new Set([
9
+ ...allowedPredefinedGroups,
10
+ ...allowedCustomGroups,
11
+ ])
12
+ let invalidGroups = groups
13
+ .flat()
14
+ .filter(group => !allowedGroupsSet.has(group))
15
+ if (invalidGroups.length) {
16
+ throw new Error('Invalid group(s): ' + invalidGroups.join(', '))
17
+ }
18
+ }
19
+ exports.validateGroupsConfiguration = validateGroupsConfiguration
@@ -0,0 +1,17 @@
1
+ let validateGroupsConfiguration = (
2
+ groups,
3
+ allowedPredefinedGroups,
4
+ allowedCustomGroups,
5
+ ) => {
6
+ let allowedGroupsSet = /* @__PURE__ */ new Set([
7
+ ...allowedPredefinedGroups,
8
+ ...allowedCustomGroups,
9
+ ])
10
+ let invalidGroups = groups
11
+ .flat()
12
+ .filter(group => !allowedGroupsSet.has(group))
13
+ if (invalidGroups.length) {
14
+ throw new Error('Invalid group(s): ' + invalidGroups.join(', '))
15
+ }
16
+ }
17
+ export { validateGroupsConfiguration }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "eslint-plugin-perfectionist",
3
3
  "description": "ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.",
4
- "version": "3.3.0",
4
+ "version": "3.4.0",
5
5
  "homepage": "https://perfectionist.dev",
6
6
  "repository": "azat-io/eslint-plugin-perfectionist",
7
7
  "author": "Azat S. <to@azat.io>",
@@ -53,9 +53,9 @@
53
53
  "vue-eslint-parser": ">=9.0.0"
54
54
  },
55
55
  "dependencies": {
56
- "@typescript-eslint/types": "^8.3.0",
57
- "@typescript-eslint/utils": "^8.3.0",
58
- "minimatch": "^10.0.1",
56
+ "@typescript-eslint/types": "^8.4.0",
57
+ "@typescript-eslint/utils": "^8.4.0",
58
+ "minimatch": "^9.0.5",
59
59
  "natural-compare-lite": "^1.4.0"
60
60
  }
61
61
  }