From 1954e64c98e57dcae43a13d64f5e0047657bf7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90?= Date: Sat, 18 Jun 2022 23:23:58 +0800 Subject: [PATCH] feat: supports binary operator --- src/core/convert.ts | 76 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/src/core/convert.ts b/src/core/convert.ts index cd7e861..d51bbea 100644 --- a/src/core/convert.ts +++ b/src/core/convert.ts @@ -23,6 +23,7 @@ import type { Primitive } from './utils' import type { OptionsResolved } from './options' import type { ArrayExpression, + Binary, Expression, JSX, JSXAttribute, @@ -234,14 +235,85 @@ function transformJsx(code: string, node: JSX) { case 'ObjectExpression': return resolveObjectExpression(node) case 'BinaryExpression': - // @ts-expect-error - return resolveExpression(node.left) + resolveExpression(node.right) + return resolveBinary(node) default: return notSupported(node) } } + function resolveBinary(node: Binary) { + const left: any = resolveExpression(node.left) + const right: any = resolveExpression(node.right) + switch (node.operator) { + case '+': + return left + right + case '-': + return left - right + case '*': + return left * right + case '/': + return left / right + + // Logical operators + case '&&': + return left && right + case '||': + return left || right + case '??': + return left ?? right + + // Comparison operators + case '==': + return left == right + case '!=': + return left != right + case '===': + return left === right + case '!==': + return left !== right + + case '>': + return left > right + case '>=': + return left >= right + + case '<': + return left < right + case '<=': + return left <= right + + // Arithmetic operators + case '%': + return left % right + case '**': + return left ** right + + // Bitwise operators + case '&': + return left & right + case '|': + return left | right + case '^': + return left ^ right + case '<<': + return left << right + case '>>': + return left >> right + case '>>>': + return left >>> right + + // Relational operators + case 'in': + return left in right + case 'instanceof': + return left instanceof right + + default: + notSupported(node) + } + } + function resolveLiteral(node: Literal): EvaluatedValue { switch (node.type) { case 'TemplateLiteral':