@rkmodules/rules 0.0.25 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,11 +3,11 @@
3
3
  var mathjs = require('mathjs');
4
4
  var React = require('react');
5
5
  var react = require('@xyflow/react');
6
+ var reactDnd = require('react-dnd');
6
7
  var katex = require('katex');
7
8
  var classNames = require('classnames');
8
9
  var zustand = require('zustand');
9
10
  var middleware = require('zustand/middleware');
10
- var reactDnd = require('react-dnd');
11
11
 
12
12
  /******************************************************************************
13
13
  Copyright (c) Microsoft Corporation.
@@ -569,25 +569,25 @@ var value = {
569
569
  value = params.value;
570
570
  switch (params.type) {
571
571
  case "number":
572
- return [2 /*return*/, { value: Number(value) }];
572
+ return [2 /*return*/, { value: broadCast(Number(value)) }];
573
573
  case "boolean":
574
- return [2 /*return*/, { value: Boolean(value) }];
574
+ return [2 /*return*/, { value: broadCast(Boolean(value)) }];
575
575
  case "string":
576
- return [2 /*return*/, { value: String(value) }];
576
+ return [2 /*return*/, { value: broadCast(String(value)) }];
577
577
  default:
578
578
  // return as is
579
- return [2 /*return*/, { value: value }];
579
+ return [2 /*return*/, { value: broadCast(value) }];
580
580
  }
581
581
  });
582
582
  }); },
583
583
  };
584
584
 
585
- var _a$4;
586
- var primitives$5 = (_a$4 = {},
587
- _a$4[getValue.name] = getValue,
588
- _a$4[log.name] = log,
589
- _a$4[value.name] = value,
590
- _a$4);
585
+ var _a$5;
586
+ var primitives$6 = (_a$5 = {},
587
+ _a$5[getValue.name] = getValue,
588
+ _a$5[log.name] = log,
589
+ _a$5[value.name] = value,
590
+ _a$5);
591
591
 
592
592
  var math$1 = mathjs.create(mathjs.all, {});
593
593
  function evaluate(expression, scope) {
@@ -765,10 +765,10 @@ var greaterThan = {
765
765
  return [2 /*return*/, {
766
766
  gt: binaryOnTree(inputs.a, inputs.b, function (itemA, itemB) {
767
767
  return itemA > itemB;
768
- }),
768
+ }, true),
769
769
  gte: binaryOnTree(inputs.a, inputs.b, function (itemA, itemB) {
770
770
  return itemA >= itemB;
771
- }),
771
+ }, true),
772
772
  }];
773
773
  });
774
774
  }); },
@@ -791,21 +791,21 @@ var lessThan = {
791
791
  return [2 /*return*/, {
792
792
  lt: binaryOnTree(inputs.a, inputs.b, function (itemA, itemB) {
793
793
  return itemA < itemB;
794
- }),
794
+ }, true),
795
795
  lte: binaryOnTree(inputs.a, inputs.b, function (itemA, itemB) {
796
796
  return itemA <= itemB;
797
- }),
797
+ }, true),
798
798
  }];
799
799
  });
800
800
  }); },
801
801
  };
802
802
 
803
- var _a$3;
804
- var primitives$4 = (_a$3 = {},
805
- _a$3[calc.name] = calc,
806
- _a$3[lessThan.name] = lessThan,
807
- _a$3[greaterThan.name] = greaterThan,
808
- _a$3);
803
+ var _a$4;
804
+ var primitives$5 = (_a$4 = {},
805
+ _a$4[calc.name] = calc,
806
+ _a$4[lessThan.name] = lessThan,
807
+ _a$4[greaterThan.name] = greaterThan,
808
+ _a$4);
809
809
 
