Skip to content

Commit a682297

Browse files
authoredJan 29, 2025··
feat: improve new lines between inside groups option behavior
1 parent 0ec132a commit a682297

20 files changed

+2679
-928
lines changed
 

‎rules/sort-imports.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { validateCustomSortConfiguration } from '../utils/validate-custom-sort-c
3131
import { readClosestTsConfigByPath } from './sort-imports/read-closest-ts-config-by-path'
3232
import { validateGroupsConfiguration } from '../utils/validate-groups-configuration'
3333
import { getOptionsWithCleanGroups } from '../utils/get-options-with-clean-groups'
34+
import { isNewlinesBetweenOption } from '../utils/is-newlines-between-option'
3435
import { getEslintDisabledLines } from '../utils/get-eslint-disabled-lines'
3536
import { getTypescriptImport } from './sort-imports/get-typescript-import'
3637
import { isNodeEslintDisabled } from '../utils/is-node-eslint-disabled'
@@ -179,7 +180,7 @@ export default createEslintRule<Options, MESSAGE_ID>({
179180
| string[]
180181
| string,
181182
): boolean => {
182-
if (!group || (typeof group === 'object' && 'newlinesBetween' in group)) {
183+
if (!group || isNewlinesBetweenOption(group)) {
183184
return false
184185
}
185186
if (typeof group === 'string') {

‎test/rules/sort-array-includes.test.ts

+200-72
Original file line numberDiff line numberDiff line change
@@ -1596,91 +1596,219 @@ describe(ruleName, () => {
15961596
},
15971597
)
15981598

1599-
ruleTester.run(
1600-
`${ruleName}(${type}): allows to use "newlinesBetween" inside groups`,
1601-
rule,
1602-
{
1603-
invalid: [
1604-
{
1605-
options: [
1606-
{
1607-
...options,
1608-
customGroups: [
1609-
{ elementNamePattern: 'a', groupName: 'a' },
1610-
{ elementNamePattern: 'b', groupName: 'b' },
1611-
{ elementNamePattern: 'c', groupName: 'c' },
1612-
{ elementNamePattern: 'd', groupName: 'd' },
1613-
{ elementNamePattern: 'e', groupName: 'e' },
1614-
],
1615-
groups: [
1599+
describe(`${ruleName}(${type}): "newlinesBetween" inside groups`, () => {
1600+
ruleTester.run(
1601+
`${ruleName}(${type}): handles "newlinesBetween" between consecutive groups`,
1602+
rule,
1603+
{
1604+
invalid: [
1605+
{
1606+
options: [
1607+
{
1608+
...options,
1609+
groups: [
1610+
'a',
1611+
{ newlinesBetween: 'always' },
1612+
'b',
1613+
{ newlinesBetween: 'always' },
1614+
'c',
1615+
{ newlinesBetween: 'never' },
1616+
'd',
1617+
{ newlinesBetween: 'ignore' },
1618+
'e',
1619+
],
1620+
customGroups: [
1621+
{ elementNamePattern: 'a', groupName: 'a' },
1622+
{ elementNamePattern: 'b', groupName: 'b' },
1623+
{ elementNamePattern: 'c', groupName: 'c' },
1624+
{ elementNamePattern: 'd', groupName: 'd' },
1625+
{ elementNamePattern: 'e', groupName: 'e' },
1626+
],
1627+
newlinesBetween: 'always',
1628+
},
1629+
],
1630+
errors: [
1631+
{
1632+
data: {
1633+
right: 'b',
1634+
left: 'a',
1635+
},
1636+
messageId: 'missedSpacingBetweenArrayIncludesMembers',
1637+
},
1638+
{
1639+
data: {
1640+
right: 'c',
1641+
left: 'b',
1642+
},
1643+
messageId: 'extraSpacingBetweenArrayIncludesMembers',
1644+
},
1645+
{
1646+
data: {
1647+
right: 'd',
1648+
left: 'c',
1649+
},
1650+
messageId: 'extraSpacingBetweenArrayIncludesMembers',
1651+
},
1652+
],
1653+
output: dedent`
1654+
[
16161655
'a',
1617-
{ newlinesBetween: 'always' },
1656+
16181657
'b',
1619-
{ newlinesBetween: 'always' },
1658+
16201659
'c',
1621-
{ newlinesBetween: 'never' },
16221660
'd',
1623-
{ newlinesBetween: 'ignore' },
1624-
'e',
1625-
],
1626-
newlinesBetween: 'always',
1627-
},
1628-
],
1629-
errors: [
1630-
{
1631-
data: {
1632-
right: 'b',
1633-
left: 'a',
1634-
},
1635-
messageId: 'missedSpacingBetweenArrayIncludesMembers',
1636-
},
1637-
{
1638-
data: {
1639-
right: 'c',
1640-
left: 'b',
1641-
},
1642-
messageId: 'extraSpacingBetweenArrayIncludesMembers',
1643-
},
1644-
{
1645-
data: {
1646-
right: 'd',
1647-
left: 'c',
1648-
},
1649-
messageId: 'extraSpacingBetweenArrayIncludesMembers',
1650-
},
1651-
],
1652-
output: dedent`
1653-
[
1654-
'a',
16551661
1656-
'b',
16571662
1658-
'c',
1659-
'd',
1663+
'e'
1664+
].includes(value)
1665+
`,
1666+
code: dedent`
1667+
[
1668+
'a',
1669+
'b',
16601670
16611671
1662-
'e'
1663-
].includes(value)
1664-
`,
1665-
code: dedent`
1666-
[
1667-
'a',
1668-
'b',
1672+
'c',
16691673
1674+
'd',
16701675
1671-
'c',
16721676
1673-
'd',
1677+
'e'
1678+
].includes(value)
1679+
`,
1680+
},
1681+
],
1682+
valid: [],
1683+
},
1684+
)
16741685

1686+
describe(`${ruleName}(${type}): "newlinesBetween" between non-consecutive groups`, () => {
1687+
for (let [globalNewlinesBetween, groupNewlinesBetween] of [
1688+
['always', 'never'] as const,
1689+
['always', 'ignore'] as const,
1690+
['never', 'always'] as const,
1691+
['ignore', 'always'] as const,
1692+
]) {
1693+
ruleTester.run(
1694+
`${ruleName}(${type}): enforces a newline if the global option is "${globalNewlinesBetween}" and the group option is "${groupNewlinesBetween}"`,
1695+
rule,
1696+
{
1697+
invalid: [
1698+
{
1699+
options: [
1700+
{
1701+
...options,
1702+
customGroups: [
1703+
{ elementNamePattern: 'a', groupName: 'a' },
1704+
{ elementNamePattern: 'b', groupName: 'b' },
1705+
{ groupName: 'unusedGroup', elementNamePattern: 'X' },
1706+
],
1707+
groups: [
1708+
'a',
1709+
'unusedGroup',
1710+
{ newlinesBetween: groupNewlinesBetween },
1711+
'b',
1712+
],
1713+
newlinesBetween: globalNewlinesBetween,
1714+
},
1715+
],
1716+
errors: [
1717+
{
1718+
data: {
1719+
right: 'b',
1720+
left: 'a',
1721+
},
1722+
messageId: 'missedSpacingBetweenArrayIncludesMembers',
1723+
},
1724+
],
1725+
output: dedent`
1726+
[
1727+
a,
1728+
1729+
b,
1730+
].includes(value)
1731+
`,
1732+
code: dedent`
1733+
[
1734+
a,
1735+
b,
1736+
].includes(value)
1737+
`,
1738+
},
1739+
],
1740+
valid: [],
1741+
},
1742+
)
1743+
}
1744+
1745+
for (let [globalNewlinesBetween, groupNewlinesBetween] of [
1746+
['ignore', 'never'] as const,
1747+
['never', 'ignore'] as const,
1748+
]) {
1749+
ruleTester.run(
1750+
`${ruleName}(${type}): does not enforce a newline if the global option is "${globalNewlinesBetween}" and the group option is "${groupNewlinesBetween}"`,
1751+
rule,
1752+
{
1753+
valid: [
1754+
{
1755+
options: [
1756+
{
1757+
...options,
1758+
customGroups: [
1759+
{ elementNamePattern: 'a', groupName: 'a' },
1760+
{ elementNamePattern: 'b', groupName: 'b' },
1761+
{ groupName: 'unusedGroup', elementNamePattern: 'X' },
1762+
],
1763+
groups: [
1764+
'a',
1765+
'unusedGroup',
1766+
{ newlinesBetween: groupNewlinesBetween },
1767+
'b',
1768+
],
1769+
newlinesBetween: globalNewlinesBetween,
1770+
},
1771+
],
1772+
code: dedent`
1773+
[
1774+
a,
16751775
1676-
'e'
1677-
].includes(value)
1678-
`,
1679-
},
1680-
],
1681-
valid: [],
1682-
},
1683-
)
1776+
b,
1777+
].includes(value)
1778+
`,
1779+
},
1780+
{
1781+
options: [
1782+
{
1783+
...options,
1784+
customGroups: [
1785+
{ elementNamePattern: 'a', groupName: 'a' },
1786+
{ elementNamePattern: 'b', groupName: 'b' },
1787+
{ groupName: 'unusedGroup', elementNamePattern: 'X' },
1788+
],
1789+
groups: [
1790+
'a',
1791+
'unusedGroup',
1792+
{ newlinesBetween: groupNewlinesBetween },
1793+
'b',
1794+
],
1795+
newlinesBetween: globalNewlinesBetween,
1796+
},
1797+
],
1798+
code: dedent`
1799+
[
1800+
a,
1801+
b,
1802+
].includes(value)
1803+
`,
1804+
},
1805+
],
1806+
invalid: [],
1807+
},
1808+
)
1809+
}
1810+
})
1811+
})
16841812

16851813
ruleTester.run(
16861814
`${ruleName}(${type}): handles newlines and comment after fixes`,

0 commit comments

Comments
 (0)
Please sign in to comment.