Skip to content

Commit

Permalink
feat(order-fixer): make array fixer more precise
Browse files Browse the repository at this point in the history
This change will also make sure that the original indentations are set
correctly after the fixer ran.
  • Loading branch information
ducktordanny committed Jun 15, 2024
1 parent 9a94b55 commit a7d986b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 16 deletions.
21 changes: 17 additions & 4 deletions lib/rules/decorator-array-items/order-fixer.util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,23 @@ export const orderFixer = (
context: DecoratorArrayItemsRuleContext,
node: ArrayExpression,
reverseSort: boolean,
): RuleFix => {
): RuleFix | null => {
const sourceCode = context.getSourceCode();
const elements = node.elements as Array<Identifier>;
const fix = elements.map((el) => sourceCode.getText(el)).sort();
if (reverseSort) fix.reverse();
return fixer.replaceText(node, `[\n${fix.join(",\n")}\n]`);
const sortedElements = elements.map((el) => sourceCode.getText(el)).sort();
if (reverseSort) sortedElements.reverse();

let joinSeparator = ", ";
const start = elements?.at(0)?.loc?.start;
const end = elements?.at(-1)?.loc?.start;
if (start && end && start.line !== end.line) {
const indentation = " ".repeat(start.column);
joinSeparator = `,\n${indentation}`;
}

const rangeStart = elements?.at(0)?.range?.at(0);
const rangeEnd = elements?.at(-1)?.range?.at(-1);
if (rangeStart === undefined || rangeEnd === undefined) return null;
const fixedText = sortedElements.join(joinSeparator);
return fixer.replaceTextRange([rangeStart, rangeEnd], fixedText);
};
48 changes: 36 additions & 12 deletions tests/lib/rules/decorator-array-items.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,16 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
AppleService,
SomethingService,
TestService,
UserStore
UserStore,
],
declarations: [
AppComponent,
ToArrayPipe,
WorkshopPageComponent
WorkshopPageComponent,
],
exports: [
ToArrayPipe,
WorkshopPageComponent
WorkshopPageComponent,
],
}) export class TestModule {}
`,
Expand All @@ -47,14 +47,38 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
invalid: [
{
code: `
@Component({
selector: 'app-test',
template: '',
standalone: true,
imports: [RouterModule, CommonModule, MatButtonModule],
}) export class TestComponent {}
`,
output: `
@Component({
selector: 'app-test',
template: '',
standalone: true,
imports: [CommonModule, MatButtonModule, RouterModule],
}) export class TestComponent {}
`,
errors: [
{
messageId: "wrongOrderOfDecoratorArrayItems",
data: { property: "imports" },
},
],
},
{
code: `
@Component({
selector: 'app-test',
template: '',
standalone: true,
imports: [
RouterModule,
CommonModule,
MatButtonModule,
MatButtonModule
],
}) export class TestComponent {}
`,
Expand Down Expand Up @@ -83,22 +107,22 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
imports: [
RouterModule,
TestStandaloneComponent,
CommonModule
CommonModule,
],
providers: [
TestService,
SomethingService,
AppleService,
UserStore
UserStore,
],
declarations: [
ToArrayPipe,
AppComponent,
WorkshopPageComponent
WorkshopPageComponent,
],
exports: [
WorkshopPageComponent,
ToArrayPipe
ToArrayPipe,
],
}) export class TestModule {}
`,
Expand All @@ -107,22 +131,22 @@ ruleTester.run("decorator-array-items", decoratorArrayItemsRule, {
imports: [
CommonModule,
RouterModule,
TestStandaloneComponent
TestStandaloneComponent,
],
providers: [
AppleService,
SomethingService,
TestService,
UserStore
UserStore,
],
declarations: [
AppComponent,
ToArrayPipe,
WorkshopPageComponent
WorkshopPageComponent,
],
exports: [
ToArrayPipe,
WorkshopPageComponent
WorkshopPageComponent,
],
}) export class TestModule {}
`,
Expand Down

0 comments on commit a7d986b

Please sign in to comment.