import { CanvasNodeHandleKey, CanvasNodeKey } from '@/constants'; import { ref } from 'vue'; import type { CanvasNode, CanvasNodeData, CanvasNodeEventBusEvents, CanvasNodeHandleInjectionData, CanvasNodeInjectionData, } from '@/types'; import { CanvasConnectionMode, CanvasNodeRenderType } from '@/types'; import { NodeConnectionType } from 'n8n-workflow'; import type { EventBus } from 'n8n-design-system'; import { createEventBus } from 'n8n-design-system'; export function createCanvasNodeData({ id = 'node', name = 'Test Node', subtitle = 'Test Node Subtitle', type = 'test', typeVersion = 1, disabled = false, inputs = [], outputs = [], connections = { [CanvasConnectionMode.Input]: {}, [CanvasConnectionMode.Output]: {} }, execution = { running: false }, issues = { items: [], visible: false }, pinnedData = { count: 0, visible: false }, runData = { count: 0, visible: false }, render = { type: CanvasNodeRenderType.Default, options: { configurable: false, configuration: false, trigger: false }, }, }: Partial = {}): CanvasNodeData { return { id, name, subtitle, type, typeVersion, execution, issues, pinnedData, runData, disabled, inputs, outputs, connections, render, }; } export function createCanvasNodeElement({ id = '1', type = 'node', label = 'Node', position = { x: 100, y: 100 }, data, }: Partial & { data: Partial }> = {}): CanvasNode { return { id, type, label, position, data: createCanvasNodeData({ id, type, ...data }), }; } export function createCanvasNodeProps({ id = 'node', label = 'Test Node', selected = false, readOnly = false, data = {}, }: { id?: string; label?: string; selected?: boolean; readOnly?: boolean; data?: Partial; } = {}) { return { id, label, selected, readOnly, data: createCanvasNodeData(data), }; } export function createCanvasNodeProvide({ id = 'node', label = 'Test Node', selected = false, data = {}, eventBus = createEventBus(), }: { id?: string; label?: string; selected?: boolean; data?: Partial; eventBus?: EventBus; } = {}) { const props = createCanvasNodeProps({ id, label, selected, data }); return { [`${CanvasNodeKey}`]: { id: ref(props.id), label: ref(props.label), selected: ref(props.selected), data: ref(props.data), eventBus: ref(eventBus), } satisfies CanvasNodeInjectionData, }; } export function createCanvasHandleProvide({ label = 'Handle', mode = CanvasConnectionMode.Input, type = NodeConnectionType.Main, isConnected = false, isConnecting = false, }: { label?: string; mode?: CanvasConnectionMode; type?: NodeConnectionType; isConnected?: boolean; isConnecting?: boolean; } = {}) { return { [`${CanvasNodeHandleKey}`]: { label: ref(label), mode: ref(mode), type: ref(type), isConnected: ref(isConnected), isConnecting: ref(isConnecting), } satisfies CanvasNodeHandleInjectionData, }; } export function createCanvasConnection( nodeA: CanvasNode, nodeB: CanvasNode, { sourceIndex = 0, targetIndex = 0 } = {}, ) { const nodeAOutput = nodeA.data?.outputs[sourceIndex]; const nodeBInput = nodeA.data?.inputs[targetIndex]; return { id: `${nodeA.id}-${nodeB.id}`, source: nodeA.id, target: nodeB.id, ...(nodeAOutput ? { sourceHandle: `outputs/${nodeAOutput.type}/${nodeAOutput.index}` } : {}), ...(nodeBInput ? { targetHandle: `inputs/${nodeBInput.type}/${nodeBInput.index}` } : {}), }; }