eslint-plugin-perfectionist 3.2.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 +102 -0
- package/dist/rules/sort-classes-utils.mjs +105 -1
- package/dist/rules/sort-classes.js +263 -83
- package/dist/rules/sort-classes.mjs +263 -71
- package/dist/rules/sort-classes.types.js +71 -0
- package/dist/rules/sort-classes.types.mjs +71 -0
- package/dist/rules/sort-enums.js +41 -14
- package/dist/rules/sort-enums.mjs +41 -10
- 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-switch-case.js +6 -3
- package/dist/rules/sort-switch-case.mjs +6 -3
- 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
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
const createEslintRule = require('../utils/create-eslint-rule.js')
|
|
3
|
+
const sortArrayIncludes = require('./sort-array-includes.js')
|
|
4
|
+
const sortSets = createEslintRule.createEslintRule({
|
|
5
|
+
name: 'sort-sets',
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'suggestion',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'Enforce sorted sets.',
|
|
10
|
+
},
|
|
11
|
+
fixable: 'code',
|
|
12
|
+
schema: [sortArrayIncludes.jsonSchema],
|
|
13
|
+
messages: {
|
|
14
|
+
unexpectedSetsOrder: 'Expected "{{right}}" to come before "{{left}}".',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
defaultOptions: [
|
|
18
|
+
{
|
|
19
|
+
type: 'alphabetical',
|
|
20
|
+
order: 'asc',
|
|
21
|
+
ignoreCase: true,
|
|
22
|
+
groupKind: 'literals-first',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
create: context => ({
|
|
26
|
+
NewExpression: node => {
|
|
27
|
+
var _a, _b
|
|
28
|
+
if (
|
|
29
|
+
node.callee.type === 'Identifier' &&
|
|
30
|
+
node.callee.name === 'Set' &&
|
|
31
|
+
node.arguments.length &&
|
|
32
|
+
(((_a = node.arguments[0]) == null ? void 0 : _a.type) ===
|
|
33
|
+
'ArrayExpression' ||
|
|
34
|
+
(((_b = node.arguments[0]) == null ? void 0 : _b.type) ===
|
|
35
|
+
'NewExpression' &&
|
|
36
|
+
'name' in node.arguments[0].callee &&
|
|
37
|
+
node.arguments[0].callee.name === 'Array'))
|
|
38
|
+
) {
|
|
39
|
+
let elements =
|
|
40
|
+
node.arguments[0].type === 'ArrayExpression'
|
|
41
|
+
? node.arguments[0].elements
|
|
42
|
+
: node.arguments[0].arguments
|
|
43
|
+
sortArrayIncludes.sortArray(context, 'unexpectedSetsOrder', elements)
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
}),
|
|
47
|
+
})
|
|
48
|
+
module.exports = sortSets
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createEslintRule } from '../utils/create-eslint-rule.mjs'
|
|
2
|
+
import { jsonSchema, sortArray } from './sort-array-includes.mjs'
|
|
3
|
+
const sortSets = createEslintRule({
|
|
4
|
+
name: 'sort-sets',
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'suggestion',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Enforce sorted sets.',
|
|
9
|
+
},
|
|
10
|
+
fixable: 'code',
|
|
11
|
+
schema: [jsonSchema],
|
|
12
|
+
messages: {
|
|
13
|
+
unexpectedSetsOrder: 'Expected "{{right}}" to come before "{{left}}".',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
defaultOptions: [
|
|
17
|
+
{
|
|
18
|
+
type: 'alphabetical',
|
|
19
|
+
order: 'asc',
|
|
20
|
+
ignoreCase: true,
|
|
21
|
+
groupKind: 'literals-first',
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
create: context => ({
|
|
25
|
+
NewExpression: node => {
|
|
26
|
+
var _a, _b
|
|
27
|
+
if (
|
|
28
|
+
node.callee.type === 'Identifier' &&
|
|
29
|
+
node.callee.name === 'Set' &&
|
|
30
|
+
node.arguments.length &&
|
|
31
|
+
(((_a = node.arguments[0]) == null ? void 0 : _a.type) ===
|
|
32
|
+
'ArrayExpression' ||
|
|
33
|
+
(((_b = node.arguments[0]) == null ? void 0 : _b.type) ===
|
|
34
|
+
'NewExpression' &&
|
|
35
|
+
'name' in node.arguments[0].callee &&
|
|
36
|
+
node.arguments[0].callee.name === 'Array'))
|
|
37
|
+
) {
|
|
38
|
+
let elements =
|
|
39
|
+
node.arguments[0].type === 'ArrayExpression'
|
|
40
|
+
? node.arguments[0].elements
|
|
41
|
+
: node.arguments[0].arguments
|
|
42
|
+
sortArray(context, 'unexpectedSetsOrder', elements)
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
})
|
|
47
|
+
export { sortSets as default }
|
|
@@ -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')
|
|
@@ -107,6 +108,11 @@ const sortSvelteAttributes = createEslintRule.createEslintRule({
|
|
|
107
108
|
order: 'asc',
|
|
108
109
|
groups: [],
|
|
109
110
|
})
|
|
111
|
+
validateGroupsConfiguration.validateGroupsConfiguration(
|
|
112
|
+
options.groups,
|
|
113
|
+
['svelte-shorthand', 'multiline', 'shorthand', 'unknown'],
|
|
114
|
+
Object.keys(options.customGroups),
|
|
115
|
+
)
|
|
110
116
|
let sourceCode = getSourceCode.getSourceCode(context)
|
|
111
117
|
let parts = node.attributes.reduce(
|
|
112
118
|
(accumulator, attribute) => {
|
|
@@ -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'
|
|
@@ -106,6 +107,11 @@ const sortSvelteAttributes = createEslintRule({
|
|
|
106
107
|
order: 'asc',
|
|
107
108
|
groups: [],
|
|
108
109
|
})
|
|
110
|
+
validateGroupsConfiguration(
|
|
111
|
+
options.groups,
|
|
112
|
+
['svelte-shorthand', 'multiline', 'shorthand', 'unknown'],
|
|
113
|
+
Object.keys(options.customGroups),
|
|
114
|
+
)
|
|
109
115
|
let sourceCode = getSourceCode(context)
|
|
110
116
|
let parts = node.attributes.reduce(
|
|
111
117
|
(accumulator, attribute) => {
|
|
@@ -78,10 +78,12 @@ const sortSwitchCase = createEslintRule.createEslintRule({
|
|
|
78
78
|
let nodes = node.cases.map(caseNode => {
|
|
79
79
|
var _a, _b
|
|
80
80
|
let name
|
|
81
|
+
let isDefaultClause = false
|
|
81
82
|
if (((_a = caseNode.test) == null ? void 0 : _a.type) === 'Literal') {
|
|
82
83
|
name = `${caseNode.test.value}`
|
|
83
84
|
} else if (caseNode.test === null) {
|
|
84
85
|
name = 'default'
|
|
86
|
+
isDefaultClause = true
|
|
85
87
|
} else {
|
|
86
88
|
name = sourceCode.text.slice(...caseNode.test.range)
|
|
87
89
|
}
|
|
@@ -91,6 +93,7 @@ const sortSwitchCase = createEslintRule.createEslintRule({
|
|
|
91
93
|
caseNode.range,
|
|
92
94
|
),
|
|
93
95
|
node: caseNode,
|
|
96
|
+
isDefaultClause,
|
|
94
97
|
name,
|
|
95
98
|
}
|
|
96
99
|
})
|
|
@@ -101,7 +104,7 @@ const sortSwitchCase = createEslintRule.createEslintRule({
|
|
|
101
104
|
(lefter == null ? void 0 : lefter.node.consequent.length) === 0 &&
|
|
102
105
|
left.node.consequent.length !== 0
|
|
103
106
|
let isGroupContainsDefault = group =>
|
|
104
|
-
group.some(currentNode => currentNode.
|
|
107
|
+
group.some(currentNode => currentNode.isDefaultClause)
|
|
105
108
|
let leftCaseGroup = [left]
|
|
106
109
|
let rightCaseGroup = [right]
|
|
107
110
|
for (let i = iteration - 1; i >= 0; i--) {
|
|
@@ -168,7 +171,7 @@ const sortSwitchCase = createEslintRule.createEslintRule({
|
|
|
168
171
|
let sortedGroup = sortNodes
|
|
169
172
|
.sortNodes(group, options)
|
|
170
173
|
.sort((a, b) => {
|
|
171
|
-
if (b.
|
|
174
|
+
if (b.isDefaultClause) {
|
|
172
175
|
return -1
|
|
173
176
|
}
|
|
174
177
|
return 1
|
|
@@ -226,7 +229,7 @@ const sortSwitchCase = createEslintRule.createEslintRule({
|
|
|
226
229
|
})
|
|
227
230
|
let sortedNodes = sortedNodeGroups.flat()
|
|
228
231
|
for (let max = sortedNodes.length, i = 0; i < max; i++) {
|
|
229
|
-
if (sortedNodes.at(i).
|
|
232
|
+
if (sortedNodes.at(i).isDefaultClause) {
|
|
230
233
|
sortedNodes.push(sortedNodes.splice(i, 1).at(0))
|
|
231
234
|
}
|
|
232
235
|
}
|
|
@@ -77,10 +77,12 @@ const sortSwitchCase = createEslintRule({
|
|
|
77
77
|
let nodes = node.cases.map(caseNode => {
|
|
78
78
|
var _a, _b
|
|
79
79
|
let name
|
|
80
|
+
let isDefaultClause = false
|
|
80
81
|
if (((_a = caseNode.test) == null ? void 0 : _a.type) === 'Literal') {
|
|
81
82
|
name = `${caseNode.test.value}`
|
|
82
83
|
} else if (caseNode.test === null) {
|
|
83
84
|
name = 'default'
|
|
85
|
+
isDefaultClause = true
|
|
84
86
|
} else {
|
|
85
87
|
name = sourceCode.text.slice(...caseNode.test.range)
|
|
86
88
|
}
|
|
@@ -90,6 +92,7 @@ const sortSwitchCase = createEslintRule({
|
|
|
90
92
|
caseNode.range,
|
|
91
93
|
),
|
|
92
94
|
node: caseNode,
|
|
95
|
+
isDefaultClause,
|
|
93
96
|
name,
|
|
94
97
|
}
|
|
95
98
|
})
|
|
@@ -100,7 +103,7 @@ const sortSwitchCase = createEslintRule({
|
|
|
100
103
|
(lefter == null ? void 0 : lefter.node.consequent.length) === 0 &&
|
|
101
104
|
left.node.consequent.length !== 0
|
|
102
105
|
let isGroupContainsDefault = group =>
|
|
103
|
-
group.some(currentNode => currentNode.
|
|
106
|
+
group.some(currentNode => currentNode.isDefaultClause)
|
|
104
107
|
let leftCaseGroup = [left]
|
|
105
108
|
let rightCaseGroup = [right]
|
|
106
109
|
for (let i = iteration - 1; i >= 0; i--) {
|
|
@@ -161,7 +164,7 @@ const sortSwitchCase = createEslintRule({
|
|
|
161
164
|
.map(group => {
|
|
162
165
|
var _a, _b
|
|
163
166
|
let sortedGroup = sortNodes(group, options).sort((a, b) => {
|
|
164
|
-
if (b.
|
|
167
|
+
if (b.isDefaultClause) {
|
|
165
168
|
return -1
|
|
166
169
|
}
|
|
167
170
|
return 1
|
|
@@ -214,7 +217,7 @@ const sortSwitchCase = createEslintRule({
|
|
|
214
217
|
})
|
|
215
218
|
let sortedNodes = sortedNodeGroups.flat()
|
|
216
219
|
for (let max = sortedNodes.length, i = 0; i < max; i++) {
|
|
217
|
-
if (sortedNodes.at(i).
|
|
220
|
+
if (sortedNodes.at(i).isDefaultClause) {
|
|
218
221
|
sortedNodes.push(sortedNodes.splice(i, 1).at(0))
|
|
219
222
|
}
|
|
220
223
|
}
|
|
@@ -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
|
}
|