@rkmodules/rules 0.0.24 → 0.0.26

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
@@ -1,14 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var mathjs = require('mathjs');
4
- var react = require('@xyflow/react');
5
- var useInner = require('@rkmodules/use-inner');
6
4
  var React = require('react');
5
+ var react = require('@xyflow/react');
6
+ var reactDnd = require('react-dnd');
7
7
  var katex = require('katex');
8
8
  var classNames = require('classnames');
9
9
  var zustand = require('zustand');
10
10
  var middleware = require('zustand/middleware');
11
- var reactDnd = require('react-dnd');
12
11
 
13
12
  /******************************************************************************
14
13
  Copyright (c) Microsoft Corporation.
@@ -875,7 +874,7 @@ var listItem = {
875
874
  // return indices.map((i) => branch[i]);
876
875
  // }
877
876
  // }),
878
- item: binaryOnTreeBranch(inputs.list, inputs.index, function (branch, indices) {
877
+ item: binaryOnTreeBranch(inputs.list || {}, inputs.index || {}, function (branch, indices) {
879
878
  if (indices) {
880
879
  return indices.map(function (i) { return branch[i]; });
881
880
  }
@@ -1173,6 +1172,7 @@ var Engine = /** @class */ (function () {
1173
1172
  endTime: endTime_1,
1174
1173
  duration: endTime_1 - startTime_1,
1175
1174
  });
1175
+ console.log("functionReult", name_1, inputs_1, params_1, result_1);
1176
1176
  _e.label = 4;
1177
1177
  case 4:
1178
1178
  _i++;
@@ -1191,6 +1191,7 @@ var Engine = /** @class */ (function () {
1191
1191
  endTime: endTime,
1192
1192
  duration: endTime - startTime,
1193
1193
  });
1194
+ console.log("graph run done", result, context, endTime - startTime);
1194
1195
  return [2 /*return*/, result];
1195
1196
  }
1196
1197
  });
@@ -1302,11 +1303,12 @@ var Engine = /** @class */ (function () {
1302
1303
  }
1303
1304
  return [2 /*return*/, this.run(builtFn, inputs)];
1304
1305
  }
1305
- console.log("Engine running with inputs", inputs, interpolate(inputs, {}));
1306
1306
  mappedInputs = interpolate(inputs, {});
1307
+ console.log("Engine running with inputs", inputs, mappedInputs);
1307
1308
  return [4 /*yield*/, ((_a = node.impl) === null || _a === void 0 ? void 0 : _a.call(node, mappedInputs, {}))];
1308
1309
  case 1:
1309
1310
  result = _b.sent();
1311
+ console.log("Engine run complete", result);
1310
1312
  return [2 /*return*/, result];
1311
1313
  }
1312
1314
  });
