diff --git a/rules/sort-classes.types.ts b/rules/sort-classes.types.ts index 55dd3ef26..8044df813 100644 --- a/rules/sort-classes.types.ts +++ b/rules/sort-classes.types.ts @@ -34,6 +34,42 @@ export type SingleCustomGroup = | BaseSingleCustomGroup | AdvancedSingleCustomGroup +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 @@ -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 @@ -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[] } @@ -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 = { decoratorNamePattern?: string elementValuePattern?: string elementNamePattern?: string } & BaseSingleCustomGroup +type Join = T extends [ + infer First extends string, + ...infer Rest extends string[], +] + ? `${First}${Join}` + : '' + type PublicOrProtectedOrPrivateModifierPrefix = WithDashSuffixOrEmpty< ProtectedModifier | PrivateModifier | PublicModifier > @@ -170,8 +234,6 @@ interface BaseSingleCustomGroup { modifiers?: AllowedModifiersPerSelector[T][] selector?: T } -type IndexSignatureGroup = - `${StaticModifierPrefix}${ReadonlyModifierPrefix}${IndexSignatureSelector}` type PublicOrProtectedOrPrivateModifier = | ProtectedModifier @@ -182,9 +244,6 @@ type StaticOrAbstractModifierPrefix = WithDashSuffixOrEmpty< AbstractModifier | StaticModifier > -type ConstructorGroup = - `${PublicOrProtectedOrPrivateModifierPrefix}${ConstructorSelector}` - type GetMethodOrSetMethodSelector = GetMethodSelector | SetMethodSelector type DecoratedModifierPrefix = WithDashSuffixOrEmpty diff --git a/test/sort-classes.test.ts b/test/sort-classes.test.ts index f46766e94..2f7e7ede5 100644 --- a/test/sort-classes.test.ts +++ b/test/sort-classes.test.ts @@ -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' @@ -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() + + expectTypeOf( + 'set-method' as const, + ).toMatchTypeOf() + + expectTypeOf( + 'protected-get-method' as const, + ).toMatchTypeOf() + + expectTypeOf( + 'public-decorated-get-method' as const, + ).toMatchTypeOf() + }) + + it('test non declare property group type', () => { + expectTypeOf( + 'public-static-override-property' as const, + ).toMatchTypeOf() + }) + + it('test function property group type', () => { + expectTypeOf( + 'private-static-function-property' as const, + ).toMatchTypeOf() + }) + + it('test accessor property group type', () => { + expectTypeOf( + 'static-accessor-property' as const, + ).toMatchTypeOf() + + expectTypeOf( + 'protected-static-accessor-property' as const, + ).toMatchTypeOf() + + expectTypeOf( + 'accessor-property' as const, + ).toMatchTypeOf() + + expectTypeOf( + 'protected-accessor-property' as const, + ).toMatchTypeOf() + }) + + it('test declare property group type', () => { + expectTypeOf( + 'declare-protected-static-readonly-property' as const, + ).toMatchTypeOf() + }) + + it('test declare method group type', () => { + expectTypeOf('public-method' as const).toMatchTypeOf() + + expectTypeOf('protected-method' as const).toMatchTypeOf() + + expectTypeOf('private-method' as const).toMatchTypeOf() + }) + + it('test constructor group type', () => { + expectTypeOf('constructor' as const).toMatchTypeOf() + }) + + it('test index signature group type', () => { + expectTypeOf( + 'index-signature' as const, + ).toMatchTypeOf() + }) + }) })