eslint-plugin-perfectionist 5.4.0 → 5.6.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 (124) hide show
  1. package/dist/package.json.js +1 -1
  2. package/dist/rules/sort-array-includes/types.d.ts +12 -8
  3. package/dist/rules/sort-array-includes/types.js +1 -1
  4. package/dist/rules/sort-array-includes.js +10 -7
  5. package/dist/rules/sort-classes/compute-dependencies-by-sorting-node.d.ts +27 -0
  6. package/dist/rules/sort-classes/compute-dependencies-by-sorting-node.js +189 -0
  7. package/dist/rules/sort-classes/compute-dependencies.d.ts +5 -0
  8. package/dist/rules/sort-classes/compute-dependencies.js +8 -4
  9. package/dist/rules/sort-classes/compute-identifier-name-details.d.ts +1 -5
  10. package/dist/rules/sort-classes/compute-overload-signature-groups.js +2 -3
  11. package/dist/rules/sort-classes/is-known-class-element.d.ts +13 -0
  12. package/dist/rules/sort-classes/is-known-class-element.js +17 -0
  13. package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +3 -2
  14. package/dist/rules/sort-classes/node-info/compute-accessor-details.js +6 -6
  15. package/dist/rules/sort-classes/node-info/compute-method-details.d.ts +3 -2
  16. package/dist/rules/sort-classes/node-info/compute-method-details.js +8 -10
  17. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.d.ts +1 -1
  18. package/dist/rules/sort-classes/node-info/compute-property-details.d.ts +7 -2
  19. package/dist/rules/sort-classes/node-info/compute-property-details.js +14 -10
  20. package/dist/rules/sort-classes/node-info/compute-static-block-details.d.ts +4 -0
  21. package/dist/rules/sort-classes/node-info/compute-static-block-details.js +2 -0
  22. package/dist/rules/sort-classes/types.d.ts +20 -3
  23. package/dist/rules/sort-classes.js +72 -23
  24. package/dist/rules/sort-decorators/types.d.ts +3 -1
  25. package/dist/rules/sort-decorators.js +61 -57
  26. package/dist/rules/sort-enums/compute-dependencies-by-sorting-node.js +3 -3
  27. package/dist/rules/sort-enums/types.d.ts +6 -2
  28. package/dist/rules/sort-enums.js +9 -8
  29. package/dist/rules/sort-export-attributes/types.d.ts +3 -1
  30. package/dist/rules/sort-exports/types.d.ts +7 -4
  31. package/dist/rules/sort-heritage-clauses/types.d.ts +3 -1
  32. package/dist/rules/sort-import-attributes/types.d.ts +3 -1
  33. package/dist/rules/sort-imports/compute-common-selectors.js +6 -5
  34. package/dist/rules/sort-imports/compute-specifier-modifiers.js +9 -9
  35. package/dist/rules/sort-imports/read-closest-ts-config-by-path.d.ts +3 -1
  36. package/dist/rules/sort-imports/types.d.ts +25 -10
  37. package/dist/rules/sort-imports.js +7 -5
  38. package/dist/rules/sort-interfaces.js +1 -1
  39. package/dist/rules/sort-jsx-props/types.d.ts +7 -4
  40. package/dist/rules/sort-jsx-props.js +5 -6
  41. package/dist/rules/sort-maps/types.d.ts +3 -1
  42. package/dist/rules/sort-modules/compute-dependencies-by-sorting-node.js +5 -5
  43. package/dist/rules/sort-modules/types.d.ts +12 -4
  44. package/dist/rules/sort-named-exports/types.d.ts +6 -2
  45. package/dist/rules/sort-named-imports/types.d.ts +6 -2
  46. package/dist/rules/sort-object-types/is-node-function-type.d.ts +29 -20
  47. package/dist/rules/sort-object-types/types.d.ts +6 -2
  48. package/dist/rules/sort-objects/passes-declaration-comment-matches-filter.js +10 -2
  49. package/dist/rules/sort-objects/types.d.ts +9 -3
  50. package/dist/rules/sort-objects.js +3 -2
  51. package/dist/rules/sort-sets.js +3 -3
  52. package/dist/rules/sort-switch-case.js +15 -14
  53. package/dist/rules/sort-union-types/compute-node-name.d.ts +21 -0
  54. package/dist/rules/sort-union-types/compute-node-name.js +12 -0
  55. package/dist/rules/sort-union-types/types.d.ts +3 -1
  56. package/dist/rules/sort-union-types.js +5 -1
  57. package/dist/rules/sort-variable-declarations/compute-dependencies.js +3 -1
  58. package/dist/rules/sort-variable-declarations/types.d.ts +6 -2
  59. package/dist/rules/sort-variable-declarations.js +3 -2
  60. package/dist/types/common-groups-options.d.ts +85 -48
  61. package/dist/types/common-options.d.ts +74 -41
  62. package/dist/types/common-partition-options.d.ts +23 -11
  63. package/dist/types/node-of-type.d.ts +3 -1
  64. package/dist/utils/alphabet.d.ts +38 -20
  65. package/dist/utils/alphabet.js +46 -31
  66. package/dist/utils/build-options-by-group-index-computer.d.ts +6 -3
  67. package/dist/utils/complete.d.ts +9 -6
  68. package/dist/utils/compute-dependencies-by-sorting-node.d.ts +4 -4
  69. package/dist/utils/compute-dependencies-by-sorting-node.js +1 -1
  70. package/dist/utils/compute-group.d.ts +18 -15
  71. package/dist/utils/compute-nodes-in-circular-dependencies.d.ts +10 -7
  72. package/dist/utils/compute-overridden-options-by-group-index.d.ts +18 -15
  73. package/dist/utils/convert-boolean-to-sign.d.ts +12 -6
  74. package/dist/utils/create-node-index-map.d.ts +11 -8
  75. package/dist/utils/does-custom-group-match.d.ts +37 -29
  76. package/dist/utils/filter-options-by-all-names-match.d.ts +42 -34
  77. package/dist/utils/get-comment-above-that-should-exist.d.ts +29 -18
  78. package/dist/utils/get-decorator-name.d.ts +18 -9
  79. package/dist/utils/get-enum-members.d.ts +9 -6
  80. package/dist/utils/get-eslint-disabled-lines.d.ts +18 -15
  81. package/dist/utils/get-eslint-disabled-rules.d.ts +18 -9
  82. package/dist/utils/get-group-index.d.ts +10 -7
  83. package/dist/utils/get-lines-between.d.ts +18 -12
  84. package/dist/utils/get-newlines-between-errors.d.ts +44 -23
  85. package/dist/utils/get-newlines-between-option.d.ts +9 -3
  86. package/dist/utils/get-newlines-between-option.js +2 -3
  87. package/dist/utils/get-node-decorators.d.ts +6 -6
  88. package/dist/utils/get-node-range.d.ts +31 -19
  89. package/dist/utils/get-node-range.js +3 -3
  90. package/dist/utils/get-options-with-clean-groups.d.ts +20 -17
  91. package/dist/utils/get-options-with-clean-groups.js +2 -2
  92. package/dist/utils/get-settings.d.ts +17 -11
  93. package/dist/utils/is-group-with-overrides-option.d.ts +13 -10
  94. package/dist/utils/is-newlines-between-option.d.ts +16 -13
  95. package/dist/utils/is-node-dependent-on-other-node.d.ts +23 -20
  96. package/dist/utils/is-node-eslint-disabled.d.ts +10 -7
  97. package/dist/utils/is-partition-comment.d.ts +35 -22
  98. package/dist/utils/json-schemas/common-groups-json-schemas.d.ts +37 -26
  99. package/dist/utils/make-comment-above-fixes.d.ts +22 -9
  100. package/dist/utils/make-comment-above-fixes.js +2 -3
  101. package/dist/utils/make-comment-after-fixes.d.ts +25 -12
  102. package/dist/utils/make-fixes.d.ts +39 -22
  103. package/dist/utils/make-newlines-between-fixes.d.ts +39 -21
  104. package/dist/utils/make-order-fixes.d.ts +37 -19
  105. package/dist/utils/make-single-node-comment-after-fixes.d.ts +24 -11
  106. package/dist/utils/make-single-node-comment-after-fixes.js +3 -3
  107. package/dist/utils/matches.d.ts +21 -12
  108. package/dist/utils/overload-signature/overload-signature-group.d.ts +3 -1
  109. package/dist/utils/pairwise.d.ts +12 -9
  110. package/dist/utils/range-to-diff.d.ts +15 -6
  111. package/dist/utils/report-all-errors.d.ts +76 -52
  112. package/dist/utils/report-all-errors.js +12 -9
  113. package/dist/utils/report-errors.d.ts +30 -21
  114. package/dist/utils/should-partition.d.ts +36 -25
  115. package/dist/utils/sort-nodes-by-dependencies.d.ts +61 -48
  116. package/dist/utils/sort-nodes-by-groups.d.ts +46 -37
  117. package/dist/utils/unreachable-case-error.d.ts +18 -15
  118. package/dist/utils/validate-custom-sort-configuration.d.ts +3 -1
  119. package/dist/utils/validate-groups-configuration.d.ts +50 -39
  120. package/dist/utils/validate-newlines-and-partition-configuration.d.ts +70 -53
  121. package/dist/utils/validate-objects-inside-groups.d.ts +43 -34
  122. package/package.json +3 -3
  123. package/readme.md +41 -14
  124. package/dist/utils/compute-consecutive-parent-nodes-by-type.d.ts +0 -6