@@ -1316,8 +1318,8 @@ var Engine = /** @class */ (function () {
1316
1318
  return this.fnIndex[name];
1317
1319
  };
1318
1320
  // node handlers
1319
- Engine.prototype.applyNodeDelete = function (fn, nodeIds) {
1320
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1321
+ Engine.prototype.applyNodeDelete = function (oldFn, nodeIds) {
1322
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1321
1323
  nodeIds.forEach(function (id) {
1322
1324
  delete newFn.body[id];
1323
1325
  });
@@ -1338,8 +1340,8 @@ var Engine = /** @class */ (function () {
1338
1340
  });
1339
1341
  return newFn;
1340
1342
  };
1341
- Engine.prototype.applyEdgeDelete = function (fn, fromNode, toNode, fromField, toField) {
1342
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1343
+ Engine.prototype.applyEdgeDelete = function (oldFn, fromNode, toNode, fromField, toField) {
1344
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1343
1345
  var from = newFn.body[fromNode];
1344
1346
  var to = newFn.body[toNode];
1345
1347
  if (!from || !to) {
@@ -1354,8 +1356,8 @@ var Engine = /** @class */ (function () {
1354
1356
  }
1355
1357
  return newFn;
1356
1358
  };
1357
- Engine.prototype.applyNodeAdd = function (fn, nodeName, callback) {
1358
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1359
+ Engine.prototype.applyNodeAdd = function (oldFn, nodeName, callback) {
1360
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1359
1361
  var id = uid$1();
1360
1362
  // ensure unique id
1361
1363
  while (newFn.body[id]) {
@@ -1388,10 +1390,10 @@ var Engine = /** @class */ (function () {
1388
1390
  callback === null || callback === void 0 ? void 0 : callback(newCall, id);
1389
1391
  return topSort(newFn);
1390
1392
  };
1391
- Engine.prototype.applyNodeConnect = function (fn, fromNode, toNode, fromField, toField) {
1392
- var newFn = __assign(__assign({}, fn), { body: __assign({}, fn.body) });
1393
+ Engine.prototype.applyNodeConnect = function (oldFn, fromNode, toNode, fromField, toField) {
1394
+ var newFn = __assign(__assign({}, oldFn), { body: __assign({}, oldFn.body) });
1393
1395
  var from = newFn.body[fromNode];
1394
- var to = newFn.body[toNode];
1396
+ var to = __assign({}, newFn.body[toNode]);
1395
1397
  if (!from || !to) {
1396
1398
  console.warn("Invalid nodes for connection");
1397
1399
  return newFn;
@@ -1401,54 +1403,12 @@ var Engine = /** @class */ (function () {
1401
1403
  }
1402
1404
  // add the reference
1403
1405
  to.inputs[toField] = "<".concat(fromNode, ".").concat(fromField, ">");
1406
+ newFn.body[toNode] = to;
1404
1407
  return topSort(newFn);
1405
1408
  };
1406
1409
  return Engine;
1407
1410
  }());
1408
1411
 
1409
- var dummyEngine = new Engine();
1410
- var EngineContext = React.createContext(dummyEngine);
1411
- var useEngine = function () {
1412
- return React.useContext(EngineContext);
1413
- };
1414
- var ChangeContext = React.createContext(function () { });
1415
- var useChange = function () {
1416
- return React.useContext(ChangeContext);
1417
- };
1418
-
1419
- 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"};
1420
-
1421
- function NodeContainer(_a) {
1422
- var _b;
1423
- var id = _a.id, label = _a.label, className = _a.className, selected = _a.selected, children = _a.children;
1424
- var engine = useEngine();
1425
- var _c = __read(React.useState(false), 2), active = _c[0], setActive = _c[1];
1426
- React.useEffect(function () {
1427
- if (!id)
1428
- return;
1429
- var removeOnCall = engine.subscribe("functionCall", function (event) {
1430
- if (event.name === id) {
1431
- setActive(true);
1432
- }
1433
- });
1434
- var removeOnResult = engine.subscribe("functionResult", function (event) {
1435
- if (event.name === id) {
1436
- setTimeout(function () { return setActive(false); }, Math.max(0, 1000 - (event.duration || 0)));
1437
- }
1438
- });
1439
- return function () {
1440
- removeOnCall();
1441
- removeOnResult();
1442
- };
1443
- }, [id]);
1444
- return (React.createElement("div", { className: classNames(className, styles.DefaultNode, (_b = {},
1445
- _b[styles.selected] = selected,
1446
- _b[styles.active] = active,
1447
- _b)) },
1448
- React.createElement("div", { className: styles.Label }, label),
1449
- children));
1450
- }
1451
-
1452
1412
  function Control(_a) {
1453
1413
  var value = _a.value, type = _a.type, options = _a.options, onChange = _a.onChange;
1454
1414
  if (options) {
@@ -1471,21 +1431,19 @@ function Control(_a) {
1471
1431
  }
1472
1432
  }
1473
1433
 
1434
+ 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"};
1435
+
1474
1436
  var Input = function (_a) {
1475
1437
  var _b;
1476
- var name = _a.name, varDef = _a.varDef, id = _a.id, data = _a.data, onChange = _a.onChange;
1438
+ var name = _a.name, varDef = _a.varDef, id = _a.id, data = _a.data;
1477
1439
  var normalized = normalizeVarDef(varDef);
1478
1440
  var value = (_b = data.inputs) === null || _b === void 0 ? void 0 : _b[name];
1479
1441
  var isRef = isReference(value);
1480
1442
  var handleInputChange = function (param) { return function (value) {
1481
1443
  var _a;
1482
- // Update the function instance with the new input value
1483
- var body = __assign({}, data.caller.body);
1484
- var call = __assign({}, (body[id] || {}));
1485
- call.inputs = __assign(__assign({}, call.inputs), (_a = {}, _a[param] = value, _a));
1486
- body[id] = call;
1487
- var updatedFn = __assign(__assign({}, data.caller), { body: body });
1488
- onChange(updatedFn);
1444
+ data.onChange({
1445
+ inputs: __assign(__assign({}, data.inputs), (_a = {}, _a[param] = value, _a)),
1446
+ });
1489
1447
  }; };
1490
1448
  return (React.createElement("tr", { key: name, className: classNames(styles.Input, styles["type-".concat(normalized.type)]), style: {
1491
1449
  "--type-color": "var(--color-".concat(normalized.type, ")"),
@@ -1498,19 +1456,15 @@ var Input = function (_a) {
1498
1456
 
1499
1457
  var Param = function (_a) {
1500
1458
  var _b;
1501
- var id = _a.id, name = _a.name, varDef = _a.varDef, data = _a.data, onChange = _a.onChange;
1459
+ _a.id; var name = _a.name, varDef = _a.varDef, data = _a.data;
1502
1460
  var normalized = normalizeVarDef(varDef);
1503
1461
  var value = (_b = data.params) === null || _b === void 0 ? void 0 : _b[name];
1504
1462
  var isRef = isReference(value);
1505
1463
  var handleParamChange = function (param) { return function (value) {
1506
1464
  var _a;
1507
- // Update the function instance with the new param value
1508
- var body = __assign({}, data.caller.body);
1509
- var call = __assign({}, (body[id] || {}));
1510
- call.params = __assign(__assign({}, call.params), (_a = {}, _a[param] = value, _a));
1511
- body[id] = call;
1512
- var updatedFn = __assign(__assign({}, data.caller), { body: body });
1513
- onChange(updatedFn);
1465
+ data.onChange({
1466
+ params: __assign(__assign({}, data.params), (_a = {}, _a[param] = value, _a)),
1467
+ });
1514
1468
  }; };
1515
1469
  return (React.createElement("tr", { key: name, className: classNames(styles.Input, styles["type-".concat(normalized.type)]), style: {
1516
1470
  "--type-color": "var(--color-".concat(normalized.type, ")"),
@@ -1530,23 +1484,62 @@ var Output = function (_a) {
1530
1484
  React.createElement(react.Handle, { type: "source", position: react.Position.Right, id: "".concat(id, "-").concat(name) }))));
1531
1485
  };
1532
1486
 
1487
+ var dummyEngine = new Engine();
1488
+ var EngineContext = React.createContext(dummyEngine);
1489
+ var useEngine = function () {
1490
+ return React.useContext(EngineContext);
1491
+ };
1492
+
1493
+ function NodeContainer(_a) {
1494
+ var _b;
1495
+ var id = _a.id, label = _a.label, className = _a.className, selected = _a.selected, children = _a.children;
1496
+ var engine = useEngine();
1497
+ var _c = __read(React.useState(false), 2), active = _c[0], setActive = _c[1];
1498
+ React.useEffect(function () {
1499
+ if (!id)
1500
+ return;
1501
+ var timer;
1502
+ var removeOnCall = engine.subscribe("functionCall", function (event) {
1503
+ if (event.name === id) {
1504
+ setActive(true);
1505
+ }
1506
+ });
1507
+ var removeOnResult = engine.subscribe("functionResult", function (event) {
1508
+ if (event.name === id) {
1509
+ clearTimeout(timer);
1510
+ timer = setTimeout(function () { return setActive(false); }, Math.max(0, 1000 - (event.duration || 0)));
1511
+ }
1512
+ });
1513
+ return function () {
1514
+ removeOnCall();
1515
+ removeOnResult();
1516
+ };
1517
+ }, [id]);
1518
+ return (React.createElement("div", { className: classNames(className, styles.DefaultNode, (_b = {},
1519
+ _b[styles.selected] = selected,
1520
+ _b[styles.active] = active,
1521
+ _b)) },
1522
+ React.createElement("div", { className: styles.Label }, label),
1523
+ children));
1524
+ }
1525
+
1533
1526
  function GenericNode(_a) {
1534
- var id = _a.id, data = _a.data, selected = _a.selected, inputs = _a.inputs, outputs = _a.outputs, params = _a.params, children = _a.children, onChange = _a.onChange;
1527
+ var id = _a.id, data = _a.data, selected = _a.selected, inputs = _a.inputs, outputs = _a.outputs, params = _a.params, children = _a.children;
1535
1528
  return (React.createElement(NodeContainer, { label: data.name, selected: selected, id: id },
1536
1529
  children,
1537
1530
  React.createElement("table", null,
1538
1531
  React.createElement("tbody", null,
1539
- Object.entries(outputs || {}).map(function (_a) {
1532
+ Object.entries(outputs || data.outputDefs || {}).map(function (_a) {
1540
1533
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1541
1534
  return (React.createElement(Output, { key: name, name: name, varDef: varDef, id: id }));
1542
1535
  }),
1543
- Object.entries(inputs || {}).map(function (_a) {
1536
+ Object.entries(inputs || data.inputDefs || {}).map(function (_a) {
1544
1537
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1545
- return (React.createElement(Input, { key: name, name: name, varDef: varDef, id: id, data: data, onChange: onChange }));
1538
+ return (React.createElement(Input, { key: name, name: name, varDef: varDef, id: id, data: data }));
1546
1539
  }),
1547
- Object.entries(params || {}).map(function (_a) {
1540
+ Object.entries(params || data.paramDefs || {}).map(function (_a) {
1548
1541
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1549
- return (React.createElement(Param, { key: name, name: name, varDef: varDef, id: id, data: data, onChange: onChange }));
1542
+ return (React.createElement(Param, { key: name, name: name, varDef: varDef, id: id, data: data }));
1550
1543
  })))));
1551
1544
  }
1552
1545
 
@@ -1569,15 +1562,9 @@ function MathView(_a) {
1569
1562
  var Calc = React.memo(function (_a) {
1570
1563
  var _b;
1571
1564
  var id = _a.id, data = _a.data, selected = _a.selected;
1572
- var engine = useEngine();
1573
- var onChange = useChange();
1574
- var calledFn = engine.getFunction(data.name);
1575
- if (!calledFn) {
1576
- return (React.createElement(NodeContainer, { label: "Function not found", selected: selected }));
1577
- }
1578
1565
  var expression = (((_b = data.params) === null || _b === void 0 ? void 0 : _b.expression) || "").toString();
1579
1566
  // add free variables to inputs
1580
- var inputs = __assign({}, (calledFn.inputs || {}));
1567
+ var inputs = __assign({}, (data.inputDefs || {}));
1581
1568
  var symbols = getUnboundSymbols(expression);
1582
1569
  symbols.forEach(function (symbol) {
1583
1570
  if (!inputs[symbol]) {
@@ -1586,27 +1573,20 @@ var Calc = React.memo(function (_a) {
1586
1573
  };
1587
1574
  }
1588
1575
  });
1589
- return (React.createElement(GenericNode, { id: id, data: data, selected: selected, inputs: inputs, outputs: calledFn.outputs, params: calledFn.params, onChange: onChange },
1576
+ return (React.createElement(GenericNode, { id: id, data: data, selected: selected, inputs: inputs },
1590
1577
  React.createElement(MathView, { expr: expression, displayMode: true })));
1591
1578
  });
1592
1579
  Calc.displayName = "CalcNode";
1593
1580
 
1594
1581
  var Default = React.memo(function (_a) {
1595
1582
  var id = _a.id, data = _a.data, selected = _a.selected;
1596
- var engine = useEngine();
1597
- var onChange = useChange();
1598
- var calledFn = engine.getFunction(data.name);
1599
- if (!calledFn) {
1600
- return (React.createElement(NodeContainer, { label: "Function not found", selected: selected }));
1601
- }
1602
- return (React.createElement(GenericNode, { id: id, data: data, selected: selected, inputs: calledFn.inputs, outputs: calledFn.outputs, params: calledFn.params, onChange: onChange }));
1583
+ return React.createElement(GenericNode, { id: id, data: data, selected: selected });
1603
1584
  });
1604
1585
  Default.displayName = "DefaultNode";
1605
1586
 
1606
1587
  var Log = React.memo(function (_a) {
1607
1588
  var id = _a.id, data = _a.data, selected = _a.selected;
1608
1589
  var engine = useEngine();
1609
- var calledFn = engine.getFunction(data.name);
1610
1590
  var _b = __read(React.useState(null), 2), value = _b[0], setValue = _b[1];
1611
1591
  React.useEffect(function () {
1612
1592
  return engine.subscribe("functionResult", function (event) {
@@ -1616,9 +1596,6 @@ var Log = React.memo(function (_a) {
1616
1596
  }
1617
1597
  });
1618
1598
  }, []);
1619
- if (!calledFn) {
1620
- return (React.createElement(NodeContainer, { label: "Function not found", selected: selected }));
1621
- }
1622
1599
  return (React.createElement(NodeContainer, { id: id, label: data.name, selected: selected, className: styles.Log },
1623
1600
  React.createElement("div", { className: styles.Table },
1624
1601
  React.createElement("table", null, Object.entries(value || {}).map(function (_a) {
@@ -1627,9 +1604,12 @@ var Log = React.memo(function (_a) {
1627
1604
  React.createElement("tbody", null,
1628
1605
  React.createElement("tr", null,
1629
1606
  React.createElement("th", { colSpan: 2 }, "{".concat(key, "}"))),
1630
- val.map(function (item, index) { return (React.createElement("tr", { key: "".concat(key, "-").concat(index) },
1631
- React.createElement("td", null, index),
1632
- React.createElement("td", { title: JSON.stringify(item, null, 2) }, item === null || item === void 0 ? void 0 : item.toString()))); }))));
1607
+ val.map(function (item, index) {
1608
+ var _a;
1609
+ return (React.createElement("tr", { key: "".concat(key, "-").concat(index) },
1610
+ React.createElement("td", null, index),
1611
+ 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))));
1612
+ }))));
1633
1613
  }))),
1634
1614
  React.createElement(react.Handle, { type: "target", position: react.Position.Left, id: "".concat(id, "-data") }),
1635
1615
  React.createElement(react.Handle, { type: "source", position: react.Position.Right, id: "".concat(id, "-data") })));
@@ -1641,19 +1621,13 @@ function uid() {
1641
1621
  }
1642
1622
  var Merge = React.memo(function (_a) {
1643
1623
  var id = _a.id, data = _a.data, selected = _a.selected;
1644
- var engine = useEngine();
1645
- var onChange = useChange();
1646
- var calledFn = engine.getFunction(data.name);
1647
- if (!calledFn) {
1648
- return (React.createElement(NodeContainer, { label: "Function not found", selected: selected }));
1649
- }
1650
1624
  var inputs = Object.fromEntries(Object.keys(data.inputs || {}).map(function (name, i) { return [
1651
1625
  name,
1652
1626
  { type: "any", label: "D".concat(i + 1) },
1653
1627
  ]; }));
1654
1628
  var inputCount = Object.keys(inputs).length;
1655
1629
  inputs[uid()] = { type: "any", label: "D".concat(inputCount + 1) };
1656
- var outputs = __assign({}, (calledFn.outputs || {}));
1630
+ var outputs = __assign({}, (data.outputDefs || {}));
1657
1631
  return (React.createElement(NodeContainer, { label: data.name, selected: selected, id: id },
1658
1632
  React.createElement("table", null,
1659
1633
  React.createElement("tbody", null,
@@ -1663,7 +1637,7 @@ var Merge = React.memo(function (_a) {
1663
1637
  }),
1664
1638
  Object.entries(inputs || {}).map(function (_a) {
1665
1639
  var _b = __read(_a, 2), name = _b[0], varDef = _b[1];
1666
- return (React.createElement(Input, { key: name, name: name, varDef: varDef, id: id, data: data, onChange: onChange }));
1640
+ return (React.createElement(Input, { key: name, name: name, varDef: varDef, id: id, data: data }));
1667
1641
  })))));
1668
1642
  });
1669
1643
  Merge.displayName = "MergeNode";
@@ -1688,12 +1662,21 @@ var variableStore = zustand.create(function (set, get, api) {
1688
1662
  },
1689
1663
  setVar: function (scope, name, value, persist) {
1690
1664
  var _a, _b;
1665
+ var key = "".concat(scope, "|").concat(name);
1691
1666
  if (persist) {
1692
- var data = __assign(__assign({}, pget().data), (_a = {}, _a["".concat(scope, "|").concat(name)] = value, _a));
1667
+ var oldData = pget().data;
1668
+ var newValue = typeof value === "function"
1669
+ ? value(oldData[key])
1670
+ : value;
1671
+ var data = __assign(__assign({}, oldData), (_a = {}, _a[key] = newValue, _a));
1693
1672
  pset({ data: data });
1694
1673
  }
1695
1674
  else {
1696
- var data = __assign(__assign({}, get().data), (_b = {}, _b["".concat(scope, "|").concat(name)] = value, _b));
1675
+ var oldData = get().data;
1676
+ var newValue = typeof value === "function"
1677
+ ? value(oldData[key])
1678
+ : value;
1679
+ var data = __assign(__assign({}, oldData), (_b = {}, _b[key] = newValue, _b));
1697
1680
  set({ data: data });
1698
1681
  }
1699
1682
  },
@@ -1729,79 +1712,187 @@ function usePositions(fn) {
1729
1712
  function useUpdatePositions(fn) {
1730
1713
  var _a = __read(usePositions(fn), 2), positions = _a[0], setPositions = _a[1];
1731
1714
  return React.useCallback(function (id, position) {
1732
- var _a;
1733
- setPositions(__assign(__assign({}, positions), (_a = {}, _a[id] = position, _a)));
1715
+ positions[id] = position;
1716
+ setPositions(positions);
1734
1717
  }, [positions, setPositions]);
1735
1718
  }
1736
1719
 
1737
- function createGraph(fn, engine, positions, options) {
1738
- var nodes = [];
1739
- var edges = [];
1740
- Object.entries(fn.body || {}).forEach(function (_a, index) {
1741
- var _b = __read(_a, 2), id = _b[0], fncall = _b[1];
1742
- var reffedFn = engine.getFunction(fncall.name);
1743
- // create a node for each function call
1744
- nodes.push({
1745
- id: id,
1746
- data: {
1747
- name: fncall.name,
1748
- caller: fn,
1749
- inputs: fncall.inputs,
1750
- params: fncall.params,
1751
- },
1752
- position: (positions === null || positions === void 0 ? void 0 : positions[id]) || { x: 250 * index, y: 0 },
1753
- dragHandle: options === null || options === void 0 ? void 0 : options.dragHandle,
1754
- type: (reffedFn === null || reffedFn === void 0 ? void 0 : reffedFn.nodeType) || "Default",
1720
+ // helpers
1721
+ function updateNodeArguments(node, inputs, params) {
1722
+ return __assign(__assign({}, node), { data: __assign(__assign({}, node.data), { inputs: inputs, params: params }) });
1723
+ }
1724
+ /**
1725
+ * flow state stores nodes and edges for the flow graph these can be updated when the function changes
1726
+ * using setFn
1727
+ */
1728
+ var useFlowState = zustand.create(function (set, get) { return ({
1729
+ engine: null,
1730
+ fn: null,
1731
+ options: {},
1732
+ nodes: [],
1733
+ edges: [],
1734
+ setNodes: function (updater) {
1735
+ set(function (state) { return ({ nodes: updater(state.nodes) }); });
1736
+ },
1737
+ setEdges: function (updater) {
1738
+ set(function (state) { return ({ edges: updater(state.edges) }); });
1739
+ },
1740
+ setFn: function (fn) {
1741
+ // console.log("setFn", fn);
1742
+ var _a = get(), oldFn = _a.fn, nodes = _a.nodes, edges = _a.edges, engine = _a.engine, options = _a.options;
1743
+ // update the graph by shallow comparison
1744
+ if (!engine) {
1745
+ throw new Error("Engine not set");
1746
+ }
1747
+ var oldKeys = Object.keys((oldFn === null || oldFn === void 0 ? void 0 : oldFn.body) || {});
1748
+ var newKeys = Object.keys(fn.body || {});
1749
+ // remove all the nodes that were removed
1750
+ nodes = nodes === null || nodes === void 0 ? void 0 : nodes.filter(function (node) { return newKeys.includes(node.id); });
1751
+ // remove all the edges that were removed
1752
+ edges = edges === null || edges === void 0 ? void 0 : edges.filter(function (edge) {
1753
+ return (newKeys.includes(edge.source) && newKeys.includes(edge.target));
1755
1754
  });
1756
- var refs = getReferences(fncall.inputs || {});
1757
- refs.forEach(function (ref) {
1758
- // create an edge for each reference
1759
- edges.push({
1760
- id: "".concat(ref.path, "-").concat(id, ".").concat(ref.name),
1761
- source: ref.refNode,
1762
- target: id,
1763
- sourceHandle: "".concat(ref.refNode, "-").concat(ref.refField),
1764
- targetHandle: "".concat(id, "-").concat(ref.name),
1755
+ // create the new nodes that were added
1756
+ var addedKeys = newKeys.filter(function (key) { return !oldKeys.includes(key); });
1757
+ addedKeys.forEach(function (key, index) {
1758
+ var _a;
1759
+ var fncall = (_a = fn.body) === null || _a === void 0 ? void 0 : _a[key];
1760
+ // add the node
1761
+ nodes.push(createNode(engine, key, fncall, options));
1762
+ // add edges
1763
+ var refs = getReferences(fncall.inputs || {});
1764
+ refs.forEach(function (ref) {
1765
+ edges.push(createEdge(key, ref));
1765
1766
  });
1766
1767
  });
1767
- });
1768
- return { nodes: nodes, edges: edges };
1769
- }
1768
+ // update the changed nodes
1769
+ var changedKeys = newKeys.filter(function (key) {
1770
+ var _a, _b;
1771
+ // shallow comparison
1772
+ 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]);
1773
+ });
1774
+ // console.log("changed keys", changedKeys);
1775
+ changedKeys.forEach(function (key) {
1776
+ var _a;
1777
+ // update the nodes that were changed
1778
+ var fncall = (_a = fn.body) === null || _a === void 0 ? void 0 : _a[key];
1779
+ nodes = nodes === null || nodes === void 0 ? void 0 : nodes.map(function (n) {
1780
+ if (n.id === key) {
1781
+ return updateNodeArguments(n, fncall.inputs, fncall.params);
1782
+ }
1783
+ return n;
1784
+ });
1785
+ // update incoming edges
1786
+ var refs = getReferences(fncall.inputs || {});
1787
+ // remove all incoming edges
1788
+ edges = edges === null || edges === void 0 ? void 0 : edges.filter(function (e) { return e.target !== key; });
1789
+ // add the edge
1790
+ refs.forEach(function (ref) {
1791
+ edges.push(createEdge(key, ref));
1792
+ });
1793
+ });
1794
+ // console.log("final graph", nodes, edges);
1795
+ // update the function, nodes and edges
1796
+ set({ fn: fn, nodes: nodes, edges: edges });
1797
+ },
1798
+ init: function (fn, engine, options) {
1799
+ // console.log("initing");
1800
+ set({ engine: engine, options: options });
1801
+ get().setFn(fn);
1802
+ },
1803
+ }); });
1804
+ /**
1805
+ * creates a flow state and provides handlers to update nodes and edges
1806
+ */
1770
1807
  function useFlow(fn, engine, options) {
1771
- var _a = __read(usePositions(fn), 1), positions = _a[0];
1772
- return React.useMemo(function () {
1773
- return createGraph(fn, engine, positions, options);
1774
- }, [fn, engine]);
1808
+ var state = useFlowState();
1809
+ React.useEffect(function () {
1810
+ state.init(fn, engine, options);
1811
+ }, [engine]);
1812
+ React.useEffect(function () {
1813
+ state.setFn(fn);
1814
+ }, [fn]);
1815
+ return React.useMemo(function () { return ({
1816
+ nodes: state.nodes,
1817
+ edges: state.edges,
1818
+ setNodes: state.setNodes,
1819
+ setEdges: state.setEdges,
1820
+ }); }, [state]);
1821
+ }
1822
+ function createNode(engine, id, fncall, options) {
1823
+ var _a, _b;
1824
+ var calledFn = engine.getFunction(fncall.name);
1825
+ // create a node for each function call
1826
+ return {
1827
+ id: id,
1828
+ data: {
1829
+ name: fncall.name,
1830
+ inputs: fncall.inputs,
1831
+ params: fncall.params,
1832
+ inputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.inputs) || {},
1833
+ paramDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.params) || {},
1834
+ outputDefs: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.outputs) || {},
1835
+ onChange: ((_a = options.onDataChange) === null || _a === void 0 ? void 0 : _a.call(options, id)) || (function () { }),
1836
+ },
1837
+ position: ((_b = options.positions) === null || _b === void 0 ? void 0 : _b[id]) || { x: 0, y: 0 },
1838
+ dragHandle: options.dragHandle,
1839
+ type: (calledFn === null || calledFn === void 0 ? void 0 : calledFn.nodeType) || "Default",
1840
+ };
1841
+ }
1842
+ function createEdge(nodeId, ref) {
1843
+ return {
1844
+ id: "".concat(ref.path, "-").concat(nodeId, ".").concat(ref.name),
1845
+ source: ref.refNode,
1846
+ target: nodeId,
1847
+ sourceHandle: "".concat(ref.refNode, "-").concat(ref.refField),
1848
+ targetHandle: "".concat(nodeId, "-").concat(ref.name),
1849
+ };
1775
1850
  }
1776
1851
 
1777
1852
  function FlowInner(_a) {
1778
1853
  var fn = _a.function, engine = _a.engine, onChange = _a.onChange, onClick = _a.onClick, onSelect = _a.onSelect;
1779
1854
  var _b = __read(React.useState(null), 2), instance = _b[0], setInstance = _b[1];
1780
- var updatePositions = useUpdatePositions(fn);
1781
- var _c = useFlow(fn, engine, {
1855
+ var updatePosition = useUpdatePositions(fn);
1856
+ var _c = __read(usePositions(fn), 1), positions = _c[0];
1857
+ var handleDataChange = function (id) { return function (newData) {
1858
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1859
+ // update the function definition
1860
+ // console.log("before fn call update", Object.keys(fn.body));
1861
+ var body = __assign({}, fn.body);
1862
+ var fncall = __assign(__assign({}, (body[id] || {})), newData);
1863
+ body[id] = fncall;
1864
+ // console.log("after fn call update", Object.keys(body));
1865
+ var updatedFn = __assign(__assign({}, fn), { body: body });
1866
+ return updatedFn;
1867
+ });
1868
+ }; };
1869
+ var _d = useFlow(fn, engine, {
1782
1870
  dragHandle: ".".concat(styles.Label),
1783
- }), initialNodes = _c.nodes, initialEdges = _c.edges;
1784
- var _d = __read(useInner.useInner(initialNodes), 2), nodes = _d[0], setNodes = _d[1];
1785
- var _e = __read(useInner.useInner(initialEdges), 2), edges = _e[0], setEdges = _e[1];
1871
+ positions: positions,
1872
+ onDataChange: handleDataChange,
1873
+ }), nodes = _d.nodes, edges = _d.edges, setNodes = _d.setNodes, setEdges = _d.setEdges;
1786
1874
  // node selection handler
1787
- var handleChange = React.useCallback(function (_a) {
1875
+ var handleSelect = React.useCallback(function (_a) {
1788
1876
  var nodes = _a.nodes;
1789
1877
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(nodes.map(function (n) { return n.id; }) || []);
1790
1878
  }, [onSelect]);
1791
1879
  react.useOnSelectionChange({
1792
- onChange: handleChange,
1880
+ onChange: handleSelect,
1793
1881
  });
1794
1882
  // dropping nodes
1795
- var _f = __read(reactDnd.useDrop({
1883
+ var _e = __read(reactDnd.useDrop({
1796
1884
  accept: "flow-node",
1797
1885
  drop: function (item, monitor) {
1798
1886
  var pos = monitor.getClientOffset();
1799
1887
  if (instance && pos) {
1800
1888
  var position_1 = instance.screenToFlowPosition(pos);
1801
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeAdd(fn, item.name, function (fnCall, id) {
1802
- console.log("node added", id, position_1);
1803
- updatePositions(id, position_1);
1804
- }));
1889
+ // console.log("handle drop", position);
1890
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1891
+ return engine.applyNodeAdd(fn, item.name, function (fnCall, id) {
1892
+ // console.log("node added", id, position);
1893
+ updatePosition(id, position_1);
1894
+ });
1895
+ });
1805
1896
  }
1806
1897
  },
1807
1898
  collect: function (monitor) {
@@ -1809,19 +1900,8 @@ function FlowInner(_a) {
1809
1900
  isOver: monitor.isOver(),
1810
1901
  };
1811
1902
  },
1812
- }), 2); _f[0].isOver; var drop = _f[1];
1813
- // useLayoutNodes();
1814
- var updatePosition = useUpdatePositions(fn);
1815
- var onNodesChange = React.useCallback(function (changes) {
1816
- return setNodes(function (nodesSnapshot) {
1817
- return react.applyNodeChanges(changes, nodesSnapshot);
1818
- });
1819
- }, [setNodes]);
1820
- var onEdgesChange = React.useCallback(function (changes) {
1821
- return setEdges(function (edgesSnapshot) {
1822
- return react.applyEdgeChanges(changes, edgesSnapshot);
1823
- });
1824
- }, [setEdges]);
1903
+ }), 2); _e[0].isOver; var drop = _e[1];
1904
+ // connecting nodes
1825
1905
  var onConnect = React.useCallback(function (params) {
1826
1906
  var _a, _b;
1827
1907
  var sourceField = (_a = params.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
@@ -1830,37 +1910,34 @@ function FlowInner(_a) {
1830
1910
  console.warn("Invalid connection handles", params);
1831
1911
  return;
1832
1912
  }
1833
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeConnect(fn, params.source, params.target, sourceField, targetField));
1834
- setEdges(function (edgesSnapshot) { return react.addEdge(params, edgesSnapshot); });
1835
- }, [setEdges, fn, onChange]);
1836
- var onNodesDelete = React.useCallback(function (nodesToDelete) {
1837
- onChange === null || onChange === void 0 ? void 0 : onChange(engine.applyNodeDelete(fn, nodesToDelete.map(function (n) { return n.id; })));
1838
- setNodes(function (nodesSnapshot) {
1839
- return nodesSnapshot.filter(function (node) { return !nodesToDelete.some(function (n) { return n.id === node.id; }); });
1913
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1914
+ return engine.applyNodeConnect(fn, params.source, params.target, sourceField, targetField);
1840
1915
  });
1841
- setEdges(function (edgesSnapshot) {
1842
- return edgesSnapshot.filter(function (edge) {
1843
- return !nodesToDelete.some(function (n) { return n.id === edge.source || n.id === edge.target; });
1844
- });
1916
+ }, [fn, onChange]);
1917
+ // deleting nodes
1918
+ var onNodesDelete = React.useCallback(function (nodesToDelete) {
1919
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1920
+ return engine.applyNodeDelete(fn, nodesToDelete.map(function (n) { return n.id; }));
1845
1921
  });
1846
- }, [setNodes, setEdges, onChange, fn]);
1922
+ }, [onChange, fn]);
1923
+ // deleting edges
1847
1924
  var onEdgesDelete = React.useCallback(function (edgesToDelete) {
1848
- var newFn = fn;
1849
- edgesToDelete.forEach(function (edge) {
1850
- var _a, _b;
1851
- var sourceField = (_a = edge.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
1852
- var targetField = (_b = edge.targetHandle) === null || _b === void 0 ? void 0 : _b.split("-")[1];
1853
- if (!sourceField || !targetField) {
1854
- console.warn("Invalid connection handles", edge);
1855
- return;
1856
- }
1857
- newFn = engine.applyEdgeDelete(newFn, edge.source, edge.target, sourceField, targetField);
1858
- });
1859
- onChange === null || onChange === void 0 ? void 0 : onChange(newFn);
1860
- setEdges(function (edgesSnapshot) {
1861
- return edgesSnapshot.filter(function (edge) { return !edgesToDelete.some(function (e) { return e.id === edge.id; }); });
1925
+ onChange === null || onChange === void 0 ? void 0 : onChange(function (fn) {
1926
+ var newFn = fn;
1927
+ edgesToDelete.forEach(function (edge) {
1928
+ var _a, _b;
1929
+ var sourceField = (_a = edge.sourceHandle) === null || _a === void 0 ? void 0 : _a.split("-")[1];
1930
+ var targetField = (_b = edge.targetHandle) === null || _b === void 0 ? void 0 : _b.split("-")[1];
1931
+ if (!sourceField || !targetField) {
1932
+ console.warn("Invalid connection handles", edge);
1933
+ return;
1934
+ }
1935
+ newFn = engine.applyEdgeDelete(newFn, edge.source, edge.target, sourceField, targetField);
1936
+ });
1937
+ return newFn;
1862
1938
  });
1863
- }, [setEdges, onChange, fn]);
1939
+ }, [onChange, fn]);
1940
+ // handle canvas clicks to be able to place nodes
1864
1941
  var handleClick = function (e) {
1865
1942
  if (instance) {
1866
1943
  var position = instance.screenToFlowPosition({
@@ -1870,6 +1947,16 @@ function FlowInner(_a) {
1870
1947
  onClick === null || onClick === void 0 ? void 0 : onClick(e, position);
1871
1948
  }
1872
1949
  };
1950
+ var onNodesChange = React.useCallback(function (changes) {
1951
+ return setNodes(function (nodesSnapshot) {
1952
+ return react.applyNodeChanges(changes, nodesSnapshot);
1953
+ });
1954
+ }, []);
1955
+ var onEdgesChange = React.useCallback(function (changes) {
1956
+ return setEdges(function (edgesSnapshot) {
1957
+ return react.applyEdgeChanges(changes, edgesSnapshot);
1958
+ });
1959
+ }, []);
1873
1960
  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,
1874
1961
  // panOnDrag={false}
1875
1962
  selectionOnDrag: true, minZoom: 0.1, deleteKeyCode: "Delete" },
@@ -1879,9 +1966,8 @@ function FlowInner(_a) {
1879
1966
  function Flow(_a) {
1880
1967
  var fn = _a.function, engine = _a.engine, _b = _a.onChange, onChange = _b === void 0 ? function () { } : _b, onClick = _a.onClick, onSelect = _a.onSelect;
1881
1968
  return (React.createElement(EngineContext.Provider, { value: engine },
1882
- React.createElement(ChangeContext.Provider, { value: onChange },
1883
- React.createElement(react.ReactFlowProvider, null,
1884
- React.createElement(FlowInner, { function: fn, engine: engine, onChange: onChange, onClick: onClick, onSelect: onSelect })))));
1969
+ React.createElement(react.ReactFlowProvider, null,
1970
+ React.createElement(FlowInner, { function: fn, engine: engine, onChange: onChange, onClick: onClick, onSelect: onSelect }))));
1885
1971
  }
1886
1972
 
1887
1973
  function useDraggableNode(name, fn) {
@@ -1940,7 +2026,6 @@ exports.Flow = Flow;
1940
2026
  exports.binaryOnTree = binaryOnTree;
1941
2027
  exports.binaryOnTreeBranch = binaryOnTreeBranch;
1942
2028
  exports.broadCast = broadCast;
1943
- exports.createGraph = createGraph;
1944
2029
  exports.expandTree = expandTree;
1945
2030
  exports.getBranch = getBranch;
1946
2031
  exports.getReferences = getReferences;