From 06ad0c0d20f316ef8738c1a69ec255ff6c07b3b8 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Wed, 17 May 2023 17:36:41 +0200 Subject: [PATCH] refactor(core): avoid inserting invalid nodes --- packages/core/src/utils/errors.ts | 2 ++ packages/core/src/utils/store.ts | 16 +++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index a28b63b0..21c6b5a6 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,5 +1,6 @@ export enum ErrorCode { MISSING_VIEWPORT_DIMENSIONS = 'MISSING_VIEWPORT_DIMENSIONS', + NODE_INVALID = 'NODE_INVALID', NODE_NOT_FOUND = 'NODE_NOT_FOUND', NODE_MISSING_PARENT = 'NODE_MISSING_PARENT', NODE_TYPE_MISSING = 'NODE_TYPE_MISSING', @@ -16,6 +17,7 @@ export enum ErrorCode { const messages = { [ErrorCode.MISSING_VIEWPORT_DIMENSIONS]: () => 'The Vue Flow parent container needs a width and a height to render the graph', + [ErrorCode.NODE_INVALID]: (id?: string) => `Node is invalid\nNode: ${id}`, [ErrorCode.NODE_NOT_FOUND]: (id: string) => `Node not found\nNode: ${id}`, [ErrorCode.NODE_MISSING_PARENT]: (id: string, parentId: string) => `Node is missing a parent\nNode: ${id}\nParent: ${parentId}`, [ErrorCode.NODE_TYPE_MISSING]: (type: string) => `Node type is missing\nType: ${type}`, diff --git a/packages/core/src/utils/store.ts b/packages/core/src/utils/store.ts index c9a2f0c8..856ce678 100644 --- a/packages/core/src/utils/store.ts +++ b/packages/core/src/utils/store.ts @@ -79,7 +79,13 @@ export function createGraphNodes( ) { const parentNodes: Record = {} - const graphNodes = nodes.map((node) => { + const graphNodes = nodes.reduce((nextNodes, node) => { + // make sure we don't try to add invalid nodes + if (!node || typeof node !== 'object' || !isNode(node)) { + onError(new VueFlowError(ErrorCode.NODE_INVALID)) + return nextNodes + } + const parsed = parseNode(node, { ...findNode(node.id), parentNode: node.parentNode, @@ -89,12 +95,12 @@ export function createGraphNodes( parentNodes[node.parentNode] = true } - return parsed - }) + return nextNodes.concat(parsed) + }, [] as GraphNode[]) const nextNodes = [...graphNodes, ...currGraphNodes] - graphNodes.forEach((node) => { + for (const node of graphNodes) { const parentNode = nextNodes.find((n) => n.id === node.parentNode) if (node.parentNode && !parentNode) { @@ -110,7 +116,7 @@ export function createGraphNodes( parentNode.isParent = true } } - }) + } return graphNodes }