using Elsa.Expressions.Models; using Elsa.Expressions.Services; using Elsa.JavaScript.Expressions; using Elsa.Workflows.Core.Services; namespace Elsa.JavaScript.Providers; public class JavaScriptExpressionSyntaxProvider : IExpressionSyntaxProvider { public const string SyntaxName = "JavaScript"; private readonly IIdentityGenerator _identityGenerator; public JavaScriptExpressionSyntaxProvider(IIdentityGenerator identityGenerator) { _identityGenerator = identityGenerator; } public ValueTask> GetDescriptorsAsync(CancellationToken cancellationToken = default) { var javaScript = CreateJavaScriptDescriptor(); return ValueTask.FromResult>(new[] { javaScript }); } private ExpressionSyntaxDescriptor CreateJavaScriptDescriptor() => new() { Syntax = SyntaxName, Type = typeof(JavaScriptExpression), CreateExpression = CreateJavaScriptExpression, CreateBlockReference = context => { var reference = new JavaScriptExpressionBlockReference(context.GetExpression()); if (string.IsNullOrWhiteSpace(reference.Id)) reference.Id = GenerateId(); return reference; }, CreateSerializableObject = context => new { Type = SyntaxName, context.GetExpression().Value } }; private IExpression CreateJavaScriptExpression(ExpressionConstructorContext context) { var script = context.Element.TryGetProperty("value", out var p) ? p.ToString() : ""; return new JavaScriptExpression(script); } private string GenerateId() => _identityGenerator.GenerateId(); }