eslint-plugin-perfectionist 5.3.1 → 5.5.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 (193) 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 +13 -10
  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 +10 -7
  9. package/dist/rules/sort-classes/compute-identifier-name-details.d.ts +1 -5
  10. package/dist/rules/sort-classes/compute-overload-signature-groups.d.ts +13 -0
  11. package/dist/rules/sort-classes/compute-overload-signature-groups.js +57 -0
  12. package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +3 -2
  13. package/dist/rules/sort-classes/node-info/compute-accessor-details.js +6 -6
  14. package/dist/rules/sort-classes/node-info/compute-method-details.d.ts +3 -2
  15. package/dist/rules/sort-classes/node-info/compute-method-details.js +8 -10
  16. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.d.ts +1 -1
  17. package/dist/rules/sort-classes/node-info/compute-property-details.d.ts +7 -2
  18. package/dist/rules/sort-classes/node-info/compute-property-details.js +14 -10
  19. package/dist/rules/sort-classes/node-info/compute-static-block-details.d.ts +4 -0
  20. package/dist/rules/sort-classes/node-info/compute-static-block-details.js +2 -0
  21. package/dist/rules/sort-classes/types.d.ts +29 -4
  22. package/dist/rules/sort-classes.d.ts +2 -2
  23. package/dist/rules/sort-classes.js +98 -69
  24. package/dist/rules/sort-decorators/types.d.ts +3 -1
  25. package/dist/rules/sort-decorators.js +64 -60
  26. package/dist/rules/sort-enums/compute-dependencies-by-sorting-node.d.ts +13 -0
  27. package/dist/rules/sort-enums/compute-dependencies-by-sorting-node.js +51 -0
  28. package/dist/rules/sort-enums/compute-dependencies.d.ts +14 -0
  29. package/dist/rules/sort-enums/compute-dependencies.js +73 -0
  30. package/dist/rules/sort-enums/types.d.ts +7 -1
  31. package/dist/rules/sort-enums.js +56 -60
  32. package/dist/rules/sort-export-attributes/types.d.ts +3 -1
  33. package/dist/rules/sort-export-attributes.js +4 -3
  34. package/dist/rules/sort-exports/types.d.ts +7 -4
  35. package/dist/rules/sort-exports.js +2 -3
  36. package/dist/rules/sort-heritage-clauses/types.d.ts +3 -1
  37. package/dist/rules/sort-heritage-clauses.js +3 -3
  38. package/dist/rules/sort-import-attributes/types.d.ts +3 -1
  39. package/dist/rules/sort-import-attributes.js +4 -3
  40. package/dist/rules/sort-imports/comparator-by-options-computer.js +0 -1
  41. package/dist/rules/sort-imports/compute-common-selectors.js +6 -5
  42. package/dist/rules/sort-imports/compute-dependencies.d.ts +4 -7
  43. package/dist/rules/sort-imports/compute-dependency-names.d.ts +2 -5
  44. package/dist/rules/sort-imports/compute-node-name.d.ts +2 -5
  45. package/dist/rules/sort-imports/compute-specifier-modifiers.d.ts +2 -5
  46. package/dist/rules/sort-imports/compute-specifier-modifiers.js +9 -9
  47. package/dist/rules/sort-imports/compute-specifier-name.d.ts +2 -5
  48. package/dist/rules/sort-imports/is-non-external-reference-ts-import-equals.d.ts +2 -4
  49. package/dist/rules/sort-imports/is-side-effect-import.d.ts +2 -5
  50. package/dist/rules/sort-imports/read-closest-ts-config-by-path.d.ts +3 -1
  51. package/dist/rules/sort-imports/types.d.ts +31 -14
  52. package/dist/rules/sort-imports.js +33 -13
  53. package/dist/rules/sort-interfaces.js +1 -1
  54. package/dist/rules/sort-jsx-props/types.d.ts +7 -4
  55. package/dist/rules/sort-jsx-props.js +9 -9
  56. package/dist/rules/sort-maps/types.d.ts +3 -1
  57. package/dist/rules/sort-maps.js +4 -3
  58. package/dist/rules/sort-modules/build-comparator-by-options-computer.d.ts +7 -2
  59. package/dist/rules/sort-modules/build-comparator-by-options-computer.js +5 -37
  60. package/dist/rules/sort-modules/build-usage-comparator.d.ts +29 -0
  61. package/dist/rules/sort-modules/build-usage-comparator.js +115 -0
  62. package/dist/rules/sort-modules/compute-dependencies-by-sorting-node.d.ts +16 -0
  63. package/dist/rules/sort-modules/compute-dependencies-by-sorting-node.js +127 -0
  64. package/dist/rules/sort-modules/compute-dependencies.d.ts +2 -0
  65. package/dist/rules/sort-modules/compute-dependencies.js +9 -2
  66. package/dist/rules/sort-modules/compute-node-details.d.ts +11 -1
  67. package/dist/rules/sort-modules/compute-node-details.js +25 -4
  68. package/dist/rules/sort-modules/compute-overload-signature-groups.d.ts +11 -0
  69. package/dist/rules/sort-modules/compute-overload-signature-groups.js +67 -0
  70. package/dist/rules/sort-modules/types.d.ts +21 -7
  71. package/dist/rules/sort-modules.d.ts +2 -2
  72. package/dist/rules/sort-modules.js +59 -16
  73. package/dist/rules/sort-named-exports/types.d.ts +6 -2
  74. package/dist/rules/sort-named-exports.js +4 -3
  75. package/dist/rules/sort-named-imports/types.d.ts +6 -2
  76. package/dist/rules/sort-named-imports.js +4 -3
  77. package/dist/rules/sort-object-types/is-node-function-type.d.ts +29 -20
  78. package/dist/rules/sort-object-types/types.d.ts +4 -4
  79. package/dist/rules/sort-object-types.js +5 -3
  80. package/dist/rules/sort-objects/comparator-by-options-computer.d.ts +6 -0
  81. package/dist/rules/sort-objects/comparator-by-options-computer.js +39 -0
  82. package/dist/rules/sort-objects/compute-dependencies.d.ts +2 -0
  83. package/dist/rules/sort-objects/compute-dependencies.js +75 -0
  84. package/dist/rules/sort-objects/compute-matched-context-options.js +2 -0
  85. package/dist/rules/sort-objects/is-style-component.d.ts +10 -0
  86. package/dist/rules/sort-objects/{is-style-node.js → is-style-component.js} +24 -1
  87. package/dist/rules/sort-objects/types.d.ts +29 -6
  88. package/dist/rules/sort-objects/types.js +8 -0
  89. package/dist/rules/sort-objects.js +137 -204
  90. package/dist/rules/sort-sets.js +3 -3
  91. package/dist/rules/sort-switch-case.js +15 -14
  92. package/dist/rules/sort-union-types/types.d.ts +3 -1
  93. package/dist/rules/sort-union-types.js +3 -3
  94. package/dist/rules/sort-variable-declarations/compute-dependencies.d.ts +12 -0
  95. package/dist/rules/sort-variable-declarations/compute-dependencies.js +76 -0
  96. package/dist/rules/sort-variable-declarations/compute-node-name.d.ts +17 -0
  97. package/dist/rules/sort-variable-declarations/compute-node-name.js +15 -0
  98. package/dist/rules/sort-variable-declarations/types.d.ts +19 -2
  99. package/dist/rules/sort-variable-declarations.js +51 -108
  100. package/dist/types/common-groups-options.d.ts +87 -50
  101. package/dist/types/common-options.d.ts +74 -41
  102. package/dist/types/common-partition-options.d.ts +23 -11
  103. package/dist/types/node-of-type.d.ts +3 -1
  104. package/dist/utils/alphabet.d.ts +38 -20
  105. package/dist/utils/alphabet.js +46 -31
  106. package/dist/utils/{build-default-options-by-group-index-computer.d.ts → build-options-by-group-index-computer.d.ts} +9 -7
  107. package/dist/utils/{build-default-options-by-group-index-computer.js → build-options-by-group-index-computer.js} +2 -2
  108. package/dist/utils/build-sorting-node-by-node-map.d.ts +10 -0
  109. package/dist/utils/build-sorting-node-by-node-map.js +8 -0
  110. package/dist/utils/complete.d.ts +9 -6
  111. package/dist/utils/compute-deep-scope-references.d.ts +13 -0
  112. package/dist/utils/compute-deep-scope-references.js +10 -0
  113. package/dist/utils/compute-dependencies-by-sorting-node.d.ts +42 -0
  114. package/dist/utils/compute-dependencies-by-sorting-node.js +88 -0
  115. package/dist/utils/compute-dependencies-outside-functions-by-sorting-node.d.ts +13 -0
  116. package/dist/utils/compute-dependencies-outside-functions-by-sorting-node.js +28 -0
  117. package/dist/utils/compute-group.d.ts +16 -11
  118. package/dist/utils/compute-nodes-in-circular-dependencies.d.ts +10 -7
  119. package/dist/utils/compute-overridden-options-by-group-index.d.ts +18 -15
  120. package/dist/utils/compute-parent-nodes-with-types.d.ts +8 -0
  121. package/dist/utils/compute-parent-nodes-with-types.js +11 -1
  122. package/dist/utils/convert-boolean-to-sign.d.ts +12 -6
  123. package/dist/utils/create-node-index-map.d.ts +11 -8
  124. package/dist/utils/does-custom-group-match.d.ts +37 -29
  125. package/dist/utils/does-sorting-node-have-one-of-dependency-names.d.ts +14 -0
  126. package/dist/utils/does-sorting-node-have-one-of-dependency-names.js +7 -0
  127. package/dist/utils/filter-options-by-all-names-match.d.ts +42 -34
  128. package/dist/utils/generate-predefined-groups.js +3 -7
  129. package/dist/utils/get-comment-above-that-should-exist.d.ts +29 -18
  130. package/dist/utils/get-decorator-name.d.ts +18 -9
  131. package/dist/utils/get-enum-members.d.ts +13 -10
  132. package/dist/utils/get-eslint-disabled-lines.d.ts +18 -15
  133. package/dist/utils/get-eslint-disabled-lines.js +1 -1
  134. package/dist/utils/get-eslint-disabled-rules.d.ts +18 -9
  135. package/dist/utils/get-group-index.d.ts +13 -10
  136. package/dist/utils/get-lines-between.d.ts +18 -12
  137. package/dist/utils/get-newlines-between-errors.d.ts +50 -26
  138. package/dist/utils/get-newlines-between-errors.js +1 -1
  139. package/dist/utils/get-newlines-between-option.d.ts +9 -3
  140. package/dist/utils/get-newlines-between-option.js +2 -3
  141. package/dist/utils/get-node-decorators.d.ts +6 -6
  142. package/dist/utils/get-node-range.d.ts +31 -19
  143. package/dist/utils/get-node-range.js +3 -3
  144. package/dist/utils/get-options-with-clean-groups.d.ts +21 -18
  145. package/dist/utils/get-options-with-clean-groups.js +2 -2
  146. package/dist/utils/get-settings.d.ts +17 -11
  147. package/dist/utils/is-group-with-overrides-option.d.ts +13 -10
  148. package/dist/utils/is-newlines-between-option.d.ts +16 -13
  149. package/dist/utils/is-node-dependent-on-other-node.d.ts +23 -20
  150. package/dist/utils/is-node-eslint-disabled.d.ts +10 -7
  151. package/dist/utils/is-partition-comment.d.ts +35 -22
  152. package/dist/utils/json-schemas/common-groups-json-schemas.d.ts +37 -26
  153. package/dist/utils/json-schemas/common-json-schemas.d.ts +1 -0
  154. package/dist/utils/json-schemas/common-json-schemas.js +6 -0
  155. package/dist/utils/make-comment-above-fixes.d.ts +22 -9
  156. package/dist/utils/make-comment-above-fixes.js +2 -3
  157. package/dist/utils/make-comment-after-fixes.d.ts +25 -12
  158. package/dist/utils/make-comment-after-fixes.js +2 -3
  159. package/dist/utils/make-fixes.d.ts +39 -22
  160. package/dist/utils/make-newlines-between-fixes.d.ts +39 -21
  161. package/dist/utils/make-order-fixes.d.ts +37 -19
  162. package/dist/utils/make-single-node-comment-after-fixes.d.ts +24 -11
  163. package/dist/utils/make-single-node-comment-after-fixes.js +3 -3
  164. package/dist/utils/matches.d.ts +21 -12
  165. package/dist/utils/overload-signature/build-overload-signature-newlines-between-value-getter.d.ts +13 -0
  166. package/dist/utils/overload-signature/build-overload-signature-newlines-between-value-getter.js +13 -0
  167. package/dist/utils/overload-signature/overload-signature-group.d.ts +23 -0
  168. package/dist/utils/overload-signature/overload-signature-group.js +12 -0
  169. package/dist/utils/overload-signature/populate-sorting-node-groups-with-overload-signature.d.ts +25 -0
  170. package/dist/utils/overload-signature/populate-sorting-node-groups-with-overload-signature.js +75 -0
  171. package/dist/utils/pairwise.d.ts +12 -9
  172. package/dist/utils/populate-sorting-node-groups-with-dependencies.d.ts +25 -0
  173. package/dist/utils/populate-sorting-node-groups-with-dependencies.js +37 -0
  174. package/dist/utils/range-contains-range.d.ts +12 -0
  175. package/dist/utils/range-contains-range.js +4 -0
  176. package/dist/utils/range-to-diff.d.ts +15 -6
  177. package/dist/utils/report-all-errors.d.ts +76 -49
  178. package/dist/utils/report-all-errors.js +15 -13
  179. package/dist/utils/report-errors.d.ts +31 -22
  180. package/dist/utils/report-errors.js +1 -1
  181. package/dist/utils/should-partition.d.ts +36 -25
  182. package/dist/utils/sort-nodes-by-dependencies.d.ts +61 -48
  183. package/dist/utils/sort-nodes-by-groups.d.ts +46 -37
  184. package/dist/utils/unreachable-case-error.d.ts +18 -15
  185. package/dist/utils/validate-custom-sort-configuration.d.ts +3 -1
  186. package/dist/utils/validate-groups-configuration.d.ts +50 -39
  187. package/dist/utils/validate-newlines-and-partition-configuration.d.ts +70 -53
  188. package/dist/utils/validate-objects-inside-groups.d.ts +43 -34
  189. package/package.json +2 -2
  190. package/readme.md +41 -14
  191. package/dist/rules/sort-classes/get-overload-signature-groups.d.ts +0 -10
  192. package/dist/rules/sort-classes/get-overload-signature-groups.js +0 -33
  193. package/dist/rules/sort-objects/is-style-node.d.ts +0 -8
