diff --git a/packages/webcrack/src/unminify/test/yoda.test.ts b/packages/webcrack/src/unminify/test/yoda.test.ts index 52af18d8..117decd4 100644 --- a/packages/webcrack/src/unminify/test/yoda.test.ts +++ b/packages/webcrack/src/unminify/test/yoda.test.ts @@ -63,3 +63,6 @@ test('ignore other operators', () => test('ignore when right side is a literal', () => expectJS('1 === 2').toMatchInlineSnapshot('1 === 2;')); + +test('ignore when both sides are pure values', () => + expectJS('NaN == Infinity').toMatchInlineSnapshot(`NaN == Infinity;`)); diff --git a/packages/webcrack/src/unminify/transforms/yoda.ts b/packages/webcrack/src/unminify/transforms/yoda.ts index a0925ac6..f54ba0b4 100644 --- a/packages/webcrack/src/unminify/transforms/yoda.ts +++ b/packages/webcrack/src/unminify/transforms/yoda.ts @@ -23,22 +23,23 @@ export default { name: 'yoda', tags: ['safe'], visitor: () => { + const pureValue = m.or( + m.stringLiteral(), + m.numericLiteral(), + m.unaryExpression( + '-', + m.or(m.numericLiteral(), m.identifier('Infinity')), + ), + m.booleanLiteral(), + m.nullLiteral(), + m.identifier('undefined'), + m.identifier('NaN'), + m.identifier('Infinity'), + ); const matcher = m.binaryExpression( m.or(...Object.values(FLIPPED_OPERATORS)), - m.or( - m.stringLiteral(), - m.numericLiteral(), - m.unaryExpression( - '-', - m.or(m.numericLiteral(), m.identifier('Infinity')), - ), - m.booleanLiteral(), - m.nullLiteral(), - m.identifier('undefined'), - m.identifier('NaN'), - m.identifier('Infinity'), - ), - m.matcher((node) => !t.isLiteral(node)), + pureValue, + m.matcher((node) => !pureValue.match(node)), ); return {