From 7b1057c874112f63522362a26564d0b2ad45f0ab Mon Sep 17 00:00:00 2001 From: Adam Averay Date: Mon, 13 Mar 2023 23:23:31 +0900 Subject: [PATCH] fix: handle truthy enums in allowNullableEnum --- .../src/rules/strict-boolean-expressions.ts | 7 +- .../rules/strict-boolean-expressions.test.ts | 92 +++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts index bf58727df296..f1e8eacbdba5 100644 --- a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts +++ b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts @@ -726,7 +726,12 @@ export default util.createRule({ } // nullable enum - if (is('nullish', 'number', 'enum') || is('nullish', 'string', 'enum')) { + if ( + is('nullish', 'number', 'enum') || + is('nullish', 'string', 'enum') || + is('nullish', 'truthy number', 'enum') || + is('nullish', 'truthy string', 'enum') + ) { if (!options.allowNullableEnum) { if (isLogicalNegationExpression(node.parent!)) { context.report({ diff --git a/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts b/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts index f3b6deef1bf5..388c2d4660f3 100644 --- a/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts +++ b/packages/eslint-plugin/tests/rules/strict-boolean-expressions.test.ts @@ -166,6 +166,38 @@ ruleTester.run('strict-boolean-expressions', rule, { `, options: [{ allowNullableEnum: true }], }, + { + code: ` + enum ExampleEnum { + This = 1, + That = 2, + } + const rand = Math.random(); + let theEnum: ExampleEnum | null = null; + if (rand < 0.3) { + theEnum = ExampleEnum.This; + } + if (!theEnum) { + } + `, + options: [{ allowNullableEnum: true }], + }, + { + code: ` + enum ExampleEnum { + This = 'one', + That = 'two', + } + const rand = Math.random(); + let theEnum: ExampleEnum | null = null; + if (rand < 0.3) { + theEnum = ExampleEnum.This; + } + if (!theEnum) { + } + `, + options: [{ allowNullableEnum: true }], + }, { code: ` declare const x: string[] | null; @@ -1149,6 +1181,66 @@ if (y) { } `, }, + { + options: [{ allowNullableEnum: false }], + code: ` + enum ExampleEnum { + This = 'one', + That = 'two', + } + const theEnum = Math.random() < 0.3 ? ExampleEnum.This : null; + if (!theEnum) { + } + `, + errors: [ + { + line: 7, + column: 14, + messageId: 'conditionErrorNullableEnum', + endLine: 7, + endColumn: 21, + }, + ], + output: ` + enum ExampleEnum { + This = 'one', + That = 'two', + } + const theEnum = Math.random() < 0.3 ? ExampleEnum.This : null; + if (theEnum == null) { + } + `, + }, + { + options: [{ allowNullableEnum: false }], + code: ` + enum ExampleEnum { + This = 1, + That = 2, + } + const theEnum = Math.random() < 0.3 ? ExampleEnum.This : null; + if (!theEnum) { + } + `, + errors: [ + { + line: 7, + column: 14, + messageId: 'conditionErrorNullableEnum', + endLine: 7, + endColumn: 21, + }, + ], + output: ` + enum ExampleEnum { + This = 1, + That = 2, + } + const theEnum = Math.random() < 0.3 ? ExampleEnum.This : null; + if (theEnum == null) { + } + `, + }, // any in boolean context ...batchedSingleLineTests({ code: noFormat`