@@ -1,3 +1,3 @@
1
1
  const name = 'eslint-plugin-perfectionist'
2
- const version = '5.3.1'
2
+ const version = '5.5.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
  }
@@ -14,12 +14,12 @@ import {
14
14
  buildCommonJsonSchemas,
15
15
  } from '../utils/json-schemas/common-json-schemas.js'
16
16
  import { validateNewlinesAndPartitionConfiguration } from '../utils/validate-newlines-and-partition-configuration.js'
17
- import { buildDefaultOptionsByGroupIndexComputer } from '../utils/build-default-options-by-group-index-computer.js'
18
17
  import { defaultComparatorByOptionsComputer } from '../utils/compare/default-comparator-by-options-computer.js'
19
18
  import {
20
19
  additionalCustomGroupMatchOptionsJsonSchema,
21
20
  allSelectors,
22
21
  } from './sort-array-includes/types.js'
22
+ import { buildOptionsByGroupIndexComputer } from '../utils/build-options-by-group-index-computer.js'
23
23
  import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
24
24
  import { validateCustomSortConfiguration } from '../utils/validate-custom-sort-configuration.js'
25
25
  import { filterOptionsByAllNamesMatch } from '../utils/filter-options-by-all-names-match.js'
@@ -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,
@@ -145,14 +145,18 @@ function sortArray({ availableMessageIds, elements, context }) {
145
145
  ruleName: id,
146
146
  sourceCode,
147
147
  })
