Skip to content

Commit a7d986b

Browse files
committed
feat(order-fixer): make array fixer more precise
This change will also make sure that the original indentations are set correctly after the fixer ran.
1 parent 9a94b55 commit a7d986b

File tree

2 files changed

+53
-16
lines changed

2 files changed

+53
-16
lines changed

lib/rules/decorator-array-items/order-fixer.util.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,23 @@ export const orderFixer = (
1111
context: DecoratorArrayItemsRuleContext,
1212
node: ArrayExpression,
1313
reverseSort: boolean,
14-
): RuleFix => {
14+
): RuleFix | null => {
1515
const sourceCode = context.getSourceCode();
1616
const elements = node.elements as Array<Identifier>;
17-
const fix = elements.map((el) => sourceCode.getText(el)).sort();
18-
if (reverseSort) fix.reverse();
19-
return fixer.replaceText(node, `[\n${fix.join(",\n")}\n]`);
17+
const sortedElements = elements.map((el) => sourceCode.getText(el)).sort();
18+
if (reverseSort) sortedElements.reverse();
19+
20+
let joinSeparator = ", ";
21+
const start = elements?.at(0)?.loc?.start;
22+
const end = elements?.at(-1)?.loc?.start;
23+
if (start && end && start.line !== end.line) {
24+
const indentation = " ".repeat(start.column);
25+
joinSeparator = `,\n${indentation}`;
26+
}
27+
28+
const rangeStart = elements?.at(0)?.range?.at(0);
29+
const rangeEnd = elements?.at(-1)?.range?.at(-1);
30+
if (rangeStart === undefined || rangeEnd === undefined) return null;
31+
const fixedText = sortedElements.join(joinSeparator);
32+
return fixer.replaceTextRange([rangeStart, rangeEnd], fixedText);
2033
};

tests/lib/rules/decorator-array-items.spec.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
2929
AppleService,
3030
SomethingService,
3131
TestService,
32-
UserStore
32+
UserStore,
3333
],
3434
declarations: [
3535
AppComponent,
3636
ToArrayPipe,
37-
WorkshopPageComponent
37+
WorkshopPageComponent,
3838
],
3939
exports: [
4040
ToArrayPipe,
41-
WorkshopPageComponent
41+
WorkshopPageComponent,
4242
],
4343
}) export class TestModule {}
4444
`,
@@ -47,14 +47,38 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
4747
invalid: [
4848
{
4949
code: `
50+
@Component({
51+
selector: 'app-test',
52+
template: '',
53+
standalone: true,
54+
imports: [RouterModule, CommonModule, MatButtonModule],
55+
}) export class TestComponent {}
56+
`,
57+
output: `
58+
@Component({
59+
selector: 'app-test',
60+
template: '',
61+
standalone: true,
62+
imports: [CommonModule, MatButtonModule, RouterModule],
63+
}) export class TestComponent {}
64+
`,
65+
errors: [
66+
{
67+
messageId: "wrongOrderOfDecoratorArrayItems",
68+
data: { property: "imports" },
69+
},
70+
],
71+
},
72+
{
73+
code: `
5074
@Component({
5175
selector: 'app-test',
5276
template: '',
5377
standalone: true,
5478
imports: [
5579
RouterModule,
5680
CommonModule,
57-
MatButtonModule,
81+
MatButtonModule
5882
],
5983
}) export class TestComponent {}
6084
`,
@@ -83,22 +107,22 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
83107
imports: [
84108
RouterModule,
85109
TestStandaloneComponent,
86-
CommonModule
110+
CommonModule,
87111
],
88112
providers: [
89113
TestService,
90114
SomethingService,
91115
AppleService,
92-
UserStore
116+
UserStore,
93117
],
94118
declarations: [
95119
ToArrayPipe,
96120
AppComponent,
97-
WorkshopPageComponent
121+
WorkshopPageComponent,
98122
],
99123
exports: [
100124
WorkshopPageComponent,
101-
ToArrayPipe
125+
ToArrayPipe,
102126
],
103127
}) export class TestModule {}
104128
`,
@@ -107,22 +131,22 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
107131
imports: [
108132
CommonModule,
109133
RouterModule,
110-
TestStandaloneComponent
134+
TestStandaloneComponent,
111135
],
112136
providers: [
113137
AppleService,
114138
SomethingService,
115139
TestService,
116-
UserStore
140+
UserStore,
117141
],
118142
declarations: [
119143
AppComponent,
120144
ToArrayPipe,
121-
WorkshopPageComponent
145+
WorkshopPageComponent,
122146
],
123147
exports: [
124148
ToArrayPipe,
125-
WorkshopPageComponent
149+
WorkshopPageComponent,
126150
],
127151
}) export class TestModule {}
128152
`,

0 commit comments

Comments
 (0)