eslint-plugin-perfectionist 5.9.1 → 5.10.1

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 (127) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/package.json.js +1 -1
  3. package/dist/rules/sort-array-includes.js +3 -6
  4. package/dist/rules/sort-arrays/compute-node-name.js +1 -1
  5. package/dist/rules/sort-arrays/sort-array.js +14 -12
  6. package/dist/rules/sort-arrays.js +3 -2
  7. package/dist/rules/sort-classes/compute-dependencies-by-sorting-node.js +16 -16
  8. package/dist/rules/sort-classes/compute-dependencies.js +0 -3
  9. package/dist/rules/sort-classes/compute-identifier-name-details.js +1 -1
  10. package/dist/rules/sort-classes/compute-matched-context-options.d.ts +3 -5
  11. package/dist/rules/sort-classes/compute-overload-signature-groups.js +4 -3
  12. package/dist/rules/sort-classes/node-info/common-modifiers.d.ts +1 -2
  13. package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +13 -0
  14. package/dist/rules/sort-classes/node-info/compute-accessor-details.js +41 -1
  15. package/dist/rules/sort-classes/node-info/compute-property-details.js +1 -10
  16. package/dist/rules/sort-classes/node-info/is-function-expression.d.ts +11 -0
  17. package/dist/rules/sort-classes/node-info/is-function-expression.js +18 -0
  18. package/dist/rules/sort-classes/sort-class.js +60 -51
  19. package/dist/rules/sort-classes/types.d.ts +1 -3
  20. package/dist/rules/sort-classes.js +2 -2
  21. package/dist/rules/sort-decorators.js +6 -6
  22. package/dist/rules/sort-enums/compute-dependencies-by-sorting-node.js +14 -3
  23. package/dist/rules/sort-enums/compute-dependencies.js +13 -7
  24. package/dist/rules/sort-enums/compute-matched-context-options.d.ts +3 -5
  25. package/dist/rules/sort-enums/sort-enum.js +31 -36
  26. package/dist/rules/sort-enums.js +6 -6
  27. package/dist/rules/sort-exports.js +12 -11
  28. package/dist/rules/sort-heritage-clauses/compute-matched-context-options.d.ts +3 -5
  29. package/dist/rules/sort-heritage-clauses/compute-node-name.d.ts +2 -2
  30. package/dist/rules/sort-heritage-clauses/compute-node-name.js +7 -6
  31. package/dist/rules/sort-heritage-clauses/sort-heritage-clause.js +12 -15
  32. package/dist/rules/sort-heritage-clauses.js +2 -2
  33. package/dist/rules/sort-import-attributes/sort-import-or-export-attributes.js +12 -15
  34. package/dist/rules/sort-import-attributes.js +2 -2
  35. package/dist/rules/sort-imports/compute-common-selectors.js +7 -3
  36. package/dist/rules/sort-imports/compute-dependencies.js +7 -5
  37. package/dist/rules/sort-imports/get-typescript-import.d.ts +14 -1
  38. package/dist/rules/sort-imports/get-typescript-import.js +19 -2
  39. package/dist/rules/sort-imports/read-closest-ts-config-by-path.js +6 -11
  40. package/dist/rules/sort-imports/{validate-side-effects-configuration.d.ts → validate-side-effects-config.d.ts} +1 -1
  41. package/dist/rules/sort-imports/{validate-side-effects-configuration.js → validate-side-effects-config.js} +2 -2
  42. package/dist/rules/sort-imports.js +41 -38
  43. package/dist/rules/sort-intersection-types/types.d.ts +9 -1
  44. package/dist/rules/sort-intersection-types.d.ts +2 -1
  45. package/dist/rules/sort-intersection-types.js +4 -3
  46. package/dist/rules/sort-jsx-props/sort-jsx-object.js +19 -21
  47. package/dist/rules/sort-jsx-props.js +2 -2
  48. package/dist/rules/sort-maps/compute-matched-context-options.d.ts +3 -5
  49. package/dist/rules/sort-maps/sort-potential-map.js +10 -13
  50. package/dist/rules/sort-maps.js +2 -2
  51. package/dist/rules/sort-modules/compute-node-details.d.ts +1 -5
  52. package/dist/rules/sort-modules/compute-node-details.js +40 -58
  53. package/dist/rules/sort-modules/compute-overload-signature-groups.js +27 -17
  54. package/dist/rules/sort-modules.js +48 -39
  55. package/dist/rules/sort-named-exports/compute-matched-context-options.d.ts +3 -5
  56. package/dist/rules/sort-named-exports/sort-named-export.js +18 -20
  57. package/dist/rules/sort-named-exports.js +2 -2
  58. package/dist/rules/sort-named-imports/compute-matched-context-options.d.ts +3 -5
  59. package/dist/rules/sort-named-imports/sort-named-import.js +18 -20
  60. package/dist/rules/sort-named-imports.js +2 -2
  61. package/dist/rules/sort-object-types/compute-node-name.js +1 -1
  62. package/dist/rules/sort-object-types/is-node-function-type.js +12 -8
  63. package/dist/rules/sort-object-types/sort-object-type-elements.js +24 -25
  64. package/dist/rules/sort-object-types.js +2 -2
  65. package/dist/rules/sort-objects/compute-dependency-names.js +12 -6
  66. package/dist/rules/sort-objects/compute-property-or-variable-declarator-name.js +1 -1
  67. package/dist/rules/sort-objects/passes-calling-function-name-pattern-filter.js +1 -1
  68. package/dist/rules/sort-objects/sort-object.js +38 -39
  69. package/dist/rules/sort-objects.js +2 -2
  70. package/dist/rules/sort-sets.js +1 -4
  71. package/dist/rules/sort-switch-case/is-condition-expression.d.ts +15 -0
  72. package/dist/rules/sort-switch-case/is-condition-expression.js +26 -0
  73. package/dist/rules/sort-switch-case.js +11 -6
  74. package/dist/rules/sort-union-or-intersection-types/build-json-schema.d.ts +6 -0
  75. package/dist/rules/sort-union-or-intersection-types/build-json-schema.js +39 -0
  76. package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/compute-matched-context-options.d.ts +1 -1
  77. package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/sort-union-or-intersection-types.d.ts +1 -1
  78. package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/sort-union-or-intersection-types.js +37 -33
  79. package/dist/rules/sort-union-or-intersection-types/type-contains-callable-type.d.ts +10 -0
  80. package/dist/rules/sort-union-or-intersection-types/type-contains-callable-type.js +38 -0
  81. package/dist/rules/sort-union-types/types.d.ts +3 -0
  82. package/dist/rules/sort-union-types.d.ts +0 -2
  83. package/dist/rules/sort-union-types.js +8 -37
  84. package/dist/rules/sort-variable-declarations/compute-dependencies.js +12 -2
  85. package/dist/rules/sort-variable-declarations/compute-matched-context-options.d.ts +3 -5
  86. package/dist/rules/sort-variable-declarations/sort-variable-declaration.js +30 -32
  87. package/dist/rules/sort-variable-declarations.js +2 -2
  88. package/dist/types/sorting-node.d.ts +10 -0
  89. package/dist/utils/alphabet.js +14 -14
  90. package/dist/utils/compare/build-line-length-comparator.js +2 -1
  91. package/dist/utils/compare/build-subgroup-order-comparator.js +3 -4
  92. package/dist/utils/compare/compare-alphabetically.js +2 -4
  93. package/dist/utils/compare/compare-by-custom-sort.js +2 -2
  94. package/dist/utils/compare/compare-naturally.js +2 -4
  95. package/dist/utils/compute-dependencies-by-sorting-node.js +2 -1
  96. package/dist/utils/compute-dependencies-outside-functions-by-sorting-node.js +11 -10
  97. package/dist/utils/does-custom-group-match.d.ts +3 -4
  98. package/dist/utils/does-custom-group-match.js +6 -4
  99. package/dist/utils/generate-predefined-groups.js +7 -2
  100. package/dist/utils/get-comments-before.js +2 -2
  101. package/dist/utils/get-eslint-disabled-lines.js +4 -6
  102. package/dist/utils/get-node-range.d.ts +11 -0
  103. package/dist/utils/get-node-range.js +47 -23
  104. package/dist/utils/get-settings.js +1 -1
  105. package/dist/utils/is-node-immediately-called.d.ts +14 -0
  106. package/dist/utils/is-node-immediately-called.js +20 -0
  107. package/dist/utils/is-partition-comment.js +3 -3
  108. package/dist/utils/json-schemas/common-groups-json-schemas.js +3 -0
  109. package/dist/utils/json-schemas/common-json-schemas.d.ts +1 -1
  110. package/dist/utils/json-schemas/common-json-schemas.js +2 -2
  111. package/dist/utils/make-order-fixes.js +3 -1
  112. package/dist/utils/make-single-node-comment-after-fixes.js +52 -9
  113. package/dist/utils/should-partition.js +1 -1
  114. package/dist/utils/sort-nodes-by-groups.js +4 -3
  115. package/dist/utils/sort-nodes.js +1 -1
  116. package/dist/utils/unreachable-case-error.d.ts +2 -1
  117. package/dist/utils/unreachable-case-error.js +3 -2
  118. package/dist/utils/{validate-custom-sort-configuration.d.ts → validate-custom-sort-config.d.ts} +1 -1
  119. package/dist/utils/{validate-custom-sort-configuration.js → validate-custom-sort-config.js} +2 -2
  120. package/dist/utils/{validate-groups-configuration.d.ts → validate-groups-config.d.ts} +3 -3
  121. package/dist/utils/{validate-groups-configuration.js → validate-groups-config.js} +2 -2
  122. package/dist/utils/{validate-newlines-and-partition-configuration.d.ts → validate-newlines-and-partition-config.d.ts} +7 -7
  123. package/dist/utils/{validate-newlines-and-partition-configuration.js → validate-newlines-and-partition-config.js} +12 -12
  124. package/package.json +2 -2
  125. /package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/compute-matched-context-options.js +0 -0
  126. /package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/compute-node-name.d.ts +0 -0
  127. /package/dist/rules/{sort-union-types → sort-union-or-intersection-types}/compute-node-name.js +0 -0
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { name, version } from './package.json.js'
2
2
  import sort_variable_declarations_default from './rules/sort-variable-declarations.js'
