eslint-plugin-perfectionist 4.10.1 → 4.12.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 (47) hide show
  1. package/dist/index.d.ts +4 -1
  2. package/dist/index.js +9 -5
  3. package/dist/package.json.js +6 -0
  4. package/dist/rules/sort-array-includes.js +12 -19
  5. package/dist/rules/sort-classes.js +18 -24
  6. package/dist/rules/sort-decorators.js +7 -4
  7. package/dist/rules/sort-enums.js +12 -14
  8. package/dist/rules/sort-exports/types.js +14 -0
  9. package/dist/rules/sort-exports.js +78 -17
  10. package/dist/rules/sort-heritage-clauses.js +7 -4
  11. package/dist/rules/sort-imports/compute-common-selectors.js +119 -0
  12. package/dist/rules/sort-imports/is-side-effect-only-group.js +13 -0
  13. package/dist/rules/sort-imports/matches-tsconfig-paths.js +22 -0
  14. package/dist/rules/sort-imports/types.js +48 -0
  15. package/dist/rules/sort-imports/validate-side-effects-configuration.js +24 -0
  16. package/dist/rules/sort-imports.js +364 -297
  17. package/dist/rules/sort-jsx-props/types.js +15 -0
  18. package/dist/rules/sort-jsx-props.js +62 -20
  19. package/dist/rules/sort-maps.js +11 -14
  20. package/dist/rules/sort-modules.js +15 -24
  21. package/dist/rules/sort-named-exports/types.js +14 -0
  22. package/dist/rules/sort-named-exports.js +76 -13
  23. package/dist/rules/sort-named-imports/types.js +14 -0
  24. package/dist/rules/sort-named-imports.js +79 -13
  25. package/dist/rules/sort-object-types.js +26 -40
  26. package/dist/rules/sort-objects.js +66 -53
  27. package/dist/rules/sort-union-types.js +19 -15
  28. package/dist/rules/sort-variable-declarations.js +1 -0
  29. package/dist/utils/common-json-schemas.js +3 -0
  30. package/dist/utils/compute-group.js +48 -0
  31. package/dist/utils/compute-nodes-in-circular-dependencies.js +42 -0
  32. package/dist/utils/does-custom-group-match.js +74 -0
  33. package/dist/utils/get-newlines-between-option.js +39 -9
  34. package/dist/utils/is-node-dependent-on-other-node.js +11 -0
  35. package/dist/utils/matches.js +5 -0
  36. package/dist/utils/report-all-errors.js +36 -4
  37. package/dist/utils/sort-nodes-by-dependencies.js +12 -25
  38. package/dist/utils/validate-generated-groups-configuration.js +44 -11
  39. package/package.json +3 -3
  40. package/dist/rules/sort-array-includes/does-custom-group-match.js +0 -30
  41. package/dist/rules/sort-classes/does-custom-group-match.js +0 -61
  42. package/dist/rules/sort-enums/does-custom-group-match.js +0 -36
  43. package/dist/rules/sort-maps/does-custom-group-match.js +0 -24
  44. package/dist/rules/sort-modules/does-custom-group-match.js +0 -49
  45. package/dist/rules/sort-object-types/does-custom-group-match.js +0 -49
  46. package/dist/rules/sort-objects/does-custom-group-match.js +0 -49
  47. package/dist/utils/use-groups.js +0 -33
package/dist/index.d.ts CHANGED
@@ -36,7 +36,10 @@ declare interface PluginConfig {
36
36
  'recommended-natural': Linter.Config
37
37
  'recommended-custom': Linter.Config
38
38
  }
39
- name: string
39
+ meta: {
40
+ version: string
41
+ name: string
42
+ }
40
43
  }
41
44
 
42
45
  export {}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  'use strict'
2
+ const _package = require('./package.json.js')
2
3
  const sortVariableDeclarations = require('./rules/sort-variable-declarations.js')
