diff --git a/.changeset/tidy-teams-mix.md b/.changeset/tidy-teams-mix.md new file mode 100644 index 000000000000..d5898c9fb798 --- /dev/null +++ b/.changeset/tidy-teams-mix.md @@ -0,0 +1,10 @@ +--- +"@biomejs/biome": patch +--- + +Fixed [#7517](https://github.com/biomejs/biome/issues/7517): the [`useOptionalChain`](https://biomejs.dev/linter/rules/use-optional-chain/) rule no longer suggests changes for typeof checks on global objects. + +```ts +// ok +typeof window !== 'undefined' && window.location; +``` diff --git a/crates/biome_js_analyze/src/lint/complexity/use_optional_chain.rs b/crates/biome_js_analyze/src/lint/complexity/use_optional_chain.rs index 54f69aff8610..55b1b68a13f0 100644 --- a/crates/biome_js_analyze/src/lint/complexity/use_optional_chain.rs +++ b/crates/biome_js_analyze/src/lint/complexity/use_optional_chain.rs @@ -1,11 +1,12 @@ use biome_analyze::RuleSource; -use biome_analyze::{Ast, FixKind, Rule, RuleDiagnostic, context::RuleContext, declare_lint_rule}; +use biome_analyze::{FixKind, Rule, RuleDiagnostic, context::RuleContext, declare_lint_rule}; use biome_console::markup; use biome_diagnostics::Severity; use biome_js_factory::make; +use biome_js_semantic::{BindingExtensions, SemanticModel}; use biome_js_syntax::{ - AnyJsExpression, AnyJsMemberExpression, AnyJsName, JsLogicalExpression, JsLogicalOperator, - OperatorPrecedence, T, + AnyJsExpression, AnyJsMemberExpression, AnyJsName, JsBinaryExpression, JsBinaryOperator, + JsLogicalExpression, JsLogicalOperator, JsUnaryOperator, OperatorPrecedence, T, }; use biome_rowan::{AstNode, AstNodeExt, BatchMutationExt, SyntaxResult}; use biome_rule_options::use_optional_chain::UseOptionalChainOptions; @@ -14,6 +15,7 @@ use std::collections::VecDeque; use std::iter; use crate::JsRuleAction; +use crate::services::semantic::Semantic; declare_lint_rule! { /// Enforce using concise optional chain instead of chained logical expressions. @@ -89,22 +91,24 @@ pub enum UseOptionalChainState { } impl Rule for UseOptionalChain { - type Query = Ast; + type Query = Semantic; type State = UseOptionalChainState; type Signals = Option; type Options = UseOptionalChainOptions; fn run(ctx: &RuleContext) -> Option { + let model = ctx.model(); let logical = ctx.query(); let operator = logical.operator().ok()?; match operator { JsLogicalOperator::LogicalAnd => { let head = logical.right().ok()?; let chain = LogicalAndChain::from_expression(head).ok()?; - if chain.is_inside_another_chain().ok()? { + if chain.is_inside_another_chain(model).ok()? { return None; } - let optional_chain_expression_nodes = chain.optional_chain_expression_nodes()?; + let optional_chain_expression_nodes = + chain.optional_chain_expression_nodes(model)?; Some(UseOptionalChainState::LogicalAnd( optional_chain_expression_nodes, )) @@ -262,15 +266,169 @@ impl Rule for UseOptionalChain { /// Normalize optional chain like. /// E.g. `foo != null` is normalized to `foo` -fn normalized_optional_chain_like(expression: AnyJsExpression) -> SyntaxResult { +fn normalized_optional_chain_like( + expression: AnyJsExpression, + model: &SemanticModel, +) -> SyntaxResult { if let AnyJsExpression::JsBinaryExpression(binary_expression) = &expression - && let Some(expr) = binary_expression.extract_optional_chain_like()? + && let Some(expr) = extract_optional_chain_like(binary_expression, model)? { return Ok(expr); } Ok(expression) } +/// Extract the left or right operand of an optional chain-like expression. +/// ```js +/// foo !== undefined; +/// typeof foo !== 'undefined'; +///``` +pub fn extract_optional_chain_like( + binary: &JsBinaryExpression, + model: &SemanticModel, +) -> SyntaxResult> { + if matches!( + binary.operator(), + Ok(JsBinaryOperator::StrictInequality | JsBinaryOperator::Inequality) + ) { + let left = binary.left()?; + let right = binary.right()?; + // nullish check: `foo !== undefined` -> return foo + if let Some(expr) = extract_optional_chain_like_nullish(&left, &right)? { + return Ok(Some(expr)); + } + // typeof check: `typeof foo !== 'undefined'` -> return foo + if let Some(expr) = extract_optional_chain_like_typeof(&left, &right, model)? { + return Ok(Some(expr)); + } + Ok(None) + } else { + Ok(None) + } +} + +/// Extract the left or right operand of an optional chain-like expression comparing nullish. +/// ```js +/// foo !== undefined; // -> Some(foo) +/// foo != undefined; // -> Some(foo) +/// foo !== null; // -> Some(foo) +/// foo != null; // -> Some(foo) +/// undefined !== foo; // -> Some(foo) +/// undefined != foo; // -> Some(foo) +/// null !== foo; // -> Some(foo) +/// null != foo; // -> Some(foo) +/// foo !== bar; // -> None +/// foo != bar; // -> None +/// undefined !== null; // -> None +/// undefined != null; // -> None +/// null !== undefined; // -> None +/// null != undefined; // -> None +/// undefined !== undefined; // -> None +/// undefined != undefined; // -> None +/// null !== null; // -> None +/// null != null; // -> None +///``` +fn extract_optional_chain_like_nullish( + left: &AnyJsExpression, + right: &AnyJsExpression, +) -> SyntaxResult> { + fn is_nullish(expression: &AnyJsExpression) -> bool { + expression + .as_static_value() + .is_some_and(|x| x.is_null_or_undefined()) + } + let left_is_nullish = is_nullish(left); + let right_is_nullish = is_nullish(right); + // right only nullish: `foo !== undefined` -> return foo (left) + if !left_is_nullish && right_is_nullish { + return Ok(Some(left.clone())); + } + // left only nullish: `undefined !== foo` -> return foo (right) + if left_is_nullish && !right_is_nullish { + return Ok(Some(right.clone())); + } + Ok(None) +} + +/// Extract the left or right operand of an optional chain-like expression using `typeof`. +/// ```js +/// typeof foo !== 'undefined'; // -> Some(foo) +/// typeof foo != 'undefined'; // -> Some(foo) +/// 'undefined' !== typeof foo; // -> Some(foo) +/// 'undefined' != typeof foo; // -> Some(foo) +/// ”undefined” != typeof foo; // -> Some(foo) +/// `undefined` != typeof foo; // -> Some(foo) +/// typeof foo !== undefined; // -> None +/// typeof foo != undefined; // -> None +/// undefined !== typeof foo; // -> None +/// undefined != typeof foo; // -> None +///``` +fn extract_optional_chain_like_typeof( + left: &AnyJsExpression, + right: &AnyJsExpression, + model: &SemanticModel, +) -> SyntaxResult> { + fn is_string_literal_undefined(expression: &AnyJsExpression) -> bool { + expression + .as_static_value() + .is_some_and(|x| matches!(x.as_string_constant(), Some(s) if s == "undefined")) + } + fn typeof_argument(expression: &AnyJsExpression) -> SyntaxResult> { + if let Some(unary) = expression.as_js_unary_expression() { + return Ok(match unary.operator()? { + JsUnaryOperator::Typeof => Some(unary.argument()?.omit_parentheses()), + _ => None, + }); + } + Ok(None) + } + fn is_unbound_root(model: &SemanticModel, expr: &AnyJsExpression) -> SyntaxResult { + let mut current = expr.clone().omit_parentheses(); + loop { + current = match current { + AnyJsExpression::JsStaticMemberExpression(e) => e.object()?, + AnyJsExpression::JsComputedMemberExpression(e) => e.object()?, + AnyJsExpression::JsCallExpression(e) => e.callee()?, + AnyJsExpression::JsParenthesizedExpression(e) => e.expression()?, + _ => { + break; + } + } + } + Ok(match current.as_js_reference_identifier() { + Some(ident) => ident.binding(model).is_none(), + None => false, + }) + } + let left_is_string_undefined = is_string_literal_undefined(left); + let right_is_string_undefined = is_string_literal_undefined(right); + // `typeof foo !== "undefined"` -> return foo + if !left_is_string_undefined && right_is_string_undefined { + let arg = typeof_argument(left); + // Unbound references are treated as global references and are not subject to optional chaining. + // `typeof window !== "undefined"` should not be converted to `window?.foo` + if let Ok(Some(arg)) = &arg + && is_unbound_root(model, arg)? + { + return Ok(None); + } + return arg; + } + // `"undefined" !== typeof foo` -> return foo + if left_is_string_undefined && !right_is_string_undefined { + let arg = typeof_argument(right); + // Unbound references are treated as global references and are not subject to optional chaining. + // `"undefined" !== typeof window` should not be converted to `window?.foo` + if let Ok(Some(arg)) = &arg + && is_unbound_root(model, arg)? + { + return Ok(None); + } + return arg; + } + Ok(None) +} + /// `LogicalAndChainOrdering` is the result of a comparison between two logical /// AND chains. enum LogicalAndChainOrdering { @@ -411,7 +569,7 @@ impl LogicalAndChain { /// This function checks if `LogicalAndChain` is inside another parent /// `LogicalAndChain` and the chain is a sub-chain of the parent chain. - fn is_inside_another_chain(&self) -> SyntaxResult { + fn is_inside_another_chain(&self, model: &SemanticModel) -> SyntaxResult { // Because head of the chain is right expression of logical expression // we need to take a parent and a grand-parent. // E.g. `foo && foo.bar && foo.bar.baz` @@ -429,8 +587,9 @@ impl LogicalAndChain { // Here we check that we came from the left side of the logical expression. // Because only the left-hand parts can be sub-chains. if grand_parent_logical_left.as_js_logical_expression() == Some(&parent) { - let grand_parent_right_chain = - Self::from_expression(normalized_optional_chain_like(grand_parent.right()?)?)?; + let grand_parent_right_chain = Self::from_expression( + normalized_optional_chain_like(grand_parent.right()?, model)?, + )?; let result = grand_parent_right_chain.cmp_chain(self)?; return match result { LogicalAndChainOrdering::SubChain | LogicalAndChainOrdering::Equal => Ok(true), @@ -539,7 +698,10 @@ impl LogicalAndChain { /// This function returns a list of `JsAnyExpression` which we need to /// transform into an optional chain expression. - fn optional_chain_expression_nodes(mut self) -> Option> { + fn optional_chain_expression_nodes( + mut self, + model: &SemanticModel, + ) -> Option> { let mut optional_chain_expression_nodes = VecDeque::with_capacity(self.buf.len()); // Take a head of a next sub-chain // E.g. `foo && foo.bar && foo.bar.baz` @@ -562,7 +724,7 @@ impl LogicalAndChain { // foo && foo.bar; // ``` AnyJsExpression::JsBinaryExpression(expression) => { - expression.extract_optional_chain_like().ok()?? + extract_optional_chain_like(&expression, model).ok()?? } expression => expression, }; @@ -582,7 +744,8 @@ impl LogicalAndChain { | AnyJsExpression::JsCallExpression(_) => expression, _ => return None, }; - let branch = Self::from_expression(normalized_optional_chain_like(head).ok()?).ok()?; + let branch = + Self::from_expression(normalized_optional_chain_like(head, model).ok()?).ok()?; match self.cmp_chain(&branch).ok()? { LogicalAndChainOrdering::SubChain => { // If the previous branch had other expressions that already diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts new file mode 100644 index 000000000000..ba9d6dba4826 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts @@ -0,0 +1,53 @@ +// chained members +typeof foo !== 'undefined' && foo.bar; +typeof foo.bar !== 'undefined' && foo.bar.baz; +typeof foo !== 'undefined' && foo(); +typeof foo.bar !== 'undefined' && foo.bar(); +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + +// chained members with element access +typeof foo !== 'undefined' && typeof foo[bar] !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + +// chained calls +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +typeof foo !== 'undefined' && typeof foo.bar() !== 'undefined' && typeof foo.bar().baz !== 'undefined' && typeof foo.bar().baz.buzz !== 'undefined' && foo.bar().baz.buzz(); + + +// chained members (double quotes) +typeof foo !== "undefined" && foo.bar; +typeof foo.bar !== "undefined" && foo.bar.baz; +typeof foo !== "undefined" && foo(); +typeof foo.bar !== "undefined" && foo.bar(); +typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; +typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + +// chained members (backticks) +typeof foo !== `undefined` && foo.bar; +typeof foo.bar !== `undefined` && foo.bar.baz; +typeof foo !== `undefined` && foo(); +typeof foo.bar !== `undefined` && foo.bar(); +typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; +typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts.snap new file mode 100644 index 000000000000..97840f64d86a --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases1.ts.snap @@ -0,0 +1,62 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +assertion_line: 152 +expression: global_typeofLogicalAndCases1.ts +--- +# Input +```ts +// chained members +typeof foo !== 'undefined' && foo.bar; +typeof foo.bar !== 'undefined' && foo.bar.baz; +typeof foo !== 'undefined' && foo(); +typeof foo.bar !== 'undefined' && foo.bar(); +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + +// chained members with element access +typeof foo !== 'undefined' && typeof foo[bar] !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + +// chained calls +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +typeof foo !== 'undefined' && typeof foo.bar() !== 'undefined' && typeof foo.bar().baz !== 'undefined' && typeof foo.bar().baz.buzz !== 'undefined' && foo.bar().baz.buzz(); + + +// chained members (double quotes) +typeof foo !== "undefined" && foo.bar; +typeof foo.bar !== "undefined" && foo.bar.baz; +typeof foo !== "undefined" && foo(); +typeof foo.bar !== "undefined" && foo.bar(); +typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; +typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + +// chained members (backticks) +typeof foo !== `undefined` && foo.bar; +typeof foo.bar !== `undefined` && foo.bar.baz; +typeof foo !== `undefined` && foo(); +typeof foo.bar !== `undefined` && foo.bar(); +typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; +typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + +``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts new file mode 100644 index 000000000000..f7c56ce896dd --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts @@ -0,0 +1,53 @@ +// chained members +typeof foo != 'undefined' && foo.bar; +typeof foo.bar != 'undefined' && foo.bar.baz; +typeof foo != 'undefined' && foo(); +typeof foo.bar != 'undefined' && foo.bar(); +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + +// chained members with element access +typeof foo != 'undefined' && typeof foo[bar] != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + +// chained calls +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +typeof foo != 'undefined' && typeof foo.bar() != 'undefined' && typeof foo.bar().baz != 'undefined' && typeof foo.bar().baz.buzz != 'undefined' && foo.bar().baz.buzz(); + + +// chained members (double quotes) +typeof foo != "undefined" && foo.bar; +typeof foo.bar != "undefined" && foo.bar.baz; +typeof foo != "undefined" && foo(); +typeof foo.bar != "undefined" && foo.bar(); +typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; +typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + +// chained members (backticks) +typeof foo != `undefined` && foo.bar; +typeof foo.bar != `undefined` && foo.bar.baz; +typeof foo != `undefined` && foo(); +typeof foo.bar != `undefined` && foo.bar(); +typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; +typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts.snap new file mode 100644 index 000000000000..25efb179deb5 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_typeofLogicalAndCases2.ts.snap @@ -0,0 +1,62 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +assertion_line: 152 +expression: global_typeofLogicalAndCases2.ts +--- +# Input +```ts +// chained members +typeof foo != 'undefined' && foo.bar; +typeof foo.bar != 'undefined' && foo.bar.baz; +typeof foo != 'undefined' && foo(); +typeof foo.bar != 'undefined' && foo.bar(); +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + +// chained members with element access +typeof foo != 'undefined' && typeof foo[bar] != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + +// chained calls +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); +typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +typeof foo != 'undefined' && typeof foo.bar() != 'undefined' && typeof foo.bar().baz != 'undefined' && typeof foo.bar().baz.buzz != 'undefined' && foo.bar().baz.buzz(); + + +// chained members (double quotes) +typeof foo != "undefined" && foo.bar; +typeof foo.bar != "undefined" && foo.bar.baz; +typeof foo != "undefined" && foo(); +typeof foo.bar != "undefined" && foo.bar(); +typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; +typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + +// chained members (backticks) +typeof foo != `undefined` && foo.bar; +typeof foo.bar != `undefined` && foo.bar.baz; +typeof foo != `undefined` && foo(); +typeof foo.bar != `undefined` && foo.bar(); +typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; +typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + +``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts new file mode 100644 index 000000000000..87b97629012c --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts @@ -0,0 +1,53 @@ +// chained members +'undefined' !== typeof foo && foo.bar; +'undefined' !== typeof foo.bar && foo.bar.baz; +'undefined' !== typeof foo && foo(); +'undefined' !== typeof foo.bar && foo.bar(); +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members with element access +'undefined' !== typeof foo && 'undefined' !== typeof foo[bar] && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + +// chained calls +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); +'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar() && 'undefined' !== typeof foo.bar().baz && 'undefined' !== typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + + +// chained members (double quotes) +"undefined" !== typeof foo && foo.bar; +"undefined" !== typeof foo.bar && foo.bar.baz; +"undefined" !== typeof foo && foo(); +"undefined" !== typeof foo.bar && foo.bar(); +"undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; +"undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members (backticks) +`undefined` !== typeof foo && foo.bar; +`undefined` !== typeof foo.bar && foo.bar.baz; +`undefined` !== typeof foo && foo(); +`undefined` !== typeof foo.bar && foo.bar(); +`undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; +`undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts.snap new file mode 100644 index 000000000000..4c9149fd50d7 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases1.ts.snap @@ -0,0 +1,62 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +assertion_line: 152 +expression: global_yoda_expressions_typeofLogicalAndCases1.ts +--- +# Input +```ts +// chained members +'undefined' !== typeof foo && foo.bar; +'undefined' !== typeof foo.bar && foo.bar.baz; +'undefined' !== typeof foo && foo(); +'undefined' !== typeof foo.bar && foo.bar(); +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members with element access +'undefined' !== typeof foo && 'undefined' !== typeof foo[bar] && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + +// chained calls +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); +'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); +'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +'undefined' !== typeof foo && 'undefined' !== typeof foo.bar() && 'undefined' !== typeof foo.bar().baz && 'undefined' !== typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + + +// chained members (double quotes) +"undefined" !== typeof foo && foo.bar; +"undefined" !== typeof foo.bar && foo.bar.baz; +"undefined" !== typeof foo && foo(); +"undefined" !== typeof foo.bar && foo.bar(); +"undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; +"undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members (backticks) +`undefined` !== typeof foo && foo.bar; +`undefined` !== typeof foo.bar && foo.bar.baz; +`undefined` !== typeof foo && foo(); +`undefined` !== typeof foo.bar && foo.bar(); +`undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; +`undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + +``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts new file mode 100644 index 000000000000..ad73bd0e3988 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts @@ -0,0 +1,53 @@ +// chained members +'undefined' != typeof foo && foo.bar; +'undefined' != typeof foo.bar && foo.bar.baz; +'undefined' != typeof foo && foo(); +'undefined' != typeof foo.bar && foo.bar(); +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members with element access +'undefined' != typeof foo && 'undefined' != typeof foo[bar] && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + +// chained calls +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); +'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +'undefined' != typeof foo && 'undefined' != typeof foo.bar() && 'undefined' != typeof foo.bar().baz && 'undefined' != typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + + +// chained members (double quotes) +"undefined" != typeof foo && foo.bar; +"undefined" != typeof foo.bar && foo.bar.baz; +"undefined" != typeof foo && foo(); +"undefined" != typeof foo.bar && foo.bar(); +"undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; +"undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members (backticks) +`undefined` != typeof foo && foo.bar; +`undefined` != typeof foo.bar && foo.bar.baz; +`undefined` != typeof foo && foo(); +`undefined` != typeof foo.bar && foo.bar(); +`undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; +`undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts.snap new file mode 100644 index 000000000000..e92da9782ef9 --- /dev/null +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/global_yoda_expressions_typeofLogicalAndCases2.ts.snap @@ -0,0 +1,62 @@ +--- +source: crates/biome_js_analyze/tests/spec_tests.rs +assertion_line: 152 +expression: global_yoda_expressions_typeofLogicalAndCases2.ts +--- +# Input +```ts +// chained members +'undefined' != typeof foo && foo.bar; +'undefined' != typeof foo.bar && foo.bar.baz; +'undefined' != typeof foo && foo(); +'undefined' != typeof foo.bar && foo.bar(); +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && foo.bar.baz.buzz; + +// case where for some reason there is a doubled up expression +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members with element access +'undefined' != typeof foo && 'undefined' != typeof foo[bar] && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + +// chained calls +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); +'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); +'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + +// case with a jump (i.e. a non-'undefined'ish prop) +'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + +// case with a call expr inside the chain for some inefficient reason +'undefined' != typeof foo && 'undefined' != typeof foo.bar() && 'undefined' != typeof foo.bar().baz && 'undefined' != typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + + +// chained members (double quotes) +"undefined" != typeof foo && foo.bar; +"undefined" != typeof foo.bar && foo.bar.baz; +"undefined" != typeof foo && foo(); +"undefined" != typeof foo.bar && foo.bar(); +"undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; +"undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + +// chained members (backticks) +`undefined` != typeof foo && foo.bar; +`undefined` != typeof foo.bar && foo.bar.baz; +`undefined` != typeof foo && foo(); +`undefined` != typeof foo.bar && foo.bar(); +`undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; +`undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + +``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts index ba9d6dba4826..b220063f5084 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts @@ -1,3 +1,4 @@ +const foo = {}; // chained members typeof foo !== 'undefined' && foo.bar; typeof foo.bar !== 'undefined' && foo.bar.baz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts.snap index 3ec4e6054fba..a4be1fa6546e 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts.snap +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases1.ts.snap @@ -5,6 +5,7 @@ expression: typeofLogicalAndCases1.ts --- # Input ```ts +const foo = {}; // chained members typeof foo !== 'undefined' && foo.bar; typeof foo.bar !== 'undefined' && foo.bar.baz; @@ -63,730 +64,732 @@ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar. # Diagnostics ``` -typeofLogicalAndCases1.ts:2:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - > 2 │ typeof foo !== 'undefined' && foo.bar; + 1 │ const foo = {}; + 2 │ // chained members + > 3 │ typeof foo !== 'undefined' && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - 4 │ typeof foo !== 'undefined' && foo(); + 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 5 │ typeof foo !== 'undefined' && foo(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 │ - typeof·foo·!==·'undefined'·&&·foo.bar; - 2 │ + foo?.bar; - 3 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - 4 4 │ typeof foo !== 'undefined' && foo(); + 1 1 │ const foo = {}; + 2 2 │ // chained members + 3 │ - typeof·foo·!==·'undefined'·&&·foo.bar; + 3 │ + foo?.bar; + 4 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 5 5 │ typeof foo !== 'undefined' && foo(); ``` ``` -typeofLogicalAndCases1.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - 2 │ typeof foo !== 'undefined' && foo.bar; - > 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 2 │ // chained members + 3 │ typeof foo !== 'undefined' && foo.bar; + > 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 4 │ typeof foo !== 'undefined' && foo(); - 5 │ typeof foo.bar !== 'undefined' && foo.bar(); + 5 │ typeof foo !== 'undefined' && foo(); + 6 │ typeof foo.bar !== 'undefined' && foo.bar(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 2 │ typeof foo !== 'undefined' && foo.bar; - 3 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz; - 3 │ + foo.bar?.baz; - 4 4 │ typeof foo !== 'undefined' && foo(); - 5 5 │ typeof foo.bar !== 'undefined' && foo.bar(); + 2 2 │ // chained members + 3 3 │ typeof foo !== 'undefined' && foo.bar; + 4 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz; + 4 │ + foo.bar?.baz; + 5 5 │ typeof foo !== 'undefined' && foo(); + 6 6 │ typeof foo.bar !== 'undefined' && foo.bar(); ``` ``` -typeofLogicalAndCases1.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 2 │ typeof foo !== 'undefined' && foo.bar; - 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - > 4 │ typeof foo !== 'undefined' && foo(); + 3 │ typeof foo !== 'undefined' && foo.bar; + 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + > 5 │ typeof foo !== 'undefined' && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 2 2 │ typeof foo !== 'undefined' && foo.bar; - 3 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - 4 │ - typeof·foo·!==·'undefined'·&&·foo(); - 4 │ + foo?.(); - 5 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - 6 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 3 3 │ typeof foo !== 'undefined' && foo.bar; + 4 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 5 │ - typeof·foo·!==·'undefined'·&&·foo(); + 5 │ + foo?.(); + 6 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + 7 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - 4 │ typeof foo !== 'undefined' && foo(); - > 5 │ typeof foo.bar !== 'undefined' && foo.bar(); + 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 5 │ typeof foo !== 'undefined' && foo(); + > 6 │ typeof foo.bar !== 'undefined' && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 7 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 8 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 3 3 │ typeof foo.bar !== 'undefined' && foo.bar.baz; - 4 4 │ typeof foo !== 'undefined' && foo(); - 5 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar(); - 5 │ + foo.bar?.(); - 6 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 7 7 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 4 4 │ typeof foo.bar !== 'undefined' && foo.bar.baz; + 5 5 │ typeof foo !== 'undefined' && foo(); + 6 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar(); + 6 │ + foo.bar?.(); + 7 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 8 8 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 4 │ typeof foo !== 'undefined' && foo(); - 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - > 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 5 │ typeof foo !== 'undefined' && foo(); + 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + > 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 7 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 8 │ + 8 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 9 │ i Unsafe fix: Change to an optional chain. - 4 4 │ typeof foo !== 'undefined' && foo(); - 5 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - 6 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; - 6 │ + foo?.bar?.baz?.buzz; - 7 7 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 8 8 │ + 5 5 │ typeof foo !== 'undefined' && foo(); + 6 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + 7 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; + 7 │ + foo?.bar?.baz?.buzz; + 8 8 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 9 9 │ ``` ``` -typeofLogicalAndCases1.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:8:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - > 7 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 │ - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + > 8 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 9 │ + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 5 5 │ typeof foo.bar !== 'undefined' && foo.bar(); - 6 6 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 7 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; - 7 │ + foo.bar?.baz?.buzz; - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 6 │ typeof foo.bar !== 'undefined' && foo.bar(); + 7 7 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 8 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; + 8 │ + foo.bar?.baz?.buzz; + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases1.ts:10:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 10 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 11 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 11 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; - 12 │ + 12 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + 13 │ i Unsafe fix: Change to an optional chain. - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz; - 10 │ + foo?.bar?.baz.buzz; - 11 11 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; - 12 12 │ + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz; + 11 │ + foo?.bar?.baz.buzz; + 12 12 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + 13 13 │ ``` ``` -typeofLogicalAndCases1.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:12:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; - > 11 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + > 12 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 12 │ - 13 │ // case where for some reason there is a doubled up expression + 13 │ + 14 │ // case where for some reason there is a doubled up expression i Unsafe fix: Change to an optional chain. - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 10 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; - 11 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz; - 11 │ + foo.bar?.baz.buzz; - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 11 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz; + 12 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz; + 12 │ + foo.bar?.baz.buzz; + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression ``` ``` -typeofLogicalAndCases1.ts:14:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - > 14 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + > 15 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 15 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 16 │ + 16 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 17 │ i Unsafe fix: Change to an optional chain. - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression - 14 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; - 14 │ + foo?.bar?.baz?.buzz; - 15 15 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 16 16 │ + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression + 15 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; + 15 │ + foo?.bar?.baz?.buzz; + 16 16 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 17 17 │ ``` ``` -typeofLogicalAndCases1.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:16:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - 14 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - > 15 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + 15 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + > 16 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 16 │ - 17 │ // chained members with element access + 17 │ + 18 │ // chained members with element access i Unsafe fix: Change to an optional chain. - 13 13 │ // case where for some reason there is a doubled up expression - 14 14 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; - 15 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; - 15 │ + foo.bar?.baz?.buzz; - 16 16 │ - 17 17 │ // chained members with element access + 14 14 │ // case where for some reason there is a doubled up expression + 15 15 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz; + 16 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz; + 16 │ + foo.bar?.baz?.buzz; + 17 17 │ + 18 18 │ // chained members with element access ``` ``` -typeofLogicalAndCases1.ts:18:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:19:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 17 │ // chained members with element access - > 18 │ typeof foo !== 'undefined' && typeof foo[bar] !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + 18 │ // chained members with element access + > 19 │ typeof foo !== 'undefined' && typeof foo[bar] !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 19 │ - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 20 │ + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 16 16 │ - 17 17 │ // chained members with element access - 18 │ - typeof·foo·!==·'undefined'·&&·typeof·foo[bar]·!==·'undefined'·&&·typeof·foo[bar].baz·!==·'undefined'·&&·foo[bar].baz.buzz; - 18 │ + foo?.[bar]?.baz?.buzz; - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 17 17 │ + 18 18 │ // chained members with element access + 19 │ - typeof·foo·!==·'undefined'·&&·typeof·foo[bar]·!==·'undefined'·&&·typeof·foo[bar].baz·!==·'undefined'·&&·foo[bar].baz.buzz; + 19 │ + foo?.[bar]?.baz?.buzz; + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases1.ts:21:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:22:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 21 │ typeof foo !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 22 │ typeof foo !== 'undefined' && typeof foo[bar].baz !== 'undefined' && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 22 │ - 23 │ // chained calls + 23 │ + 24 │ // chained calls i Unsafe fix: Change to an optional chain. - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - 21 │ - typeof·foo·!==·'undefined'·&&·typeof·foo[bar].baz·!==·'undefined'·&&·foo[bar].baz.buzz; - 21 │ + foo?.[bar].baz?.buzz; - 22 22 │ - 23 23 │ // chained calls + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + 22 │ - typeof·foo·!==·'undefined'·&&·typeof·foo[bar].baz·!==·'undefined'·&&·foo[bar].baz.buzz; + 22 │ + foo?.[bar].baz?.buzz; + 23 23 │ + 24 24 │ // chained calls ``` ``` -typeofLogicalAndCases1.ts:24:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - > 24 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); + 24 │ // chained calls + > 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - 26 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 26 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 27 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); i Unsafe fix: Change to an optional chain. - 22 22 │ - 23 23 │ // chained calls - 24 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz(); - 24 │ + foo?.bar?.baz?.buzz(); - 25 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - 26 26 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 23 23 │ + 24 24 │ // chained calls + 25 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·foo.bar.baz.buzz(); + 25 │ + foo?.bar?.baz?.buzz(); + 26 26 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 27 27 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); ``` ``` -typeofLogicalAndCases1.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - 24 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); - > 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 24 │ // chained calls + 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); + > 26 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 26 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - 27 │ + 27 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 28 │ i Unsafe fix: Change to an optional chain. - 23 23 │ // chained calls - 24 24 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); - 25 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); - 25 │ + foo?.bar?.baz?.buzz?.(); - 26 26 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - 27 27 │ + 24 24 │ // chained calls + 25 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); + 26 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); + 26 │ + foo?.bar?.baz?.buzz?.(); + 27 27 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 28 28 │ ``` ``` -typeofLogicalAndCases1.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:27:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 24 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); - 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - > 26 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); + 26 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + > 27 │ typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 27 │ - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 28 │ + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 24 24 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); - 25 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); - 26 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); - 26 │ + foo.bar?.baz?.buzz?.(); - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 25 25 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && foo.bar.baz.buzz(); + 26 26 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 27 │ - typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); + 27 │ + foo.bar?.baz?.buzz?.(); + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases1.ts:29:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 29 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 30 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 30 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); - 31 │ + 31 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + 32 │ i Unsafe fix: Change to an optional chain. - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz(); - 29 │ + foo?.bar?.baz.buzz(); - 30 30 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); - 31 31 │ + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz(); + 30 │ + foo?.bar?.baz.buzz(); + 31 31 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + 32 32 │ ``` ``` -typeofLogicalAndCases1.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:31:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); - > 30 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + > 31 │ typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 31 │ - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 32 │ + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 29 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); - 30 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz(); - 30 │ + foo.bar?.baz.buzz(); - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 30 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && foo.bar.baz.buzz(); + 31 │ - typeof·foo.bar·!==·'undefined'·&&·foo.bar.baz.buzz(); + 31 │ + foo.bar?.baz.buzz(); + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases1.ts:33:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:34:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 33 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 34 │ typeof foo !== 'undefined' && typeof foo.bar !== 'undefined' && typeof foo.bar.baz.buzz !== 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 34 │ - 35 │ // case with a call expr inside the chain for some inefficient reason + 35 │ + 36 │ // case with a call expr inside the chain for some inefficient reason i Unsafe fix: Change to an optional chain. - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - 33 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); - 33 │ + foo?.bar?.baz.buzz?.(); - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + 34 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar·!==·'undefined'·&&·typeof·foo.bar.baz.buzz·!==·'undefined'·&&·foo.bar.baz.buzz(); + 34 │ + foo?.bar?.baz.buzz?.(); + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason ``` ``` -typeofLogicalAndCases1.ts:36:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:37:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 35 │ // case with a call expr inside the chain for some inefficient reason - > 36 │ typeof foo !== 'undefined' && typeof foo.bar() !== 'undefined' && typeof foo.bar().baz !== 'undefined' && typeof foo.bar().baz.buzz !== 'undefined' && foo.bar().baz.buzz(); + 36 │ // case with a call expr inside the chain for some inefficient reason + > 37 │ typeof foo !== 'undefined' && typeof foo.bar() !== 'undefined' && typeof foo.bar().baz !== 'undefined' && typeof foo.bar().baz.buzz !== 'undefined' && foo.bar().baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 37 │ + 38 │ i Unsafe fix: Change to an optional chain. - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason - 36 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar()·!==·'undefined'·&&·typeof·foo.bar().baz·!==·'undefined'·&&·typeof·foo.bar().baz.buzz·!==·'undefined'·&&·foo.bar().baz.buzz(); - 36 │ + foo?.bar()?.baz?.buzz?.(); - 37 37 │ + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason + 37 │ - typeof·foo·!==·'undefined'·&&·typeof·foo.bar()·!==·'undefined'·&&·typeof·foo.bar().baz·!==·'undefined'·&&·typeof·foo.bar().baz.buzz·!==·'undefined'·&&·foo.bar().baz.buzz(); + 37 │ + foo?.bar()?.baz?.buzz?.(); 38 38 │ + 39 39 │ ``` ``` -typeofLogicalAndCases1.ts:40:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - > 40 │ typeof foo !== "undefined" && foo.bar; + 40 │ // chained members (double quotes) + > 41 │ typeof foo !== "undefined" && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - 42 │ typeof foo !== "undefined" && foo(); + 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 43 │ typeof foo !== "undefined" && foo(); i Unsafe fix: Change to an optional chain. - 38 38 │ - 39 39 │ // chained members (double quotes) - 40 │ - typeof·foo·!==·"undefined"·&&·foo.bar; - 40 │ + foo?.bar; - 41 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - 42 42 │ typeof foo !== "undefined" && foo(); + 39 39 │ + 40 40 │ // chained members (double quotes) + 41 │ - typeof·foo·!==·"undefined"·&&·foo.bar; + 41 │ + foo?.bar; + 42 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 43 43 │ typeof foo !== "undefined" && foo(); ``` ``` -typeofLogicalAndCases1.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - 40 │ typeof foo !== "undefined" && foo.bar; - > 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 40 │ // chained members (double quotes) + 41 │ typeof foo !== "undefined" && foo.bar; + > 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 42 │ typeof foo !== "undefined" && foo(); - 43 │ typeof foo.bar !== "undefined" && foo.bar(); + 43 │ typeof foo !== "undefined" && foo(); + 44 │ typeof foo.bar !== "undefined" && foo.bar(); i Unsafe fix: Change to an optional chain. - 39 39 │ // chained members (double quotes) - 40 40 │ typeof foo !== "undefined" && foo.bar; - 41 │ - typeof·foo.bar·!==·"undefined"·&&·foo.bar.baz; - 41 │ + foo.bar?.baz; - 42 42 │ typeof foo !== "undefined" && foo(); - 43 43 │ typeof foo.bar !== "undefined" && foo.bar(); + 40 40 │ // chained members (double quotes) + 41 41 │ typeof foo !== "undefined" && foo.bar; + 42 │ - typeof·foo.bar·!==·"undefined"·&&·foo.bar.baz; + 42 │ + foo.bar?.baz; + 43 43 │ typeof foo !== "undefined" && foo(); + 44 44 │ typeof foo.bar !== "undefined" && foo.bar(); ``` ``` -typeofLogicalAndCases1.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 40 │ typeof foo !== "undefined" && foo.bar; - 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - > 42 │ typeof foo !== "undefined" && foo(); + 41 │ typeof foo !== "undefined" && foo.bar; + 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + > 43 │ typeof foo !== "undefined" && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 43 │ typeof foo.bar !== "undefined" && foo.bar(); - 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 44 │ typeof foo.bar !== "undefined" && foo.bar(); + 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 40 40 │ typeof foo !== "undefined" && foo.bar; - 41 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - 42 │ - typeof·foo·!==·"undefined"·&&·foo(); - 42 │ + foo?.(); - 43 43 │ typeof foo.bar !== "undefined" && foo.bar(); - 44 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 41 41 │ typeof foo !== "undefined" && foo.bar; + 42 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 43 │ - typeof·foo·!==·"undefined"·&&·foo(); + 43 │ + foo?.(); + 44 44 │ typeof foo.bar !== "undefined" && foo.bar(); + 45 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - 42 │ typeof foo !== "undefined" && foo(); - > 43 │ typeof foo.bar !== "undefined" && foo.bar(); + 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 43 │ typeof foo !== "undefined" && foo(); + > 44 │ typeof foo.bar !== "undefined" && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - 45 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 46 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 41 41 │ typeof foo.bar !== "undefined" && foo.bar.baz; - 42 42 │ typeof foo !== "undefined" && foo(); - 43 │ - typeof·foo.bar·!==·"undefined"·&&·foo.bar(); - 43 │ + foo.bar?.(); - 44 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - 45 45 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 42 42 │ typeof foo.bar !== "undefined" && foo.bar.baz; + 43 43 │ typeof foo !== "undefined" && foo(); + 44 │ - typeof·foo.bar·!==·"undefined"·&&·foo.bar(); + 44 │ + foo.bar?.(); + 45 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 46 46 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 42 │ typeof foo !== "undefined" && foo(); - 43 │ typeof foo.bar !== "undefined" && foo.bar(); - > 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 43 │ typeof foo !== "undefined" && foo(); + 44 │ typeof foo.bar !== "undefined" && foo.bar(); + > 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 45 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - 46 │ + 46 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 47 │ i Unsafe fix: Change to an optional chain. - 42 42 │ typeof foo !== "undefined" && foo(); - 43 43 │ typeof foo.bar !== "undefined" && foo.bar(); - 44 │ - typeof·foo·!==·"undefined"·&&·typeof·foo.bar·!==·"undefined"·&&·typeof·foo.bar.baz·!==·"undefined"·&&·foo.bar.baz.buzz; - 44 │ + foo?.bar?.baz?.buzz; - 45 45 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - 46 46 │ + 43 43 │ typeof foo !== "undefined" && foo(); + 44 44 │ typeof foo.bar !== "undefined" && foo.bar(); + 45 │ - typeof·foo·!==·"undefined"·&&·typeof·foo.bar·!==·"undefined"·&&·typeof·foo.bar.baz·!==·"undefined"·&&·foo.bar.baz.buzz; + 45 │ + foo?.bar?.baz?.buzz; + 46 46 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 47 47 │ ``` ``` -typeofLogicalAndCases1.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:46:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 43 │ typeof foo.bar !== "undefined" && foo.bar(); - 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - > 45 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 44 │ typeof foo.bar !== "undefined" && foo.bar(); + 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + > 46 │ typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 46 │ - 47 │ // chained members (backticks) + 47 │ + 48 │ // chained members (backticks) i Unsafe fix: Change to an optional chain. - 43 43 │ typeof foo.bar !== "undefined" && foo.bar(); - 44 44 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; - 45 │ - typeof·foo.bar·!==·"undefined"·&&·typeof·foo.bar.baz·!==·"undefined"·&&·foo.bar.baz.buzz; - 45 │ + foo.bar?.baz?.buzz; - 46 46 │ - 47 47 │ // chained members (backticks) + 44 44 │ typeof foo.bar !== "undefined" && foo.bar(); + 45 45 │ typeof foo !== "undefined" && typeof foo.bar !== "undefined" && typeof foo.bar.baz !== "undefined" && foo.bar.baz.buzz; + 46 │ - typeof·foo.bar·!==·"undefined"·&&·typeof·foo.bar.baz·!==·"undefined"·&&·foo.bar.baz.buzz; + 46 │ + foo.bar?.baz?.buzz; + 47 47 │ + 48 48 │ // chained members (backticks) ``` ``` -typeofLogicalAndCases1.ts:48:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - > 48 │ typeof foo !== `undefined` && foo.bar; + 48 │ // chained members (backticks) + > 49 │ typeof foo !== `undefined` && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - 50 │ typeof foo !== `undefined` && foo(); + 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 51 │ typeof foo !== `undefined` && foo(); i Unsafe fix: Change to an optional chain. - 46 46 │ - 47 47 │ // chained members (backticks) - 48 │ - typeof·foo·!==·`undefined`·&&·foo.bar; - 48 │ + foo?.bar; - 49 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - 50 50 │ typeof foo !== `undefined` && foo(); + 47 47 │ + 48 48 │ // chained members (backticks) + 49 │ - typeof·foo·!==·`undefined`·&&·foo.bar; + 49 │ + foo?.bar; + 50 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 51 51 │ typeof foo !== `undefined` && foo(); ``` ``` -typeofLogicalAndCases1.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - 48 │ typeof foo !== `undefined` && foo.bar; - > 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 48 │ // chained members (backticks) + 49 │ typeof foo !== `undefined` && foo.bar; + > 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 50 │ typeof foo !== `undefined` && foo(); - 51 │ typeof foo.bar !== `undefined` && foo.bar(); + 51 │ typeof foo !== `undefined` && foo(); + 52 │ typeof foo.bar !== `undefined` && foo.bar(); i Unsafe fix: Change to an optional chain. - 47 47 │ // chained members (backticks) - 48 48 │ typeof foo !== `undefined` && foo.bar; - 49 │ - typeof·foo.bar·!==·`undefined`·&&·foo.bar.baz; - 49 │ + foo.bar?.baz; - 50 50 │ typeof foo !== `undefined` && foo(); - 51 51 │ typeof foo.bar !== `undefined` && foo.bar(); + 48 48 │ // chained members (backticks) + 49 49 │ typeof foo !== `undefined` && foo.bar; + 50 │ - typeof·foo.bar·!==·`undefined`·&&·foo.bar.baz; + 50 │ + foo.bar?.baz; + 51 51 │ typeof foo !== `undefined` && foo(); + 52 52 │ typeof foo.bar !== `undefined` && foo.bar(); ``` ``` -typeofLogicalAndCases1.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 48 │ typeof foo !== `undefined` && foo.bar; - 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - > 50 │ typeof foo !== `undefined` && foo(); + 49 │ typeof foo !== `undefined` && foo.bar; + 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + > 51 │ typeof foo !== `undefined` && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 51 │ typeof foo.bar !== `undefined` && foo.bar(); - 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 52 │ typeof foo.bar !== `undefined` && foo.bar(); + 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 48 48 │ typeof foo !== `undefined` && foo.bar; - 49 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - 50 │ - typeof·foo·!==·`undefined`·&&·foo(); - 50 │ + foo?.(); - 51 51 │ typeof foo.bar !== `undefined` && foo.bar(); - 52 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 49 49 │ typeof foo !== `undefined` && foo.bar; + 50 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 51 │ - typeof·foo·!==·`undefined`·&&·foo(); + 51 │ + foo?.(); + 52 52 │ typeof foo.bar !== `undefined` && foo.bar(); + 53 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - 50 │ typeof foo !== `undefined` && foo(); - > 51 │ typeof foo.bar !== `undefined` && foo.bar(); + 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 51 │ typeof foo !== `undefined` && foo(); + > 52 │ typeof foo.bar !== `undefined` && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - 53 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 54 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 49 49 │ typeof foo.bar !== `undefined` && foo.bar.baz; - 50 50 │ typeof foo !== `undefined` && foo(); - 51 │ - typeof·foo.bar·!==·`undefined`·&&·foo.bar(); - 51 │ + foo.bar?.(); - 52 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - 53 53 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 50 50 │ typeof foo.bar !== `undefined` && foo.bar.baz; + 51 51 │ typeof foo !== `undefined` && foo(); + 52 │ - typeof·foo.bar·!==·`undefined`·&&·foo.bar(); + 52 │ + foo.bar?.(); + 53 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 54 54 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases1.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 50 │ typeof foo !== `undefined` && foo(); - 51 │ typeof foo.bar !== `undefined` && foo.bar(); - > 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 51 │ typeof foo !== `undefined` && foo(); + 52 │ typeof foo.bar !== `undefined` && foo.bar(); + > 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 53 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - 54 │ + 54 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 55 │ i Unsafe fix: Change to an optional chain. - 50 50 │ typeof foo !== `undefined` && foo(); - 51 51 │ typeof foo.bar !== `undefined` && foo.bar(); - 52 │ - typeof·foo·!==·`undefined`·&&·typeof·foo.bar·!==·`undefined`·&&·typeof·foo.bar.baz·!==·`undefined`·&&·foo.bar.baz.buzz; - 52 │ + foo?.bar?.baz?.buzz; - 53 53 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - 54 54 │ + 51 51 │ typeof foo !== `undefined` && foo(); + 52 52 │ typeof foo.bar !== `undefined` && foo.bar(); + 53 │ - typeof·foo·!==·`undefined`·&&·typeof·foo.bar·!==·`undefined`·&&·typeof·foo.bar.baz·!==·`undefined`·&&·foo.bar.baz.buzz; + 53 │ + foo?.bar?.baz?.buzz; + 54 54 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 55 55 │ ``` ``` -typeofLogicalAndCases1.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases1.ts:54:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 51 │ typeof foo.bar !== `undefined` && foo.bar(); - 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - > 53 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 52 │ typeof foo.bar !== `undefined` && foo.bar(); + 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + > 54 │ typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 54 │ + 55 │ i Unsafe fix: Change to an optional chain. - 51 51 │ typeof foo.bar !== `undefined` && foo.bar(); - 52 52 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; - 53 │ - typeof·foo.bar·!==·`undefined`·&&·typeof·foo.bar.baz·!==·`undefined`·&&·foo.bar.baz.buzz; - 53 │ + foo.bar?.baz?.buzz; - 54 54 │ + 52 52 │ typeof foo.bar !== `undefined` && foo.bar(); + 53 53 │ typeof foo !== `undefined` && typeof foo.bar !== `undefined` && typeof foo.bar.baz !== `undefined` && foo.bar.baz.buzz; + 54 │ - typeof·foo.bar·!==·`undefined`·&&·typeof·foo.bar.baz·!==·`undefined`·&&·foo.bar.baz.buzz; + 54 │ + foo.bar?.baz?.buzz; + 55 55 │ ``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts index f7c56ce896dd..593176a88fbe 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts @@ -1,3 +1,4 @@ +const foo = {}; // chained members typeof foo != 'undefined' && foo.bar; typeof foo.bar != 'undefined' && foo.bar.baz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts.snap index 3b4195431b63..ce67ac88c0ca 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts.snap +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/typeofLogicalAndCases2.ts.snap @@ -5,6 +5,7 @@ expression: typeofLogicalAndCases2.ts --- # Input ```ts +const foo = {}; // chained members typeof foo != 'undefined' && foo.bar; typeof foo.bar != 'undefined' && foo.bar.baz; @@ -63,730 +64,732 @@ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.ba # Diagnostics ``` -typeofLogicalAndCases2.ts:2:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - > 2 │ typeof foo != 'undefined' && foo.bar; + 1 │ const foo = {}; + 2 │ // chained members + > 3 │ typeof foo != 'undefined' && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - 4 │ typeof foo != 'undefined' && foo(); + 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 5 │ typeof foo != 'undefined' && foo(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 │ - typeof·foo·!=·'undefined'·&&·foo.bar; - 2 │ + foo?.bar; - 3 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - 4 4 │ typeof foo != 'undefined' && foo(); + 1 1 │ const foo = {}; + 2 2 │ // chained members + 3 │ - typeof·foo·!=·'undefined'·&&·foo.bar; + 3 │ + foo?.bar; + 4 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 5 5 │ typeof foo != 'undefined' && foo(); ``` ``` -typeofLogicalAndCases2.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - 2 │ typeof foo != 'undefined' && foo.bar; - > 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 2 │ // chained members + 3 │ typeof foo != 'undefined' && foo.bar; + > 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 4 │ typeof foo != 'undefined' && foo(); - 5 │ typeof foo.bar != 'undefined' && foo.bar(); + 5 │ typeof foo != 'undefined' && foo(); + 6 │ typeof foo.bar != 'undefined' && foo.bar(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 2 │ typeof foo != 'undefined' && foo.bar; - 3 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz; - 3 │ + foo.bar?.baz; - 4 4 │ typeof foo != 'undefined' && foo(); - 5 5 │ typeof foo.bar != 'undefined' && foo.bar(); + 2 2 │ // chained members + 3 3 │ typeof foo != 'undefined' && foo.bar; + 4 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz; + 4 │ + foo.bar?.baz; + 5 5 │ typeof foo != 'undefined' && foo(); + 6 6 │ typeof foo.bar != 'undefined' && foo.bar(); ``` ``` -typeofLogicalAndCases2.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 2 │ typeof foo != 'undefined' && foo.bar; - 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - > 4 │ typeof foo != 'undefined' && foo(); + 3 │ typeof foo != 'undefined' && foo.bar; + 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + > 5 │ typeof foo != 'undefined' && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 5 │ typeof foo.bar != 'undefined' && foo.bar(); - 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 6 │ typeof foo.bar != 'undefined' && foo.bar(); + 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 2 2 │ typeof foo != 'undefined' && foo.bar; - 3 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - 4 │ - typeof·foo·!=·'undefined'·&&·foo(); - 4 │ + foo?.(); - 5 5 │ typeof foo.bar != 'undefined' && foo.bar(); - 6 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 3 3 │ typeof foo != 'undefined' && foo.bar; + 4 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 5 │ - typeof·foo·!=·'undefined'·&&·foo(); + 5 │ + foo?.(); + 6 6 │ typeof foo.bar != 'undefined' && foo.bar(); + 7 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - 4 │ typeof foo != 'undefined' && foo(); - > 5 │ typeof foo.bar != 'undefined' && foo.bar(); + 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 5 │ typeof foo != 'undefined' && foo(); + > 6 │ typeof foo.bar != 'undefined' && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 7 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 8 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 3 3 │ typeof foo.bar != 'undefined' && foo.bar.baz; - 4 4 │ typeof foo != 'undefined' && foo(); - 5 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar(); - 5 │ + foo.bar?.(); - 6 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 7 7 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 4 4 │ typeof foo.bar != 'undefined' && foo.bar.baz; + 5 5 │ typeof foo != 'undefined' && foo(); + 6 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar(); + 6 │ + foo.bar?.(); + 7 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 8 8 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 4 │ typeof foo != 'undefined' && foo(); - 5 │ typeof foo.bar != 'undefined' && foo.bar(); - > 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 5 │ typeof foo != 'undefined' && foo(); + 6 │ typeof foo.bar != 'undefined' && foo.bar(); + > 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 7 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 8 │ + 8 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 9 │ i Unsafe fix: Change to an optional chain. - 4 4 │ typeof foo != 'undefined' && foo(); - 5 5 │ typeof foo.bar != 'undefined' && foo.bar(); - 6 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; - 6 │ + foo?.bar?.baz?.buzz; - 7 7 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 8 8 │ + 5 5 │ typeof foo != 'undefined' && foo(); + 6 6 │ typeof foo.bar != 'undefined' && foo.bar(); + 7 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; + 7 │ + foo?.bar?.baz?.buzz; + 8 8 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 9 9 │ ``` ``` -typeofLogicalAndCases2.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:8:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 5 │ typeof foo.bar != 'undefined' && foo.bar(); - 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - > 7 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 │ - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 │ typeof foo.bar != 'undefined' && foo.bar(); + 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + > 8 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 9 │ + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 5 5 │ typeof foo.bar != 'undefined' && foo.bar(); - 6 6 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 7 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; - 7 │ + foo.bar?.baz?.buzz; - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 6 │ typeof foo.bar != 'undefined' && foo.bar(); + 7 7 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 8 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; + 8 │ + foo.bar?.baz?.buzz; + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases2.ts:10:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 10 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 11 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 11 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; - 12 │ + 12 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + 13 │ i Unsafe fix: Change to an optional chain. - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz; - 10 │ + foo?.bar?.baz.buzz; - 11 11 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; - 12 12 │ + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz; + 11 │ + foo?.bar?.baz.buzz; + 12 12 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + 13 13 │ ``` ``` -typeofLogicalAndCases2.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:12:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; - > 11 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + > 12 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 12 │ - 13 │ // case where for some reason there is a doubled up expression + 13 │ + 14 │ // case where for some reason there is a doubled up expression i Unsafe fix: Change to an optional chain. - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 10 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; - 11 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz; - 11 │ + foo.bar?.baz.buzz; - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 11 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz; + 12 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz; + 12 │ + foo.bar?.baz.buzz; + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression ``` ``` -typeofLogicalAndCases2.ts:14:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - > 14 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + > 15 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 15 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 16 │ + 16 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 17 │ i Unsafe fix: Change to an optional chain. - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression - 14 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; - 14 │ + foo?.bar?.baz?.buzz; - 15 15 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 16 16 │ + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression + 15 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; + 15 │ + foo?.bar?.baz?.buzz; + 16 16 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 17 17 │ ``` ``` -typeofLogicalAndCases2.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:16:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - 14 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - > 15 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + 15 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + > 16 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 16 │ - 17 │ // chained members with element access + 17 │ + 18 │ // chained members with element access i Unsafe fix: Change to an optional chain. - 13 13 │ // case where for some reason there is a doubled up expression - 14 14 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; - 15 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; - 15 │ + foo.bar?.baz?.buzz; - 16 16 │ - 17 17 │ // chained members with element access + 14 14 │ // case where for some reason there is a doubled up expression + 15 15 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz; + 16 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz; + 16 │ + foo.bar?.baz?.buzz; + 17 17 │ + 18 18 │ // chained members with element access ``` ``` -typeofLogicalAndCases2.ts:18:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:19:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 17 │ // chained members with element access - > 18 │ typeof foo != 'undefined' && typeof foo[bar] != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + 18 │ // chained members with element access + > 19 │ typeof foo != 'undefined' && typeof foo[bar] != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 19 │ - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 20 │ + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 16 16 │ - 17 17 │ // chained members with element access - 18 │ - typeof·foo·!=·'undefined'·&&·typeof·foo[bar]·!=·'undefined'·&&·typeof·foo[bar].baz·!=·'undefined'·&&·foo[bar].baz.buzz; - 18 │ + foo?.[bar]?.baz?.buzz; - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 17 17 │ + 18 18 │ // chained members with element access + 19 │ - typeof·foo·!=·'undefined'·&&·typeof·foo[bar]·!=·'undefined'·&&·typeof·foo[bar].baz·!=·'undefined'·&&·foo[bar].baz.buzz; + 19 │ + foo?.[bar]?.baz?.buzz; + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases2.ts:21:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:22:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 21 │ typeof foo != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 22 │ typeof foo != 'undefined' && typeof foo[bar].baz != 'undefined' && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 22 │ - 23 │ // chained calls + 23 │ + 24 │ // chained calls i Unsafe fix: Change to an optional chain. - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - 21 │ - typeof·foo·!=·'undefined'·&&·typeof·foo[bar].baz·!=·'undefined'·&&·foo[bar].baz.buzz; - 21 │ + foo?.[bar].baz?.buzz; - 22 22 │ - 23 23 │ // chained calls + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + 22 │ - typeof·foo·!=·'undefined'·&&·typeof·foo[bar].baz·!=·'undefined'·&&·foo[bar].baz.buzz; + 22 │ + foo?.[bar].baz?.buzz; + 23 23 │ + 24 24 │ // chained calls ``` ``` -typeofLogicalAndCases2.ts:24:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - > 24 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); + 24 │ // chained calls + > 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - 26 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 26 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 27 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); i Unsafe fix: Change to an optional chain. - 22 22 │ - 23 23 │ // chained calls - 24 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz(); - 24 │ + foo?.bar?.baz?.buzz(); - 25 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - 26 26 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 23 23 │ + 24 24 │ // chained calls + 25 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·foo.bar.baz.buzz(); + 25 │ + foo?.bar?.baz?.buzz(); + 26 26 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 27 27 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); ``` ``` -typeofLogicalAndCases2.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - 24 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); - > 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 24 │ // chained calls + 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); + > 26 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 26 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - 27 │ + 27 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 28 │ i Unsafe fix: Change to an optional chain. - 23 23 │ // chained calls - 24 24 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); - 25 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); - 25 │ + foo?.bar?.baz?.buzz?.(); - 26 26 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - 27 27 │ + 24 24 │ // chained calls + 25 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); + 26 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); + 26 │ + foo?.bar?.baz?.buzz?.(); + 27 27 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 28 28 │ ``` ``` -typeofLogicalAndCases2.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:27:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 24 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); - 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - > 26 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); + 26 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + > 27 │ typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 27 │ - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 28 │ + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 24 24 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); - 25 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); - 26 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); - 26 │ + foo.bar?.baz?.buzz?.(); - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 25 25 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && foo.bar.baz.buzz(); + 26 26 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 27 │ - typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); + 27 │ + foo.bar?.baz?.buzz?.(); + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases2.ts:29:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 29 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 30 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 30 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); - 31 │ + 31 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + 32 │ i Unsafe fix: Change to an optional chain. - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz(); - 29 │ + foo?.bar?.baz.buzz(); - 30 30 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); - 31 31 │ + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz(); + 30 │ + foo?.bar?.baz.buzz(); + 31 31 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + 32 32 │ ``` ``` -typeofLogicalAndCases2.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:31:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); - > 30 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + > 31 │ typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 31 │ - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 32 │ + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 29 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); - 30 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz(); - 30 │ + foo.bar?.baz.buzz(); - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 30 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && foo.bar.baz.buzz(); + 31 │ - typeof·foo.bar·!=·'undefined'·&&·foo.bar.baz.buzz(); + 31 │ + foo.bar?.baz.buzz(); + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -typeofLogicalAndCases2.ts:33:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:34:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 33 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 34 │ typeof foo != 'undefined' && typeof foo.bar != 'undefined' && typeof foo.bar.baz.buzz != 'undefined' && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 34 │ - 35 │ // case with a call expr inside the chain for some inefficient reason + 35 │ + 36 │ // case with a call expr inside the chain for some inefficient reason i Unsafe fix: Change to an optional chain. - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - 33 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); - 33 │ + foo?.bar?.baz.buzz?.(); - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + 34 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar·!=·'undefined'·&&·typeof·foo.bar.baz.buzz·!=·'undefined'·&&·foo.bar.baz.buzz(); + 34 │ + foo?.bar?.baz.buzz?.(); + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason ``` ``` -typeofLogicalAndCases2.ts:36:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:37:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 35 │ // case with a call expr inside the chain for some inefficient reason - > 36 │ typeof foo != 'undefined' && typeof foo.bar() != 'undefined' && typeof foo.bar().baz != 'undefined' && typeof foo.bar().baz.buzz != 'undefined' && foo.bar().baz.buzz(); + 36 │ // case with a call expr inside the chain for some inefficient reason + > 37 │ typeof foo != 'undefined' && typeof foo.bar() != 'undefined' && typeof foo.bar().baz != 'undefined' && typeof foo.bar().baz.buzz != 'undefined' && foo.bar().baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 37 │ + 38 │ i Unsafe fix: Change to an optional chain. - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason - 36 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar()·!=·'undefined'·&&·typeof·foo.bar().baz·!=·'undefined'·&&·typeof·foo.bar().baz.buzz·!=·'undefined'·&&·foo.bar().baz.buzz(); - 36 │ + foo?.bar()?.baz?.buzz?.(); - 37 37 │ + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason + 37 │ - typeof·foo·!=·'undefined'·&&·typeof·foo.bar()·!=·'undefined'·&&·typeof·foo.bar().baz·!=·'undefined'·&&·typeof·foo.bar().baz.buzz·!=·'undefined'·&&·foo.bar().baz.buzz(); + 37 │ + foo?.bar()?.baz?.buzz?.(); 38 38 │ + 39 39 │ ``` ``` -typeofLogicalAndCases2.ts:40:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - > 40 │ typeof foo != "undefined" && foo.bar; + 40 │ // chained members (double quotes) + > 41 │ typeof foo != "undefined" && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - 42 │ typeof foo != "undefined" && foo(); + 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + 43 │ typeof foo != "undefined" && foo(); i Unsafe fix: Change to an optional chain. - 38 38 │ - 39 39 │ // chained members (double quotes) - 40 │ - typeof·foo·!=·"undefined"·&&·foo.bar; - 40 │ + foo?.bar; - 41 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - 42 42 │ typeof foo != "undefined" && foo(); + 39 39 │ + 40 40 │ // chained members (double quotes) + 41 │ - typeof·foo·!=·"undefined"·&&·foo.bar; + 41 │ + foo?.bar; + 42 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + 43 43 │ typeof foo != "undefined" && foo(); ``` ``` -typeofLogicalAndCases2.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - 40 │ typeof foo != "undefined" && foo.bar; - > 41 │ typeof foo.bar != "undefined" && foo.bar.baz; + 40 │ // chained members (double quotes) + 41 │ typeof foo != "undefined" && foo.bar; + > 42 │ typeof foo.bar != "undefined" && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 42 │ typeof foo != "undefined" && foo(); - 43 │ typeof foo.bar != "undefined" && foo.bar(); + 43 │ typeof foo != "undefined" && foo(); + 44 │ typeof foo.bar != "undefined" && foo.bar(); i Unsafe fix: Change to an optional chain. - 39 39 │ // chained members (double quotes) - 40 40 │ typeof foo != "undefined" && foo.bar; - 41 │ - typeof·foo.bar·!=·"undefined"·&&·foo.bar.baz; - 41 │ + foo.bar?.baz; - 42 42 │ typeof foo != "undefined" && foo(); - 43 43 │ typeof foo.bar != "undefined" && foo.bar(); + 40 40 │ // chained members (double quotes) + 41 41 │ typeof foo != "undefined" && foo.bar; + 42 │ - typeof·foo.bar·!=·"undefined"·&&·foo.bar.baz; + 42 │ + foo.bar?.baz; + 43 43 │ typeof foo != "undefined" && foo(); + 44 44 │ typeof foo.bar != "undefined" && foo.bar(); ``` ``` -typeofLogicalAndCases2.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 40 │ typeof foo != "undefined" && foo.bar; - 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - > 42 │ typeof foo != "undefined" && foo(); + 41 │ typeof foo != "undefined" && foo.bar; + 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + > 43 │ typeof foo != "undefined" && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 43 │ typeof foo.bar != "undefined" && foo.bar(); - 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 44 │ typeof foo.bar != "undefined" && foo.bar(); + 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 40 40 │ typeof foo != "undefined" && foo.bar; - 41 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - 42 │ - typeof·foo·!=·"undefined"·&&·foo(); - 42 │ + foo?.(); - 43 43 │ typeof foo.bar != "undefined" && foo.bar(); - 44 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 41 41 │ typeof foo != "undefined" && foo.bar; + 42 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + 43 │ - typeof·foo·!=·"undefined"·&&·foo(); + 43 │ + foo?.(); + 44 44 │ typeof foo.bar != "undefined" && foo.bar(); + 45 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - 42 │ typeof foo != "undefined" && foo(); - > 43 │ typeof foo.bar != "undefined" && foo.bar(); + 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + 43 │ typeof foo != "undefined" && foo(); + > 44 │ typeof foo.bar != "undefined" && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - 45 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 46 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 41 41 │ typeof foo.bar != "undefined" && foo.bar.baz; - 42 42 │ typeof foo != "undefined" && foo(); - 43 │ - typeof·foo.bar·!=·"undefined"·&&·foo.bar(); - 43 │ + foo.bar?.(); - 44 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - 45 45 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 42 42 │ typeof foo.bar != "undefined" && foo.bar.baz; + 43 43 │ typeof foo != "undefined" && foo(); + 44 │ - typeof·foo.bar·!=·"undefined"·&&·foo.bar(); + 44 │ + foo.bar?.(); + 45 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 46 46 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 42 │ typeof foo != "undefined" && foo(); - 43 │ typeof foo.bar != "undefined" && foo.bar(); - > 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 43 │ typeof foo != "undefined" && foo(); + 44 │ typeof foo.bar != "undefined" && foo.bar(); + > 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 45 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - 46 │ + 46 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 47 │ i Unsafe fix: Change to an optional chain. - 42 42 │ typeof foo != "undefined" && foo(); - 43 43 │ typeof foo.bar != "undefined" && foo.bar(); - 44 │ - typeof·foo·!=·"undefined"·&&·typeof·foo.bar·!=·"undefined"·&&·typeof·foo.bar.baz·!=·"undefined"·&&·foo.bar.baz.buzz; - 44 │ + foo?.bar?.baz?.buzz; - 45 45 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - 46 46 │ + 43 43 │ typeof foo != "undefined" && foo(); + 44 44 │ typeof foo.bar != "undefined" && foo.bar(); + 45 │ - typeof·foo·!=·"undefined"·&&·typeof·foo.bar·!=·"undefined"·&&·typeof·foo.bar.baz·!=·"undefined"·&&·foo.bar.baz.buzz; + 45 │ + foo?.bar?.baz?.buzz; + 46 46 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 47 47 │ ``` ``` -typeofLogicalAndCases2.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:46:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 43 │ typeof foo.bar != "undefined" && foo.bar(); - 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - > 45 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 44 │ typeof foo.bar != "undefined" && foo.bar(); + 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + > 46 │ typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 46 │ - 47 │ // chained members (backticks) + 47 │ + 48 │ // chained members (backticks) i Unsafe fix: Change to an optional chain. - 43 43 │ typeof foo.bar != "undefined" && foo.bar(); - 44 44 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; - 45 │ - typeof·foo.bar·!=·"undefined"·&&·typeof·foo.bar.baz·!=·"undefined"·&&·foo.bar.baz.buzz; - 45 │ + foo.bar?.baz?.buzz; - 46 46 │ - 47 47 │ // chained members (backticks) + 44 44 │ typeof foo.bar != "undefined" && foo.bar(); + 45 45 │ typeof foo != "undefined" && typeof foo.bar != "undefined" && typeof foo.bar.baz != "undefined" && foo.bar.baz.buzz; + 46 │ - typeof·foo.bar·!=·"undefined"·&&·typeof·foo.bar.baz·!=·"undefined"·&&·foo.bar.baz.buzz; + 46 │ + foo.bar?.baz?.buzz; + 47 47 │ + 48 48 │ // chained members (backticks) ``` ``` -typeofLogicalAndCases2.ts:48:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - > 48 │ typeof foo != `undefined` && foo.bar; + 48 │ // chained members (backticks) + > 49 │ typeof foo != `undefined` && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - 50 │ typeof foo != `undefined` && foo(); + 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + 51 │ typeof foo != `undefined` && foo(); i Unsafe fix: Change to an optional chain. - 46 46 │ - 47 47 │ // chained members (backticks) - 48 │ - typeof·foo·!=·`undefined`·&&·foo.bar; - 48 │ + foo?.bar; - 49 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - 50 50 │ typeof foo != `undefined` && foo(); + 47 47 │ + 48 48 │ // chained members (backticks) + 49 │ - typeof·foo·!=·`undefined`·&&·foo.bar; + 49 │ + foo?.bar; + 50 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + 51 51 │ typeof foo != `undefined` && foo(); ``` ``` -typeofLogicalAndCases2.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - 48 │ typeof foo != `undefined` && foo.bar; - > 49 │ typeof foo.bar != `undefined` && foo.bar.baz; + 48 │ // chained members (backticks) + 49 │ typeof foo != `undefined` && foo.bar; + > 50 │ typeof foo.bar != `undefined` && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 50 │ typeof foo != `undefined` && foo(); - 51 │ typeof foo.bar != `undefined` && foo.bar(); + 51 │ typeof foo != `undefined` && foo(); + 52 │ typeof foo.bar != `undefined` && foo.bar(); i Unsafe fix: Change to an optional chain. - 47 47 │ // chained members (backticks) - 48 48 │ typeof foo != `undefined` && foo.bar; - 49 │ - typeof·foo.bar·!=·`undefined`·&&·foo.bar.baz; - 49 │ + foo.bar?.baz; - 50 50 │ typeof foo != `undefined` && foo(); - 51 51 │ typeof foo.bar != `undefined` && foo.bar(); + 48 48 │ // chained members (backticks) + 49 49 │ typeof foo != `undefined` && foo.bar; + 50 │ - typeof·foo.bar·!=·`undefined`·&&·foo.bar.baz; + 50 │ + foo.bar?.baz; + 51 51 │ typeof foo != `undefined` && foo(); + 52 52 │ typeof foo.bar != `undefined` && foo.bar(); ``` ``` -typeofLogicalAndCases2.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 48 │ typeof foo != `undefined` && foo.bar; - 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - > 50 │ typeof foo != `undefined` && foo(); + 49 │ typeof foo != `undefined` && foo.bar; + 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + > 51 │ typeof foo != `undefined` && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 51 │ typeof foo.bar != `undefined` && foo.bar(); - 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 52 │ typeof foo.bar != `undefined` && foo.bar(); + 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 48 48 │ typeof foo != `undefined` && foo.bar; - 49 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - 50 │ - typeof·foo·!=·`undefined`·&&·foo(); - 50 │ + foo?.(); - 51 51 │ typeof foo.bar != `undefined` && foo.bar(); - 52 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 49 49 │ typeof foo != `undefined` && foo.bar; + 50 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + 51 │ - typeof·foo·!=·`undefined`·&&·foo(); + 51 │ + foo?.(); + 52 52 │ typeof foo.bar != `undefined` && foo.bar(); + 53 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - 50 │ typeof foo != `undefined` && foo(); - > 51 │ typeof foo.bar != `undefined` && foo.bar(); + 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + 51 │ typeof foo != `undefined` && foo(); + > 52 │ typeof foo.bar != `undefined` && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - 53 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 54 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 49 49 │ typeof foo.bar != `undefined` && foo.bar.baz; - 50 50 │ typeof foo != `undefined` && foo(); - 51 │ - typeof·foo.bar·!=·`undefined`·&&·foo.bar(); - 51 │ + foo.bar?.(); - 52 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - 53 53 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 50 50 │ typeof foo.bar != `undefined` && foo.bar.baz; + 51 51 │ typeof foo != `undefined` && foo(); + 52 │ - typeof·foo.bar·!=·`undefined`·&&·foo.bar(); + 52 │ + foo.bar?.(); + 53 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 54 54 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; ``` ``` -typeofLogicalAndCases2.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 50 │ typeof foo != `undefined` && foo(); - 51 │ typeof foo.bar != `undefined` && foo.bar(); - > 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 51 │ typeof foo != `undefined` && foo(); + 52 │ typeof foo.bar != `undefined` && foo.bar(); + > 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 53 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - 54 │ + 54 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 55 │ i Unsafe fix: Change to an optional chain. - 50 50 │ typeof foo != `undefined` && foo(); - 51 51 │ typeof foo.bar != `undefined` && foo.bar(); - 52 │ - typeof·foo·!=·`undefined`·&&·typeof·foo.bar·!=·`undefined`·&&·typeof·foo.bar.baz·!=·`undefined`·&&·foo.bar.baz.buzz; - 52 │ + foo?.bar?.baz?.buzz; - 53 53 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - 54 54 │ + 51 51 │ typeof foo != `undefined` && foo(); + 52 52 │ typeof foo.bar != `undefined` && foo.bar(); + 53 │ - typeof·foo·!=·`undefined`·&&·typeof·foo.bar·!=·`undefined`·&&·typeof·foo.bar.baz·!=·`undefined`·&&·foo.bar.baz.buzz; + 53 │ + foo?.bar?.baz?.buzz; + 54 54 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 55 55 │ ``` ``` -typeofLogicalAndCases2.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ +typeofLogicalAndCases2.ts:54:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━ ! Change to an optional chain. - 51 │ typeof foo.bar != `undefined` && foo.bar(); - 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - > 53 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 52 │ typeof foo.bar != `undefined` && foo.bar(); + 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + > 54 │ typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 54 │ + 55 │ i Unsafe fix: Change to an optional chain. - 51 51 │ typeof foo.bar != `undefined` && foo.bar(); - 52 52 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; - 53 │ - typeof·foo.bar·!=·`undefined`·&&·typeof·foo.bar.baz·!=·`undefined`·&&·foo.bar.baz.buzz; - 53 │ + foo.bar?.baz?.buzz; - 54 54 │ + 52 52 │ typeof foo.bar != `undefined` && foo.bar(); + 53 53 │ typeof foo != `undefined` && typeof foo.bar != `undefined` && typeof foo.bar.baz != `undefined` && foo.bar.baz.buzz; + 54 │ - typeof·foo.bar·!=·`undefined`·&&·typeof·foo.bar.baz·!=·`undefined`·&&·foo.bar.baz.buzz; + 54 │ + foo.bar?.baz?.buzz; + 55 55 │ ``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts index 46865601e5a0..722f19ac3ecd 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts @@ -46,5 +46,9 @@ foo[/\w+/] && foo[/ab+c/].baz; typeof foo !== undefined && foo.bar; typeof foo != undefined && foo.bar; +typeof window !== "undefined" && window.location; +"undefined" !== typeof document && document.body; + + // FIXME: This should not generate a diagnostic // (new foo() || {}).bar; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts.snap index 39c6d88ec20e..60a2a50c5b44 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts.snap +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/validCases.ts.snap @@ -53,6 +53,10 @@ foo[/\w+/] && foo[/ab+c/].baz; typeof foo !== undefined && foo.bar; typeof foo != undefined && foo.bar; +typeof window !== "undefined" && window.location; +"undefined" !== typeof document && document.body; + + // FIXME: This should not generate a diagnostic // (new foo() || {}).bar; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts index 87b97629012c..d2629517606a 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts @@ -1,3 +1,4 @@ +const foo = {}; // chained members 'undefined' !== typeof foo && foo.bar; 'undefined' !== typeof foo.bar && foo.bar.baz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts.snap index 5ef149e32607..f81071e545aa 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts.snap +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases1.ts.snap @@ -5,6 +5,7 @@ expression: yoda_expressions_typeofLogicalAndCases1.ts --- # Input ```ts +const foo = {}; // chained members 'undefined' !== typeof foo && foo.bar; 'undefined' !== typeof foo.bar && foo.bar.baz; @@ -63,730 +64,732 @@ expression: yoda_expressions_typeofLogicalAndCases1.ts # Diagnostics ``` -yoda_expressions_typeofLogicalAndCases1.ts:2:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - > 2 │ 'undefined' !== typeof foo && foo.bar; + 1 │ const foo = {}; + 2 │ // chained members + > 3 │ 'undefined' !== typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - 4 │ 'undefined' !== typeof foo && foo(); + 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 5 │ 'undefined' !== typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 │ - 'undefined'·!==·typeof·foo·&&·foo.bar; - 2 │ + foo?.bar; - 3 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - 4 4 │ 'undefined' !== typeof foo && foo(); + 1 1 │ const foo = {}; + 2 2 │ // chained members + 3 │ - 'undefined'·!==·typeof·foo·&&·foo.bar; + 3 │ + foo?.bar; + 4 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 5 5 │ 'undefined' !== typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - 2 │ 'undefined' !== typeof foo && foo.bar; - > 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 2 │ // chained members + 3 │ 'undefined' !== typeof foo && foo.bar; + > 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 4 │ 'undefined' !== typeof foo && foo(); - 5 │ 'undefined' !== typeof foo.bar && foo.bar(); + 5 │ 'undefined' !== typeof foo && foo(); + 6 │ 'undefined' !== typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 2 │ 'undefined' !== typeof foo && foo.bar; - 3 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz; - 3 │ + foo.bar?.baz; - 4 4 │ 'undefined' !== typeof foo && foo(); - 5 5 │ 'undefined' !== typeof foo.bar && foo.bar(); + 2 2 │ // chained members + 3 3 │ 'undefined' !== typeof foo && foo.bar; + 4 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz; + 4 │ + foo.bar?.baz; + 5 5 │ 'undefined' !== typeof foo && foo(); + 6 6 │ 'undefined' !== typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 2 │ 'undefined' !== typeof foo && foo.bar; - 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - > 4 │ 'undefined' !== typeof foo && foo(); + 3 │ 'undefined' !== typeof foo && foo.bar; + 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + > 5 │ 'undefined' !== typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 2 2 │ 'undefined' !== typeof foo && foo.bar; - 3 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - 4 │ - 'undefined'·!==·typeof·foo·&&·foo(); - 4 │ + foo?.(); - 5 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - 6 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 3 3 │ 'undefined' !== typeof foo && foo.bar; + 4 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 5 │ - 'undefined'·!==·typeof·foo·&&·foo(); + 5 │ + foo?.(); + 6 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + 7 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - 4 │ 'undefined' !== typeof foo && foo(); - > 5 │ 'undefined' !== typeof foo.bar && foo.bar(); + 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 5 │ 'undefined' !== typeof foo && foo(); + > 6 │ 'undefined' !== typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 7 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 8 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 3 3 │ 'undefined' !== typeof foo.bar && foo.bar.baz; - 4 4 │ 'undefined' !== typeof foo && foo(); - 5 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar(); - 5 │ + foo.bar?.(); - 6 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 7 7 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 4 4 │ 'undefined' !== typeof foo.bar && foo.bar.baz; + 5 5 │ 'undefined' !== typeof foo && foo(); + 6 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar(); + 6 │ + foo.bar?.(); + 7 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 8 8 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 4 │ 'undefined' !== typeof foo && foo(); - 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - > 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 5 │ 'undefined' !== typeof foo && foo(); + 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + > 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 7 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 8 │ + 8 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 9 │ i Unsafe fix: Change to an optional chain. - 4 4 │ 'undefined' !== typeof foo && foo(); - 5 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - 6 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 6 │ + foo?.bar?.baz?.buzz; - 7 7 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 8 8 │ + 5 5 │ 'undefined' !== typeof foo && foo(); + 6 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + 7 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 7 │ + foo?.bar?.baz?.buzz; + 8 8 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 9 9 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:8:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - > 7 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 │ - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + > 8 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 9 │ + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 5 5 │ 'undefined' !== typeof foo.bar && foo.bar(); - 6 6 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 7 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 7 │ + foo.bar?.baz?.buzz; - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 6 │ 'undefined' !== typeof foo.bar && foo.bar(); + 7 7 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 8 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 8 │ + foo.bar?.baz?.buzz; + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:10:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 10 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 11 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 11 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; - 12 │ + 12 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + 13 │ i Unsafe fix: Change to an optional chain. - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz; - 10 │ + foo?.bar?.baz.buzz; - 11 11 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; - 12 12 │ + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz; + 11 │ + foo?.bar?.baz.buzz; + 12 12 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + 13 13 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:12:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; - > 11 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + > 12 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 12 │ - 13 │ // case where for some reason there is a doubled up expression + 13 │ + 14 │ // case where for some reason there is a doubled up expression i Unsafe fix: Change to an optional chain. - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 10 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; - 11 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz; - 11 │ + foo.bar?.baz.buzz; - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 11 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz; + 12 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz; + 12 │ + foo.bar?.baz.buzz; + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:14:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - > 14 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + > 15 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 15 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 16 │ + 16 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 17 │ i Unsafe fix: Change to an optional chain. - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression - 14 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 14 │ + foo?.bar?.baz?.buzz; - 15 15 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 16 16 │ + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression + 15 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 15 │ + foo?.bar?.baz?.buzz; + 16 16 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 17 17 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:16:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - 14 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - > 15 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + 15 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + > 16 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 16 │ - 17 │ // chained members with element access + 17 │ + 18 │ // chained members with element access i Unsafe fix: Change to an optional chain. - 13 13 │ // case where for some reason there is a doubled up expression - 14 14 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; - 15 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 15 │ + foo.bar?.baz?.buzz; - 16 16 │ - 17 17 │ // chained members with element access + 14 14 │ // case where for some reason there is a doubled up expression + 15 15 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz; + 16 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 16 │ + foo.bar?.baz?.buzz; + 17 17 │ + 18 18 │ // chained members with element access ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:18:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:19:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 17 │ // chained members with element access - > 18 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo[bar] && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + 18 │ // chained members with element access + > 19 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo[bar] && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 19 │ - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 20 │ + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 16 16 │ - 17 17 │ // chained members with element access - 18 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo[bar]·&&·'undefined'·!==·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; - 18 │ + foo?.[bar]?.baz?.buzz; - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 17 17 │ + 18 18 │ // chained members with element access + 19 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo[bar]·&&·'undefined'·!==·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; + 19 │ + foo?.[bar]?.baz?.buzz; + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:21:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:22:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 21 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 22 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo[bar].baz && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 22 │ - 23 │ // chained calls + 23 │ + 24 │ // chained calls i Unsafe fix: Change to an optional chain. - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - 21 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; - 21 │ + foo?.[bar].baz?.buzz; - 22 22 │ - 23 23 │ // chained calls + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + 22 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; + 22 │ + foo?.[bar].baz?.buzz; + 23 23 │ + 24 24 │ // chained calls ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:24:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - > 24 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); + 24 │ // chained calls + > 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 26 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); i Unsafe fix: Change to an optional chain. - 22 22 │ - 23 23 │ // chained calls - 24 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz(); - 24 │ + foo?.bar?.baz?.buzz(); - 25 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 26 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 23 23 │ + 24 24 │ // chained calls + 25 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz(); + 25 │ + foo?.bar?.baz?.buzz(); + 26 26 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 27 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - 24 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); - > 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 24 │ // chained calls + 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); + > 26 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 26 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 27 │ + 27 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 28 │ i Unsafe fix: Change to an optional chain. - 23 23 │ // chained calls - 24 24 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 25 │ + foo?.bar?.baz?.buzz?.(); - 26 26 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 27 27 │ + 24 24 │ // chained calls + 25 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 26 │ + foo?.bar?.baz?.buzz?.(); + 27 27 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 28 28 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:27:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 24 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - > 26 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + > 27 │ 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 27 │ - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 28 │ + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 24 24 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 26 │ + foo.bar?.baz?.buzz?.(); - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 25 25 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 26 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 │ - 'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 27 │ + foo.bar?.baz?.buzz?.(); + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:29:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 29 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 30 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 30 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); - 31 │ + 31 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + 32 │ i Unsafe fix: Change to an optional chain. - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz(); - 29 │ + foo?.bar?.baz.buzz(); - 30 30 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); - 31 31 │ + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz(); + 30 │ + foo?.bar?.baz.buzz(); + 31 31 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + 32 32 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:31:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); - > 30 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + > 31 │ 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 31 │ - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 32 │ + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 29 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); - 30 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz(); - 30 │ + foo.bar?.baz.buzz(); - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 30 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && foo.bar.baz.buzz(); + 31 │ - 'undefined'·!==·typeof·foo.bar·&&·foo.bar.baz.buzz(); + 31 │ + foo.bar?.baz.buzz(); + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:33:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:34:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 33 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 34 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar && 'undefined' !== typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 34 │ - 35 │ // case with a call expr inside the chain for some inefficient reason + 35 │ + 36 │ // case with a call expr inside the chain for some inefficient reason i Unsafe fix: Change to an optional chain. - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - 33 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 33 │ + foo?.bar?.baz.buzz?.(); - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + 34 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar·&&·'undefined'·!==·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 34 │ + foo?.bar?.baz.buzz?.(); + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:36:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:37:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 35 │ // case with a call expr inside the chain for some inefficient reason - > 36 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar() && 'undefined' !== typeof foo.bar().baz && 'undefined' !== typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + 36 │ // case with a call expr inside the chain for some inefficient reason + > 37 │ 'undefined' !== typeof foo && 'undefined' !== typeof foo.bar() && 'undefined' !== typeof foo.bar().baz && 'undefined' !== typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 37 │ + 38 │ i Unsafe fix: Change to an optional chain. - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason - 36 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar()·&&·'undefined'·!==·typeof·foo.bar().baz·&&·'undefined'·!==·typeof·foo.bar().baz.buzz·&&·foo.bar().baz.buzz(); - 36 │ + foo?.bar()?.baz?.buzz?.(); - 37 37 │ + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason + 37 │ - 'undefined'·!==·typeof·foo·&&·'undefined'·!==·typeof·foo.bar()·&&·'undefined'·!==·typeof·foo.bar().baz·&&·'undefined'·!==·typeof·foo.bar().baz.buzz·&&·foo.bar().baz.buzz(); + 37 │ + foo?.bar()?.baz?.buzz?.(); 38 38 │ + 39 39 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:40:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - > 40 │ "undefined" !== typeof foo && foo.bar; + 40 │ // chained members (double quotes) + > 41 │ "undefined" !== typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - 42 │ "undefined" !== typeof foo && foo(); + 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 43 │ "undefined" !== typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 38 38 │ - 39 39 │ // chained members (double quotes) - 40 │ - "undefined"·!==·typeof·foo·&&·foo.bar; - 40 │ + foo?.bar; - 41 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - 42 42 │ "undefined" !== typeof foo && foo(); + 39 39 │ + 40 40 │ // chained members (double quotes) + 41 │ - "undefined"·!==·typeof·foo·&&·foo.bar; + 41 │ + foo?.bar; + 42 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 43 43 │ "undefined" !== typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - 40 │ "undefined" !== typeof foo && foo.bar; - > 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 40 │ // chained members (double quotes) + 41 │ "undefined" !== typeof foo && foo.bar; + > 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 42 │ "undefined" !== typeof foo && foo(); - 43 │ "undefined" !== typeof foo.bar && foo.bar(); + 43 │ "undefined" !== typeof foo && foo(); + 44 │ "undefined" !== typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 39 39 │ // chained members (double quotes) - 40 40 │ "undefined" !== typeof foo && foo.bar; - 41 │ - "undefined"·!==·typeof·foo.bar·&&·foo.bar.baz; - 41 │ + foo.bar?.baz; - 42 42 │ "undefined" !== typeof foo && foo(); - 43 43 │ "undefined" !== typeof foo.bar && foo.bar(); + 40 40 │ // chained members (double quotes) + 41 41 │ "undefined" !== typeof foo && foo.bar; + 42 │ - "undefined"·!==·typeof·foo.bar·&&·foo.bar.baz; + 42 │ + foo.bar?.baz; + 43 43 │ "undefined" !== typeof foo && foo(); + 44 44 │ "undefined" !== typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 40 │ "undefined" !== typeof foo && foo.bar; - 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - > 42 │ "undefined" !== typeof foo && foo(); + 41 │ "undefined" !== typeof foo && foo.bar; + 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + > 43 │ "undefined" !== typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 43 │ "undefined" !== typeof foo.bar && foo.bar(); - 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 44 │ "undefined" !== typeof foo.bar && foo.bar(); + 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 40 40 │ "undefined" !== typeof foo && foo.bar; - 41 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - 42 │ - "undefined"·!==·typeof·foo·&&·foo(); - 42 │ + foo?.(); - 43 43 │ "undefined" !== typeof foo.bar && foo.bar(); - 44 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 41 41 │ "undefined" !== typeof foo && foo.bar; + 42 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 43 │ - "undefined"·!==·typeof·foo·&&·foo(); + 43 │ + foo?.(); + 44 44 │ "undefined" !== typeof foo.bar && foo.bar(); + 45 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - 42 │ "undefined" !== typeof foo && foo(); - > 43 │ "undefined" !== typeof foo.bar && foo.bar(); + 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 43 │ "undefined" !== typeof foo && foo(); + > 44 │ "undefined" !== typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - 45 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 46 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 41 41 │ "undefined" !== typeof foo.bar && foo.bar.baz; - 42 42 │ "undefined" !== typeof foo && foo(); - 43 │ - "undefined"·!==·typeof·foo.bar·&&·foo.bar(); - 43 │ + foo.bar?.(); - 44 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - 45 45 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 42 42 │ "undefined" !== typeof foo.bar && foo.bar.baz; + 43 43 │ "undefined" !== typeof foo && foo(); + 44 │ - "undefined"·!==·typeof·foo.bar·&&·foo.bar(); + 44 │ + foo.bar?.(); + 45 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 46 46 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 42 │ "undefined" !== typeof foo && foo(); - 43 │ "undefined" !== typeof foo.bar && foo.bar(); - > 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 43 │ "undefined" !== typeof foo && foo(); + 44 │ "undefined" !== typeof foo.bar && foo.bar(); + > 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 45 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - 46 │ + 46 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 47 │ i Unsafe fix: Change to an optional chain. - 42 42 │ "undefined" !== typeof foo && foo(); - 43 43 │ "undefined" !== typeof foo.bar && foo.bar(); - 44 │ - "undefined"·!==·typeof·foo·&&·"undefined"·!==·typeof·foo.bar·&&·"undefined"·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 44 │ + foo?.bar?.baz?.buzz; - 45 45 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - 46 46 │ + 43 43 │ "undefined" !== typeof foo && foo(); + 44 44 │ "undefined" !== typeof foo.bar && foo.bar(); + 45 │ - "undefined"·!==·typeof·foo·&&·"undefined"·!==·typeof·foo.bar·&&·"undefined"·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 45 │ + foo?.bar?.baz?.buzz; + 46 46 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 47 47 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:46:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 43 │ "undefined" !== typeof foo.bar && foo.bar(); - 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - > 45 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 44 │ "undefined" !== typeof foo.bar && foo.bar(); + 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + > 46 │ "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 46 │ - 47 │ // chained members (backticks) + 47 │ + 48 │ // chained members (backticks) i Unsafe fix: Change to an optional chain. - 43 43 │ "undefined" !== typeof foo.bar && foo.bar(); - 44 44 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; - 45 │ - "undefined"·!==·typeof·foo.bar·&&·"undefined"·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 45 │ + foo.bar?.baz?.buzz; - 46 46 │ - 47 47 │ // chained members (backticks) + 44 44 │ "undefined" !== typeof foo.bar && foo.bar(); + 45 45 │ "undefined" !== typeof foo && "undefined" !== typeof foo.bar && "undefined" !== typeof foo.bar.baz && foo.bar.baz.buzz; + 46 │ - "undefined"·!==·typeof·foo.bar·&&·"undefined"·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 46 │ + foo.bar?.baz?.buzz; + 47 47 │ + 48 48 │ // chained members (backticks) ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:48:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - > 48 │ `undefined` !== typeof foo && foo.bar; + 48 │ // chained members (backticks) + > 49 │ `undefined` !== typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - 50 │ `undefined` !== typeof foo && foo(); + 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 51 │ `undefined` !== typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 46 46 │ - 47 47 │ // chained members (backticks) - 48 │ - `undefined`·!==·typeof·foo·&&·foo.bar; - 48 │ + foo?.bar; - 49 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - 50 50 │ `undefined` !== typeof foo && foo(); + 47 47 │ + 48 48 │ // chained members (backticks) + 49 │ - `undefined`·!==·typeof·foo·&&·foo.bar; + 49 │ + foo?.bar; + 50 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 51 51 │ `undefined` !== typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - 48 │ `undefined` !== typeof foo && foo.bar; - > 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 48 │ // chained members (backticks) + 49 │ `undefined` !== typeof foo && foo.bar; + > 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 50 │ `undefined` !== typeof foo && foo(); - 51 │ `undefined` !== typeof foo.bar && foo.bar(); + 51 │ `undefined` !== typeof foo && foo(); + 52 │ `undefined` !== typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 47 47 │ // chained members (backticks) - 48 48 │ `undefined` !== typeof foo && foo.bar; - 49 │ - `undefined`·!==·typeof·foo.bar·&&·foo.bar.baz; - 49 │ + foo.bar?.baz; - 50 50 │ `undefined` !== typeof foo && foo(); - 51 51 │ `undefined` !== typeof foo.bar && foo.bar(); + 48 48 │ // chained members (backticks) + 49 49 │ `undefined` !== typeof foo && foo.bar; + 50 │ - `undefined`·!==·typeof·foo.bar·&&·foo.bar.baz; + 50 │ + foo.bar?.baz; + 51 51 │ `undefined` !== typeof foo && foo(); + 52 52 │ `undefined` !== typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 48 │ `undefined` !== typeof foo && foo.bar; - 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - > 50 │ `undefined` !== typeof foo && foo(); + 49 │ `undefined` !== typeof foo && foo.bar; + 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + > 51 │ `undefined` !== typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 51 │ `undefined` !== typeof foo.bar && foo.bar(); - 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 52 │ `undefined` !== typeof foo.bar && foo.bar(); + 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 48 48 │ `undefined` !== typeof foo && foo.bar; - 49 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - 50 │ - `undefined`·!==·typeof·foo·&&·foo(); - 50 │ + foo?.(); - 51 51 │ `undefined` !== typeof foo.bar && foo.bar(); - 52 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 49 49 │ `undefined` !== typeof foo && foo.bar; + 50 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 51 │ - `undefined`·!==·typeof·foo·&&·foo(); + 51 │ + foo?.(); + 52 52 │ `undefined` !== typeof foo.bar && foo.bar(); + 53 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - 50 │ `undefined` !== typeof foo && foo(); - > 51 │ `undefined` !== typeof foo.bar && foo.bar(); + 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 51 │ `undefined` !== typeof foo && foo(); + > 52 │ `undefined` !== typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - 53 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 54 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 49 49 │ `undefined` !== typeof foo.bar && foo.bar.baz; - 50 50 │ `undefined` !== typeof foo && foo(); - 51 │ - `undefined`·!==·typeof·foo.bar·&&·foo.bar(); - 51 │ + foo.bar?.(); - 52 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - 53 53 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 50 50 │ `undefined` !== typeof foo.bar && foo.bar.baz; + 51 51 │ `undefined` !== typeof foo && foo(); + 52 │ - `undefined`·!==·typeof·foo.bar·&&·foo.bar(); + 52 │ + foo.bar?.(); + 53 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 54 54 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 50 │ `undefined` !== typeof foo && foo(); - 51 │ `undefined` !== typeof foo.bar && foo.bar(); - > 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 51 │ `undefined` !== typeof foo && foo(); + 52 │ `undefined` !== typeof foo.bar && foo.bar(); + > 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 53 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - 54 │ + 54 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 55 │ i Unsafe fix: Change to an optional chain. - 50 50 │ `undefined` !== typeof foo && foo(); - 51 51 │ `undefined` !== typeof foo.bar && foo.bar(); - 52 │ - `undefined`·!==·typeof·foo·&&·`undefined`·!==·typeof·foo.bar·&&·`undefined`·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 52 │ + foo?.bar?.baz?.buzz; - 53 53 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - 54 54 │ + 51 51 │ `undefined` !== typeof foo && foo(); + 52 52 │ `undefined` !== typeof foo.bar && foo.bar(); + 53 │ - `undefined`·!==·typeof·foo·&&·`undefined`·!==·typeof·foo.bar·&&·`undefined`·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 53 │ + foo?.bar?.baz?.buzz; + 54 54 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 55 55 │ ``` ``` -yoda_expressions_typeofLogicalAndCases1.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases1.ts:54:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 51 │ `undefined` !== typeof foo.bar && foo.bar(); - 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - > 53 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 52 │ `undefined` !== typeof foo.bar && foo.bar(); + 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + > 54 │ `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 54 │ + 55 │ i Unsafe fix: Change to an optional chain. - 51 51 │ `undefined` !== typeof foo.bar && foo.bar(); - 52 52 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; - 53 │ - `undefined`·!==·typeof·foo.bar·&&·`undefined`·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 53 │ + foo.bar?.baz?.buzz; - 54 54 │ + 52 52 │ `undefined` !== typeof foo.bar && foo.bar(); + 53 53 │ `undefined` !== typeof foo && `undefined` !== typeof foo.bar && `undefined` !== typeof foo.bar.baz && foo.bar.baz.buzz; + 54 │ - `undefined`·!==·typeof·foo.bar·&&·`undefined`·!==·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 54 │ + foo.bar?.baz?.buzz; + 55 55 │ ``` diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts index ad73bd0e3988..1180fffb6bcf 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts @@ -1,3 +1,4 @@ +const foo = {}; // chained members 'undefined' != typeof foo && foo.bar; 'undefined' != typeof foo.bar && foo.bar.baz; diff --git a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts.snap b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts.snap index 413aa145224b..294a42b2fca3 100644 --- a/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts.snap +++ b/crates/biome_js_analyze/tests/specs/complexity/useOptionalChain/yoda_expressions_typeofLogicalAndCases2.ts.snap @@ -5,6 +5,7 @@ expression: yoda_expressions_typeofLogicalAndCases2.ts --- # Input ```ts +const foo = {}; // chained members 'undefined' != typeof foo && foo.bar; 'undefined' != typeof foo.bar && foo.bar.baz; @@ -63,730 +64,732 @@ expression: yoda_expressions_typeofLogicalAndCases2.ts # Diagnostics ``` -yoda_expressions_typeofLogicalAndCases2.ts:2:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - > 2 │ 'undefined' != typeof foo && foo.bar; + 1 │ const foo = {}; + 2 │ // chained members + > 3 │ 'undefined' != typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - 4 │ 'undefined' != typeof foo && foo(); + 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 5 │ 'undefined' != typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 │ - 'undefined'·!=·typeof·foo·&&·foo.bar; - 2 │ + foo?.bar; - 3 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - 4 4 │ 'undefined' != typeof foo && foo(); + 1 1 │ const foo = {}; + 2 2 │ // chained members + 3 │ - 'undefined'·!=·typeof·foo·&&·foo.bar; + 3 │ + foo?.bar; + 4 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 5 5 │ 'undefined' != typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:3:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 1 │ // chained members - 2 │ 'undefined' != typeof foo && foo.bar; - > 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 2 │ // chained members + 3 │ 'undefined' != typeof foo && foo.bar; + > 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 4 │ 'undefined' != typeof foo && foo(); - 5 │ 'undefined' != typeof foo.bar && foo.bar(); + 5 │ 'undefined' != typeof foo && foo(); + 6 │ 'undefined' != typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 1 1 │ // chained members - 2 2 │ 'undefined' != typeof foo && foo.bar; - 3 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz; - 3 │ + foo.bar?.baz; - 4 4 │ 'undefined' != typeof foo && foo(); - 5 5 │ 'undefined' != typeof foo.bar && foo.bar(); + 2 2 │ // chained members + 3 3 │ 'undefined' != typeof foo && foo.bar; + 4 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz; + 4 │ + foo.bar?.baz; + 5 5 │ 'undefined' != typeof foo && foo(); + 6 6 │ 'undefined' != typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:4:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 2 │ 'undefined' != typeof foo && foo.bar; - 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - > 4 │ 'undefined' != typeof foo && foo(); + 3 │ 'undefined' != typeof foo && foo.bar; + 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + > 5 │ 'undefined' != typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 5 │ 'undefined' != typeof foo.bar && foo.bar(); - 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 6 │ 'undefined' != typeof foo.bar && foo.bar(); + 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 2 2 │ 'undefined' != typeof foo && foo.bar; - 3 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - 4 │ - 'undefined'·!=·typeof·foo·&&·foo(); - 4 │ + foo?.(); - 5 5 │ 'undefined' != typeof foo.bar && foo.bar(); - 6 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 3 3 │ 'undefined' != typeof foo && foo.bar; + 4 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 5 │ - 'undefined'·!=·typeof·foo·&&·foo(); + 5 │ + foo?.(); + 6 6 │ 'undefined' != typeof foo.bar && foo.bar(); + 7 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:5:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - 4 │ 'undefined' != typeof foo && foo(); - > 5 │ 'undefined' != typeof foo.bar && foo.bar(); + 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 5 │ 'undefined' != typeof foo && foo(); + > 6 │ 'undefined' != typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 7 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 8 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 3 3 │ 'undefined' != typeof foo.bar && foo.bar.baz; - 4 4 │ 'undefined' != typeof foo && foo(); - 5 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar(); - 5 │ + foo.bar?.(); - 6 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 7 7 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 4 4 │ 'undefined' != typeof foo.bar && foo.bar.baz; + 5 5 │ 'undefined' != typeof foo && foo(); + 6 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar(); + 6 │ + foo.bar?.(); + 7 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 8 8 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:6:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 4 │ 'undefined' != typeof foo && foo(); - 5 │ 'undefined' != typeof foo.bar && foo.bar(); - > 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 5 │ 'undefined' != typeof foo && foo(); + 6 │ 'undefined' != typeof foo.bar && foo.bar(); + > 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 7 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 8 │ + 8 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 9 │ i Unsafe fix: Change to an optional chain. - 4 4 │ 'undefined' != typeof foo && foo(); - 5 5 │ 'undefined' != typeof foo.bar && foo.bar(); - 6 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 6 │ + foo?.bar?.baz?.buzz; - 7 7 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 8 8 │ + 5 5 │ 'undefined' != typeof foo && foo(); + 6 6 │ 'undefined' != typeof foo.bar && foo.bar(); + 7 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 7 │ + foo?.bar?.baz?.buzz; + 8 8 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 9 9 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:7:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:8:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 5 │ 'undefined' != typeof foo.bar && foo.bar(); - 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - > 7 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 8 │ - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 │ 'undefined' != typeof foo.bar && foo.bar(); + 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + > 8 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + 9 │ + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 5 5 │ 'undefined' != typeof foo.bar && foo.bar(); - 6 6 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 7 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 7 │ + foo.bar?.baz?.buzz; - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) + 6 6 │ 'undefined' != typeof foo.bar && foo.bar(); + 7 7 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 8 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 8 │ + foo.bar?.baz?.buzz; + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:10:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 10 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 11 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 11 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; - 12 │ + 12 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + 13 │ i Unsafe fix: Change to an optional chain. - 8 8 │ - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz; - 10 │ + foo?.bar?.baz.buzz; - 11 11 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; - 12 12 │ + 9 9 │ + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz; + 11 │ + foo?.bar?.baz.buzz; + 12 12 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + 13 13 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:11:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:12:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; - > 11 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + > 12 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 12 │ - 13 │ // case where for some reason there is a doubled up expression + 13 │ + 14 │ // case where for some reason there is a doubled up expression i Unsafe fix: Change to an optional chain. - 9 9 │ // case with a jump (i.e. a non-'undefined'ish prop) - 10 10 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; - 11 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz; - 11 │ + foo.bar?.baz.buzz; - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression + 10 10 │ // case with a jump (i.e. a non-'undefined'ish prop) + 11 11 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz; + 12 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz; + 12 │ + foo.bar?.baz.buzz; + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:14:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - > 14 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + > 15 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 15 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 16 │ + 16 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 17 │ i Unsafe fix: Change to an optional chain. - 12 12 │ - 13 13 │ // case where for some reason there is a doubled up expression - 14 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 14 │ + foo?.bar?.baz?.buzz; - 15 15 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 16 16 │ + 13 13 │ + 14 14 │ // case where for some reason there is a doubled up expression + 15 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 15 │ + foo?.bar?.baz?.buzz; + 16 16 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 17 17 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:15:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:16:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 13 │ // case where for some reason there is a doubled up expression - 14 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - > 15 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 14 │ // case where for some reason there is a doubled up expression + 15 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + > 16 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 16 │ - 17 │ // chained members with element access + 17 │ + 18 │ // chained members with element access i Unsafe fix: Change to an optional chain. - 13 13 │ // case where for some reason there is a doubled up expression - 14 14 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; - 15 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 15 │ + foo.bar?.baz?.buzz; - 16 16 │ - 17 17 │ // chained members with element access + 14 14 │ // case where for some reason there is a doubled up expression + 15 15 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz; + 16 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 16 │ + foo.bar?.baz?.buzz; + 17 17 │ + 18 18 │ // chained members with element access ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:18:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:19:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 17 │ // chained members with element access - > 18 │ 'undefined' != typeof foo && 'undefined' != typeof foo[bar] && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + 18 │ // chained members with element access + > 19 │ 'undefined' != typeof foo && 'undefined' != typeof foo[bar] && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 19 │ - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 20 │ + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 16 16 │ - 17 17 │ // chained members with element access - 18 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo[bar]·&&·'undefined'·!=·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; - 18 │ + foo?.[bar]?.baz?.buzz; - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) + 17 17 │ + 18 18 │ // chained members with element access + 19 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo[bar]·&&·'undefined'·!=·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; + 19 │ + foo?.[bar]?.baz?.buzz; + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:21:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:22:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 21 │ 'undefined' != typeof foo && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; + 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 22 │ 'undefined' != typeof foo && 'undefined' != typeof foo[bar].baz && foo[bar].baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 22 │ - 23 │ // chained calls + 23 │ + 24 │ // chained calls i Unsafe fix: Change to an optional chain. - 19 19 │ - 20 20 │ // case with a jump (i.e. a non-'undefined'ish prop) - 21 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; - 21 │ + foo?.[bar].baz?.buzz; - 22 22 │ - 23 23 │ // chained calls + 20 20 │ + 21 21 │ // case with a jump (i.e. a non-'undefined'ish prop) + 22 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo[bar].baz·&&·foo[bar].baz.buzz; + 22 │ + foo?.[bar].baz?.buzz; + 23 23 │ + 24 24 │ // chained calls ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:24:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - > 24 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); + 24 │ // chained calls + > 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 26 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); i Unsafe fix: Change to an optional chain. - 22 22 │ - 23 23 │ // chained calls - 24 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz(); - 24 │ + foo?.bar?.baz?.buzz(); - 25 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 26 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 23 23 │ + 24 24 │ // chained calls + 25 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz(); + 25 │ + foo?.bar?.baz?.buzz(); + 26 26 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 27 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:25:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 23 │ // chained calls - 24 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); - > 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 24 │ // chained calls + 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); + > 26 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 26 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 27 │ + 27 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 28 │ i Unsafe fix: Change to an optional chain. - 23 23 │ // chained calls - 24 24 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 25 │ + foo?.bar?.baz?.buzz?.(); - 26 26 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 27 27 │ + 24 24 │ // chained calls + 25 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 26 │ + foo?.bar?.baz?.buzz?.(); + 27 27 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 28 28 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:26:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:27:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 24 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - > 26 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + > 27 │ 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 27 │ - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 28 │ + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 24 24 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); - 25 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); - 26 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 26 │ + foo.bar?.baz?.buzz?.(); - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) + 25 25 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && foo.bar.baz.buzz(); + 26 26 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 27 │ - 'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 27 │ + foo.bar?.baz?.buzz?.(); + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:29:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 29 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 30 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 30 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); - 31 │ + 31 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + 32 │ i Unsafe fix: Change to an optional chain. - 27 27 │ - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz(); - 29 │ + foo?.bar?.baz.buzz(); - 30 30 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); - 31 31 │ + 28 28 │ + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz(); + 30 │ + foo?.bar?.baz.buzz(); + 31 31 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + 32 32 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:30:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:31:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); - > 30 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + > 31 │ 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 31 │ - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 32 │ + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) i Unsafe fix: Change to an optional chain. - 28 28 │ // case with a jump (i.e. a non-'undefined'ish prop) - 29 29 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); - 30 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz(); - 30 │ + foo.bar?.baz.buzz(); - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) + 29 29 │ // case with a jump (i.e. a non-'undefined'ish prop) + 30 30 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && foo.bar.baz.buzz(); + 31 │ - 'undefined'·!=·typeof·foo.bar·&&·foo.bar.baz.buzz(); + 31 │ + foo.bar?.baz.buzz(); + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:33:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:34:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - > 33 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); + 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + > 34 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar && 'undefined' != typeof foo.bar.baz.buzz && foo.bar.baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 34 │ - 35 │ // case with a call expr inside the chain for some inefficient reason + 35 │ + 36 │ // case with a call expr inside the chain for some inefficient reason i Unsafe fix: Change to an optional chain. - 31 31 │ - 32 32 │ // case with a jump (i.e. a non-'undefined'ish prop) - 33 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); - 33 │ + foo?.bar?.baz.buzz?.(); - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason + 32 32 │ + 33 33 │ // case with a jump (i.e. a non-'undefined'ish prop) + 34 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar·&&·'undefined'·!=·typeof·foo.bar.baz.buzz·&&·foo.bar.baz.buzz(); + 34 │ + foo?.bar?.baz.buzz?.(); + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:36:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:37:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 35 │ // case with a call expr inside the chain for some inefficient reason - > 36 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar() && 'undefined' != typeof foo.bar().baz && 'undefined' != typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); + 36 │ // case with a call expr inside the chain for some inefficient reason + > 37 │ 'undefined' != typeof foo && 'undefined' != typeof foo.bar() && 'undefined' != typeof foo.bar().baz && 'undefined' != typeof foo.bar().baz.buzz && foo.bar().baz.buzz(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 37 │ + 38 │ i Unsafe fix: Change to an optional chain. - 34 34 │ - 35 35 │ // case with a call expr inside the chain for some inefficient reason - 36 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar()·&&·'undefined'·!=·typeof·foo.bar().baz·&&·'undefined'·!=·typeof·foo.bar().baz.buzz·&&·foo.bar().baz.buzz(); - 36 │ + foo?.bar()?.baz?.buzz?.(); - 37 37 │ + 35 35 │ + 36 36 │ // case with a call expr inside the chain for some inefficient reason + 37 │ - 'undefined'·!=·typeof·foo·&&·'undefined'·!=·typeof·foo.bar()·&&·'undefined'·!=·typeof·foo.bar().baz·&&·'undefined'·!=·typeof·foo.bar().baz.buzz·&&·foo.bar().baz.buzz(); + 37 │ + foo?.bar()?.baz?.buzz?.(); 38 38 │ + 39 39 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:40:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - > 40 │ "undefined" != typeof foo && foo.bar; + 40 │ // chained members (double quotes) + > 41 │ "undefined" != typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - 42 │ "undefined" != typeof foo && foo(); + 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + 43 │ "undefined" != typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 38 38 │ - 39 39 │ // chained members (double quotes) - 40 │ - "undefined"·!=·typeof·foo·&&·foo.bar; - 40 │ + foo?.bar; - 41 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - 42 42 │ "undefined" != typeof foo && foo(); + 39 39 │ + 40 40 │ // chained members (double quotes) + 41 │ - "undefined"·!=·typeof·foo·&&·foo.bar; + 41 │ + foo?.bar; + 42 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + 43 43 │ "undefined" != typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:41:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 39 │ // chained members (double quotes) - 40 │ "undefined" != typeof foo && foo.bar; - > 41 │ "undefined" != typeof foo.bar && foo.bar.baz; + 40 │ // chained members (double quotes) + 41 │ "undefined" != typeof foo && foo.bar; + > 42 │ "undefined" != typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 42 │ "undefined" != typeof foo && foo(); - 43 │ "undefined" != typeof foo.bar && foo.bar(); + 43 │ "undefined" != typeof foo && foo(); + 44 │ "undefined" != typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 39 39 │ // chained members (double quotes) - 40 40 │ "undefined" != typeof foo && foo.bar; - 41 │ - "undefined"·!=·typeof·foo.bar·&&·foo.bar.baz; - 41 │ + foo.bar?.baz; - 42 42 │ "undefined" != typeof foo && foo(); - 43 43 │ "undefined" != typeof foo.bar && foo.bar(); + 40 40 │ // chained members (double quotes) + 41 41 │ "undefined" != typeof foo && foo.bar; + 42 │ - "undefined"·!=·typeof·foo.bar·&&·foo.bar.baz; + 42 │ + foo.bar?.baz; + 43 43 │ "undefined" != typeof foo && foo(); + 44 44 │ "undefined" != typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:42:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 40 │ "undefined" != typeof foo && foo.bar; - 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - > 42 │ "undefined" != typeof foo && foo(); + 41 │ "undefined" != typeof foo && foo.bar; + 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + > 43 │ "undefined" != typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 43 │ "undefined" != typeof foo.bar && foo.bar(); - 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 44 │ "undefined" != typeof foo.bar && foo.bar(); + 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 40 40 │ "undefined" != typeof foo && foo.bar; - 41 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - 42 │ - "undefined"·!=·typeof·foo·&&·foo(); - 42 │ + foo?.(); - 43 43 │ "undefined" != typeof foo.bar && foo.bar(); - 44 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 41 41 │ "undefined" != typeof foo && foo.bar; + 42 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + 43 │ - "undefined"·!=·typeof·foo·&&·foo(); + 43 │ + foo?.(); + 44 44 │ "undefined" != typeof foo.bar && foo.bar(); + 45 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:43:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - 42 │ "undefined" != typeof foo && foo(); - > 43 │ "undefined" != typeof foo.bar && foo.bar(); + 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + 43 │ "undefined" != typeof foo && foo(); + > 44 │ "undefined" != typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - 45 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 46 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 41 41 │ "undefined" != typeof foo.bar && foo.bar.baz; - 42 42 │ "undefined" != typeof foo && foo(); - 43 │ - "undefined"·!=·typeof·foo.bar·&&·foo.bar(); - 43 │ + foo.bar?.(); - 44 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - 45 45 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 42 42 │ "undefined" != typeof foo.bar && foo.bar.baz; + 43 43 │ "undefined" != typeof foo && foo(); + 44 │ - "undefined"·!=·typeof·foo.bar·&&·foo.bar(); + 44 │ + foo.bar?.(); + 45 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 46 46 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:44:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 42 │ "undefined" != typeof foo && foo(); - 43 │ "undefined" != typeof foo.bar && foo.bar(); - > 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 43 │ "undefined" != typeof foo && foo(); + 44 │ "undefined" != typeof foo.bar && foo.bar(); + > 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 45 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - 46 │ + 46 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 47 │ i Unsafe fix: Change to an optional chain. - 42 42 │ "undefined" != typeof foo && foo(); - 43 43 │ "undefined" != typeof foo.bar && foo.bar(); - 44 │ - "undefined"·!=·typeof·foo·&&·"undefined"·!=·typeof·foo.bar·&&·"undefined"·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 44 │ + foo?.bar?.baz?.buzz; - 45 45 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - 46 46 │ + 43 43 │ "undefined" != typeof foo && foo(); + 44 44 │ "undefined" != typeof foo.bar && foo.bar(); + 45 │ - "undefined"·!=·typeof·foo·&&·"undefined"·!=·typeof·foo.bar·&&·"undefined"·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 45 │ + foo?.bar?.baz?.buzz; + 46 46 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 47 47 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:45:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:46:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 43 │ "undefined" != typeof foo.bar && foo.bar(); - 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - > 45 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 44 │ "undefined" != typeof foo.bar && foo.bar(); + 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + > 46 │ "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 46 │ - 47 │ // chained members (backticks) + 47 │ + 48 │ // chained members (backticks) i Unsafe fix: Change to an optional chain. - 43 43 │ "undefined" != typeof foo.bar && foo.bar(); - 44 44 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; - 45 │ - "undefined"·!=·typeof·foo.bar·&&·"undefined"·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 45 │ + foo.bar?.baz?.buzz; - 46 46 │ - 47 47 │ // chained members (backticks) + 44 44 │ "undefined" != typeof foo.bar && foo.bar(); + 45 45 │ "undefined" != typeof foo && "undefined" != typeof foo.bar && "undefined" != typeof foo.bar.baz && foo.bar.baz.buzz; + 46 │ - "undefined"·!=·typeof·foo.bar·&&·"undefined"·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 46 │ + foo.bar?.baz?.buzz; + 47 47 │ + 48 48 │ // chained members (backticks) ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:48:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - > 48 │ `undefined` != typeof foo && foo.bar; + 48 │ // chained members (backticks) + > 49 │ `undefined` != typeof foo && foo.bar; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - 50 │ `undefined` != typeof foo && foo(); + 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + 51 │ `undefined` != typeof foo && foo(); i Unsafe fix: Change to an optional chain. - 46 46 │ - 47 47 │ // chained members (backticks) - 48 │ - `undefined`·!=·typeof·foo·&&·foo.bar; - 48 │ + foo?.bar; - 49 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - 50 50 │ `undefined` != typeof foo && foo(); + 47 47 │ + 48 48 │ // chained members (backticks) + 49 │ - `undefined`·!=·typeof·foo·&&·foo.bar; + 49 │ + foo?.bar; + 50 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + 51 51 │ `undefined` != typeof foo && foo(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:49:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 47 │ // chained members (backticks) - 48 │ `undefined` != typeof foo && foo.bar; - > 49 │ `undefined` != typeof foo.bar && foo.bar.baz; + 48 │ // chained members (backticks) + 49 │ `undefined` != typeof foo && foo.bar; + > 50 │ `undefined` != typeof foo.bar && foo.bar.baz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 50 │ `undefined` != typeof foo && foo(); - 51 │ `undefined` != typeof foo.bar && foo.bar(); + 51 │ `undefined` != typeof foo && foo(); + 52 │ `undefined` != typeof foo.bar && foo.bar(); i Unsafe fix: Change to an optional chain. - 47 47 │ // chained members (backticks) - 48 48 │ `undefined` != typeof foo && foo.bar; - 49 │ - `undefined`·!=·typeof·foo.bar·&&·foo.bar.baz; - 49 │ + foo.bar?.baz; - 50 50 │ `undefined` != typeof foo && foo(); - 51 51 │ `undefined` != typeof foo.bar && foo.bar(); + 48 48 │ // chained members (backticks) + 49 49 │ `undefined` != typeof foo && foo.bar; + 50 │ - `undefined`·!=·typeof·foo.bar·&&·foo.bar.baz; + 50 │ + foo.bar?.baz; + 51 51 │ `undefined` != typeof foo && foo(); + 52 52 │ `undefined` != typeof foo.bar && foo.bar(); ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:50:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 48 │ `undefined` != typeof foo && foo.bar; - 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - > 50 │ `undefined` != typeof foo && foo(); + 49 │ `undefined` != typeof foo && foo.bar; + 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + > 51 │ `undefined` != typeof foo && foo(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 51 │ `undefined` != typeof foo.bar && foo.bar(); - 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 52 │ `undefined` != typeof foo.bar && foo.bar(); + 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 48 48 │ `undefined` != typeof foo && foo.bar; - 49 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - 50 │ - `undefined`·!=·typeof·foo·&&·foo(); - 50 │ + foo?.(); - 51 51 │ `undefined` != typeof foo.bar && foo.bar(); - 52 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 49 49 │ `undefined` != typeof foo && foo.bar; + 50 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + 51 │ - `undefined`·!=·typeof·foo·&&·foo(); + 51 │ + foo?.(); + 52 52 │ `undefined` != typeof foo.bar && foo.bar(); + 53 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:51:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - 50 │ `undefined` != typeof foo && foo(); - > 51 │ `undefined` != typeof foo.bar && foo.bar(); + 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + 51 │ `undefined` != typeof foo && foo(); + > 52 │ `undefined` != typeof foo.bar && foo.bar(); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - 53 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 54 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; i Unsafe fix: Change to an optional chain. - 49 49 │ `undefined` != typeof foo.bar && foo.bar.baz; - 50 50 │ `undefined` != typeof foo && foo(); - 51 │ - `undefined`·!=·typeof·foo.bar·&&·foo.bar(); - 51 │ + foo.bar?.(); - 52 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - 53 53 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 50 50 │ `undefined` != typeof foo.bar && foo.bar.baz; + 51 51 │ `undefined` != typeof foo && foo(); + 52 │ - `undefined`·!=·typeof·foo.bar·&&·foo.bar(); + 52 │ + foo.bar?.(); + 53 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 54 54 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:52:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 50 │ `undefined` != typeof foo && foo(); - 51 │ `undefined` != typeof foo.bar && foo.bar(); - > 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 51 │ `undefined` != typeof foo && foo(); + 52 │ `undefined` != typeof foo.bar && foo.bar(); + > 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 53 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - 54 │ + 54 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 55 │ i Unsafe fix: Change to an optional chain. - 50 50 │ `undefined` != typeof foo && foo(); - 51 51 │ `undefined` != typeof foo.bar && foo.bar(); - 52 │ - `undefined`·!=·typeof·foo·&&·`undefined`·!=·typeof·foo.bar·&&·`undefined`·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 52 │ + foo?.bar?.baz?.buzz; - 53 53 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - 54 54 │ + 51 51 │ `undefined` != typeof foo && foo(); + 52 52 │ `undefined` != typeof foo.bar && foo.bar(); + 53 │ - `undefined`·!=·typeof·foo·&&·`undefined`·!=·typeof·foo.bar·&&·`undefined`·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 53 │ + foo?.bar?.baz?.buzz; + 54 54 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 55 55 │ ``` ``` -yoda_expressions_typeofLogicalAndCases2.ts:53:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ +yoda_expressions_typeofLogicalAndCases2.ts:54:1 lint/complexity/useOptionalChain FIXABLE ━━━━━━━━━━ ! Change to an optional chain. - 51 │ `undefined` != typeof foo.bar && foo.bar(); - 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - > 53 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 52 │ `undefined` != typeof foo.bar && foo.bar(); + 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + > 54 │ `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - 54 │ + 55 │ i Unsafe fix: Change to an optional chain. - 51 51 │ `undefined` != typeof foo.bar && foo.bar(); - 52 52 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; - 53 │ - `undefined`·!=·typeof·foo.bar·&&·`undefined`·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; - 53 │ + foo.bar?.baz?.buzz; - 54 54 │ + 52 52 │ `undefined` != typeof foo.bar && foo.bar(); + 53 53 │ `undefined` != typeof foo && `undefined` != typeof foo.bar && `undefined` != typeof foo.bar.baz && foo.bar.baz.buzz; + 54 │ - `undefined`·!=·typeof·foo.bar·&&·`undefined`·!=·typeof·foo.bar.baz·&&·foo.bar.baz.buzz; + 54 │ + foo.bar?.baz?.buzz; + 55 55 │ ``` diff --git a/crates/biome_js_syntax/src/expr_ext.rs b/crates/biome_js_syntax/src/expr_ext.rs index 812e18284f85..61aa24ff32e1 100644 --- a/crates/biome_js_syntax/src/expr_ext.rs +++ b/crates/biome_js_syntax/src/expr_ext.rs @@ -319,119 +319,6 @@ impl JsBinaryExpression { Ok(T![>] | T![<] | T![>=] | T![<=] | T![==] | T![===] | T![!=] | T![!==]) ) } - - /// Extract the left or right operand of an optional chain-like expression. - /// ```js - /// foo !== undefined; - /// typeof foo !== 'undefined'; - ///``` - pub fn extract_optional_chain_like(&self) -> SyntaxResult> { - if matches!( - self.operator(), - Ok(JsBinaryOperator::StrictInequality | JsBinaryOperator::Inequality) - ) { - let left = self.left()?; - let right = self.right()?; - // nullish check: `foo !== undefined` -> return foo - if let Some(expr) = Self::extract_optional_chain_like_nullish(&left, &right)? { - return Ok(Some(expr)); - } - // typeof check: `typeof foo !== 'undefined'` -> return foo - if let Some(expr) = Self::extract_optional_chain_like_typeof(&left, &right)? { - return Ok(Some(expr)); - } - Ok(None) - } else { - Ok(None) - } - } - - /// Extract the left or right operand of an optional chain-like expression comparing nullish. - /// ```js - /// foo !== undefined; // -> Some(foo) - /// foo != undefined; // -> Some(foo) - /// foo !== null; // -> Some(foo) - /// foo != null; // -> Some(foo) - /// undefined !== foo; // -> Some(foo) - /// undefined != foo; // -> Some(foo) - /// null !== foo; // -> Some(foo) - /// null != foo; // -> Some(foo) - /// foo !== bar; // -> None - /// foo != bar; // -> None - /// undefined !== null; // -> None - /// undefined != null; // -> None - /// null !== undefined; // -> None - /// null != undefined; // -> None - /// undefined !== undefined; // -> None - /// undefined != undefined; // -> None - /// null !== null; // -> None - /// null != null; // -> None - ///``` - fn extract_optional_chain_like_nullish( - left: &AnyJsExpression, - right: &AnyJsExpression, - ) -> SyntaxResult> { - fn is_nullish(expression: &AnyJsExpression) -> bool { - expression - .as_static_value() - .is_some_and(|x| x.is_null_or_undefined()) - } - let left_is_nullish = is_nullish(left); - let right_is_nullish = is_nullish(right); - // right only nullish: `foo !== undefined` -> return foo (left) - if !left_is_nullish && right_is_nullish { - return Ok(Some(left.clone())); - } - // left only nullish: `undefined !== foo` -> return foo (right) - if left_is_nullish && !right_is_nullish { - return Ok(Some(right.clone())); - } - Ok(None) - } - - /// Extract the left or right operand of an optional chain-like expression using `typeof`. - /// ```js - /// typeof foo !== 'undefined'; // -> Some(foo) - /// typeof foo != 'undefined'; // -> Some(foo) - /// 'undefined' !== typeof foo; // -> Some(foo) - /// 'undefined' != typeof foo; // -> Some(foo) - /// ”undefined” != typeof foo; // -> Some(foo) - /// `undefined` != typeof foo; // -> Some(foo) - /// typeof foo !== undefined; // -> None - /// typeof foo != undefined; // -> None - /// undefined !== typeof foo; // -> None - /// undefined != typeof foo; // -> None - ///``` - fn extract_optional_chain_like_typeof( - left: &AnyJsExpression, - right: &AnyJsExpression, - ) -> SyntaxResult> { - fn is_string_literal_undefined(expression: &AnyJsExpression) -> bool { - expression - .as_static_value() - .is_some_and(|x| matches!(x.as_string_constant(), Some(s) if s == "undefined")) - } - fn typeof_argument(expression: &AnyJsExpression) -> SyntaxResult> { - if let Some(unary) = expression.as_js_unary_expression() { - return Ok(match unary.operator()? { - JsUnaryOperator::Typeof => Some(unary.argument()?), - _ => None, - }); - } - Ok(None) - } - let left_is_string_undefined = is_string_literal_undefined(left); - let right_is_string_undefined = is_string_literal_undefined(right); - // `typeof foo !== "undefined"` -> return foo - if !left_is_string_undefined && right_is_string_undefined { - return typeof_argument(left); - } - // `"undefined" !== typeof foo` -> return foo - if left_is_string_undefined && !right_is_string_undefined { - return typeof_argument(right); - } - Ok(None) - } } #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]