Skip to content

Commit

Permalink
fix: don't sort ts call signature declarations in interfactes
Browse files Browse the repository at this point in the history
  • Loading branch information
azat-io committed Jul 13, 2023
1 parent 47b07cc commit 5829a65
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 44 deletions.
100 changes: 56 additions & 44 deletions rules/sort-interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,54 +91,66 @@ export default createEslintRule<Options, MESSAGE_ID>({
) {
let source = context.getSourceCode()

let nodes: SortingNode[] = node.body.body.map(element => {
let name: string

if (element.type === AST_NODE_TYPES.TSPropertySignature) {
if (element.key.type === AST_NODE_TYPES.Identifier) {
;({ name } = element.key)
} else if (element.key.type === AST_NODE_TYPES.Literal) {
name = `${element.key.value}`
let formattedMembers: SortingNode[][] = node.body.body.reduce(
(accumulator: SortingNode[][], element) => {
if (element.type === AST_NODE_TYPES.TSCallSignatureDeclaration) {
accumulator.push([])
return accumulator
}

let name: string

if (element.type === AST_NODE_TYPES.TSPropertySignature) {
if (element.key.type === AST_NODE_TYPES.Identifier) {
;({ name } = element.key)
} else if (element.key.type === AST_NODE_TYPES.Literal) {
name = `${element.key.value}`
} else {
let end: number =
element.typeAnnotation?.range.at(0) ??
element.range.at(1)! - (element.optional ? '?'.length : 0)

name = source.text.slice(element.range.at(0), end)
}
} else if (element.type === AST_NODE_TYPES.TSIndexSignature) {
let endIndex: number =
element.typeAnnotation?.range.at(0) ?? element.range.at(1)!

name = source.text.slice(element.range.at(0), endIndex)
} else {
let end: number =
element.typeAnnotation?.range.at(0) ??
element.range.at(1)! - (element.optional ? '?'.length : 0)
let endIndex: number =
element.returnType?.range.at(0) ?? element.range.at(1)!

name = source.text.slice(element.range.at(0), end)
name = source.text.slice(element.range.at(0), endIndex)
}
} else if (element.type === AST_NODE_TYPES.TSIndexSignature) {
let endIndex: number =
element.typeAnnotation?.range.at(0) ?? element.range.at(1)!

name = source.text.slice(element.range.at(0), endIndex)
} else {
let endIndex: number =
element.returnType?.range.at(0) ?? element.range.at(1)!

name = source.text.slice(element.range.at(0), endIndex)
}

return {
size: rangeToDiff(element.range),
node: element,
name,
}
})

pairwise(nodes, (left, right) => {
if (compare(left, right, options)) {
context.report({
messageId: 'unexpectedInterfacePropertiesOrder',
data: {
left: toSingleLine(left.name),
right: toSingleLine(right.name),
},
node: right.node,
fix: fixer =>
makeFixes(fixer, nodes, sortNodes(nodes, options), source),

accumulator.at(-1)!.push({
size: rangeToDiff(element.range),
node: element,
name,
})
}
})

return accumulator
},
[[]],
)

for (let nodes of formattedMembers) {
pairwise(nodes, (left, right) => {
if (compare(left, right, options)) {
context.report({
messageId: 'unexpectedInterfacePropertiesOrder',
data: {
left: toSingleLine(left.name),
right: toSingleLine(right.name),
},
node: right.node,
fix: fixer =>
makeFixes(fixer, nodes, sortNodes(nodes, options), source),
})
}
})
}
}
}
},
Expand Down
81 changes: 81 additions & 0 deletions test/sort-interfaces.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,33 @@ describe(RULE_NAME, () => {
],
})
})

it(`${RULE_NAME}(${type}): not sorts call signature declarations`, () => {
ruleTester.run(RULE_NAME, rule, {
valid: [
{
code: dedent`
interface Abilities {
<Parameters extends Record<string, number | string>>(
input: AbilityFunction<[Parameters], string>
): Alternatives<Parameters>
<Ability extends CountAbility>(input: Input): AbilityFunction<
[number],
Ability[keyof Ability]
>
}
`,
options: [
{
type: SortType.alphabetical,
order: SortOrder.asc,
},
],
},
],
invalid: [],
})
})
})

describe(`${RULE_NAME}: sorting by natural order`, () => {
Expand Down Expand Up @@ -1040,6 +1067,33 @@ describe(RULE_NAME, () => {
],
})
})

it(`${RULE_NAME}(${type}): not sorts call signature declarations`, () => {
ruleTester.run(RULE_NAME, rule, {
valid: [
{
code: dedent`
interface Abilities {
<Parameters extends Record<string, number | string>>(
input: AbilityFunction<[Parameters], string>
): Alternatives<Parameters>
<Ability extends CountAbility>(input: Input): AbilityFunction<
[number],
Ability[keyof Ability]
>
}
`,
options: [
{
type: SortType.natural,
order: SortOrder.asc,
},
],
},
],
invalid: [],
})
})
})

describe(`${RULE_NAME}: sorting by line length`, () => {
Expand Down Expand Up @@ -1502,6 +1556,33 @@ describe(RULE_NAME, () => {
],
})
})

it(`${RULE_NAME}(${type}): not sorts call signature declarations`, () => {
ruleTester.run(RULE_NAME, rule, {
valid: [
{
code: dedent`
interface Abilities {
<Parameters extends Record<string, number | string>>(
input: AbilityFunction<[Parameters], string>
): Alternatives<Parameters>
<Ability extends CountAbility>(input: Input): AbilityFunction<
[number],
Ability[keyof Ability]
>
}
`,
options: [
{
type: SortType['line-length'],
order: SortOrder.desc,
},
],
},
],
invalid: [],
})
})
})

describe(`${RULE_NAME}: misc`, () => {
Expand Down

0 comments on commit 5829a65

Please sign in to comment.