3
4
  const sortIntersectionTypes = require('./rules/sort-intersection-types.js')
4
5
  const sortHeritageClauses = require('./rules/sort-heritage-clauses.js')
@@ -19,7 +20,7 @@ const sortModules = require('./rules/sort-modules.js')
19
20
  const sortEnums = require('./rules/sort-enums.js')
20
21
  const sortMaps = require('./rules/sort-maps.js')
21
22
  const sortSets = require('./rules/sort-sets.js')
22
- let name = 'perfectionist'
23
+ let pluginName = 'perfectionist'
23
24
  let plugin = {
24
25
  rules: {
25
26
  'sort-variable-declarations': sortVariableDeclarations,
@@ -43,24 +44,27 @@ let plugin = {
43
44
  'sort-sets': sortSets,
44
45
  'sort-maps': sortMaps,
45
46
  },
46
- name,
47
+ meta: {
48
+ version: _package.version,
49
+ name: _package.name,
50
+ },
47
51
  }
48
52
  let getRules = options =>
49
53
  Object.fromEntries(
50
54
  Object.keys(plugin.rules).map(ruleName => [
51
- `${name}/${ruleName}`,
55
+ `${pluginName}/${ruleName}`,
52
56
  ['error', options],
53
57
  ]),
54
58
  )
55
59
  let createConfig = options => ({
56
60
  plugins: {
57
- [name]: plugin,
61
+ [pluginName]: plugin,
58
62
  },
59
63
  rules: getRules(options),
60
64
  })
61
65
  let createLegacyConfig = options => ({
62
66
  rules: getRules(options),
63
- plugins: [name],
67
+ plugins: [pluginName],
64
68
  })
65
69
  const index = {
66
70
  ...plugin,
@@ -0,0 +1,6 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
3
+ const name = 'eslint-plugin-perfectionist'
4
+ const version = '4.12.0'
5
+ exports.name = name
6
+ exports.version = version
@@ -10,19 +10,19 @@ const getCustomGroupsCompareOptions = require('../utils/get-custom-groups-compar
10
10
  const validateGeneratedGroupsConfiguration = require('../utils/validate-generated-groups-configuration.js')
11
11
  const validateCustomSortConfiguration = require('../utils/validate-custom-sort-configuration.js')
12
12
  const types = require('./sort-array-includes/types.js')
13
- const doesCustomGroupMatch = require('./sort-array-includes/does-custom-group-match.js')
14
13
  const getMatchingContextOptions = require('../utils/get-matching-context-options.js')
15
14
  const generatePredefinedGroups = require('../utils/generate-predefined-groups.js')
16
15
  const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
17
16
  const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
17
+ const doesCustomGroupMatch = require('../utils/does-custom-group-match.js')
18
18
  const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
19
19
  const createEslintRule = require('../utils/create-eslint-rule.js')
20
20
  const reportAllErrors = require('../utils/report-all-errors.js')
21
21
  const shouldPartition = require('../utils/should-partition.js')
22
+ const computeGroup = require('../utils/compute-group.js')
22
23
  const rangeToDiff = require('../utils/range-to-diff.js')
23
24
  const getSettings = require('../utils/get-settings.js')
24
25
  const isSortable = require('../utils/is-sortable.js')
25
- const useGroups = require('../utils/use-groups.js')
26
26
  const complete = require('../utils/complete.js')
27
27
  let cachedGroupsByModifiersAndSelectors = /* @__PURE__ */ new Map()
28
28
  let defaultOptions = {
@@ -46,8 +46,8 @@ let jsonSchema = {
46
46
  properties: {
47
47
  ...commonJsonSchemas.commonJsonSchemas,
48
48
  groupKind: {
49
+ description: '[DEPRECATED] Specifies top-level groups.',
49
50
  enum: ['mixed', 'literals-first', 'spreads-first'],
50
- description: 'Specifies top-level groups.',
51
51
  type: 'string',
52
52
  },
53
53
  customGroups: commonJsonSchemas.buildCustomGroupsArrayJsonSchema({
@@ -150,7 +150,6 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
150
150
  if (element === null) {
151
151
  return accumulator
152
152
  }
153
- let { defineGroup, getGroup } = useGroups.useGroups(options)
154
153
  let groupKind
155
154
  let selector
156
155
  if (element.type === 'SpreadElement') {
@@ -160,38 +159,32 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
160
159
  groupKind = 'literal'
161
160
  selector = 'literal'
162
161
  }
162
+ let name = getNodeName({ sourceCode, element })
163
163
  let predefinedGroups = generatePredefinedGroups.generatePredefinedGroups({
164
164
  cache: cachedGroupsByModifiersAndSelectors,
165
165
  selectors: [selector],
166
166
  modifiers: [],
167
167
  })
168
- for (let predefinedGroup of predefinedGroups) {
169
- defineGroup(predefinedGroup)
170
- }
171
- let name = getNodeName({ sourceCode, element })
172
- for (let customGroup of options.customGroups) {
173
- if (
168
+ let group = computeGroup.computeGroup({
169
+ customGroupMatcher: customGroup =>
174
170
  doesCustomGroupMatch.doesCustomGroupMatch({
175
171
  selectors: [selector],
176
172
  elementName: name,
173
+ modifiers: [],
177
174
  customGroup,
178
- })
179
- ) {
180
- defineGroup(customGroup.groupName, true)
181
- if (getGroup() === customGroup.groupName) {
182
- break
183
- }
184
- }
185
- }
175
+ }),
176
+ predefinedGroups,
177
+ options,
178
+ })
186
179
  let sortingNode = {
187
180
  isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
188
181
  element,
189
182
  eslintDisabledLines,
190
183
  ),
191
184
  size: rangeToDiff.rangeToDiff(element, sourceCode),
192
- group: getGroup(),
193
185
  node: element,
194
186
  groupKind,
187
+ group,
195
188
  name,
196
189
  }
197
190
  let lastSortingNode =
@@ -9,9 +9,9 @@ const validateCustomSortConfiguration = require('../utils/validate-custom-sort-c
9
9
  const getOverloadSignatureGroups = require('./sort-classes/get-overload-signature-groups.js')
10
10
  const generatePredefinedGroups = require('../utils/generate-predefined-groups.js')
11
11
  const sortNodesByDependencies = require('../utils/sort-nodes-by-dependencies.js')
12
- const doesCustomGroupMatch = require('./sort-classes/does-custom-group-match.js')
13
12
  const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
14
13
  const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
14
+ const doesCustomGroupMatch = require('../utils/does-custom-group-match.js')
15
15
  const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
16
16
  const getNodeDecorators = require('../utils/get-node-decorators.js')
17
17
  const createEslintRule = require('../utils/create-eslint-rule.js')
@@ -19,10 +19,10 @@ const getDecoratorName = require('../utils/get-decorator-name.js')
19
19
  const reportAllErrors = require('../utils/report-all-errors.js')
20
20
  const shouldPartition = require('../utils/should-partition.js')
21
21
  const getGroupNumber = require('../utils/get-group-number.js')
22
+ const computeGroup = require('../utils/compute-group.js')
22
23
  const rangeToDiff = require('../utils/range-to-diff.js')
23
24
  const getSettings = require('../utils/get-settings.js')
24
25
  const isSortable = require('../utils/is-sortable.js')
25
- const useGroups = require('../utils/use-groups.js')
26
26
  const complete = require('../utils/complete.js')
27
27
  const matches = require('../utils/matches.js')
28
28
  let cachedGroupsByModifiersAndSelectors = /* @__PURE__ */ new Map()
@@ -233,7 +233,6 @@ const sortClasses = createEslintRule.createEslintRule({
233
233
  var _a2, _b, _c, _d, _e
234
234
  let name
235
235
  let dependencies = []
236
- let { defineGroup, getGroup } = useGroups.useGroups(options)
237
236
  if (member.type === 'StaticBlock') {
238
237
  name = 'static'
239
238
  } else if (member.type === 'TSIndexSignature') {
@@ -402,11 +401,8 @@ const sortClasses = createEslintRule.createEslintRule({
402
401
  selectors,
403
402
  modifiers,
404
403
  })
405
- for (let predefinedGroup of predefinedGroups) {
406
- defineGroup(predefinedGroup)
407
- }
408
- for (let customGroup of options.customGroups) {
409
- if (
404
+ let group = computeGroup.computeGroup({
405
+ customGroupMatcher: customGroup =>
410
406
  doesCustomGroupMatch.doesCustomGroupMatch({
411
407
  elementValue: memberValue,
412
408
  elementName: name,
@@ -414,14 +410,10 @@ const sortClasses = createEslintRule.createEslintRule({
414
410
  decorators,
415
411
  modifiers,
416
412
  selectors,
417
- })
418
- ) {
419
- defineGroup(customGroup.groupName, true)
420
- if (getGroup() === customGroup.groupName) {
421
- break
422
- }
423
- }
424
- }
413
+ }),
414
+ predefinedGroups,
415
+ options,
416
+ })
425
417
  let overloadSignatureGroupMemberIndex =
426
418
  overloadSignatureGroups.findIndex(overloadSignatures =>
427
419
  overloadSignatures.includes(member),
@@ -432,13 +424,15 @@ const sortClasses = createEslintRule.createEslintRule({
432
424
  ? void 0
433
425
  : _d.at(-1)
434
426
  let sortingNode = {
435
- dependencyName: getDependencyName({
436
- nodeNameWithoutStartingHash: name.startsWith('#')
437
- ? name.slice(1)
438
- : name,
439
- isStatic: modifiers.includes('static'),
440
- isPrivateHash,
441
- }),
427
+ dependencyNames: [
428
+ getDependencyName({
429
+ nodeNameWithoutStartingHash: name.startsWith('#')
430
+ ? name.slice(1)
431
+ : name,
432
+ isStatic: modifiers.includes('static'),
433
+ isPrivateHash,
434
+ }),
435
+ ],
442
436
  overloadSignaturesGroupId:
443
437
  overloadSignatureGroupMemberIndex === -1
444
438
  ? null
@@ -454,9 +448,9 @@ const sortClasses = createEslintRule.createEslintRule({
454
448
  eslintDisabledLines,
455
449
  ),
456
450
  addSafetySemicolonWhenInline,
457
- group: getGroup(),
458
451
  node: member,
459
452
  dependencies,
453
+ group,
460
454
  name,
461
455
  }
462
456
  let lastSortingNode =
@@ -11,10 +11,10 @@ const getDecoratorName = require('../utils/get-decorator-name.js')
11
11
  const createEslintRule = require('../utils/create-eslint-rule.js')
12
12
  const reportAllErrors = require('../utils/report-all-errors.js')
13
13
  const shouldPartition = require('../utils/should-partition.js')
14
+ const computeGroup = require('../utils/compute-group.js')
14
15
  const rangeToDiff = require('../utils/range-to-diff.js')
15
16
  const getSettings = require('../utils/get-settings.js')
16
17
  const isSortable = require('../utils/is-sortable.js')
17
- const useGroups = require('../utils/use-groups.js')
18
18
  const complete = require('../utils/complete.js')
19
19
  let defaultOptions = {
20
20
  fallbackSort: { type: 'unsorted' },
@@ -163,20 +163,23 @@ let sortDecorators$1 = (context, options, decorators) => {
163
163
  let formattedMembers = decorators.reduce(
164
164
  (accumulator, decorator) => {
165
165
  var _a
166
- let { setCustomGroups, getGroup } = useGroups.useGroups(options)
167
166
  let name = getDecoratorName.getDecoratorName({
168
167
  sourceCode,
169
168
  decorator,
170
169
  })
171
- setCustomGroups(options.customGroups, name)
170
+ let group = computeGroup.computeGroup({
171
+ predefinedGroups: [],
172
+ options,
173
+ name,
174
+ })
172
175
  let sortingNode = {
173
176
  isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
174
177
  decorator,
175
178
  eslintDisabledLines,
176
179
  ),
177
180
  size: rangeToDiff.rangeToDiff(decorator, sourceCode),
178
- group: getGroup(),
179
181
  node: decorator,
182
+ group,
180
183
  name,
181
184
  }
182
185
  let lastSortingNode =
@@ -7,18 +7,18 @@ const validateCustomSortConfiguration = require('../utils/validate-custom-sort-c
7
7
  const getCustomGroupsCompareOptions = require('../utils/get-custom-groups-compare-options.js')
8
8
  const sortNodesByDependencies = require('../utils/sort-nodes-by-dependencies.js')
9
9
  const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
10
- const doesCustomGroupMatch = require('./sort-enums/does-custom-group-match.js')
11
10
  const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
11
+ const doesCustomGroupMatch = require('../utils/does-custom-group-match.js')
12
12
  const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
13
13
  const types = require('./sort-enums/types.js')
14
14
  const createEslintRule = require('../utils/create-eslint-rule.js')
15
15
  const reportAllErrors = require('../utils/report-all-errors.js')
16
16
  const shouldPartition = require('../utils/should-partition.js')
17
17
  const getEnumMembers = require('../utils/get-enum-members.js')
18
+ const computeGroup = require('../utils/compute-group.js')
18
19
  const rangeToDiff = require('../utils/range-to-diff.js')
19
20
  const getSettings = require('../utils/get-settings.js')
20
21
  const isSortable = require('../utils/is-sortable.js')
21
- const useGroups = require('../utils/use-groups.js')
22
22
  const complete = require('../utils/complete.js')
23
23
  let defaultOptions = {
24
24
  fallbackSort: { type: 'unsorted' },
@@ -109,21 +109,18 @@ const sortEnums = createEslintRule.createEslintRule({
109
109
  member.id.type === 'Literal'
110
110
  ? `${member.id.value}`
111
111
  : sourceCode.getText(member.id)
112
- let { defineGroup, getGroup } = useGroups.useGroups(options)
113
- for (let customGroup of options.customGroups) {
114
- if (
112
+ let group = computeGroup.computeGroup({
113
+ customGroupMatcher: customGroup =>
115
114
  doesCustomGroupMatch.doesCustomGroupMatch({
116
115
  elementValue: sourceCode.getText(member.initializer),
117
116
  elementName: name,
117
+ selectors: [],
118
+ modifiers: [],
118
119
  customGroup,
119
- })
120
- ) {
121
- defineGroup(customGroup.groupName, true)
122
- if (getGroup() === customGroup.groupName) {
123
- break
124
- }
125
- }
126
- }
120
+ }),
121
+ predefinedGroups: [],
122
+ options,
123
+ })
127
124
  let lastSortingNode =
128
125
  (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
129
126
  let sortingNode = {
@@ -142,9 +139,10 @@ const sortEnums = createEslintRule.createEslintRule({
142
139
  eslintDisabledLines,
143
140
  ),
144
141
  size: rangeToDiff.rangeToDiff(member, sourceCode),
145
- group: getGroup(),
142
+ dependencyNames: [name],
146
143
  node: member,
147
144
  dependencies,
145
+ group,
148
146
  name,
149
147
  }
150
148
  if (
@@ -0,0 +1,14 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
3
+ const commonJsonSchemas = require('../../utils/common-json-schemas.js')
4
+ let allSelectors = ['export']
5
+ let allModifiers = ['value', 'type']
6
+ let singleCustomGroupJsonSchema = {
7
+ modifiers:
8
+ commonJsonSchemas.buildCustomGroupModifiersJsonSchema(allModifiers),
9
+ selector: commonJsonSchemas.buildCustomGroupSelectorJsonSchema(allSelectors),
10
+ elementNamePattern: commonJsonSchemas.regexJsonSchema,
11
+ }
12
+ exports.allModifiers = allModifiers
13
+ exports.allSelectors = allSelectors
14
+ exports.singleCustomGroupJsonSchema = singleCustomGroupJsonSchema
@@ -1,27 +1,38 @@
1
1
  'use strict'
2
2
  const commonJsonSchemas = require('../utils/common-json-schemas.js')
3
+ const reportErrors = require('../utils/report-errors.js')
4
+ const validateNewlinesAndPartitionConfiguration = require('../utils/validate-newlines-and-partition-configuration.js')
5
+ const getCustomGroupsCompareOptions = require('../utils/get-custom-groups-compare-options.js')
6
+ const validateGeneratedGroupsConfiguration = require('../utils/validate-generated-groups-configuration.js')
3
7
  const validateCustomSortConfiguration = require('../utils/validate-custom-sort-configuration.js')
8
+ const generatePredefinedGroups = require('../utils/generate-predefined-groups.js')
4
9
  const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
5
10
  const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
11
+ const doesCustomGroupMatch = require('../utils/does-custom-group-match.js')
12
+ const types = require('./sort-exports/types.js')
13
+ const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
6
14
  const createEslintRule = require('../utils/create-eslint-rule.js')
7
15
  const reportAllErrors = require('../utils/report-all-errors.js')
8
16
  const shouldPartition = require('../utils/should-partition.js')
17
+ const computeGroup = require('../utils/compute-group.js')
9
18
  const rangeToDiff = require('../utils/range-to-diff.js')
10
- const reportErrors = require('../utils/report-errors.js')
11
19
  const getSettings = require('../utils/get-settings.js')
12
- const sortNodes = require('../utils/sort-nodes.js')
13
20
  const complete = require('../utils/complete.js')
21
+ let cachedGroupsByModifiersAndSelectors = /* @__PURE__ */ new Map()
14
22
  let defaultOptions = {
15
23
  fallbackSort: { type: 'unsorted' },
16
24
  specialCharacters: 'keep',
17
25
  partitionByComment: false,
26
+ newlinesBetween: 'ignore',
18
27
  partitionByNewLine: false,
19
28
  type: 'alphabetical',
20
29
  groupKind: 'mixed',
30
+ customGroups: [],
21
31
  ignoreCase: true,
22
32
  locales: 'en-US',
23
33
  alphabet: '',
24
34
  order: 'asc',
35
+ groups: [],
25
36
  }
26
37
  const sortExports = createEslintRule.createEslintRule({
27
38
  create: context => {
@@ -32,14 +43,46 @@ const sortExports = createEslintRule.createEslintRule({
32
43
  defaultOptions,
33
44
  )
34
45
  validateCustomSortConfiguration.validateCustomSortConfiguration(options)
46
+ validateGeneratedGroupsConfiguration.validateGeneratedGroupsConfiguration({
47
+ modifiers: types.allModifiers,
48
+ selectors: types.allSelectors,
49
+ options,
50
+ })
51
+ validateNewlinesAndPartitionConfiguration.validateNewlinesAndPartitionConfiguration(
52
+ options,
53
+ )
35
54
  let { sourceCode, id } = context
36
55
  let eslintDisabledLines = getEslintDisabledLines.getEslintDisabledLines({
37
56
  ruleName: id,
38
57
  sourceCode,
39
58
  })
40
- let parts = [[]]
59
+ let formattedMembers = [[]]
41
60
  let registerNode = node => {
42
61
  var _a
62
+ let selector = 'export'
63
+ let modifiers = []
64
+ if (node.exportKind === 'value') {
65
+ modifiers.push('value')
66
+ } else {
67
+ modifiers.push('type')
68
+ }
69
+ let name = node.source.value
70
+ let predefinedGroups = generatePredefinedGroups.generatePredefinedGroups({
71
+ cache: cachedGroupsByModifiersAndSelectors,
72
+ selectors: [selector],
73
+ modifiers,
74
+ })
75
+ let group = computeGroup.computeGroup({
76
+ customGroupMatcher: customGroup =>
77
+ doesCustomGroupMatch.doesCustomGroupMatch({
78
+ selectors: [selector],
79
+ elementName: name,
80
+ customGroup,
81
+ modifiers,
82
+ }),
83
+ predefinedGroups,
84
+ options,
85
+ })
43
86
  let sortingNode = {
44
87
  isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
45
88
  node,
@@ -48,10 +91,11 @@ const sortExports = createEslintRule.createEslintRule({
48
91
  groupKind: node.exportKind === 'value' ? 'value' : 'type',
49
92
  size: rangeToDiff.rangeToDiff(node, sourceCode),
50
93
  addSafetySemicolonWhenInline: true,
51
- name: node.source.value,
94
+ group,
95
+ name,
52
96
  node,
53
97
  }
54
- let lastNode = (_a = parts.at(-1)) == null ? void 0 : _a.at(-1)
98
+ let lastNode = (_a = formattedMembers.at(-1)) == null ? void 0 : _a.at(-1)
55
99
  if (
56
100
  shouldPartition.shouldPartition({
57
101
  lastSortingNode: lastNode,
@@ -60,9 +104,9 @@ const sortExports = createEslintRule.createEslintRule({
60
104
  options,
61
105
  })
62
106
  ) {
63
- parts.push([])
107
+ formattedMembers.push([])
64
108
  }
65
- parts.at(-1).push(sortingNode)
109
+ formattedMembers.at(-1).push(sortingNode)
66
110
  }
67
111
  return {
68
112
  'Program:exit': () => {
@@ -74,7 +118,7 @@ const sortExports = createEslintRule.createEslintRule({
74
118
  } else {
75
119
  groupKindOrder = ['any']
76
120
  }
77
- for (let nodes of parts) {
121
+ for (let nodes of formattedMembers) {
78
122
  let filteredGroupKindNodes = groupKindOrder.map(groupKind =>
79
123
  nodes.filter(
80
124
  currentNode =>
@@ -83,14 +127,21 @@ const sortExports = createEslintRule.createEslintRule({
83
127
  )
84
128
  let sortNodesExcludingEslintDisabled = ignoreEslintDisabledNodes =>
85
129
  filteredGroupKindNodes.flatMap(groupedNodes =>
86
- sortNodes.sortNodes({
130
+ sortNodesByGroups.sortNodesByGroups({
131
+ getOptionsByGroupNumber:
132
+ getCustomGroupsCompareOptions.buildGetCustomGroupOverriddenOptionsFunction(
133
+ options,
134
+ ),
87
135
  ignoreEslintDisabledNodes,
136
+ groups: options.groups,
88
137
  nodes: groupedNodes,
89
- options,
90
138
  }),
91
139
  )
92
140
  reportAllErrors.reportAllErrors({
93
141
  availableMessageIds: {
142
+ missedSpacingBetweenMembers: 'missedSpacingBetweenExports',
143
+ extraSpacingBetweenMembers: 'extraSpacingBetweenExports',
144
+ unexpectedGroupOrder: 'unexpectedExportsGroupOrder',
94
145
  unexpectedOrder: 'unexpectedExportsOrder',
95
146
  },
96
147
  sortNodesExcludingEslintDisabled,
@@ -110,30 +161,40 @@ const sortExports = createEslintRule.createEslintRule({
110
161
  }
111
162
  },
112
163
  meta: {
113
- schema: [
114
- {
164
+ schema: {
165
+ items: {
115
166
  properties: {
116
167
  ...commonJsonSchemas.commonJsonSchemas,
117
168
  groupKind: {
169
+ description: '[DEPRECATED] Specifies top-level groups.',
118
170
  enum: ['mixed', 'values-first', 'types-first'],
119
- description: 'Specifies top-level groups.',
120
171
  type: 'string',
121
172
  },
173
+ customGroups: commonJsonSchemas.buildCustomGroupsArrayJsonSchema({
174
+ singleCustomGroupJsonSchema: types.singleCustomGroupJsonSchema,
175
+ }),
122
176
  partitionByComment: commonJsonSchemas.partitionByCommentJsonSchema,
123
177
  partitionByNewLine: commonJsonSchemas.partitionByNewLineJsonSchema,
178
+ newlinesBetween: commonJsonSchemas.newlinesBetweenJsonSchema,
179
+ groups: commonJsonSchemas.groupsJsonSchema,
124
180
  },
125
181
  additionalProperties: false,
126
182
  type: 'object',
127
183
  },
128
- ],
184
+ uniqueItems: true,
185
+ type: 'array',
186
+ },
187
+ messages: {
188
+ missedSpacingBetweenExports: reportErrors.MISSED_SPACING_ERROR,
189
+ extraSpacingBetweenExports: reportErrors.EXTRA_SPACING_ERROR,
190
+ unexpectedExportsGroupOrder: reportErrors.GROUP_ORDER_ERROR,
191
+ unexpectedExportsOrder: reportErrors.ORDER_ERROR,
192
+ },
129
193
  docs: {
130
194
  url: 'https://perfectionist.dev/rules/sort-exports',
131
195
  description: 'Enforce sorted exports.',
132
196
  recommended: true,
133
197
  },
134
- messages: {
135
- unexpectedExportsOrder: reportErrors.ORDER_ERROR,
136
- },
137
198
  type: 'suggestion',
138
199
  fixable: 'code',
139
200
  },
@@ -8,10 +8,10 @@ const reportErrors = require('../utils/report-errors.js')
8
8
  const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
9
9
  const createEslintRule = require('../utils/create-eslint-rule.js')
10
10
  const reportAllErrors = require('../utils/report-all-errors.js')
11
+ const computeGroup = require('../utils/compute-group.js')
11
12
  const rangeToDiff = require('../utils/range-to-diff.js')
12
13
  const getSettings = require('../utils/get-settings.js')
13
14
  const isSortable = require('../utils/is-sortable.js')
14
- const useGroups = require('../utils/use-groups.js')
15
15
  const complete = require('../utils/complete.js')
16
16
  let defaultOptions = {
17
17
  fallbackSort: { type: 'unsorted' },
@@ -83,8 +83,11 @@ let sortHeritageClauses$1 = (context, options, heritageClauses) => {
83
83
  })
84
84
  let nodes = heritageClauses.map(heritageClause => {
85
85
  let name = getHeritageClauseExpressionName(heritageClause.expression)
86
- let { setCustomGroups, getGroup } = useGroups.useGroups(options)
87
- setCustomGroups(options.customGroups, name)
86
+ let group = computeGroup.computeGroup({
87
+ predefinedGroups: [],
88
+ options,
89
+ name,
90
+ })
88
91
  return {
89
92
  isEslintDisabled: isNodeEslintDisabled.isNodeEslintDisabled(
90
93
  heritageClause,
@@ -92,7 +95,7 @@ let sortHeritageClauses$1 = (context, options, heritageClauses) => {
92
95
  ),
93
96
  size: rangeToDiff.rangeToDiff(heritageClause, sourceCode),
94
97
  node: heritageClause,
95
- group: getGroup(),
98
+ group,
96
99
  name,
97
100
  }
98
101
  })