eslint-plugin-perfectionist 4.6.0 → 4.8.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 (52) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/rules/sort-array-includes.js +37 -77
  3. package/dist/rules/sort-classes/types.js +1 -4
  4. package/dist/rules/sort-classes.js +190 -238
  5. package/dist/rules/sort-decorators.js +78 -118
  6. package/dist/rules/sort-enums/does-custom-group-match.js +36 -0
  7. package/dist/rules/sort-enums/types.js +8 -0
  8. package/dist/rules/sort-enums.js +93 -93
  9. package/dist/rules/sort-exports.js +21 -60
  10. package/dist/rules/sort-heritage-clauses.js +17 -53
  11. package/dist/rules/sort-imports/read-closest-ts-config-by-path.js +2 -2
  12. package/dist/rules/sort-imports.js +38 -120
  13. package/dist/rules/sort-interfaces.js +17 -20
  14. package/dist/rules/sort-intersection-types.js +22 -257
  15. package/dist/rules/sort-jsx-props.js +46 -55
  16. package/dist/rules/sort-maps/does-custom-group-match.js +24 -0
  17. package/dist/rules/sort-maps/types.js +7 -0
  18. package/dist/rules/sort-maps.js +113 -85
  19. package/dist/rules/sort-modules.js +31 -119
  20. package/dist/rules/sort-named-exports.js +38 -68
  21. package/dist/rules/sort-named-imports.js +21 -63
  22. package/dist/rules/sort-object-types.js +35 -120
  23. package/dist/rules/sort-objects/does-custom-group-match.js +49 -0
  24. package/dist/rules/sort-objects/types.js +15 -0
  25. package/dist/rules/sort-objects.js +119 -148
  26. package/dist/rules/sort-sets.js +8 -4
  27. package/dist/rules/sort-switch-case.js +35 -41
  28. package/dist/rules/sort-union-types.js +181 -241
  29. package/dist/rules/sort-variable-declarations.js +29 -78
  30. package/dist/utils/common-json-schemas.js +15 -5
  31. package/dist/utils/get-comments-before.js +1 -1
  32. package/dist/utils/get-custom-groups-compare-options.js +1 -4
  33. package/dist/utils/get-lines-between.js +1 -1
  34. package/dist/utils/get-newlines-between-option.js +20 -4
  35. package/dist/utils/get-newlines-errors.js +9 -0
  36. package/dist/utils/get-settings.js +1 -1
  37. package/dist/utils/get-source-code.js +1 -1
  38. package/dist/utils/is-newlines-between-option.js +5 -0
  39. package/dist/utils/make-comment-after-fixes.js +20 -20
  40. package/dist/utils/make-fixes.js +36 -65
  41. package/dist/utils/make-newlines-fixes.js +9 -0
  42. package/dist/utils/make-order-fixes.js +69 -0
  43. package/dist/utils/make-single-node-comment-after-fixes.js +31 -0
  44. package/dist/utils/report-all-errors.js +96 -0
  45. package/dist/utils/report-errors.js +62 -0
  46. package/dist/utils/should-partition.js +32 -0
  47. package/dist/utils/sort-nodes-by-dependencies.js +1 -3
  48. package/dist/utils/validate-custom-sort-configuration.js +1 -1
  49. package/dist/utils/validate-generated-groups-configuration.js +7 -8
  50. package/dist/utils/validate-groups-configuration.js +4 -3
  51. package/dist/utils/validate-newlines-and-partition-configuration.js +3 -2
  52. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ let plugin = {
29
29
  'sort-named-imports': sortNamedImports,
30
30
  'sort-named-exports': sortNamedExports,
31
31
  'sort-object-types': sortObjectTypes.default,
32
- 'sort-union-types': sortUnionTypes,
32
+ 'sort-union-types': sortUnionTypes.default,
33
33
  'sort-switch-case': sortSwitchCase,
34
34
  'sort-decorators': sortDecorators,
35
35
  'sort-interfaces': sortInterfaces,
@@ -4,7 +4,10 @@ Object.defineProperties(exports, {
4
4
  [Symbol.toStringTag]: { value: 'Module' },
5
5
  })
6
6
  const commonJsonSchemas = require('../utils/common-json-schemas.js')
7
+ const reportErrors = require('../utils/report-errors.js')
8
+ const validateNewlinesAndPartitionConfiguration = require('../utils/validate-newlines-and-partition-configuration.js')
7
9
  const validateGeneratedGroupsConfiguration = require('../utils/validate-generated-groups-configuration.js')
10
+ const validateCustomSortConfiguration = require('../utils/validate-custom-sort-configuration.js')
8
11
  const types = require('./sort-array-includes/types.js')
9
12
  const getCustomGroupsCompareOptions = require('../utils/get-custom-groups-compare-options.js')
10
13
  const doesCustomGroupMatch = require('./sort-array-includes/does-custom-group-match.js')
@@ -12,28 +15,23 @@ const getMatchingContextOptions = require('../utils/get-matching-context-options
12
15
  const generatePredefinedGroups = require('../utils/generate-predefined-groups.js')
13
16
  const getEslintDisabledLines = require('../utils/get-eslint-disabled-lines.js')
14
17
  const isNodeEslintDisabled = require('../utils/is-node-eslint-disabled.js')
15
- const hasPartitionComment = require('../utils/has-partition-comment.js')
16
- const createNodeIndexMap = require('../utils/create-node-index-map.js')
17
18
  const sortNodesByGroups = require('../utils/sort-nodes-by-groups.js')
18
- const getCommentsBefore = require('../utils/get-comments-before.js')
19
19
  const createEslintRule = require('../utils/create-eslint-rule.js')
20
- const getLinesBetween = require('../utils/get-lines-between.js')
21
- const getGroupNumber = require('../utils/get-group-number.js')
20
+ const reportAllErrors = require('../utils/report-all-errors.js')
21
+ const shouldPartition = require('../utils/should-partition.js')
22
22
  const getSourceCode = require('../utils/get-source-code.js')
23
- const toSingleLine = require('../utils/to-single-line.js')
24
23
  const rangeToDiff = require('../utils/range-to-diff.js')
25
24
  const getSettings = require('../utils/get-settings.js')
26
25
  const isSortable = require('../utils/is-sortable.js')
27
- const makeFixes = require('../utils/make-fixes.js')
28
26
  const useGroups = require('../utils/use-groups.js')
29
27
  const complete = require('../utils/complete.js')
30
- const pairwise = require('../utils/pairwise.js')
31
28
  let cachedGroupsByModifiersAndSelectors = /* @__PURE__ */ new Map()
32
29
  let defaultOptions = {
33
30
  groupKind: 'literals-first',
34
31
  specialCharacters: 'keep',
35
32
  partitionByComment: false,
36
33
  partitionByNewLine: false,
34
+ newlinesBetween: 'ignore',
37
35
  useConfigurationIf: {},
38
36
  type: 'alphabetical',
39
37
  ignoreCase: true,
@@ -46,11 +44,7 @@ let defaultOptions = {
46
44
  let jsonSchema = {
47
45
  items: {
48
46
  properties: {
49
- partitionByComment: {
50
- ...commonJsonSchemas.partitionByCommentJsonSchema,
51
- description:
52
- 'Allows you to use comments to separate the array members into logical groups.',
53
- },
47
+ ...commonJsonSchemas.commonJsonSchemas,
54
48
  groupKind: {
55
49
  enum: ['mixed', 'literals-first', 'spreads-first'],
56
50
  description: 'Specifies top-level groups.',
@@ -61,13 +55,10 @@ let jsonSchema = {
61
55
  }),
62
56
  useConfigurationIf: commonJsonSchemas.buildUseConfigurationIfJsonSchema(),
63
57
  type: commonJsonSchemas.buildTypeJsonSchema({ withUnsorted: true }),
58
+ partitionByComment: commonJsonSchemas.partitionByCommentJsonSchema,
64
59
  partitionByNewLine: commonJsonSchemas.partitionByNewLineJsonSchema,
65
- specialCharacters: commonJsonSchemas.specialCharactersJsonSchema,
66
- ignoreCase: commonJsonSchemas.ignoreCaseJsonSchema,
67
- alphabet: commonJsonSchemas.alphabetJsonSchema,
68
- locales: commonJsonSchemas.localesJsonSchema,
60
+ newlinesBetween: commonJsonSchemas.newlinesBetweenJsonSchema,
69
61
  groups: commonJsonSchemas.groupsJsonSchema,
70
- order: commonJsonSchemas.orderJsonSchema,
71
62
  },
72
63
  additionalProperties: false,
73
64
  type: 'object',
@@ -90,6 +81,10 @@ const sortArrayIncludes = createEslintRule.createEslintRule({
90
81
  : node.object.arguments
91
82
  sortArray({
92
83
  availableMessageIds: {
84
+ missedSpacingBetweenMembers:
85
+ 'missedSpacingBetweenArrayIncludesMembers',
86
+ extraSpacingBetweenMembers:
87
+ 'extraSpacingBetweenArrayIncludesMembers',
93
88
  unexpectedGroupOrder: 'unexpectedArrayIncludesGroupOrder',
94
89
  unexpectedOrder: 'unexpectedArrayIncludesOrder',
95
90
  },
@@ -101,10 +96,11 @@ const sortArrayIncludes = createEslintRule.createEslintRule({
101
96
  }),
102
97
  meta: {
103
98
  messages: {
104
- unexpectedArrayIncludesGroupOrder:
105
- 'Expected "{{right}}" ({{rightGroup}}) to come before "{{left}}" ({{leftGroup}}).',
106
- unexpectedArrayIncludesOrder:
107
- 'Expected "{{right}}" to come before "{{left}}".',
99
+ missedSpacingBetweenArrayIncludesMembers:
100
+ reportErrors.MISSED_SPACING_ERROR,
101
+ extraSpacingBetweenArrayIncludesMembers: reportErrors.EXTRA_SPACING_ERROR,
102
+ unexpectedArrayIncludesGroupOrder: reportErrors.GROUP_ORDER_ERROR,
103
+ unexpectedArrayIncludesOrder: reportErrors.ORDER_ERROR,
108
104
  },
109
105
  docs: {
110
106
  description: 'Enforce sorted arrays before include method.',
@@ -144,12 +140,15 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
144
140
  ...completeOptions,
145
141
  type,
146
142
  }
143
+ validateCustomSortConfiguration.validateCustomSortConfiguration(options)
147
144
  validateGeneratedGroupsConfiguration.validateGeneratedGroupsConfiguration({
148
- customGroups: options.customGroups,
149
145
  selectors: types.allSelectors,
150
- groups: options.groups,
151
146
  modifiers: [],
147
+ options,
152
148
  })
149
+ validateNewlinesAndPartitionConfiguration.validateNewlinesAndPartitionConfiguration(
150
+ options,
151
+ )
153
152
  let eslintDisabledLines = getEslintDisabledLines.getEslintDisabledLines({
154
153
  ruleName: context.id,
155
154
  sourceCode,
@@ -207,20 +206,12 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
207
206
  let lastSortingNode =
208
207
  (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1)
209
208
  if (
210
- hasPartitionComment.hasPartitionComment({
211
- comments: getCommentsBefore.getCommentsBefore({
212
- node: element,
213
- sourceCode,
214
- }),
215
- partitionByComment: options.partitionByComment,
216
- }) ||
217
- (options.partitionByNewLine &&
218
- lastSortingNode &&
219
- getLinesBetween.getLinesBetween(
220
- sourceCode,
221
- lastSortingNode,
222
- sortingNode,
223
- ))
209
+ shouldPartition.shouldPartition({
210
+ lastSortingNode,
211
+ sortingNode,
212
+ sourceCode,
213
+ options,
214
+ })
224
215
  ) {
225
216
  accumulator.push([])
226
217
  }
@@ -244,7 +235,7 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
244
235
  groupKind === 'any' || currentNode.groupKind === groupKind,
245
236
  ),
246
237
  )
247
- let sortNodesIgnoringEslintDisabledNodes = ignoreEslintDisabledNodes =>
238
+ let sortNodesExcludingEslintDisabled = ignoreEslintDisabledNodes =>
248
239
  filteredGroupKindNodes.flatMap(groupedNodes =>
249
240
  sortNodesByGroups.sortNodesByGroups(groupedNodes, options, {
250
241
  getGroupCompareOptions: groupNumber =>
@@ -255,44 +246,13 @@ let sortArray = ({ availableMessageIds, elements, context }) => {
255
246
  ignoreEslintDisabledNodes,
256
247
  }),
257
248
  )
258
- let sortedNodes = sortNodesIgnoringEslintDisabledNodes(false)
259
- let sortedNodesExcludingEslintDisabled =
260
- sortNodesIgnoringEslintDisabledNodes(true)
261
- let nodeIndexMap = createNodeIndexMap.createNodeIndexMap(sortedNodes)
262
- pairwise.pairwise(nodes, (left, right) => {
263
- let leftIndex = nodeIndexMap.get(left)
264
- let rightIndex = nodeIndexMap.get(right)
265
- let leftNumber = getGroupNumber.getGroupNumber(options.groups, left)
266
- let rightNumber = getGroupNumber.getGroupNumber(options.groups, right)
267
- let indexOfRightExcludingEslintDisabled =
268
- sortedNodesExcludingEslintDisabled.indexOf(right)
269
- if (
270
- leftIndex < rightIndex &&
271
- leftIndex < indexOfRightExcludingEslintDisabled
272
- ) {
273
- return
274
- }
275
- context.report({
276
- fix: fixer =>
277
- makeFixes.makeFixes({
278
- sortedNodes: sortedNodesExcludingEslintDisabled,
279
- sourceCode,
280
- options,
281
- fixer,
282
- nodes,
283
- }),
284
- data: {
285
- right: toSingleLine.toSingleLine(right.name),
286
- left: toSingleLine.toSingleLine(left.name),
287
- rightGroup: right.group,
288
- leftGroup: left.group,
289
- },
290
- messageId:
291
- leftNumber === rightNumber
292
- ? availableMessageIds.unexpectedOrder
293
- : availableMessageIds.unexpectedGroupOrder,
294
- node: right.node,
295
- })
249
+ reportAllErrors.reportAllErrors({
250
+ sortNodesExcludingEslintDisabled,
251
+ availableMessageIds,
252
+ sourceCode,
253
+ options,
254
+ context,
255
+ nodes,
296
256
  })
297
257
  }
298
258
  }
@@ -26,10 +26,6 @@ let allModifiers = [
26
26
  'optional',
27
27
  ]
28
28
  let singleCustomGroupJsonSchema = {
29
- elementValuePattern: {
30
- description: 'Element value pattern filter for properties.',
31
- type: 'string',
32
- },
33
29
  decoratorNamePattern: {
34
30
  description: 'Decorator name pattern filter.',
35
31
  type: 'string',
@@ -37,6 +33,7 @@ let singleCustomGroupJsonSchema = {
37
33
  modifiers:
38
34
  commonJsonSchemas.buildCustomGroupModifiersJsonSchema(allModifiers),
39
35
  selector: commonJsonSchemas.buildCustomGroupSelectorJsonSchema(allSelectors),
36
+ elementValuePattern: commonJsonSchemas.elementValuePatternJsonSchema,
40
37
  elementNamePattern: commonJsonSchemas.elementNamePatternJsonSchema,
41
38
  }
42
39
  exports.allModifiers = allModifiers