eslint-plugin-perfectionist 5.2.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 (127) hide show
  1. package/dist/package.json.js +1 -1
  2. package/dist/rules/sort-array-includes/types.d.ts +15 -18
  3. package/dist/rules/sort-array-includes/types.js +2 -2
  4. package/dist/rules/sort-array-includes.js +13 -10
  5. package/dist/rules/sort-classes/compute-dependencies.d.ts +24 -0
  6. package/dist/rules/sort-classes/compute-dependencies.js +147 -0
  7. package/dist/rules/sort-classes/compute-dependency-name.d.ts +9 -0
  8. package/dist/rules/sort-classes/compute-dependency-name.js +8 -0
  9. package/dist/rules/sort-classes/compute-identifier-name-details.d.ts +16 -0
  10. package/dist/rules/sort-classes/compute-identifier-name-details.js +27 -0
  11. package/dist/rules/sort-classes/get-overload-signature-groups.js +4 -3
  12. package/dist/rules/sort-classes/node-info/common-modifiers.d.ts +39 -0
  13. package/dist/rules/sort-classes/node-info/common-modifiers.js +62 -0
  14. package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +26 -0
  15. package/dist/rules/sort-classes/node-info/compute-accessor-details.js +43 -0
  16. package/dist/rules/sort-classes/node-info/compute-index-signature-details.d.ts +23 -0
  17. package/dist/rules/sort-classes/node-info/compute-index-signature-details.js +21 -0
  18. package/dist/rules/sort-classes/node-info/compute-method-details.d.ts +29 -0
  19. package/dist/rules/sort-classes/node-info/compute-method-details.js +80 -0
  20. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.d.ts +21 -0
  21. package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.js +17 -0
  22. package/dist/rules/sort-classes/node-info/compute-property-details.d.ts +36 -0
  23. package/dist/rules/sort-classes/node-info/compute-property-details.js +109 -0
  24. package/dist/rules/sort-classes/node-info/compute-static-block-details.d.ts +26 -0
  25. package/dist/rules/sort-classes/node-info/compute-static-block-details.js +18 -0
  26. package/dist/rules/sort-classes/types.d.ts +15 -18
  27. package/dist/rules/sort-classes/types.js +6 -2
  28. package/dist/rules/sort-classes.js +79 -291
  29. package/dist/rules/sort-decorators/types.d.ts +10 -12
  30. package/dist/rules/sort-decorators.js +57 -56
  31. package/dist/rules/sort-enums/build-comparator-by-options-computer.js +6 -0
  32. package/dist/rules/sort-enums/types.d.ts +16 -19
  33. package/dist/rules/sort-enums/types.js +2 -2
  34. package/dist/rules/sort-enums.js +13 -11
  35. package/dist/rules/sort-export-attributes/types.d.ts +6 -8
  36. package/dist/rules/sort-export-attributes.js +2 -1
  37. package/dist/rules/sort-exports/types.d.ts +11 -10
  38. package/dist/rules/sort-exports/types.js +6 -2
  39. package/dist/rules/sort-exports.js +7 -6
  40. package/dist/rules/sort-heritage-clauses/types.d.ts +6 -8
  41. package/dist/rules/sort-heritage-clauses.js +2 -1
  42. package/dist/rules/sort-import-attributes/types.d.ts +6 -8
  43. package/dist/rules/sort-import-attributes.js +2 -1
  44. package/dist/rules/sort-imports/comparator-by-options-computer.js +5 -0
  45. package/dist/rules/sort-imports/compute-specifier-modifiers.js +1 -1
  46. package/dist/rules/sort-imports/is-non-external-reference-ts-import-equals.js +1 -1
  47. package/dist/rules/sort-imports/is-side-effect-import.js +1 -1
  48. package/dist/rules/sort-imports/types.d.ts +18 -24
  49. package/dist/rules/sort-imports/types.js +9 -6
  50. package/dist/rules/sort-imports.js +25 -17
  51. package/dist/rules/sort-jsx-props/types.d.ts +18 -18
  52. package/dist/rules/sort-jsx-props/types.js +6 -2
  53. package/dist/rules/sort-jsx-props.js +14 -7
  54. package/dist/rules/sort-maps/types.d.ts +10 -16
  55. package/dist/rules/sort-maps.js +11 -6
  56. package/dist/rules/sort-modules/build-comparator-by-options-computer.js +2 -0
  57. package/dist/rules/sort-modules/compute-dependencies.d.ts +2 -5
  58. package/dist/rules/sort-modules/compute-dependencies.js +3 -0
  59. package/dist/rules/sort-modules/compute-node-details.d.ts +38 -0
  60. package/dist/rules/sort-modules/compute-node-details.js +127 -0
  61. package/dist/rules/sort-modules/is-arrow-function-node.js +1 -1
  62. package/dist/rules/sort-modules/is-property-or-accessor-node.js +1 -1
  63. package/dist/rules/sort-modules/types.d.ts +24 -17
  64. package/dist/rules/sort-modules/types.js +2 -2
  65. package/dist/rules/sort-modules.js +72 -141
  66. package/dist/rules/sort-named-exports/compute-node-name.js +1 -1
  67. package/dist/rules/sort-named-exports/types.d.ts +16 -16
  68. package/dist/rules/sort-named-exports/types.js +6 -2
  69. package/dist/rules/sort-named-exports.js +6 -5
  70. package/dist/rules/sort-named-imports/compute-node-name.js +1 -1
  71. package/dist/rules/sort-named-imports/types.d.ts +16 -17
  72. package/dist/rules/sort-named-imports/types.js +6 -2
  73. package/dist/rules/sort-named-imports.js +7 -6
  74. package/dist/rules/sort-object-types/comparator-by-options-computer.js +3 -0
  75. package/dist/rules/sort-object-types/is-member-optional.js +1 -1
  76. package/dist/rules/sort-object-types/is-node-function-type.js +20 -0
  77. package/dist/rules/sort-object-types/types.d.ts +21 -34
  78. package/dist/rules/sort-object-types/types.js +9 -6
  79. package/dist/rules/sort-object-types.js +7 -6
  80. package/dist/rules/sort-objects/types.d.ts +17 -21
  81. package/dist/rules/sort-objects/types.js +3 -3
  82. package/dist/rules/sort-objects.js +5 -3
  83. package/dist/rules/sort-sets.js +5 -4
  84. package/dist/rules/sort-switch-case.js +6 -4
  85. package/dist/rules/sort-union-types/types.d.ts +12 -12
  86. package/dist/rules/sort-union-types/types.js +2 -2
  87. package/dist/rules/sort-union-types.js +37 -35
  88. package/dist/rules/sort-variable-declarations/types.d.ts +12 -13
  89. package/dist/rules/sort-variable-declarations/types.js +2 -2
  90. package/dist/rules/sort-variable-declarations.js +14 -12
  91. package/dist/types/all-common-options.d.ts +14 -0
  92. package/dist/types/common-groups-options.d.ts +73 -95
  93. package/dist/types/common-options.d.ts +60 -55
  94. package/dist/utils/build-default-options-by-group-index-computer.d.ts +1 -1
  95. package/dist/utils/compare/build-string-formatter.d.ts +4 -5
  96. package/dist/utils/compare/build-subgroup-order-comparator.d.ts +10 -0
  97. package/dist/utils/compare/build-subgroup-order-comparator.js +49 -0
  98. package/dist/utils/compare/default-comparator-by-options-computer.d.ts +4 -1
  99. package/dist/utils/compare/default-comparator-by-options-computer.js +9 -0
  100. package/dist/utils/compute-group.d.ts +9 -9
  101. package/dist/utils/compute-overridden-options-by-group-index.d.ts +1 -1
  102. package/dist/utils/does-custom-group-match.d.ts +6 -4
  103. package/dist/utils/get-comment-above-that-should-exist.d.ts +1 -1
  104. package/dist/utils/get-newlines-between-errors.d.ts +1 -1
  105. package/dist/utils/get-newlines-between-option.d.ts +1 -7
  106. package/dist/utils/get-node-range.d.ts +2 -9
  107. package/dist/utils/get-settings.d.ts +1 -1
  108. package/dist/utils/is-group-with-overrides-option.d.ts +3 -6
  109. package/dist/utils/json-schemas/common-groups-json-schemas.d.ts +6 -6
  110. package/dist/utils/json-schemas/common-groups-json-schemas.js +12 -10
  111. package/dist/utils/json-schemas/common-json-schemas.d.ts +5 -5
  112. package/dist/utils/json-schemas/common-json-schemas.js +13 -12
  113. package/dist/utils/make-comment-above-fixes.d.ts +1 -1
  114. package/dist/utils/make-fixes.d.ts +3 -5
  115. package/dist/utils/make-newlines-between-fixes.d.ts +1 -1
  116. package/dist/utils/make-order-fixes.d.ts +2 -5
  117. package/dist/utils/report-all-errors.d.ts +19 -17
  118. package/dist/utils/report-errors.d.ts +3 -1
  119. package/dist/utils/should-partition.d.ts +2 -5
  120. package/dist/utils/validate-custom-sort-configuration.d.ts +1 -1
  121. package/dist/utils/validate-groups-configuration.d.ts +1 -1
  122. package/dist/utils/validate-newlines-and-partition-configuration.d.ts +1 -1
  123. package/package.json +2 -2
  124. package/readme.md +1 -1
  125. package/dist/types/join.d.ts +0 -19
  126. package/dist/utils/is-node-function-type.js +0 -13
  127. /package/dist/{utils → rules/sort-object-types}/is-node-function-type.d.ts +0 -0
