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
JavaScript
/**
* 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