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