diff --git a/src/modules/Elsa.Liquid/Extensions/TemplateContextExtensions.cs b/src/modules/Elsa.Liquid/Extensions/TemplateContextExtensions.cs
index 1f1da87fe..44aa4dc5f 100644
--- a/src/modules/Elsa.Liquid/Extensions/TemplateContextExtensions.cs
+++ b/src/modules/Elsa.Liquid/Extensions/TemplateContextExtensions.cs
@@ -1,6 +1,7 @@
using Elsa.Liquid.Contracts;
using Elsa.Liquid.Options;
using Fluid;
+using Fluid.Filters;
using Microsoft.Extensions.DependencyInjection;
// ReSharper disable once CheckNamespace
@@ -18,5 +19,6 @@ internal static class TemplateContextExtensions
return filter.ProcessAsync(input, arguments, ctx);
});
}
+ options.FluidFiltersDelegate(templateContext);
}
}
\ No newline at end of file
diff --git a/src/modules/Elsa.Liquid/Features/LiquidFeature.cs b/src/modules/Elsa.Liquid/Features/LiquidFeature.cs
index 614d86403..e78db56b4 100644
--- a/src/modules/Elsa.Liquid/Features/LiquidFeature.cs
+++ b/src/modules/Elsa.Liquid/Features/LiquidFeature.cs
@@ -11,6 +11,7 @@ using Elsa.Liquid.Handlers;
using Elsa.Liquid.Options;
using Elsa.Liquid.Providers;
using Elsa.Liquid.Services;
+using Fluid.Filters;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Liquid.Features;
@@ -31,21 +32,27 @@ public class LiquidFeature : FeatureBase
///
/// Configures the Fluid options.
///
- public Action FluidOptions { get; set; } = _ => { };
+ public Action FluidOptions { get; set; } = options =>
+ {
+ options.FluidFiltersDelegate = context => context.Options.Filters
+ .WithArrayFilters()
+ .WithStringFilters()
+ .WithNumberFilters()
+ .WithMiscFilters();
+ };
///
public override void Apply()
{
Services.Configure(FluidOptions);
-
+
Services
.AddHandlersFrom()
.AddScoped()
.AddScoped()
.AddExpressionDescriptorProvider()
- .AddLiquidFilter("json")
.AddLiquidFilter("base64")
.AddLiquidFilter("keys")
- ;
+ ;
}
}
\ No newline at end of file
diff --git a/src/modules/Elsa.Liquid/Filters/JsonFilter.cs b/src/modules/Elsa.Liquid/Filters/JsonFilter.cs
deleted file mode 100644
index 599ccea3d..000000000
--- a/src/modules/Elsa.Liquid/Filters/JsonFilter.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using System.Text.Json;
-using Elsa.Liquid.Contracts;
-using Fluid;
-using Fluid.Values;
-
-namespace Elsa.Liquid.Filters;
-
-///
-/// A liquid filter that converts a value into a JSON string representation.
-///
-public class JsonFilter : ILiquidFilter
-{
- public ValueTask ProcessAsync(FluidValue input, FilterArguments arguments, TemplateContext context)
- {
- switch (input.Type)
- {
- case FluidValues.Array:
- return new ValueTask(new StringValue(JsonSerializer.Serialize(input.Enumerate(context).Select(o => o.ToObjectValue()))));
-
- case FluidValues.Boolean:
- return new ValueTask(new StringValue(JsonSerializer.Serialize(input.ToBooleanValue())));
-
- case FluidValues.Nil:
- return new ValueTask(FluidValue.Create("null", context.Options));
-
- case FluidValues.Number:
- return new ValueTask(new StringValue(JsonSerializer.Serialize(input.ToNumberValue())));
-
- case FluidValues.DateTime:
- case FluidValues.Dictionary:
- case FluidValues.Object:
- return new ValueTask(new StringValue(JsonSerializer.Serialize(input.ToObjectValue())));
-
- case FluidValues.String:
- var stringValue = input.ToStringValue();
-
- return string.IsNullOrWhiteSpace(stringValue)
- ? new ValueTask(input)
- : new ValueTask(new StringValue(JsonSerializer.Serialize(stringValue)));
- }
-
- throw new NotSupportedException("Unrecognized FluidValue");
- }
-}
\ No newline at end of file
diff --git a/src/modules/Elsa.Liquid/Options/FluidOptions.cs b/src/modules/Elsa.Liquid/Options/FluidOptions.cs
index ff94ae5e7..68a1e3d8b 100644
--- a/src/modules/Elsa.Liquid/Options/FluidOptions.cs
+++ b/src/modules/Elsa.Liquid/Options/FluidOptions.cs
@@ -12,13 +12,13 @@ public class FluidOptions
///
/// A dictionary of filter registrations.
///
- public Dictionary FilterRegistrations { get; } = new();
-
+ public Dictionary FilterRegistrations { get; } = new();
+
///
/// A list of parser configurations.
///
public IList> ParserConfiguration { get; } = new List>();
-
+
///
/// Gets or sets a value indicating whether to allow access to the configuration object.
///
@@ -28,4 +28,9 @@ public class FluidOptions
/// Gets or sets the default encoder to use when rendering a template.
///
public TextEncoder Encoder { get; set; } = NullEncoder.Default;
+
+ ///
+ /// Get or set the fluid filters enabled in Elsa.
+ ///
+ public Action FluidFiltersDelegate { get; set; } = _ => { };
}
\ No newline at end of file
diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Elsa.Workflows.IntegrationTests.csproj b/test/integration/Elsa.Workflows.IntegrationTests/Elsa.Workflows.IntegrationTests.csproj
index 681d9d2a6..21ae7dbff 100644
--- a/test/integration/Elsa.Workflows.IntegrationTests/Elsa.Workflows.IntegrationTests.csproj
+++ b/test/integration/Elsa.Workflows.IntegrationTests/Elsa.Workflows.IntegrationTests.csproj
@@ -10,6 +10,7 @@
+
diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/HttpRequestWithLiquid/JavascriptAndLiquidWorkflow.cs b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/HttpRequestWithLiquid/JavascriptAndLiquidWorkflow.cs
new file mode 100644
index 000000000..9fef479d9
--- /dev/null
+++ b/test/integration/Elsa.Workflows.IntegrationTests/Scenarios/HttpRequestWithLiquid/JavascriptAndLiquidWorkflow.cs
@@ -0,0 +1,42 @@
+using Elsa.Expressions.Models;
+using Elsa.JavaScript.Activities;
+using Elsa.Workflows.Activities;
+using Elsa.Workflows.Contracts;
+using Elsa.Workflows.Memory;
+using Elsa.Workflows.Services;
+
+namespace Elsa.Workflows.IntegrationTests.Scenarios.LiquidLists;
+
+///
+/// A workflow that use javascript to get some data, use them with some liquid expressions
+///
+public class JavascriptAndLiquidWorkflow : WorkflowBase
+{
+ protected override void Build(IWorkflowBuilder builder)
+ {
+ var products = new Variable