diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 735e4d7..2002e9c 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -30,6 +30,21 @@ jobs:
fileVersion: ${{ steps.gitversion.outputs.MajorMinorPatch }}
informationalVersion: ${{ steps.gitversion.outputs.InformationalVersion }}
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: TiaCodegen-ts/package-lock.json
+ - name: Install TypeScript dependencies
+ run: npm ci
+ working-directory: TiaCodegen-ts
+ - name: Build TypeScript
+ run: npm run build
+ working-directory: TiaCodegen-ts
+ - name: Test TypeScript
+ run: npm test
+ working-directory: TiaCodegen-ts
- name: Restore dependencies
run: dotnet restore
- name: Build
diff --git a/.github/workflows/dotnetpull.yml b/.github/workflows/dotnetpull.yml
index a547030..4fc917f 100644
--- a/.github/workflows/dotnetpull.yml
+++ b/.github/workflows/dotnetpull.yml
@@ -15,6 +15,21 @@ jobs:
uses: actions/setup-dotnet@v1
with:
dotnet-version: 9.0.x
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: TiaCodegen-ts/package-lock.json
+ - name: Install TypeScript dependencies
+ run: npm ci
+ working-directory: TiaCodegen-ts
+ - name: Build TypeScript
+ run: npm run build
+ working-directory: TiaCodegen-ts
+ - name: Test TypeScript
+ run: npm test
+ working-directory: TiaCodegen-ts
- name: Restore dependencies
run: dotnet restore
- name: Build
diff --git a/TiaCodeGen.Tests/SampleTests.cs b/TiaCodeGen.Tests/SampleTests.cs
index c161b39..dac9d01 100644
--- a/TiaCodeGen.Tests/SampleTests.cs
+++ b/TiaCodeGen.Tests/SampleTests.cs
@@ -1,568 +1,602 @@
-using NUnit.Framework;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Text;
-using TiaCodegen.Blocks;
-using TiaCodegen.Commands;
-using TiaCodegen.Commands.Coils;
-using TiaCodegen.Commands.Comparisons;
-using TiaCodegen.Commands.Functions;
-using TiaCodegen.Commands.Functions.Base;
-using TiaCodegen.Commands.Signals;
-using TiaCodegen.Enums;
-using TiaCodegen.Interfaces;
-
-namespace TiaCodegen.Samples
-{
- [TestFixture]
- public class SampleTests
- {
- const string TestInterface = @"
-
-
-
-
-
- Initial call of this OB
-
-
-
-
- =True, if remanent data are available
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-";
-
- [Test]
- public void CreateBlock1()
- {
- var codeblock = new CodeBlock();
- var nw = new Network("Test1", "Test1en");
-
- nw.Add(
- new And(
- new Signal("#Bool1"),
- new Distributor
- (
- new RCoil(new Signal("#Bool2")),
- new Coil(new Signal("#Bool3"))
- )));
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void CreateBlock2()
- {
- var codeblock = new CodeBlock();
-
- var nw = new Network("Test2", "Test2en");
- nw.Add(
- new And(
- new Signal("#Bool1"),
- new Signal("#Bool2"),
- new Convert(
- new Signal("#Real1", SignalType.Real),
- new Signal("#Dint2", SignalType.DInt)
- ),
- new Distributor(
- new And(
- new Move(
- new Signal("#Real3"),
- new Signal("#Real4")
- ),
- new SCoil(new Signal("#Bool3"))
- ),
- new And(
- new Gt(
- new Signal("#Real1", SignalType.Real),
- new Signal("#Real2", SignalType.Real)
- ),
- new SCoil(new Signal("#Bool4"))
- )
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- var xml = block.GetCode();
- block.Interface = TestInterface;
- }
-
- [Test]
- public void CreateBlock3()
- {
- var codeblock = new CodeBlock();
-
- var nw = new Network("Test2", "Test2en");
- nw.Add(
- new Coil(
- new Signal("#Bool1"),
- new And(
- new Signal("#Bool2"),
- new Or(
- new Signal("#Bool3"),
- new And(
- new Signal("#Bool1"),
- new Signal("#Bool4")
- )
- )
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void DynamicSample1()
- {
- var codeblock = new CodeBlock();
-
- var signals = new List() { "#Bool1", "#Bool2", "#Bool3" };
- var and = new And();
- foreach (var s in signals)
- and.Add(new Signal(s));
-
- var nw = new Network("Test2", "test2en");
- nw.Add(
- new Coil(
- new Signal("#Bool4"),
- and
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestCallWithOr()
- {
- var codeblock = new CodeBlock();
-
- var nw = new Network("Test2", "Test2en");
-
- var f = new FunctionBlockCall("CheckContour", "CheckContourInstance");
- f.Interface["BoolPar"] = new IOperationOrSignalDirectionWrapper(new Or(new Signal("P1"), new Signal("P2")), Direction.InOut);
- f.Children.AddRange(f.Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
- nw.Add(f);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestDistributor()
- {
- var codeblock = new CodeBlock();
-
- var nw = new Network("Test2", "Test2en");
- nw.Add(
- new And(
- new Not(new Signal("Tag_9")),
- new Distributor(
- new And(
- new Coil(new Signal("#monitoringSignal"))
- ),
- new And(
- new TONCall("OnDelaySafetyDoorSDA11N13", pt: new Signal("T#60s", SignalType.ConstantTime), q: null)
- )
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestCallWithInRange()
- {
- var codeblock = new CodeBlock();
-
- var nw = new Network("Test2", "Test2en");
-
- var f = new InRangeCall(new Signal(1), new Signal(2), new Signal(3), new Coil(new Signal("MW0", SignalType.Int)));
- nw.Add(f);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestCallWithTOn()
- {
- var codeblock = new CodeBlock() { Safety = true };
-
- var nw = new Network("Test2", "Test2en");
-
- var f = new TONCall("Hallo", pt: new Signal("T#4m", SignalType.ConstantTime));
- nw.Add(f);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestCallWithCTU()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("Test2", "Test2en");
-
- var f = new And(new Signal("aa"), new CTUCall("Hallo", r: new Signal("bbb", SignalType.Bool), pv: new Signal("2", SignalType.ConstantInt), q: new Coil(new Signal("ccc", SignalType.Bool))));
- nw.Add(f);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void TestCallWithTPAndDistributor()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("Test2", "Test2en");
- var and =
- new And(
- new Signal("#aaa"),
- new TPCall("PulseStartPrint",
- pt: new Signal("T#100ms", SignalType.ConstantTime),
- q: new Distributor(
- new Coil(new Signal("#bbbb")),
- new RCoil(new Signal("#cccc")),
- new SCoil(new Signal("#dddd"))
- )
- )
- );
-
- nw.Add(and);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void DistributorWithOr()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("Test2", "Test2en");
- nw.Add(
- new And(
- new Signal("asd"),
- new Distributor(
- new SCoil(new Signal("x")),
- new And(
- new Or(
- new And(
- new Signal("a"),
- new Signal("h")
- ),
- new And(
- new Signal("b"),
- new Signal("f")
- )
- ),
- new SCoil(new Signal("c"))
- )
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void MultipleOr()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("Test2", "Test2en");
- nw.Add(
- new Coil(
- new Signal("a"),
- new And(
- new Signal("1"),
- new Or(
- new And(
- new Or(
- new Signal("b"),
- new Signal("c")
- ),
- new Signal("d")
- ),
- new Signal("e")
- )
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void PeripheryFixedSignal()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("Test3", "Test3en");
- nw.Add(
- new Coil(
- new FixedPeripherySignal("=PBG10.6+FBG11-BV1:4"),
- new And(
- new Signal("1")
- )
- )
- );
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void ComplexVariableAccessTest1()
- {
- var sb = new StringBuilder();
- var s = new Signal("#A.B.C[#D.E.F, 1]");
- s.AddXmlToStringBuilder(1, sb);
- var xml = sb.ToString();
- Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
- }
-
- [Test]
- public void ComplexVariableAccessTest2()
- {
- var sb = new StringBuilder();
- var s = new Signal("#A.B.C[#D.E.F, #G.H.I]");
- s.AddXmlToStringBuilder(1, sb);
- var xml = sb.ToString();
- Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
- }
-
- [Test]
- public void TestConstant()
- {
- var sb = new StringBuilder();
- var s = new Signal("AAA", SignalType.Constant);
- s.AddXmlToStringBuilder(1, sb);
- var xml = sb.ToString();
- Assert.AreEqual("\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
- }
-
- [Test]
- public void SystemFunctionDPXX_DAT()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("TestDPXX_DAT", "TestDPXX_DATen");
-
- var sf1 = new SystemFunctionCall("DPRD_DAT");
- sf1.Interface["LADDR"] = new IOperationOrSignalDirectionWrapper(new Signal("#Configuration.GeneralMoviC.ModuleHardwareID"), Direction.Input);
- sf1.Interface["RET_VAL"] = new IOperationOrSignalDirectionWrapper(new Signal("#retVal"), Direction.Output);
- sf1.Interface["RECORD"] = new IOperationOrSignalDirectionWrapper(new Signal("#PeripheryInputsMoviC"), Direction.Output);
- sf1.Children.AddRange(sf1.Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
-
- nw.Add(sf1);
-
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
-
- //Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
- }
-
- [Test]
- public void ComplexOr()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("T1", "T1");
-
- nw.Add(
- new Coil(
- new Signal("Test11"),
- new Or(
- new And(
- new Signal("Test1"),
- new Or(
- new And(
- new Signal("Test2"),
- new Or(
- new Signal("Test3"),
- new Signal("Test4")
- )
- { DebugInfo = "aaa" }
- ),
- new Signal("Test5")
- )
- { DebugInfo = "bbb" }
- ),
- new And(
- new Signal("Test6"),
- new Or(
- new And(
- new Signal("Test7"),
- new Or(
- new Signal("Test8"),
- new Signal("Test9")
- )
- { DebugInfo = "ccc" }
- ),
- new Signal("Test10")
- )
- { DebugInfo = "ddd" }
- )
- )
- { DebugInfo = "eee" }
- )
- );
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
- [Test]
- public void ComplexOr2()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("T1", "T1");
-
- nw.Add(
- new Coil(
- new Signal("Test11"),
- new Or(
- new Signal("Test12"),
- new Or(
- new And(
- new Signal("Test1"),
- new Or(
- new And(
- new Signal("Test2"),
- new Or(
- new Signal("Test3"),
- new Signal("Test4")
- )
- ),
- new Signal("Test5")
- )
- ),
- new And(
- new Signal("Test6"),
- new Or(
- new And(
- new Signal("Test7"),
- new Or(
- new Signal("Test8"),
- new Signal("Test9")
- )
- ),
- new Signal("Test10")
- )
- )
- )
- )
- )
- );
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
-
-
- [Test]
- public void Complex3()
- {
- var codeblock = new CodeBlock() { Safety = false };
-
- var nw = new Network("T1", "T1");
-
- nw.Add(
- new Coil(
- new Signal("Test11"),
- new And(
- new Signal("Test1"),
- new Or(
- new Signal("Test2")
- )
- )
- )
- );
- codeblock.Add(nw);
-
- var block = new Block("Test", "blabla", codeblock);
- block.Interface = TestInterface;
- var xml = block.GetCode();
- }
- }
-}
+using NUnit.Framework;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using TiaCodegen.Blocks;
+using TiaCodegen.Commands;
+using TiaCodegen.Commands.Coils;
+using TiaCodegen.Commands.Comparisons;
+using TiaCodegen.Commands.Functions;
+using TiaCodegen.Commands.Functions.Base;
+using TiaCodegen.Commands.Signals;
+using TiaCodegen.Enums;
+using TiaCodegen.Interfaces;
+
+namespace TiaCodegen.Samples
+{
+ [TestFixture]
+ public class SampleTests
+ {
+ const string TestInterface = @"
+
+
+
+
+
+ Initial call of this OB
+
+
+
+
+ =True, if remanent data are available
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+";
+
+ [Test]
+ public void CreateBlock1()
+ {
+ var codeblock = new CodeBlock();
+ var nw = new Network("Test1", "Test1en");
+
+ nw.Add(
+ new And(
+ new Signal("#Bool1"),
+ new Distributor
+ (
+ new RCoil(new Signal("#Bool2")),
+ new Coil(new Signal("#Bool3"))
+ )));
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void CreateBlock2()
+ {
+ var codeblock = new CodeBlock();
+
+ var nw = new Network("Test2", "Test2en");
+ nw.Add(
+ new And(
+ new Signal("#Bool1"),
+ new Signal("#Bool2"),
+ new Convert(
+ new Signal("#Real1", SignalType.Real),
+ new Signal("#Dint2", SignalType.DInt)
+ ),
+ new Distributor(
+ new And(
+ new Move(
+ new Signal("#Real3"),
+ new Signal("#Real4")
+ ),
+ new SCoil(new Signal("#Bool3"))
+ ),
+ new And(
+ new Gt(
+ new Signal("#Real1", SignalType.Real),
+ new Signal("#Real2", SignalType.Real)
+ ),
+ new SCoil(new Signal("#Bool4"))
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ var xml = block.GetCode();
+ block.Interface = TestInterface;
+ }
+
+ [Test]
+ public void CreateBlock3()
+ {
+ var codeblock = new CodeBlock();
+
+ var nw = new Network("Test2", "Test2en");
+ nw.Add(
+ new Coil(
+ new Signal("#Bool1"),
+ new And(
+ new Signal("#Bool2"),
+ new Or(
+ new Signal("#Bool3"),
+ new And(
+ new Signal("#Bool1"),
+ new Signal("#Bool4")
+ )
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void DynamicSample1()
+ {
+ var codeblock = new CodeBlock();
+
+ var signals = new List() { "#Bool1", "#Bool2", "#Bool3" };
+ var and = new And();
+ foreach (var s in signals)
+ and.Add(new Signal(s));
+
+ var nw = new Network("Test2", "test2en");
+ nw.Add(
+ new Coil(
+ new Signal("#Bool4"),
+ and
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestCallWithOr()
+ {
+ var codeblock = new CodeBlock();
+
+ var nw = new Network("Test2", "Test2en");
+
+ var f = new FunctionBlockCall("CheckContour", "CheckContourInstance");
+ f.Interface["BoolPar"] = new IOperationOrSignalDirectionWrapper(new Or(new Signal("P1"), new Signal("P2")), Direction.InOut);
+ f.Children.AddRange(f.Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
+ nw.Add(f);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestDistributor()
+ {
+ var codeblock = new CodeBlock();
+
+ var nw = new Network("Test2", "Test2en");
+ nw.Add(
+ new And(
+ new Not(new Signal("Tag_9")),
+ new Distributor(
+ new And(
+ new Coil(new Signal("#monitoringSignal"))
+ ),
+ new And(
+ new TONCall("OnDelaySafetyDoorSDA11N13", pt: new Signal("T#60s", SignalType.ConstantTime), q: null)
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestCallWithInRange()
+ {
+ var codeblock = new CodeBlock();
+
+ var nw = new Network("Test2", "Test2en");
+
+ var f = new InRangeCall(new Signal(1), new Signal(2), new Signal(3), new Coil(new Signal("MW0", SignalType.Int)));
+ nw.Add(f);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestCallWithTOn()
+ {
+ var codeblock = new CodeBlock() { Safety = true };
+
+ var nw = new Network("Test2", "Test2en");
+
+ var f = new TONCall("Hallo", pt: new Signal("T#4m", SignalType.ConstantTime));
+ nw.Add(f);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestCallWithCTU()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("Test2", "Test2en");
+
+ var f = new And(new Signal("aa"), new CTUCall("Hallo", r: new Signal("bbb", SignalType.Bool), pv: new Signal("2", SignalType.ConstantInt), q: new Coil(new Signal("ccc", SignalType.Bool))));
+ nw.Add(f);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void TestCallWithTPAndDistributor()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("Test2", "Test2en");
+ var and =
+ new And(
+ new Signal("#aaa"),
+ new TPCall("PulseStartPrint",
+ pt: new Signal("T#100ms", SignalType.ConstantTime),
+ q: new Distributor(
+ new Coil(new Signal("#bbbb")),
+ new RCoil(new Signal("#cccc")),
+ new SCoil(new Signal("#dddd"))
+ )
+ )
+ );
+
+ nw.Add(and);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void DistributorWithOr()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("Test2", "Test2en");
+ nw.Add(
+ new And(
+ new Signal("asd"),
+ new Distributor(
+ new SCoil(new Signal("x")),
+ new And(
+ new Or(
+ new And(
+ new Signal("a"),
+ new Signal("h")
+ ),
+ new And(
+ new Signal("b"),
+ new Signal("f")
+ )
+ ),
+ new SCoil(new Signal("c"))
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void MultipleOr()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("Test2", "Test2en");
+ nw.Add(
+ new Coil(
+ new Signal("a"),
+ new And(
+ new Signal("1"),
+ new Or(
+ new And(
+ new Or(
+ new Signal("b"),
+ new Signal("c")
+ ),
+ new Signal("d")
+ ),
+ new Signal("e")
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void PeripheryFixedSignal()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("Test3", "Test3en");
+ nw.Add(
+ new Coil(
+ new FixedPeripherySignal("=PBG10.6+FBG11-BV1:4"),
+ new And(
+ new Signal("1")
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void ComplexVariableAccessTest1()
+ {
+ var sb = new StringBuilder();
+ var s = new Signal("#A.B.C[#D.E.F, 1]");
+ s.AddXmlToStringBuilder(1, sb);
+ var xml = sb.ToString();
+ Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
+ }
+
+ [Test]
+ public void ComplexVariableAccessTest2()
+ {
+ var sb = new StringBuilder();
+ var s = new Signal("#A.B.C[#D.E.F, #G.H.I]");
+ s.AddXmlToStringBuilder(1, sb);
+ var xml = sb.ToString();
+ Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
+ }
+
+ [Test]
+ public void TestConstant()
+ {
+ var sb = new StringBuilder();
+ var s = new Signal("AAA", SignalType.Constant);
+ s.AddXmlToStringBuilder(1, sb);
+ var xml = sb.ToString();
+ Assert.AreEqual("\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
+ }
+
+ [Test]
+ public void SystemFunctionDPXX_DAT()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("TestDPXX_DAT", "TestDPXX_DATen");
+
+ var sf1 = new SystemFunctionCall("DPRD_DAT");
+ sf1.Interface["LADDR"] = new IOperationOrSignalDirectionWrapper(new Signal("#Configuration.GeneralMoviC.ModuleHardwareID"), Direction.Input);
+ sf1.Interface["RET_VAL"] = new IOperationOrSignalDirectionWrapper(new Signal("#retVal"), Direction.Output);
+ sf1.Interface["RECORD"] = new IOperationOrSignalDirectionWrapper(new Signal("#PeripheryInputsMoviC"), Direction.Output);
+ sf1.Children.AddRange(sf1.Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
+
+ nw.Add(sf1);
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+
+ //Assert.AreEqual("\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n".Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
+ }
+
+ [Test]
+ public void ComplexOr()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("T1", "T1");
+
+ nw.Add(
+ new Coil(
+ new Signal("Test11"),
+ new Or(
+ new And(
+ new Signal("Test1"),
+ new Or(
+ new And(
+ new Signal("Test2"),
+ new Or(
+ new Signal("Test3"),
+ new Signal("Test4")
+ )
+ { DebugInfo = "aaa" }
+ ),
+ new Signal("Test5")
+ )
+ { DebugInfo = "bbb" }
+ ),
+ new And(
+ new Signal("Test6"),
+ new Or(
+ new And(
+ new Signal("Test7"),
+ new Or(
+ new Signal("Test8"),
+ new Signal("Test9")
+ )
+ { DebugInfo = "ccc" }
+ ),
+ new Signal("Test10")
+ )
+ { DebugInfo = "ddd" }
+ )
+ )
+ { DebugInfo = "eee" }
+ )
+ );
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void ComplexOr2()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("T1", "T1");
+
+ nw.Add(
+ new Coil(
+ new Signal("Test11"),
+ new Or(
+ new Signal("Test12"),
+ new Or(
+ new And(
+ new Signal("Test1"),
+ new Or(
+ new And(
+ new Signal("Test2"),
+ new Or(
+ new Signal("Test3"),
+ new Signal("Test4")
+ )
+ ),
+ new Signal("Test5")
+ )
+ ),
+ new And(
+ new Signal("Test6"),
+ new Or(
+ new And(
+ new Signal("Test7"),
+ new Or(
+ new Signal("Test8"),
+ new Signal("Test9")
+ )
+ ),
+ new Signal("Test10")
+ )
+ )
+ )
+ )
+ )
+ );
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+
+ [Test]
+ public void Complex3()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+
+ var nw = new Network("T1", "T1");
+
+ nw.Add(
+ new Coil(
+ new Signal("Test11"),
+ new And(
+ new Signal("Test1"),
+ new Or(
+ new Signal("Test2")
+ )
+ )
+ )
+ );
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ block.Interface = TestInterface;
+ var xml = block.GetCode();
+ }
+
+ [Test]
+ public void DoubleCarrierTest()
+ {
+ var codeblock = new CodeBlock() { Safety = false };
+ var nw = new Network("Test", "Testen");
+
+ nw.Add(
+ new And(
+ new Eq(new Signal("#Configuration.General.SingleDoubleCarrier", SignalType.Int), new Signal(2)),
+ new Distributor(
+ new And(
+ new Or(
+ new Signal("#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]"),
+ new Signal("#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1]")
+ ),
+ new Coil(new Signal("#CarrierGeneral.States.CarriageOccupied[2]"))
+ ),
+ new And(
+ new Signal("#DoubleCarrierData.MOrder.DataPresent"),
+ new Coil(new Signal("#CarrierGeneral.States.CarriageDataPresent[2]"))
+ )
+ )
+ )
+ );
+
+ codeblock.Add(nw);
+
+ var block = new Block("Test", "blabla", codeblock);
+ var xml = block.GetCode();
+
+ var expectedXml = @" General 1.0 Optimized Test LAD DInt2DInt2DInt1DInt1Int2Int2 LADde-DEen-GBde-DETesten-GBTesten de-DE blabla en-GB de-DE en-GB ";
+ Assert.AreEqual(expectedXml.Replace("\n", "").Replace("\r", ""), xml.Replace("\n", "").Replace("\r", ""));
+ }
+ }
+}
\ No newline at end of file
diff --git a/TiaCodegen-ts/.gitignore b/TiaCodegen-ts/.gitignore
new file mode 100644
index 0000000..1eae0cf
--- /dev/null
+++ b/TiaCodegen-ts/.gitignore
@@ -0,0 +1,2 @@
+dist/
+node_modules/
diff --git a/TiaCodegen-ts/package-lock.json b/TiaCodegen-ts/package-lock.json
new file mode 100644
index 0000000..8703977
--- /dev/null
+++ b/TiaCodegen-ts/package-lock.json
@@ -0,0 +1,4331 @@
+{
+ "name": "@node-projects/tia-codegen-ts",
+ "version": "2.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@node-projects/tia-codegen-ts",
+ "version": "2.0.1",
+ "devDependencies": {
+ "@types/jest": "^29.5.12",
+ "@types/node": "^20.12.7",
+ "esbuild": "^0.27.4",
+ "jest": "^29.7.0",
+ "ts-jest": "^29.1.2",
+ "typescript": "^5.4.5"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+ "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+ "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz",
+ "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz",
+ "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz",
+ "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz",
+ "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz",
+ "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz",
+ "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz",
+ "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz",
+ "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz",
+ "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz",
+ "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz",
+ "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz",
+ "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz",
+ "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz",
+ "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz",
+ "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz",
+ "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz",
+ "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz",
+ "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz",
+ "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz",
+ "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz",
+ "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz",
+ "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz",
+ "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz",
+ "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz",
+ "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz",
+ "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "29.5.14",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
+ "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "^29.0.0",
+ "pretty-format": "^29.0.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.19.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz",
+ "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bs-logger": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+ "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-json-stable-stringify": "2.x"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001770",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz",
+ "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz",
+ "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.302",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
+ "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.4",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz",
+ "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.4",
+ "@esbuild/android-arm": "0.27.4",
+ "@esbuild/android-arm64": "0.27.4",
+ "@esbuild/android-x64": "0.27.4",
+ "@esbuild/darwin-arm64": "0.27.4",
+ "@esbuild/darwin-x64": "0.27.4",
+ "@esbuild/freebsd-arm64": "0.27.4",
+ "@esbuild/freebsd-x64": "0.27.4",
+ "@esbuild/linux-arm": "0.27.4",
+ "@esbuild/linux-arm64": "0.27.4",
+ "@esbuild/linux-ia32": "0.27.4",
+ "@esbuild/linux-loong64": "0.27.4",
+ "@esbuild/linux-mips64el": "0.27.4",
+ "@esbuild/linux-ppc64": "0.27.4",
+ "@esbuild/linux-riscv64": "0.27.4",
+ "@esbuild/linux-s390x": "0.27.4",
+ "@esbuild/linux-x64": "0.27.4",
+ "@esbuild/netbsd-arm64": "0.27.4",
+ "@esbuild/netbsd-x64": "0.27.4",
+ "@esbuild/openbsd-arm64": "0.27.4",
+ "@esbuild/openbsd-x64": "0.27.4",
+ "@esbuild/openharmony-arm64": "0.27.4",
+ "@esbuild/sunos-x64": "0.27.4",
+ "@esbuild/win32-arm64": "0.27.4",
+ "@esbuild/win32-ia32": "0.27.4",
+ "@esbuild/win32-x64": "0.27.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
+ "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-jest": {
+ "version": "29.4.6",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz",
+ "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bs-logger": "^0.2.6",
+ "fast-json-stable-stringify": "^2.1.0",
+ "handlebars": "^4.7.8",
+ "json5": "^2.2.3",
+ "lodash.memoize": "^4.1.2",
+ "make-error": "^1.3.6",
+ "semver": "^7.7.3",
+ "type-fest": "^4.41.0",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "ts-jest": "cli.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7.0.0-beta.0 <8",
+ "@jest/transform": "^29.0.0 || ^30.0.0",
+ "@jest/types": "^29.0.0 || ^30.0.0",
+ "babel-jest": "^29.0.0 || ^30.0.0",
+ "jest": "^29.0.0 || ^30.0.0",
+ "jest-util": "^29.0.0 || ^30.0.0",
+ "typescript": ">=4.3 <6"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "@jest/transform": {
+ "optional": true
+ },
+ "@jest/types": {
+ "optional": true
+ },
+ "babel-jest": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jest-util": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-jest/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ts-jest/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/TiaCodegen-ts/package.json b/TiaCodegen-ts/package.json
new file mode 100644
index 0000000..b53e105
--- /dev/null
+++ b/TiaCodegen-ts/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "@node-projects/tia-codegen-ts",
+ "version": "2.0.1",
+ "description": "TypeScript port of TiaCodeGen C# library",
+ "type": "module",
+ "main": "dist/index.js",
+ "types": "dist/index.d.ts",
+ "exports": {
+ ".": {
+ "import": "./dist/index.js",
+ "types": "./dist/index.d.ts"
+ }
+ },
+ "scripts": {
+ "build": "tsc",
+ "test": "node --experimental-vm-modules node_modules/jest-cli/bin/jest.js --testPathPattern=tests",
+ "typecheck": "tsc --noEmit",
+ "bundle": "esbuild ./dist/index.js --format=esm --minify --external:wunderbaum --platform=neutral --bundle --outfile=./dist/index-min.js",
+ "prepublishOnly": "npm run build && npm run bundle"
+ },
+ "devDependencies": {
+ "@types/jest": "^29.5.12",
+ "@types/node": "^20.12.7",
+ "esbuild": "^0.27.4",
+ "jest": "^29.7.0",
+ "ts-jest": "^29.1.2",
+ "typescript": "^5.4.5"
+ },
+ "jest": {
+ "preset": "ts-jest/presets/default-esm",
+ "testEnvironment": "node",
+ "testMatch": [
+ "**/tests/**/*.test.ts"
+ ],
+ "moduleNameMapper": {
+ "^(\\.{1,2}/.*)\\.js$": "$1"
+ },
+ "transform": {
+ "^.+\\.tsx?$": [
+ "ts-jest",
+ {
+ "useESM": true
+ }
+ ]
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Blocks/Block.ts b/TiaCodegen-ts/src/Blocks/Block.ts
new file mode 100644
index 0000000..0bc761a
--- /dev/null
+++ b/TiaCodegen-ts/src/Blocks/Block.ts
@@ -0,0 +1,99 @@
+import { CodeBlock } from './CodeBlock.js';
+import { KopCodeHelper } from '../CodeGen/KopCodeHelper.js';
+
+export class Block {
+ name: string;
+ number: number = 0;
+ private codeBlock: CodeBlock;
+ title: string | undefined;
+ titleEnglish: string | undefined;
+ comment: string | undefined;
+ commentEnglish: string | undefined;
+ author: string | undefined;
+ blockInterface: string;
+
+ constructor(name: string, title: string, codeBlock: CodeBlock) {
+ this.name = name;
+ this.title = title;
+ this.codeBlock = codeBlock;
+
+ this.blockInterface = `
+
+
+
+
+
+
+
+
+
+
+`;
+ }
+
+ getCode(): string {
+ const idRef = { value: 0 };
+ let code = this.getBlockHeader(idRef);
+ code += new KopCodeHelper(this.codeBlock).getXml(idRef);
+ code += this.getBlockFooter(idRef);
+ return code;
+ }
+
+ getBlockHeader(idRef: { value: number }): string {
+ const header = `
+
+
+ ${this.author !== undefined && this.author !== null ? '' + this.author + '' : ''}
+ General
+ 1.0
+ Optimized
+ ${this.name}
+ ${this.number !== 0 ? '' + this.number + '' : ''}
+
+ LAD
+
+ `;
+ return header;
+ }
+
+ getBlockFooter(idRef: { value: number }): string {
+ const footer = `
+
+
+
+
+ de-DE
+ ${this.title}
+
+
+
+
+ en-GB
+ ${this.titleEnglish ?? ''}
+
+
+
+
+
+
+
+
+ de-DE
+ ${this.comment ?? ''}
+
+
+
+
+ en-GB
+ ${this.commentEnglish ?? ''}
+
+
+
+
+
+ `;
+ return footer;
+ }
+}
diff --git a/TiaCodegen-ts/src/Blocks/CodeBlock.ts b/TiaCodegen-ts/src/Blocks/CodeBlock.ts
new file mode 100644
index 0000000..f0995fb
--- /dev/null
+++ b/TiaCodegen-ts/src/Blocks/CodeBlock.ts
@@ -0,0 +1,11 @@
+import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal.js';
+
+export class CodeBlock extends BaseOperationOrSignal {
+ name: string;
+ safety: boolean = false;
+
+ constructor(name: string = '') {
+ super();
+ this.name = name;
+ }
+}
diff --git a/TiaCodegen-ts/src/Blocks/Network.ts b/TiaCodegen-ts/src/Blocks/Network.ts
new file mode 100644
index 0000000..ea4f1c8
--- /dev/null
+++ b/TiaCodegen-ts/src/Blocks/Network.ts
@@ -0,0 +1,37 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal.js';
+
+export class Network extends BaseOperationOrSignal {
+ networkTitle: string | undefined;
+ description: string | undefined;
+ networkTitleEnglish: string | undefined;
+ descriptionEnglish: string | undefined;
+
+ constructor(
+ networkTitleOrOp?: string | IOperationOrSignal,
+ networkTitleEnglishOrOp?: string | IOperationOrSignal,
+ ...operationOrSignals: IOperationOrSignal[]
+ ) {
+ super();
+ if (typeof networkTitleOrOp === 'string') {
+ this.networkTitle = networkTitleOrOp;
+ this.networkTitleEnglish = typeof networkTitleEnglishOrOp === 'string'
+ ? networkTitleEnglishOrOp
+ : undefined;
+ if (networkTitleEnglishOrOp !== undefined && typeof networkTitleEnglishOrOp !== 'string') {
+ this.children.push(networkTitleEnglishOrOp);
+ }
+ for (const op of operationOrSignals) {
+ this.children.push(op);
+ }
+ } else {
+ if (networkTitleOrOp !== undefined) this.children.push(networkTitleOrOp);
+ if (networkTitleEnglishOrOp !== undefined && typeof networkTitleEnglishOrOp !== 'string') {
+ this.children.push(networkTitleEnglishOrOp);
+ }
+ for (const op of operationOrSignals) {
+ this.children.push(op);
+ }
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts b/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts
new file mode 100644
index 0000000..eda5a78
--- /dev/null
+++ b/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts
@@ -0,0 +1,888 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { ICoil } from '../Interfaces/ICoil.js';
+import { IFunctionOperation } from '../Interfaces/IFunctionOperation.js';
+import { IPartName } from '../Interfaces/IPartName.js';
+import { StringBuilder } from '../utils/StringBuilder.js';
+import { flatten } from '../Internal/IEnumerableExtensions.js';
+import { NaturalComparer } from '../Extensions/NaturalComparer.js';
+import { CodeBlock } from '../Blocks/CodeBlock.js';
+import { Network } from '../Blocks/Network.js';
+import { And } from '../Commands/And.js';
+import { Or } from '../Commands/Or.js';
+import { Not } from '../Commands/Not.js';
+import { Distributor } from '../Commands/Distributor.js';
+import { Move } from '../Commands/Move.js';
+import { Convert } from '../Commands/Convert.js';
+import { S_Move } from '../Commands/S_Move.js';
+import { Signal } from '../Commands/Signals/Signal.js';
+import { BaseCoil } from '../Commands/Coils/BaseCoil.js';
+import { BaseNPCoil } from '../Commands/Coils/BaseNPCoil.js';
+import { Coil } from '../Commands/Coils/Coil.js';
+import { SCoil } from '../Commands/Coils/SCoil.js';
+import { RCoil } from '../Commands/Coils/RCoil.js';
+import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal.js';
+import { CompareOperator } from '../Commands/Comparisons/CompareOperator.js';
+import { InRangeCall } from '../Commands/Comparisons/InRangeCall.js';
+import { OutRangeCall } from '../Commands/Comparisons/OutRangeCall.js';
+import { FunctionCall } from '../Commands/Functions/Base/FunctionCall.js';
+import { FunctionBlockCall } from '../Commands/Functions/Base/FunctionBlockCall.js';
+import { SystemFunctionCall } from '../Commands/Functions/Base/SystemFunctionCall.js';
+import { SystemFunctionBlockCall } from '../Commands/Functions/Base/SystemFunctionBlockCall.js';
+import { ArithmeticCall } from '../Commands/Functions/Arithmetic/ArithmeticCall.js';
+import { VariableArithmeticCall } from '../Commands/Functions/Arithmetic/VariableArithmeticCall.js';
+import { AckGlCall } from '../Commands/Functions/AckGlCall.js';
+import { CTUCall } from '../Commands/Functions/CTUCall.js';
+import { CTUDCall } from '../Commands/Functions/CTUDCall.js';
+import { tryGetParent } from '../Extensions/OperationOrSignalExtensions.js';
+
+export class KopCodeHelper {
+ static flattenOrdered(e: T[], f: (t: T) => T[]): T[] {
+ const result: T[] = [];
+ for (const el of e) {
+ for (const el2 of KopCodeHelper.flattenOrdered(f(el), f)) {
+ result.push(el2);
+ }
+ result.push(el);
+ }
+ return result;
+ }
+
+ private _currentId: number = 21;
+ private _block: CodeBlock;
+ private _sb: StringBuilder;
+
+ constructor(block: CodeBlock) {
+ this._block = block;
+ this._sb = new StringBuilder();
+ }
+
+ private addSignalDefinitions(network: Network): void {
+ const allChildren = flatten(network.children, x => x.children);
+ const signals = allChildren
+ .filter((x): x is Signal => x instanceof Signal)
+ .slice()
+ .sort((a, b) => new NaturalComparer().compare(a.name, b.name));
+
+ for (const signal of signals) {
+ signal.addXmlToStringBuilder(this._currentId, this._sb);
+ signal.signalId = this._currentId;
+ this._currentId++;
+ }
+ }
+
+ private checkAndAndOr(block: CodeBlock, network: Network): void {
+ const allChildren = flatten(network.children, x => x.children);
+ const ors = allChildren.filter((x): x is Or => x instanceof Or);
+
+ for (const or of ors) {
+ if (or.children.length === 0) {
+ throw new Error(`Empty Or im Baustein "${block.name}" Netzwerk "${network.networkTitle}"`);
+ }
+ }
+ }
+
+ private printTree(signal: IOperationOrSignal, sb: StringBuilder, level: number = 0): void {
+ sb.appendLine(' '.repeat(level * 4) + signal.toString() + ' OP ID: ' + signal.operationId);
+ for (const s of signal.children) {
+ this.printTree(s, sb, level + 1);
+ }
+ }
+
+ private addContactDefinitions(network: Network, block: CodeBlock): void {
+ const ops = KopCodeHelper.flattenOrdered(network.children, x => x.children)
+ .filter((x): x is IOperationOrSignal => true);
+
+ for (const op of ops) {
+ if (op instanceof Signal) {
+ // nothing
+ } else if (op instanceof And || (op instanceof Or && op.children.length === 1)) {
+ // nothing
+ } else {
+ if (op instanceof Or && op.children.length > 1) {
+ op.createContactAndFillCardinality(op);
+ }
+ }
+ }
+
+ for (const op of ops) {
+ if (op instanceof Signal) {
+ if (
+ !(op.parent instanceof BaseCoil) &&
+ !(op.parent instanceof Not) &&
+ !(op.parent instanceof FunctionCall) &&
+ !(op.parent instanceof CompareOperator) &&
+ !(op.parent instanceof Move) &&
+ !(op.parent instanceof Convert) &&
+ !(op.parent instanceof S_Move)
+ ) {
+ op.operationId = this._currentId;
+ this._currentId++;
+ }
+ } else if (op instanceof And || (op instanceof Or && op.children.length === 1)) {
+ op.operationId = op.children[op.children.length - 1].operationId;
+ } else {
+ op.operationId = this._currentId;
+ if (op instanceof Not || op instanceof BaseCoil || op instanceof SystemFunctionBlockCall || op instanceof SystemFunctionCall) {
+ if (op.children.length > 0) {
+ op.children[0].operationId = this._currentId;
+ }
+ }
+
+ if (op instanceof Or && op.children.length > 1) {
+ op.createContactAndFillCardinality(op);
+ }
+
+ if (!(op instanceof Distributor) && !op.doNotCreateContact) {
+ this._currentId++;
+ }
+ }
+ }
+
+ for (const op of ops) {
+ let partname = op.constructor.name;
+ if (this.isIPartName(op)) {
+ partname = (op as unknown as IPartName).partName;
+ }
+
+ if (op instanceof Signal) {
+ if (
+ !(op.parent instanceof BaseCoil) &&
+ !(op.parent instanceof Not) &&
+ !(op.parent instanceof FunctionCall) &&
+ !(op.parent instanceof CompareOperator) &&
+ !(op.parent instanceof Move) &&
+ !(op.parent instanceof Convert) &&
+ !(op.parent instanceof S_Move)
+ ) {
+ this._sb.appendLine(``);
+ }
+ } else if (op instanceof Or && op.children.length > 1) {
+ if (!op.doNotCreateContact) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(`${op.cardinality}`);
+ this._sb.appendLine('');
+ }
+ } else if (op instanceof CompareOperator) {
+ this._sb.appendLine(``);
+ let srctype = (op.children[0] as Signal).signalType.toString();
+ if (srctype.startsWith('Constant')) srctype = srctype.substring(8);
+ this._sb.appendLine(`${srctype}`);
+ this._sb.appendLine('');
+ } else if (op instanceof Convert) {
+ this._sb.appendLine(``);
+ let srctype = (op.children[op.children.length - 1] as Signal).signalType.toString();
+ let desttype = (op.children[0] as Signal).signalType.toString();
+ if (srctype.startsWith('Constant')) srctype = srctype.substring(8);
+ if (desttype.startsWith('Constant')) desttype = desttype.substring(8);
+ this._sb.appendLine(`${srctype}`);
+ this._sb.appendLine(`${desttype}`);
+ this._sb.appendLine('');
+ } else if (op instanceof Move) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(`${op.cardinality}`);
+ this._sb.appendLine('');
+ } else if (op instanceof S_Move) {
+ this._sb.appendLine(``);
+ } else if (op instanceof Not) {
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ } else if (op instanceof BaseCoil) {
+ const coil = op as BaseCoil;
+ if (coil.negated) {
+ this._sb.appendLine(``);
+ this._sb.appendLine('\t');
+ this._sb.appendLine('');
+ } else {
+ this._sb.appendLine(``);
+ }
+ } else if (op instanceof And || op instanceof Or) {
+ // nothing
+ } else if (op instanceof SystemFunctionBlockCall) {
+ const fc = op as SystemFunctionBlockCall;
+ this._sb.appendLine(``);
+ if (fc.additionalInnerXml !== null) this._sb.appendLine(fc.additionalInnerXml);
+
+ const fb = op as FunctionBlockCall;
+
+ if (fb.instanceName.startsWith('"')) {
+ this._sb.appendLine(``);
+ this._currentId++;
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ } else {
+ this._sb.appendLine(``);
+ this._currentId++;
+
+ for (const part of fb.instanceName.split('.')) {
+ const idx = part.indexOf('[') + 1;
+ if (idx > 0) {
+ this._sb.appendLine(``);
+ const arrays = part.substring(idx, part.length - 1);
+
+ if (arrays.includes('"')) {
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ } else {
+ for (const arr of arrays.split(',')) {
+ this._sb.appendLine(``);
+ this._currentId++;
+ this._sb.appendLine('');
+ this._sb.appendLine('DInt');
+ this._sb.appendLine(`${arr}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ }
+ }
+ } else {
+ this._sb.appendLine(``);
+ }
+ this._sb.appendLine('');
+ }
+ this._sb.appendLine('');
+ }
+ if (fc.templateValueName !== null) {
+ this._sb.appendLine(`${fc.templateValue}`);
+ if (fc.safetyTemplateString !== null && tryGetParent(fc, CodeBlock)?.safety === true) {
+ this._sb.appendLine(fc.safetyTemplateString);
+ }
+ }
+
+ if (this._block.safety && fc.additionalSafetyTemplateValues !== null) {
+ this._sb.appendLine(fc.additionalSafetyTemplateValues);
+ }
+ this._sb.appendLine('');
+ } else if (op instanceof SystemFunctionCall) {
+ const fc = op as FunctionCall;
+
+ if (fc.functionName === 'Serialize' || fc.functionName === 'Deserialize') {
+ this._sb.appendLine(``);
+ } else {
+ this._sb.appendLine(``);
+ }
+ if (fc.additionalInnerXml !== null) this._sb.appendLine(fc.additionalInnerXml);
+
+ if (fc instanceof ArithmeticCall) {
+ if (fc instanceof VariableArithmeticCall) {
+ this._sb.appendLine(`${fc.children.length - 1}`);
+ }
+ this._sb.appendLine(`${fc.type}`);
+ } else if (fc instanceof InRangeCall || fc instanceof OutRangeCall) {
+ let srctype = (op.children[0] as Signal).signalType.toString();
+ if (srctype.startsWith('Constant')) srctype = srctype.substring(8);
+ this._sb.appendLine(`${srctype}`);
+ } else if (fc.functionName === 'DPRD_DAT' || fc.functionName === 'DPWR_DAT') {
+ this._sb.appendLine('Variant');
+ this._sb.appendLine('HW_IO');
+ }
+ this._sb.appendLine('');
+ } else if (op instanceof FunctionCall) {
+ const fc = op as FunctionCall;
+
+ if (op instanceof AckGlCall) {
+ this._sb.appendLine(``);
+ } else if (op instanceof FunctionBlockCall) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ } else {
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ }
+
+ if (op instanceof FunctionBlockCall) {
+ const fb = op as FunctionBlockCall;
+
+ if (fb.instanceName.startsWith('"')) {
+ this._sb.appendLine(``);
+ } else {
+ this._sb.appendLine(``);
+ }
+ this._currentId++;
+
+ for (const part of fb.instanceName.split('.')) {
+ let instanceNamePart: string;
+ if (part.startsWith('"')) {
+ instanceNamePart = part.replace(/"/g, '');
+ } else {
+ instanceNamePart = part;
+ }
+
+ const idx = instanceNamePart.indexOf('[') + 1;
+ if (idx > 0) {
+ this._sb.appendLine(``);
+ const arrays = instanceNamePart.substring(idx, instanceNamePart.length - 1);
+
+ if (arrays.includes('"')) {
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ } else {
+ for (const arr of arrays.split(',')) {
+ this._sb.appendLine(``);
+ this._currentId++;
+ this._sb.appendLine('');
+ this._sb.appendLine('DInt');
+ this._sb.appendLine(`${arr}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ }
+ }
+ } else {
+ this._sb.appendLine(``);
+ }
+ this._sb.appendLine('');
+ }
+ this._sb.appendLine('');
+ }
+
+ if (op instanceof AckGlCall) {
+ this._sb.appendLine('1');
+ this._sb.appendLine('0');
+ this._sb.appendLine('DInt');
+ this._sb.appendLine('');
+ } else {
+ for (const [key, intf] of Object.entries(fc.iface)) {
+ if (intf.direction !== 'Eno') {
+ let type = 'Bool';
+ if (intf.operationOrSignal instanceof Signal) {
+ const sig = intf.operationOrSignal as Signal;
+ if (sig.signalType === 'Custom') {
+ type = sig.customType ?? 'Bool';
+ } else {
+ type = sig.signalType.toString();
+ }
+ }
+ if (type !== 'Constant' && type.startsWith('Constant')) {
+ type = type.substring(8);
+ }
+ type = intf.type !== null ? intf.type.toString() : type;
+ if (intf.length > 0) {
+ this._sb.appendLine(``);
+ } else {
+ this._sb.appendLine(``);
+ }
+ }
+ }
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ }
+ }
+ }
+ }
+
+ private static readonly debug: string | null = null;
+
+ private addWires(op: IOperationOrSignal): void {
+ if (op.children !== null) {
+ for (const lop of op.children) {
+ this.addWires(lop);
+ }
+ }
+
+ if (op instanceof FunctionCall) {
+ const fc = op as FunctionCall;
+ for (const [key, intf] of Object.entries(fc.iface)) {
+ const sng = intf.operationOrSignal;
+ if (fc instanceof ArithmeticCall && sng === null) {
+ // skip
+ } else if (sng === null) {
+ this._sb.appendLine(``);
+ this._currentId++;
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ this._currentId++;
+ this._sb.appendLine('');
+ } else if (intf.direction === 'Input' || intf.direction === 'InOut') {
+ this._sb.appendLine(``);
+ if (sng instanceof Signal) {
+ this._sb.appendLine(` `);
+ } else {
+ if (sng instanceof Or) {
+ this._sb.appendLine(``);
+ } else {
+ this._sb.appendLine(``);
+ }
+ }
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ this._currentId++;
+ } else if (intf.direction === 'Eno') {
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+ this._currentId++;
+ } else {
+ this._sb.appendLine(``);
+ this._sb.appendLine(``);
+ if (sng instanceof Distributor) {
+ this._sb.appendLine('');
+ for (const c of (sng as Distributor).children) {
+ if (c instanceof Signal) {
+ this._sb.appendLine(` `);
+ } else if (c instanceof And && c.children.length > 0 && c.children[0] instanceof Or) {
+ for (const chIn of c.children[0].children) {
+ for (const ch of this.getAllOrSignals(chIn)) {
+ const inName = ch instanceof FunctionCall
+ ? ((ch instanceof InRangeCall || ch instanceof OutRangeCall) ? 'pre' : 'en')
+ : 'in';
+ this._sb.appendLine(``);
+ }
+ }
+ } else {
+ const inName = c instanceof FunctionCall
+ ? ((c instanceof InRangeCall || c instanceof OutRangeCall) ? 'pre' : 'en')
+ : 'in';
+ this._sb.appendLine(``);
+ }
+ }
+ } else {
+ if (sng instanceof Signal) {
+ this._sb.appendLine(` `);
+ } else {
+ const inName = sng instanceof FunctionCall
+ ? ((sng instanceof InRangeCall || sng instanceof OutRangeCall) ? 'pre' : 'en')
+ : 'in';
+ this._sb.appendLine(``);
+ }
+ }
+ this._sb.appendLine('');
+ this._currentId++;
+ }
+ }
+ } else if (
+ op instanceof Signal &&
+ !(op.parent instanceof FunctionCall) &&
+ !(op.parent instanceof CompareOperator) &&
+ !(op.parent instanceof Move) &&
+ !(op.parent instanceof Convert) &&
+ !(op.parent instanceof S_Move)
+ ) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+
+ let tname = 'operand';
+ if (op.parent instanceof BaseNPCoil) tname = 'bit';
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ } else if (op instanceof Or && op.children.length > 1) {
+ let orInputCounter = 1;
+ const importChildOrs = (childOr: Or): void => {
+ for (const ch of childOr.children) {
+ if (ch.children.length > 0 && ch.children[ch.children.length - 1] instanceof Or) {
+ importChildOrs(ch.children[ch.children.length - 1] as Or);
+ } else {
+ this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ orInputCounter++;
+ this._currentId++;
+ }
+ }
+ };
+ if (!op.doNotCreateContact) {
+ importChildOrs(op);
+ }
+ } else if (op instanceof CompareOperator) {
+ let i = 1;
+ for (const ch of op.children) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ i++;
+ this._currentId++;
+ }
+ } else if (op instanceof Move || op instanceof S_Move || op instanceof Convert) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ if (op instanceof S_Move) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ } else if (op instanceof Convert) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ } else {
+ for (let n = 0; n < op.children.length - 1; n++) {
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ }
+ }
+ } else if (op instanceof And) {
+ for (let n = 0; n < op.children.length - 1; n++) {
+ const ch = op.children[n];
+ const next = op.children[n + 1];
+ if (next instanceof Or) {
+ this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`);
+ this._sb.appendLine(`${ch instanceof Signal ? ' ' : ''}`);
+ for (const orSignal of next.children) {
+ for (const os of this.getAllOrSignals(orSignal)) {
+ const opId = os.operationId;
+ let ipName = 'in';
+ if (
+ os instanceof BaseOperationOrSignal &&
+ (
+ (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof CompareOperator ||
+ (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof InRangeCall ||
+ (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof OutRangeCall
+ )
+ ) {
+ ipName = 'pre';
+ }
+ this._sb.appendLine(`${os instanceof Signal ? ' ' : ''}`);
+ }
+ }
+ this._sb.appendLine('');
+ this._currentId++;
+ } else {
+ this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`);
+ let outName = 'out';
+ if (ch instanceof FunctionCall || ch instanceof S_Move || ch instanceof Move || ch instanceof Convert)
+ outName = 'eno';
+
+ const srcName = ch instanceof Signal ? (ch as Signal).name : ch.constructor.name;
+ const dstName = next instanceof Signal ? (next as Signal).name : next.constructor.name;
+ this._sb.appendLine(` `);
+
+ if (next instanceof CompareOperator || next instanceof InRangeCall || next instanceof OutRangeCall) {
+ this._sb.appendLine(` `);
+ } else if (next instanceof CTUCall || next instanceof CTUDCall) {
+ this._sb.appendLine(` `);
+ } else if (next instanceof FunctionCall) {
+ const noEnName = (next as FunctionCall).hasNoEn ? 'in' : 'en';
+ this._sb.appendLine(` `);
+ } else if (this.isIFunctionOperation(next)) {
+ this._sb.appendLine(` `);
+ } else if (next instanceof Distributor) {
+ this._sb.appendLine('');
+ for (const c of next.children) {
+ let akC: IOperationOrSignal = c;
+ if (c instanceof BaseCoil && c.children.length > 0) {
+ akC = c.children[c.children.length - 1];
+ } else if (c instanceof And && c.children.length > 0) {
+ akC = c.children[0];
+ }
+
+ let l: IOperationOrSignal[] = [akC];
+ if (akC instanceof Or) l = akC.children;
+
+ for (const sIn of l) {
+ for (const s of this.getAllOrSignals(sIn)) {
+ if (s instanceof CompareOperator || s instanceof InRangeCall || s instanceof OutRangeCall) {
+ this._sb.appendLine(` `);
+ } else if (s instanceof FunctionCall) {
+ const noEnName2 = (s as FunctionCall).hasNoEn ? 'in' : 'en';
+ this._sb.appendLine(` `);
+ } else if (this.isIFunctionOperation(s)) {
+ this._sb.appendLine(` `);
+ } else {
+ this._sb.appendLine(` `);
+ }
+ }
+ }
+ }
+ } else {
+ this._sb.appendLine(` `);
+ }
+ this._sb.appendLine('');
+ this._currentId++;
+ }
+ }
+ } else if (op instanceof BaseCoil) {
+ if (op.children.length > 1) {
+ let ch: IOperationOrSignal;
+ if (op.children[1] instanceof Signal) {
+ ch = op.children[1];
+ } else {
+ ch = op.children[1].children[op.children[1].children.length - 1];
+ }
+
+ if (
+ op.children[1] instanceof Or ||
+ op.children[1] instanceof CompareOperator ||
+ op.children[1] instanceof Move ||
+ op.children[1] instanceof Convert ||
+ op.children[1] instanceof S_Move ||
+ op.children[1] instanceof BaseCoil
+ ) {
+ ch = op.children[op.children.length - 1];
+ }
+ const sig = op.children[0];
+
+ let outName = 'out';
+ if (ch instanceof FunctionCall || ch instanceof Move || ch instanceof S_Move || ch instanceof Convert)
+ outName = 'eno';
+
+ this._sb.appendLine(``);
+ this._sb.appendLine(` `);
+ this._sb.appendLine(` `);
+ this._sb.appendLine('');
+ this._currentId++;
+ }
+ }
+ }
+
+ private addPowerrails(network: Network): void {
+ const ops = KopCodeHelper.flattenOrdered(network.children, x => x.children);
+ this._sb.appendLine(``);
+ this._sb.appendLine('');
+
+ for (const s of ops) {
+ let noPowerRail = false;
+ let p: IOperationOrSignal = s;
+
+ if (s instanceof FunctionCall) {
+ while (p.parent !== null) {
+ const pp = p.parent;
+ if (
+ pp instanceof And ||
+ pp instanceof CompareOperator ||
+ pp instanceof Convert ||
+ pp instanceof Move ||
+ pp instanceof S_Move
+ ) {
+ if (pp.children.indexOf(p) > 0) noPowerRail = true;
+ }
+ p = p.parent;
+ if (noPowerRail) break;
+ }
+ if (!noPowerRail) {
+ if (s instanceof InRangeCall || s instanceof OutRangeCall) {
+ this._sb.appendLine(` `);
+ } else {
+ this._sb.appendLine(` `);
+ }
+ }
+ noPowerRail = true;
+ } else if (s.parent instanceof FunctionCall) {
+ noPowerRail = true;
+ } else if (s.parent instanceof BaseCoil && s.parent.children.indexOf(p) === 0) {
+ noPowerRail = true;
+ } else if (
+ (s instanceof Coil || s instanceof SCoil || s instanceof RCoil) &&
+ s.children.length === 1 &&
+ s.children[0] instanceof Signal &&
+ (s.parent === null || s.parent instanceof Network)
+ ) {
+ this._sb.appendLine(` `);
+ } else if (s instanceof Signal) {
+ if (p.parent instanceof FunctionCall) {
+ noPowerRail = true;
+ } else {
+ while (p.parent !== null) {
+ const pp = p.parent;
+ if (
+ pp instanceof And ||
+ pp instanceof CompareOperator ||
+ pp instanceof Convert ||
+ pp instanceof Move ||
+ pp instanceof S_Move
+ ) {
+ if (pp.children.indexOf(p) > 0) noPowerRail = true;
+ } else if (pp instanceof FunctionCall) {
+ break;
+ }
+ p = p.parent;
+ if (noPowerRail) break;
+ }
+ }
+ }
+
+ if (!noPowerRail && s instanceof Signal) {
+ const sng = s as Signal;
+ const par = s.parent;
+
+ if (par instanceof CompareOperator) {
+ this._sb.appendLine(` `);
+ } else if (par instanceof Move || par instanceof S_Move || par instanceof Convert) {
+ this._sb.appendLine(` `);
+ } else {
+ this._sb.appendLine(` `);
+ }
+ }
+ }
+ this._sb.appendLine('');
+ this._currentId++;
+ }
+
+ private fixChildAndsAndSingleOr(s: IOperationOrSignal | null): void {
+ let fixAgain = false;
+ const newChildren: IOperationOrSignal[] = [];
+ if (s !== null && s.children !== null) {
+ if (s instanceof BaseCoil && s.children.length === 2 && s.children[1] instanceof Signal) {
+ s.children[1] = new And(s.children[1]);
+ } else {
+ for (const op of s.children.slice()) {
+ if ((s instanceof And || s instanceof Or) && op instanceof Or && op.children.length === 1) {
+ for (const p of op.children) {
+ newChildren.push(p);
+ fixAgain = true;
+ }
+ } else if (s instanceof And && op instanceof And) {
+ for (const p of op.children) {
+ newChildren.push(p);
+ s.children.push(p);
+ fixAgain = true;
+ }
+ } else {
+ newChildren.push(op);
+ this.fixChildAndsAndSingleOr(op);
+ }
+ }
+ s.children = newChildren;
+ if (fixAgain) this.fixChildAndsAndSingleOr(s);
+ }
+ }
+ }
+
+ private escapeForXml(text: string): string {
+ return text.replace(//g, '>');
+ }
+
+ private printTreeParent(signal: IOperationOrSignal | null): string {
+ if (signal !== null) {
+ let t = '';
+ if (signal instanceof Signal) t = ` (${(signal as Signal).name})`;
+ if (signal instanceof Coil) t = ` (${(signal as Coil).signal.name})`;
+ if (signal instanceof Network) t = ` (${(signal as Network).networkTitle ?? ''})`;
+ if (signal instanceof CodeBlock) t = ` (${(signal as CodeBlock).name ?? ''})`;
+ const p = this.printTreeParent(signal.parent);
+ return (p !== '' ? p + ' -> ' : '') + signal.constructor.name + t;
+ }
+ return '';
+ }
+
+ private setParent(s: IOperationOrSignal): void {
+ for (const op of s.children) {
+ if (op.parent !== null) {
+ throw new Error(
+ '\n\nIOperationOrSignal reused wich is not valid!\n' +
+ this.printTreeParent(op.parent) + '\n\n' +
+ this.printTreeParent(s) + '\n\n'
+ );
+ }
+ op.parent = s;
+ this.setParent(op);
+ }
+ }
+
+ getXml(idRef: { value: number }): string {
+ this.fixChildAndsAndSingleOr(this._block);
+ this.setParent(this._block);
+ const allChildren = flatten(this._block.children, x => x.children);
+ const networks = allChildren.filter((x): x is Network => x instanceof Network);
+
+ for (const network of networks) {
+ this.checkAndAndOr(this._block, network);
+ try {
+ this._sb.appendLine(` `);
+ idRef.value++;
+ this._sb.appendLine('');
+ if (network.children.length > 0) {
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this.addSignalDefinitions(network);
+ this.addContactDefinitions(network, this._block);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this.addPowerrails(network);
+ this.addWires(network);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ }
+ this._sb.appendLine(`${this._block.safety ? 'F_LAD' : 'LAD'}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine('de-DE');
+ this._sb.appendLine(`${network.description ?? ''}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine('en-GB');
+ this._sb.appendLine(`${network.descriptionEnglish ?? ''}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine('de-DE');
+ this._sb.appendLine(`${this.escapeForXml(network.networkTitle ?? '')}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine(``);
+ idRef.value++;
+ this._sb.appendLine('');
+ this._sb.appendLine('en-GB');
+ this._sb.appendLine(`${this.escapeForXml(network.networkTitleEnglish ?? '')}`);
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ this._sb.appendLine('');
+ } catch (ex) {
+ throw new Error(`Error generating Network: ${network.networkTitle} in Block: ${this._block.name}\n${(ex as Error).message}`);
+ }
+ }
+
+ return this._sb.toString();
+ }
+
+ getAllOrSignals(sng: IOperationOrSignal): IOperationOrSignal[] {
+ const result: IOperationOrSignal[] = [];
+ if (sng instanceof And) {
+ if (sng.children.length > 0 && sng.children[0] instanceof Or) {
+ const or = sng.children[0] as Or;
+ for (const o of or.children) {
+ result.push(...this.getAllOrSignals(o));
+ }
+ } else {
+ result.push(sng.children[0]);
+ }
+ } else {
+ result.push(sng);
+ }
+ return result;
+ }
+
+ private isIPartName(op: IOperationOrSignal): boolean {
+ return 'partName' in op && typeof (op as any).partName === 'string';
+ }
+
+ private isIFunctionOperation(op: IOperationOrSignal): boolean {
+ // Check if op implements IFunctionOperation (Move, Convert, S_Move)
+ return op instanceof Move || op instanceof Convert || op instanceof S_Move;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/And.ts b/TiaCodegen-ts/src/Commands/And.ts
new file mode 100644
index 0000000..bbc412d
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/And.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class And extends BaseOperationOrSignal {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts b/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts
new file mode 100644
index 0000000..11b776f
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts
@@ -0,0 +1,67 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+
+export abstract class BaseOperationOrSignal implements IOperationOrSignal {
+ debugInfo: string | null = null;
+ private _operationId: number = 0;
+ children: IOperationOrSignal[];
+ parent: IOperationOrSignal | null = null;
+ doNotCreateContact: boolean = false;
+ private _cardinality: number = 0;
+
+ get cardinality(): number { return this._cardinality; }
+ set cardinality(value: number) { this._cardinality = value; }
+
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ this.children = [];
+ if (operationOrSignals) {
+ this.children.push(...operationOrSignals);
+ }
+ }
+
+ get operationId(): number { return this._operationId; }
+ set operationId(value: number) { this._operationId = value; }
+
+ createContactAndFillCardinality(parent: IOperationOrSignal): number {
+ this.cardinality = 1;
+ const lastChild = this.children[this.children.length - 1];
+ if (this.children.length > 0 && lastChild.constructor.name === 'Or') {
+ this.cardinality = lastChild.createContactAndFillCardinality(parent);
+ lastChild.doNotCreateContact = true;
+ }
+ return this.cardinality;
+ }
+
+ add(...operationOrSignals: IOperationOrSignal[]): void {
+ this.children.push(...operationOrSignals);
+ }
+
+ toString(): string {
+ const name = this.constructor.name;
+ if (name === 'And' || name === 'Or') {
+ return `${name} (${this.children.map(x => x.toString()).join(',')})`;
+ }
+ return name;
+ }
+
+ getFirstChildNotAnd(): IOperationOrSignal {
+ if (this.constructor.name === 'And') {
+ const ch1 = this.children[0];
+ if (ch1 instanceof BaseOperationOrSignal) {
+ return ch1.getFirstChildNotAnd();
+ }
+ }
+ return this;
+ }
+
+ clone(): IOperationOrSignal {
+ // Subclasses that need cloning should override this.
+ // Generic approach: create a new instance of the same class.
+ const inst = new (this.constructor as new () => BaseOperationOrSignal)();
+ inst.debugInfo = this.debugInfo;
+ inst.doNotCreateContact = this.doNotCreateContact;
+ for (const c of this.children) {
+ inst.children.push(c.clone());
+ }
+ return inst;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts b/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts
new file mode 100644
index 0000000..2a6e13a
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts
@@ -0,0 +1,42 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { ICoil } from '../../Interfaces/ICoil.js';
+import { Signal } from '../Signals/Signal.js';
+
+export class BaseCoil implements IOperationOrSignal, ICoil {
+ debugInfo: string | null = null;
+ negated: boolean = false;
+ signal: Signal;
+ children: IOperationOrSignal[];
+ operationId: number = 0;
+ parent: IOperationOrSignal | null = null;
+ doNotCreateContact: boolean = false;
+ cardinality: number = 0;
+
+ constructor(signal: Signal, op: IOperationOrSignal | null = null) {
+ this.signal = signal;
+ this.children = [];
+ this.children.push(signal);
+ if (op !== null) {
+ this.children.push(op);
+ }
+ }
+
+ createContactAndFillCardinality(_parent: IOperationOrSignal): number {
+ this.cardinality = 1;
+ return 1;
+ }
+
+ toString(): string {
+ return this.constructor.name;
+ }
+
+ clone(): IOperationOrSignal {
+ const inst = new (this.constructor as new (s: Signal) => BaseCoil)(this.signal.clone() as Signal);
+ inst.debugInfo = this.debugInfo;
+ inst.negated = this.negated;
+ for (const c of this.children.slice(1)) {
+ inst.children.push(c.clone());
+ }
+ return inst;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts b/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts
new file mode 100644
index 0000000..d9c09fb
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts
@@ -0,0 +1,15 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { Signal } from '../Signals/Signal.js';
+import { BaseCoil } from './BaseCoil.js';
+
+export class BaseNPCoil extends BaseCoil {
+ helpSignal: Signal | null;
+
+ constructor(signal: Signal, helpSignal: Signal | null, op: IOperationOrSignal | null = null) {
+ super(signal, op);
+ this.helpSignal = helpSignal;
+ if (helpSignal !== null) {
+ this.children.push(helpSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/Coil.ts b/TiaCodegen-ts/src/Commands/Coils/Coil.ts
new file mode 100644
index 0000000..8190377
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/Coil.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { Signal } from '../Signals/Signal.js';
+import { BaseCoil } from './BaseCoil.js';
+
+export class Coil extends BaseCoil {
+ constructor(signal: Signal, op: IOperationOrSignal | null = null) {
+ super(signal, op);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/PCoil.ts b/TiaCodegen-ts/src/Commands/Coils/PCoil.ts
new file mode 100644
index 0000000..4c1744b
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/PCoil.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { Signal } from '../Signals/Signal.js';
+import { BaseNPCoil } from './BaseNPCoil.js';
+
+export class PCoil extends BaseNPCoil {
+ constructor(signal: Signal, helpSignal: Signal, op: IOperationOrSignal | null = null) {
+ super(signal, helpSignal, op);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/RCoil.ts b/TiaCodegen-ts/src/Commands/Coils/RCoil.ts
new file mode 100644
index 0000000..8c29bf9
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/RCoil.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { Signal } from '../Signals/Signal.js';
+import { BaseCoil } from './BaseCoil.js';
+
+export class RCoil extends BaseCoil {
+ constructor(signal: Signal, op: IOperationOrSignal | null = null) {
+ super(signal, op);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Coils/SCoil.ts b/TiaCodegen-ts/src/Commands/Coils/SCoil.ts
new file mode 100644
index 0000000..5569f14
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Coils/SCoil.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { Signal } from '../Signals/Signal.js';
+import { BaseCoil } from './BaseCoil.js';
+
+export class SCoil extends BaseCoil {
+ constructor(signal: Signal, op: IOperationOrSignal | null = null) {
+ super(signal, op);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts b/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts
new file mode 100644
index 0000000..49a501a
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { BaseOperationOrSignal } from '../BaseOperationOrSignal.js';
+
+export abstract class CompareOperator extends BaseOperationOrSignal {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts b/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts
new file mode 100644
index 0000000..c2c08fb
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Eq extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts b/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts
new file mode 100644
index 0000000..5f03313
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Ge extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts b/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts
new file mode 100644
index 0000000..8bc983c
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Gt extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts
new file mode 100644
index 0000000..ea69e86
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts
@@ -0,0 +1,25 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionCall } from '../Functions/Base/SystemFunctionCall.js';
+
+export class InRangeCall extends SystemFunctionCall {
+ constructor(
+ min: IOperationOrSignal,
+ inParam: IOperationOrSignal,
+ max: IOperationOrSignal,
+ out: IOperationOrSignal,
+ eno: IOperationOrSignal | null = null,
+ ) {
+ super({ functionName: 'InRange', eno });
+ this.disableEno = false;
+ this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
+ this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input);
+ this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Input);
+ this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Le.ts b/TiaCodegen-ts/src/Commands/Comparisons/Le.ts
new file mode 100644
index 0000000..ed9c420
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Le.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Le extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts b/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts
new file mode 100644
index 0000000..d06b850
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Lt extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts b/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts
new file mode 100644
index 0000000..61b08d8
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts
@@ -0,0 +1,8 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { CompareOperator } from './CompareOperator.js';
+
+export class Ne extends CompareOperator {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts
new file mode 100644
index 0000000..9c683e7
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts
@@ -0,0 +1,25 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionCall } from '../Functions/Base/SystemFunctionCall.js';
+
+export class OutRangeCall extends SystemFunctionCall {
+ constructor(
+ min: IOperationOrSignal,
+ inParam: IOperationOrSignal,
+ max: IOperationOrSignal,
+ out: IOperationOrSignal,
+ eno: IOperationOrSignal | null = null,
+ ) {
+ super({ functionName: 'OutRange', eno });
+ this.disableEno = false;
+ this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
+ this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input);
+ this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Input);
+ this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Convert.ts b/TiaCodegen-ts/src/Commands/Convert.ts
new file mode 100644
index 0000000..ebbfe3c
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Convert.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { IFunctionOperation } from '../Interfaces/IFunctionOperation.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class Convert extends BaseOperationOrSignal implements IFunctionOperation {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Distributor.ts b/TiaCodegen-ts/src/Commands/Distributor.ts
new file mode 100644
index 0000000..4c30820
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Distributor.ts
@@ -0,0 +1,18 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class Distributor extends BaseOperationOrSignal {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+
+ createContactAndFillCardinality(parent: IOperationOrSignal): number {
+ let c = 0;
+ this.operationId = parent.operationId;
+ for (const op of this.children) {
+ c += op.createContactAndFillCardinality(this);
+ }
+ this.cardinality = c;
+ return this.cardinality;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts b/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts
new file mode 100644
index 0000000..263b69c
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts
@@ -0,0 +1,28 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface AckGlCallOptions {
+ instanceName: string;
+ ackGlob?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class AckGlCall extends SystemFunctionBlockCall {
+ constructor(options: AckGlCallOptions) {
+ const { instanceName, ackGlob = null, eno = null } = options;
+ super({ functionName: 'ACK_GL', instanceName, eno });
+ this.iface['ACK_GLOB'] = new IOperationOrSignalDirectionWrapper(ackGlob, Direction.Input);
+
+ this.additionalSafetyTemplateValues = `
+1
+0
+DInt
+`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts
new file mode 100644
index 0000000..adb341d
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts
@@ -0,0 +1,79 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { VariableArithmeticCall } from './VariableArithmeticCall.js';
+import { numericType } from './ArithmeticCall.js';
+
+export interface AddCallOptions {
+ type: numericType;
+ in1: IOperationOrSignal;
+ in2: IOperationOrSignal;
+ in3?: IOperationOrSignal | null;
+ in4?: IOperationOrSignal | null;
+ in5?: IOperationOrSignal | null;
+ in6?: IOperationOrSignal | null;
+ in7?: IOperationOrSignal | null;
+ in8?: IOperationOrSignal | null;
+ in9?: IOperationOrSignal | null;
+ in10?: IOperationOrSignal | null;
+ in11?: IOperationOrSignal | null;
+ in12?: IOperationOrSignal | null;
+ in13?: IOperationOrSignal | null;
+ in14?: IOperationOrSignal | null;
+ in15?: IOperationOrSignal | null;
+ in16?: IOperationOrSignal | null;
+ in17?: IOperationOrSignal | null;
+ in18?: IOperationOrSignal | null;
+ in19?: IOperationOrSignal | null;
+ in20?: IOperationOrSignal | null;
+ in21?: IOperationOrSignal | null;
+ in22?: IOperationOrSignal | null;
+ in23?: IOperationOrSignal | null;
+ in24?: IOperationOrSignal | null;
+ in25?: IOperationOrSignal | null;
+ in26?: IOperationOrSignal | null;
+ in27?: IOperationOrSignal | null;
+ in28?: IOperationOrSignal | null;
+ in29?: IOperationOrSignal | null;
+ in30?: IOperationOrSignal | null;
+ in31?: IOperationOrSignal | null;
+ in32?: IOperationOrSignal | null;
+ in33?: IOperationOrSignal | null;
+ in34?: IOperationOrSignal | null;
+ in35?: IOperationOrSignal | null;
+ in36?: IOperationOrSignal | null;
+ in37?: IOperationOrSignal | null;
+ in38?: IOperationOrSignal | null;
+ in39?: IOperationOrSignal | null;
+ in40?: IOperationOrSignal | null;
+ in41?: IOperationOrSignal | null;
+ in42?: IOperationOrSignal | null;
+ in43?: IOperationOrSignal | null;
+ in44?: IOperationOrSignal | null;
+ in45?: IOperationOrSignal | null;
+ in46?: IOperationOrSignal | null;
+ in47?: IOperationOrSignal | null;
+ in48?: IOperationOrSignal | null;
+ in49?: IOperationOrSignal | null;
+ in50?: IOperationOrSignal | null;
+ out1?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class AddCall extends VariableArithmeticCall {
+ constructor(options: AddCallOptions) {
+ const { type, in1, in2, out1 = null, eno = null } = options;
+ super({ functionName: 'Add', eno });
+ this.disableEno = true;
+ this.type = type;
+ this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
+ this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
+ //@ts-ignore
+ this.addVariableInputs(options, 3, 50);
+ this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts
new file mode 100644
index 0000000..31ddf06
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts
@@ -0,0 +1,13 @@
+import { SystemFunctionCall, SystemFunctionCallOptions } from '../Base/SystemFunctionCall.js';
+
+export interface ArithmeticCallOptions extends SystemFunctionCallOptions { }
+
+export type numericType = "Int" | "DInt" | "LInt" | "UInt" | "UDInt" | "ULInt" | "Real";
+
+export abstract class ArithmeticCall extends SystemFunctionCall {
+ type?: numericType = 'Int';
+
+ constructor(options: ArithmeticCallOptions) {
+ super(options);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts
new file mode 100644
index 0000000..d331cf5
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts
@@ -0,0 +1,28 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { ArithmeticCall, numericType } from './ArithmeticCall.js';
+
+export interface DivCallOptions {
+ type: numericType;
+ in1: IOperationOrSignal;
+ in2: IOperationOrSignal;
+ out1?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class DivCall extends ArithmeticCall {
+ constructor(options: DivCallOptions) {
+ const { type, in1, in2, out1 = null, eno = null } = options;
+ super({ functionName: 'Div', eno });
+ this.disableEno = true;
+ this.type = type;
+ this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
+ this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
+ this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts
new file mode 100644
index 0000000..1575d1b
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts
@@ -0,0 +1,28 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { ArithmeticCall, numericType } from './ArithmeticCall.js';
+
+export interface ModCallOptions {
+ type: numericType;
+ in1: IOperationOrSignal;
+ in2: IOperationOrSignal;
+ out1?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class ModCall extends ArithmeticCall {
+ constructor(options: ModCallOptions) {
+ const { type, in1, in2, out1 = null, eno = null } = options;
+ super({ functionName: 'Mod', eno });
+ this.disableEno = true;
+ this.type = type;
+ this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
+ this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
+ this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts
new file mode 100644
index 0000000..e992a87
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts
@@ -0,0 +1,79 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { VariableArithmeticCall } from './VariableArithmeticCall.js';
+import { numericType } from './ArithmeticCall.js';
+
+export interface MulCallOptions {
+ type: numericType;
+ in1: IOperationOrSignal;
+ in2: IOperationOrSignal;
+ in3?: IOperationOrSignal | null;
+ in4?: IOperationOrSignal | null;
+ in5?: IOperationOrSignal | null;
+ in6?: IOperationOrSignal | null;
+ in7?: IOperationOrSignal | null;
+ in8?: IOperationOrSignal | null;
+ in9?: IOperationOrSignal | null;
+ in10?: IOperationOrSignal | null;
+ in11?: IOperationOrSignal | null;
+ in12?: IOperationOrSignal | null;
+ in13?: IOperationOrSignal | null;
+ in14?: IOperationOrSignal | null;
+ in15?: IOperationOrSignal | null;
+ in16?: IOperationOrSignal | null;
+ in17?: IOperationOrSignal | null;
+ in18?: IOperationOrSignal | null;
+ in19?: IOperationOrSignal | null;
+ in20?: IOperationOrSignal | null;
+ in21?: IOperationOrSignal | null;
+ in22?: IOperationOrSignal | null;
+ in23?: IOperationOrSignal | null;
+ in24?: IOperationOrSignal | null;
+ in25?: IOperationOrSignal | null;
+ in26?: IOperationOrSignal | null;
+ in27?: IOperationOrSignal | null;
+ in28?: IOperationOrSignal | null;
+ in29?: IOperationOrSignal | null;
+ in30?: IOperationOrSignal | null;
+ in31?: IOperationOrSignal | null;
+ in32?: IOperationOrSignal | null;
+ in33?: IOperationOrSignal | null;
+ in34?: IOperationOrSignal | null;
+ in35?: IOperationOrSignal | null;
+ in36?: IOperationOrSignal | null;
+ in37?: IOperationOrSignal | null;
+ in38?: IOperationOrSignal | null;
+ in39?: IOperationOrSignal | null;
+ in40?: IOperationOrSignal | null;
+ in41?: IOperationOrSignal | null;
+ in42?: IOperationOrSignal | null;
+ in43?: IOperationOrSignal | null;
+ in44?: IOperationOrSignal | null;
+ in45?: IOperationOrSignal | null;
+ in46?: IOperationOrSignal | null;
+ in47?: IOperationOrSignal | null;
+ in48?: IOperationOrSignal | null;
+ in49?: IOperationOrSignal | null;
+ in50?: IOperationOrSignal | null;
+ out1?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class MulCall extends VariableArithmeticCall {
+ constructor(options: MulCallOptions) {
+ const { type, in1, in2, out1 = null, eno = null } = options;
+ super({ functionName: 'Mul', eno });
+ this.disableEno = true;
+ this.type = type;
+ this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
+ this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
+ //@ts-ignore
+ this.addVariableInputs(options, 3, 50);
+ this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts
new file mode 100644
index 0000000..2a87aa2
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts
@@ -0,0 +1,28 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { ArithmeticCall, numericType } from './ArithmeticCall.js';
+
+export interface SubCallOptions {
+ type: numericType;
+ in1: IOperationOrSignal;
+ in2: IOperationOrSignal;
+ out1?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class SubCall extends ArithmeticCall {
+ constructor(options: SubCallOptions) {
+ const { type, in1, in2, out1 = null, eno = null } = options;
+ super({ functionName: 'Sub', eno });
+ this.disableEno = true;
+ this.type = type;
+ this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
+ this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
+ this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts
new file mode 100644
index 0000000..1cd7bda
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts
@@ -0,0 +1,23 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+import { ArithmeticCall, ArithmeticCallOptions } from './ArithmeticCall.js';
+
+export interface VariableArithmeticCallOptions extends ArithmeticCallOptions { }
+
+export abstract class VariableArithmeticCall extends ArithmeticCall {
+ constructor(options: VariableArithmeticCallOptions) {
+ super(options);
+ }
+
+ protected addVariableInputs(
+ options: Record,
+ startIndex: number,
+ endIndex: number
+ ): void {
+ for (let i = startIndex; i <= endIndex; i++) {
+ const value = ((options as Record)[`in${i}`] as IOperationOrSignal | null | undefined) ?? null;
+ this.iface[`IN${i}`] = new IOperationOrSignalDirectionWrapper(value, Direction.Input);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts
new file mode 100644
index 0000000..bb09961
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts
@@ -0,0 +1,18 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { FunctionCall } from './FunctionCall.js';
+
+export interface FunctionBlockCallOptions {
+ functionName: string;
+ instanceName: string;
+ eno?: IOperationOrSignal | null;
+}
+
+export class FunctionBlockCall extends FunctionCall {
+ instanceName: string;
+
+ constructor(options: FunctionBlockCallOptions) {
+ const { functionName, instanceName, eno = null } = options;
+ super({ functionName, eno });
+ this.instanceName = instanceName;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts
new file mode 100644
index 0000000..402802b
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts
@@ -0,0 +1,51 @@
+import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../../Enums/Direction.js';
+
+export interface FunctionCallOptions {
+ functionName: string;
+ eno?: IOperationOrSignal | null;
+}
+
+export class FunctionCall implements IOperationOrSignal {
+ safetyTemplateString: string | null = null;
+ debugInfo: string | null = null;
+ disableEno: boolean = false;
+ functionName: string;
+ version: string | null = null;
+ additionalInnerXml: string | null = null;
+ /** Interface map - using plain object to preserve insertion order */
+ iface: Record;
+ additionalSafetyTemplateValues: string | null = null;
+ children: IOperationOrSignal[];
+ eno: IOperationOrSignal | null;
+ operationId: number = 0;
+ parent: IOperationOrSignal | null = null;
+ doNotCreateContact: boolean = false;
+ cardinality: number = 0;
+ hasNoEn: boolean = false;
+
+ constructor(options: FunctionCallOptions) {
+ const { functionName, eno = null } = options;
+ this.functionName = functionName;
+ this.iface = {};
+ this.children = [];
+ this.eno = eno;
+ if (eno !== null) {
+ this.iface['eno'] = new IOperationOrSignalDirectionWrapper(eno, Direction.Eno);
+ }
+ }
+
+ createContactAndFillCardinality(_parent: IOperationOrSignal): number {
+ this.cardinality = 1;
+ return this.cardinality;
+ }
+
+ toString(): string {
+ return `${this.constructor.name}(${this.functionName})`;
+ }
+
+ clone(): IOperationOrSignal {
+ throw new Error('Not yet supported');
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts
new file mode 100644
index 0000000..207e588
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts
@@ -0,0 +1,13 @@
+import { FunctionBlockCall, FunctionBlockCallOptions } from './FunctionBlockCall.js';
+
+export interface SystemFunctionBlockCallOptions extends FunctionBlockCallOptions {}
+
+export class SystemFunctionBlockCall extends FunctionBlockCall {
+ templateValueName: string | null = null;
+ templateValueType: string | null = null;
+ templateValue: string | null = null;
+
+ constructor(options: SystemFunctionBlockCallOptions) {
+ super(options);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts
new file mode 100644
index 0000000..312f773
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts
@@ -0,0 +1,9 @@
+import { FunctionCall, FunctionCallOptions } from './FunctionCall.js';
+
+export interface SystemFunctionCallOptions extends FunctionCallOptions {}
+
+export class SystemFunctionCall extends FunctionCall {
+ constructor(options: SystemFunctionCallOptions) {
+ super(options);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts b/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts
new file mode 100644
index 0000000..7293cee
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts
@@ -0,0 +1,33 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface CTUCallOptions {
+ instanceName: string;
+ r?: IOperationOrSignal | null;
+ pv?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ cv?: IOperationOrSignal | null;
+ templateValue?: string;
+}
+
+export class CTUCall extends SystemFunctionBlockCall {
+ constructor(options: CTUCallOptions) {
+ const { instanceName, r = null, pv = null, q = null, cv = null, templateValue = 'Int' } = options;
+ super({ functionName: 'CTU', instanceName });
+ this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input);
+ this.iface['PV'] = new IOperationOrSignalDirectionWrapper(pv, Direction.Input);
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['CV'] = new IOperationOrSignalDirectionWrapper(cv, Direction.Output);
+
+ this.templateValueName = 'value_type';
+ this.templateValueType = 'Type';
+ this.templateValue = templateValue;
+ this.hasNoEn = true;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts b/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts
new file mode 100644
index 0000000..5649588
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts
@@ -0,0 +1,39 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface CTUDCallOptions {
+ instanceName: string;
+ cd?: IOperationOrSignal | null;
+ r?: IOperationOrSignal | null;
+ ld?: IOperationOrSignal | null;
+ pv?: IOperationOrSignal | null;
+ qu?: IOperationOrSignal | null;
+ qd?: IOperationOrSignal | null;
+ cv?: IOperationOrSignal | null;
+ templateValue?: string;
+}
+
+export class CTUDCall extends SystemFunctionBlockCall {
+ constructor(options: CTUDCallOptions) {
+ const { instanceName, cd = null, r = null, ld = null, pv = null, qu = null, qd = null, cv = null, templateValue = 'Int' } = options;
+ super({ functionName: 'CTUD', instanceName });
+ this.iface['CD'] = new IOperationOrSignalDirectionWrapper(cd, Direction.Input);
+ this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input);
+ this.iface['LD'] = new IOperationOrSignalDirectionWrapper(ld, Direction.Input);
+ this.iface['PV'] = new IOperationOrSignalDirectionWrapper(pv, Direction.Input);
+ this.iface['QU'] = new IOperationOrSignalDirectionWrapper(qu, Direction.Output);
+ this.iface['QD'] = new IOperationOrSignalDirectionWrapper(qd, Direction.Output);
+ this.iface['CV'] = new IOperationOrSignalDirectionWrapper(cv, Direction.Output);
+
+ this.templateValueName = 'value_type';
+ this.templateValueType = 'Type';
+ this.templateValue = templateValue;
+ this.hasNoEn = true;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts b/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts
new file mode 100644
index 0000000..09bbb29
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts
@@ -0,0 +1,54 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface FDBACKCallOptions {
+ instanceName: string;
+ on?: IOperationOrSignal | null;
+ feedback?: IOperationOrSignal | null;
+ qbad_fio?: IOperationOrSignal | null;
+ ack_nec?: IOperationOrSignal | null;
+ ack?: IOperationOrSignal | null;
+ fdb_time?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ error?: IOperationOrSignal | null;
+ ack_req?: IOperationOrSignal | null;
+ diag?: IOperationOrSignal | null;
+}
+
+export class FDBACKCall extends SystemFunctionBlockCall {
+ constructor(options: FDBACKCallOptions) {
+ const {
+ instanceName,
+ on = null,
+ feedback = null,
+ qbad_fio = null,
+ ack_nec = null,
+ ack = null,
+ fdb_time = null,
+ q = null,
+ error = null,
+ ack_req = null,
+ diag = null,
+ } = options;
+ super({ functionName: 'FDBACK', instanceName });
+ this.iface['ON'] = new IOperationOrSignalDirectionWrapper(on, Direction.Input);
+ this.iface['FEEDBACK'] = new IOperationOrSignalDirectionWrapper(feedback, Direction.Input);
+ this.iface['QBAD_FIO'] = new IOperationOrSignalDirectionWrapper(qbad_fio, Direction.Input);
+ this.iface['ACK_NEC'] = new IOperationOrSignalDirectionWrapper(ack_nec, Direction.Input);
+ this.iface['ACK'] = new IOperationOrSignalDirectionWrapper(ack, Direction.Input);
+ this.iface['FDB_TIME'] = new IOperationOrSignalDirectionWrapper(fdb_time, Direction.Input);
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['ERROR'] = new IOperationOrSignalDirectionWrapper(error, Direction.Output);
+ this.iface['ACK_REQ'] = new IOperationOrSignalDirectionWrapper(ack_req, Direction.Output);
+ this.iface['DIAG'] = new IOperationOrSignalDirectionWrapper(diag, Direction.Output);
+
+ this.additionalSafetyTemplateValues = ` 1
+ 0`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts
new file mode 100644
index 0000000..39d91a3
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts
@@ -0,0 +1,24 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface FTrigCallOptions {
+ instanceName: string;
+ clk?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class FTrigCall extends SystemFunctionBlockCall {
+ constructor(options: FTrigCallOptions) {
+ const { instanceName, clk = null, q = null, eno = null } = options;
+ super({ functionName: 'F_TRIG', instanceName, eno });
+ this.iface['CLK'] = new IOperationOrSignalDirectionWrapper(clk, Direction.Input);
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts
new file mode 100644
index 0000000..c63caf8
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts
@@ -0,0 +1,17 @@
+import { Signal } from '../Signals/Signal.js';
+import { IPartName } from '../../Interfaces/IPartName.js';
+import { BaseNPCoil } from '../Coils/BaseNPCoil.js';
+
+export interface NTrigCallOptions {
+ signal: Signal;
+}
+
+export class NTrigCall extends BaseNPCoil implements IPartName {
+ partName: string;
+
+ constructor(options: NTrigCallOptions) {
+ const { signal } = options;
+ super(signal, null, null);
+ this.partName = 'NBox';
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts
new file mode 100644
index 0000000..d4e5942
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts
@@ -0,0 +1,17 @@
+import { Signal } from '../Signals/Signal.js';
+import { IPartName } from '../../Interfaces/IPartName.js';
+import { BaseNPCoil } from '../Coils/BaseNPCoil.js';
+
+export interface PTrigCallOptions {
+ signal: Signal;
+}
+
+export class PTrigCall extends BaseNPCoil implements IPartName {
+ partName: string;
+
+ constructor(options: PTrigCallOptions) {
+ const { signal } = options;
+ super(signal, null, null);
+ this.partName = 'PBox';
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts
new file mode 100644
index 0000000..eef1f34
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts
@@ -0,0 +1,24 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface RTrigCallOptions {
+ instanceName: string;
+ clk?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ eno?: IOperationOrSignal | null;
+}
+
+export class RTrigCall extends SystemFunctionBlockCall {
+ constructor(options: RTrigCallOptions) {
+ const { instanceName, clk = null, q = null, eno = null } = options;
+ super({ functionName: 'R_TRIG', instanceName, eno });
+ this.iface['CLK'] = new IOperationOrSignalDirectionWrapper(clk, Direction.Input);
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts b/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts
new file mode 100644
index 0000000..6e333e4
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts
@@ -0,0 +1,37 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface TOFCallOptions {
+ instanceName: string;
+ pt?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ et?: IOperationOrSignal | null;
+}
+
+export class TOFCall extends SystemFunctionBlockCall {
+ constructor(options: TOFCallOptions) {
+ const { instanceName, pt = null, q = null, et = null } = options;
+ super({ functionName: 'TOF', instanceName });
+ this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input);
+
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output);
+
+ this.templateValueName = 'time_type';
+ this.templateValueType = 'Type';
+ this.templateValue = 'Time';
+ this.hasNoEn = true;
+
+ this.safetyTemplateString = ` 1
+ 0
+ 0
+ 0
+ DInt`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/TONCall.ts b/TiaCodegen-ts/src/Commands/Functions/TONCall.ts
new file mode 100644
index 0000000..4184e23
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/TONCall.ts
@@ -0,0 +1,37 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface TONCallOptions {
+ instanceName: string;
+ pt?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ et?: IOperationOrSignal | null;
+}
+
+export class TONCall extends SystemFunctionBlockCall {
+ constructor(options: TONCallOptions) {
+ const { instanceName, pt = null, q = null, et = null } = options;
+ super({ functionName: 'TON', instanceName });
+ this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input);
+
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output);
+
+ this.templateValueName = 'time_type';
+ this.templateValueType = 'Type';
+ this.templateValue = 'Time';
+ this.hasNoEn = true;
+
+ this.safetyTemplateString = ` 1
+ 0
+ 0
+ 0
+ DInt`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts b/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts
new file mode 100644
index 0000000..16247d6
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts
@@ -0,0 +1,38 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface TONRCallOptions {
+ instanceName: string;
+ pt?: IOperationOrSignal | null;
+ r?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ et?: IOperationOrSignal | null;
+}
+
+export class TONRCall extends SystemFunctionBlockCall {
+ constructor(options: TONRCallOptions) {
+ const { instanceName, pt = null, r = null, q = null, et = null } = options;
+ super({ functionName: 'TONR', instanceName });
+ this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input);
+ this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input);
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output);
+
+ this.templateValueName = 'time_type';
+ this.templateValueType = 'Type';
+ this.templateValue = 'Time';
+ this.hasNoEn = true;
+
+ this.safetyTemplateString = ` 1
+ 0
+ 0
+ 0
+ DInt`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Functions/TPCall.ts b/TiaCodegen-ts/src/Commands/Functions/TPCall.ts
new file mode 100644
index 0000000..6740a11
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Functions/TPCall.ts
@@ -0,0 +1,37 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper.js';
+import { Direction } from '../../Enums/Direction.js';
+import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall.js';
+
+export interface TPCallOptions {
+ instanceName: string;
+ pt?: IOperationOrSignal | null;
+ q?: IOperationOrSignal | null;
+ et?: IOperationOrSignal | null;
+}
+
+export class TPCall extends SystemFunctionBlockCall {
+ constructor(options: TPCallOptions) {
+ const { instanceName, pt = null, q = null, et = null } = options;
+ super({ functionName: 'TP', instanceName });
+ this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input);
+
+ this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output);
+ this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output);
+
+ this.templateValueName = 'time_type';
+ this.templateValueType = 'Type';
+ this.templateValue = 'Time';
+ this.hasNoEn = true;
+
+ this.safetyTemplateString = ` 1
+ 0
+ 0
+ 0
+ DInt`;
+
+ for (const w of Object.values(this.iface)) {
+ if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal);
+ }
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Move.ts b/TiaCodegen-ts/src/Commands/Move.ts
new file mode 100644
index 0000000..177f1ba
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Move.ts
@@ -0,0 +1,16 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { IFunctionOperation } from '../Interfaces/IFunctionOperation.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class Move extends BaseOperationOrSignal implements IFunctionOperation {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+
+ get cardinality(): number {
+ return this.children.length - 1;
+ }
+ set cardinality(_value: number) {
+ // readonly via getter, ignore sets
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/NCoil.ts b/TiaCodegen-ts/src/Commands/NCoil.ts
new file mode 100644
index 0000000..c230353
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/NCoil.ts
@@ -0,0 +1,9 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { Signal } from './Signals/Signal.js';
+import { BaseNPCoil } from './Coils/BaseNPCoil.js';
+
+export class NCoil extends BaseNPCoil {
+ constructor(signal: Signal, helpSignal: Signal, op: IOperationOrSignal | null = null) {
+ super(signal, helpSignal, op);
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Not.ts b/TiaCodegen-ts/src/Commands/Not.ts
new file mode 100644
index 0000000..d623c1a
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Not.ts
@@ -0,0 +1,29 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { Signal } from './Signals/Signal.js';
+
+export class Not implements IOperationOrSignal {
+ debugInfo: string | null = null;
+ children: IOperationOrSignal[];
+ operationId: number = 0;
+ doNotCreateContact: boolean = false;
+ cardinality: number = 0;
+ parent: IOperationOrSignal | null = null;
+
+ constructor(signal: Signal) {
+ this.children = [];
+ this.children.push(signal);
+ }
+
+ createContactAndFillCardinality(_parent: IOperationOrSignal): number {
+ this.cardinality = 1;
+ return this.cardinality;
+ }
+
+ clone(): IOperationOrSignal {
+ return new Not(this.children[0].clone() as Signal);
+ }
+
+ toString(): string {
+ return this.constructor.name;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Or.ts b/TiaCodegen-ts/src/Commands/Or.ts
new file mode 100644
index 0000000..6d74a09
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Or.ts
@@ -0,0 +1,18 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class Or extends BaseOperationOrSignal {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+
+ createContactAndFillCardinality(parent: IOperationOrSignal): number {
+ let c = 0;
+ this.operationId = parent.operationId;
+ for (const op of this.children) {
+ c += op.createContactAndFillCardinality(this);
+ }
+ this.cardinality = c;
+ return this.cardinality;
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/S_Move.ts b/TiaCodegen-ts/src/Commands/S_Move.ts
new file mode 100644
index 0000000..875420e
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/S_Move.ts
@@ -0,0 +1,16 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+import { IFunctionOperation } from '../Interfaces/IFunctionOperation.js';
+import { BaseOperationOrSignal } from './BaseOperationOrSignal.js';
+
+export class S_Move extends BaseOperationOrSignal implements IFunctionOperation {
+ constructor(...operationOrSignals: IOperationOrSignal[]) {
+ super(...operationOrSignals);
+ }
+
+ get cardinality(): number {
+ return 1;
+ }
+ set cardinality(_value: number) {
+ // readonly, ignore
+ }
+}
diff --git a/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts b/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts
new file mode 100644
index 0000000..e9d68bf
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts
@@ -0,0 +1 @@
+export { Signal, FixedSignal, FixedPeripherySignal } from './Signal.js';
diff --git a/TiaCodegen-ts/src/Commands/Signals/Signal.ts b/TiaCodegen-ts/src/Commands/Signals/Signal.ts
new file mode 100644
index 0000000..bfb92ea
--- /dev/null
+++ b/TiaCodegen-ts/src/Commands/Signals/Signal.ts
@@ -0,0 +1,357 @@
+import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal.js';
+import { SignalType } from '../../Enums/SignalType.js';
+import { StringBuilder } from '../../utils/StringBuilder.js';
+
+export class Signal implements IOperationOrSignal {
+ debugInfo: string | null = null;
+ operationId: number = 0;
+ signalId: number = 0;
+ name: string;
+ description: string | null;
+ signalType: SignalType;
+ customType: string | null;
+ children: IOperationOrSignal[];
+ parent: IOperationOrSignal | null = null;
+ doNotCreateContact: boolean = false;
+ cardinality: number = 0;
+
+ constructor(nameOrValue: string | number | boolean, signalType?: SignalType, customType?: string, description?: string) {
+ if (typeof nameOrValue === 'number') {
+ this.name = nameOrValue.toString();
+ this.signalType = SignalType.ConstantInt;
+ this.description = null;
+ this.customType = null;
+ } else if (typeof nameOrValue === 'boolean') {
+ this.name = nameOrValue.toString().toUpperCase();
+ this.signalType = SignalType.ConstantBool;
+ this.description = null;
+ this.customType = null;
+ } else {
+ this.name = nameOrValue;
+ this.signalType = signalType ?? SignalType.Bool;
+ this.customType = customType ?? null;
+ this.description = description ?? null;
+ }
+ this.children = [];
+ }
+
+ createContactAndFillCardinality(_parent: IOperationOrSignal): number {
+ this.cardinality = 1;
+ return this.cardinality;
+ }
+
+ escape(txt: string): string {
+ return txt.replace(/\\\./g, '\uD83C\uDF34');
+ }
+
+ unescape(txt: string): string {
+ return txt.replace(/\uD83C\uDF34/g, '.').replace(/\\\\/g, '\\');
+ }
+
+ clone(): IOperationOrSignal {
+ const inst = new Signal(this.name, this.signalType, this.customType ?? undefined, this.description ?? undefined);
+ inst.debugInfo = this.debugInfo;
+ for (const c of this.children) {
+ inst.children.push(c.clone());
+ }
+ return inst;
+ }
+
+ addXmlToStringBuilder(id: number, sb: StringBuilder): void {
+ const name = this.name;
+ const signalType = this.signalType;
+
+ if (signalType === SignalType.Constant && !name.startsWith('#')) {
+ const value = name.indexOf(',');
+ sb.appendLine(``);
+ if (value === -1)
+ sb.appendLine(``);
+ else
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantBool && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('Bool');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantTime && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantUInt && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('UInt');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantUDInt && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('UDInt');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantInt && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('Int');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantReal && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('Real');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantString && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('String');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.ConstantWord && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.Void && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('Void');
+ sb.appendLine(`${name}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.UDT && !name.startsWith('#')) {
+ sb.appendLine(` `);
+ sb.appendLine('');
+ const escapedParts = this.escape(name).split('.');
+ for (let i = 0; i < escapedParts.length; i++) {
+ const part = this.unescape(escapedParts[i]);
+ const idx = part.indexOf('[') + 1;
+ if (idx > 0) {
+ sb.appendLine(``);
+ const arrays = part.substring(idx, part.length - 1);
+
+ if (arrays.includes('"')) {
+ sb.appendLine('');
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (!part.includes(']')) {
+ let p1: string | null = part.slice(idx);
+ let accessType = 'GlobalVariable';
+ if (p1[0] === '#') {
+ p1 = p1.substring(1);
+ accessType = 'LocalVariable';
+ }
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine(``);
+ while (p1 !== null) {
+ i++;
+ p1 = this.unescape(this.escape(name).split('.')[i]);
+ if (p1.includes(']')) {
+ sb.appendLine(``);
+ p1 = null;
+ } else {
+ sb.appendLine(``);
+ }
+ }
+ sb.appendLine('');
+ sb.appendLine('');
+ } else {
+ for (const arr of arrays.split(',')) {
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('DInt');
+ sb.appendLine(`${arr}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ }
+ }
+ } else {
+ sb.appendLine(``);
+ }
+ sb.appendLine('');
+ }
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.Byte && !name.startsWith('#')) {
+ sb.appendLine(``);
+ sb.appendLine('');
+ for (const parte of this.escape(name).split('.')) {
+ const part = this.unescape(parte);
+ sb.appendLine(``);
+ }
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (signalType === SignalType.String && !name.startsWith('#')) {
+ sb.appendLine(` `);
+ sb.appendLine('');
+ for (const parte of this.escape(name).split('.')) {
+ const part = this.unescape(parte);
+ const idx = part.indexOf('[') + 1;
+ if (idx > 0) {
+ sb.appendLine(``);
+ const arrays = part.substring(idx, part.length - 1);
+ if (arrays.includes('"')) {
+ sb.appendLine('');
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else {
+ for (const arr of arrays.split(',')) {
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('DInt');
+ sb.appendLine(`${arr}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ }
+ }
+ } else {
+ sb.appendLine(``);
+ }
+ sb.appendLine('');
+ }
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('');
+ } else {
+ let localName = name;
+ if (name.startsWith('#')) {
+ sb.appendLine(``);
+ localName = name.substring(1);
+ } else {
+ sb.appendLine(` `);
+ }
+ sb.appendLine('');
+ const escapedLocal = this.escape(localName).split('.');
+ const cnt = (this instanceof FixedSignal) ? 1 : escapedLocal.length;
+ for (let i = 0; i < cnt; i++) {
+ let part = this.unescape(escapedLocal[i]);
+ if (this instanceof FixedSignal) part = localName;
+
+ const idx = part.indexOf('[') + 1;
+ if (idx > 0) {
+ sb.appendLine(``);
+ const arrays = part.substring(idx, part.length - 1);
+
+ if (arrays.includes('"')) {
+ sb.appendLine('');
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else if (!part.includes(']')) {
+ let p1: string | null = part.slice(idx);
+ let accessType = 'GlobalVariable';
+ if (p1[0] === '#') {
+ p1 = p1.substring(1);
+ accessType = 'LocalVariable';
+ }
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine(``);
+ let noClose = false;
+ while (p1 !== null) {
+ i++;
+ p1 = this.unescape(this.escape(localName).split('.')[i]);
+ if (p1.includes(',')) {
+ const innerParts = p1.split(',');
+ sb.appendLine(``);
+ for (const p of innerParts.slice(1)) {
+ let pNe = p.trim();
+ if (pNe.includes(']')) {
+ pNe = pNe.substring(0, pNe.length - 1);
+ }
+ if (!isNaN(parseInt(pNe, 10)) && pNe.match(/^\d+$/)) {
+ noClose = true;
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('DInt');
+ sb.appendLine(`${pNe}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ } else {
+ sb.appendLine('');
+ sb.appendLine('');
+ let accessTypePne = 'GlobalVariable';
+ if (pNe[0] === '#') {
+ pNe = pNe.substring(1);
+ accessTypePne = 'LocalVariable';
+ }
+ sb.appendLine(``);
+ sb.appendLine('');
+ sb.appendLine(``);
+ }
+ }
+ if (p1.includes(']')) {
+ p1 = null;
+ }
+ } else {
+ if (p1.includes(']')) {
+ sb.appendLine(``);
+ p1 = null;
+ } else {
+ sb.appendLine(``);
+ }
+ }
+ }
+ if (!noClose) {
+ sb.appendLine('');
+ sb.appendLine('');
+ }
+ } else {
+ for (const arr of arrays.split(',')) {
+ sb.appendLine('');
+ sb.appendLine('');
+ sb.appendLine('DInt');
+ sb.appendLine(`${arr}`);
+ sb.appendLine('');
+ sb.appendLine('');
+ }
+ }
+ } else {
+ if (this instanceof FixedPeripherySignal) {
+ sb.appendLine(``);
+ } else {
+ sb.appendLine(``);
+ }
+ }
+ sb.appendLine('');
+ }
+ sb.appendLine('');
+ sb.appendLine('');
+ }
+ }
+
+ toString(): string {
+ return `${this.constructor.name}(${this.name})`;
+ }
+}
+
+export class FixedSignal extends Signal {
+ constructor(name: string, signalType: SignalType = SignalType.Bool, customType?: string) {
+ super(name, signalType, customType);
+ }
+}
+
+export class FixedPeripherySignal extends FixedSignal {
+ constructor(name: string, signalType: SignalType = SignalType.Bool, customType?: string) {
+ super(name, signalType, customType);
+ }
+}
diff --git a/TiaCodegen-ts/src/Enums/Direction.ts b/TiaCodegen-ts/src/Enums/Direction.ts
new file mode 100644
index 0000000..b82ba43
--- /dev/null
+++ b/TiaCodegen-ts/src/Enums/Direction.ts
@@ -0,0 +1,7 @@
+export enum Direction {
+ Input = 'Input',
+ Output = 'Output',
+ InOut = 'InOut',
+ Eno = 'Eno',
+ En = 'En',
+}
diff --git a/TiaCodegen-ts/src/Enums/SignalType.ts b/TiaCodegen-ts/src/Enums/SignalType.ts
new file mode 100644
index 0000000..ec61ed1
--- /dev/null
+++ b/TiaCodegen-ts/src/Enums/SignalType.ts
@@ -0,0 +1,31 @@
+export enum SignalType {
+ Bool = 'Bool',
+ Byte = 'Byte',
+ Int = 'Int',
+ SInt = 'Int',
+ DInt = 'DInt',
+ LInt = 'LInt',
+ UInt = 'UInt',
+ USInt = 'USInt',
+ UDInt = 'UDInt',
+ ULInt = 'ULInt',
+ Time = 'Time',
+ UDT = 'UDT',
+ String = 'String',
+ Real = 'Real',
+ Constant = 'Constant',
+ ConstantBool = 'ConstantBool',
+ ConstantInt = 'ConstantInt',
+ ConstantDInt = 'ConstantDInt',
+ ConstantUInt = 'ConstantUInt',
+ ConstantUDInt = 'ConstantUDInt',
+ ConstantTime = 'ConstantTime',
+ ConstantString = 'ConstantString',
+ ConstantReal = 'ConstantReal',
+ ConstantWord = 'ConstantWord',
+ Custom = 'Custom',
+ Void = 'Void',
+ Variant = 'Variant',
+ ProgramAlarm = 'ProgramAlarm',
+ Word = 'Word',
+}
diff --git a/TiaCodegen-ts/src/Extensions/NaturalComparer.ts b/TiaCodegen-ts/src/Extensions/NaturalComparer.ts
new file mode 100644
index 0000000..a11560d
--- /dev/null
+++ b/TiaCodegen-ts/src/Extensions/NaturalComparer.ts
@@ -0,0 +1,36 @@
+export class NaturalComparer {
+ compare(x: string | null, y: string | null): number {
+ if (x === y) return 0;
+ if (x === null || x === undefined) return -1;
+ if (y === null || y === undefined) return 1;
+
+ let i = 0, j = 0;
+ while (i < x.length && j < y.length) {
+ const cx = x[i];
+ const cy = y[j];
+ if (this.isDigit(cx) && this.isDigit(cy)) {
+ let vx = 0;
+ while (i < x.length && this.isDigit(x[i])) {
+ vx = vx * 10 + (x.charCodeAt(i) - 48);
+ i++;
+ }
+ let vy = 0;
+ while (j < y.length && this.isDigit(y[j])) {
+ vy = vy * 10 + (y.charCodeAt(j) - 48);
+ j++;
+ }
+ if (vx !== vy) return vx < vy ? -1 : 1;
+ } else {
+ const cmp = cx.toUpperCase().localeCompare(cy.toUpperCase());
+ if (cmp !== 0) return cmp;
+ i++;
+ j++;
+ }
+ }
+ return x.length - y.length;
+ }
+
+ private isDigit(c: string): boolean {
+ return c >= '0' && c <= '9';
+ }
+}
diff --git a/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts b/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts
new file mode 100644
index 0000000..667aaef
--- /dev/null
+++ b/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts
@@ -0,0 +1,13 @@
+import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal.js';
+
+export function tryGetParent(
+ op: IOperationOrSignal,
+ ctor: new (...args: any[]) => T,
+): T | null {
+ let chk = op.parent;
+ while (chk !== null && chk !== undefined) {
+ if (chk instanceof ctor) return chk as T;
+ chk = chk.parent;
+ }
+ return null;
+}
diff --git a/TiaCodegen-ts/src/Interfaces/ICoil.ts b/TiaCodegen-ts/src/Interfaces/ICoil.ts
new file mode 100644
index 0000000..e9dbd17
--- /dev/null
+++ b/TiaCodegen-ts/src/Interfaces/ICoil.ts
@@ -0,0 +1,2 @@
+// Marker interface for coils
+export interface ICoil {}
diff --git a/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts b/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts
new file mode 100644
index 0000000..9b046c2
--- /dev/null
+++ b/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts
@@ -0,0 +1,2 @@
+// Marker interface for function operations
+export interface IFunctionOperation {}
diff --git a/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts b/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts
new file mode 100644
index 0000000..99aa9cf
--- /dev/null
+++ b/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts
@@ -0,0 +1,11 @@
+export interface IOperationOrSignal {
+ children: IOperationOrSignal[];
+ parent: IOperationOrSignal | null;
+ operationId: number;
+ doNotCreateContact: boolean;
+ cardinality: number;
+ debugInfo: string | null;
+ createContactAndFillCardinality(parent: IOperationOrSignal): number;
+ clone(): IOperationOrSignal;
+ toString(): string;
+}
diff --git a/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts b/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts
new file mode 100644
index 0000000..0a2d35a
--- /dev/null
+++ b/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts
@@ -0,0 +1,22 @@
+import { IOperationOrSignal } from './IOperationOrSignal.js';
+import { Direction } from '../Enums/Direction.js';
+import { SignalType } from '../Enums/SignalType.js';
+
+export class IOperationOrSignalDirectionWrapper {
+ operationOrSignal: IOperationOrSignal | null;
+ direction: Direction;
+ length: number;
+ type: SignalType | null;
+
+ constructor(
+ operationOrSignal: IOperationOrSignal | null,
+ direction: Direction,
+ type: SignalType | null = null,
+ length: number = 0,
+ ) {
+ this.operationOrSignal = operationOrSignal;
+ this.direction = direction;
+ this.length = length;
+ this.type = type;
+ }
+}
diff --git a/TiaCodegen-ts/src/Interfaces/IPartName.ts b/TiaCodegen-ts/src/Interfaces/IPartName.ts
new file mode 100644
index 0000000..855d92d
--- /dev/null
+++ b/TiaCodegen-ts/src/Interfaces/IPartName.ts
@@ -0,0 +1,3 @@
+export interface IPartName {
+ partName: string;
+}
diff --git a/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts b/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts
new file mode 100644
index 0000000..1188c95
--- /dev/null
+++ b/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts
@@ -0,0 +1,4 @@
+export function flatten(e: T[] | null | undefined, f: (t: T) => T[]): T[] {
+ if (!e) return [];
+ return e.flatMap(c => flatten(f(c), f)).concat(e);
+}
diff --git a/TiaCodegen-ts/src/index.ts b/TiaCodegen-ts/src/index.ts
new file mode 100644
index 0000000..3a4f52e
--- /dev/null
+++ b/TiaCodegen-ts/src/index.ts
@@ -0,0 +1,90 @@
+// Enums
+export { Direction } from './Enums/Direction.js';
+export { SignalType } from './Enums/SignalType.js';
+
+// Interfaces
+export type { IOperationOrSignal } from './Interfaces/IOperationOrSignal.js';
+export type { ICoil } from './Interfaces/ICoil.js';
+export type { IFunctionOperation } from './Interfaces/IFunctionOperation.js';
+export type { IPartName } from './Interfaces/IPartName.js';
+export { IOperationOrSignalDirectionWrapper } from './Interfaces/IOperationOrSignalDirectionWrapper.js';
+
+// Utils
+export { StringBuilder } from './utils/StringBuilder.js';
+
+// Internal
+export { flatten } from './Internal/IEnumerableExtensions.js';
+
+// Extensions
+export { NaturalComparer } from './Extensions/NaturalComparer.js';
+export { tryGetParent } from './Extensions/OperationOrSignalExtensions.js';
+
+// Commands
+export { BaseOperationOrSignal } from './Commands/BaseOperationOrSignal.js';
+export { And } from './Commands/And.js';
+export { Or } from './Commands/Or.js';
+export { Not } from './Commands/Not.js';
+export { Distributor } from './Commands/Distributor.js';
+export { Move } from './Commands/Move.js';
+export { Convert } from './Commands/Convert.js';
+export { S_Move } from './Commands/S_Move.js';
+export { NCoil } from './Commands/NCoil.js';
+
+// Signals
+export { Signal, FixedSignal, FixedPeripherySignal } from './Commands/Signals/Signal.js';
+
+// Coils
+export { BaseCoil } from './Commands/Coils/BaseCoil.js';
+export { BaseNPCoil } from './Commands/Coils/BaseNPCoil.js';
+export { Coil } from './Commands/Coils/Coil.js';
+export { PCoil } from './Commands/Coils/PCoil.js';
+export { RCoil } from './Commands/Coils/RCoil.js';
+export { SCoil } from './Commands/Coils/SCoil.js';
+
+// Comparisons
+export { CompareOperator } from './Commands/Comparisons/CompareOperator.js';
+export { Eq } from './Commands/Comparisons/Eq.js';
+export { Ne } from './Commands/Comparisons/Ne.js';
+export { Ge } from './Commands/Comparisons/Ge.js';
+export { Gt } from './Commands/Comparisons/Gt.js';
+export { Le } from './Commands/Comparisons/Le.js';
+export { Lt } from './Commands/Comparisons/Lt.js';
+export { InRangeCall } from './Commands/Comparisons/InRangeCall.js';
+export { OutRangeCall } from './Commands/Comparisons/OutRangeCall.js';
+
+// Function Base
+export { FunctionCall, type FunctionCallOptions } from './Commands/Functions/Base/FunctionCall.js';
+export { FunctionBlockCall, type FunctionBlockCallOptions } from './Commands/Functions/Base/FunctionBlockCall.js';
+export { SystemFunctionCall, type SystemFunctionCallOptions } from './Commands/Functions/Base/SystemFunctionCall.js';
+export { SystemFunctionBlockCall, type SystemFunctionBlockCallOptions } from './Commands/Functions/Base/SystemFunctionBlockCall.js';
+
+// Arithmetic
+export { ArithmeticCall, type ArithmeticCallOptions } from './Commands/Functions/Arithmetic/ArithmeticCall.js';
+export { VariableArithmeticCall, type VariableArithmeticCallOptions } from './Commands/Functions/Arithmetic/VariableArithmeticCall.js';
+export { AddCall, type AddCallOptions } from './Commands/Functions/Arithmetic/AddCall.js';
+export { MulCall, type MulCallOptions } from './Commands/Functions/Arithmetic/MulCall.js';
+export { SubCall, type SubCallOptions } from './Commands/Functions/Arithmetic/SubCall.js';
+export { DivCall, type DivCallOptions } from './Commands/Functions/Arithmetic/DivCall.js';
+export { ModCall, type ModCallOptions } from './Commands/Functions/Arithmetic/ModCall.js';
+
+// Functions
+export { AckGlCall, type AckGlCallOptions } from './Commands/Functions/AckGlCall.js';
+export { CTUCall, type CTUCallOptions } from './Commands/Functions/CTUCall.js';
+export { CTUDCall, type CTUDCallOptions } from './Commands/Functions/CTUDCall.js';
+export { FDBACKCall, type FDBACKCallOptions } from './Commands/Functions/FDBACKCall.js';
+export { FTrigCall, type FTrigCallOptions } from './Commands/Functions/FTrigCall.js';
+export { NTrigCall, type NTrigCallOptions } from './Commands/Functions/NTrigCall.js';
+export { PTrigCall, type PTrigCallOptions } from './Commands/Functions/PTrigCall.js';
+export { RTrigCall, type RTrigCallOptions } from './Commands/Functions/RTrigCall.js';
+export { TOFCall, type TOFCallOptions } from './Commands/Functions/TOFCall.js';
+export { TONCall, type TONCallOptions } from './Commands/Functions/TONCall.js';
+export { TONRCall, type TONRCallOptions } from './Commands/Functions/TONRCall.js';
+export { TPCall, type TPCallOptions } from './Commands/Functions/TPCall.js';
+
+// Blocks
+export { CodeBlock } from './Blocks/CodeBlock.js';
+export { Network } from './Blocks/Network.js';
+export { Block } from './Blocks/Block.js';
+
+// CodeGen
+export { KopCodeHelper } from './CodeGen/KopCodeHelper.js';
diff --git a/TiaCodegen-ts/src/utils/StringBuilder.ts b/TiaCodegen-ts/src/utils/StringBuilder.ts
new file mode 100644
index 0000000..826e45e
--- /dev/null
+++ b/TiaCodegen-ts/src/utils/StringBuilder.ts
@@ -0,0 +1,21 @@
+export class StringBuilder {
+ private parts: string[] = [];
+
+ append(text: string): StringBuilder {
+ this.parts.push(text);
+ return this;
+ }
+
+ appendLine(text: string = ''): StringBuilder {
+ this.parts.push(text + '\r\n');
+ return this;
+ }
+
+ toString(): string {
+ return this.parts.join('');
+ }
+
+ get length(): number {
+ return this.parts.join('').length;
+ }
+}
diff --git a/TiaCodegen-ts/tests/SampleTests.test.ts b/TiaCodegen-ts/tests/SampleTests.test.ts
new file mode 100644
index 0000000..8301589
--- /dev/null
+++ b/TiaCodegen-ts/tests/SampleTests.test.ts
@@ -0,0 +1,550 @@
+import { CodeBlock } from '../src/Blocks/CodeBlock';
+import { Network } from '../src/Blocks/Network';
+import { Block } from '../src/Blocks/Block';
+import { And } from '../src/Commands/And';
+import { Or } from '../src/Commands/Or';
+import { Not } from '../src/Commands/Not';
+import { Distributor } from '../src/Commands/Distributor';
+import { Move } from '../src/Commands/Move';
+import { Convert } from '../src/Commands/Convert';
+import { S_Move } from '../src/Commands/S_Move';
+import { Signal, FixedSignal, FixedPeripherySignal } from '../src/Commands/Signals/Signal';
+import { Coil } from '../src/Commands/Coils/Coil';
+import { SCoil } from '../src/Commands/Coils/SCoil';
+import { RCoil } from '../src/Commands/Coils/RCoil';
+import { Eq } from '../src/Commands/Comparisons/Eq';
+import { Gt } from '../src/Commands/Comparisons/Gt';
+import { InRangeCall } from '../src/Commands/Comparisons/InRangeCall';
+import { FunctionBlockCall } from '../src/Commands/Functions/Base/FunctionBlockCall';
+import { SystemFunctionCall } from '../src/Commands/Functions/Base/SystemFunctionCall';
+import { TONCall } from '../src/Commands/Functions/TONCall';
+import { CTUCall } from '../src/Commands/Functions/CTUCall';
+import { TPCall } from '../src/Commands/Functions/TPCall';
+import { IOperationOrSignalDirectionWrapper } from '../src/Interfaces/IOperationOrSignalDirectionWrapper';
+import { Direction } from '../src/Enums/Direction';
+import { SignalType } from '../src/Enums/SignalType';
+import { StringBuilder } from '../src/utils/StringBuilder';
+
+const TestInterface = `
+
+\t
+\t
+\t\t
+\t\t
+\t\t\tInitial call of this OB
+\t\t
+\t\t
+\t
+\t
+\t\t
+\t\t
+\t\t
+\t\t
+\t
+\t
+\t
+`;
+
+describe('SampleTests', () => {
+ test('CreateBlock1', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test1', 'Test1en');
+
+ nw.add(
+ new And(
+ new Signal('#Bool1'),
+ new Distributor(
+ new RCoil(new Signal('#Bool2')),
+ new Coil(new Signal('#Bool3')),
+ ),
+ ),
+ );
+
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ expect(xml).toContain('SW.Blocks.FC');
+ });
+
+ test('CreateBlock2', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test2', 'Test2en');
+ nw.add(
+ new And(
+ new Signal('#Bool1'),
+ new Signal('#Bool2'),
+ new Convert(
+ new Signal('#Real1', SignalType.Real),
+ new Signal('#Dint2', SignalType.DInt),
+ ),
+ new Distributor(
+ new And(
+ new Move(
+ new Signal('#Real3'),
+ new Signal('#Real4'),
+ ),
+ new SCoil(new Signal('#Bool3')),
+ ),
+ new And(
+ new Gt(
+ new Signal('#Real1', SignalType.Real),
+ new Signal('#Real2', SignalType.Real),
+ ),
+ new SCoil(new Signal('#Bool4')),
+ ),
+ ),
+ ),
+ );
+
+ codeblock.add(nw);
+ const block = new Block('Test', 'blabla', codeblock);
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('CreateBlock3', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test2', 'Test2en');
+ nw.add(
+ new Coil(
+ new Signal('#Bool1'),
+ new And(
+ new Signal('#Bool2'),
+ new Or(
+ new Signal('#Bool3'),
+ new And(
+ new Signal('#Bool1'),
+ new Signal('#Bool4'),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ codeblock.add(nw);
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('DynamicSample1', () => {
+ const codeblock = new CodeBlock();
+ const signals = ['#Bool1', '#Bool2', '#Bool3'];
+ const and = new And();
+ for (const s of signals) and.add(new Signal(s));
+
+ const nw = new Network('Test2', 'test2en');
+ nw.add(new Coil(new Signal('#Bool4'), and));
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('TestCallWithOr', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test2', 'Test2en');
+
+ const f = new FunctionBlockCall({ functionName: 'CheckContour', instanceName: 'CheckContourInstance' });
+ f.iface['BoolPar'] = new IOperationOrSignalDirectionWrapper(
+ new Or(new Signal('P1'), new Signal('P2')),
+ Direction.InOut,
+ );
+ for (const w of Object.values(f.iface)) {
+ if (w.operationOrSignal !== null) f.children.push(w.operationOrSignal);
+ }
+ nw.add(f);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('FunctionBlockCallWithArrayInstance', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test', 'Test');
+ nw.add(new FunctionBlockCall({ functionName: 'OrganiseSlot', instanceName: 'OrganiseSlot["S0001"]' }));
+ codeblock.add(nw);
+
+ const xml = new Block('Test', 'Test', codeblock).getCode();
+
+ expect(xml).toContain('');
+ expect(xml).toContain('');
+ });
+
+ test('SystemFunctionBlockCallWithArrayInstance', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test', 'Test');
+ nw.add(new TONCall({ instanceName: 'Timer[1]' }));
+ codeblock.add(nw);
+
+ const xml = new Block('Test', 'Test', codeblock).getCode();
+
+ expect(xml).toContain('');
+ expect(xml).toContain('1');
+ });
+
+ test('TestDistributor', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test2', 'Test2en');
+ nw.add(
+ new And(
+ new Not(new Signal('Tag_9')),
+ new Distributor(
+ new And(new Coil(new Signal('#monitoringSignal'))),
+ new And(
+ new TONCall({ instanceName: 'OnDelaySafetyDoorSDA11N13', pt: new Signal('T#60s', SignalType.ConstantTime) }),
+ ),
+ ),
+ ),
+ );
+
+ codeblock.add(nw);
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('TestCallWithInRange', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test2', 'Test2en');
+
+ const f = new InRangeCall(
+ new Signal(1),
+ new Signal(2),
+ new Signal(3),
+ new Coil(new Signal('MW0', SignalType.Int)),
+ );
+ nw.add(f);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('TestCallWithTOn', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = true;
+ const nw = new Network('Test2', 'Test2en');
+
+ const f = new TONCall({ instanceName: 'Hallo', pt: new Signal('T#4m', SignalType.ConstantTime) });
+ nw.add(f);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ expect(xml).toContain('F_LAD');
+ });
+
+ test('TestCallWithCTU', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('Test2', 'Test2en');
+
+ const f = new And(
+ new Signal('aa'),
+ new CTUCall({ instanceName: 'Hallo', r: new Signal('bbb', SignalType.Bool), pv: new Signal('2', SignalType.ConstantInt), q: new Coil(new Signal('ccc', SignalType.Bool)) }),
+ );
+ nw.add(f);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('TestCallWithTPAndDistributor', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('Test2', 'Test2en');
+
+ const and = new And(
+ new Signal('#aaa'),
+ new TPCall({
+ instanceName: 'PulseStartPrint',
+ pt: new Signal('T#100ms', SignalType.ConstantTime),
+ q: new Distributor(
+ new Coil(new Signal('#bbbb')),
+ new RCoil(new Signal('#cccc')),
+ new SCoil(new Signal('#dddd')),
+ ),
+ }),
+ );
+ nw.add(and);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('DistributorWithOr', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('Test2', 'Test2en');
+
+ nw.add(
+ new And(
+ new Signal('asd'),
+ new Distributor(
+ new SCoil(new Signal('x')),
+ new And(
+ new Or(
+ new And(new Signal('a'), new Signal('h')),
+ new And(new Signal('b'), new Signal('f')),
+ ),
+ new SCoil(new Signal('c')),
+ ),
+ ),
+ ),
+ );
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('MultipleOr', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('Test2', 'Test2en');
+
+ nw.add(
+ new Coil(
+ new Signal('a'),
+ new And(
+ new Signal('1'),
+ new Or(
+ new And(
+ new Or(new Signal('b'), new Signal('c')),
+ new Signal('d'),
+ ),
+ new Signal('e'),
+ ),
+ ),
+ ),
+ );
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('FixedPeripherySignalTest', () => {
+ const codeblock = new CodeBlock();
+ const nw = new Network('Test3', 'Test3en');
+ nw.add(
+ new Coil(
+ new FixedPeripherySignal('=PBG10.6+FBG11-BV1:4'),
+ new And(new Signal('1')),
+ ),
+ );
+
+ codeblock.add(nw);
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('ComplexVariableAccessTest1', () => {
+ const sb = new StringBuilder();
+ const s = new Signal('#A.B.C[#D.E.F, 1]');
+ s.addXmlToStringBuilder(1, sb);
+ const xml = sb.toString();
+ const expected = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n';
+ expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, ''));
+ });
+
+ test('ComplexVariableAccessTest2', () => {
+ const sb = new StringBuilder();
+ const s = new Signal('#A.B.C[#D.E.F, #G.H.I]');
+ s.addXmlToStringBuilder(1, sb);
+ const xml = sb.toString();
+ const expected = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n';
+ expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, ''));
+ });
+
+ test('TestConstant', () => {
+ const sb = new StringBuilder();
+ const s = new Signal('AAA', SignalType.Constant);
+ s.addXmlToStringBuilder(1, sb);
+ const xml = sb.toString();
+ const expected = '\r\n\r\n\r\n\r\n';
+ expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, ''));
+ });
+
+ test('SystemFunctionDPXX_DAT', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('TestDPXX_DAT', 'TestDPXX_DATen');
+
+ const sf1 = new SystemFunctionCall({ functionName: 'DPRD_DAT' });
+ sf1.iface['LADDR'] = new IOperationOrSignalDirectionWrapper(
+ new Signal('#Configuration.GeneralMoviC.ModuleHardwareID'),
+ Direction.Input,
+ );
+ sf1.iface['RET_VAL'] = new IOperationOrSignalDirectionWrapper(new Signal('#retVal'), Direction.Output);
+ sf1.iface['RECORD'] = new IOperationOrSignalDirectionWrapper(
+ new Signal('#PeripheryInputsMoviC'),
+ Direction.Output,
+ );
+ for (const w of Object.values(sf1.iface)) {
+ if (w.operationOrSignal !== null) sf1.children.push(w.operationOrSignal);
+ }
+ nw.add(sf1);
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('ComplexOr', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('T1', 'T1');
+
+ const or3 = new Or(new Signal('Test3'), new Signal('Test4'));
+ or3.debugInfo = 'aaa';
+ const innerAnd1 = new And(new Signal('Test2'), or3);
+
+ const or1Inner = new Or(innerAnd1, new Signal('Test5'));
+ or1Inner.debugInfo = 'bbb';
+
+ const or3b = new Or(new Signal('Test8'), new Signal('Test9'));
+ or3b.debugInfo = 'ccc';
+ const innerAnd2 = new And(new Signal('Test7'), or3b);
+
+ const or1Inner2 = new Or(innerAnd2, new Signal('Test10'));
+ or1Inner2.debugInfo = 'ddd';
+
+ const outerOr = new Or(
+ new And(new Signal('Test1'), or1Inner),
+ new And(new Signal('Test6'), or1Inner2),
+ );
+ outerOr.debugInfo = 'eee';
+
+ nw.add(new Coil(new Signal('Test11'), outerOr));
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('ComplexOr2', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('T1', 'T1');
+
+ nw.add(
+ new Coil(
+ new Signal('Test11'),
+ new Or(
+ new Signal('Test12'),
+ new Or(
+ new And(
+ new Signal('Test1'),
+ new Or(
+ new And(
+ new Signal('Test2'),
+ new Or(new Signal('Test3'), new Signal('Test4')),
+ ),
+ new Signal('Test5'),
+ ),
+ ),
+ new And(
+ new Signal('Test6'),
+ new Or(
+ new And(
+ new Signal('Test7'),
+ new Or(new Signal('Test8'), new Signal('Test9')),
+ ),
+ new Signal('Test10'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('Complex3', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('T1', 'T1');
+
+ nw.add(
+ new Coil(
+ new Signal('Test11'),
+ new And(new Signal('Test1'), new Or(new Signal('Test2'))),
+ ),
+ );
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ block.blockInterface = TestInterface;
+ const xml = block.getCode();
+ expect(xml).toBeTruthy();
+ });
+
+ test('DoubleCarrierTest', () => {
+ const codeblock = new CodeBlock();
+ codeblock.safety = false;
+ const nw = new Network('Test', 'Testen');
+
+ nw.add(
+ new And(
+ new Eq(new Signal('#Configuration.General.SingleDoubleCarrier', SignalType.Int), new Signal(2)),
+ new Distributor(
+ new And(
+ new Or(
+ new Signal('#DoubleCarrier.Sensors.V[#Configuration.General.CoordinationAxisConveyor, 1]'),
+ new Signal('#DoubleCarrier.Sensors.R[#Configuration.General.CoordinationAxisConveyor, 1]'),
+ ),
+ new Coil(new Signal('#CarrierGeneral.States.CarriageOccupied[2]')),
+ ),
+ new And(
+ new Signal('#DoubleCarrierData.MOrder.DataPresent'),
+ new Coil(new Signal('#CarrierGeneral.States.CarriageDataPresent[2]')),
+ ),
+ ),
+ ),
+ );
+
+ codeblock.add(nw);
+
+ const block = new Block('Test', 'blabla', codeblock);
+ const xml = block.getCode();
+
+ const expectedXml = ' General 1.0 Optimized Test LAD DInt2DInt2DInt1DInt1Int2Int2 LADde-DEen-GBde-DETesten-GBTesten de-DE blabla en-GB de-DE en-GB ';
+ expect(xml.replace(/\r?\n/g, '')).toEqual(expectedXml.replace(/\r?\n/g, ''));
+ });
+});
diff --git a/TiaCodegen-ts/tsconfig.json b/TiaCodegen-ts/tsconfig.json
new file mode 100644
index 0000000..0e93982
--- /dev/null
+++ b/TiaCodegen-ts/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "lib": ["ES2020"],
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "isolatedModules": true,
+ "declaration": true,
+ "declarationMap": true,
+ "sourceMap": true
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "tests"]
+}
diff --git a/TiaCodegen/Commands/Comparisons/InRangeCall.cs b/TiaCodegen/Commands/Comparisons/InRangeCall.cs
index 5f4ae01..cd15239 100644
--- a/TiaCodegen/Commands/Comparisons/InRangeCall.cs
+++ b/TiaCodegen/Commands/Comparisons/InRangeCall.cs
@@ -17,7 +17,7 @@ public InRangeCall(
DisableEno = false;
Interface["min"] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
Interface["in"] = new IOperationOrSignalDirectionWrapper(@in, Direction.Input);
- Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Output);
+ Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Input);
Interface["out"] = new IOperationOrSignalDirectionWrapper(@out, Direction.Output);
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
diff --git a/TiaCodegen/Commands/Comparisons/OutRangeCall.cs b/TiaCodegen/Commands/Comparisons/OutRangeCall.cs
index 51fb5ec..a50f984 100644
--- a/TiaCodegen/Commands/Comparisons/OutRangeCall.cs
+++ b/TiaCodegen/Commands/Comparisons/OutRangeCall.cs
@@ -17,7 +17,7 @@ public OutRangeCall(
DisableEno = false;
Interface["min"] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
Interface["in"] = new IOperationOrSignalDirectionWrapper(@in, Direction.Input);
- Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Output);
+ Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Input);
Interface["out"] = new IOperationOrSignalDirectionWrapper(@out, Direction.Output);
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
diff --git a/TiaCodegen/Commands/Functions/Arithmetic/AddCall.cs b/TiaCodegen/Commands/Functions/Arithmetic/AddCall.cs
index 101e686..b56d6f6 100644
--- a/TiaCodegen/Commands/Functions/Arithmetic/AddCall.cs
+++ b/TiaCodegen/Commands/Functions/Arithmetic/AddCall.cs
@@ -4,9 +4,9 @@
namespace TiaCodegen.Commands.Functions.Arithmetic
{
- public class MulCall : VariableArithmeticCall
+ public class AddCall : VariableArithmeticCall
{
- public MulCall(string type,
+ public AddCall(string type,
IOperationOrSignal in1,
IOperationOrSignal in2,
IOperationOrSignal in3 = null,
@@ -58,7 +58,7 @@ public MulCall(string type,
IOperationOrSignal in49 = null,
IOperationOrSignal in50 = null,
IOperationOrSignal out1 = null,
- IOperationOrSignal eno = null) : base("Mul", eno)
+ IOperationOrSignal eno = null) : base("Add", eno)
{
DisableEno = true;
Type = type;
diff --git a/TiaCodegen/Commands/Functions/Arithmetic/MulCall.cs b/TiaCodegen/Commands/Functions/Arithmetic/MulCall.cs
index b56d6f6..101e686 100644
--- a/TiaCodegen/Commands/Functions/Arithmetic/MulCall.cs
+++ b/TiaCodegen/Commands/Functions/Arithmetic/MulCall.cs
@@ -4,9 +4,9 @@
namespace TiaCodegen.Commands.Functions.Arithmetic
{
- public class AddCall : VariableArithmeticCall
+ public class MulCall : VariableArithmeticCall
{
- public AddCall(string type,
+ public MulCall(string type,
IOperationOrSignal in1,
IOperationOrSignal in2,
IOperationOrSignal in3 = null,
@@ -58,7 +58,7 @@ public AddCall(string type,
IOperationOrSignal in49 = null,
IOperationOrSignal in50 = null,
IOperationOrSignal out1 = null,
- IOperationOrSignal eno = null) : base("Add", eno)
+ IOperationOrSignal eno = null) : base("Mul", eno)
{
DisableEno = true;
Type = type;
diff --git a/TiaCodegen/Enums/SignalType.cs b/TiaCodegen/Enums/SignalType.cs
index 1bb89ec..c41a3a5 100644
--- a/TiaCodegen/Enums/SignalType.cs
+++ b/TiaCodegen/Enums/SignalType.cs
@@ -5,9 +5,13 @@ public enum SignalType
Bool,
Byte,
Int,
+ SInt,
DInt,
+ LInt,
UInt,
+ USInt,
UDInt,
+ ULInt,
Time,
UDT,
String,