/** * Input Validation Utilities * Provides validation functions for user inputs */ window.Validators = window.Validators || {}; /** * Validate a number is within a range * @param {number} value - Value to validate * @param {number} min - Minimum allowed value (inclusive) * @param {number} max - Maximum allowed value (inclusive) * @param {string} fieldName - Name of the field for error messages * @returns {object} { isValid: boolean, value: number, error: string|null } */ window.Validators.validateRange = function(value, min, max, fieldName = 'Value') { const numValue = Number(value); if (isNaN(numValue)) { return { isValid: false, value: min, error: `${fieldName} must be a valid number` }; } if (numValue < min) { return { isValid: false, value: min, error: `${fieldName} must be at least ${min}` }; } if (numValue > max) { return { isValid: false, value: max, error: `${fieldName} must be at most ${max}` }; } return { isValid: true, value: numValue, error: null }; }; /** * Validate a port number * @param {number} port - Port number to validate * @returns {object} { isValid: boolean, value: number, error: string|null } */ window.Validators.validatePort = function(port) { const { PORT_MIN, PORT_MAX } = window.AppConstants.VALIDATION; return window.Validators.validateRange(port, PORT_MIN, PORT_MAX, 'Port'); }; /** * Validate a string is not empty * @param {string} value - String to validate * @param {string} fieldName - Name of the field for error messages * @returns {object} { isValid: boolean, value: string, error: string|null } */ window.Validators.validateNotEmpty = function(value, fieldName = 'Field') { const trimmedValue = String(value || '').trim(); if (trimmedValue.length === 0) { return { isValid: false, value: trimmedValue, error: `${fieldName} cannot be empty` }; } return { isValid: true, value: trimmedValue, error: null }; }; /** * Validate a boolean value * @param {any} value - Value to validate as boolean * @returns {object} { isValid: boolean, value: boolean, error: string|null } */ window.Validators.validateBoolean = function(value) { if (typeof value === 'boolean') { return { isValid: true, value: value, error: null }; } // Try to coerce common values if (value === 'true' || value === 1 || value === '1') { return { isValid: true, value: true, error: null }; } if (value === 'false' || value === 0 || value === '0') { return { isValid: true, value: false, error: null }; } return { isValid: false, value: false, error: 'Value must be true or false' }; }; /** * Validate a timeout/duration value (in milliseconds) * @param {number} value - Timeout value in ms * @param {number} minMs - Minimum allowed timeout (default: from constants) * @param {number} maxMs - Maximum allowed timeout (default: from constants) * @returns {object} { isValid: boolean, value: number, error: string|null } */ window.Validators.validateTimeout = function(value, minMs = null, maxMs = null) { const { TIMEOUT_MIN, TIMEOUT_MAX } = window.AppConstants.VALIDATION; return window.Validators.validateRange(value, minMs ?? TIMEOUT_MIN, maxMs ?? TIMEOUT_MAX, 'Timeout'); }; /** * Validate log limit * @param {number} value - Log limit value * @returns {object} { isValid: boolean, value: number, error: string|null } */ window.Validators.validateLogLimit = function(value) { const { LOG_LIMIT_MIN, LOG_LIMIT_MAX } = window.AppConstants.VALIDATION; return window.Validators.validateRange(value, LOG_LIMIT_MIN, LOG_LIMIT_MAX, 'Log limit'); }; /** * Validate and sanitize input with custom validator * @param {any} value - Value to validate * @param {Function} validator - Validator function * @param {boolean} showError - Whether to show error toast (default: true) * @returns {object} Validation result */ window.Validators.validate = function(value, validator, showError = true) { const result = validator(value); if (!result.isValid && showError && result.error) { window.ErrorHandler.showError(result.error); } return result; }; /** * Create a validated input handler for Alpine.js * @param {Function} validator - Validator function * @param {Function} onValid - Callback when validation passes * @returns {Function} Handler function */ window.Validators.createHandler = function(validator, onValid) { return function(value) { const result = window.Validators.validate(value, validator, true); if (result.isValid && onValid) { onValid.call(this, result.value); } return result.value; }; };