@@ -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-jsx-props rule.
11
6
  *
@@ -30,13 +25,14 @@ export type Options = Partial<
30
25
  */
31
26
  tagMatchesPattern?: RegexOption
32
27
  }
33
- } & CommonGroupsOptions<
34
- SingleCustomGroup,
35
- Record<string, never>,
36
- TypeOption
37
- > &
38
- Pick<CommonPartitionOptions, 'partitionByNewLine'> &
39
- CommonOptions<TypeOption>
28
+ } & Omit<
29
+ AllCommonOptions<
30
+ TypeOption,
31
+ AdditionalSortOptions,
32
+ CustomGroupMatchOptions
33
+ >,
34
+ 'partitionByComment'
35
+ >
40
36
  >[]
41
37
  /**
42
38
  * Union type of all available JSX prop modifiers. Used to identify specific
@@ -57,7 +53,7 @@ export type Selector = (typeof allSelectors)[number]
57
53
  * "modifiers": ["shorthand"]
58
54
  * }
59
55
  */
60
- interface SingleCustomGroup {
56
+ interface CustomGroupMatchOptions {
61
57
  /**
62
58
  * Regular expression pattern to match prop values. Props with values
63
59
  * matching this pattern will be included in this custom group.
@@ -75,6 +71,7 @@ interface SingleCustomGroup {
75
71
  */
76
72
  selector?: Selector
77
73
  }
74
+ type AdditionalSortOptions = object
78
75
  /**
79
76
  * Complete list of available JSX prop selectors. Used for validation and JSON
80
77
  * schema generation.
@@ -86,8 +83,11 @@ export declare let allSelectors: readonly ['prop']
86
83
  */
87
84
  export declare let allModifiers: readonly ['shorthand', 'multiline']
88
85
  /**
89
- * JSON schema definition for validating single custom group configurations.
90
- * Used by ESLint to validate rule options at configuration time.
86
+ * Additional custom group match options JSON schema. Used by ESLint to validate
87
+ * rule options at configuration time.
91
88
  */
92
- export declare let singleCustomGroupJsonSchema: Record<string, JSONSchema4>
89
+ export declare let additionalCustomGroupMatchOptionsJsonSchema: Record<
90
+ string,
91
+ JSONSchema4
92
+ >
93
93
  export {}
@@ -5,9 +5,13 @@ import {
5
5
  import { buildRegexJsonSchema } from '../../utils/json-schemas/common-json-schemas.js'
6
6
  let allSelectors = ['prop']
7
7
  let allModifiers = ['shorthand', 'multiline']
8
- let singleCustomGroupJsonSchema = {
8
+ let additionalCustomGroupMatchOptionsJsonSchema = {
9
9
  modifiers: buildCustomGroupModifiersJsonSchema(allModifiers),
10
10
  selector: buildCustomGroupSelectorJsonSchema(allSelectors),
11
11
  elementValuePattern: buildRegexJsonSchema(),
12
12
  }
13
- export { allModifiers, allSelectors, singleCustomGroupJsonSchema }
13
+ export {
14
+ additionalCustomGroupMatchOptionsJsonSchema,
15
+ allModifiers,
16
+ allSelectors,
17
+ }
@@ -10,14 +10,14 @@ import {
10
10
  EXTRA_SPACING_ERROR,
11
11
  MISSED_SPACING_ERROR,
12
12
  } from '../utils/report-errors.js'
13
- import { validateNewlinesAndPartitionConfiguration } from '../utils/validate-newlines-and-partition-configuration.js'
14
- import { buildDefaultOptionsByGroupIndexComputer } from '../utils/build-default-options-by-group-index-computer.js'
15
- import { defaultComparatorByOptionsComputer } from '../utils/compare/default-comparator-by-options-computer.js'
16
13
  import {
17
- singleCustomGroupJsonSchema,
14
+ additionalCustomGroupMatchOptionsJsonSchema,
18
15
  allSelectors,
19
16
  allModifiers,
20
17
  } from './sort-jsx-props/types.js'
18
+ import { validateNewlinesAndPartitionConfiguration } from '../utils/validate-newlines-and-partition-configuration.js'
19
+ import { buildDefaultOptionsByGroupIndexComputer } from '../utils/build-default-options-by-group-index-computer.js'
20
+ import { defaultComparatorByOptionsComputer } from '../utils/compare/default-comparator-by-options-computer.js'
21
21
  import { partitionByNewLineJsonSchema } from '../utils/json-schemas/common-partition-json-schemas.js'
22
22
  import { buildCommonGroupsJsonSchemas } from '../utils/json-schemas/common-groups-json-schemas.js'
23
23
  import { validateCustomSortConfiguration } from '../utils/validate-custom-sort-configuration.js'
@@ -131,10 +131,13 @@ const sortJsxProps = createEslintRule({
131
131
  let lastSortingNode = accumulator.at(-1)?.at(-1)
132
132
  if (
133
133
  shouldPartition({
134
+ options: {
135
+ partitionByNewLine: options.partitionByNewLine,
136
+ partitionByComment: false,
137
+ },
134
138
  lastSortingNode,
135
139
  sortingNode,
136
140
  sourceCode,
137
- options,
138
141
  })
139
142
  ) {
140
143
  accumulator.push([])
@@ -169,8 +172,11 @@ const sortJsxProps = createEslintRule({
169
172
  },
170
173
  sortNodesExcludingEslintDisabled:
171
174
  createSortNodesExcludingEslintDisabled(currentNodes),
175
+ options: {
176
+ ...options,
177
+ partitionByComment: false,
178
+ },
172
179
  nodes: currentNodes,
173
- options,
174
180
  context,
175
181
  })
176
182
  }
@@ -182,7 +188,8 @@ const sortJsxProps = createEslintRule({
182
188
  properties: {
183
189
  ...buildCommonJsonSchemas(),
184
190
  ...buildCommonGroupsJsonSchemas({
185
- singleCustomGroupJsonSchema,
191
+ additionalCustomGroupMatchProperties:
192
+ additionalCustomGroupMatchOptionsJsonSchema,
186
193
  }),
187
194
  useConfigurationIf: buildUseConfigurationIfJsonSchema({
188
195
  additionalProperties: {
@@ -1,10 +1,5 @@
1
- import {
2
- CommonOptions,
3
- RegexOption,
4
- TypeOption,
5
- } from '../../types/common-options.js'
6
- import { CommonPartitionOptions } from '../../types/common-partition-options.js'
7
- import { CommonGroupsOptions } from '../../types/common-groups-options.js'
1
+ import { RegexOption, TypeOption } from '../../types/common-options.js'
2
+ import { AllCommonOptions } from '../../types/all-common-options.js'
8
3
  /**
9
4
  * Configuration options for the sort-maps rule.
10
5
  *
@@ -24,14 +19,13 @@ export type Options = Partial<
24
19
  */
25
20
  allNamesMatchPattern?: RegexOption
26
21
  }
27
- } & CommonGroupsOptions<
28
- SingleCustomGroup,
29
- Record<string, never>,
30
- TypeOption
31
- > &
32
- CommonOptions<TypeOption> &
33
- CommonPartitionOptions
22
+ } & AllCommonOptions<
23
+ TypeOption,
24
+ AdditionalSortOptions,
25
+ CustomGroupMatchOptions
26
+ >
34
27
  >[]
35
- /** Additional configuration for a single custom group. */
36
- type SingleCustomGroup = Record<string, never>
28
+ /** Match options for a custom group. */
29
+ type CustomGroupMatchOptions = object
30
+ type AdditionalSortOptions = object
37
31
  export {}
@@ -1,3 +1,4 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
1
2
  import {
2
3
  partitionByNewLineJsonSchema,
3
4
  partitionByCommentJsonSchema,
@@ -54,10 +55,10 @@ const sortMaps = createEslintRule({
54
55
  create: context => ({
55
56
  NewExpression: node => {
56
57
  if (
57
- node.callee.type !== 'Identifier' ||
58
+ node.callee.type !== AST_NODE_TYPES.Identifier ||
58
59
  node.callee.name !== 'Map' ||
59
60
  node.arguments.length === 0 ||
60
- node.arguments[0]?.type !== 'ArrayExpression'
61
+ node.arguments[0]?.type !== AST_NODE_TYPES.ArrayExpression
61
62
  ) {
62
63
  return
63
64
  }
@@ -70,7 +71,8 @@ const sortMaps = createEslintRule({
70
71
  let matchedContextOptions = filterOptionsByAllNamesMatch({
71
72
  nodeNames: elements
72
73
  .filter(
73
- element => element !== null && element.type !== 'SpreadElement',
74
+ element =>
75
+ element !== null && element.type !== AST_NODE_TYPES.SpreadElement,
74
76
  )
75
77
  .map(element => getNodeName({ sourceCode, element })),
76
78
  contextOptions: context.options,
@@ -88,7 +90,10 @@ const sortMaps = createEslintRule({
88
90
  })
89
91
  let parts = elements.reduce(
90
92
  (accumulator, element) => {
91
- if (element === null || element.type === 'SpreadElement') {
93
+ if (
94
+ element === null ||
95
+ element.type === AST_NODE_TYPES.SpreadElement
96
+ ) {
92
97
  accumulator.push([])
93
98
  } else {
94
99
  accumulator.at(-1).push(element)
@@ -205,11 +210,11 @@ const sortMaps = createEslintRule({
205
210
  name: 'sort-maps',
206
211
  })
207
212
  function getNodeName({ sourceCode, element }) {
208
- if (element.type === 'ArrayExpression') {
213
+ if (element.type === AST_NODE_TYPES.ArrayExpression) {
209
214
  let [left] = element.elements
210
215
  if (!left) {
211
216
  return `${left}`
212
- } else if (left.type === 'Literal') {
217
+ } else if (left.type === AST_NODE_TYPES.Literal) {
213
218
  return left.raw
214
219
  }
215
220
  return sourceCode.getText(left)
@@ -9,6 +9,8 @@ function buildComparatorByOptionsComputer({
9
9
  }) {
10
10
  return options => {
11
11
  switch (options.type) {
12
+ /* v8 ignore next -- @preserve Untested for now as not a relevant sort for this rule. */
13
+ case 'subgroup-order':
12
14
  case 'alphabetical':
13
15
  case 'line-length':
14
16
  case 'unsorted':
@@ -1,4 +1,4 @@
1
- import { TSESTree } from '@typescript-eslint/types'
1
+ import { SortModulesNode } from './types.js'
2
2
  interface HardDependencyDetection {
3
3
  searchStaticMethodsAndFunctionProperties: boolean
4
4
  type: 'hard'
@@ -18,10 +18,7 @@ type DependencyDetection = HardDependencyDetection | SoftDependencyDetection
18
18
  * @returns The names of the dependencies.
19
19
  */
20
20
  export declare function computeDependencies(
21
- node:
22
- | TSESTree.ClassDeclaration
23
- | TSESTree.ProgramStatement
24
- | TSESTree.TSEnumMember,
21
+ node: SortModulesNode,
25
22
  dependencyDetection: DependencyDetection,
26
23
  ): string[]
27
24
  export {}
@@ -89,6 +89,9 @@ function computeDependencies(node, dependencyDetection) {
89
89
  if ('properties' in nodeToCheck) {
90
90
  traverseNode(nodeToCheck.properties)
91
91
  }
92
+ if ('property' in nodeToCheck) {
93
+ checkNode(nodeToCheck.property)
94
+ }
92
95
  if ('right' in nodeToCheck) {
93
96
  checkNode(nodeToCheck.right)
94
97
  }
@@ -0,0 +1,38 @@
1
+ import { TSESTree } from '@typescript-eslint/types'
2
+ import { TSESLint } from '@typescript-eslint/utils'
3
+ import { SortModulesNode, Modifier, Selector } from './types.js'
4
+ interface ParsableNodeDetails {
5
+ nodeDetails: {
6
+ addSafetySemicolonWhenInline: boolean
7
+ dependencies: string[]
8
+ modifiers: Modifier[]
9
+ decorators: string[]
10
+ selector: Selector
11
+ name: string
12
+ }
13
+ shouldPartitionAfterNode?: never
14
+ moduleBlock?: never
15
+ }
16
+ interface NonParsableNodeDetails {
17
+ moduleBlock: TSESTree.TSModuleBlock | null
18
+ shouldPartitionAfterNode: boolean
19
+ nodeDetails?: never
20
+ }
21
+ type Details = NonParsableNodeDetails | ParsableNodeDetails
22
+ /**
23
+ * Compute details about a module-related node.
24
+ *
25
+ * @param params - The parameters object.
26
+ * @param params.sourceCode - The source code object.
27
+ * @param params.node - The AST node to compute details for.
28
+ * @returns The computed details about the node, such as whether it should be
29
+ * ignored, if a module block was found, and information about the node.
30
+ */
31
+ export declare function computeNodeDetails({
32
+ sourceCode,
33
+ node,
34
+ }: {
35
+ sourceCode: TSESLint.SourceCode
36
+ node: SortModulesNode
37
+ }): Details
38
+ export {}
@@ -0,0 +1,127 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
+ import { isPropertyOrAccessorNode } from './is-property-or-accessor-node.js'
3
+ import { getNodeDecorators } from '../../utils/get-node-decorators.js'
4
+ import { getDecoratorName } from '../../utils/get-decorator-name.js'
5
+ import { isArrowFunctionNode } from './is-arrow-function-node.js'
6
+ import { computeDependencies } from './compute-dependencies.js'
7
+ function computeNodeDetails({ sourceCode, node }) {
8
+ let selector
9
+ let name
10
+ let modifiers = []
11
+ let dependencies = []
12
+ let decorators = []
13
+ let addSafetySemicolonWhenInline = false
14
+ let moduleBlock = null
15
+ let shouldPartitionAfterNode = false
16
+ let ignoredDueToDecoratorBeforeExportClass = false
17
+ let exportNode
18
+ parseNode(node)
19
+ if (!selector || !name || ignoredDueToDecoratorBeforeExportClass) {
20
+ return {
21
+ shouldPartitionAfterNode,
22
+ moduleBlock,
23
+ }
24
+ }
25
+ return {
26
+ nodeDetails: {
27
+ addSafetySemicolonWhenInline,
28
+ dependencies,
29
+ decorators,
30
+ modifiers,
31
+ selector,
32
+ name,
33
+ },
34
+ }
35
+ function parseNode(nodeToParse) {
36
+ if ('declare' in nodeToParse && nodeToParse.declare) {
37
+ modifiers.push('declare')
38
+ }
39
+ switch (nodeToParse.type) {
40
+ case AST_NODE_TYPES.ExportDefaultDeclaration:
41
+ exportNode = nodeToParse
42
+ modifiers.push('default', 'export')
43
+ parseNode(nodeToParse.declaration)
44
+ break
45
+ case AST_NODE_TYPES.ExportNamedDeclaration:
46
+ exportNode = nodeToParse
47
+ if (nodeToParse.declaration) {
48
+ parseNode(nodeToParse.declaration)
49
+ }
50
+ modifiers.push('export')
51
+ break
52
+ case AST_NODE_TYPES.TSInterfaceDeclaration:
53
+ selector = 'interface'
54
+ ;({ name } = nodeToParse.id)
55
+ break
56
+ case AST_NODE_TYPES.TSTypeAliasDeclaration:
57
+ selector = 'type'
58
+ ;({ name } = nodeToParse.id)
59
+ addSafetySemicolonWhenInline = true
60
+ break
61
+ case AST_NODE_TYPES.FunctionDeclaration:
62
+ case AST_NODE_TYPES.TSDeclareFunction:
63
+ selector = 'function'
64
+ if (nodeToParse.async) {
65
+ modifiers.push('async')
66
+ }
67
+ if (modifiers.includes('declare')) {
68
+ addSafetySemicolonWhenInline = true
69
+ }
70
+ name = nodeToParse.id?.name
71
+ break
72
+ case AST_NODE_TYPES.TSModuleDeclaration:
73
+ shouldPartitionAfterNode = true
74
+ moduleBlock = nodeToParse.body ?? null
75
+ break
76
+ case AST_NODE_TYPES.VariableDeclaration:
77
+ shouldPartitionAfterNode = true
78
+ break
79
+ case AST_NODE_TYPES.TSEnumDeclaration:
80
+ selector = 'enum'
81
+ ;({ name } = nodeToParse.id)
82
+ dependencies = [...dependencies, ...extractDependencies(nodeToParse)]
83
+ break
84
+ case AST_NODE_TYPES.ClassDeclaration:
85
+ selector = 'class'
86
+ name = nodeToParse.id?.name
87
+ let nodeDecorators = getNodeDecorators(nodeToParse)
88
+ if (nodeDecorators[0]) {
89
+ modifiers.push('decorated')
90
+ ignoredDueToDecoratorBeforeExportClass = isExportAfterDecorators({
91
+ firstDecorator: nodeDecorators[0],
92
+ exportNode,
93
+ })
94
+ }
95
+ decorators = nodeDecorators.map(decorator =>
96
+ getDecoratorName({
97
+ sourceCode,
98
+ decorator,
99
+ }),
100
+ )
101
+ dependencies = [...dependencies, ...extractDependencies(nodeToParse)]
102
+ break
103
+ }
104
+ }
105
+ }
106
+ function extractDependencies(expression) {
107
+ let searchStaticMethodsAndFunctionProperties =
108
+ expression.type === AST_NODE_TYPES.ClassDeclaration &&
109
+ expression.body.body.some(
110
+ classElement =>
111
+ classElement.type === AST_NODE_TYPES.StaticBlock ||
112
+ (classElement.static &&
113
+ isPropertyOrAccessorNode(classElement) &&
114
+ !isArrowFunctionNode(classElement)),
115
+ )
116
+ return computeDependencies(expression, {
117
+ searchStaticMethodsAndFunctionProperties,
118
+ type: 'hard',
119
+ })
120
+ }
121
+ function isExportAfterDecorators({ firstDecorator, exportNode }) {
122
+ if (!exportNode) {
123
+ return false
124
+ }
125
+ return exportNode.range[0] > firstDecorator.range[0]
126
+ }
127
+ export { computeNodeDetails }
@@ -1,4 +1,4 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/types'
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
2
  import { isPropertyOrAccessorNode } from './is-property-or-accessor-node.js'
3
3
  function isArrowFunctionNode(node) {
4
4
  return (
@@ -1,4 +1,4 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/types'
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils'
2
2
  function isPropertyOrAccessorNode(node) {
3
3
  return (
4
4
  node.type === AST_NODE_TYPES.PropertyDefinition ||
@@ -1,13 +1,18 @@
1
1
  import { JSONSchema4 } from '@typescript-eslint/utils/json-schema'
2
2
  import { TSESTree } from '@typescript-eslint/types'
3
- import {
4
- CommonOptions,
5
- RegexOption,
6
- TypeOption,
7
- } from '../../types/common-options.js'
8
3
  import { SortingNodeWithDependencies } from '../../utils/sort-nodes-by-dependencies.js'
9
- import { CommonPartitionOptions } from '../../types/common-partition-options.js'
10
- import { CommonGroupsOptions } from '../../types/common-groups-options.js'
4
+ import { RegexOption, TypeOption } from '../../types/common-options.js'
5
+ import { AllCommonOptions } from '../../types/all-common-options.js'
6
+ export type SortModulesNode =
7
+ | TSESTree.ExportDefaultDeclaration
8
+ | TSESTree.ExportNamedDeclaration
9
+ | TSESTree.TSInterfaceDeclaration
10
+ | TSESTree.TSTypeAliasDeclaration
11
+ | TSESTree.FunctionDeclaration
12
+ | TSESTree.TSModuleDeclaration
13
+ | TSESTree.TSDeclareFunction
14
+ | TSESTree.TSEnumDeclaration
15
+ | TSESTree.ClassDeclaration
11
16
  /**
12
17
  * Configuration options for the sort-modules rule.
13
18
  *
@@ -16,18 +21,16 @@ import { CommonGroupsOptions } from '../../types/common-groups-options.js'
16
21
  */
17
22
  export type SortModulesOptions = [
18
23
  Partial<
19
- CommonGroupsOptions<
20
- SingleCustomGroup,
21
- Record<string, never>,
22
- CustomTypeOption
23
- > &
24
- CommonOptions<CustomTypeOption> &
25
- CommonPartitionOptions
24
+ AllCommonOptions<
25
+ CustomTypeOption,
26
+ AdditionalSortOptions,
27
+ CustomGroupMatchOptions
28
+ >
26
29
  >,
27
30
  ]
28
31
  /** Represents a sorting node for a module statement. */
29
32
  export type SortModulesSortingNode =
30
- SortingNodeWithDependencies<TSESTree.ProgramStatement>
33
+ SortingNodeWithDependencies<SortModulesNode>
31
34
  /**
32
35
  * Union type of all available module member selectors. Used to categorize
33
36
  * different types of module-level declarations.
@@ -44,7 +47,7 @@ export type Modifier = (typeof allModifiers)[number]
44
47
  * Custom groups allow fine-grained control over how module members are grouped
45
48
  * and sorted based on their types, modifiers, and patterns.
46
49
  */
47
- interface SingleCustomGroup {
50
+ interface CustomGroupMatchOptions {
48
51
  /**
49
52
  * Regular expression pattern to match decorator names. Members with
50
53
  * decorators matching this pattern will be included in this custom group.
@@ -56,6 +59,7 @@ interface SingleCustomGroup {
56
59
  selector?: Selector
57
60
  }
58
61
  type CustomTypeOption = typeof USAGE_TYPE_OPTION | TypeOption
62
+ type AdditionalSortOptions = object
59
63
  /**
60
64
  * Complete list of available module member selectors. Used for validation and
61
65
  * JSON schema generation.
@@ -82,6 +86,9 @@ export declare let allModifiers: readonly [
82
86
  * Ideally, we should generate as many schemas as there are selectors, and
83
87
  * ensure that users do not enter invalid modifiers for a given selector.
84
88
  */
85
- export declare let singleCustomGroupJsonSchema: Record<string, JSONSchema4>
89
+ export declare let additionalCustomGroupMatchOptionsJsonSchema: Record<
90
+ string,
91
+ JSONSchema4
92
+ >
86
93
  export declare const USAGE_TYPE_OPTION = 'usage'
87
94
  export {}
@@ -13,7 +13,7 @@ let allSelectors = [
13
13
  'class',
14
14
  ]
15
15
  let allModifiers = ['async', 'declare', 'decorated', 'default', 'export']
16
- let singleCustomGroupJsonSchema = {
16
+ let additionalCustomGroupMatchOptionsJsonSchema = {
17
17
  modifiers: buildCustomGroupModifiersJsonSchema(allModifiers),
18
18
  selector: buildCustomGroupSelectorJsonSchema(allSelectors),
19
19
  decoratorNamePattern: buildRegexJsonSchema(),
@@ -21,7 +21,7 @@ let singleCustomGroupJsonSchema = {
21
21
  const USAGE_TYPE_OPTION = 'usage'
22
22
  export {
23
23
  USAGE_TYPE_OPTION,
24
+ additionalCustomGroupMatchOptionsJsonSchema,
24
25
  allModifiers,
25
26
  allSelectors,
26
- singleCustomGroupJsonSchema,
27
27
  }