From d57141a3d13fad30a93ed99a6a15f4b0b369246a Mon Sep 17 00:00:00 2001 From: Valentin Agachi Date: Wed, 17 Nov 2021 09:02:50 +0100 Subject: [PATCH] fix(eslint-plugin): [member-ordering] order literal names correctly in (#4054) --- .../src/rules/member-ordering.ts | 29 ++++++- ...mber-ordering-alphabetically-order.test.ts | 80 +++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/member-ordering.ts b/packages/eslint-plugin/src/rules/member-ordering.ts index fd93da81d65..baaf32aa355 100644 --- a/packages/eslint-plugin/src/rules/member-ordering.ts +++ b/packages/eslint-plugin/src/rules/member-ordering.ts @@ -270,6 +270,31 @@ function getNodeType(node: Member): string | null { } } +/** + * Gets the raw string value of a member's name + */ +function getMemberRawName( + member: + | TSESTree.MethodDefinition + | TSESTree.TSMethodSignature + | TSESTree.TSAbstractMethodDefinition + | TSESTree.PropertyDefinition + | TSESTree.TSAbstractPropertyDefinition + | TSESTree.Property + | TSESTree.TSPropertySignature, + sourceCode: TSESLint.SourceCode, +): string { + const { name, type } = util.getNameFromMember(member, sourceCode); + + if (type === util.MemberNameType.Quoted) { + return name.substr(1, name.length - 2); + } + if (type === util.MemberNameType.Private) { + return name.substr(1); + } + return name; +} + /** * Gets the member name based on the member type. * @@ -285,12 +310,12 @@ function getMemberName( case AST_NODE_TYPES.TSMethodSignature: case AST_NODE_TYPES.TSAbstractPropertyDefinition: case AST_NODE_TYPES.PropertyDefinition: - return util.getNameFromMember(node, sourceCode).name; + return getMemberRawName(node, sourceCode); case AST_NODE_TYPES.TSAbstractMethodDefinition: case AST_NODE_TYPES.MethodDefinition: return node.kind === 'constructor' ? 'constructor' - : util.getNameFromMember(node, sourceCode).name; + : getMemberRawName(node, sourceCode); case AST_NODE_TYPES.TSConstructSignatureDeclaration: return 'new'; case AST_NODE_TYPES.TSCallSignatureDeclaration: diff --git a/packages/eslint-plugin/tests/rules/member-ordering-alphabetically-order.test.ts b/packages/eslint-plugin/tests/rules/member-ordering-alphabetically-order.test.ts index 7d910e09a33..1386aee7909 100644 --- a/packages/eslint-plugin/tests/rules/member-ordering-alphabetically-order.test.ts +++ b/packages/eslint-plugin/tests/rules/member-ordering-alphabetically-order.test.ts @@ -50,6 +50,18 @@ interface Foo { options: [{ default: { memberTypes: 'never', order: 'alphabetically' } }], }, + // default option + interface + literal properties + { + code: ` +interface Foo { + a : Foo; + 'b.c' : Foo; + "b.d" : Foo; +} + `, + options: [{ default: { order: 'alphabetically' } }], + }, + // default option + type literal + multiple types { code: ` @@ -86,6 +98,18 @@ type Foo = { options: [{ default: { memberTypes: 'never', order: 'alphabetically' } }], }, + // default option + type + literal properties + { + code: ` +type Foo = { + a : Foo; + 'b.c' : Foo; + "b.d" : Foo; +} + `, + options: [{ default: { order: 'alphabetically' } }], + }, + // default option + class + multiple types { code: ` @@ -221,6 +245,34 @@ interface Foo { ], }, + // default option + interface + literal properties + { + code: ` +interface Foo { + "b.d" : Foo; + 'b.c' : Foo; + a : Foo; +} + `, + options: [{ default: { order: 'alphabetically' } }], + errors: [ + { + messageId: 'incorrectOrder', + data: { + member: 'b.c', + beforeMember: 'b.d', + }, + }, + { + messageId: 'incorrectOrder', + data: { + member: 'a', + beforeMember: 'b.c', + }, + }, + ], + }, + // default option + interface + wrong order (multiple) { code: ` @@ -279,6 +331,34 @@ type Foo = { ], }, + // default option + type + literal properties + { + code: ` +type Foo = { + "b.d" : Foo; + 'b.c' : Foo; + a : Foo; +} + `, + options: [{ default: { order: 'alphabetically' } }], + errors: [ + { + messageId: 'incorrectOrder', + data: { + member: 'b.c', + beforeMember: 'b.d', + }, + }, + { + messageId: 'incorrectOrder', + data: { + member: 'a', + beforeMember: 'b.c', + }, + }, + ], + }, + // default option + type literal + wrong order (multiple) { code: `