3
- import sort_union_types_default from './rules/sort-union-types.js'
4
3
  import sort_intersection_types_default from './rules/sort-intersection-types.js'
5
4
  import sort_import_attributes_default from './rules/sort-import-attributes.js'
6
5
  import sort_export_attributes_default from './rules/sort-export-attributes.js'
@@ -10,6 +9,7 @@ import sort_named_imports_default from './rules/sort-named-imports.js'
10
9
  import sort_named_exports_default from './rules/sort-named-exports.js'
11
10
  import sort_object_types_default from './rules/sort-object-types.js'
12
11
  import sort_switch_case_default from './rules/sort-switch-case.js'
12
+ import sort_union_types_default from './rules/sort-union-types.js'
13
13
  import sort_interfaces_default from './rules/sort-interfaces.js'
14
14
  import sort_decorators_default from './rules/sort-decorators.js'
15
15
  import sort_jsx_props_default from './rules/sort-jsx-props.js'
@@ -1,3 +1,3 @@
1
1
  var name = 'eslint-plugin-perfectionist'
2
- var version = '5.9.1'
2
+ var version = '5.10.1'
3
3
  export { name, version }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildCommonJsonSchemas,
3
- buildUseConfigurationIfJsonSchema,
3
+ buildUseConfigIfJsonSchema,
4
4
  matchesAstSelectorJsonSchema,
