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.
- package/dist/package.json.js +1 -1
- package/dist/rules/sort-array-includes/types.d.ts +15 -18
- package/dist/rules/sort-array-includes/types.js +2 -2
- package/dist/rules/sort-array-includes.js +13 -10
- package/dist/rules/sort-classes/compute-dependencies.d.ts +24 -0
- package/dist/rules/sort-classes/compute-dependencies.js +147 -0
- package/dist/rules/sort-classes/compute-dependency-name.d.ts +9 -0
- package/dist/rules/sort-classes/compute-dependency-name.js +8 -0
- package/dist/rules/sort-classes/compute-identifier-name-details.d.ts +16 -0
- package/dist/rules/sort-classes/compute-identifier-name-details.js +27 -0
- package/dist/rules/sort-classes/get-overload-signature-groups.js +4 -3
- package/dist/rules/sort-classes/node-info/common-modifiers.d.ts +39 -0
- package/dist/rules/sort-classes/node-info/common-modifiers.js +62 -0
- package/dist/rules/sort-classes/node-info/compute-accessor-details.d.ts +26 -0
- package/dist/rules/sort-classes/node-info/compute-accessor-details.js +43 -0
- package/dist/rules/sort-classes/node-info/compute-index-signature-details.d.ts +23 -0
- package/dist/rules/sort-classes/node-info/compute-index-signature-details.js +21 -0
- package/dist/rules/sort-classes/node-info/compute-method-details.d.ts +29 -0
- package/dist/rules/sort-classes/node-info/compute-method-details.js +80 -0
- package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.d.ts +21 -0
- package/dist/rules/sort-classes/node-info/compute-method-or-property-name-details.js +17 -0
- package/dist/rules/sort-classes/node-info/compute-property-details.d.ts +36 -0
- package/dist/rules/sort-classes/node-info/compute-property-details.js +109 -0
- package/dist/rules/sort-classes/node-info/compute-static-block-details.d.ts +26 -0
- package/dist/rules/sort-classes/node-info/compute-static-block-details.js +18 -0
- package/dist/rules/sort-classes/types.d.ts +15 -18
- package/dist/rules/sort-classes/types.js +6 -2
- package/dist/rules/sort-classes.js +79 -291
- package/dist/rules/sort-decorators/types.d.ts +10 -12
- package/dist/rules/sort-decorators.js +57 -56
- package/dist/rules/sort-enums/build-comparator-by-options-computer.js +6 -0
- package/dist/rules/sort-enums/types.d.ts +16 -19
- package/dist/rules/sort-enums/types.js +2 -2
- package/dist/rules/sort-enums.js +13 -11
- package/dist/rules/sort-export-attributes/types.d.ts +6 -8
- package/dist/rules/sort-export-attributes.js +2 -1
- package/dist/rules/sort-exports/types.d.ts +11 -10
- package/dist/rules/sort-exports/types.js +6 -2
- package/dist/rules/sort-exports.js +7 -6
- package/dist/rules/sort-heritage-clauses/types.d.ts +6 -8
- package/dist/rules/sort-heritage-clauses.js +2 -1
- package/dist/rules/sort-import-attributes/types.d.ts +6 -8
- package/dist/rules/sort-import-attributes.js +2 -1
- package/dist/rules/sort-imports/comparator-by-options-computer.js +5 -0
- package/dist/rules/sort-imports/compute-specifier-modifiers.js +1 -1
- package/dist/rules/sort-imports/is-non-external-reference-ts-import-equals.js +1 -1
- package/dist/rules/sort-imports/is-side-effect-import.js +1 -1
- package/dist/rules/sort-imports/types.d.ts +18 -24
- package/dist/rules/sort-imports/types.js +9 -6
- package/dist/rules/sort-imports.js +25 -17
- package/dist/rules/sort-jsx-props/types.d.ts +18 -18
- package/dist/rules/sort-jsx-props/types.js +6 -2
- package/dist/rules/sort-jsx-props.js +14 -7
- package/dist/rules/sort-maps/types.d.ts +10 -16
- package/dist/rules/sort-maps.js +11 -6
- package/dist/rules/sort-modules/build-comparator-by-options-computer.js +2 -0
- package/dist/rules/sort-modules/compute-dependencies.d.ts +2 -5
- package/dist/rules/sort-modules/compute-dependencies.js +3 -0
- package/dist/rules/sort-modules/compute-node-details.d.ts +38 -0
- package/dist/rules/sort-modules/compute-node-details.js +127 -0
- package/dist/rules/sort-modules/is-arrow-function-node.js +1 -1
- package/dist/rules/sort-modules/is-property-or-accessor-node.js +1 -1
- package/dist/rules/sort-modules/types.d.ts +24 -17
- package/dist/rules/sort-modules/types.js +2 -2
- package/dist/rules/sort-modules.js +72 -141
- package/dist/rules/sort-named-exports/compute-node-name.js +1 -1
- package/dist/rules/sort-named-exports/types.d.ts +16 -16
- package/dist/rules/sort-named-exports/types.js +6 -2
- package/dist/rules/sort-named-exports.js +6 -5
- package/dist/rules/sort-named-imports/compute-node-name.js +1 -1
- package/dist/rules/sort-named-imports/types.d.ts +16 -17
- package/dist/rules/sort-named-imports/types.js +6 -2
- package/dist/rules/sort-named-imports.js +7 -6
- package/dist/rules/sort-object-types/comparator-by-options-computer.js +3 -0
- package/dist/rules/sort-object-types/is-member-optional.js +1 -1
- package/dist/rules/sort-object-types/is-node-function-type.js +20 -0
- package/dist/rules/sort-object-types/types.d.ts +21 -34
- package/dist/rules/sort-object-types/types.js +9 -6
- package/dist/rules/sort-object-types.js +7 -6
- package/dist/rules/sort-objects/types.d.ts +17 -21
- package/dist/rules/sort-objects/types.js +3 -3
- package/dist/rules/sort-objects.js +5 -3
- package/dist/rules/sort-sets.js +5 -4
- package/dist/rules/sort-switch-case.js +6 -4
- package/dist/rules/sort-union-types/types.d.ts +12 -12
- package/dist/rules/sort-union-types/types.js +2 -2
- package/dist/rules/sort-union-types.js +37 -35
- package/dist/rules/sort-variable-declarations/types.d.ts +12 -13
- package/dist/rules/sort-variable-declarations/types.js +2 -2
- package/dist/rules/sort-variable-declarations.js +14 -12
- package/dist/types/all-common-options.d.ts +14 -0
- package/dist/types/common-groups-options.d.ts +73 -95
- package/dist/types/common-options.d.ts +60 -55
- package/dist/utils/build-default-options-by-group-index-computer.d.ts +1 -1
- package/dist/utils/compare/build-string-formatter.d.ts +4 -5
- package/dist/utils/compare/build-subgroup-order-comparator.d.ts +10 -0
- package/dist/utils/compare/build-subgroup-order-comparator.js +49 -0
- package/dist/utils/compare/default-comparator-by-options-computer.d.ts +4 -1
- package/dist/utils/compare/default-comparator-by-options-computer.js +9 -0
- package/dist/utils/compute-group.d.ts +9 -9
- package/dist/utils/compute-overridden-options-by-group-index.d.ts +1 -1
- package/dist/utils/does-custom-group-match.d.ts +6 -4
- package/dist/utils/get-comment-above-that-should-exist.d.ts +1 -1
- package/dist/utils/get-newlines-between-errors.d.ts +1 -1
- package/dist/utils/get-newlines-between-option.d.ts +1 -7
- package/dist/utils/get-node-range.d.ts +2 -9
- package/dist/utils/get-settings.d.ts +1 -1
- package/dist/utils/is-group-with-overrides-option.d.ts +3 -6
- package/dist/utils/json-schemas/common-groups-json-schemas.d.ts +6 -6
- package/dist/utils/json-schemas/common-groups-json-schemas.js +12 -10
- package/dist/utils/json-schemas/common-json-schemas.d.ts +5 -5
- package/dist/utils/json-schemas/common-json-schemas.js +13 -12
- package/dist/utils/make-comment-above-fixes.d.ts +1 -1
- package/dist/utils/make-fixes.d.ts +3 -5
- package/dist/utils/make-newlines-between-fixes.d.ts +1 -1
- package/dist/utils/make-order-fixes.d.ts +2 -5
- package/dist/utils/report-all-errors.d.ts +19 -17
- package/dist/utils/report-errors.d.ts +3 -1
- package/dist/utils/should-partition.d.ts +2 -5
- package/dist/utils/validate-custom-sort-configuration.d.ts +1 -1
- package/dist/utils/validate-groups-configuration.d.ts +1 -1
- package/dist/utils/validate-newlines-and-partition-configuration.d.ts +1 -1
- package/package.json +2 -2
- package/readme.md +1 -1
- package/dist/types/join.d.ts +0 -19
- package/dist/utils/is-node-function-type.js +0 -13
- /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
|
-
|
|
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
|
-
} &
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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
|
|
90
|
-
*
|
|
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
|
|
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
|
|
8
|
+
let additionalCustomGroupMatchOptionsJsonSchema = {
|
|
9
9
|
modifiers: buildCustomGroupModifiersJsonSchema(allModifiers),
|
|
10
10
|
selector: buildCustomGroupSelectorJsonSchema(allSelectors),
|
|
11
11
|
elementValuePattern: buildRegexJsonSchema(),
|
|
12
12
|
}
|
|
13
|
-
export {
|
|
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
|
-
|
|
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
|
-
|
|
191
|
+
additionalCustomGroupMatchProperties:
|
|
192
|
+
additionalCustomGroupMatchOptionsJsonSchema,
|
|
186
193
|
}),
|
|
187
194
|
useConfigurationIf: buildUseConfigurationIfJsonSchema({
|
|
188
195
|
additionalProperties: {
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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
|
-
} &
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
>
|
|
32
|
-
CommonOptions<TypeOption> &
|
|
33
|
-
CommonPartitionOptions
|
|
22
|
+
} & AllCommonOptions<
|
|
23
|
+
TypeOption,
|
|
24
|
+
AdditionalSortOptions,
|
|
25
|
+
CustomGroupMatchOptions
|
|
26
|
+
>
|
|
34
27
|
>[]
|
|
35
|
-
/**
|
|
36
|
-
type
|
|
28
|
+
/** Match options for a custom group. */
|
|
29
|
+
type CustomGroupMatchOptions = object
|
|
30
|
+
type AdditionalSortOptions = object
|
|
37
31
|
export {}
|
package/dist/rules/sort-maps.js
CHANGED
|
@@ -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 !==
|
|
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 !==
|
|
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 =>
|
|
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 (
|
|
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 ===
|
|
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 ===
|
|
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 {
|
|
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,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 {
|
|
10
|
-
import {
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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<
|
|
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
|
|
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
|
|
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
|
|
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
|
}
|