UNPKG

adpa-enterprise-framework-automation

Version:

Modular, standards-compliant Node.js/TypeScript automation framework for enterprise requirements, project, and data management. Provides CLI and API for BABOK v3, PMBOK 7th Edition, and DMBOK 2.0 (in progress). Production-ready Express.js API with TypeSpe

309 lines 8.29 kB
/** * Inquirer Validators * * Custom validators for inquirer prompts that integrate with the existing * InputValidationService for consistent validation across the CLI. * * @version 1.0.0 * @author ADPA Team */ import { InputValidationService } from './InputValidationService.js'; /** * Validator factory for inquirer prompts */ export class InquirerValidators { /** * Create a validator for project names */ static projectName() { return (input) => { const result = InputValidationService.validateProjectName(input); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for file paths */ static filePath() { return (input) => { const result = InputValidationService.validateFilePath(input); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for URLs */ static url() { return (input) => { const result = InputValidationService.validateUrl(input); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for email addresses */ static email() { return (input) => { const result = InputValidationService.validateEmail(input); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for API keys */ static apiKey(provider) { return (input) => { const result = InputValidationService.validateApiKey(input, provider); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for numbers */ static number(min, max) { return (input) => { const result = InputValidationService.validateNumber(input, min, max); return result.isValid ? true : result.error || 'Invalid input'; }; } /** * Create a validator for required text */ static required(fieldName = 'field') { return (input) => { if (!input || input.trim().length === 0) { return `${fieldName} is required`; } return true; }; } /** * Create a validator for text with minimum length */ static minLength(minLength, fieldName = 'field') { return (input) => { if (!input || input.trim().length < minLength) { return `${fieldName} must be at least ${minLength} characters long`; } return true; }; } /** * Create a validator for text with maximum length */ static maxLength(maxLength, fieldName = 'field') { return (input) => { if (input && input.length > maxLength) { return `${fieldName} must be no more than ${maxLength} characters long`; } return true; }; } /** * Create a validator that combines multiple validators */ static combine(...validators) { return (input) => { for (const validator of validators) { const result = validator(input); if (result !== true) { return result; } } return true; }; } /** * Create a validator for allowed values */ static allowedValues(allowedValues, caseSensitive = false) { return (input) => { const checkValue = caseSensitive ? input : input.toLowerCase(); const allowedSet = caseSensitive ? allowedValues : allowedValues.map(v => v.toLowerCase()); if (!allowedSet.includes(checkValue)) { return `Value must be one of: ${allowedValues.join(', ')}`; } return true; }; } /** * Create a validator for regex patterns */ static pattern(pattern, errorMessage) { return (input) => { if (!pattern.test(input)) { return errorMessage; } return true; }; } /** * Create a conditional validator */ static conditional(condition, validator) { return (input) => { if (condition(input)) { return validator(input); } return true; }; } } /** * Filter factory for inquirer prompts */ export class InquirerFilters { /** * Trim whitespace */ static trim() { return (input) => input.trim(); } /** * Convert to lowercase */ static toLowerCase() { return (input) => input.toLowerCase(); } /** * Convert to uppercase */ static toUpperCase() { return (input) => input.toUpperCase(); } /** * Sanitize input using InputValidationService */ static sanitize() { return (input) => InputValidationService.sanitizeInput(input); } /** * Parse number */ static parseNumber() { return (input) => { const num = parseFloat(input); return isNaN(num) ? 0 : num; }; } /** * Parse integer */ static parseInt() { return (input) => { const num = parseInt(input, 10); return isNaN(num) ? 0 : num; }; } /** * Combine multiple filters */ static combine(...filters) { return (input) => { return filters.reduce((value, filter) => filter(value), input); }; } } /** * Common prompt configurations */ export class InquirerPrompts { /** * Create a project name prompt */ static projectName(message = 'Enter project name:', defaultValue) { return { type: 'input', name: 'projectName', message, default: defaultValue, validate: InquirerValidators.projectName(), filter: InquirerFilters.trim() }; } /** * Create an API key prompt */ static apiKey(provider, message) { return { type: 'password', name: 'apiKey', message: message || `Enter ${provider} API key:`, validate: InquirerValidators.apiKey(provider), filter: InquirerFilters.trim() }; } /** * Create a confirmation prompt */ static confirm(message, defaultValue = false) { return { type: 'confirm', name: 'confirmed', message, default: defaultValue }; } /** * Create a list selection prompt */ static list(name, message, choices, defaultValue) { return { type: 'list', name, message, choices, default: defaultValue, pageSize: 10 }; } /** * Create a checkbox selection prompt */ static checkbox(name, message, choices) { return { type: 'checkbox', name, message, choices, pageSize: 10, validate: (answer) => { if (answer.length === 0) { return 'You must choose at least one option'; } return true; } }; } /** * Create a text input prompt */ static input(name, message, required = true, defaultValue) { return { type: 'input', name, message, default: defaultValue, validate: required ? InquirerValidators.required(name) : () => true, filter: InquirerFilters.trim() }; } /** * Create a password input prompt */ static password(name, message, minLength = 3) { return { type: 'password', name, message, validate: InquirerValidators.minLength(minLength, name), filter: InquirerFilters.trim() }; } } export default { InquirerValidators, InquirerFilters, InquirerPrompts }; //# sourceMappingURL=InquirerValidators.js.map