eslint-plugin-perfectionist 5.1.0 → 5.3.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 (163) hide show
  1. package/dist/index.d.ts +15 -3
  2. package/dist/package.json.js +1 -1
  3. package/dist/rules/sort-array-includes/types.d.ts +15 -18
  4. package/dist/rules/sort-array-includes/types.js +2 -2
  5. package/dist/rules/sort-array-includes.d.ts +3 -1
  6. package/dist/rules/sort-array-includes.js +13 -10
  7. package/dist/rules/sort-classes/compute-dependencies.d.ts +24 -0
  8. package/dist/rules/sort-classes/compute-dependencies.js +147 -0
  9. package/dist/rules/sort-classes/compute-dependency-name.d.ts +9 -0
  10. package/dist/rules/sort-classes/compute-dependency-name.js +8 -0
  11. package/dist/rules/sort-classes/compute-identifier-name-details.d.ts +16 -0
  12. package/dist/rules/sort-classes/compute-identifier-name-details.js +27 -0
  13. package/dist/rules/sort-classes/get-overload-signature-groups.js +4 -3
  14. package/dist/rules/sort-classes/node-info/common-modifiers.d.ts +39 -0
  15. package/dist/rules/sort-classes/node-info/common-modifiers.js +62 -0
  16. package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +26 -0
  17. package/dist/rules/sort-classes/node-info/compute-accessor-details.js +43 -0
  18. package/dist/rules/sort-classes/node-info/compute-index-signature-details.d.ts +23 -0
  19. package/dist/rules/sort-classes/node-info/compute-index-signature-details.js +21 -0
  20. package/dist/rules/sort-classes/node-info/compute-method-details.d.ts +29 -0
  21. package/dist/rules/sort-classes/node-info/compute-method-details.js +80 -0
  22. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.d.ts +21 -0
  23. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.js +17 -0
  24. package/dist/rules/sort-classes/node-info/compute-property-details.d.ts +36 -0
  25. package/dist/rules/sort-classes/node-info/compute-property-details.js +109 -0
  26. package/dist/rules/sort-classes/node-info/compute-static-block-details.d.ts +26 -0
  27. package/dist/rules/sort-classes/node-info/compute-static-block-details.js +18 -0
  28. package/dist/rules/sort-classes/types.d.ts +15 -18
  29. package/dist/rules/sort-classes/types.js +6 -2
  30. package/dist/rules/sort-classes.d.ts +3 -1
  31. package/dist/rules/sort-classes.js +79 -291
  32. package/dist/rules/sort-decorators/types.d.ts +10 -12
  33. package/dist/rules/sort-decorators.d.ts +3 -1
  34. package/dist/rules/sort-decorators.js +57 -56
  35. package/dist/rules/sort-enums/build-comparator-by-options-computer.js +6 -0
  36. package/dist/rules/sort-enums/types.d.ts +16 -19
  37. package/dist/rules/sort-enums/types.js +2 -2
  38. package/dist/rules/sort-enums.d.ts +3 -1
  39. package/dist/rules/sort-enums.js +13 -11
  40. package/dist/rules/sort-export-attributes/types.d.ts +6 -8
  41. package/dist/rules/sort-export-attributes.d.ts +3 -1
  42. package/dist/rules/sort-export-attributes.js +2 -1
  43. package/dist/rules/sort-exports/types.d.ts +11 -10
  44. package/dist/rules/sort-exports/types.js +6 -2
  45. package/dist/rules/sort-exports.d.ts +3 -1
  46. package/dist/rules/sort-exports.js +7 -6
  47. package/dist/rules/sort-heritage-clauses/types.d.ts +6 -8
  48. package/dist/rules/sort-heritage-clauses.d.ts +3 -1
  49. package/dist/rules/sort-heritage-clauses.js +2 -1
  50. package/dist/rules/sort-import-attributes/types.d.ts +6 -8
  51. package/dist/rules/sort-import-attributes.d.ts +3 -1
  52. package/dist/rules/sort-import-attributes.js +2 -1
  53. package/dist/rules/sort-imports/comparator-by-options-computer.js +53 -4
  54. package/dist/rules/sort-imports/compute-specifier-modifiers.js +1 -1
  55. package/dist/rules/sort-imports/compute-specifier-name.d.ts +12 -0
  56. package/dist/rules/sort-imports/compute-specifier-name.js +64 -0
  57. package/dist/rules/sort-imports/is-non-external-reference-ts-import-equals.js +1 -1
  58. package/dist/rules/sort-imports/is-side-effect-import.js +1 -1
  59. package/dist/rules/sort-imports/types.d.ts +20 -16
  60. package/dist/rules/sort-imports/types.js +10 -2
  61. package/dist/rules/sort-imports.d.ts +3 -1
  62. package/dist/rules/sort-imports.js +28 -14
  63. package/dist/rules/sort-interfaces.d.ts +3 -1
  64. package/dist/rules/sort-intersection-types.d.ts +3 -1
  65. package/dist/rules/sort-jsx-props/types.d.ts +18 -18
  66. package/dist/rules/sort-jsx-props/types.js +6 -2
  67. package/dist/rules/sort-jsx-props.d.ts +3 -1
  68. package/dist/rules/sort-jsx-props.js +14 -7
  69. package/dist/rules/sort-maps/types.d.ts +10 -16
  70. package/dist/rules/sort-maps.d.ts +3 -1
  71. package/dist/rules/sort-maps.js +11 -6
  72. package/dist/rules/sort-modules/build-comparator-by-options-computer.d.ts +12 -0
  73. package/dist/rules/sort-modules/build-comparator-by-options-computer.js +68 -0
  74. package/dist/rules/sort-modules/compute-dependencies.d.ts +24 -0
  75. package/dist/rules/sort-modules/compute-dependencies.js +198 -0
  76. package/dist/rules/sort-modules/compute-node-details.d.ts +38 -0
  77. package/dist/rules/sort-modules/compute-node-details.js +127 -0
  78. package/dist/rules/sort-modules/is-arrow-function-node.d.ts +12 -0
  79. package/dist/rules/sort-modules/is-arrow-function-node.js +10 -0
  80. package/dist/rules/sort-modules/is-property-or-accessor-node.d.ts +11 -0
  81. package/dist/rules/sort-modules/is-property-or-accessor-node.js +8 -0
  82. package/dist/rules/sort-modules/types.d.ts +30 -12
  83. package/dist/rules/sort-modules/types.js +8 -2
  84. package/dist/rules/sort-modules.d.ts +3 -1
  85. package/dist/rules/sort-modules.js +84 -261
  86. package/dist/rules/sort-named-exports/compute-node-name.js +1 -1
  87. package/dist/rules/sort-named-exports/types.d.ts +16 -16
  88. package/dist/rules/sort-named-exports/types.js +6 -2
  89. package/dist/rules/sort-named-exports.d.ts +3 -1
  90. package/dist/rules/sort-named-exports.js +6 -5
  91. package/dist/rules/sort-named-imports/compute-node-name.js +1 -1
  92. package/dist/rules/sort-named-imports/types.d.ts +16 -17
  93. package/dist/rules/sort-named-imports/types.js +6 -2
  94. package/dist/rules/sort-named-imports.d.ts +3 -1
  95. package/dist/rules/sort-named-imports.js +7 -6
  96. package/dist/rules/sort-object-types/comparator-by-options-computer.js +3 -0
  97. package/dist/rules/sort-object-types/is-member-optional.js +1 -1
  98. package/dist/rules/sort-object-types/is-node-function-type.js +20 -0
  99. package/dist/rules/sort-object-types/types.d.ts +21 -55
  100. package/dist/rules/sort-object-types/types.js +9 -7
  101. package/dist/rules/sort-object-types.d.ts +3 -1
  102. package/dist/rules/sort-object-types.js +14 -15
  103. package/dist/rules/sort-objects/types.d.ts +17 -21
  104. package/dist/rules/sort-objects/types.js +3 -3
  105. package/dist/rules/sort-objects.d.ts +3 -1
  106. package/dist/rules/sort-objects.js +5 -3
  107. package/dist/rules/sort-sets.d.ts +3 -1
  108. package/dist/rules/sort-sets.js +5 -4
  109. package/dist/rules/sort-switch-case.d.ts +3 -1
  110. package/dist/rules/sort-switch-case.js +6 -4
  111. package/dist/rules/sort-union-types/types.d.ts +12 -12
  112. package/dist/rules/sort-union-types/types.js +2 -2
  113. package/dist/rules/sort-union-types.d.ts +3 -1
  114. package/dist/rules/sort-union-types.js +37 -35
  115. package/dist/rules/sort-variable-declarations/types.d.ts +12 -13
  116. package/dist/rules/sort-variable-declarations/types.js +2 -2
  117. package/dist/rules/sort-variable-declarations.d.ts +3 -1
  118. package/dist/rules/sort-variable-declarations.js +14 -12
  119. package/dist/types/all-common-options.d.ts +14 -0
  120. package/dist/types/common-groups-options.d.ts +82 -92
  121. package/dist/types/common-options.d.ts +67 -56
  122. package/dist/utils/build-default-options-by-group-index-computer.d.ts +1 -1
  123. package/dist/utils/compare/build-string-formatter.d.ts +4 -5
  124. package/dist/utils/compare/build-subgroup-order-comparator.d.ts +10 -0
  125. package/dist/utils/compare/build-subgroup-order-comparator.js +49 -0
  126. package/dist/utils/compare/default-comparator-by-options-computer.d.ts +4 -1
  127. package/dist/utils/compare/default-comparator-by-options-computer.js +9 -0
  128. package/dist/utils/compute-group.d.ts +12 -12
  129. package/dist/utils/compute-group.js +22 -19
  130. package/dist/utils/compute-nodes-in-circular-dependencies.d.ts +4 -1
  131. package/dist/utils/compute-overridden-options-by-group-index.d.ts +1 -1
  132. package/dist/utils/compute-overridden-options-by-group-index.js +38 -19
  133. package/dist/utils/create-eslint-rule.d.ts +3 -1
  134. package/dist/utils/does-custom-group-match.d.ts +6 -4
  135. package/dist/utils/get-comment-above-that-should-exist.d.ts +1 -1
  136. package/dist/utils/get-newlines-between-errors.d.ts +1 -1
  137. package/dist/utils/get-newlines-between-option.d.ts +1 -7
  138. package/dist/utils/get-node-range.d.ts +2 -9
  139. package/dist/utils/get-settings.d.ts +1 -1
  140. package/dist/utils/is-group-with-overrides-option.d.ts +6 -2
  141. package/dist/utils/is-node-dependent-on-other-node.d.ts +8 -2
  142. package/dist/utils/json-schemas/common-groups-json-schemas.d.ts +18 -17
  143. package/dist/utils/json-schemas/common-groups-json-schemas.js +70 -57
  144. package/dist/utils/json-schemas/common-json-schemas.d.ts +9 -9
  145. package/dist/utils/json-schemas/common-json-schemas.js +16 -14
  146. package/dist/utils/make-comment-above-fixes.d.ts +1 -1
  147. package/dist/utils/make-fixes.d.ts +3 -5
  148. package/dist/utils/make-newlines-between-fixes.d.ts +1 -1
  149. package/dist/utils/make-order-fixes.d.ts +2 -5
  150. package/dist/utils/report-all-errors.d.ts +19 -17
  151. package/dist/utils/report-errors.d.ts +3 -1
  152. package/dist/utils/should-partition.d.ts +2 -5
  153. package/dist/utils/sort-nodes-by-dependencies.d.ts +4 -1
  154. package/dist/utils/validate-custom-sort-configuration.d.ts +1 -1
  155. package/dist/utils/validate-groups-configuration.d.ts +1 -1
  156. package/dist/utils/validate-newlines-and-partition-configuration.d.ts +1 -1
  157. package/package.json +2 -2
  158. package/readme.md +1 -1
  159. package/dist/rules/sort-object-types/build-options-by-group-index-computer.d.ts +0 -18
  160. package/dist/rules/sort-object-types/build-options-by-group-index-computer.js +0 -33
  161. package/dist/types/join.d.ts +0 -19
  162. package/dist/utils/is-node-function-type.js +0 -13
  163. /package/dist/{utils → rules/sort-object-types}/is-node-function-type.d.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -1,5 +1,17 @@
