From 22635b708b7bef4bebea4a97e271152bbdaa3a47 Mon Sep 17 00:00:00 2001 From: czlonkowski Date: Fri, 27 Mar 2026 18:45:03 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20deduplicate=20tryParseJson=20?= =?UTF-8?q?=E2=80=94=20export=20from=20handlers-n8n-manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tryParseJson was duplicated in handlers-workflow-diff.ts. Now imported from handlers-n8n-manager.ts where it was already defined. Updated test mock to use importOriginal so the real function is available. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/mcp/handlers-n8n-manager.ts | 2 +- src/mcp/handlers-workflow-diff.ts | 8 +------- tests/unit/mcp/handlers-workflow-diff.test.ts | 10 +++++++--- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/mcp/handlers-n8n-manager.ts b/src/mcp/handlers-n8n-manager.ts index b0761f1..5075e97 100644 --- a/src/mcp/handlers-n8n-manager.ts +++ b/src/mcp/handlers-n8n-manager.ts @@ -2731,7 +2731,7 @@ const updateTableSchema = tableIdSchema.extend({ // MCP transports may serialize JSON objects/arrays as strings. // Parse them back, but return the original value on failure so Zod reports a proper type error. -function tryParseJson(val: unknown): unknown { +export function tryParseJson(val: unknown): unknown { if (typeof val !== 'string') return val; try { return JSON.parse(val); } catch { return val; } } diff --git a/src/mcp/handlers-workflow-diff.ts b/src/mcp/handlers-workflow-diff.ts index 1b36829..d5a8dc6 100644 --- a/src/mcp/handlers-workflow-diff.ts +++ b/src/mcp/handlers-workflow-diff.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import { McpToolResponse } from '../types/n8n-api'; import { WorkflowDiffRequest, WorkflowDiffOperation, WorkflowDiffValidationError } from '../types/workflow-diff'; import { WorkflowDiffEngine } from '../services/workflow-diff-engine'; -import { getN8nApiClient } from './handlers-n8n-manager'; +import { getN8nApiClient, tryParseJson } from './handlers-n8n-manager'; import { N8nApiError, getUserFriendlyErrorMessage } from '../utils/n8n-errors'; import { logger } from '../utils/logger'; import { InstanceContext } from '../types/instance-context'; @@ -36,12 +36,6 @@ const NODE_TARGETING_OPERATIONS = new Set([ 'updateNode', 'removeNode', 'moveNode', 'enableNode', 'disableNode' ]); -// Parse JSON strings to values — VS Code extension sends arrays as JSON strings (#600) -function tryParseJson(val: unknown): unknown { - if (typeof val !== 'string') return val; - try { return JSON.parse(val); } catch { return val; } -} - // Zod schema for the diff request const workflowDiffSchema = z.object({ id: z.string(), diff --git a/tests/unit/mcp/handlers-workflow-diff.test.ts b/tests/unit/mcp/handlers-workflow-diff.test.ts index 11b844c..74faea7 100644 --- a/tests/unit/mcp/handlers-workflow-diff.test.ts +++ b/tests/unit/mcp/handlers-workflow-diff.test.ts @@ -17,9 +17,13 @@ vi.mock('@/services/workflow-diff-engine'); vi.mock('@/services/n8n-api-client'); vi.mock('@/config/n8n-api'); vi.mock('@/utils/logger'); -vi.mock('@/mcp/handlers-n8n-manager', () => ({ - getN8nApiClient: vi.fn(), -})); +vi.mock('@/mcp/handlers-n8n-manager', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getN8nApiClient: vi.fn(), + }; +}); // Import mocked modules import { getN8nApiClient } from '@/mcp/handlers-n8n-manager';