import ELK from 'elkjs/lib/elk.bundled.js'; import { Edge, Node } from 'reactflow'; const elk = new ELK(); export const getLayoutedElements = ( nodes: Node[], edges: Edge[], options = {}, ) => { const isHorizontal = options?.['elk.direction'] === 'RIGHT'; const graph = { id: 'root', layoutOptions: options, children: nodes.map((node) => ({ ...node, // Adjust the target and source handle positions based on the layout // direction. targetPosition: isHorizontal ? 'left' : 'top', sourcePosition: isHorizontal ? 'right' : 'bottom', // Hardcode a width and height for elk to use when layouting. width: 150, height: 50, })), edges: edges, }; return elk .layout(graph) .then((layoutedGraph) => ({ nodes: layoutedGraph.children.map((node) => ({ ...node, // React Flow expects a position property on the node instead of `x` // and `y` fields. position: { x: node.x, y: node.y }, })), edges: layoutedGraph.edges, })) .catch(console.error); };