1
- import { ESLint } from 'eslint'
1
+ import { ESLint, Linter } from 'eslint'
2
+ interface PluginConfigs {
3
+ 'recommended-alphabetical-legacy': Linter.LegacyConfig
4
+ 'recommended-line-length-legacy': Linter.LegacyConfig
5
+ 'recommended-natural-legacy': Linter.LegacyConfig
6
+ 'recommended-custom-legacy': Linter.LegacyConfig
7
+ 'recommended-alphabetical': Linter.Config
8
+ 'recommended-line-length': Linter.Config
9
+ 'recommended-natural': Linter.Config
10
+ 'recommended-custom': Linter.Config
11
+ }
2
12
  export declare let rules: ESLint.Plugin['rules']
3
- export declare let configs: ESLint.Plugin['configs']
4
- declare const _default: ESLint.Plugin
13
+ export declare let configs: PluginConfigs
14
+ declare const _default: {
15
+ configs: PluginConfigs
16
+ } & ESLint.Plugin
5
17
  export default _default
@@ -1,3 +1,3 @@
1
1
  const name = 'eslint-plugin-perfectionist'
2
- const version = '5.1.0'
2
+ const version = '5.3.0'
3
3
  export { name, version }
@@ -1,11 +1,6 @@
1
1
  import { JSONSchema4 } from '@typescript-eslint/utils/json-schema'
