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.
- package/dist/index.d.ts +242 -21
- package/dist/index.js +3 -1
- package/dist/index.mjs +2 -0
- package/dist/rules/sort-array-includes.js +108 -107
- package/dist/rules/sort-array-includes.mjs +100 -100
- package/dist/rules/sort-astro-attributes.js +6 -0
- package/dist/rules/sort-astro-attributes.mjs +6 -0
- package/dist/rules/sort-classes-utils.js +71 -0
- package/dist/rules/sort-classes-utils.mjs +75 -1
- package/dist/rules/sort-classes.js +231 -79
- package/dist/rules/sort-classes.mjs +229 -69
- package/dist/rules/sort-classes.types.js +71 -0
- package/dist/rules/sort-classes.types.mjs +71 -0
- package/dist/rules/sort-enums.js +11 -15
- package/dist/rules/sort-enums.mjs +11 -11
- package/dist/rules/sort-imports.js +28 -0
- package/dist/rules/sort-imports.mjs +28 -0
- package/dist/rules/sort-interfaces.js +6 -0
- package/dist/rules/sort-interfaces.mjs +6 -0
- package/dist/rules/sort-intersection-types.js +20 -0
- package/dist/rules/sort-intersection-types.mjs +20 -0
- package/dist/rules/sort-jsx-props.js +6 -0
- package/dist/rules/sort-jsx-props.mjs +6 -0
- package/dist/rules/sort-object-types.js +6 -0
- package/dist/rules/sort-object-types.mjs +6 -0
- package/dist/rules/sort-objects.js +34 -43
- package/dist/rules/sort-objects.mjs +28 -30
- package/dist/rules/sort-sets.js +48 -0
- package/dist/rules/sort-sets.mjs +47 -0
- package/dist/rules/sort-svelte-attributes.js +6 -0
- package/dist/rules/sort-svelte-attributes.mjs +6 -0
- package/dist/rules/sort-union-types.js +20 -0
- package/dist/rules/sort-union-types.mjs +20 -0
- package/dist/rules/sort-variable-declarations.js +8 -9
- package/dist/rules/sort-variable-declarations.mjs +6 -5
- package/dist/rules/sort-vue-attributes.js +6 -0
- package/dist/rules/sort-vue-attributes.mjs +6 -0
- package/dist/utils/compare.js +0 -6
- package/dist/utils/compare.mjs +0 -6
- package/dist/utils/sort-nodes-by-dependencies.js +30 -0
- package/dist/utils/sort-nodes-by-dependencies.mjs +28 -0
- package/dist/utils/validate-groups-configuration.js +19 -0
- package/dist/utils/validate-groups-configuration.mjs +17 -0
- 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
|
-
|
|
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
|
-
|
|
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 (
|
package/dist/utils/compare.js
CHANGED
|
@@ -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 =
|
package/dist/utils/compare.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
57
|
-
"@typescript-eslint/utils": "^8.
|
|
58
|
-
"minimatch": "^
|
|
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
|
}
|