Skip to content

Commit

Permalink
refactor(sort-classes): make group types readable
Browse files Browse the repository at this point in the history
  • Loading branch information
azat-io authored Dec 13, 2024
1 parent a06ce5c commit 723a447
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 24 deletions.
105 changes: 82 additions & 23 deletions rules/sort-classes.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,42 @@ export type SingleCustomGroup =
| BaseSingleCustomGroup<ConstructorSelector>
| AdvancedSingleCustomGroup<MethodSelector>

export type NonDeclarePropertyGroup = Join<
[
PublicOrProtectedOrPrivateModifierPrefix,
StaticOrAbstractModifierPrefix,
OverrideModifierPrefix,
ReadonlyModifierPrefix,
DecoratedModifierPrefix,
OptionalModifierPrefix,
PropertySelector,
]
>

export type FunctionPropertyGroup = Join<
[
PublicOrProtectedOrPrivateModifierPrefix,
StaticModifierPrefix,
OverrideModifierPrefix,
ReadonlyModifierPrefix,
DecoratedModifierPrefix,
AsyncModifierPrefix,
FunctionPropertySelector,
]
>

export type MethodGroup = Join<
[
PublicOrProtectedOrPrivateModifierPrefix,
StaticOrAbstractModifierPrefix,
OverrideModifierPrefix,
DecoratedModifierPrefix,
AsyncModifierPrefix,
OptionalModifierPrefix,
MethodSelector,
]
>

export type Selector =
| AccessorPropertySelector
| FunctionPropertySelector
Expand All @@ -45,6 +81,27 @@ export type Selector =
| PropertySelector
| MethodSelector

export type DeclarePropertyGroup = Join<
[
DeclareModifierPrefix,
PublicOrProtectedOrPrivateModifierPrefix,
StaticOrAbstractModifierPrefix,
ReadonlyModifierPrefix,
OptionalModifierPrefix,
PropertySelector,
]
>

export type GetMethodOrSetMethodGroup = Join<
[
PublicOrProtectedOrPrivateModifierPrefix,
StaticOrAbstractModifierPrefix,
OverrideModifierPrefix,
DecoratedModifierPrefix,
GetMethodOrSetMethodSelector,
]
>

export type Modifier =
| PublicOrProtectedOrPrivateModifier
| DecoratedModifier
Expand All @@ -56,6 +113,24 @@ export type Modifier =
| StaticModifier
| AsyncModifier

export type AccessorPropertyGroup = Join<
[
PublicOrProtectedOrPrivateModifierPrefix,
StaticOrAbstractModifierPrefix,
OverrideModifierPrefix,
DecoratedModifierPrefix,
AccessorPropertySelector,
]
>

export type IndexSignatureGroup = Join<
[StaticModifierPrefix, ReadonlyModifierPrefix, IndexSignatureSelector]
>

export type ConstructorGroup = Join<
[PublicOrProtectedOrPrivateModifierPrefix, ConstructorSelector]
>

export interface AnyOfCustomGroup {
anyOf: SingleCustomGroup[]
}
Expand Down Expand Up @@ -138,30 +213,19 @@ type CustomGroup = (
groupName: string
}

type NonDeclarePropertyGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${StaticOrAbstractModifierPrefix}${OverrideModifierPrefix}${ReadonlyModifierPrefix}${DecoratedModifierPrefix}${OptionalModifierPrefix}${PropertySelector}`

type FunctionPropertyGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${StaticModifierPrefix}${OverrideModifierPrefix}${ReadonlyModifierPrefix}${DecoratedModifierPrefix}${AsyncModifierPrefix}${FunctionPropertySelector}`

type MethodGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${StaticOrAbstractModifierPrefix}${OverrideModifierPrefix}${DecoratedModifierPrefix}${AsyncModifierPrefix}${OptionalModifierPrefix}${MethodSelector}`

type DeclarePropertyGroup =
`${DeclareModifierPrefix}${PublicOrProtectedOrPrivateModifierPrefix}${StaticOrAbstractModifierPrefix}${ReadonlyModifierPrefix}${OptionalModifierPrefix}${PropertySelector}`

type GetMethodOrSetMethodGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${StaticOrAbstractModifierPrefix}${OverrideModifierPrefix}${DecoratedModifierPrefix}${GetMethodOrSetMethodSelector}`

type AccessorPropertyGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${StaticOrAbstractModifierPrefix}${OverrideModifierPrefix}${DecoratedModifierPrefix}${AccessorPropertySelector}`

type AdvancedSingleCustomGroup<T extends Selector> = {
decoratorNamePattern?: string
elementValuePattern?: string
elementNamePattern?: string
} & BaseSingleCustomGroup<T>

type Join<T extends string[]> = T extends [
infer First extends string,
...infer Rest extends string[],
]
? `${First}${Join<Rest>}`
: ''

type PublicOrProtectedOrPrivateModifierPrefix = WithDashSuffixOrEmpty<
ProtectedModifier | PrivateModifier | PublicModifier
>
Expand All @@ -170,8 +234,6 @@ interface BaseSingleCustomGroup<T extends Selector> {
modifiers?: AllowedModifiersPerSelector[T][]
selector?: T
}
type IndexSignatureGroup =
`${StaticModifierPrefix}${ReadonlyModifierPrefix}${IndexSignatureSelector}`

type PublicOrProtectedOrPrivateModifier =
| ProtectedModifier
Expand All @@ -182,9 +244,6 @@ type StaticOrAbstractModifierPrefix = WithDashSuffixOrEmpty<
AbstractModifier | StaticModifier
>

type ConstructorGroup =
`${PublicOrProtectedOrPrivateModifierPrefix}${ConstructorSelector}`

type GetMethodOrSetMethodSelector = GetMethodSelector | SetMethodSelector

type DecoratedModifierPrefix = WithDashSuffixOrEmpty<DecoratedModifier>
Expand Down
87 changes: 86 additions & 1 deletion test/sort-classes.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
import type { Rule } from 'eslint'

import { expectTypeOf, afterAll, describe, it } from 'vitest'
import { RuleTester } from '@typescript-eslint/rule-tester'
import { RuleTester as EslintRuleTester } from 'eslint'
import { afterAll, describe, it } from 'vitest'
import { dedent } from 'ts-dedent'

import type {
GetMethodOrSetMethodGroup,
NonDeclarePropertyGroup,
FunctionPropertyGroup,
AccessorPropertyGroup,
DeclarePropertyGroup,
IndexSignatureGroup,
ConstructorGroup,
MethodGroup,
} from '../rules/sort-classes.types'

import { Alphabet } from '../utils/alphabet'
import rule from '../rules/sort-classes'

Expand Down Expand Up @@ -8748,4 +8759,78 @@ describe(ruleName, () => {
},
)
})

describe(`${ruleName}: test types`, () => {
it('test get method or set method group type', () => {
expectTypeOf(
'get-method' as const,
).toMatchTypeOf<GetMethodOrSetMethodGroup>()

expectTypeOf(
'set-method' as const,
).toMatchTypeOf<GetMethodOrSetMethodGroup>()

expectTypeOf(
'protected-get-method' as const,
).toMatchTypeOf<GetMethodOrSetMethodGroup>()

expectTypeOf(
'public-decorated-get-method' as const,
).toMatchTypeOf<GetMethodOrSetMethodGroup>()
})

it('test non declare property group type', () => {
expectTypeOf(
'public-static-override-property' as const,
).toMatchTypeOf<NonDeclarePropertyGroup>()
})

it('test function property group type', () => {
expectTypeOf(
'private-static-function-property' as const,
).toMatchTypeOf<FunctionPropertyGroup>()
})

it('test accessor property group type', () => {
expectTypeOf(
'static-accessor-property' as const,
).toMatchTypeOf<AccessorPropertyGroup>()

expectTypeOf(
'protected-static-accessor-property' as const,
).toMatchTypeOf<AccessorPropertyGroup>()

expectTypeOf(
'accessor-property' as const,
).toMatchTypeOf<AccessorPropertyGroup>()

expectTypeOf(
'protected-accessor-property' as const,
).toMatchTypeOf<AccessorPropertyGroup>()
})

it('test declare property group type', () => {
expectTypeOf(
'declare-protected-static-readonly-property' as const,
).toMatchTypeOf<DeclarePropertyGroup>()
})

it('test declare method group type', () => {
expectTypeOf('public-method' as const).toMatchTypeOf<MethodGroup>()

expectTypeOf('protected-method' as const).toMatchTypeOf<MethodGroup>()

expectTypeOf('private-method' as const).toMatchTypeOf<MethodGroup>()
})

it('test constructor group type', () => {
expectTypeOf('constructor' as const).toMatchTypeOf<ConstructorGroup>()
})

it('test index signature group type', () => {
expectTypeOf(
'index-signature' as const,
).toMatchTypeOf<IndexSignatureGroup>()
})
})
})

0 comments on commit 723a447

Please sign in to comment.