diff --git a/Directory.Packages.props b/Directory.Packages.props
index 23c80aa42..a3db88643 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -98,6 +98,9 @@
+
+
+
diff --git a/Elsa.sln b/Elsa.sln
index 60e0b80f5..e16d5814d 100644
--- a/Elsa.sln
+++ b/Elsa.sln
@@ -225,6 +225,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scheduling", "scheduling",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling", "src\modules\Elsa.Scheduling\Elsa.Scheduling.csproj", "{26849C37-2ACA-4DDE-83CD-B87939465791}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bpmn", "bpmn", "{F3F9E35C-1A59-423F-BA04-B4BD8366E6DF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn", "src\modules\Elsa.Bpmn\Elsa.Bpmn.csproj", "{6326EFE4-A6B1-4306-8551-41103EC38755}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange", "src\modules\Elsa.Bpmn.Interchange\Elsa.Bpmn.Interchange.csproj", "{E2408639-12D3-4A17-AD40-F8A097E27009}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Workflows.Runtime.Distributed", "src\modules\Elsa.Workflows.Runtime.Distributed\Elsa.Workflows.Runtime.Distributed.csproj", "{42CE3E10-BC73-4D29-B099-88F0D5319E57}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "persistence", "persistence", "{3D0A6C71-4B96-411B-80DB-DDFAFF77C748}"
@@ -263,8 +269,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Expressions.UnitTests"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Scheduling.UnitTests", "test\unit\Elsa.Scheduling.UnitTests\Elsa.Scheduling.UnitTests.csproj", "{9AEE941A-3F23-4E4B-9B59-1A2F57FC762D}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.UnitTests", "test\unit\Elsa.Bpmn.UnitTests\Elsa.Bpmn.UnitTests.csproj", "{C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange.UnitTests", "test\unit\Elsa.Bpmn.Interchange.UnitTests\Elsa.Bpmn.Interchange.UnitTests.csproj", "{ECB546D5-8B38-47AF-87C1-70A0F03284D1}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Common.IntegrationTests", "test\integration\Elsa.Common.IntegrationTests\Elsa.Common.IntegrationTests.csproj", "{6C451CC5-280E-475E-B95E-23ADCF0CCBFD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.IntegrationTests", "test\integration\Elsa.Bpmn.IntegrationTests\Elsa.Bpmn.IntegrationTests.csproj", "{90D1A3F2-6A09-4E13-942C-6183D38C8E54}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Bpmn.Interchange.IntegrationTests", "test\integration\Elsa.Bpmn.Interchange.IntegrationTests\Elsa.Bpmn.Interchange.IntegrationTests.csproj", "{EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dsl.ElsaScript", "src\modules\Elsa.Dsl.ElsaScript\Elsa.Dsl.ElsaScript.csproj", "{874F5A44-DB06-47AB-A18C-2D13942E0147}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Dsl.ElsaScript.IntegrationTests", "test\integration\Elsa.Dsl.ElsaScript.IntegrationTests\Elsa.Dsl.ElsaScript.IntegrationTests.csproj", "{4B5A9D32-58F2-47A9-8A1B-8A9E2D76C3F5}"
@@ -1851,6 +1865,78 @@ Global
{C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x64.Build.0 = Release|Any CPU
{C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x86.ActiveCfg = Release|Any CPU
{C6EFA89A-923E-4F7A-A63B-BC8DDF44A208}.Release|x86.Build.0 = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x64.Build.0 = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Debug|x86.Build.0 = Debug|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x64.ActiveCfg = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x64.Build.0 = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x86.ActiveCfg = Release|Any CPU
+ {6326EFE4-A6B1-4306-8551-41103EC38755}.Release|x86.Build.0 = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x64.Build.0 = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Debug|x86.Build.0 = Debug|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x64.ActiveCfg = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x64.Build.0 = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2408639-12D3-4A17-AD40-F8A097E27009}.Release|x86.Build.0 = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x64.Build.0 = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Debug|x86.Build.0 = Debug|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x64.ActiveCfg = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x64.Build.0 = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x86.ActiveCfg = Release|Any CPU
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE}.Release|x86.Build.0 = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x64.Build.0 = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Debug|x86.Build.0 = Debug|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x64.ActiveCfg = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x64.Build.0 = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x86.ActiveCfg = Release|Any CPU
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1}.Release|x86.Build.0 = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x64.Build.0 = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Debug|x86.Build.0 = Debug|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|Any CPU.Build.0 = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x64.ActiveCfg = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x64.Build.0 = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x86.ActiveCfg = Release|Any CPU
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54}.Release|x86.Build.0 = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x64.Build.0 = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Debug|x86.Build.0 = Debug|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x64.ActiveCfg = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x64.Build.0 = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x86.ActiveCfg = Release|Any CPU
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1924,6 +2010,9 @@ Global
{0125BC8D-C837-414C-BB53-FCEA62E3060F} = {B08B4E00-C2AB-48F3-8389-449F42AEF179}
{7C038270-8BF7-4911-AC24-54D7BBE9BBF2} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}
{26849C37-2ACA-4DDE-83CD-B87939465791} = {7C038270-8BF7-4911-AC24-54D7BBE9BBF2}
+ {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}
+ {6326EFE4-A6B1-4306-8551-41103EC38755} = {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF}
+ {E2408639-12D3-4A17-AD40-F8A097E27009} = {F3F9E35C-1A59-423F-BA04-B4BD8366E6DF}
{42CE3E10-BC73-4D29-B099-88F0D5319E57} = {B08B4E00-C2AB-48F3-8389-449F42AEF179}
{3D0A6C71-4B96-411B-80DB-DDFAFF77C748} = {5BA4A8FA-F7F4-45B3-AEC8-8886D35AAC79}
{B0EC08F9-8FEB-43DB-A06F-57E3D35FE090} = {3D0A6C71-4B96-411B-80DB-DDFAFF77C748}
@@ -1943,7 +2032,11 @@ Global
{20C75446-CAE0-48D1-85D9-459541C4D8B6} = {18453B51-25EB-4317-A4B3-B10518252E92}
{67E1F0CC-C436-4D71-AD2C-AE42E3AA8A0B} = {18453B51-25EB-4317-A4B3-B10518252E92}
{9AEE941A-3F23-4E4B-9B59-1A2F57FC762D} = {18453B51-25EB-4317-A4B3-B10518252E92}
+ {C8BDA5AA-14CE-41DF-85F7-49B752AECFDE} = {18453B51-25EB-4317-A4B3-B10518252E92}
+ {ECB546D5-8B38-47AF-87C1-70A0F03284D1} = {18453B51-25EB-4317-A4B3-B10518252E92}
{6C451CC5-280E-475E-B95E-23ADCF0CCBFD} = {1B8D5897-902E-4632-8698-E89CAF3DDF54}
+ {90D1A3F2-6A09-4E13-942C-6183D38C8E54} = {1B8D5897-902E-4632-8698-E89CAF3DDF54}
+ {EA2D95CD-62E7-4AA3-A27D-D1A467B7B0E7} = {1B8D5897-902E-4632-8698-E89CAF3DDF54}
{874F5A44-DB06-47AB-A18C-2D13942E0147} = {477C2416-312D-46AE-BCD6-8FA1FAB43624}
{4B5A9D32-58F2-47A9-8A1B-8A9E2D76C3F5} = {1B8D5897-902E-4632-8698-E89CAF3DDF54}
{2B7FB49D-E4B6-4AD5-981B-3D85B94F6F48} = {B08B4E00-C2AB-48F3-8389-449F42AEF179}
diff --git a/NuGet.Config b/NuGet.Config
index 36cf83e1b..587127e1b 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -7,6 +7,7 @@
+
@@ -22,5 +23,8 @@
+
+
+
diff --git a/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj b/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj
new file mode 100644
index 000000000..a2e096221
--- /dev/null
+++ b/src/modules/Elsa.Bpmn.Interchange/Elsa.Bpmn.Interchange.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+ Provides BPMN XML interchange support by wiring the Bpmn.Interchange library into Elsa.
+
+ elsa extension module bpmn interchange
+
+ false
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs
new file mode 100644
index 000000000..5d2b4fce4
--- /dev/null
+++ b/src/modules/Elsa.Bpmn.Interchange/Extensions/ModuleExtensions.cs
@@ -0,0 +1,23 @@
+using Elsa.Bpmn.Interchange.Features;
+using Elsa.Features.Services;
+
+// ReSharper disable once CheckNamespace
+namespace Elsa.Extensions;
+
+///
+/// Provides extension methods for instances.
+///
+public static class ModuleExtensions
+{
+ ///
+ /// Enables the BPMN interchange feature.
+ ///
+ /// The module.
+ /// A delegate to configure the feature.
+ /// The module.
+ public static IModule UseBpmnInterchange(this IModule module, Action? configure = null)
+ {
+ module.Configure(configure);
+ return module;
+ }
+}
diff --git a/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs b/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs
new file mode 100644
index 000000000..66a368b5c
--- /dev/null
+++ b/src/modules/Elsa.Bpmn.Interchange/Features/BpmnInterchangeFeature.cs
@@ -0,0 +1,18 @@
+using Elsa.Bpmn.Features;
+using Elsa.Features.Abstractions;
+using Elsa.Features.Attributes;
+using Elsa.Features.Services;
+
+namespace Elsa.Bpmn.Interchange.Features;
+
+///
+/// Provides BPMN XML interchange support to the system.
+///
+[DependsOn(typeof(BpmnFeature))]
+public class BpmnInterchangeFeature : FeatureBase
+{
+ ///
+ public BpmnInterchangeFeature(IModule module) : base(module)
+ {
+ }
+}
diff --git a/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml b/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/modules/Elsa.Bpmn.Interchange/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs b/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs
new file mode 100644
index 000000000..074179929
--- /dev/null
+++ b/src/modules/Elsa.Bpmn.Interchange/ShellFeatures/BpmnInterchangeFeature.cs
@@ -0,0 +1,22 @@
+using CShells.Features;
+using Elsa.Bpmn.ShellFeatures;
+using Elsa.Common.ShellFeatures;
+using JetBrains.Annotations;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Bpmn.Interchange.ShellFeatures;
+
+///
+/// Provides BPMN XML interchange support to the system.
+///
+[ShellFeature(
+ DisplayName = "BPMN Interchange",
+ Description = "Provides BPMN XML interchange (import/export) capabilities for workflows.",
+ DependsOn = [typeof(BpmnFeature)])]
+[UsedImplicitly]
+public class BpmnInterchangeFeature : IShellFeature
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ }
+}
diff --git a/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj b/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj
new file mode 100644
index 000000000..79d5dcd3a
--- /dev/null
+++ b/src/modules/Elsa.Bpmn/Elsa.Bpmn.csproj
@@ -0,0 +1,22 @@
+
+
+
+
+ Provides BPMN execution support by wiring the Bpmn.Model and Bpmn.Semantics libraries into Elsa.
+
+ elsa extension module bpmn
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs b/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs
new file mode 100644
index 000000000..55ca7bf42
--- /dev/null
+++ b/src/modules/Elsa.Bpmn/Extensions/ModuleExtensions.cs
@@ -0,0 +1,23 @@
+using Elsa.Bpmn.Features;
+using Elsa.Features.Services;
+
+// ReSharper disable once CheckNamespace
+namespace Elsa.Extensions;
+
+///
+/// Provides extension methods for instances.
+///
+public static class ModuleExtensions
+{
+ ///
+ /// Enables the BPMN feature.
+ ///
+ /// The module.
+ /// A delegate to configure the feature.
+ /// The module.
+ public static IModule UseBpmn(this IModule module, Action? configure = null)
+ {
+ module.Configure(configure);
+ return module;
+ }
+}
diff --git a/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs b/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs
new file mode 100644
index 000000000..0d6841542
--- /dev/null
+++ b/src/modules/Elsa.Bpmn/Features/BpmnFeature.cs
@@ -0,0 +1,15 @@
+using Elsa.Features.Abstractions;
+using Elsa.Features.Services;
+
+namespace Elsa.Bpmn.Features;
+
+///
+/// Provides BPMN execution support to the system.
+///
+public class BpmnFeature : FeatureBase
+{
+ ///
+ public BpmnFeature(IModule module) : base(module)
+ {
+ }
+}
diff --git a/src/modules/Elsa.Bpmn/FodyWeavers.xml b/src/modules/Elsa.Bpmn/FodyWeavers.xml
new file mode 100644
index 000000000..00e1d9a1c
--- /dev/null
+++ b/src/modules/Elsa.Bpmn/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs b/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs
new file mode 100644
index 000000000..f8c35cb80
--- /dev/null
+++ b/src/modules/Elsa.Bpmn/ShellFeatures/BpmnFeature.cs
@@ -0,0 +1,20 @@
+using CShells.Features;
+using Elsa.Common.ShellFeatures;
+using JetBrains.Annotations;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Bpmn.ShellFeatures;
+
+///
+/// Provides BPMN execution support to the system.
+///
+[ShellFeature(
+ DisplayName = "BPMN",
+ Description = "Provides BPMN execution capabilities for workflows.")]
+[UsedImplicitly]
+public class BpmnFeature : IShellFeature
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ }
+}
diff --git a/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs b/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs
new file mode 100644
index 000000000..a1e884731
--- /dev/null
+++ b/test/integration/Elsa.Bpmn.IntegrationTests/BpmnFeatureTests.cs
@@ -0,0 +1,29 @@
+using Elsa.Extensions;
+using Elsa.Features.Contracts;
+using Elsa.Testing.Shared;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit.Abstractions;
+
+namespace Elsa.Bpmn.IntegrationTests;
+
+public class BpmnFeatureTests
+{
+ private readonly ITestOutputHelper _testOutputHelper;
+
+ public BpmnFeatureTests(ITestOutputHelper testOutputHelper)
+ {
+ _testOutputHelper = testOutputHelper;
+ }
+
+ [Fact]
+ public void Build_WithUseBpmn_RegistersBpmnFeature()
+ {
+ var services = new TestApplicationBuilder(_testOutputHelper)
+ .ConfigureElsa(elsa => elsa.UseBpmn())
+ .Build();
+
+ var registry = services.GetRequiredService();
+
+ Assert.NotNull(registry.Find("Elsa.Bpmn"));
+ }
+}
diff --git a/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj b/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj
new file mode 100644
index 000000000..8ef2dbfba
--- /dev/null
+++ b/test/integration/Elsa.Bpmn.IntegrationTests/Elsa.Bpmn.IntegrationTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ [Elsa.Bpmn]*
+ 1
+
+
+
+
+
+
+
+
diff --git a/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs
new file mode 100644
index 000000000..1d1abdfb9
--- /dev/null
+++ b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/BpmnInterchangeFeatureTests.cs
@@ -0,0 +1,30 @@
+using Elsa.Extensions;
+using Elsa.Features.Contracts;
+using Elsa.Testing.Shared;
+using Microsoft.Extensions.DependencyInjection;
+using Xunit.Abstractions;
+
+namespace Elsa.Bpmn.Interchange.IntegrationTests;
+
+public class BpmnInterchangeFeatureTests
+{
+ private readonly ITestOutputHelper _testOutputHelper;
+
+ public BpmnInterchangeFeatureTests(ITestOutputHelper testOutputHelper)
+ {
+ _testOutputHelper = testOutputHelper;
+ }
+
+ [Fact]
+ public void Build_WithUseBpmnInterchange_RegistersBpmnInterchangeFeature()
+ {
+ var services = new TestApplicationBuilder(_testOutputHelper)
+ .ConfigureElsa(elsa => elsa.UseBpmnInterchange())
+ .Build();
+
+ var registry = services.GetRequiredService();
+
+ Assert.NotNull(registry.Find("Elsa.Bpmn"));
+ Assert.NotNull(registry.Find("Elsa.BpmnInterchange"));
+ }
+}
diff --git a/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj
new file mode 100644
index 000000000..590a317cd
--- /dev/null
+++ b/test/integration/Elsa.Bpmn.Interchange.IntegrationTests/Elsa.Bpmn.Interchange.IntegrationTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ [Elsa.Bpmn.Interchange]*
+ 1
+
+
+
+
+
+
+
+
diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs
new file mode 100644
index 000000000..0262f1f07
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeFeatureTests.cs
@@ -0,0 +1,20 @@
+using Elsa.Bpmn.Interchange.Features;
+using Elsa.Extensions;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Bpmn.Interchange.UnitTests;
+
+public class BpmnInterchangeFeatureTests
+{
+ [Fact]
+ public void UseBpmnInterchange_ConfiguresBpmnInterchangeFeature()
+ {
+ var services = new ServiceCollection();
+ var module = services.CreateModule();
+
+ module.UseBpmnInterchange();
+ module.Apply();
+
+ Assert.True(module.HasFeature());
+ }
+}
diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs
new file mode 100644
index 000000000..3aa16f17f
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/BpmnInterchangeWiringTests.cs
@@ -0,0 +1,14 @@
+using Bpmn.Interchange;
+
+namespace Elsa.Bpmn.Interchange.UnitTests;
+
+public class BpmnInterchangeWiringTests
+{
+ [Fact]
+ public void BpmnXmlReader_IsReachable()
+ {
+ var reader = new BpmnXmlReader();
+
+ Assert.NotNull(reader);
+ }
+}
diff --git a/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj b/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj
new file mode 100644
index 000000000..a46a37138
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.Interchange.UnitTests/Elsa.Bpmn.Interchange.UnitTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ [Elsa.Bpmn.Interchange]*
+ 1
+
+
+
+
+
+
+
+
diff --git a/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs b/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs
new file mode 100644
index 000000000..3346c890e
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.UnitTests/BpmnFeatureTests.cs
@@ -0,0 +1,20 @@
+using Elsa.Bpmn.Features;
+using Elsa.Extensions;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Elsa.Bpmn.UnitTests;
+
+public class BpmnFeatureTests
+{
+ [Fact]
+ public void UseBpmn_ConfiguresBpmnFeature()
+ {
+ var services = new ServiceCollection();
+ var module = services.CreateModule();
+
+ module.UseBpmn();
+ module.Apply();
+
+ Assert.True(module.HasFeature());
+ }
+}
diff --git a/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs b/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs
new file mode 100644
index 000000000..772727bb5
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.UnitTests/BpmnSemanticsWiringTests.cs
@@ -0,0 +1,14 @@
+using Bpmn.Semantics;
+
+namespace Elsa.Bpmn.UnitTests;
+
+public class BpmnSemanticsWiringTests
+{
+ [Fact]
+ public void CreateDefault_ReturnsInterpreter()
+ {
+ var interpreter = BpmnInterpreter.CreateDefault();
+
+ Assert.NotNull(interpreter);
+ }
+}
diff --git a/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj b/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj
new file mode 100644
index 000000000..064d2eb20
--- /dev/null
+++ b/test/unit/Elsa.Bpmn.UnitTests/Elsa.Bpmn.UnitTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ [Elsa.Bpmn]*
+ 1
+
+
+
+
+
+
+
+