diff --git a/src/visitors/removeUnnecessaryCalls.js b/src/visitors/removeUnnecessaryCalls.js index 98249fc..b9176ba 100644 --- a/src/visitors/removeUnnecessaryCalls.js +++ b/src/visitors/removeUnnecessaryCalls.js @@ -41,13 +41,33 @@ const visitor = { } function isSafeConditional(node) { - return ( - t.isConditionalExpression(node) && - t.isStringLiteral(node.consequent) && - t.isStringLiteral(node.alternate) && - node.consequent.value.length > 0 && - node.alternate.value.length > 0 - ); + if (!t.isConditionalExpression(node)) { + return false; + } + + const { consequent, alternate } = node; + + if ( + t.isStringLiteral(consequent) && + t.isStringLiteral(alternate) && + consequent.value.length > 0 && + alternate.value.length > 0 + ) { + return true; + } + + if ( + (t.isStringLiteral(consequent) && + consequent.value.length > 0 && + isSafeConditional(alternate)) || + (t.isStringLiteral(alternate) && + alternate.value.length > 0 && + isSafeConditional(consequent)) + ) { + return true; + } + + return false; } }, }; diff --git a/test/fixtures/remove-unnecessary-calls/nested-conditional/code.js b/test/fixtures/remove-unnecessary-calls/nested-conditional/code.js new file mode 100644 index 0000000..e743607 --- /dev/null +++ b/test/fixtures/remove-unnecessary-calls/nested-conditional/code.js @@ -0,0 +1,8 @@ +const x = clsx({ + foo1: true, + foo2: foo, + foo3: foo, + foo4: !foo && !bar, + foo5: !foo && bar, + foo6: true, +}); diff --git a/test/fixtures/remove-unnecessary-calls/nested-conditional/output.js b/test/fixtures/remove-unnecessary-calls/nested-conditional/output.js new file mode 100644 index 0000000..a134a22 --- /dev/null +++ b/test/fixtures/remove-unnecessary-calls/nested-conditional/output.js @@ -0,0 +1 @@ +const x = 'foo1 foo6 ' + (foo ? 'foo2 foo3' : bar ? 'foo5' : 'foo4');