Skip to content

Commit eeb0534

Browse files
authored
fix: take into account dependencies in sort-enums
1 parent 57ce99c commit eeb0534

File tree

2 files changed

+179
-1
lines changed

2 files changed

+179
-1
lines changed

rules/sort-enums.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,49 @@ export default createEslintRule<Options, MESSAGE_ID>({
128128
let sourceCode = getSourceCode(context)
129129
let partitionComment = options.partitionByComment
130130

131+
let extractDependencies = (
132+
expression: TSESTree.Expression,
133+
enumName: string,
134+
): string[] => {
135+
let dependencies: string[] = []
136+
137+
let checkNode = (nodeValue: TSESTree.Node) => {
138+
if (
139+
nodeValue.type === 'MemberExpression' &&
140+
nodeValue.object.type === 'Identifier' &&
141+
nodeValue.object.name === enumName &&
142+
nodeValue.property.type === 'Identifier'
143+
) {
144+
/**
145+
* enum Enum {
146+
* A = 1,
147+
* B = Enum.A
148+
* }
149+
*/
150+
dependencies.push(nodeValue.property.name)
151+
} else if (nodeValue.type === 'Identifier') {
152+
/**
153+
* enum Enum {
154+
* A = 1,
155+
* B = A
156+
* }
157+
*/
158+
dependencies.push(nodeValue.name)
159+
}
160+
161+
if ('left' in nodeValue) {
162+
checkNode(nodeValue.left)
163+
}
164+
165+
if ('right' in nodeValue) {
166+
checkNode(nodeValue.right)
167+
}
168+
}
169+
170+
checkNode(expression)
171+
return dependencies
172+
}
173+
131174
let formattedMembers: SortingNode[][] = members.reduce(
132175
(accumulator: SortingNode[][], member) => {
133176
let comment = getCommentBefore(member, sourceCode)
@@ -145,9 +188,18 @@ export default createEslintRule<Options, MESSAGE_ID>({
145188
? `${member.id.value}`
146189
: `${sourceCode.text.slice(...member.id.range)}`
147190

148-
let sortingNode = {
191+
let dependencies
192+
if (member.initializer) {
193+
dependencies = extractDependencies(
194+
member.initializer,
195+
node.id.name,
196+
)
197+
}
198+
199+
let sortingNode: SortingNode = {
149200
size: rangeToDiff(member.range),
150201
node: member,
202+
dependencies,
151203
name,
152204
}
153205
accumulator.at(-1)!.push(sortingNode)

test/sort-enums.test.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1703,5 +1703,131 @@ describe(ruleName, () => {
17031703
],
17041704
},
17051705
)
1706+
1707+
ruleTester.run(`${ruleName}: works with dependencies`, rule, {
1708+
valid: [],
1709+
invalid: [
1710+
{
1711+
code: dedent`
1712+
enum Enum {
1713+
C = 'C',
1714+
B = 0,
1715+
A = B,
1716+
}
1717+
`,
1718+
output: dedent`
1719+
enum Enum {
1720+
B = 0,
1721+
A = B,
1722+
C = 'C',
1723+
}
1724+
`,
1725+
options: [
1726+
{
1727+
type: 'alphabetical',
1728+
},
1729+
],
1730+
errors: [
1731+
{
1732+
messageId: 'unexpectedEnumsOrder',
1733+
data: {
1734+
left: 'C',
1735+
right: 'B',
1736+
},
1737+
},
1738+
],
1739+
},
1740+
{
1741+
code: dedent`
1742+
enum Enum {
1743+
C = 'C',
1744+
B = 0,
1745+
A = Enum.B,
1746+
}
1747+
`,
1748+
output: dedent`
1749+
enum Enum {
1750+
B = 0,
1751+
A = Enum.B,
1752+
C = 'C',
1753+
}
1754+
`,
1755+
options: [
1756+
{
1757+
type: 'alphabetical',
1758+
},
1759+
],
1760+
errors: [
1761+
{
1762+
messageId: 'unexpectedEnumsOrder',
1763+
data: {
1764+
left: 'C',
1765+
right: 'B',
1766+
},
1767+
},
1768+
],
1769+
},
1770+
{
1771+
code: dedent`
1772+
enum Enum {
1773+
C = 3,
1774+
B = 0,
1775+
A = 1 | 2 | B | Enum.B,
1776+
}
1777+
`,
1778+
output: dedent`
1779+
enum Enum {
1780+
B = 0,
1781+
A = 1 | 2 | B | Enum.B,
1782+
C = 3,
1783+
}
1784+
`,
1785+
options: [
1786+
{
1787+
type: 'alphabetical',
1788+
},
1789+
],
1790+
errors: [
1791+
{
1792+
messageId: 'unexpectedEnumsOrder',
1793+
data: {
1794+
left: 'C',
1795+
right: 'B',
1796+
},
1797+
},
1798+
],
1799+
},
1800+
{
1801+
code: dedent`
1802+
enum Enum {
1803+
B = 'B',
1804+
A = AnotherEnum.B,
1805+
C = 'C',
1806+
}
1807+
`,
1808+
output: dedent`
1809+
enum Enum {
1810+
A = AnotherEnum.B,
1811+
B = 'B',
1812+
C = 'C',
1813+
}
1814+
`,
1815+
options: [
1816+
{
1817+
type: 'alphabetical',
1818+
},
1819+
],
1820+
errors: [
1821+
{
1822+
messageId: 'unexpectedEnumsOrder',
1823+
data: {
1824+
left: 'B',
1825+
right: 'A',
1826+
},
1827+
},
1828+
],
1829+
},
1830+
],
1831+
})
17061832
})
17071833
})

0 commit comments

Comments
 (0)