Comprehensive guide to configuring the sort-class-members rule with detailed examples and advanced patterns.
The order array defines the expected sequence of class members using strings and objects.
/**
* Defines the expected sort order of class members
* @param order - Array of member selectors and group references
*/
interface OrderConfiguration {
order: (string | MemberSelector)[];
}String Values:
"constructor", "render", "componentDidMount""[properties]", "[methods]", "[static-methods]""/on.+/" (matches names starting with "on")Usage Examples:
// Basic ordering
{
"order": [
"[static-properties]",
"[static-methods]",
"[properties]",
"constructor",
"[methods]"
]
}
// Mixed with specific members
{
"order": [
"displayName", // Specific property first
"[static-properties]", // Then other static properties
"constructor",
"componentDidMount", // Specific lifecycle method
"[methods]" // Then other methods
]
}
// With regex patterns
{
"order": [
"/on.+/", // Event handlers first
"constructor",
"[methods]"
]
}Custom groups allow creating reusable member selectors for complex ordering patterns.
/**
* Custom named groups of member selectors
* @param groups - Object mapping group names to selector arrays
*/
interface GroupsConfiguration {
groups: { [groupName: string]: (string | MemberSelector)[] };
}Usage Examples:
{
"order": [
"[lifecycle-methods]",
"[event-handlers]",
"[render-methods]"
],
"groups": {
"lifecycle-methods": [
"constructor",
"componentDidMount",
"componentDidUpdate",
"componentWillUnmount"
],
"event-handlers": [
{ "name": "/on.+/", "type": "method" }
],
"render-methods": [
{ "name": "/render.+/", "type": "method" },
"render"
]
}
}Advanced member matching using multiple criteria for fine-grained control.
/**
* Flexible member selector with multiple matching criteria
*/
interface MemberSelector {
/** Member name - exact match or regex pattern */
name?: string;
/** Member type classification */
type?: "method" | "property";
/** Method accessor subtype */
kind?: "get" | "set" | "accessor" | "nonAccessor";
/** AST node type of property value */
propertyType?: string;
/** Must be part of getter/setter pair */
accessorPair?: boolean;
/** Sorting behavior within group */
sort?: "alphabetical" | "none";
/** Static vs instance classification */
static?: boolean;
/** Private member matching (requires custom parser) */
private?: boolean;
/** Async method matching */
async?: boolean;
/** TypeScript accessibility modifier */
accessibility?: "public" | "private" | "protected";
/** TypeScript abstract keyword */
abstract?: boolean;
/** TypeScript override keyword */
override?: boolean;
/** TypeScript readonly keyword */
readonly?: boolean;
/** Decorator-based grouping */
groupByDecorator?: string | boolean;
}Selector Examples:
// Match static methods named 'create'
{ "name": "create", "type": "method", "static": true }
// Match all private methods
{ "type": "method", "private": true }
// Match properties with arrow function values
{ "type": "property", "propertyType": "ArrowFunctionExpression" }
// Match async methods with alphabetical sorting
{ "type": "method", "async": true, "sort": "alphabetical" }
// Match methods with @observable decorator
{ "type": "method", "groupByDecorator": "observable" }
// Match getter/setter pairs
{ "accessorPair": true }
// Match TypeScript protected methods
{ "type": "method", "accessibility": "protected" }Controls the relative positioning of getter and setter methods.
/**
* Positioning requirement for getter/setter pairs
*/
type AccessorPairPositioning = "getThenSet" | "setThenGet" | "together" | "any";Options:
"getThenSet": Getter must come immediately before setter"setThenGet": Setter must come immediately before getter"together": Getter and setter must be adjacent (either order)"any": No positioning requirementUsage Examples:
// Strict getter-first ordering
{
"accessorPairPositioning": "getThenSet"
}
// Allow either order but must be adjacent
{
"accessorPairPositioning": "together"
}Additional options for fine-tuning rule behavior.
/**
* Additional configuration options
*/
interface AdvancedOptions {
/** Stop reporting after first problem found */
stopAfterFirstProblem?: boolean;
/** Apply rule to TypeScript interfaces */
sortInterfaces?: boolean;
/** Locale for name comparison sorting */
locale?: string;
}Usage Examples:
{
"stopAfterFirstProblem": true, // Reduce noise in large files
"sortInterfaces": true, // Apply to TypeScript interfaces
"locale": "en-US" // Specify sorting locale
}Real-world configuration combining multiple features:
{
"order": [
// Static class configuration
"displayName",
"[static-properties]",
"[static-factory-methods]",
// Instance properties by category
"[observable-properties]",
"[computed-properties]",
"[regular-properties]",
"[conventional-private-properties]",
// Constructor
"constructor",
// Lifecycle methods (React example)
"[lifecycle-methods]",
// Event handlers
"[event-handlers]",
// Instance methods
"[action-methods]",
"[render-helper-methods]",
"[methods]",
"[conventional-private-methods]",
// Render method last
"render"
],
"groups": {
"static-factory-methods": [
{ "name": "/create.+/", "type": "method", "static": true },
{ "name": "/from.+/", "type": "method", "static": true }
],
"observable-properties": [
{ "type": "property", "groupByDecorator": "observable" }
],
"computed-properties": [
{ "type": "property", "groupByDecorator": "computed" }
],
"regular-properties": [
{ "type": "property", "groupByDecorator": false }
],
"lifecycle-methods": [
"componentDidMount",
"componentDidUpdate",
"componentWillUnmount"
],
"event-handlers": [
{ "name": "/on.+/", "type": "method", "sort": "alphabetical" }
],
"action-methods": [
{ "type": "method", "groupByDecorator": "action" }
],
"render-helper-methods": [
{ "name": "/render.+/", "type": "method" }
]
},
"accessorPairPositioning": "getThenSet",
"stopAfterFirstProblem": false,
"locale": "en-US"
}String patterns starting and ending with / are treated as regular expressions:
/**
* Regular expression pattern matching for member names
* @param pattern - Regex pattern wrapped in forward slashes
*/
type RegexPattern = `/${string}/`;Pattern Examples:
"/on.+/" // Matches: onClick, onSubmit, onKeyPress
"/_.+/" // Matches: _privateMethod, _helperFunction
"/^get.+/" // Matches: getName, getValue (starts with 'get')
"/.*Handler$/" // Matches: clickHandler, submitHandler (ends with 'Handler')
"/[A-Z].+/" // Matches: PascalCase namesEnhanced support for TypeScript-specific language features:
/**
* TypeScript-specific member selectors
*/
interface TypeScriptSelectors {
/** Accessibility modifier */
accessibility?: "public" | "private" | "protected";
/** Abstract keyword */
abstract?: boolean;
/** Override keyword */
override?: boolean;
/** Readonly keyword */
readonly?: boolean;
}TypeScript Examples:
// Match protected methods
{ "type": "method", "accessibility": "protected" }
// Match abstract properties
{ "type": "property", "abstract": true }
// Match readonly properties
{ "type": "property", "readonly": true }
// Match override methods
{ "type": "method", "override": true }Support for ES decorators and TypeScript decorators:
/**
* Decorator-based member grouping
* @param groupByDecorator - Decorator name pattern or boolean
*/
type DecoratorGrouping = string | boolean;Decorator Examples:
// Group by specific decorator name
{ "groupByDecorator": "observable" } // @observable
// Group by decorator presence
{ "groupByDecorator": true } // Any decorator
// Group by decorator pattern
{ "groupByDecorator": "/test.+/" } // @testMethod, @testCase
// Combine with other selectors
{
"type": "property",
"groupByDecorator": "computed",
"sort": "alphabetical"
}