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