810
810
  var filterList = {
811
811
  name: "filterList",
@@ -821,7 +821,7 @@ var filterList = {
821
821
  impl: function (inputs) { return __awaiter(void 0, void 0, void 0, function () {
822
822
  return __generator(this, function (_a) {
823
823
  return [2 /*return*/, {
824
- list: binaryOnTreeBranch(inputs.list, inputs.keep, function (branchA, branchB) {
824
+ list: binaryOnTreeBranch(inputs.list || {}, inputs.keep || {}, function (branchA, branchB) {
825
825
  return branchA.filter(function (item, index) {
826
826
  return (branchB[Math.min(index, branchB.length - 1)] ===
827
827
  true);
@@ -874,7 +874,7 @@ var listItem = {
874
874
  // return indices.map((i) => branch[i]);
875
875
  // }
876
876
  // }),
877
- item: binaryOnTreeBranch(inputs.list, inputs.index, function (branch, indices) {
877
+ item: binaryOnTreeBranch(inputs.list || {}, inputs.index || {}, function (branch, indices) {
878
878
  if (indices) {
879
879
  return indices.map(function (i) { return branch[i]; });
880
880
  }
@@ -930,14 +930,14 @@ var trimTree = {
930
930
  }); },
931
931
  };
932
932
 
933
- var _a$2;
934
- var primitives$3 = (_a$2 = {},
935
- _a$2[graftTree.name] = graftTree,
936
- _a$2[trimTree.name] = trimTree,
937
- _a$2[listItem.name] = listItem,
938
- _a$2[listLength.name] = listLength,
939
- _a$2[filterList.name] = filterList,
940
- _a$2);
933
+ var _a$3;
934
+ var primitives$4 = (_a$3 = {},
935
+ _a$3[graftTree.name] = graftTree,
936
+ _a$3[trimTree.name] = trimTree,
937
+ _a$3[listItem.name] = listItem,
938
+ _a$3[listLength.name] = listLength,
939
+ _a$3[filterList.name] = filterList,
940
+ _a$3);
941
941
 
942
942
  var series = {
943
943
  name: "series",
@@ -971,10 +971,10 @@ var series = {
971
971
  }); },
972
972
  };
973
973
 
974
- var _a$1;
975
- var primitives$2 = (_a$1 = {},
976
- _a$1[series.name] = series,
977
- _a$1);
974
+ var _a$2;
975
+ var primitives$3 = (_a$2 = {},
976
+ _a$2[series.name] = series,
977
+ _a$2);
978
978
 
979
979
  var mergeTree = {
980
980
  name: "mergeTree",
@@ -1005,12 +1005,60 @@ var mergeTree = {
1005
1005
  }); },
1006
1006
  };
1007
1007
 
1008
+ var _a$1;
1009
+ var primitives$2 = (_a$1 = {},
1010
+ _a$1[mergeTree.name] = mergeTree,
1011
+ _a$1);
1012
+
1013
+ var groupAnd = {
1014
+ name: "groupAnd",
1015
+ label: "Group and",
1016
+ description: "Returns true if all of the items in a group are true",
1017
+ inputs: {
1018
+ tree: "boolean",
1019
+ },
1020
+ outputs: {
1021
+ result: "boolean",
1022
+ },
1023
+ impl: function (inputs) { return __awaiter(void 0, void 0, void 0, function () {
1024
+ return __generator(this, function (_a) {
1025
+ return [2 /*return*/, {
1026
+ result: mapTreeBranch(inputs.tree, function (branch) {
1027
+ return [branch.reduce(function (acc, val) { return acc && val; }, true)];
1028
+ }),
1029
+ }];
1030
+ });
1031
+ }); },
1032
+ };
1033
+
1034
+ var groupOr = {
1035
+ name: "groupOr",
1036
+ label: "Group or",
1037
+ description: "Returns true if any of the items in a group are true",
1038
+ inputs: {
1039
+ tree: "boolean",
1040
+ },
1041
+ outputs: {
1042
+ result: "boolean",
1043
+ },
1044
+ impl: function (inputs) { return __awaiter(void 0, void 0, void 0, function () {
1045
+ return __generator(this, function (_a) {
1046
+ return [2 /*return*/, {
1047
+ result: mapTreeBranch(inputs.tree, function (branch) {
1048
+ return [branch.reduce(function (acc, val) { return acc || val; }, false)];
1049
+ }),
1050
+ }];
1051
+ });
1052
+ }); },
1053
+ };
1054
+
1008
1055
  var _a;
1009
1056
  var primitives$1 = (_a = {},
1010
- _a[mergeTree.name] = mergeTree,
1057
+ _a[groupAnd.name] = groupAnd,
1058
+ _a[groupOr.name] = groupOr,
1011
1059
  _a);
1012
1060
 
1013
- var primitives = __assign(__assign(__assign(__assign(__assign({}, primitives$5), primitives$4), primitives$3), primitives$2), primitives$1);
1061
+ var primitives = __assign(__assign(__assign(__assign(__assign(__assign({}, primitives$6), primitives$5), primitives$4), primitives$3), primitives$2), primitives$1);
1014
1062
 
1015
1063
  function isPrimitive(node) {
1016
1064
  return node.impl !== undefined;
@@ -1168,6 +1216,7 @@ var Engine = /** @class */ (function () {
1168
1216
  params: params_1,
1169
1217
  executionId: executionId,
1170
1218
  context: context,
1219
+ result: result_1,
1171
1220
  startTime: startTime_1,
1172
1221
  endTime: endTime_1,
1173
1222
  duration: endTime_1 - startTime_1,
@@ -1186,10 +1235,12 @@ var Engine = /** @class */ (function () {
1186
1235
  params: params,
1187
1236
  executionId: executionId,
1188
1237
  context: context,
1238
+ result: result,
1189
1239
  startTime: startTime,
1190
1240
  endTime: endTime,
1191
1241
  duration: endTime - startTime,
1192
1242
  });
1243
+ // console.log("graph run done", result, context, endTime - startTime);
1193
1244
  return [2 /*return*/, result];
1194
1245
  }
1195
1246
  });
@@ -1301,11 +1352,12 @@ var Engine = /** @class */ (function () {
1301
1352
  }
1302
1353
  return [2 /*return*/, this.run(builtFn, inputs)];
1303
1354
  }
1304
- console.log("Engine running with inputs", inputs, interpolate(inputs, {}));
1305
1355
  mappedInputs = interpolate(inputs, {});
1356
+ console.log("Engine running with inputs", inputs, mappedInputs);
1306
1357
  return [4 /*yield*/, ((_a = node.impl) === null || _a === void 0 ? void 0 : _a.call(node, mappedInputs, {}))];
1307
1358
  case 1:
1308
1359
  result = _b.sent();
1360
+ console.log("Engine run complete", result);
1309
1361
  return [2 /*return*/, result];
1310
1362
  }
1311
1363
  });
@@ -1315,8 +1367,8 @@ var Engine = /** @class */ (function () {
1315
1367
  return this.fnIndex[name];
1316
1368
  };
1317
1369
  // node handlers
1318
- Engine.prototype.applyNodeDelete = function (fn, nodeIds) {
1319
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1370
+ Engine.prototype.applyNodeDelete = function (oldFn, nodeIds) {
1371
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1320
1372
  nodeIds.forEach(function (id) {
1321
1373
  delete newFn.body[id];
1322
1374
  });
@@ -1337,8 +1389,8 @@ var Engine = /** @class */ (function () {
1337
1389
  });
1338
1390
  return newFn;
1339
1391
  };
1340
- Engine.prototype.applyEdgeDelete = function (fn, fromNode, toNode, fromField, toField) {
1341
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1392
+ Engine.prototype.applyEdgeDelete = function (oldFn, fromNode, toNode, fromField, toField) {
1393
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1342
1394
  var from = newFn.body[fromNode];
1343
1395
  var to = newFn.body[toNode];
1344
1396
  if (!from || !to) {
@@ -1353,8 +1405,8 @@ var Engine = /** @class */ (function () {
1353
1405
  }
1354
1406
  return newFn;
1355
1407
  };
1356
- Engine.prototype.applyNodeAdd = function (fn, nodeName, callback) {
1357
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1408
+ Engine.prototype.applyNodeAdd = function (oldFn, nodeName, callback) {
1409
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1358
1410
  var id = uid$1();
1359
1411
  // ensure unique id
1360
1412
  while (newFn.body[id]) {
@@ -1387,10 +1439,10 @@ var Engine = /** @class */ (function () {
1387
1439
  callback === null || callback === void 0 ? void 0 : callback(newCall, id);
1388
1440
  return topSort(newFn);
1389
1441
  };
1390
- Engine.prototype.applyNodeConnect = function (fn, fromNode, toNode, fromField, toField) {
1391
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1442
+ Engine.prototype.applyNodeConnect = function (oldFn, fromNode, toNode, fromField, toField) {
1443
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1392
1444
  var from = newFn.body[fromNode];
1393
- var to = newFn.body[toNode];
1445
+ var to = __assign({}, newFn.body[toNode]);
1394
1446
  if (!from || !to) {
1395
1447
  console.warn("Invalid nodes for connection");
1396
1448
  return newFn;
@@ -1400,6 +1452,7 @@ var Engine = /** @class */ (function () {
1400
1452
  }
1401
1453
  // add the reference
1402
1454
  to.inputs[toField] = "<".concat(fromNode, ".").concat(fromField, ">");
1455
+ newFn.body[toNode] = to;
1403
1456
  return topSort(newFn);
1404
1457
  };
1405
1458
  return Engine;
@@ -1427,11 +1480,11 @@ function Control(_a) {
1427
1480
  }
1428
1481
  }
1429
1482
 
1430
- var styles = {"DefaultNode":"DefaultNode_R2P6c","selected":"selected_VmB-F","active":"active_zjUzx","Log":"Log_dsq5e","Label":"Label_wBwWA","Input":"Input_Yhvzf","Output":"Output_e4yF-","Table":"Table_aZyRT"};
1483
+ var styles = {"DefaultNode":"DefaultNode_R2P6c","selected":"selected_VmB-F","active":"active_zjUzx","Log":"Log_dsq5e","Label":"Label_wBwWA","Input":"Input_Yhvzf","Output":"Output_e4yF-","PreviewHead":"PreviewHead_oFT4K","expanded":"expanded_3vnbi","Preview":"Preview_HbkZ6","Table":"Table_aZyRT","GroupHead":"GroupHead_QJhST","GroupChildren":"GroupChildren_NKx-B","GroupLeaf":"GroupLeaf_eliT8"};
1431
1484
 
1432
1485
  var Input = function (_a) {
1433
1486
  var _b;
1434
- var name = _a.name, varDef = _a.varDef, id = _a.id, data = _a.data;
1487
+ var name = _a.name, varDef = _a.varDef, id = _a.id, data = _a.data, onClick = _a.onClick;
1435
1488
  var normalized = normalizeVarDef(varDef);
1436
1489
  var value = (_b = data.inputs) === null || _b === void 0 ? void 0 : _b[name];
1437
1490
  var isRef = isReference(value);
@@ -1443,16 +1496,16 @@ var Input = function (_a) {
1443
1496
  }; };
1444
1497
  return (React.createElement("tr", { key: name, className: classNames(styles.Input, styles["type-".concat(normalized.type)]), style: {
1445
1498
  "--type-color": "var(--color-".concat(normalized.type, ")"),
1446
- } },
1499
+ }, onClick: onClick },
1447
1500
  React.createElement("td", null,
1448
- varDef.label || name,
1501
+ normalized.label || name,
1449
1502
  React.createElement(react.Handle, { type: "target", position: react.Position.Left, id: "".concat(id, "-").concat(name) })),
1450
1503
  React.createElement("td", null, !isRef && (React.createElement(Control, { type: normalized.type, value: value, onChange: handleInputChange(name) })))));
1451
1504
  };
1452
1505
 
1453
1506
  var Param = function (_a) {
1454
1507
  var _b;
1455
- _a.id; var name = _a.name, varDef = _a.varDef, data = _a.data;
1508
+ _a.id; var name = _a.name, varDef = _a.varDef, data = _a.data, onClick = _a.onClick;
1456
1509
  var normalized = normalizeVarDef(varDef);
1457
1510
  var value = (_b = data.params) === null || _b === void 0 ? void 0 : _b[name];
1458
1511
  var isRef = isReference(value);
@@ -1464,19 +1517,20 @@ var Param = function (_a) {
1464
1517
  }; };
1465
1518
  return (React.createElement("tr", { key: name, className: classNames(styles.Input, styles["type-".concat(normalized.type)]), style: {
1466
1519
  "--type-color": "var(--color-".concat(normalized.type, ")"),
1467
- } },
1468
- React.createElement("td", null, varDef.label || name),
1520
+ }, onClick: onClick },
1521
+ React.createElement("td", null, normalized.label || name),
1469
1522
  React.createElement("td", null, !isRef && (React.createElement(Control, { type: normalized.type, options: normalized.options, value: value, onChange: handleParamChange(name) })))));
1470
1523
  };
1471
1524
 
1472
1525
  var Output = function (_a) {
1473
- var name = _a.name, varDef = _a.varDef, id = _a.id;
1526
+ var name = _a.name, varDef = _a.varDef, id = _a.id, onClick = _a.onClick, focus = _a.focus;
1474
1527
  var normalized = normalizeVarDef(varDef);
1475
1528
  return (React.createElement("tr", { key: name, className: classNames(styles.Output, styles["type-".concat(normalized.type)]), style: {
1476
1529
  "--type-color": "var(--color-".concat(normalized.type, ")"),
1477
- } },
1530
+ }, onClick: onClick },
1478
1531
  React.createElement("td", { colSpan: 2 },
1479
- varDef.label || name,
1532
+ focus && "👁 ",
1533
+ normalized.label || name,
1480
1534
  React.createElement(react.Handle, { type: "source", position: react.Position.Right, id: "".concat(id, "-").concat(name) }))));
1481
1535
  };
1482
1536
 
@@ -1519,24 +1573,110 @@ function NodeContainer(_a) {
1519
1573
  children));
1520
1574
  }
1521
1575
 
1576
+ function createTreeStructure(tree) {
1577
+ var keys = Object.keys(tree);
1578
+ var structure = [];
1579
+ keys.forEach(function (key) {
1580
+ var path = key.split(";");
1581
+ var parent = structure;
1582
+ for (var i = 0; i < path.length; i++) {
1583
+ var part = parseInt(path[i], 10);
1584
+ if (!parent[part]) {
1585
+ parent[part] = [];
1586
+ }
1587
+ parent = parent[part];
1588
+ }
1589
+ parent.push({ items: tree[key] });
1590
+ });
1591
+ return structure;
1592
+ }
1593
+ function TreeBranchView(_a) {
1594
+ var branch = _a.branch, name = _a.name;
1595
+ return (React.createElement("div", null,
1596
+ React.createElement("div", { className: styles.GroupHead },
1597
+ React.createElement("span", null,
1598
+ "group ",
1599
+ name)),
1600
+ React.createElement("div", { className: styles.GroupChildren }, branch.map(function (item, index) {
1601
+ // sub branch
1602
+ if (Array.isArray(item)) {
1603
+ return (React.createElement(TreeBranchView, { key: index, branch: item, name: "".concat(name, ";").concat(index) }));
1604
+ }
1605
+ // items
1606
+ return (React.createElement("div", { key: index }, item.items.map(function (it, i) {
1607
+ var _a;
1608
+ var label = (_a = it === null || it === void 0 ? void 0 : it.toString) === null || _a === void 0 ? void 0 : _a.call(it);
1609
+ if (label === "[object Object]") {
1610
+ label = "{...}";
1611
+ }
1612
+ return (React.createElement("div", { key: i, className: styles.GroupLeaf, title: JSON.stringify(it, null, 2) }, label));
1613
+ })));
1614
+ }))));
1615
+ }
1616
+ function TreeView(_a) {
1617
+ var value = _a.value;
1618
+ var structure = createTreeStructure(value || {});
1619
+ return (React.createElement("div", null, structure.map(function (branch, index) { return (React.createElement(TreeBranchView, { branch: branch, name: index })); })));
1620
+ }
1621
+ var Log = React.memo(function (_a) {
1622
+ var id = _a.id, data = _a.data, selected = _a.selected;
1623
+ var engine = useEngine();
1624
+ var _b = __read(React.useState(null), 2), value = _b[0], setValue = _b[1];
1625
+ React.useEffect(function () {
1626
+ return engine.subscribe("functionResult", function (event) {
1627
+ var _a;
1628
+ if (event.name === id) {
1629
+ setValue(((_a = event.context.scope[id]) === null || _a === void 0 ? void 0 : _a.data) || null);
1630
+ }
1631
+ });
1632
+ }, []);
1633
+ return (React.createElement(NodeContainer, { id: id, label: data.name, selected: selected, className: styles.Log },
1634
+ React.createElement(TreeView, { value: value }),
1635
+ React.createElement(react.Handle, { type: "target", position: react.Position.Left, id: "".concat(id, "-data") }),
1636
+ React.createElement(react.Handle, { type: "source", position: react.Position.Right, id: "".concat(id, "-data") })));
1637
+ });
1638
+ Log.displayName = "LogNode";
1639
+
1522
1640
  function GenericNode(_a) {
1641
+ var _b;
1642
+ var _c;
1523
1643
  var id = _a.id, data = _a.data, selected = _a.selected, inputs = _a.inputs, outputs = _a.outputs, params = _a.params, children = _a.children;
1644
+ var inputEntries = Object.entries(inputs || data.inputDefs || {});
1645
+ var outputEntries = Object.entries(outputs || data.outputDefs || {});
1646
+ var paramEntries = Object.entries(params || data.paramDefs || {});
1647
+ var engine = useEngine();
1648
+ var _d = __read(React.useState({}), 2), result = _d[0], setResult = _d[1];
1649
+ var _e = __read(React.useState(((_c = outputEntries[0]) === null || _c === void 0 ? void 0 : _c[0]) || null), 2), focus = _e[0], setFocus = _e[1];
1650
+ var _f = __read(React.useState(false), 2), showPreview = _f[0], setShowPreview = _f[1];
1651
+ var previewValue = focus ? result[focus] : Object.values(result)[0];
1652
+ React.useEffect(function () {
1653
+ return engine.subscribe("functionResult", function (event) {
1654
+ if (event.name === id) {
1655
+ setResult(event.result || {});
1656
+ }
1657
+ });
1658
+ }, []);
1524
1659
  return (React.createElement(NodeContainer, { label: data.name, selected: selected, id: id },
1525
1660
  children,
1526
1661
  React.createElement("table", null,
1527
1662
  React.createElement("tbody", null,
1528
- Object.entries(outputs || data.outputDefs || {}).map(function (_a) {
1663
+ outputEntries.map(function (_a) {
1529
1664
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1530
- return (React.createElement(Output, { key: name, name: name, varDef: varDef, id: id }));
1665
+ return (React.createElement(Output, { key: name, name: name, varDef: varDef, id: id, onClick: function () { return setFocus(name); }, focus: showPreview && focus === name }));
1531
1666
  }),
1532
- Object.entries(inputs || data.inputDefs || {}).map(function (_a) {
1667
+ inputEntries.map(function (_a) {
1533
1668
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1534
1669
  return (React.createElement(Input, { key: name, name: name, varDef: varDef, id: id, data: data }));
1535
1670
  }),
1536
- Object.entries(params || data.paramDefs || {}).map(function (_a) {
1671
+ paramEntries.map(function (_a) {
1537
1672
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1538
1673
  return (React.createElement(Param, { key: name, name: name, varDef: varDef, id: id, data: data }));
1539
- })))));
1674
+ }))),
1675
+ React.createElement("div", { className: classNames(styles.PreviewHead, (_b = {},
1676
+ _b[styles.expanded] = showPreview,
1677
+ _b)), onClick: function () { return setShowPreview(!showPreview); } }, "Preview"),
1678
+ showPreview && (React.createElement("div", { className: styles.Preview },
1679
+ React.createElement(TreeView, { value: previewValue })))));
1540
1680
  }
1541
1681
 
1542
1682
  var math = mathjs.create(mathjs.all, {});
@@ -1580,38 +1720,6 @@ var Default = React.memo(function (_a) {
1580
1720
  });
1581
1721
  Default.displayName = "DefaultNode";
1582
1722
 
1583
- var Log = React.memo(function (_a) {
1584
- var id = _a.id, data = _a.data, selected = _a.selected;
1585
- var engine = useEngine();
1586
- var _b = __read(React.useState(null), 2), value = _b[0], setValue = _b[1];
1587
- React.useEffect(function () {
1588
- return engine.subscribe("functionResult", function (event) {
1589
- var _a;
1590
- if (event.name === id) {
1591
- setValue(((_a = event.context.scope[id]) === null || _a === void 0 ? void 0 : _a.data) || null);
1592
- }
1593
- });
1594
- }, []);
1595
- return (React.createElement(NodeContainer, { id: id, label: data.name, selected: selected, className: styles.Log },
1596
- React.createElement("div", { className: styles.Table },
1597
- React.createElement("table", null, Object.entries(value || {}).map(function (_a) {
1598
- var _b = __read(_a, 2), key = _b[0], val = _b[1];
1599
- return (React.createElement(React.Fragment, { key: key },
1600
- React.createElement("tbody", null,
1601
- React.createElement("tr", null,
1602
- React.createElement("th", { colSpan: 2 }, "{".concat(key, "}"))),
1603
- val.map(function (item, index) {
1604
- var _a;
1605
- return (React.createElement("tr", { key: "".concat(key, "-").concat(index) },
1606
- React.createElement("td", null, index),
1607
- React.createElement("td", { title: JSON.stringify(item, null, 2) }, (_a = item === null || item === void 0 ? void 0 : item.toString) === null || _a === void 0 ? void 0 : _a.call(item))));
1608
- }))));
1609
- }))),
1610
- React.createElement(react.Handle, { type: "target", position: react.Position.Left, id: "".concat(id, "-data") }),
1611
- React.createElement(react.Handle, { type: "source", position: react.Position.Right, id: "".concat(id, "-data") })));
1612
- });
1613
- Log.displayName = "LogNode";
1614
-
1615
1723
  function uid() {
1616
1724
  return Math.random().toString(36).substring(2, 15);
1617
1725
  }
@@ -1658,12 +1766,21 @@ var variableStore = zustand.create(function (set, get, api) {
1658
1766
  },
1659
1767
  setVar: function (scope, name, value, persist) {
1660
1768
  var _a, _b;
1769
+ var key = "".concat(scope, "|").concat(name);
1661
1770
  if (persist) {
1662
- var data = __assign(__assign({}, pget().data), (_a = {}, _a["".concat(scope, "|").concat(name)] = value, _a));
1771
+ var oldData = pget().data;
1772
+ var newValue = typeof value === "function"
1773
+ ? value(oldData[key])
1774
+ : value;
1775
+ var data = __assign(__assign({}, oldData), (_a = {}, _a[key] = newValue, _a));
1663
1776
  pset({ data: data });
1664
1777
  }
1665
1778
  else {
1666
- var data = __assign(__assign({}, get().data), (_b = {}, _b["".concat(scope, "|").concat(name)] = value, _b));
1779
+ var oldData = get().data;
1780
+ var newValue = typeof value === "function"
1781
+ ? value(oldData[key])
1782
+ : value;
1783
+ var data = __assign(__assign({}, oldData), (_b = {}, _b[key] = newValue, _b));
1667
1784
  set({ data: data });
1668
1785
  }
1669
1786
  },
@@ -1699,96 +1816,172 @@ function usePositions(fn) {
1699
1816
  function useUpdatePositions(fn) {
1700
1817
  var _a = __read(usePositions(fn), 2), positions = _a[0], setPositions = _a[1];
1701
1818
  return React.useCallback(function (id, position) {
1702
- var _a;
1703
- setPositions(__assign(__assign({}, positions), (_a = {}, _a[id] = position, _a)));
1819
+ positions[id] = position;
1820
+ setPositions(positions);
1704
1821
  }, [positions, setPositions]);
1705
1822
  }
1706
1823
 
1707
- function createGraph(fn, engine, positions, options) {
1708
- var nodes = [];
1709
- var edges = [];
1710
- var handleChange = function (id) { return function (newData) {
1711
- var _a;
1712
- // console.log("handleChange", id, newData);
1713
- options === null || options === void 0 ? void 0 : options.setNodes(function (nds) {
1714
- return nds.map(function (node) {
1715
- if (node.id === id) {
1716
- // console.log("update node", id, newData);
1717
- return __assign(__assign({}, node), { data: __assign(__assign({}, node.data), newData) });
1718
- }
1719
- return node;
1824
+ // helpers
1825
+ function updateNodeArguments(node, inputs, params) {
1826
+ return __assign(__assign({}, node), { data: __assign(__assign({}, node.data), { inputs: inputs, params: params }) });
1827
+ }
1828
+ /**
1829
+ * flow state stores nodes and edges for the flow graph these can be updated when the function changes
1830
+ * using setFn
1831
+ */
1832
+ var useFlowState = zustand.create(function (set, get) { return ({
1833
+ engine: null,
1834
+ fn: null,
1835
+ options: {},
1836
+ nodes: [],
1837
+ edges: [],
1838
+ setNodes: function (updater) {
1839
+ set(function (state) { return ({ nodes: updater(state.nodes) }); });
1840
+ },
1841
+ setEdges: function (updater) {
1842
+ set(function (state) { return ({ edges: updater(state.edges) }); });
1843
+ },
1844
+ setFn: function (fn) {
1845
+ // console.log("setFn", fn);
1846
+ var _a = get(), oldFn = _a.fn, nodes = _a.nodes, edges = _a.edges, engine = _a.engine, options = _a.options;
1847
+ // update the graph by shallow comparison
1848
+ if (!engine) {
1849
+ throw new Error("Engine not set");
1850
+ }
1851
+ var oldKeys = Object.keys((oldFn === null || oldFn === void 0 ? void 0 : oldFn.body) || {});
1852
+ var newKeys = Object.keys(fn.body || {});
1853
+ // remove all the nodes that were removed
1854
+ nodes = nodes === null || nodes === void 0 ? void 0 : nodes.filter(function (node) { return newKeys.includes(node.id); });
1855
+ // remove all the edges that were removed
1856
+ edges = edges === null || edges === void 0 ? void 0 : edges.filter(function (edge) {
1857
+ return (newKeys.includes(edge.source) && newKeys.includes(edge.target));
1858
+ });
1859
+ // create the new nodes that were added
1860
+ var addedKeys = newKeys.filter(function (key) { return !oldKeys.includes(key); });
1861
+ addedKeys.forEach(function (key, index) {
1862
+ var _a;
1863
+ var fncall = (_a = fn.body) === null || _a === void 0 ? void 0 : _a[key];
1864
+ // add the node
1865
+ nodes.push(createNode(engine, key, fncall, options));
1866
+ // add edges
1867
+ var refs = getReferences(fncall.inputs || {});
1868
+ refs.forEach(function (ref) {
1869
+ edges.push(createEdge(key, ref));
1720
1870
  });
1721
1871
  });
1722
- // update the function definition
1723
- var body = __assign({}, fn.body);
1724
- var fncall = __assign(__assign({}, (body[id] || {})), newData);
1725
- body[id] = fncall;
1726
- var updatedFn = __assign(__assign({}, fn), { body: body });
1727
- (_a = options === null || options === void 0 ? void 0 : options.onChange) === null || _a === void 0 ? void 0 : _a.call(options, updatedFn);
1728
- // console.log("updated call", fncall);
1729
- }; };
1730
- Object.entries(fn.body || {}).forEach(function (_a, index) {
1731
- var _b = __read(_a, 2), id = _b[0], fncall = _b[1];
1732
- var calledFn = engine.getFunction(fncall.name);
1733
- // create a node for each function call
1734
- nodes.push({
1735
- id: id,
1736
- data: {
1737
- name: fncall.name,
1738
- caller: fn,
1739
- inputs: fncall.inputs,
1740
- params: fncall.params,
1741
- inputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.inputs) || {},
1742
- paramDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.params) || {},
1743
- outputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.outputs) || {},
1744
- onChange: handleChange(id),
1745
- },
1746
- position: (positions === null || positions === void 0 ? void 0 : positions[id]) || { x: 250 * index, y: 0 },
1747
- dragHandle: options === null || options === void 0 ? void 0 : options.dragHandle,
1748
- type: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.nodeType) || "Default",
1872
+ // update the changed nodes
1873
+ var changedKeys = newKeys.filter(function (key) {
1874
+ var _a, _b;
1875
+ // shallow comparison
1876
+ return ((_a = fn.body) === null || _a === void 0 ? void 0 : _a[key]) !== ((_b = oldFn === null || oldFn === void 0 ? void 0 : oldFn.body) === null || _b === void 0 ? void 0 : _b[key]);
1749
1877
  });
1750
- var refs = getReferences(fncall.inputs || {});
1751
- refs.forEach(function (ref) {
1752
- // create an edge for each reference
1753
- edges.push({
1754
- id: "".concat(ref.path, "-").concat(id, ".").concat(ref.name),
1755
- source: ref.refNode,
1756
- target: id,
1757
- sourceHandle: "".concat(ref.refNode, "-").concat(ref.refField),
1758
- targetHandle: "".concat(id, "-").concat(ref.name),
1878
+ // console.log("changed keys", changedKeys);
1879
+ changedKeys.forEach(function (key) {
1880
+ var _a;
1881
+ // update the nodes that were changed
1882
+ var fncall = (_a = fn.body) === null || _a === void 0 ? void 0 : _a[key];
1883
+ nodes = nodes === null || nodes === void 0 ? void 0 : nodes.map(function (n) {
1884
+ if (n.id === key) {
1885
+ return updateNodeArguments(n, fncall.inputs, fncall.params);
1886
+ }
1887
+ return n;
1888
+ });
1889
+ // update incoming edges
1890
+ var refs = getReferences(fncall.inputs || {});
1891
+ // remove all incoming edges
1892
+ edges = edges === null || edges === void 0 ? void 0 : edges.filter(function (e) { return e.target !== key; });
1893
+ // add the edge
1894
+ refs.forEach(function (ref) {
1895
+ edges.push(createEdge(key, ref));
1759
1896
  });
1760
1897
  });
1761
- });
1762
- return { nodes: nodes, edges: edges };
1763
- }
1898
+ // console.log("final graph", nodes, edges);
1899
+ // update the function, nodes and edges
1900
+ set({ fn: fn, nodes: nodes, edges: edges });
1901
+ },
1902
+ init: function (fn, engine, options) {
1903
+ // console.log("initing");
1904
+ set({ engine: engine, options: options });
1905
+ get().setFn(fn);
1906
+ },
1907
+ }); });
1908
+ /**
1909
+ * creates a flow state and provides handlers to update nodes and edges
1910
+ */
1764
1911
  function useFlow(fn, engine, options) {
1765
- var _a = __read(usePositions(fn), 1), positions = _a[0];
1912
+ var state = useFlowState();
1766
1913
  React.useEffect(function () {
1767
- var _a = createGraph(fn, engine, positions, options), nodes = _a.nodes, edges = _a.edges;
1768
- options.setNodes(nodes);
1769
- options.setEdges(edges);
1914
+ state.init(fn, engine, options);
1770
1915
  }, [engine]);
1916
+ React.useEffect(function () {
1917
+ state.setFn(fn);
1918
+ }, [fn]);
1919
+ return React.useMemo(function () { return ({
1920
+ nodes: state.nodes,
1921
+ edges: state.edges,
1922
+ setNodes: state.setNodes,
1923
+ setEdges: state.setEdges,
1924
+ }); }, [state]);
1925
+ }
1926
+ function createNode(engine, id, fncall, options) {
1927
+ var _a, _b;
1928
+ var calledFn = engine.getFunction(fncall.name);
1929
+ // create a node for each function call
1930
+ return {
1931
+ id: id,
1932
+ data: {
1933
+ name: fncall.name,
1934
+ inputs: fncall.inputs,
1935
+ params: fncall.params,
1936
+ inputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.inputs) || {},
1937
+ paramDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.params) || {},
1938
+ outputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.outputs) || {},
1939
+ onChange: ((_a = options.onDataChange) === null || _a === void 0 ? void 0 : _a.call(options, id)) || (function () { }),
1940
+ },
1941
+ position: ((_b = options.positions) === null || _b === void 0 ? void 0 : _b[id]) || { x: 0, y: 0 },
1942
+ dragHandle: options.dragHandle,
1943
+ type: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.nodeType) || "Default",
1944
+ };
1945
+ }
1946
+ function createEdge(nodeId, ref) {
1947
+ return {
1948
+ id: "".concat(ref.path, "-").concat(nodeId, ".").concat(ref.name),
1949
+ source: ref.refNode,
1950
+ target: nodeId,
1951
+ sourceHandle: "".concat(ref.refNode, "-").concat(ref.refField),
1952
+ targetHandle: "".concat(nodeId, "-").concat(ref.name),
1953
+ };
1771
1954
  }
1772
1955
 
1773
1956
  function FlowInner(_a) {
1774
1957
  var fn = _a.function, engine = _a.engine, onChange = _a.onChange, onClick = _a.onClick, onSelect = _a.onSelect;
1775
1958
  var _b = __read(React.useState(null), 2), instance = _b[0], setInstance = _b[1];
1776
- var updatePositions = useUpdatePositions(fn);
1777
- var _c = __read(react.useNodesState([]), 3), nodes = _c[0], setNodes = _c[1], onNodesChange = _c[2];
1778
- var _d = __read(react.useEdgesState([]), 3), edges = _d[0], setEdges = _d[1], onEdgesChange = _d[2];
1779
- useFlow(fn, engine, {
1959
+ var updatePosition = useUpdatePositions(fn);
1960
+ var _c = __read(usePositions(fn), 1), positions = _c[0];
1961
+ var handleDataChange = function (id) { return function (newData) {
1962
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1963
+ // update the function definition
1964
+ // console.log("before fn call update", Object.keys(fn.body));
1965
+ var body = __assign({}, fn.body);
1966
+ var fncall = __assign(__assign({}, (body[id] || {})), newData);
1967
+ body[id] = fncall;
1968
+ // console.log("after fn call update", Object.keys(body));
1969
+ var updatedFn = __assign(__assign({}, fn), { body: body });
1970
+ return updatedFn;
1971
+ });
1972
+ }; };
1973
+ var _d = useFlow(fn, engine, {
1780
1974
  dragHandle: ".".concat(styles.Label),
1781
- setNodes: setNodes,
1782
- setEdges: setEdges,
1783
- onChange: onChange,
1784
- });
1975
+ positions: positions,
1976
+ onDataChange: handleDataChange,
1977
+ }), nodes = _d.nodes, edges = _d.edges, setNodes = _d.setNodes, setEdges = _d.setEdges;
1785
1978
  // node selection handler
1786
- var handleChange = React.useCallback(function (_a) {
1979
+ var handleSelect = React.useCallback(function (_a) {
1787
1980
  var nodes = _a.nodes;
1788
1981
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(nodes.map(function (n) { return n.id; }) || []);
1789
1982
  }, [onSelect]);
1790
1983
  react.useOnSelectionChange({
1791
- onChange: handleChange,
1984
+ onChange: handleSelect,
1792
1985
  });
1793
1986
  // dropping nodes
1794
1987
  var _e = __read(reactDnd.useDrop({
@@ -1797,10 +1990,13 @@ function FlowInner(_a) {
1797
1990
  var pos = monitor.getClientOffset();
1798
1991
  if (instance && pos) {
1799
1992
  var position_1 = instance.screenToFlowPosition(pos);
1800
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeAdd(fn, item.name, function (fnCall, id) {
1801
- console.log("node added", id, position_1);
1802
- updatePositions(id, position_1);
1803
- }));
1993
+ // console.log("handle drop", position);
1994
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1995
+ return engine.applyNodeAdd(fn, item.name, function (fnCall, id) {
1996
+ // console.log("node added", id, position);
1997
+ updatePosition(id, position_1);
1998
+ });
1999
+ });
1804
2000
  }
1805
2001
  },
1806
2002
  collect: function (monitor) {
@@ -1809,8 +2005,7 @@ function FlowInner(_a) {
1809
2005
  };
1810
2006
  },
1811
2007
  }), 2); _e[0].isOver; var drop = _e[1];
1812
- // useLayoutNodes();
1813
- var updatePosition = useUpdatePositions(fn);
2008
+ // connecting nodes
1814
2009
  var onConnect = React.useCallback(function (params) {
1815
2010
  var _a, _b;
1816
2011
  var sourceField = (_a = params.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
@@ -1819,37 +2014,34 @@ function FlowInner(_a) {
1819
2014
  console.warn("Invalid connection handles", params);
1820
2015
  return;
1821
2016
  }
1822
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeConnect(fn, params.source, params.target, sourceField, targetField));
1823
- setEdges(function (edgesSnapshot) { return react.addEdge(params, edgesSnapshot); });
1824
- }, [setEdges, fn, onChange]);
1825
- var onNodesDelete = React.useCallback(function (nodesToDelete) {
1826
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeDelete(fn, nodesToDelete.map(function (n) { return n.id; })));
1827
- setNodes(function (nodesSnapshot) {
1828
- return nodesSnapshot.filter(function (node) { return !nodesToDelete.some(function (n) { return n.id === node.id; }); });
2017
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
2018
+ return engine.applyNodeConnect(fn, params.source, params.target, sourceField, targetField);
1829
2019
  });
1830
- setEdges(function (edgesSnapshot) {
1831
- return edgesSnapshot.filter(function (edge) {
1832
- return !nodesToDelete.some(function (n) { return n.id === edge.source || n.id === edge.target; });
1833
- });
2020
+ }, [fn, onChange]);
2021
+ // deleting nodes
2022
+ var onNodesDelete = React.useCallback(function (nodesToDelete) {
2023
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
2024
+ return engine.applyNodeDelete(fn, nodesToDelete.map(function (n) { return n.id; }));
1834
2025
  });
1835
- }, [setNodes, setEdges, onChange, fn]);
2026
+ }, [onChange, fn]);
2027
+ // deleting edges
1836
2028
  var onEdgesDelete = React.useCallback(function (edgesToDelete) {
1837
- var newFn = fn;
1838
- edgesToDelete.forEach(function (edge) {
1839
- var _a, _b;
1840
- var sourceField = (_a = edge.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
1841
- var targetField = (_b = edge.targetHandle) === null || _b === void 0 ? void 0 : _b.split("-")[1];
1842
- if (!sourceField || !targetField) {
1843
- console.warn("Invalid connection handles", edge);
1844
- return;
1845
- }
1846
- newFn = engine.applyEdgeDelete(newFn, edge.source, edge.target, sourceField, targetField);
1847
- });
1848
- onChange === null || onChange === void 0 ? void 0 : onChange(newFn);
1849
- setEdges(function (edgesSnapshot) {
1850
- return edgesSnapshot.filter(function (edge) { return !edgesToDelete.some(function (e) { return e.id === edge.id; }); });
2029
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
2030
+ var newFn = fn;
2031
+ edgesToDelete.forEach(function (edge) {
2032
+ var _a, _b;
2033
+ var sourceField = (_a = edge.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
2034
+ var targetField = (_b = edge.targetHandle) === null || _b === void 0 ? void 0 : _b.split("-")[1];
2035
+ if (!sourceField || !targetField) {
2036
+ console.warn("Invalid connection handles", edge);
2037
+ return;
2038
+ }
2039
+ newFn = engine.applyEdgeDelete(newFn, edge.source, edge.target, sourceField, targetField);
2040
+ });
2041
+ return newFn;
1851
2042
  });
1852
- }, [setEdges, onChange, fn]);
2043
+ }, [onChange, fn]);
2044
+ // handle canvas clicks to be able to place nodes
1853
2045
  var handleClick = function (e) {
1854
2046
  if (instance) {
1855
2047
  var position = instance.screenToFlowPosition({
@@ -1859,9 +2051,19 @@ function FlowInner(_a) {
1859
2051
  onClick === null || onClick === void 0 ? void 0 : onClick(e, position);
1860
2052
  }
1861
2053
  };
2054
+ var onNodesChange = React.useCallback(function (changes) {
2055
+ return setNodes(function (nodesSnapshot) {
2056
+ return react.applyNodeChanges(changes, nodesSnapshot);
2057
+ });
2058
+ }, []);
2059
+ var onEdgesChange = React.useCallback(function (changes) {
2060
+ return setEdges(function (edgesSnapshot) {
2061
+ return react.applyEdgeChanges(changes, edgesSnapshot);
2062
+ });
2063
+ }, []);
1862
2064
  return (React.createElement(react.ReactFlow, { ref: drop, nodes: nodes, edges: edges, nodeTypes: nodeTypes, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onNodeDragStop: function (e, n) { return updatePosition(n.id, n.position); }, onConnect: onConnect, onInit: setInstance, onPaneClick: handleClick, fitView: true,
1863
2065
  // panOnDrag={false}
1864
- selectionOnDrag: true, minZoom: 0.1, deleteKeyCode: "Delete" },
2066
+ selectionOnDrag: true, minZoom: 0.1, maxZoom: 4, deleteKeyCode: "Delete" },
1865
2067
  React.createElement(react.Background, { color: "#ccc", variant: react.BackgroundVariant.Dots }),
1866
2068
  React.createElement(react.Controls, null)));
1867
2069
  }
@@ -1928,7 +2130,6 @@ exports.Flow = Flow;
1928
2130
  exports.binaryOnTree = binaryOnTree;
1929
2131
  exports.binaryOnTreeBranch = binaryOnTreeBranch;
1930
2132
  exports.broadCast = broadCast;
1931
- exports.createGraph = createGraph;
1932
2133
  exports.expandTree = expandTree;
1933
2134
  exports.getBranch = getBranch;
1934
2135
  exports.getReferences = getReferences;