2
- import {
3
- CommonOptions,
4
- RegexOption,
5
- TypeOption,
6
- } from '../../types/common-options.js'
7
- import { CommonPartitionOptions } from '../../types/common-partition-options.js'
8
- import { CommonGroupsOptions } from '../../types/common-groups-options.js'
2
+ import { RegexOption, TypeOption } from '../../types/common-options.js'
3
+ import { AllCommonOptions } from '../../types/all-common-options.js'
9
4
  /**
10
5
  * Configuration options for the sort-array-includes rule.
11
6
  *
@@ -26,13 +21,11 @@ export type Options = Partial<
26
21
  */
27
22
  allNamesMatchPattern?: RegexOption
28
23
  }
29
- } & CommonGroupsOptions<
30
- SingleCustomGroup,
31
- Record<string, never>,
32
- TypeOption
33
- > &
34
- CommonOptions<TypeOption> &
35
- CommonPartitionOptions
24
+ } & AllCommonOptions<
25
+ TypeOption,
26
+ AdditionalSortOptions,
27
+ CustomGroupMatchOptions
28
+ >
36
29
  >[]
37
30
  /**
38
31
  * Represents the type of array element selector. Used to distinguish between
@@ -50,21 +43,25 @@ export type Selector = (typeof allSelectors)[number]
50
43
  * "selector": "literal"
51
44
  * }
52
45
  */
