From 11b684274cd694413759fe2587d032d830ec6be3 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 31 Jan 2023 11:01:39 +0100 Subject: [PATCH] Add variable types to Type Definition output --- .../Builders/TypeDefinitionBuilder.cs | 17 +++++++++++++ .../Features/JavaScriptFeature.cs | 6 +++-- .../Implementations/TypeAliasRegistry.cs | 12 ++++++++- .../TypeDefinitionDocumentRenderer.cs | 4 +-- .../CommonTypesDefinitionProvider.cs | 25 +++++++++++++++++++ .../IActivityPropertyOptionsProvider.cs | 2 +- 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 src/modules/Elsa.JavaScript/Providers/CommonTypesDefinitionProvider.cs diff --git a/src/modules/Elsa.JavaScript/Builders/TypeDefinitionBuilder.cs b/src/modules/Elsa.JavaScript/Builders/TypeDefinitionBuilder.cs index 2eb6b48f9..182c394d3 100644 --- a/src/modules/Elsa.JavaScript/Builders/TypeDefinitionBuilder.cs +++ b/src/modules/Elsa.JavaScript/Builders/TypeDefinitionBuilder.cs @@ -8,7 +8,24 @@ namespace Elsa.JavaScript.Builders; public class TypeDefinitionBuilder { private readonly TypeDefinition _typeDefinition = new(); + + /// + /// Set the name of the function. + /// + public TypeDefinitionBuilder Name(string name) + { + _typeDefinition.Name = name; + return this; + } + /// + /// Set the return type of the function. + /// + public TypeDefinitionBuilder DeclarationKeyword(string keyword) + { + _typeDefinition.DeclarationKeyword = keyword; + return this; + } /// /// Build a using the collected information. diff --git a/src/modules/Elsa.JavaScript/Features/JavaScriptFeature.cs b/src/modules/Elsa.JavaScript/Features/JavaScriptFeature.cs index f0aa0b4e8..a67922726 100644 --- a/src/modules/Elsa.JavaScript/Features/JavaScriptFeature.cs +++ b/src/modules/Elsa.JavaScript/Features/JavaScriptFeature.cs @@ -43,8 +43,10 @@ public class JavaScriptFeature : FeatureBase .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddSingleton() + .AddSingleton() + ; Module.UseWorkflowManagement(management => management.AddActivitiesFrom()); } diff --git a/src/modules/Elsa.JavaScript/Implementations/TypeAliasRegistry.cs b/src/modules/Elsa.JavaScript/Implementations/TypeAliasRegistry.cs index e04a2b1b5..ecc0e5ee3 100644 --- a/src/modules/Elsa.JavaScript/Implementations/TypeAliasRegistry.cs +++ b/src/modules/Elsa.JavaScript/Implementations/TypeAliasRegistry.cs @@ -1,5 +1,8 @@ +using System.Dynamic; using Elsa.JavaScript.Extensions; using Elsa.JavaScript.Services; +using Elsa.Workflows.Management.Options; +using Microsoft.Extensions.Options; namespace Elsa.JavaScript.Implementations; @@ -11,9 +14,10 @@ public class TypeAliasRegistry : ITypeAliasRegistry /// /// Constructor. /// - public TypeAliasRegistry() + public TypeAliasRegistry(IOptions managementOptions) { this.RegisterType("any"); + this.RegisterType("any"); this.RegisterType("string"); this.RegisterType("boolean"); this.RegisterType("number"); @@ -26,6 +30,12 @@ public class TypeAliasRegistry : ITypeAliasRegistry this.RegisterType("Date"); this.RegisterType("Date"); this.RegisterType("Date"); + + foreach (var variableDescriptor in managementOptions.Value.VariableDescriptors) + { + if(!_typeAliasDictionary.ContainsKey(variableDescriptor.Type)) + RegisterType(variableDescriptor.Type, variableDescriptor.Type.Name); + } } /// diff --git a/src/modules/Elsa.JavaScript/Implementations/TypeDefinitionDocumentRenderer.cs b/src/modules/Elsa.JavaScript/Implementations/TypeDefinitionDocumentRenderer.cs index 5900eb851..58f7ad59f 100644 --- a/src/modules/Elsa.JavaScript/Implementations/TypeDefinitionDocumentRenderer.cs +++ b/src/modules/Elsa.JavaScript/Implementations/TypeDefinitionDocumentRenderer.cs @@ -27,7 +27,7 @@ public class TypeDefinitionDocumentRenderer : ITypeDefinitionDocumentRenderer string RenderParameters(IEnumerable parameters) => string.Join(", ", parameters.Select(RenderParameter)); var returnType = functionDefinition.ReturnType != null ? $": {functionDefinition.ReturnType}" : ""; - output.AppendLine($"declare function {functionDefinition.Name}({RenderParameters(functionDefinition.Parameters)}){returnType}"); + output.AppendLine($"declare function {functionDefinition.Name}({RenderParameters(functionDefinition.Parameters)}){returnType};"); } private void Render(TypeDefinition typeDefinition, StringBuilder output) @@ -40,5 +40,5 @@ public class TypeDefinitionDocumentRenderer : ITypeDefinitionDocumentRenderer output.AppendLine("}"); } - private void Render(PropertyDefinition property, StringBuilder output) => output.AppendLine($"{property.Name}{(property.IsOptional ? "?" : "")}: {property.Type}"); + private void Render(PropertyDefinition property, StringBuilder output) => output.AppendLine($"{property.Name}{(property.IsOptional ? "?" : "")}: {property.Type};"); } \ No newline at end of file diff --git a/src/modules/Elsa.JavaScript/Providers/CommonTypesDefinitionProvider.cs b/src/modules/Elsa.JavaScript/Providers/CommonTypesDefinitionProvider.cs new file mode 100644 index 000000000..4b7810d45 --- /dev/null +++ b/src/modules/Elsa.JavaScript/Providers/CommonTypesDefinitionProvider.cs @@ -0,0 +1,25 @@ +using System.Text.Json.Nodes; +using Elsa.JavaScript.Abstractions; +using Elsa.JavaScript.Models; +using Elsa.JavaScript.Services; + +namespace Elsa.JavaScript.Providers; + +/// +/// Produces s for common functions. +/// +internal class CommonTypeDefinitionProvider : TypeDefinitionProvider +{ + private readonly ITypeDescriber _typeDescriber; + + public CommonTypeDefinitionProvider(ITypeDescriber typeDescriber) + { + _typeDescriber = typeDescriber; + } + + protected override IEnumerable GetTypeDefinitions(TypeDefinitionContext context) + { + yield return _typeDescriber.DescribeType(typeof(Guid)); + yield return _typeDescriber.DescribeType(typeof(JsonObject)); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Implementations/IActivityPropertyOptionsProvider.cs b/src/modules/Elsa.Workflows.Management/Implementations/IActivityPropertyOptionsProvider.cs index 543187335..ee76f42ef 100644 --- a/src/modules/Elsa.Workflows.Management/Implementations/IActivityPropertyOptionsProvider.cs +++ b/src/modules/Elsa.Workflows.Management/Implementations/IActivityPropertyOptionsProvider.cs @@ -10,5 +10,5 @@ public interface IActivityPropertyOptionsProvider /// /// Returns options for the specified property. /// - object GetOptions(PropertyInfo property); + object? GetOptions(PropertyInfo property); } \ No newline at end of file