eslint-plugin-perfectionist 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/configs/recommended-alphabetical.js +9 -1
  2. package/dist/configs/recommended-alphabetical.mjs +5 -10
  3. package/dist/configs/recommended-line-length.js +9 -1
  4. package/dist/configs/recommended-line-length.mjs +5 -10
  5. package/dist/configs/recommended-natural.js +9 -1
  6. package/dist/configs/recommended-natural.mjs +5 -10
  7. package/dist/index.js +135 -3
  8. package/dist/index.mjs +76 -2197
  9. package/dist/package.json.js +4 -0
  10. package/dist/package.json.mjs +4 -0
  11. package/dist/rules/sort-array-includes.js +129 -0
  12. package/dist/rules/sort-array-includes.mjs +129 -0
  13. package/dist/rules/sort-astro-attributes.js +161 -0
  14. package/dist/rules/sort-astro-attributes.mjs +161 -0
  15. package/dist/rules/sort-classes.js +213 -0
  16. package/dist/rules/sort-classes.mjs +213 -0
  17. package/dist/rules/sort-enums.js +117 -0
  18. package/dist/rules/sort-enums.mjs +117 -0
  19. package/dist/rules/sort-exports.js +104 -0
  20. package/dist/rules/sort-exports.mjs +104 -0
  21. package/dist/rules/sort-imports.js +439 -0
  22. package/dist/rules/sort-imports.mjs +439 -0
  23. package/dist/rules/sort-interfaces.js +253 -0
  24. package/dist/rules/sort-interfaces.mjs +253 -0
  25. package/dist/rules/sort-intersection-types.js +92 -0
  26. package/dist/rules/sort-intersection-types.mjs +92 -0
  27. package/dist/rules/sort-jsx-props.js +156 -0
  28. package/dist/rules/sort-jsx-props.mjs +156 -0
  29. package/dist/rules/sort-maps.js +125 -0
  30. package/dist/rules/sort-maps.mjs +125 -0
  31. package/dist/rules/sort-named-exports.js +105 -0
  32. package/dist/rules/sort-named-exports.mjs +105 -0
  33. package/dist/rules/sort-named-imports.js +123 -0
  34. package/dist/rules/sort-named-imports.mjs +123 -0
  35. package/dist/rules/sort-object-types.js +189 -0
  36. package/dist/rules/sort-object-types.mjs +189 -0
  37. package/dist/rules/sort-objects.js +265 -0
  38. package/dist/rules/sort-objects.mjs +265 -0
  39. package/dist/rules/sort-svelte-attributes.js +168 -0
  40. package/dist/rules/sort-svelte-attributes.mjs +168 -0
  41. package/dist/rules/sort-union-types.js +120 -0
  42. package/dist/rules/sort-union-types.mjs +120 -0
  43. package/dist/rules/sort-vue-attributes.js +165 -0
  44. package/dist/rules/sort-vue-attributes.mjs +165 -0
  45. package/dist/typings/index.js +29 -0
  46. package/dist/typings/index.mjs +29 -0
  47. package/dist/utils/compare.js +38 -0
  48. package/dist/utils/compare.mjs +38 -0
  49. package/dist/utils/complete.js +4 -0
  50. package/dist/utils/complete.mjs +4 -0
  51. package/dist/utils/create-eslint-rule.js +7 -0
  52. package/dist/utils/create-eslint-rule.mjs +7 -0
  53. package/dist/utils/get-comment-after.js +13 -0
  54. package/dist/utils/get-comment-after.mjs +13 -0
  55. package/dist/utils/get-comment-before.js +14 -0
  56. package/dist/utils/get-comment-before.mjs +14 -0
  57. package/dist/utils/get-group-number.js +12 -0
  58. package/dist/utils/get-group-number.mjs +12 -0
  59. package/dist/utils/get-lines-between.js +10 -0
  60. package/dist/utils/get-lines-between.mjs +10 -0
  61. package/dist/utils/get-node-parent.js +14 -0
  62. package/dist/utils/get-node-parent.mjs +14 -0
  63. package/dist/utils/get-node-range.js +41 -0
  64. package/dist/utils/get-node-range.mjs +41 -0
  65. package/dist/utils/is-member-optional.js +12 -0
  66. package/dist/utils/is-member-optional.mjs +12 -0
  67. package/dist/utils/is-partition-comment.js +11 -0
  68. package/dist/utils/is-partition-comment.mjs +11 -0
  69. package/dist/utils/is-positive.js +4 -0
  70. package/dist/utils/is-positive.mjs +4 -0
  71. package/dist/utils/make-fixes.js +38 -0
  72. package/dist/utils/make-fixes.mjs +38 -0
  73. package/dist/utils/pairwise.js +14 -0
  74. package/dist/utils/pairwise.mjs +14 -0
  75. package/dist/utils/range-to-diff.js +7 -0
  76. package/dist/utils/range-to-diff.mjs +7 -0
  77. package/dist/utils/sort-nodes.js +5 -0
  78. package/dist/utils/sort-nodes.mjs +5 -0
  79. package/dist/utils/to-single-line.js +4 -0
  80. package/dist/utils/to-single-line.mjs +4 -0
  81. package/dist/utils/use-groups.js +35 -0
  82. package/dist/utils/use-groups.mjs +35 -0
  83. package/package.json +1 -1
  84. package/readme.md +20 -19
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const createEslintRule = require("../utils/create-eslint-rule.js");
4
+ const index = require("../typings/index.js");
5
+ const getGroupNumber = require("../utils/get-group-number.js");
6
+ const rangeToDiff = require("../utils/range-to-diff.js");
7
+ const isPositive = require("../utils/is-positive.js");
8
+ const sortNodes = require("../utils/sort-nodes.js");
9
+ const makeFixes = require("../utils/make-fixes.js");
10
+ const complete = require("../utils/complete.js");
11
+ const pairwise = require("../utils/pairwise.js");
12
+ const compare = require("../utils/compare.js");
13
+ const RULE_NAME = "sort-named-imports";
14
+ const sortNamedImports = createEslintRule.createEslintRule({
15
+ name: RULE_NAME,
16
+ meta: {
17
+ type: "suggestion",
18
+ docs: {
19
+ description: "enforce sorted named imports"
20
+ },
21
+ fixable: "code",
22
+ schema: [
23
+ {
24
+ type: "object",
25
+ properties: {
26
+ type: {
27
+ enum: [
28
+ index.SortType.alphabetical,
29
+ index.SortType.natural,
30
+ index.SortType["line-length"]
31
+ ],
32
+ default: index.SortType.alphabetical,
33
+ type: "string"
34
+ },
35
+ order: {
36
+ enum: [index.SortOrder.asc, index.SortOrder.desc],
37
+ default: index.SortOrder.asc,
38
+ type: "string"
39
+ },
40
+ "ignore-case": {
41
+ type: "boolean",
42
+ default: false
43
+ },
44
+ "ignore-alias": {
45
+ type: "boolean",
46
+ default: false
47
+ },
48
+ "group-kind": {
49
+ enum: [
50
+ index.GroupKind.mixed,
51
+ index.GroupKind["values-first"],
52
+ index.GroupKind["types-first"]
53
+ ],
54
+ default: index.GroupKind.mixed,
55
+ type: "string"
56
+ }
57
+ },
58
+ additionalProperties: false
59
+ }
60
+ ],
61
+ messages: {
62
+ unexpectedNamedImportsOrder: 'Expected "{{right}}" to come before "{{left}}"'
63
+ }
64
+ },
65
+ defaultOptions: [
66
+ {
67
+ type: index.SortType.alphabetical,
68
+ order: index.SortOrder.asc
69
+ }
70
+ ],
71
+ create: (context) => ({
72
+ ImportDeclaration: (node) => {
73
+ let specifiers = node.specifiers.filter(
74
+ ({ type }) => type === "ImportSpecifier"
75
+ );
76
+ if (specifiers.length > 1) {
77
+ let options = complete.complete(context.options.at(0), {
78
+ type: index.SortType.alphabetical,
79
+ "ignore-alias": true,
80
+ "ignore-case": false,
81
+ order: index.SortOrder.asc,
82
+ "group-kind": index.GroupKind.mixed
83
+ });
84
+ let nodes = specifiers.map((specifier) => {
85
+ let group;
86
+ let { name } = specifier.local;
87
+ if (specifier.type === "ImportSpecifier") {
88
+ if (options["ignore-alias"]) {
89
+ ({ name } = specifier.imported);
90
+ }
91
+ group = specifier.importKind;
92
+ }
93
+ return {
94
+ size: rangeToDiff.rangeToDiff(specifier.range),
95
+ node: specifier,
96
+ name,
97
+ group
98
+ };
99
+ });
100
+ let shouldGroupByKind = options["group-kind"] !== index.GroupKind.mixed;
101
+ let groupKindOrder = options["group-kind"] === index.GroupKind["values-first"] ? ["value", "type"] : ["type", "value"];
102
+ pairwise.pairwise(nodes, (left, right) => {
103
+ let leftNum = getGroupNumber.getGroupNumber(groupKindOrder, left);
104
+ let rightNum = getGroupNumber.getGroupNumber(groupKindOrder, right);
105
+ if (shouldGroupByKind && leftNum > rightNum || (!shouldGroupByKind || leftNum === rightNum) && isPositive.isPositive(compare.compare(left, right, options))) {
106
+ let sortedNodes = shouldGroupByKind ? groupKindOrder.map((group) => nodes.filter((n) => n.group === group)).map((groupedNodes) => sortNodes.sortNodes(groupedNodes, options)).flat() : sortNodes.sortNodes(nodes, options);
107
+ context.report({
108
+ messageId: "unexpectedNamedImportsOrder",
109
+ data: {
110
+ left: left.name,
111
+ right: right.name
112
+ },
113
+ node: right.node,
114
+ fix: (fixer) => makeFixes.makeFixes(fixer, nodes, sortedNodes, context.sourceCode)
115
+ });
116
+ }
117
+ });
118
+ }
119
+ }
120
+ })
121
+ });
122
+ exports.RULE_NAME = RULE_NAME;
123
+ exports.default = sortNamedImports;
@@ -0,0 +1,123 @@
1
+ import { createEslintRule } from "../utils/create-eslint-rule.mjs";
2
+ import { SortType, SortOrder, GroupKind } from "../typings/index.mjs";
3
+ import { getGroupNumber } from "../utils/get-group-number.mjs";
4
+ import { rangeToDiff } from "../utils/range-to-diff.mjs";
5
+ import { isPositive } from "../utils/is-positive.mjs";
6
+ import { sortNodes } from "../utils/sort-nodes.mjs";
7
+ import { makeFixes } from "../utils/make-fixes.mjs";
8
+ import { complete } from "../utils/complete.mjs";
9
+ import { pairwise } from "../utils/pairwise.mjs";
10
+ import { compare } from "../utils/compare.mjs";
11
+ const RULE_NAME = "sort-named-imports";
12
+ const sortNamedImports = createEslintRule({
13
+ name: RULE_NAME,
14
+ meta: {
15
+ type: "suggestion",
16
+ docs: {
17
+ description: "enforce sorted named imports"
18
+ },
19
+ fixable: "code",
20
+ schema: [
21
+ {
22
+ type: "object",
23
+ properties: {
24
+ type: {
25
+ enum: [
26
+ SortType.alphabetical,
27
+ SortType.natural,
28
+ SortType["line-length"]
29
+ ],
30
+ default: SortType.alphabetical,
31
+ type: "string"
32
+ },
33
+ order: {
34
+ enum: [SortOrder.asc, SortOrder.desc],
35
+ default: SortOrder.asc,
36
+ type: "string"
37
+ },
38
+ "ignore-case": {
39
+ type: "boolean",
40
+ default: false
41
+ },
42
+ "ignore-alias": {
43
+ type: "boolean",
44
+ default: false
45
+ },
46
+ "group-kind": {
47
+ enum: [
48
+ GroupKind.mixed,
49
+ GroupKind["values-first"],
50
+ GroupKind["types-first"]
51
+ ],
52
+ default: GroupKind.mixed,
53
+ type: "string"
54
+ }
55
+ },
56
+ additionalProperties: false
57
+ }
58
+ ],
59
+ messages: {
60
+ unexpectedNamedImportsOrder: 'Expected "{{right}}" to come before "{{left}}"'
61
+ }
62
+ },
63
+ defaultOptions: [
64
+ {
65
+ type: SortType.alphabetical,
66
+ order: SortOrder.asc
67
+ }
68
+ ],
69
+ create: (context) => ({
70
+ ImportDeclaration: (node) => {
71
+ let specifiers = node.specifiers.filter(
72
+ ({ type }) => type === "ImportSpecifier"
73
+ );
74
+ if (specifiers.length > 1) {
75
+ let options = complete(context.options.at(0), {
76
+ type: SortType.alphabetical,
77
+ "ignore-alias": true,
78
+ "ignore-case": false,
79
+ order: SortOrder.asc,
80
+ "group-kind": GroupKind.mixed
81
+ });
82
+ let nodes = specifiers.map((specifier) => {
83
+ let group;
84
+ let { name } = specifier.local;
85
+ if (specifier.type === "ImportSpecifier") {
86
+ if (options["ignore-alias"]) {
87
+ ({ name } = specifier.imported);
88
+ }
89
+ group = specifier.importKind;
90
+ }
91
+ return {
92
+ size: rangeToDiff(specifier.range),
93
+ node: specifier,
94
+ name,
95
+ group
96
+ };
97
+ });
98
+ let shouldGroupByKind = options["group-kind"] !== GroupKind.mixed;
99
+ let groupKindOrder = options["group-kind"] === GroupKind["values-first"] ? ["value", "type"] : ["type", "value"];
100
+ pairwise(nodes, (left, right) => {
101
+ let leftNum = getGroupNumber(groupKindOrder, left);
102
+ let rightNum = getGroupNumber(groupKindOrder, right);
103
+ if (shouldGroupByKind && leftNum > rightNum || (!shouldGroupByKind || leftNum === rightNum) && isPositive(compare(left, right, options))) {
104
+ let sortedNodes = shouldGroupByKind ? groupKindOrder.map((group) => nodes.filter((n) => n.group === group)).map((groupedNodes) => sortNodes(groupedNodes, options)).flat() : sortNodes(nodes, options);
105
+ context.report({
106
+ messageId: "unexpectedNamedImportsOrder",
107
+ data: {
108
+ left: left.name,
109
+ right: right.name
110
+ },
111
+ node: right.node,
112
+ fix: (fixer) => makeFixes(fixer, nodes, sortedNodes, context.sourceCode)
113
+ });
114
+ }
115
+ });
116
+ }
117
+ }
118
+ })
119
+ });
120
+ export {
121
+ RULE_NAME,
122
+ sortNamedImports as default
123
+ };
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const createEslintRule = require("../utils/create-eslint-rule.js");
4
+ const getLinesBetween = require("../utils/get-lines-between.js");
5
+ const getGroupNumber = require("../utils/get-group-number.js");
6
+ const toSingleLine = require("../utils/to-single-line.js");
7
+ const rangeToDiff = require("../utils/range-to-diff.js");
8
+ const isPositive = require("../utils/is-positive.js");
9
+ const index = require("../typings/index.js");
10
+ const sortNodes = require("../utils/sort-nodes.js");
11
+ const makeFixes = require("../utils/make-fixes.js");
12
+ const useGroups = require("../utils/use-groups.js");
13
+ const complete = require("../utils/complete.js");
14
+ const pairwise = require("../utils/pairwise.js");
15
+ const compare = require("../utils/compare.js");
16
+ const RULE_NAME = "sort-object-types";
17
+ const sortObjectTypes = createEslintRule.createEslintRule({
18
+ name: RULE_NAME,
19
+ meta: {
20
+ type: "suggestion",
21
+ docs: {
22
+ description: "enforce sorted object types"
23
+ },
24
+ fixable: "code",
25
+ schema: [
26
+ {
27
+ type: "object",
28
+ properties: {
29
+ "custom-groups": {
30
+ type: "object"
31
+ },
32
+ type: {
33
+ enum: [
34
+ index.SortType.alphabetical,
35
+ index.SortType.natural,
36
+ index.SortType["line-length"]
37
+ ],
38
+ default: index.SortType.alphabetical,
39
+ type: "string"
40
+ },
41
+ order: {
42
+ enum: [index.SortOrder.asc, index.SortOrder.desc],
43
+ default: index.SortOrder.asc,
44
+ type: "string"
45
+ },
46
+ "ignore-case": {
47
+ type: "boolean",
48
+ default: false
49
+ },
50
+ groups: {
51
+ type: "array",
52
+ default: []
53
+ },
54
+ "partition-by-new-line": {
55
+ type: "boolean",
56
+ default: false
57
+ }
58
+ },
59
+ additionalProperties: false
60
+ }
61
+ ],
62
+ messages: {
63
+ unexpectedObjectTypesOrder: 'Expected "{{right}}" to come before "{{left}}"'
64
+ }
65
+ },
66
+ defaultOptions: [
67
+ {
68
+ type: index.SortType.alphabetical,
69
+ order: index.SortOrder.asc
70
+ }
71
+ ],
72
+ create: (context) => ({
73
+ TSTypeLiteral: (node) => {
74
+ if (node.members.length > 1) {
75
+ let options = complete.complete(context.options.at(0), {
76
+ "partition-by-new-line": false,
77
+ type: index.SortType.alphabetical,
78
+ "ignore-case": false,
79
+ order: index.SortOrder.asc,
80
+ "custom-groups": {},
81
+ groups: []
82
+ });
83
+ let formattedMembers = node.members.reduce(
84
+ (accumulator, member) => {
85
+ var _a, _b, _c, _d;
86
+ let name;
87
+ let raw = context.sourceCode.text.slice(
88
+ member.range.at(0),
89
+ member.range.at(1)
90
+ );
91
+ let lastMember = (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1);
92
+ let { getGroup, defineGroup, setCustomGroups } = useGroups.useGroups(
93
+ options.groups
94
+ );
95
+ let formatName = (value) => value.replace(/(,|;)$/, "");
96
+ if (member.type === "TSPropertySignature") {
97
+ if (member.key.type === "Identifier") {
98
+ ({ name } = member.key);
99
+ } else if (member.key.type === "Literal") {
100
+ name = `${member.key.value}`;
101
+ } else {
102
+ name = context.sourceCode.text.slice(
103
+ member.range.at(0),
104
+ (_b = member.typeAnnotation) == null ? void 0 : _b.range.at(0)
105
+ );
106
+ }
107
+ } else if (member.type === "TSIndexSignature") {
108
+ let endIndex = ((_c = member.typeAnnotation) == null ? void 0 : _c.range.at(0)) ?? member.range.at(1);
109
+ name = formatName(
110
+ context.sourceCode.text.slice(member.range.at(0), endIndex)
111
+ );
112
+ } else {
113
+ name = formatName(
114
+ context.sourceCode.text.slice(
115
+ member.range.at(0),
116
+ member.range.at(1)
117
+ )
118
+ );
119
+ }
120
+ setCustomGroups(options["custom-groups"], name);
121
+ if (member.loc.start.line !== member.loc.end.line) {
122
+ defineGroup("multiline");
123
+ }
124
+ let endsWithComma = raw.endsWith(";") || raw.endsWith(",");
125
+ let endSize = endsWithComma ? 1 : 0;
126
+ let memberSortingNode = {
127
+ size: rangeToDiff.rangeToDiff(member.range) - endSize,
128
+ node: member,
129
+ name
130
+ };
131
+ if (options["partition-by-new-line"] && lastMember && getLinesBetween.getLinesBetween(context.sourceCode, lastMember, memberSortingNode)) {
132
+ accumulator.push([]);
133
+ }
134
+ (_d = accumulator.at(-1)) == null ? void 0 : _d.push({
135
+ ...memberSortingNode,
136
+ group: getGroup()
137
+ });
138
+ return accumulator;
139
+ },
140
+ [[]]
141
+ );
142
+ for (let nodes of formattedMembers) {
143
+ pairwise.pairwise(nodes, (left, right) => {
144
+ let leftNum = getGroupNumber.getGroupNumber(options.groups, left);
145
+ let rightNum = getGroupNumber.getGroupNumber(options.groups, right);
146
+ if (leftNum > rightNum || leftNum === rightNum && isPositive.isPositive(compare.compare(left, right, options))) {
147
+ context.report({
148
+ messageId: "unexpectedObjectTypesOrder",
149
+ data: {
150
+ left: toSingleLine.toSingleLine(left.name),
151
+ right: toSingleLine.toSingleLine(right.name)
152
+ },
153
+ node: right.node,
154
+ fix: (fixer) => {
155
+ let grouped = {};
156
+ for (let currentNode of nodes) {
157
+ let groupNum = getGroupNumber.getGroupNumber(options.groups, currentNode);
158
+ if (!(groupNum in grouped)) {
159
+ grouped[groupNum] = [currentNode];
160
+ } else {
161
+ grouped[groupNum] = sortNodes.sortNodes(
162
+ [...grouped[groupNum], currentNode],
163
+ options
164
+ );
165
+ }
166
+ }
167
+ let sortedNodes = [];
168
+ for (let group of Object.keys(grouped).sort(
169
+ (a, b) => Number(a) - Number(b)
170
+ )) {
171
+ sortedNodes.push(...sortNodes.sortNodes(grouped[group], options));
172
+ }
173
+ return makeFixes.makeFixes(
174
+ fixer,
175
+ nodes,
176
+ sortedNodes,
177
+ context.sourceCode
178
+ );
179
+ }
180
+ });
181
+ }
182
+ });
183
+ }
184
+ }
185
+ }
186
+ })
187
+ });
188
+ exports.RULE_NAME = RULE_NAME;
189
+ exports.default = sortObjectTypes;
@@ -0,0 +1,189 @@
1
+ import { createEslintRule } from "../utils/create-eslint-rule.mjs";
2
+ import { getLinesBetween } from "../utils/get-lines-between.mjs";
3
+ import { getGroupNumber } from "../utils/get-group-number.mjs";
4
+ import { toSingleLine } from "../utils/to-single-line.mjs";
5
+ import { rangeToDiff } from "../utils/range-to-diff.mjs";
6
+ import { isPositive } from "../utils/is-positive.mjs";
7
+ import { SortType, SortOrder } from "../typings/index.mjs";
8
+ import { sortNodes } from "../utils/sort-nodes.mjs";
9
+ import { makeFixes } from "../utils/make-fixes.mjs";
10
+ import { useGroups } from "../utils/use-groups.mjs";
11
+ import { complete } from "../utils/complete.mjs";
12
+ import { pairwise } from "../utils/pairwise.mjs";
13
+ import { compare } from "../utils/compare.mjs";
14
+ const RULE_NAME = "sort-object-types";
15
+ const sortObjectTypes = createEslintRule({
16
+ name: RULE_NAME,
17
+ meta: {
18
+ type: "suggestion",
19
+ docs: {
20
+ description: "enforce sorted object types"
21
+ },
22
+ fixable: "code",
23
+ schema: [
24
+ {
25
+ type: "object",
26
+ properties: {
27
+ "custom-groups": {
28
+ type: "object"
29
+ },
30
+ type: {
31
+ enum: [
32
+ SortType.alphabetical,
33
+ SortType.natural,
34
+ SortType["line-length"]
35
+ ],
36
+ default: SortType.alphabetical,
37
+ type: "string"
38
+ },
39
+ order: {
40
+ enum: [SortOrder.asc, SortOrder.desc],
41
+ default: SortOrder.asc,
42
+ type: "string"
43
+ },
44
+ "ignore-case": {
45
+ type: "boolean",
46
+ default: false
47
+ },
48
+ groups: {
49
+ type: "array",
50
+ default: []
51
+ },
52
+ "partition-by-new-line": {
53
+ type: "boolean",
54
+ default: false
55
+ }
56
+ },
57
+ additionalProperties: false
58
+ }
59
+ ],
60
+ messages: {
61
+ unexpectedObjectTypesOrder: 'Expected "{{right}}" to come before "{{left}}"'
62
+ }
63
+ },
64
+ defaultOptions: [
65
+ {
66
+ type: SortType.alphabetical,
67
+ order: SortOrder.asc
68
+ }
69
+ ],
70
+ create: (context) => ({
71
+ TSTypeLiteral: (node) => {
72
+ if (node.members.length > 1) {
73
+ let options = complete(context.options.at(0), {
74
+ "partition-by-new-line": false,
75
+ type: SortType.alphabetical,
76
+ "ignore-case": false,
77
+ order: SortOrder.asc,
78
+ "custom-groups": {},
79
+ groups: []
80
+ });
81
+ let formattedMembers = node.members.reduce(
82
+ (accumulator, member) => {
83
+ var _a, _b, _c, _d;
84
+ let name;
85
+ let raw = context.sourceCode.text.slice(
86
+ member.range.at(0),
87
+ member.range.at(1)
88
+ );
89
+ let lastMember = (_a = accumulator.at(-1)) == null ? void 0 : _a.at(-1);
90
+ let { getGroup, defineGroup, setCustomGroups } = useGroups(
91
+ options.groups
92
+ );
93
+ let formatName = (value) => value.replace(/(,|;)$/, "");
94
+ if (member.type === "TSPropertySignature") {
95
+ if (member.key.type === "Identifier") {
96
+ ({ name } = member.key);
97
+ } else if (member.key.type === "Literal") {
98
+ name = `${member.key.value}`;
99
+ } else {
100
+ name = context.sourceCode.text.slice(
101
+ member.range.at(0),
102
+ (_b = member.typeAnnotation) == null ? void 0 : _b.range.at(0)
103
+ );
104
+ }
105
+ } else if (member.type === "TSIndexSignature") {
106
+ let endIndex = ((_c = member.typeAnnotation) == null ? void 0 : _c.range.at(0)) ?? member.range.at(1);
107
+ name = formatName(
108
+ context.sourceCode.text.slice(member.range.at(0), endIndex)
109
+ );
110
+ } else {
111
+ name = formatName(
112
+ context.sourceCode.text.slice(
113
+ member.range.at(0),
114
+ member.range.at(1)
115
+ )
116
+ );
117
+ }
118
+ setCustomGroups(options["custom-groups"], name);
119
+ if (member.loc.start.line !== member.loc.end.line) {
120
+ defineGroup("multiline");
121
+ }
122
+ let endsWithComma = raw.endsWith(";") || raw.endsWith(",");
123
+ let endSize = endsWithComma ? 1 : 0;
124
+ let memberSortingNode = {
125
+ size: rangeToDiff(member.range) - endSize,
126
+ node: member,
127
+ name
128
+ };
129
+ if (options["partition-by-new-line"] && lastMember && getLinesBetween(context.sourceCode, lastMember, memberSortingNode)) {
130
+ accumulator.push([]);
131
+ }
132
+ (_d = accumulator.at(-1)) == null ? void 0 : _d.push({
133
+ ...memberSortingNode,
134
+ group: getGroup()
135
+ });
136
+ return accumulator;
137
+ },
138
+ [[]]
139
+ );
140
+ for (let nodes of formattedMembers) {
141
+ pairwise(nodes, (left, right) => {
142
+ let leftNum = getGroupNumber(options.groups, left);
143
+ let rightNum = getGroupNumber(options.groups, right);
144
+ if (leftNum > rightNum || leftNum === rightNum && isPositive(compare(left, right, options))) {
145
+ context.report({
146
+ messageId: "unexpectedObjectTypesOrder",
147
+ data: {
148
+ left: toSingleLine(left.name),
149
+ right: toSingleLine(right.name)
150
+ },
151
+ node: right.node,
152
+ fix: (fixer) => {
153
+ let grouped = {};
154
+ for (let currentNode of nodes) {
155
+ let groupNum = getGroupNumber(options.groups, currentNode);
156
+ if (!(groupNum in grouped)) {
157
+ grouped[groupNum] = [currentNode];
158
+ } else {
159
+ grouped[groupNum] = sortNodes(
160
+ [...grouped[groupNum], currentNode],
161
+ options
162
+ );
163
+ }
164
+ }
165
+ let sortedNodes = [];
166
+ for (let group of Object.keys(grouped).sort(
167
+ (a, b) => Number(a) - Number(b)
168
+ )) {
169
+ sortedNodes.push(...sortNodes(grouped[group], options));
170
+ }
171
+ return makeFixes(
172
+ fixer,
173
+ nodes,
174
+ sortedNodes,
175
+ context.sourceCode
176
+ );
177
+ }
178
+ });
179
+ }
180
+ });
181
+ }
182
+ }
183
+ }
184
+ })
185
+ });
186
+ export {
187
+ RULE_NAME,
188
+ sortObjectTypes as default
189
+ };