sfcc-dev-mcp
Version:
MCP server for Salesforce B2C Commerce Cloud development assistance including logs, debugging, and development tools
112 lines • 4.12 kB
JavaScript
/**
* Validation helpers for handler arguments
*/
import { HandlerError } from './base-handler.js';
export class ValidationHelpers {
/**
* Validate arguments against a set of rules
*/
static validateArguments(args, rules, toolName) {
for (const rule of rules) {
const value = args?.[rule.field];
// Check required fields
if (rule.required && (value === undefined || value === null || value === '')) {
throw new HandlerError(rule.errorMessage ?? `${rule.field} is required`, toolName, 'MISSING_ARGUMENT', { field: rule.field, rules });
}
// Skip type and custom validation if value is not present and not required
if (!rule.required && (value === undefined || value === null)) {
continue;
}
// Check type (including for required fields that have values)
if (rule.type && value !== undefined && value !== null && !this.validateType(value, rule.type)) {
throw new HandlerError(rule.errorMessage ?? `${rule.field} must be of type ${rule.type}`, toolName, 'INVALID_TYPE', { field: rule.field, expectedType: rule.type, actualType: typeof value });
}
// Custom validation
if (rule.validator && !rule.validator(value)) {
throw new HandlerError(rule.errorMessage ?? `${rule.field} validation failed`, toolName, 'VALIDATION_FAILED', { field: rule.field, value });
}
}
}
/**
* Quick validation for required string fields
* @deprecated Use CommonValidations.requiredString() with validateArguments() instead
* @example
* // Old way
* ValidationHelpers.requireStrings(args, ['fieldName'], 'tool_name');
*
* // New way
* ValidationHelpers.validateArguments(args, CommonValidations.requiredString('fieldName'), 'tool_name');
*/
static requireStrings(args, fields, toolName) {
const rules = fields.map(field => ({
field,
required: true,
type: 'string',
errorMessage: `${field} is required for ${toolName}`,
}));
this.validateArguments(args, rules, toolName);
}
/**
* Validate a single field with custom validator
*/
static validateField(args, field, validator, errorMessage, toolName) {
const rules = [{
field,
validator,
errorMessage,
}];
this.validateArguments(args, rules, toolName);
}
static validateType(value, type) {
switch (type) {
case 'string':
return typeof value === 'string';
case 'number':
return typeof value === 'number' && !isNaN(value);
case 'boolean':
return typeof value === 'boolean';
case 'object':
return typeof value === 'object' && value !== null && !Array.isArray(value);
case 'array':
return Array.isArray(value);
default:
return true;
}
}
}
/**
* Common validation rules factory
*/
export const CommonValidations = {
/**
* Create a required string field validation
*/
requiredString: (field, customMessage) => [{
field,
required: true,
type: 'string',
validator: (value) => value.trim().length > 0,
errorMessage: customMessage ?? `${field} must be a non-empty string`,
}],
/**
* Create a required field validation with custom validator
*/
requiredField: (field, type, validator, errorMessage) => [{
field,
required: true,
type,
validator,
errorMessage,
}],
/**
* Create an optional field validation
*/
optionalField: (field, type, validator, errorMessage) => [{
field,
required: false,
type,
validator,
errorMessage,
}],
};
//# sourceMappingURL=validation-helpers.js.map