import {unwrap} from '@/swcx/types.js'; const evaluators = Object.fromEntries( Object.entries( import.meta.glob( ['./evaluators/*.js', '!./evaluators/*.test.js'], {eager: true, import: 'default'}, ) ) .map(([path, evaluator]) => ([ path.replace(/\.\/evaluators\/(.*)\.js/, '$1'), evaluator, ])), ); export default function evaluate(node, {scope} = {}) { const unwrapped = unwrap(node); switch (unwrapped.type) { case 'ArrayExpression': return evaluators.array(unwrapped, {evaluate, scope}); case 'AssignmentExpression': return evaluators.assignment(unwrapped, {evaluate, scope}); case 'AwaitExpression': return evaluators.await(unwrapped, {evaluate, scope}); case 'BinaryExpression': return evaluators.binary(unwrapped, {evaluate, scope}); case 'BooleanLiteral': case 'NullLiteral': case 'NumericLiteral': case 'StringLiteral': return evaluators.literal(unwrapped, {evaluate, scope}); case 'CallExpression': return evaluators.call(unwrapped, {evaluate, scope}); case 'ConditionalExpression': return evaluators.conditional(unwrapped, {evaluate, scope}); case 'Identifier': return evaluators.identifier(unwrapped, {evaluate, scope}); case 'MemberExpression': return evaluators.member(unwrapped, {evaluate, scope}); case 'ObjectExpression': return evaluators.object(unwrapped, {evaluate, scope}); case 'UnaryExpression': return evaluators.unary(unwrapped, {evaluate, scope}); case 'UpdateExpression': return evaluators.update(unwrapped, {evaluate, scope}); } }