@@ -1,3 +1,3 @@
1
1
  const name = 'eslint-plugin-perfectionist'
2
- const version = '5.4.0'
2
+ const version = '5.6.0'
3
3
  export { name, version }
@@ -28,8 +28,8 @@ export type Options = Partial<
28
28
  >
29
29
  >[]
30
30
  /**
31
- * Represents the type of array element selector. Used to distinguish between
32
- * literal values and spread elements in arrays.
31
+ * Represents the type of array element selector. Note: Spread elements are not
32
+ * sorted and act as partition boundaries.
33
33
  */
34
34
  export type Selector = (typeof allSelectors)[number]
35
35
  /**
@@ -39,14 +39,18 @@ export type Selector = (typeof allSelectors)[number]
39
39
  * and sorted based on their names and types.
40
40
  *
41
41
  * @example
42
- * {
43
- * "selector": "literal"
44
- * }
42
+ *
43
+ * ```ts
44
+ * {
45
+ * "selector": "literal"
46
+ * }
47
+ * ```
45
48
  */
46
49
  interface CustomGroupMatchOptions {
47
50
  /**
48
- * Specifies the type of array elements to include in this group. Can be
49
- * 'literal' for literal values or 'spread' for spread elements.
51
+ * Specifies the type of array elements to include in this group. Only
52
+ * 'literal' is available since spread elements create partition boundaries
53
+ * and are not sorted.
50
54
  */
51
55
  selector?: Selector
52
56
  }
