From 00ac9c3ccaad27bab08ec3c3a104f612bb593df5 Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Mon, 6 Jul 2020 11:12:20 -0700 Subject: [PATCH] fix(eslint-plugin): [prefer-literal-enum-member] allow negative numbers (#2277) --- .../src/rules/prefer-literal-enum-member.ts | 25 +++++++--- .../rules/prefer-literal-enum-member.test.ts | 48 +++++++++++++++++++ 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-literal-enum-member.ts b/packages/eslint-plugin/src/rules/prefer-literal-enum-member.ts index 8f95fd5946b..4377b29dc8f 100644 --- a/packages/eslint-plugin/src/rules/prefer-literal-enum-member.ts +++ b/packages/eslint-plugin/src/rules/prefer-literal-enum-member.ts @@ -1,7 +1,7 @@ import { AST_NODE_TYPES } from '@typescript-eslint/experimental-utils'; import { createRule } from '../util'; -export default createRule<[], 'notLiteral'>({ +export default createRule({ name: 'prefer-literal-enum-member', meta: { type: 'suggestion', @@ -22,15 +22,26 @@ export default createRule<[], 'notLiteral'>({ return { TSEnumMember(node): void { // If there is no initializer, then this node is just the name of the member, so ignore. + if (node.initializer == null) { + return; + } + // any old literal + if (node.initializer.type === AST_NODE_TYPES.Literal) { + return; + } + // -1 and +1 if ( - node.initializer != null && - node.initializer.type !== AST_NODE_TYPES.Literal + node.initializer.type === AST_NODE_TYPES.UnaryExpression && + ['+', '-'].includes(node.initializer.operator) && + node.initializer.argument.type === AST_NODE_TYPES.Literal ) { - context.report({ - node: node.id, - messageId: 'notLiteral', - }); + return; } + + context.report({ + node: node.id, + messageId: 'notLiteral', + }); }, }; }, diff --git a/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts b/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts index 4e309edc357..1f5efac8027 100644 --- a/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-literal-enum-member.test.ts @@ -23,6 +23,16 @@ enum ValidNumber { } `, ` +enum ValidNumber { + A = -42, +} + `, + ` +enum ValidNumber { + A = +42, +} + `, + ` enum ValidNull { A = null, } @@ -121,6 +131,44 @@ enum InvalidExpression { }, { code: ` +enum InvalidExpression { + A = delete 2, + B = -a, + C = void 2, + D = ~2, + E = !0, +} + `, + errors: [ + { + messageId: 'notLiteral', + line: 3, + column: 3, + }, + { + messageId: 'notLiteral', + line: 4, + column: 3, + }, + { + messageId: 'notLiteral', + line: 5, + column: 3, + }, + { + messageId: 'notLiteral', + line: 6, + column: 3, + }, + { + messageId: 'notLiteral', + line: 7, + column: 3, + }, + ], + }, + { + code: ` const variable = 'Test'; enum InvalidVariable { A = 'TestStr',