5
5
  } from '../utils/json-schemas/common-json-schemas.js'
6
6
  import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
@@ -51,7 +51,7 @@ var jsonSchema = {
51
51
  additionalCustomGroupMatchProperties:
52
52
  additionalCustomGroupMatchOptionsJsonSchema,
53
53
  }),
54
- useConfigurationIf: buildUseConfigurationIfJsonSchema({
54
+ useConfigurationIf: buildUseConfigIfJsonSchema({
55
55
  additionalProperties: {
56
56
  matchesAstSelector: matchesAstSelectorJsonSchema,
57
57
  },
@@ -122,10 +122,7 @@ function sortPotentiallyValidArray({ matchedAstSelectors, context, node }) {
122
122
  if (node.parent.parent.type !== AST_NODE_TYPES.CallExpression) {
123
123
  return false
124
124
  }
125
- if (node.parent.parent.callee !== node.parent) {
126
- return false
127
- }
128
- return true
125
+ return node.parent.parent.callee === node.parent
129
126
  }
130
127
  }
131
128
  export { sort_array_includes_default as default, defaultOptions, jsonSchema }
@@ -9,7 +9,7 @@ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
9
9
  */
10
10
  function computeNodeName({ sourceCode, node }) {
11
11
  return node.type === AST_NODE_TYPES.Literal ?
12
- `${node.value}`
12
+ String(node.value)
13
13
  : sourceCode.getText(node)
14
14
  }
15
15
  export { computeNodeName }
@@ -1,12 +1,12 @@
1
- import { validateNewlinesAndPartitionConfiguration } from '../../utils/validate-newlines-and-partition-configuration.js'
2
1
  import { defaultComparatorByOptionsComputer } from '../../utils/compare/default-comparator-by-options-computer.js'
2
+ import { validateNewlinesAndPartitionConfig } from '../../utils/validate-newlines-and-partition-config.js'
3
3
  import { buildOptionsByGroupIndexComputer } from '../../utils/build-options-by-group-index-computer.js'
4
- import { validateCustomSortConfiguration } from '../../utils/validate-custom-sort-configuration.js'
5
- import { validateGroupsConfiguration } from '../../utils/validate-groups-configuration.js'
4
+ import { validateCustomSortConfig } from '../../utils/validate-custom-sort-config.js'
6
5
  import { generatePredefinedGroups } from '../../utils/generate-predefined-groups.js'
7
6
  import { getEslintDisabledLines } from '../../utils/get-eslint-disabled-lines.js'
8
7
  import { doesCustomGroupMatch } from '../../utils/does-custom-group-match.js'
9
8
  import { isNodeEslintDisabled } from '../../utils/is-node-eslint-disabled.js'
9
+ import { validateGroupsConfig } from '../../utils/validate-groups-config.js'
10
10
  import { sortNodesByGroups } from '../../utils/sort-nodes-by-groups.js'
11
11
  import { reportAllErrors } from '../../utils/report-all-errors.js'
12
12
  import { shouldPartition } from '../../utils/should-partition.js'
@@ -47,13 +47,13 @@ function sortArray({
47
47
  return
48
48
  }
49
49
  let options = complete(matchedContextOptions, settings, defaultOptions)
50
- validateCustomSortConfiguration(options)
51
- validateGroupsConfiguration({
50
+ validateCustomSortConfig(options)
51
+ validateGroupsConfig({
52
52
  selectors: allSelectors,
53
53
  modifiers: [],
54
54
  options,
55
55
  })
56
- validateNewlinesAndPartitionConfiguration(options)
56
+ validateNewlinesAndPartitionConfig(options)
57
57
  let eslintDisabledLines = getEslintDisabledLines({
58
58
  ruleName: id,
59
59
  sourceCode,
@@ -73,6 +73,11 @@ function sortArray({
73
73
  sourceCode,
74
74
  })
75
75
  let selector = 'literal'
76
+ let predefinedGroups = generatePredefinedGroups({
77
+ cache: cachedGroupsByModifiersAndSelectors,
78
+ selectors: [selector],
79
+ modifiers: [],
80
+ })
76
81
  let group = computeGroup({
77
82
  customGroupMatcher: customGroup =>
78
83
  doesCustomGroupMatch({
@@ -81,11 +86,7 @@ function sortArray({
81
86
  modifiers: [],
82
87
  customGroup,
83
88
  }),
84
- predefinedGroups: generatePredefinedGroups({
85
- cache: cachedGroupsByModifiersAndSelectors,
86
- selectors: [selector],
87
- modifiers: [],
88
- }),
89
+ predefinedGroups,
89
90
  options,
90
91
  })
91
92
  let sortingNode = {
@@ -125,12 +126,13 @@ function sortArray({
125
126
  }),
126
127
  )
127
128
  }
129
+ let nodes = formattedMembers.flat()
128
130
  reportAllErrors({
129
131
  sortNodesExcludingEslintDisabled,
130
132
  availableMessageIds,
131
133
  options,
132
134
  context,
133
- nodes: formattedMembers.flat(),
135
+ nodes,
134
136
  })
135
137
  }
136
138
  export { sortArray }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildCommonJsonSchemas,
3
- buildUseConfigurationIfJsonSchema,
3
+ buildUseConfigIfJsonSchema,
4
4
  matchesAstSelectorJsonSchema,
5
5
  } from '../utils/json-schemas/common-json-schemas.js'
6
6
  import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
@@ -51,7 +51,7 @@ var jsonSchema = {
51
51
  additionalCustomGroupMatchProperties:
52
52
  additionalCustomGroupMatchOptionsJsonSchema,
53
53
  }),
54
- useConfigurationIf: buildUseConfigurationIfJsonSchema({
54
+ useConfigurationIf: buildUseConfigIfJsonSchema({
55
55
  additionalProperties: {
56
56
  matchesAstSelector: matchesAstSelectorJsonSchema,
57
57
  },
@@ -65,6 +65,7 @@ var jsonSchema = {
65
65
  },
66
66
  uniqueItems: true,
67
67
  type: 'array',
68
+ minItems: 1,
68
69
  }
69
70
  var sort_arrays_default = createEslintRule({
70
71
  meta: {
@@ -10,11 +10,12 @@ function computeDependenciesBySortingNode({
10
10
  sourceCode,
11
11
  classBody,
12
12
  }) {
13
+ let staticSortingNodes = sortingNodes.filter(node => node.isStatic)
13
14
  let dependenciesBySortingNode = computeDependenciesBySortingNode$1({
14
15
  additionalIdentifierDependenciesComputer:
15
16
  buildAdditionalIdentifierDependenciesComputer({
16
17
  ignoreCallbackDependenciesPatterns,
17
- staticSortingNodes: sortingNodes.filter(node => node.isStatic),
18
+ staticSortingNodes,
18
19
  classBody,
19
20
  }),
20
21
  shouldIgnoreSortingNodeComputer: sortingNode =>
@@ -73,22 +74,21 @@ function computeIdentifierOrThisExpressionDependency({
73
74
  }
74
75
  }
75
76
  function shouldIgnoreCallbackDependency() {
76
- let [firstCallExpressionParent] = computeParentNodesWithTypes({
77
+ return computeParentNodesWithTypes({
77
78
  allowedTypes: [AST_NODE_TYPES.CallExpression],
78
79
  maxParent: classElement,
79
80
  consecutiveOnly: false,
80
81
  node,
81
- })
82
- if (!firstCallExpressionParent) {
83
- return false
84
- }
85
- if (!('name' in firstCallExpressionParent.callee)) {
86
- return false
82
+ }).some(shouldIgnoreCallExpression)
83
+ function shouldIgnoreCallExpression(callExpressionParent) {
84
+ return (
85
+ 'name' in callExpressionParent.callee &&
86
+ matches(
87
+ callExpressionParent.callee.name,
88
+ ignoreCallbackDependenciesPatterns,
89
+ )
90
+ )
87
91
  }
88
- return matches(
89
- firstCallExpressionParent.callee.name,
90
- ignoreCallbackDependenciesPatterns,
91
- )
92
92
  }
93
93
  }
94
94
  function computeThisExpressionDependenciesBySortingNode({
@@ -153,15 +153,15 @@ function shouldIgnoreDependencyComputation(node) {
153
153
  case AST_NODE_TYPES.StaticBlock:
154
154
  return false
155
155
  case AST_NODE_TYPES.TSAbstractAccessorProperty:
156
- case AST_NODE_TYPES.AccessorProperty:
157
- case AST_NODE_TYPES.MethodDefinition:
158
- case AST_NODE_TYPES.TSIndexSignature:
159
- return true
160
156
  case AST_NODE_TYPES.PropertyDefinition:
157
+ case AST_NODE_TYPES.AccessorProperty:
161
158
  return (
162
159
  node.value?.type === AST_NODE_TYPES.ArrowFunctionExpression ||
163
160
  node.value?.type === AST_NODE_TYPES.FunctionExpression
164
161
  )
162
+ case AST_NODE_TYPES.MethodDefinition:
163
+ case AST_NODE_TYPES.TSIndexSignature:
164
+ return true
165
165
  /* v8 ignore next 2 -- @preserve Exhaustive guard. */
166
166
  default:
167
167
  throw new UnreachableCaseError(node)
@@ -63,9 +63,6 @@ function computeDependencies({
63
63
  case AST_NODE_TYPES.Property:
64
64
  traverseNode(nodeValue.key)
65
65
  traverseNode(nodeValue.value)
66
- break
67
- default:
68
- break
69
66
  }
70
67
  if ('argument' in nodeValue && nodeValue.argument) {
71
68
  traverseNode(nodeValue.argument)
@@ -18,7 +18,7 @@ function computeIdentifierNameDetails(node) {
18
18
  case AST_NODE_TYPES.Identifier:
19
19
  return buildNonPrivateHashDetails(node.name)
20
20
  case AST_NODE_TYPES.Literal:
21
- return buildNonPrivateHashDetails(`${node.value}`)
21
+ return buildNonPrivateHashDetails(String(node.value))
22
22
  /* v8 ignore next 2 -- @preserve Exhaustive guard. */
23
23
  default:
24
24
  throw new UnreachableCaseError(node)
@@ -1,6 +1,6 @@
1
1
  import { RuleContext } from '@typescript-eslint/utils/ts-eslint'
2
2
  import { TSESTree } from '@typescript-eslint/types'
3
- import { Options } from './types.js'
3
+ import { MessageId, Options } from './types.js'
4
4
  /**
5
5
  * Computes the matched context options for a given class node.
6
6
  *
@@ -10,14 +10,12 @@ import { Options } from './types.js'
10
10
  * @param params.context - The rule context.
11
11
  * @returns The matched context options or undefined if none match.
12
12
  */
13
- export declare function computeMatchedContextOptions<
14
- MessageIds extends string,
15
- >({
13
+ export declare function computeMatchedContextOptions({
16
14
  matchedAstSelectors,
17
15
  classElements,
18
16
  context,
19
17
  }: {
20
- context: Readonly<RuleContext<MessageIds, Options>>
18
+ context: Readonly<RuleContext<MessageId, Options>>
21
19
  matchedAstSelectors: ReadonlySet<string>
22
20
  classElements: TSESTree.ClassElement[]
23
21
  }): Options[number] | undefined
@@ -41,10 +41,11 @@ function computeOverloadSignatureGroups(classElements) {
41
41
  }
42
42
  function buildOverloadSignatureGroup(methods) {
43
43
  let implementation = methods.find(isMethodImplementation) ?? methods.at(-1)
44
+ let overloadSignatures = methods.filter(
45
+ method => !isMethodImplementation(method),
46
+ )
44
47
  return new OverloadSignatureGroup({
45
- overloadSignatures: methods.filter(
46
- method => !isMethodImplementation(method),
47
- ),
48
+ overloadSignatures,
48
49
  implementation,
49
50
  })
50
51
  function isMethodImplementation(method) {
@@ -1,8 +1,7 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { Modifier } from '../types.js'
3
3
  type Property =
4
- | TSESTree.TSAbstractPropertyDefinition
5
- | TSESTree.PropertyDefinition
4
+ TSESTree.TSAbstractPropertyDefinition | TSESTree.PropertyDefinition
6
5
  type Accessor = TSESTree.TSAbstractAccessorProperty | TSESTree.AccessorProperty
7
6
  type Method = TSESTree.TSAbstractMethodDefinition | TSESTree.MethodDefinition
8
7
  export declare function computeAccessibilityModifier({
@@ -1,26 +1,39 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { TSESLint } from '@typescript-eslint/utils'
3
3
  import { NodeNameDetails, Modifier, Selector } from '../types.js'
4
+ import { RegexOption } from '../../../types/common-options.js'
4
5
  /**
5
6
  * Computes details related to an accessor property.
6
7
  *
7
8
  * @param params - Parameters object.
8
9
  * @param params.isDecorated - Whether the accessor is decorated.
10
+ * @param params.ignoreCallbackDependenciesPatterns - Patterns to ignore when
11
+ * computing dependencies.
12
+ * @param params.useExperimentalDependencyDetection - Whether to use
13
+ * experimental dependency detection.
9
14
  * @param params.sourceCode - The source code object.
15
+ * @param params.className - The name of the class containing the accessor.
10
16
  * @param params.accessor - The accessor node to compute information for.
11
17
  * @returns An object containing various details about the accessor.
12
18
  */
13
19
  export declare function computeAccessorDetails({
20
+ ignoreCallbackDependenciesPatterns,
21
+ useExperimentalDependencyDetection,
14
22
  isDecorated,
15
23
  sourceCode,
24
+ className,
16
25
  accessor,
17
26
  }: {
18
27
  accessor: TSESTree.TSAbstractAccessorProperty | TSESTree.AccessorProperty
28
+ ignoreCallbackDependenciesPatterns: RegexOption
29
+ useExperimentalDependencyDetection: boolean
19
30
  sourceCode: TSESLint.SourceCode
31
+ className: undefined | string
20
32
  isDecorated: boolean
21
33
  }): {
22
34
  nameDetails: NodeNameDetails
23
35
  dependencyNames: string[]
36
+ dependencies: string[]
24
37
  modifiers: Modifier[]
25
38
  selectors: Selector[]
26
39
  isStatic: boolean
@@ -6,17 +6,31 @@ import {
6
6
  computeStaticModifier,
7
7
  } from './common-modifiers.js'
8
8
  import { computeDependencyName } from '../compute-dependency-name.js'
9
+ import { computeDependencies } from '../compute-dependencies.js'
9
10
  import { computeMethodOrPropertyNameDetails } from './compute-method-or-property-name-details.js'
11
+ import { isFunctionExpression } from './is-function-expression.js'
10
12
  /**
11
13
  * Computes details related to an accessor property.
12
14
  *
13
15
  * @param params - Parameters object.
14
16
  * @param params.isDecorated - Whether the accessor is decorated.
17
+ * @param params.ignoreCallbackDependenciesPatterns - Patterns to ignore when
18
+ * computing dependencies.
19
+ * @param params.useExperimentalDependencyDetection - Whether to use
20
+ * experimental dependency detection.
15
21
  * @param params.sourceCode - The source code object.
22
+ * @param params.className - The name of the class containing the accessor.
16
23
  * @param params.accessor - The accessor node to compute information for.
17
24
  * @returns An object containing various details about the accessor.
18
25
  */
19
- function computeAccessorDetails({ isDecorated, sourceCode, accessor }) {
26
+ function computeAccessorDetails({
27
+ ignoreCallbackDependenciesPatterns,
28
+ useExperimentalDependencyDetection,
29
+ isDecorated,
30
+ sourceCode,
31
+ className,
32
+ accessor,
33
+ }) {
20
34
  let nameDetails = computeMethodOrPropertyNameDetails(accessor, sourceCode)
21
35
  let modifiers = computeModifiers({
22
36
  hasPrivateHash: nameDetails.hasPrivateHash,
@@ -31,12 +45,38 @@ function computeAccessorDetails({ isDecorated, sourceCode, accessor }) {
31
45
  isStatic: modifiers.includes('static'),
32
46
  }),
33
47
  ],
48
+ dependencies: computeAccessorDependencies({
49
+ ignoreCallbackDependenciesPatterns,
50
+ useExperimentalDependencyDetection,
51
+ className,
52
+ accessor,
53
+ }),
34
54
  selectors: ['accessor-property'],
35
55
  isStatic: accessor.static,
36
56
  nameDetails,
37
57
  modifiers,
38
58
  }
39
59
  }
60
+ function computeAccessorDependencies({
61
+ ignoreCallbackDependenciesPatterns,
62
+ useExperimentalDependencyDetection,
63
+ className,
64
+ accessor,
65
+ }) {
66
+ if (isFunctionExpression(accessor.value)) {
67
+ return []
68
+ }
69
+ if (!accessor.value) {
70
+ return []
71
+ }
72
+ return computeDependencies({
73
+ ignoreCallbackDependenciesPatterns,
74
+ useExperimentalDependencyDetection,
75
+ isMemberStatic: accessor.static,
76
+ expression: accessor.value,
77
+ className,
78
+ })
79
+ }
40
80
  function computeModifiers({ hasPrivateHash, isDecorated, accessor }) {
41
81
  return [
42
82
  ...computeStaticModifier(accessor),
@@ -11,7 +11,7 @@ import {
11
11
  import { computeDependencyName } from '../compute-dependency-name.js'
12
12
  import { computeDependencies } from '../compute-dependencies.js'
13
13
  import { computeMethodOrPropertyNameDetails } from './compute-method-or-property-name-details.js'
14
- import { AST_NODE_TYPES } from '@typescript-eslint/utils'
14
+ import { isFunctionExpression } from './is-function-expression.js'
15
15
  /**
16
16
  * Computes details related to a property.
17
17
  *
@@ -115,13 +115,4 @@ function computeSelectors(property) {
115
115
  return isFunctionExpression(property.value) ? ['function-property'] : []
116
116
  }
117
117
  }
118
- function isFunctionExpression(node) {
119
- if (!node) {
120
- return false
121
- }
122
- return (
123
- node.type === AST_NODE_TYPES.ArrowFunctionExpression ||
124
- node.type === AST_NODE_TYPES.FunctionExpression
125
- )
126
- }
127
118
  export { computePropertyDetails }
@@ -0,0 +1,11 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ /**
3
+ * Checks whether a node is a function expression or an arrow function
4
+ * expression.
5
+ *
6
+ * @param node - The AST node to check.
7
+ * @returns Whether the node is a function expression.
8
+ */
9
+ export declare function isFunctionExpression(
10
+ node: TSESTree.Node | null,
11
+ ): node is TSESTree.ArrowFunctionExpression | TSESTree.FunctionExpression
@@ -0,0 +1,18 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ /**
3
+ * Checks whether a node is a function expression or an arrow function
4
+ * expression.
5
+ *
6
+ * @param node - The AST node to check.
7
+ * @returns Whether the node is a function expression.
8
+ */
9
+ function isFunctionExpression(node) {
10
+ if (!node) {
11
+ return false
12
+ }
13
+ return (
14
+ node.type === AST_NODE_TYPES.ArrowFunctionExpression ||
15
+ node.type === AST_NODE_TYPES.FunctionExpression
16
+ )
17
+ }
18
+ export { isFunctionExpression }
@@ -1,16 +1,16 @@
1
1
  import { UnreachableCaseError } from '../../utils/unreachable-case-error.js'
2
2
  import { getGroupIndex } from '../../utils/get-group-index.js'
3
3
  import { populateSortingNodeGroupsWithDependencies } from '../../utils/populate-sorting-node-groups-with-dependencies.js'
4
- import { validateNewlinesAndPartitionConfiguration } from '../../utils/validate-newlines-and-partition-configuration.js'
5
4
  import { defaultComparatorByOptionsComputer } from '../../utils/compare/default-comparator-by-options-computer.js'
5
+ import { validateNewlinesAndPartitionConfig } from '../../utils/validate-newlines-and-partition-config.js'
6
6
  import { buildOptionsByGroupIndexComputer } from '../../utils/build-options-by-group-index-computer.js'
7
- import { validateCustomSortConfiguration } from '../../utils/validate-custom-sort-configuration.js'
8
- import { validateGroupsConfiguration } from '../../utils/validate-groups-configuration.js'
7
+ import { validateCustomSortConfig } from '../../utils/validate-custom-sort-config.js'
9
8
  import { generatePredefinedGroups } from '../../utils/generate-predefined-groups.js'
10
9
  import { sortNodesByDependencies } from '../../utils/sort-nodes-by-dependencies.js'
11
10
  import { getEslintDisabledLines } from '../../utils/get-eslint-disabled-lines.js'
12
11
  import { doesCustomGroupMatch } from '../../utils/does-custom-group-match.js'
13
12
  import { isNodeEslintDisabled } from '../../utils/is-node-eslint-disabled.js'
13
+ import { validateGroupsConfig } from '../../utils/validate-groups-config.js'
14
14
  import { sortNodesByGroups } from '../../utils/sort-nodes-by-groups.js'
15
15
  import { reportAllErrors } from '../../utils/report-all-errors.js'
16
16
  import { shouldPartition } from '../../utils/should-partition.js'
@@ -94,22 +94,19 @@ function sortClass({ matchedAstSelectors, context, node }) {
94
94
  return
95
95
  }
96
96
  let settings = getSettings(context.settings)
97
- let options = complete(
98
- computeMatchedContextOptions({
99
- matchedAstSelectors,
100
- classElements,
101
- context,
102
- }),
103
- settings,
104
- defaultOptions,
105
- )
106
- validateCustomSortConfiguration(options)
107
- validateGroupsConfiguration({
97
+ let matchedContextOptions = computeMatchedContextOptions({
98
+ matchedAstSelectors,
99
+ classElements,
100
+ context,
101
+ })
102
+ let options = complete(matchedContextOptions, settings, defaultOptions)
103
+ validateCustomSortConfig(options)
104
+ validateGroupsConfig({
108
105
  modifiers: allModifiers,
109
106
  selectors: allSelectors,
110
107
  options,
111
108
  })
112
- validateNewlinesAndPartitionConfiguration(options)
109
+ validateNewlinesAndPartitionConfig(options)
113
110
  let { sourceCode, id } = context
114
111
  let eslintDisabledLines = getEslintDisabledLines({
115
112
  ruleName: id,
@@ -125,15 +122,15 @@ function sortClass({ matchedAstSelectors, context, node }) {
125
122
  (accumulator, member) => {
126
123
  let dependencies = []
127
124
  let isDecorated = false
128
- let decorators = []
125
+ let decoratorNames = []
129
126
  if ('decorators' in member) {
130
- decorators = getNodeDecorators(member).map(decorator =>
127
+ decoratorNames = getNodeDecorators(member).map(decorator =>
131
128
  getDecoratorName({
132
129
  sourceCode,
133
130
  decorator,
134
131
  }),
135
132
  )
136
- isDecorated = decorators.length > 0
133
+ isDecorated = decoratorNames.length > 0
137
134
  }
138
135
  let addSafetySemicolonWhenInline
139
136
  let dependencyNames
@@ -187,12 +184,23 @@ function sortClass({ matchedAstSelectors, context, node }) {
187
184
  case AST_NODE_TYPES.TSAbstractAccessorProperty:
188
185
  case AST_NODE_TYPES.AccessorProperty:
189
186
  addSafetySemicolonWhenInline = true
190
- ;({ dependencyNames, nameDetails, selectors, modifiers, isStatic } =
191
- computeAccessorDetails({
192
- accessor: member,
193
- isDecorated,
194
- sourceCode,
195
- }))
187
+ ;({
188
+ dependencyNames,
189
+ dependencies,
190
+ nameDetails,
191
+ modifiers,
192
+ selectors,
193
+ isStatic,
194
+ } = computeAccessorDetails({
195
+ ignoreCallbackDependenciesPatterns:
196
+ options.ignoreCallbackDependenciesPatterns,
197
+ useExperimentalDependencyDetection:
198
+ options.useExperimentalDependencyDetection,
199
+ accessor: member,
200
+ isDecorated,
201
+ sourceCode,
202
+ className,
203
+ }))
196
204
  ;({ name } = nameDetails)
197
205
  break
198
206
  case AST_NODE_TYPES.TSIndexSignature:
@@ -224,21 +232,22 @@ function sortClass({ matchedAstSelectors, context, node }) {
224
232
  default:
225
233
  throw new UnreachableCaseError(member)
226
234
  }
235
+ let predefinedGroups = generatePredefinedGroups({
236
+ cache: cachedGroupsByModifiersAndSelectors,
237
+ selectors,
238
+ modifiers,
239
+ })
227
240
  let group = computeGroup({
228
241
  customGroupMatcher: customGroup =>
229
242
  doesCustomGroupMatch({
230
243
  elementValue: memberValue,
231
244
  elementName: name,
245
+ decoratorNames,
232
246
  customGroup,
233
- decorators,
234
247
  modifiers,
235
248
  selectors,
236
249
  }),
237
- predefinedGroups: generatePredefinedGroups({
238
- cache: cachedGroupsByModifiersAndSelectors,
239
- selectors,
240
- modifiers,
241
- }),
250
+ predefinedGroups,
242
251
  options,
243
252
  })
244
253
  let sortingNode = {
@@ -277,14 +286,15 @@ function sortClass({ matchedAstSelectors, context, node }) {
277
286
  sortingNodeGroups: sortingNodeGroupsWithoutOverloadSignature,
278
287
  })
279
288
  if (options.useExperimentalDependencyDetection) {
289
+ let dependenciesBySortingNode = computeDependenciesBySortingNode({
290
+ ignoreCallbackDependenciesPatterns:
291
+ options.ignoreCallbackDependenciesPatterns,
292
+ sortingNodes: sortingNodeGroups.flat(),
293
+ classBody: node,
294
+ sourceCode,
295
+ })
280
296
  sortingNodeGroups = populateSortingNodeGroupsWithDependencies({
281
- dependenciesBySortingNode: computeDependenciesBySortingNode({
282
- ignoreCallbackDependenciesPatterns:
283
- options.ignoreCallbackDependenciesPatterns,
284
- sortingNodes: sortingNodeGroups.flat(),
285
- classBody: node,
286
- sourceCode,
287
- }),
297
+ dependenciesBySortingNode,
288
298
  sortingNodeGroups,
289
299
  })
290
300
  }
@@ -304,21 +314,20 @@ function sortClass({ matchedAstSelectors, context, node }) {
304
314
  context,
305
315
  })
306
316
  function sortNodesExcludingEslintDisabled(ignoreEslintDisabledNodes) {
307
- return sortNodesByDependencies(
308
- sortingNodeGroups.flatMap(sortingNodeGroup =>
309
- sortNodesByGroups({
310
- isNodeIgnored: sortingNode =>
311
- getGroupIndex(options.groups, sortingNode) ===
312
- options.groups.length,
313
- comparatorByOptionsComputer: defaultComparatorByOptionsComputer,
314
- optionsByGroupIndexComputer,
315
- ignoreEslintDisabledNodes,
316
- nodes: sortingNodeGroup,
317
- groups: options.groups,
318
- }),
319
- ),
320
- { ignoreEslintDisabledNodes },
317
+ let nodesSortedByGroups = sortingNodeGroups.flatMap(sortingNodeGroup =>
318
+ sortNodesByGroups({
319
+ isNodeIgnored: sortingNode =>
320
+ getGroupIndex(options.groups, sortingNode) === options.groups.length,
321
+ comparatorByOptionsComputer: defaultComparatorByOptionsComputer,
322
+ optionsByGroupIndexComputer,
323
+ ignoreEslintDisabledNodes,
324
+ nodes: sortingNodeGroup,
325
+ groups: options.groups,
326
+ }),
321
327
  )
328
+ return sortNodesByDependencies(nodesSortedByGroups, {
329
+ ignoreEslintDisabledNodes,
330
+ })
322
331
  }
323
332
  }
324
333
  export { defaultOptions, sortClass }
@@ -61,9 +61,7 @@ export type Options = Partial<
61
61
  >[]
62
62
  export interface SortClassesSortingNode extends SortingNodeWithDependencies<TSESTree.ClassElement> {
63
63
  overloadSignatureImplementation:
64
- | TSESTree.TSAbstractMethodDefinition
65
- | TSESTree.MethodDefinition
66
- | null
64
+ TSESTree.TSAbstractMethodDefinition | TSESTree.MethodDefinition | null
67
65
  nameDetails: NodeNameDetails | null
68
66
  isStatic: boolean
69
67
  }