53
- interface SingleCustomGroup {
46
+ interface CustomGroupMatchOptions {
54
47
  /**
55
48
  * Specifies the type of array elements to include in this group. Can be
56
49
  * 'literal' for literal values or 'spread' for spread elements.
57
50
  */
58
51
  selector?: Selector
59
52
  }
53
+ type AdditionalSortOptions = object
60
54
  /**
61
55
  * Complete list of available selectors for array elements. Used for validation
62
56
  * and JSON schema generation.
63
57
  */
64
58
  export declare let allSelectors: readonly ['literal', 'spread']
65
59
  /**
66
- * JSON schema definition for validating single custom group configurations.
67
- * Used by ESLint to validate rule options at configuration time.
60
+ * Additional custom group match options JSON schema. Used by ESLint to validate
61
+ * rule options at configuration time.
68
62
  */
69
- export declare let singleCustomGroupJsonSchema: Record<string, JSONSchema4>
63
+ export declare let additionalCustomGroupMatchOptionsJsonSchema: Record<
64
+ string,
65
+ JSONSchema4
66
+ >
70
67
  export {}
@@ -1,6 +1,6 @@
1
1
  import { buildCustomGroupSelectorJsonSchema } from '../../utils/json-schemas/common-groups-json-schemas.js'
2
2
  let allSelectors = ['literal', 'spread']
3
- let singleCustomGroupJsonSchema = {
3
+ let additionalCustomGroupMatchOptionsJsonSchema = {
4
4
  selector: buildCustomGroupSelectorJsonSchema(allSelectors),
5
5
  }
6
- export { allSelectors, singleCustomGroupJsonSchema }
6
+ export { additionalCustomGroupMatchOptionsJsonSchema, allSelectors }
@@ -20,7 +20,9 @@ declare const _default: TSESLint.RuleModule<
20
20
  Options,
21
21
  import('../utils/create-eslint-rule.js').ESLintPluginDocumentation,
22
22
  TSESLint.RuleListener
23
- >
23
+ > & {
24
+ name: string
25
+ }
24
26
  export default _default
25
27
  export declare function sortArray<MessageIds extends string>({
26
28
  availableMessageIds,
@@ -1,3 +1,4 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
1
2
  import {
2
3
  partitionByNewLineJsonSchema,
3
4
  partitionByCommentJsonSchema,
@@ -15,12 +16,12 @@ import {
15
16
  import { validateNewlinesAndPartitionConfiguration } from '../utils/validate-newlines-and-partition-configuration.js'
16
17
  import { buildDefaultOptionsByGroupIndexComputer } from '../utils/build-default-options-by-group-index-computer.js'
17
18
  import { defaultComparatorByOptionsComputer } from '../utils/compare/default-comparator-by-options-computer.js'
18
- import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
19
- import { validateCustomSortConfiguration } from '../utils/validate-custom-sort-configuration.js'
20
19
  import {
21
- singleCustomGroupJsonSchema,
20
+ additionalCustomGroupMatchOptionsJsonSchema,
22
21
  allSelectors,
23
22
  } from './sort-array-includes/types.js'
23
+ import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
24
+ import { validateCustomSortConfiguration } from '../utils/validate-custom-sort-configuration.js'
24
25
  import { filterOptionsByAllNamesMatch } from '../utils/filter-options-by-all-names-match.js'
25
26
  import { validateGroupsConfiguration } from '../utils/validate-groups-configuration.js'
26
27
  import { generatePredefinedGroups } from '../utils/generate-predefined-groups.js'
@@ -62,7 +63,8 @@ let jsonSchema = {
62
63
  properties: {
63
64
  ...buildCommonJsonSchemas(),
64
65
  ...buildCommonGroupsJsonSchemas({
65
- singleCustomGroupJsonSchema,
66
+ additionalCustomGroupMatchProperties:
67
+ additionalCustomGroupMatchOptionsJsonSchema,
66
68
  }),
67
69
  useConfigurationIf: buildUseConfigurationIfJsonSchema(),
68
70
  partitionByComment: partitionByCommentJsonSchema,
@@ -78,13 +80,13 @@ const sortArrayIncludes = createEslintRule({
78
80
  create: context => ({
79
81
  MemberExpression: node => {
80
82
  if (
81
- (node.object.type === 'ArrayExpression' ||
82
- node.object.type === 'NewExpression') &&
83
- node.property.type === 'Identifier' &&
83
+ (node.object.type === AST_NODE_TYPES.ArrayExpression ||
84
+ node.object.type === AST_NODE_TYPES.NewExpression) &&
85
+ node.property.type === AST_NODE_TYPES.Identifier &&
84
86
  node.property.name === 'includes'
85
87
  ) {
86
88
  let elements =
87
- node.object.type === 'ArrayExpression'
89
+ node.object.type === AST_NODE_TYPES.ArrayExpression
88
90
  ? node.object.elements
89
91
  : node.object.arguments
90
92
  sortArray({
@@ -149,7 +151,8 @@ function sortArray({ availableMessageIds, elements, context }) {
149
151
  return accumulator
150
152
  }
151
153
  let name = getNodeName({ sourceCode, element })
152
- let selector = element.type === 'SpreadElement' ? 'spread' : 'literal'
154
+ let selector =
155
+ element.type === AST_NODE_TYPES.SpreadElement ? 'spread' : 'literal'
153
156
  let predefinedGroups = generatePredefinedGroups({
154
157
  cache: cachedGroupsByModifiersAndSelectors,
155
158
  selectors: [selector],
@@ -214,7 +217,7 @@ function sortArray({ availableMessageIds, elements, context }) {
214
217
  })
215
218
  }
216
219
  function getNodeName({ sourceCode, element }) {
217
- return element.type === 'Literal'
220
+ return element.type === AST_NODE_TYPES.Literal
218
221
  ? `${element.value}`
219
222
  : sourceCode.getText(element)
220
223
  }
@@ -0,0 +1,24 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { RegexOption } from '../../types/common-options.js'
3
+ /**
4
+ * Computes the dependencies of a class member AST node.
5
+ *
6
+ * @param params - Parameters object.
7
+ * @param params.ignoreCallbackDependenciesPatterns - Patterns to ignore
8
+ * callback dependencies.
9
+ * @param params.isMemberStatic - Indicates if the member is static.
10
+ * @param params.expression - The AST node expression to analyze.
11
+ * @param params.className - The name of the class, if available.
12
+ * @returns The names of the dependencies.
13
+ */
14
+ export declare function computeDependencies({
15
+ ignoreCallbackDependenciesPatterns,
16
+ isMemberStatic,
17
+ expression,
18
+ className,
19
+ }: {
20
+ expression: TSESTree.StaticBlock | TSESTree.Expression
21
+ ignoreCallbackDependenciesPatterns: RegexOption
22
+ className: undefined | string
23
+ isMemberStatic: boolean
24
+ }): string[]
@@ -0,0 +1,147 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ import { computeIdentifierNameDetails } from './compute-identifier-name-details.js'
3
+ import { computeDependencyName } from './compute-dependency-name.js'
4
+ import { matches } from '../../utils/matches.js'
5
+ function computeDependencies({
6
+ ignoreCallbackDependenciesPatterns,
7
+ isMemberStatic,
8
+ expression,
9
+ className,
10
+ }) {
11
+ let dependencies = []
12
+ function checkNode(nodeValue) {
13
+ switch (nodeValue.type) {
14
+ case AST_NODE_TYPES.ConditionalExpression:
15
+ traverseNode(nodeValue.test)
16
+ traverseNode(nodeValue.consequent)
17
+ traverseNode(nodeValue.alternate)
18
+ break
19
+ case AST_NODE_TYPES.MemberExpression:
20
+ dependencies = [
21
+ ...dependencies,
22
+ ...computeMemberExpressionDependencies({
23
+ memberExpression: nodeValue,
24
+ isMemberStatic,
25
+ className,
26
+ }),
27
+ ]
28
+ break
29
+ case AST_NODE_TYPES.CallExpression:
30
+ if (!('name' in nodeValue.callee)) {
31
+ traverseNode(nodeValue.arguments)
32
+ break
33
+ }
34
+ if (
35
+ matches(nodeValue.callee.name, ignoreCallbackDependenciesPatterns)
36
+ ) {
37
+ break
38
+ }
39
+ traverseNode(nodeValue.arguments)
40
+ break
41
+ case AST_NODE_TYPES.NewExpression:
42
+ traverseNode(nodeValue.arguments)
43
+ break
44
+ case AST_NODE_TYPES.Property:
45
+ traverseNode(nodeValue.key)
46
+ traverseNode(nodeValue.value)
47
+ break
48
+ }
49
+ if ('argument' in nodeValue && nodeValue.argument) {
50
+ traverseNode(nodeValue.argument)
51
+ }
52
+ if ('body' in nodeValue && nodeValue.body) {
53
+ traverseNode(nodeValue.body)
54
+ }
55
+ if ('callee' in nodeValue) {
56
+ traverseNode(nodeValue.callee)
57
+ }
58
+ if ('declarations' in nodeValue) {
59
+ traverseNode(nodeValue.declarations)
60
+ }
61
+ if ('elements' in nodeValue) {
62
+ let elements = nodeValue.elements.filter(
63
+ currentNode => currentNode !== null,
64
+ )
65
+ traverseNode(elements)
66
+ }
67
+ if (
68
+ 'expression' in nodeValue &&
69
+ typeof nodeValue.expression !== 'boolean'
70
+ ) {
71
+ traverseNode(nodeValue.expression)
72
+ }
73
+ if ('expressions' in nodeValue) {
74
+ traverseNode(nodeValue.expressions)
75
+ }
76
+ if ('init' in nodeValue && nodeValue.init) {
77
+ traverseNode(nodeValue.init)
78
+ }
79
+ if ('left' in nodeValue) {
80
+ traverseNode(nodeValue.left)
81
+ }
82
+ if ('object' in nodeValue) {
83
+ traverseNode(nodeValue.object)
84
+ }
85
+ if ('properties' in nodeValue) {
86
+ traverseNode(nodeValue.properties)
87
+ }
88
+ if ('right' in nodeValue) {
89
+ traverseNode(nodeValue.right)
90
+ }
91
+ }
92
+ function traverseNode(nodeValue) {
93
+ if (Array.isArray(nodeValue)) {
94
+ for (let nodeItem of nodeValue) {
95
+ traverseNode(nodeItem)
96
+ }
97
+ } else {
98
+ checkNode(nodeValue)
99
+ }
100
+ }
101
+ traverseNode(expression)
102
+ return dependencies
103
+ }
104
+ function computeMemberExpressionDependencies({
105
+ memberExpression,
106
+ isMemberStatic,
107
+ className,
108
+ }) {
109
+ switch (memberExpression.object.type) {
110
+ case AST_NODE_TYPES.ThisExpression:
111
+ return computeIdentifierOrThisExpressionDependencies()
112
+ case AST_NODE_TYPES.Identifier:
113
+ return memberExpression.object.name === className
114
+ ? computeIdentifierOrThisExpressionDependencies()
115
+ : []
116
+ default:
117
+ return []
118
+ }
119
+ function computeIdentifierOrThisExpressionDependencies() {
120
+ let dependency = computeDependencyFromProperty()
121
+ if (!dependency) {
122
+ return []
123
+ }
124
+ return [dependency]
125
+ }
126
+ function computeDependencyFromProperty() {
127
+ switch (memberExpression.property.type) {
128
+ case AST_NODE_TYPES.PrivateIdentifier:
129
+ case AST_NODE_TYPES.Identifier:
130
+ case AST_NODE_TYPES.Literal: {
131
+ let { nameWithoutStartingHash, hasPrivateHash } =
132
+ computeIdentifierNameDetails(memberExpression.property)
133
+ return computeDependencyName({
134
+ isStatic:
135
+ isMemberStatic ||
136
+ memberExpression.object.type === AST_NODE_TYPES.Identifier,
137
+ nodeNameWithoutStartingHash: nameWithoutStartingHash,
138
+ hasPrivateHash,
139
+ })
140
+ }
141
+ /* v8 ignore next 2 -- @preserve Unhandled cases */
142
+ default:
143
+ return null
144
+ }
145
+ }
146
+ }
147
+ export { computeDependencies }
@@ -0,0 +1,9 @@
1
+ export declare function computeDependencyName({
2
+ nodeNameWithoutStartingHash,
3
+ hasPrivateHash,
4
+ isStatic,
5
+ }: {
6
+ nodeNameWithoutStartingHash: string
7
+ hasPrivateHash: boolean
8
+ isStatic: boolean
9
+ }): string
@@ -0,0 +1,8 @@
1
+ function computeDependencyName({
2
+ nodeNameWithoutStartingHash,
3
+ hasPrivateHash,
4
+ isStatic,
5
+ }) {
6
+ return `${isStatic ? 'static ' : ''}${hasPrivateHash ? '#' : ''}${nodeNameWithoutStartingHash}`
7
+ }
8
+ export { computeDependencyName }
@@ -0,0 +1,16 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ export interface NodeNameDetails {
3
+ nameWithoutStartingHash: string
4
+ hasPrivateHash: boolean
5
+ name: string
6
+ }
7
+ /**
8
+ * Computes the name details of an identifier.
9
+ *
10
+ * @param node - The node to compute the name details for.
11
+ * @returns An object containing the name, whether it has a private hash, and
12
+ * the name without the starting hash.
13
+ */
14
+ export declare function computeIdentifierNameDetails(
15
+ node: TSESTree.PrivateIdentifier | TSESTree.Identifier | TSESTree.Literal,
16
+ ): NodeNameDetails
@@ -0,0 +1,27 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ import { UnreachableCaseError } from '../../utils/unreachable-case-error.js'
3
+ function computeIdentifierNameDetails(node) {
4
+ switch (node.type) {
5
+ case AST_NODE_TYPES.PrivateIdentifier:
6
+ return {
7
+ nameWithoutStartingHash: node.name,
8
+ name: `#${node.name}`,
9
+ hasPrivateHash: true,
10
+ }
11
+ case AST_NODE_TYPES.Identifier:
12
+ return buildNonPrivateHashDetails(node.name)
13
+ case AST_NODE_TYPES.Literal:
14
+ return buildNonPrivateHashDetails(`${node.value}`)
15
+ /* v8 ignore next 2 -- @preserve Exhaustive guard. */
16
+ default:
17
+ throw new UnreachableCaseError(node)
18
+ }
19
+ }
20
+ function buildNonPrivateHashDetails(name) {
21
+ return {
22
+ nameWithoutStartingHash: name,
23
+ hasPrivateHash: false,
24
+ name,
25
+ }
26
+ }
27
+ export { computeIdentifierNameDetails }
@@ -1,16 +1,17 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
1
2
  import { isSortable } from '../../utils/is-sortable.js'
2
3
  function getOverloadSignatureGroups(members) {
3
4
  let methods = members
4
5
  .filter(
5
6
  member =>
6
- member.type === 'MethodDefinition' ||
7
- member.type === 'TSAbstractMethodDefinition',
7
+ member.type === AST_NODE_TYPES.MethodDefinition ||
8
+ member.type === AST_NODE_TYPES.TSAbstractMethodDefinition,
8
9
  )
9
10
  .filter(member => member.kind === 'method')
10
11
  let staticOverloadSignaturesByName = /* @__PURE__ */ new Map()
11
12
  let overloadSignaturesByName = /* @__PURE__ */ new Map()
12
13
  for (let method of methods) {
13
- if (method.key.type !== 'Identifier') {
14
+ if (method.key.type !== AST_NODE_TYPES.Identifier) {
14
15
  continue
15
16
  }
16
17
  let { name } = method.key
@@ -0,0 +1,39 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { Modifier } from '../types.js'
3
+ type Property =
4
+ | TSESTree.TSAbstractPropertyDefinition
5
+ | TSESTree.PropertyDefinition
6
+ type Accessor = TSESTree.TSAbstractAccessorProperty | TSESTree.AccessorProperty
7
+ type Method = TSESTree.TSAbstractMethodDefinition | TSESTree.MethodDefinition
8
+ export declare function computeAbstractModifier(
9
+ node: Accessor | Property | Method,
10
+ ): Modifier[]
11
+ export declare function computeAccessibilityModifier({
12
+ hasPrivateHash,
13
+ node,
14
+ }: {
15
+ node: Accessor | Property | Method
16
+ hasPrivateHash: boolean
17
+ }): Modifier[]
18
+ export declare function computeAsyncModifier(
19
+ node:
20
+ | TSESTree.TSEmptyBodyFunctionExpression
21
+ | TSESTree.ArrowFunctionExpression
22
+ | TSESTree.FunctionExpression,
23
+ ): Modifier[]
24
+ export declare function computeStaticModifier(
25
+ node: TSESTree.TSIndexSignature | Accessor | Property | Method,
26
+ ): Modifier[]
27
+ export declare function computeReadonlyModifier(
28
+ node: TSESTree.TSIndexSignature | Property,
29
+ ): Modifier[]
30
+ export declare function computeOverrideModifier(
31
+ node: Accessor | Property | Method,
32
+ ): Modifier[]
33
+ export declare function computeOptionalModifier(
34
+ node: Property | Method,
35
+ ): Modifier[]
36
+ export declare function computeDecoratedModifier(
37
+ isDecorated: boolean,
38
+ ): Modifier[]
39
+ export {}
@@ -0,0 +1,62 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ import { UnreachableCaseError } from '../../../utils/unreachable-case-error.js'
3
+ function computeAbstractModifier(node) {
4
+ switch (node.type) {
5
+ case AST_NODE_TYPES.TSAbstractPropertyDefinition:
6
+ case AST_NODE_TYPES.TSAbstractMethodDefinition:
7
+ case AST_NODE_TYPES.TSAbstractAccessorProperty:
8
+ return ['abstract']
9
+ case AST_NODE_TYPES.PropertyDefinition:
10
+ case AST_NODE_TYPES.MethodDefinition:
11
+ case AST_NODE_TYPES.AccessorProperty:
12
+ return []
13
+ /* v8 ignore next 2 -- @preserve Exhaustive guard. */
14
+ default:
15
+ throw new UnreachableCaseError(node)
16
+ }
17
+ }
18
+ function computeAccessibilityModifier({ hasPrivateHash, node }) {
19
+ if (hasPrivateHash) {
20
+ return ['private']
21
+ }
22
+ switch (node.accessibility) {
23
+ case 'protected':
24
+ return ['protected']
25
+ case 'private':
26
+ return ['private']
27
+ case void 0:
28
+ case 'public':
29
+ return ['public']
30
+ /* v8 ignore next 2 -- @preserve Exhaustive guard. */
31
+ default:
32
+ throw new UnreachableCaseError(node.accessibility)
33
+ }
34
+ }
35
+ function computeAsyncModifier(node) {
36
+ return node.async ? ['async'] : []
37
+ }
38
+ function computeStaticModifier(node) {
39
+ return node.static ? ['static'] : []
40
+ }
41
+ function computeReadonlyModifier(node) {
42
+ return node.readonly ? ['readonly'] : []
43
+ }
44
+ function computeOverrideModifier(node) {
45
+ return node.override ? ['override'] : []
46
+ }
47
+ function computeOptionalModifier(node) {
48
+ return node.optional ? ['optional'] : []
49
+ }
50
+ function computeDecoratedModifier(isDecorated) {
51
+ return isDecorated ? ['decorated'] : []
52
+ }
53
+ export {
54
+ computeAbstractModifier,
55
+ computeAccessibilityModifier,
56
+ computeAsyncModifier,
57
+ computeDecoratedModifier,
58
+ computeOptionalModifier,
59
+ computeOverrideModifier,
60
+ computeReadonlyModifier,
61
+ computeStaticModifier,
62
+ }
@@ -0,0 +1,26 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { TSESLint } from '@typescript-eslint/utils'
3
+ import { Modifier, Selector } from '../types.js'
4
+ /**
5
+ * Computes details related to an accessor property.
6
+ *
7
+ * @param params - Parameters object.
8
+ * @param params.isDecorated - Whether the accessor is decorated.
9
+ * @param params.sourceCode - The source code object.
10
+ * @param params.accessor - The accessor node to compute information for.
11
+ * @returns An object containing various details about the accessor.
12
+ */
13
+ export declare function computeAccessorDetails({
14
+ isDecorated,
15
+ sourceCode,
16
+ accessor,
17
+ }: {
18
+ accessor: TSESTree.TSAbstractAccessorProperty | TSESTree.AccessorProperty
19
+ sourceCode: TSESLint.SourceCode
20
+ isDecorated: boolean
21
+ }): {
22
+ dependencyNames: string[]
23
+ modifiers: Modifier[]
24
+ selectors: Selector[]
25
+ name: string
26
+ }
@@ -0,0 +1,43 @@
1
+ import {
2
+ computeStaticModifier,
3
+ computeAbstractModifier,
4
+ computeDecoratedModifier,
5
+ computeOverrideModifier,
6
+ computeAccessibilityModifier,
7
+ } from './common-modifiers.js'
8
+ import { computeMethodOrPropertyNameDetails } from './compute-method-or-property-name-details.js'
9
+ import { computeDependencyName } from '../compute-dependency-name.js'
10
+ function computeAccessorDetails({ isDecorated, sourceCode, accessor }) {
11
+ let { nameWithoutStartingHash, hasPrivateHash, name } =
12
+ computeMethodOrPropertyNameDetails(accessor, sourceCode)
13
+ let modifiers = computeModifiers({
14
+ hasPrivateHash,
15
+ isDecorated,
16
+ accessor,
17
+ })
18
+ return {
19
+ dependencyNames: [
20
+ computeDependencyName({
21
+ nodeNameWithoutStartingHash: nameWithoutStartingHash,
22
+ isStatic: modifiers.includes('static'),
23
+ hasPrivateHash,
24
+ }),
25
+ ],
26
+ selectors: ['accessor-property'],
27
+ modifiers,
28
+ name,
29
+ }
30
+ }
31
+ function computeModifiers({ hasPrivateHash, isDecorated, accessor }) {
32
+ return [
33
+ ...computeStaticModifier(accessor),
34
+ ...computeAbstractModifier(accessor),
35
+ ...computeDecoratedModifier(isDecorated),
36
+ ...computeOverrideModifier(accessor),
37
+ ...computeAccessibilityModifier({
38
+ hasPrivateHash,
39
+ node: accessor,
40
+ }),
41
+ ]
42
+ }
43
+ export { computeAccessorDetails }
@@ -0,0 +1,23 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { TSESLint } from '@typescript-eslint/utils'
3
+ import { Modifier, Selector } from '../types.js'
4
+ /**
5
+ * Computes details related to an index-signature.
6
+ *
7
+ * @param params - Parameters object.
8
+ * @param params.indexSignature - The index signature node to compute
9
+ * information for.
10
+ * @param params.sourceCode - The source code object.
11
+ * @returns An object containing various details about the index-signature.
12
+ */
13
+ export declare function computeIndexSignatureDetails({
14
+ indexSignature,
15
+ sourceCode,
16
+ }: {
17
+ indexSignature: TSESTree.TSIndexSignature
18
+ sourceCode: TSESLint.SourceCode
19
+ }): {
20
+ modifiers: Modifier[]
21
+ selectors: Selector[]
22
+ name: string
23
+ }
@@ -0,0 +1,21 @@
1
+ import {
2
+ computeStaticModifier,
3
+ computeReadonlyModifier,
4
+ } from './common-modifiers.js'
5
+ function computeIndexSignatureDetails({ indexSignature, sourceCode }) {
6
+ return {
7
+ name: sourceCode.text.slice(
8
+ indexSignature.range.at(0),
9
+ indexSignature.typeAnnotation?.range.at(0) ?? indexSignature.range.at(1),
10
+ ),
11
+ modifiers: computeModifiers(indexSignature),
12
+ selectors: ['index-signature'],
13
+ }
14
+ }
15
+ function computeModifiers(indexSignature) {
16
+ return [
17
+ ...computeStaticModifier(indexSignature),
18
+ ...computeReadonlyModifier(indexSignature),
19
+ ]
20
+ }
21
+ export { computeIndexSignatureDetails }