@@ -55,7 +59,7 @@ type AdditionalSortOptions = object
55
59
  * Complete list of available selectors for array elements. Used for validation
56
60
  * and JSON schema generation.
57
61
  */
58
- export declare let allSelectors: readonly ['literal', 'spread']
62
+ export declare let allSelectors: readonly ['literal']
59
63
  /**
60
64
  * Additional custom group match options JSON schema. Used by ESLint to validate
61
65
  * rule options at configuration time.
@@ -1,5 +1,5 @@
1
1
  import { buildCustomGroupSelectorJsonSchema } from '../../utils/json-schemas/common-groups-json-schemas.js'
2
- let allSelectors = ['literal', 'spread']
2
+ let allSelectors = ['literal']
3
3
  let additionalCustomGroupMatchOptionsJsonSchema = {
4
4
  selector: buildCustomGroupSelectorJsonSchema(allSelectors),
5
5
  }
@@ -86,9 +86,9 @@ const sortArrayIncludes = createEslintRule({
86
86
  node.property.name === 'includes'
87
87
  ) {
88
88
  let elements =
89
- node.object.type === AST_NODE_TYPES.ArrayExpression
90
- ? node.object.elements
91
- : node.object.arguments
89
+ node.object.type === AST_NODE_TYPES.ArrayExpression ?
90
+ node.object.elements
91
+ : node.object.arguments
92
92
  sortArray({
93
93
  availableMessageIds: {
94
94
  missedSpacingBetweenMembers: MISSED_SPACING_ERROR_ID,
@@ -151,9 +151,12 @@ function sortArray({ availableMessageIds, elements, context }) {
151
151
  if (element === null) {
152
152
  return accumulator
153
153
  }
154
+ if (element.type === AST_NODE_TYPES.SpreadElement) {
155
+ accumulator.push([])
156
+ return accumulator
157
+ }
154
158
  let name = getNodeName({ sourceCode, element })
155
- let selector =
156
- element.type === AST_NODE_TYPES.SpreadElement ? 'spread' : 'literal'
159
+ let selector = 'literal'
157
160
  let predefinedGroups = generatePredefinedGroups({
158
161
  cache: cachedGroupsByModifiersAndSelectors,
159
162
  selectors: [selector],
@@ -217,8 +220,8 @@ function sortArray({ availableMessageIds, elements, context }) {
217
220
  })
218
221
  }
219
222
  function getNodeName({ sourceCode, element }) {
220
- return element.type === AST_NODE_TYPES.Literal
221
- ? `${element.value}`
223
+ return element.type === AST_NODE_TYPES.Literal ?
224
+ `${element.value}`
222
225
  : sourceCode.getText(element)
223
226
  }
224
227
  export { sortArrayIncludes as default, defaultOptions, jsonSchema, sortArray }
@@ -0,0 +1,27 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { TSESLint } from '@typescript-eslint/utils'
3
+ import { SortClassesSortingNode } from './types.js'
4
+ import { RegexOption } from '../../types/common-options.js'
5
+ type SortingNodeWithoutDependencies = Omit<
6
+ SortClassesSortingNode,
7
+ 'dependencies'
8
+ >
9
+ export declare function computeDependenciesBySortingNode({
10
+ ignoreCallbackDependenciesPatterns,
11
+ sortingNodes,
12
+ sourceCode,
13
+ classBody,
14
+ }: {
15
+ ignoreCallbackDependenciesPatterns: RegexOption
16
+ sortingNodes: SortingNodeWithoutDependencies[]
17
+ sourceCode: TSESLint.SourceCode
18
+ classBody: TSESTree.ClassBody
19
+ }): Map<SortingNodeWithoutDependencies, SortingNodeWithoutDependencies[]>
20
+ export declare function computeThisExpressionsInsideClassElement({
21
+ classElement,
22
+ sourceCode,
23
+ }: {
24
+ classElement: TSESTree.ClassElement
25
+ sourceCode: TSESLint.SourceCode
26
+ }): TSESTree.ThisExpression[]
27
+ export {}
@@ -0,0 +1,189 @@
1
+ import { AST_NODE_TYPES, AST_TOKEN_TYPES } from '@typescript-eslint/utils'
2
+ import { computeDependenciesBySortingNode as computeDependenciesBySortingNode$1 } from '../../utils/compute-dependencies-by-sorting-node.js'
3
+ import { computeParentNodesWithTypes } from '../../utils/compute-parent-nodes-with-types.js'
4
+ import { computeIdentifierNameDetails } from './compute-identifier-name-details.js'
5
+ import { UnreachableCaseError } from '../../utils/unreachable-case-error.js'
6
+ import { matches } from '../../utils/matches.js'
7
+ function computeDependenciesBySortingNode({
8
+ ignoreCallbackDependenciesPatterns,
9
+ sortingNodes,
10
+ sourceCode,
11
+ classBody,
12
+ }) {
13
+ let staticSortingNodes = sortingNodes.filter(node => node.isStatic)
14
+ let dependenciesBySortingNode = computeDependenciesBySortingNode$1({
15
+ additionalIdentifierDependenciesComputer:
16
+ buildAdditionalIdentifierDependenciesComputer({
17
+ ignoreCallbackDependenciesPatterns,
18
+ staticSortingNodes,
19
+ classBody,
20
+ }),
21
+ shouldIgnoreSortingNodeComputer: sortingNode =>
22
+ shouldIgnoreDependencyComputation(sortingNode.node),
23
+ sortingNodes,
24
+ sourceCode,
25
+ })
26
+ let thisDependenciesBySortingNode =
27
+ computeThisExpressionDependenciesBySortingNode({
28
+ ignoreCallbackDependenciesPatterns,
29
+ sortingNodes,
30
+ sourceCode,
31
+ })
32
+ for (let [sortingNode, dependencies] of thisDependenciesBySortingNode) {
33
+ let existingDependencies = dependenciesBySortingNode.get(sortingNode) ?? []
34
+ dependenciesBySortingNode.set(sortingNode, [
35
+ ...existingDependencies,
36
+ ...dependencies,
37
+ ])
38
+ }
39
+ return dependenciesBySortingNode
40
+ }
41
+ function computeThisExpressionsInsideClassElement({
42
+ classElement,
43
+ sourceCode,
44
+ }) {
45
+ let thisTokens = sourceCode.getTokens(classElement).filter(isThisToken)
46
+ return thisTokens
47
+ .map(computeTokenNode)
48
+ .filter(node => node?.type === AST_NODE_TYPES.ThisExpression)
49
+ function computeTokenNode(token) {
50
+ return sourceCode.getNodeByRangeIndex(token.range[0])
51
+ }
52
+ function isThisToken(token) {
53
+ return token.type === AST_TOKEN_TYPES.Keyword && token.value === 'this'
54
+ }
55
+ }
56
+ function computeIdentifierOrThisExpressionDependency({
57
+ ignoreCallbackDependenciesPatterns,
58
+ sortingNodes,
59
+ classElement,
60
+ node,
61
+ }) {
62
+ if (shouldIgnoreCallbackDependency()) {
63
+ return null
64
+ }
65
+ let { parent } = node
66
+ if (parent.type !== AST_NODE_TYPES.MemberExpression) {
67
+ return null
68
+ }
69
+ let dependencyName = computeDependencyNameFromMemberExpression(parent)
70
+ if (!dependencyName) {
71
+ return null
72
+ }
73
+ return (
74
+ sortingNodes.find(
75
+ currentSortingNode => currentSortingNode.name === dependencyName.name,
76
+ ) ?? null
77
+ )
78
+ function computeDependencyNameFromMemberExpression(memberExpression) {
79
+ switch (memberExpression.property.type) {
80
+ case AST_NODE_TYPES.PrivateIdentifier:
81
+ case AST_NODE_TYPES.Identifier:
82
+ case AST_NODE_TYPES.Literal:
83
+ return computeIdentifierNameDetails(memberExpression.property)
84
+ /* v8 ignore next 2 -- @preserve Unhandled cases */
85
+ default:
86
+ return null
87
+ }
88
+ }
89
+ function shouldIgnoreCallbackDependency() {
90
+ let [firstCallExpressionParent] = computeParentNodesWithTypes({
91
+ allowedTypes: [AST_NODE_TYPES.CallExpression],
92
+ maxParent: classElement,
93
+ consecutiveOnly: false,
94
+ node,
95
+ })
96
+ if (!firstCallExpressionParent) {
97
+ return false
98
+ }
99
+ if (!('name' in firstCallExpressionParent.callee)) {
100
+ return false
101
+ }
102
+ return matches(
103
+ firstCallExpressionParent.callee.name,
104
+ ignoreCallbackDependenciesPatterns,
105
+ )
106
+ }
107
+ }
108
+ function computeThisExpressionDependenciesBySortingNode({
109
+ ignoreCallbackDependenciesPatterns,
110
+ sortingNodes,
111
+ sourceCode,
112
+ }) {
113
+ let dependenciesBySortingNode = /* @__PURE__ */ new Map()
114
+ let staticSortingNodes = sortingNodes.filter(node => node.isStatic)
115
+ let nonStaticSortingNodes = sortingNodes.filter(node => !node.isStatic)
116
+ let relevantSortingNodes = sortingNodes.filter(
117
+ sortingNode => !shouldIgnoreDependencyComputation(sortingNode.node),
118
+ )
119
+ for (let sortingNode of relevantSortingNodes) {
120
+ let thisExpressions = computeThisExpressionsInsideClassElement({
121
+ classElement: sortingNode.node,
122
+ sourceCode,
123
+ })
124
+ let dependencies = thisExpressions
125
+ .map(thisExpression =>
126
+ computeIdentifierOrThisExpressionDependency({
127
+ sortingNodes:
128
+ sortingNode.isStatic ? staticSortingNodes : nonStaticSortingNodes,
129
+ ignoreCallbackDependenciesPatterns,
130
+ classElement: sortingNode.node,
131
+ node: thisExpression,
132
+ }),
133
+ )
134
+ .filter(dependency => dependency !== null)
135
+ if (dependencies.length === 0) {
136
+ continue
137
+ }
138
+ dependenciesBySortingNode.set(sortingNode, dependencies)
139
+ }
140
+ return dependenciesBySortingNode
141
+ }
142
+ function buildAdditionalIdentifierDependenciesComputer({
143
+ ignoreCallbackDependenciesPatterns,
144
+ staticSortingNodes,
145
+ classBody,
146
+ }) {
147
+ return ({ referencingSortingNode, reference }) => {
148
+ let resolvedClassIdentifier = reference.resolved?.identifiers[0]
149
+ if (!resolvedClassIdentifier) {
150
+ return []
151
+ }
152
+ let classIdentifier = classBody.parent.id
153
+ if (reference.resolved?.identifiers[0] !== classIdentifier) {
154
+ return []
155
+ }
156
+ let dependency = computeIdentifierOrThisExpressionDependency({
157
+ classElement: referencingSortingNode.node,
158
+ ignoreCallbackDependenciesPatterns,
159
+ sortingNodes: staticSortingNodes,
160
+ node: reference.identifier,
161
+ })
162
+ return dependency ? [dependency] : []
163
+ }
164
+ }
165
+ function shouldIgnoreDependencyComputation(node) {
166
+ switch (node.type) {
167
+ case AST_NODE_TYPES.TSAbstractPropertyDefinition:
168
+ case AST_NODE_TYPES.TSAbstractMethodDefinition:
169
+ case AST_NODE_TYPES.StaticBlock:
170
+ return false
171
+ case AST_NODE_TYPES.TSAbstractAccessorProperty:
172
+ case AST_NODE_TYPES.AccessorProperty:
173
+ case AST_NODE_TYPES.MethodDefinition:
174
+ case AST_NODE_TYPES.TSIndexSignature:
175
+ return true
176
+ case AST_NODE_TYPES.PropertyDefinition:
177
+ return (
178
+ node.value?.type === AST_NODE_TYPES.ArrowFunctionExpression ||
179
+ node.value?.type === AST_NODE_TYPES.FunctionExpression
180
+ )
181
+ /* v8 ignore next 2 -- @preserve Exhaustive guard. */
182
+ default:
183
+ throw new UnreachableCaseError(node)
184
+ }
185
+ }
186
+ export {
187
+ computeDependenciesBySortingNode,
188
+ computeThisExpressionsInsideClassElement,
189
+ }
@@ -3,9 +3,12 @@ import { RegexOption } from '../../types/common-options.js'
3
3
  /**
4
4
  * Computes the dependencies of a class member AST node.
5
5
  *
6
+ * @deprecated - To remove when experimental dependency detection is the only.
6
7
  * @param params - Parameters object.
7
8
  * @param params.ignoreCallbackDependenciesPatterns - Patterns to ignore
8
9
  * callback dependencies.
10
+ * @param params.useExperimentalDependencyDetection - Whether to use
11
+ * experimental dependency detection.
9
12
  * @param params.isMemberStatic - Indicates if the member is static.
10
13
  * @param params.expression - The AST node expression to analyze.
11
14
  * @param params.className - The name of the class, if available.
@@ -13,12 +16,14 @@ import { RegexOption } from '../../types/common-options.js'
13
16
  */