148
+ let optionsByGroupIndexComputer = buildOptionsByGroupIndexComputer(options)
148
149
  let formattedMembers = elements.reduce(
149
150
  (accumulator, element) => {
150
151
  if (element === null) {
151
152
  return accumulator
152
153
  }
154
+ if (element.type === AST_NODE_TYPES.SpreadElement) {
155
+ accumulator.push([])
156
+ return accumulator
157
+ }
153
158
  let name = getNodeName({ sourceCode, element })
154
- let selector =
155
- element.type === AST_NODE_TYPES.SpreadElement ? 'spread' : 'literal'
159
+ let selector = 'literal'
156
160
  let predefinedGroups = generatePredefinedGroups({
157
161
  cache: cachedGroupsByModifiersAndSelectors,
158
162
  selectors: [selector],
@@ -198,9 +202,8 @@ function sortArray({ availableMessageIds, elements, context }) {
198
202
  function sortNodesExcludingEslintDisabled(ignoreEslintDisabledNodes) {
199
203
  return formattedMembers.flatMap(nodes2 =>
200
204
  sortNodesByGroups({
201
- optionsByGroupIndexComputer:
202
- buildDefaultOptionsByGroupIndexComputer(options),
203
205
  comparatorByOptionsComputer: defaultComparatorByOptionsComputer,
206
+ optionsByGroupIndexComputer,
204
207
  ignoreEslintDisabledNodes,
205
208
  groups: options.groups,
206
209
  nodes: nodes2,
@@ -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:
@@ -17,14 +23,13 @@ function computeDependencies({
17
23
  traverseNode(nodeValue.alternate)
18
24
  break
19
25
  case AST_NODE_TYPES.MemberExpression:
20
- dependencies = [
21
- ...dependencies,
26
+ dependencies.push(
22
27
  ...computeMemberExpressionDependencies({
23
28
  memberExpression: nodeValue,
24
29
  isMemberStatic,
25
30
  className,
26
31
  }),
27
- ]
32
+ )
28
33
  break
29
34
  case AST_NODE_TYPES.CallExpression:
30
35
  if (!('name' in nodeValue.callee)) {
@@ -98,8 +103,6 @@ function computeDependencies({
98
103
  checkNode(nodeValue)
99
104
  }
100
105
  }
101
- traverseNode(expression)
102
- return dependencies
103
106
  }
104
107
  function computeMemberExpressionDependencies({
105
108
  memberExpression,
@@ -110,8 +113,8 @@ function computeMemberExpressionDependencies({
110
113
  case AST_NODE_TYPES.ThisExpression:
111
114
  return computeIdentifierOrThisExpressionDependencies()
112
115
  case AST_NODE_TYPES.Identifier:
113
- return memberExpression.object.name === className
114
- ? computeIdentifierOrThisExpressionDependencies()
116
+ return memberExpression.object.name === className ?
117
+ computeIdentifierOrThisExpressionDependencies()
115
118
  : []
116
119
  default:
117
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
  *
@@ -0,0 +1,13 @@
1
+ import { TSESTree } from '@typescript-eslint/utils'
2
+ import { OverloadSignatureGroup } from '../../utils/overload-signature/overload-signature-group.js'
3
+ type Method = TSESTree.TSAbstractMethodDefinition | TSESTree.MethodDefinition
4
+ /**
5
+ * Returns a list of groups of overload signatures.
6
+ *
7
+ * @param classElements - The class elements to process.
8
+ * @returns A list of overload signature groups.
9
+ */
10
+ export declare function computeOverloadSignatureGroups(
11
+ classElements: TSESTree.ClassElement[],
12
+ ): OverloadSignatureGroup<Method>[]
13
+ export {}
@@ -0,0 +1,57 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ import { OverloadSignatureGroup } from '../../utils/overload-signature/overload-signature-group.js'
3
+ import { UnreachableCaseError } from '../../utils/unreachable-case-error.js'
4
+ import { isSortable } from '../../utils/is-sortable.js'
5
+ function computeOverloadSignatureGroups(classElements) {
6
+ let methods = classElements
7
+ .filter(
8
+ classElement =>
9
+ classElement.type === AST_NODE_TYPES.MethodDefinition ||
10
+ classElement.type === AST_NODE_TYPES.TSAbstractMethodDefinition,
11
+ )
12
+ .filter(classElement => classElement.kind === 'method')
13
+ let staticOverloadSignaturesByName = /* @__PURE__ */ new Map()
14
+ let overloadSignaturesByName = /* @__PURE__ */ new Map()
15
+ for (let method of methods) {
16
+ if (method.key.type !== AST_NODE_TYPES.Identifier) {
17
+ continue
18
+ }
19
+ let { name } = method.key
20
+ let mapToUse =
21
+ method.static ? staticOverloadSignaturesByName : overloadSignaturesByName
22
+ let overloadSignaturesArray = mapToUse.get(name)
23
+ if (!overloadSignaturesArray) {
24
+ overloadSignaturesArray = []
25
+ mapToUse.set(name, overloadSignaturesArray)
26
+ }
27
+ overloadSignaturesArray.push(method)
28
+ }
29
+ return [
30
+ ...overloadSignaturesByName.values(),
31
+ ...staticOverloadSignaturesByName.values(),
32
+ ]
33
+ .filter(isSortable)
34
+ .map(buildOverloadSignatureGroup)
35
+ }
36
+ function buildOverloadSignatureGroup(methods) {
37
+ let implementation = methods.find(isMethodImplementation) ?? methods.at(-1)
38
+ let overloadSignatures = methods.filter(
39
+ method => !isMethodImplementation(method),
40
+ )
41
+ return new OverloadSignatureGroup({
42
+ overloadSignatures,
43
+ implementation,
44
+ })
45
+ function isMethodImplementation(method) {
46
+ switch (method.value.type) {
47
+ case AST_NODE_TYPES.TSEmptyBodyFunctionExpression:
48
+ return false
49
+ case AST_NODE_TYPES.FunctionExpression:
50
+ return true
51
+ /* v8 ignore next 2 -- @preserve Exhaustive guard. */
52
+ default:
53
+ throw new UnreachableCaseError(method.value)
54
+ }
55
+ }
56
+ }
57
+ export { computeOverloadSignatureGroups }
@@ -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
  }