48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
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});
|
|
}
|
|
}
|