fix: address critical code review issues for validation improvements

- Fix type safety vulnerability in enhanced-config-validator.ts
  - Added proper type checking before string operations
  - Return early when nodeType is invalid instead of using empty string

- Improve error handling robustness in MCP server
  - Wrapped validation in try-catch to handle unexpected errors
  - Properly re-throw ValidationError instances
  - Add user-friendly error messages for internal errors

- Write comprehensive CHANGELOG entry for v2.10.3
  - Document fixes for issues #58, #68, #70, #73
  - Detail new validation system features
  - List all enhancements and test coverage

Addressed HIGH priority issues from code review:
- Type safety holes in config validator
- Missing error handling for validation system failures
- Consistent error types across validation tools
This commit is contained in:
czlonkowski
2025-08-07 20:05:57 +02:00
parent 48986263bf
commit 13c1663489
12 changed files with 1106 additions and 128 deletions

View File

@@ -157,7 +157,7 @@ describe('WorkflowValidator - Edge Cases', () => {
nodes: [],
connections: {}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.valid).toBe(true);
expect(result.warnings.some(w => w.message.includes('empty'))).toBe(true);
});
@@ -181,7 +181,7 @@ describe('WorkflowValidator - Edge Cases', () => {
const workflow = { nodes, connections };
const start = Date.now();
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
const duration = Date.now() - start;
expect(result).toBeDefined();
@@ -207,7 +207,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.statistics.invalidConnections).toBe(0);
});
@@ -228,7 +228,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.valid).toBe(true);
});
});
@@ -264,7 +264,7 @@ describe('WorkflowValidator - Edge Cases', () => {
connections: {}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.errors.length).toBeGreaterThan(0);
});
@@ -292,7 +292,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.warnings.some(w => w.message.includes('self-referencing'))).toBe(true);
});
@@ -308,7 +308,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.errors.some(e => e.message.includes('non-existent'))).toBe(true);
});
@@ -324,7 +324,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.errors.length).toBeGreaterThan(0);
});
@@ -341,7 +341,7 @@ describe('WorkflowValidator - Edge Cases', () => {
} as any
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
// Should still work as type and index can have defaults
expect(result.statistics.validConnections).toBeGreaterThan(0);
});
@@ -359,7 +359,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.errors.some(e => e.message.includes('Invalid'))).toBe(true);
});
});
@@ -382,7 +382,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.valid).toBe(true);
});
@@ -395,7 +395,7 @@ describe('WorkflowValidator - Edge Cases', () => {
connections: {}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.warnings.some(w => w.message.includes('very long'))).toBe(true);
});
});
@@ -479,7 +479,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.statistics.validConnections).toBeGreaterThan(0);
});
});
@@ -499,7 +499,7 @@ describe('WorkflowValidator - Edge Cases', () => {
}
};
const result = await validator.validateWorkflow(workflow);
const result = await validator.validateWorkflow(workflow as any);
expect(result.errors.length).toBeGreaterThan(0);
expect(result.statistics.validConnections).toBeGreaterThan(0);
});