import { store } from '#store/stores.svelte'; import type { Edge, Node } from '@xyflow/svelte'; export const useGetNodesFromSource = () => { const getEdgesBySource = (target: string, edges: Edge[]) => { return edges.filter( // 排除循环节点的子节点,否则在多层循环嵌套时不正确 (edge) => edge.source === target && edge.sourceHandle !== 'loop_handle', ); }; const getNodesFromSource = (sourceNodeId: string) => { const edges = store.getEdges(); const result: Node[] = []; let edgesFromSource = getEdgesBySource(sourceNodeId, edges); while (edgesFromSource.length > 0) { const newEdgesFromSource: Edge[] = []; edgesFromSource.forEach((edge) => { result.push(store.getNode(edge.target)!); newEdgesFromSource.push(...getEdgesBySource(edge.target, edges)); }); edgesFromSource = newEdgesFromSource; } return result; }; return { getNodesFromSource, }; };