using System.Dynamic; using Elsa.Expressions.Contracts; using Elsa.Expressions.Helpers; using Elsa.Expressions.Models; using Elsa.JavaScript.Contracts; using Humanizer; using Jint; namespace Elsa.JavaScript.Expressions; /// /// Evaluates JavaScript expressions. /// public class JavaScriptExpressionHandler : IExpressionHandler { private readonly IJavaScriptEvaluator _javaScriptEvaluator; /// /// Initializes a new instance of the class. /// public JavaScriptExpressionHandler(IJavaScriptEvaluator javaScriptEvaluator) { _javaScriptEvaluator = javaScriptEvaluator; } /// public async ValueTask EvaluateAsync(Expression expression, Type returnType, ExpressionExecutionContext context, ExpressionEvaluatorOptions options) { var javaScriptExpression = expression.Value.ConvertTo() ?? ""; return await _javaScriptEvaluator.EvaluateAsync(javaScriptExpression, returnType, context, options, engine => ConfigureEngine(engine, options), context.CancellationToken); } private void ConfigureEngine(Engine engine, ExpressionEvaluatorOptions options) { var args = new ExpandoObject() as IDictionary; foreach (var (name, value) in options.Arguments) args[name.Camelize()] = value; engine.SetValue("args", args); } }