diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/shared.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/shared.ts index 71a6a4b99b7b..927fe83f9ef0 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/shared.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/shared.ts @@ -17,4 +17,16 @@ function isMetaSelector( return selector in MetaSelectors; } -export { selectorTypeToMessageString, isMetaSelector }; +function isMethodOrPropertySelector( + selector: IndividualAndMetaSelectorsString | Selectors | MetaSelectors, +): boolean { + return ( + selector === MetaSelectors.method || selector === MetaSelectors.property + ); +} + +export { + selectorTypeToMessageString, + isMetaSelector, + isMethodOrPropertySelector, +}; diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts index 8945c726368e..a683933d61b4 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts @@ -13,7 +13,11 @@ import { UnderscoreOptions, } from './enums'; import { PredefinedFormatToCheckFunction } from './format'; -import { isMetaSelector, selectorTypeToMessageString } from './shared'; +import { + isMetaSelector, + isMethodOrPropertySelector, + selectorTypeToMessageString, +} from './shared'; import type { Context, NormalizedSelector } from './types'; import * as util from '../../util'; @@ -49,6 +53,17 @@ function createValidator( return -1; } + const aIsMethodOrProperty = isMethodOrPropertySelector(a.selector); + const bIsMethodOrProperty = isMethodOrPropertySelector(b.selector); + + // for backward compatibility, method and property have higher precedence than other meta selectors + if (aIsMethodOrProperty && !bIsMethodOrProperty) { + return -1; + } + if (!aIsMethodOrProperty && bIsMethodOrProperty) { + return 1; + } + // both aren't meta selectors // sort descending - the meta selectors are "least important" return b.selector - a.selector; diff --git a/packages/eslint-plugin/tests/rules/naming-convention.test.ts b/packages/eslint-plugin/tests/rules/naming-convention.test.ts index 2a1f1c177cd6..93173074ae94 100644 --- a/packages/eslint-plugin/tests/rules/naming-convention.test.ts +++ b/packages/eslint-plugin/tests/rules/naming-convention.test.ts @@ -1453,6 +1453,31 @@ ruleTester.run('naming-convention', rule, { }, ], }, + { + code: ` + const obj = { + Foo: 42, + Bar() { + return 42; + }, + }; + `, + parserOptions, + options: [ + { + selector: 'memberLike', + format: ['camelCase'], + }, + { + selector: 'property', + format: ['PascalCase'], + }, + { + selector: 'method', + format: ['PascalCase'], + }, + ], + }, ], invalid: [ {