From 1bcc7f7da57ef8fc18b76d3aef2e7cf8f07ffa3b Mon Sep 17 00:00:00 2001 From: Svyatoslav Zaytsev Date: Wed, 2 Nov 2022 09:46:30 +0300 Subject: [PATCH] fix(eslint-plugin): [prefer-optional-chain] fixer produces wrong logic (#1438) --- .../src/rules/prefer-optional-chain.ts | 15 ++++++++++++--- .../tests/rules/prefer-optional-chain.test.ts | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-optional-chain.ts b/packages/eslint-plugin/src/rules/prefer-optional-chain.ts index dc9b514e353..0889ba32478 100644 --- a/packages/eslint-plugin/src/rules/prefer-optional-chain.ts +++ b/packages/eslint-plugin/src/rules/prefer-optional-chain.ts @@ -221,10 +221,19 @@ export default util.createRule({ if (expressionCount > 1) { if (previous.right.type === AST_NODE_TYPES.BinaryExpression) { + let operator = previous.right.operator; + if ( + previous.right.operator === '!==' && + previous.right.right.type === AST_NODE_TYPES.Literal && + previous.right.right.raw === 'null' + ) { + // case like foo !== null && foo.bar !== null + operator = '!='; + } // case like foo && foo.bar !== someValue - optionallyChainedCode += ` ${ - previous.right.operator - } ${sourceCode.getText(previous.right.right)}`; + optionallyChainedCode += ` ${operator} ${sourceCode.getText( + previous.right.right, + )}`; } context.report({ diff --git a/packages/eslint-plugin/tests/rules/prefer-optional-chain.test.ts b/packages/eslint-plugin/tests/rules/prefer-optional-chain.test.ts index 0358c065870..46e70b08b30 100644 --- a/packages/eslint-plugin/tests/rules/prefer-optional-chain.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-optional-chain.test.ts @@ -123,6 +123,22 @@ const baseCases = [ code: 'foo.bar && foo.bar?.() && foo.bar?.().baz', output: 'foo.bar?.()?.baz', }, + { + code: 'foo !== null && foo.bar !== null', + output: 'foo?.bar != null', + }, + { + code: 'foo != null && foo.bar != null', + output: 'foo?.bar != null', + }, + { + code: 'foo != null && foo.bar !== null', + output: 'foo?.bar != null', + }, + { + code: 'foo !== null && foo.bar != null', + output: 'foo?.bar != null', + }, ].map( c => ({