14
17
  export declare function computeDependencies({
15
18
  ignoreCallbackDependenciesPatterns,
19
+ useExperimentalDependencyDetection,
16
20
  isMemberStatic,
17
21
  expression,
18
22
  className,
19
23
  }: {
20
24
  expression: TSESTree.StaticBlock | TSESTree.Expression
21
25
  ignoreCallbackDependenciesPatterns: RegexOption
26
+ useExperimentalDependencyDetection: boolean
22
27
  className: undefined | string
23
28
  isMemberStatic: boolean
24
29
  }): string[]
@@ -4,11 +4,17 @@ import { computeDependencyName } from './compute-dependency-name.js'
4
4
  import { matches } from '../../utils/matches.js'
5
5
  function computeDependencies({
6
6
  ignoreCallbackDependenciesPatterns,
7
+ useExperimentalDependencyDetection,
7
8
  isMemberStatic,
8
9
  expression,
9
10
  className,
10
11
  }) {
12
+ if (useExperimentalDependencyDetection) {
13
+ return []
14
+ }
11
15
  let dependencies = []
16
+ traverseNode(expression)
17
+ return dependencies
12
18
  function checkNode(nodeValue) {
13
19
  switch (nodeValue.type) {
14
20
  case AST_NODE_TYPES.ConditionalExpression:
@@ -97,8 +103,6 @@ function computeDependencies({
97
103
  checkNode(nodeValue)
98
104
  }
99
105
  }
100
- traverseNode(expression)
101
- return dependencies
102
106
  }
103
107
  function computeMemberExpressionDependencies({
104
108
  memberExpression,
@@ -109,8 +113,8 @@ function computeMemberExpressionDependencies({
109
113
  case AST_NODE_TYPES.ThisExpression:
110
114
  return computeIdentifierOrThisExpressionDependencies()
111
115
  case AST_NODE_TYPES.Identifier:
112
- return memberExpression.object.name === className
113
- ? computeIdentifierOrThisExpressionDependencies()
116
+ return memberExpression.object.name === className ?
117
+ computeIdentifierOrThisExpressionDependencies()
114
118
  : []
115
119
  default:
116
120
  return []
@@ -1,9 +1,5 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
- export interface NodeNameDetails {
3
- nameWithoutStartingHash: string
4
- hasPrivateHash: boolean
5
- name: string
6
- }
2
+ import { NodeNameDetails } from './types.js'
7
3
  /**
8
4
  * Computes the name details of an identifier.
9
5
  *
@@ -17,9 +17,8 @@ function computeOverloadSignatureGroups(classElements) {
17
17
  continue
18
18
  }
19
19
  let { name } = method.key
20
- let mapToUse = method.static
21
- ? staticOverloadSignaturesByName
22
- : overloadSignaturesByName
20
+ let mapToUse =
21
+ method.static ? staticOverloadSignaturesByName : overloadSignaturesByName
23
22
  let overloadSignaturesArray = mapToUse.get(name)
24
23
  if (!overloadSignaturesArray) {
25
24
  overloadSignaturesArray = []
@@ -0,0 +1,13 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ /**
3
+ * Checks whether a class element is supported by the sort-classes rule.
4
+ *
5
+ * Unknown elements should be ignored to avoid crashes with non-standard parsers
6
+ * while letting known elements keep their ordering behavior.
7
+ *
8
+ * @param member - The class element to check.
9
+ * @returns True when the element is a known, supported class member.
10
+ */
11
+ export declare function isKnownClassElement(
12
+ member: TSESTree.ClassElement,
13
+ ): boolean
@@ -0,0 +1,17 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ function isKnownClassElement(member) {
3
+ switch (member.type) {
4
+ case AST_NODE_TYPES.TSAbstractPropertyDefinition:
5
+ case AST_NODE_TYPES.TSAbstractMethodDefinition:
6
+ case AST_NODE_TYPES.TSAbstractAccessorProperty:
7
+ case AST_NODE_TYPES.PropertyDefinition:
8
+ case AST_NODE_TYPES.MethodDefinition:
9
+ case AST_NODE_TYPES.AccessorProperty:
10
+ case AST_NODE_TYPES.TSIndexSignature:
11
+ case AST_NODE_TYPES.StaticBlock:
12
+ return true
13
+ default:
14
+ return false
15
+ }
16
+ }
17
+ export { isKnownClassElement }
@@ -1,6 +1,6 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { TSESLint } from '@typescript-eslint/utils'
3
- import { Modifier, Selector } from '../types.js'
3
+ import { NodeNameDetails, Modifier, Selector } from '../types.js'
4
4
  /**
5
5
  * Computes details related to an accessor property.
6
6
  *
@@ -19,8 +19,9 @@ export declare function computeAccessorDetails({
19
19
  sourceCode: TSESLint.SourceCode
20
20
  isDecorated: boolean
21
21
  }): {
22
+ nameDetails: NodeNameDetails
22
23
  dependencyNames: string[]
23
24
  modifiers: Modifier[]
24
25
  selectors: Selector[]
25
- name: string
26
+ isStatic: boolean
26
27
  }
@@ -8,24 +8,24 @@ import {
8
8
  import { computeMethodOrPropertyNameDetails } from './compute-method-or-property-name-details.js'
9
9
  import { computeDependencyName } from '../compute-dependency-name.js'
10
10
  function computeAccessorDetails({ isDecorated, sourceCode, accessor }) {
11
- let { nameWithoutStartingHash, hasPrivateHash, name } =
12
- computeMethodOrPropertyNameDetails(accessor, sourceCode)
11
+ let nameDetails = computeMethodOrPropertyNameDetails(accessor, sourceCode)
13
12
  let modifiers = computeModifiers({
14
- hasPrivateHash,
13
+ hasPrivateHash: nameDetails.hasPrivateHash,
15
14
  isDecorated,
16
15
  accessor,
17
16
  })
18
17
  return {
19
18
  dependencyNames: [
20
19
  computeDependencyName({
21
- nodeNameWithoutStartingHash: nameWithoutStartingHash,
20
+ nodeNameWithoutStartingHash: nameDetails.nameWithoutStartingHash,
21
+ hasPrivateHash: nameDetails.hasPrivateHash,
22
22
  isStatic: modifiers.includes('static'),
23
- hasPrivateHash,
24
23
  }),
25
24
  ],
26
25
  selectors: ['accessor-property'],
26
+ isStatic: accessor.static,
27
+ nameDetails,
27
28
  modifiers,
28
- name,
29
29
  }
30
30
  }
31
31
  function computeModifiers({ hasPrivateHash, isDecorated, accessor }) {
@@ -1,6 +1,6 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { TSESLint } from '@typescript-eslint/utils'
3
- import { Modifier, Selector } from '../types.js'
3
+ import { NodeNameDetails, Modifier, Selector } from '../types.js'
4
4
  /**
5
5
  * Computes details related to a method.
6
6
  *
@@ -23,7 +23,8 @@ export declare function computeMethodDetails({
23
23
  isDecorated: boolean
24
24
  }): {
25
25
  addSafetySemicolonWhenInline: boolean
26
+ nameDetails: NodeNameDetails
26
27
  modifiers: Modifier[]
27
28
  selectors: Selector[]
28
- name: string
29
+ isStatic: boolean
29
30
  }
@@ -16,22 +16,20 @@ function computeMethodDetails({
16
16
  sourceCode,
17
17
  method,
18
18
  }) {
19
- let { hasPrivateHash, name } = computeMethodOrPropertyNameDetails(
20
- method,
21
- sourceCode,
22
- )
19
+ let nameDetails = computeMethodOrPropertyNameDetails(method, sourceCode)
23
20
  return {
24
- addSafetySemicolonWhenInline: shouldAddSafetySemicolonWhenInline({
25
- hasParentDeclare,
26
- method,
27
- }),
28
21
  modifiers: computeModifiers({
29
- hasPrivateHash,
22
+ hasPrivateHash: nameDetails.hasPrivateHash,
30
23
  isDecorated,
31
24
  method,
32
25
  }),
26
+ addSafetySemicolonWhenInline: shouldAddSafetySemicolonWhenInline({
27
+ hasParentDeclare,
28
+ method,
29
+ }),
33
30
  selectors: computeSelectors(method),
34
- name,
31
+ isStatic: method.static,
32
+ nameDetails,
35
33
  }
36
34
  }
37
35
  function computeSelectors(method) {
@@ -1,6 +1,6 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { TSESLint } from '@typescript-eslint/utils'
3
- import { NodeNameDetails } from '../compute-identifier-name-details.js'
3
+ import { NodeNameDetails } from '../types.js'
4
4
  /**
5
5
  * Computes the name details of a method or property node.
6
6
  *
@@ -1,7 +1,7 @@
1
1
  import { TSESTree } from '@typescript-eslint/types'
2
2
  import { TSESLint } from '@typescript-eslint/utils'
3
+ import { NodeNameDetails, Modifier, Selector } from '../types.js'
3
4
  import { RegexOption } from '../../../types/common-options.js'
4
- import { Modifier, Selector } from '../types.js'
5
5
  /**
6
6
  * Computes details related to a property.
7
7
  *
@@ -10,12 +10,15 @@ import { Modifier, Selector } from '../types.js'
10
10
  * @param params.property - The property node to compute information for.
11
11
  * @param params.ignoreCallbackDependenciesPatterns - Patterns to ignore when
12
12
  * computing dependencies.
13
+ * @param params.useExperimentalDependencyDetection - Whether to use
14
+ * experimental dependency detection.
13
15
  * @param params.sourceCode - The source code object.
14
16
  * @param params.className - The name of the class containing the property.
15
17
  * @returns An object containing various details about the property.
16
18
  */
17
19
  export declare function computePropertyDetails({
18
20
  ignoreCallbackDependenciesPatterns,
21
+ useExperimentalDependencyDetection,
19
22
  isDecorated,
20
23
  sourceCode,
21
24
  className,
@@ -23,14 +26,16 @@ export declare function computePropertyDetails({
23
26
  }: {
24
27
  property: TSESTree.TSAbstractPropertyDefinition | TSESTree.PropertyDefinition
25
28
  ignoreCallbackDependenciesPatterns: RegexOption
29
+ useExperimentalDependencyDetection: boolean
26
30
  sourceCode: TSESLint.SourceCode
27
31
  className: undefined | string
28
32
  isDecorated: boolean
29
33
  }): {
30
34
  memberValue: undefined | string
35
+ nameDetails: NodeNameDetails
31
36
  dependencyNames: string[]
32
37
  dependencies: string[]
33
38
  modifiers: Modifier[]
34
39
  selectors: Selector[]
35
- name: string
40
+ isStatic: boolean
36
41
  }
@@ -14,38 +14,40 @@ import { computeDependencyName } from '../compute-dependency-name.js'
14
14
  import { computeDependencies } from '../compute-dependencies.js'
15
15
  function computePropertyDetails({
16
16
  ignoreCallbackDependenciesPatterns,
17
+ useExperimentalDependencyDetection,
17
18
  isDecorated,
18
19
  sourceCode,
19
20
  className,
20
21
  property,
21
22
  }) {
22
- let { nameWithoutStartingHash, hasPrivateHash, name } =
23
- computeMethodOrPropertyNameDetails(property, sourceCode)
23
+ let nameDetails = computeMethodOrPropertyNameDetails(property, sourceCode)
24
24
  let modifiers = computeModifiers({
25
- hasPrivateHash,
25
+ hasPrivateHash: nameDetails.hasPrivateHash,
26
26
  isDecorated,
27
27
  property,
28
28
  })
29
29
  return {
30
30
  dependencyNames: [
31
31
  computeDependencyName({
32
- nodeNameWithoutStartingHash: nameWithoutStartingHash,
32
+ nodeNameWithoutStartingHash: nameDetails.nameWithoutStartingHash,
33
+ hasPrivateHash: nameDetails.hasPrivateHash,
33
34
  isStatic: modifiers.includes('static'),
34
- hasPrivateHash,
35
35
  }),
36
36
  ],
37
- memberValue:
38
- !isFunctionExpression(property.value) && property.value
39
- ? sourceCode.getText(property.value)
40
- : void 0,
41
37
  dependencies: computePropertyDependencies({
42
38
  ignoreCallbackDependenciesPatterns,
39
+ useExperimentalDependencyDetection,
43
40
  className,
44
41
  property,
45
42
  }),
43
+ memberValue:
44
+ !isFunctionExpression(property.value) && property.value ?
45
+ sourceCode.getText(property.value)
46
+ : void 0,
46
47
  selectors: computeSelectors(property),
48
+ isStatic: property.static,
49
+ nameDetails,
47
50
  modifiers,
48
- name,
49
51
  }
50
52
  }
51
53
  function computeModifiers({ hasPrivateHash, isDecorated, property }) {
@@ -75,6 +77,7 @@ function computeModifiers({ hasPrivateHash, isDecorated, property }) {
75
77
  }
76
78
  function computePropertyDependencies({
77
79
  ignoreCallbackDependenciesPatterns,
80
+ useExperimentalDependencyDetection,
78
81
  className,
79
82
  property,
80
83
  }) {
@@ -86,6 +89,7 @@ function computePropertyDependencies({
86
89
  }
87
90
  return computeDependencies({
88
91
  ignoreCallbackDependenciesPatterns,
92
+ useExperimentalDependencyDetection,
89
93
  isMemberStatic: property.static,
90
94
  expression: property.value,
91
95
  className,