refactor: deduplicate tryParseJson — export from handlers-n8n-manager

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) <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2026-03-27 18:45:03 +01:00
parent 9133f5e483
commit 22635b708b
3 changed files with 9 additions and 11 deletions

View File

@@ -2731,7 +2731,7 @@ const updateTableSchema = tableIdSchema.extend({
// MCP transports may serialize JSON objects/arrays as strings. // 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. // 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; if (typeof val !== 'string') return val;
try { return JSON.parse(val); } catch { return val; } try { return JSON.parse(val); } catch { return val; }
} }

View File

@@ -7,7 +7,7 @@ import { z } from 'zod';
import { McpToolResponse } from '../types/n8n-api'; import { McpToolResponse } from '../types/n8n-api';
import { WorkflowDiffRequest, WorkflowDiffOperation, WorkflowDiffValidationError } from '../types/workflow-diff'; import { WorkflowDiffRequest, WorkflowDiffOperation, WorkflowDiffValidationError } from '../types/workflow-diff';
import { WorkflowDiffEngine } from '../services/workflow-diff-engine'; 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 { N8nApiError, getUserFriendlyErrorMessage } from '../utils/n8n-errors';
import { logger } from '../utils/logger'; import { logger } from '../utils/logger';
import { InstanceContext } from '../types/instance-context'; import { InstanceContext } from '../types/instance-context';
@@ -36,12 +36,6 @@ const NODE_TARGETING_OPERATIONS = new Set([
'updateNode', 'removeNode', 'moveNode', 'enableNode', 'disableNode' '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 // Zod schema for the diff request
const workflowDiffSchema = z.object({ const workflowDiffSchema = z.object({
id: z.string(), id: z.string(),

View File

@@ -17,9 +17,13 @@ vi.mock('@/services/workflow-diff-engine');
vi.mock('@/services/n8n-api-client'); vi.mock('@/services/n8n-api-client');
vi.mock('@/config/n8n-api'); vi.mock('@/config/n8n-api');
vi.mock('@/utils/logger'); vi.mock('@/utils/logger');
vi.mock('@/mcp/handlers-n8n-manager', () => ({ vi.mock('@/mcp/handlers-n8n-manager', async (importOriginal) => {
getN8nApiClient: vi.fn(), const actual = await importOriginal<typeof import('@/mcp/handlers-n8n-manager')>();
})); return {
...actual,
getN8nApiClient: vi.fn(),
};
});
// Import mocked modules // Import mocked modules
import { getN8nApiClient } from '@/mcp/handlers-n8n-manager'; import { getN8nApiClient } from '@/mcp/handlers-n8n-manager';