snap-validate
Version:
Lightweight validation library for common patterns without heavy dependencies
215 lines (184 loc) • 5.04 kB
TypeScript
declare module 'snap-validate' {
/**
* Result of a validation operation
*/
export class ValidationResult {
constructor(isValid: boolean, errors?: string[]);
isValid: boolean;
errors: string[];
addError(message: string): ValidationResult;
}
/**
* Password validation options
*/
export interface PasswordOptions {
minLength?: number;
requireUppercase?: boolean;
requireLowercase?: boolean;
requireNumbers?: boolean;
requireSpecialChars?: boolean;
}
/**
* Phone number format types
*/
export type PhoneFormat = 'us' | 'international' | 'simple';
/**
* Country codes for zip code validation
*/
export type CountryCode = 'us' | 'ca' | 'uk';
/**
* Custom validation function that returns boolean
*/
export type CustomValidatorFunction = (
value: any
) => boolean | string | ValidationResult;
/**
* Async custom validation function
*/
export type AsyncValidatorFunction = (
value: any
) => Promise<boolean | string | ValidationResult>;
/**
* Conditional validation condition
*/
export type ConditionalFunction = (value: any) => boolean;
/**
* Conditional validator function
*/
export type ConditionalValidatorFunction = (value: any) => BaseValidator;
/**
* Base validator class with chainable validation methods
*/
export class BaseValidator {
constructor(value: any);
value: any;
rules: Array<() => ValidationResult>;
asyncRules: Array<() => Promise<ValidationResult>>;
isOptional: boolean;
regexTimeout: number;
/**
* Make field required
*/
required(message?: string): BaseValidator;
/**
* Make field optional (skips validation if empty)
*/
optional(): BaseValidator;
/**
* Set timeout for regex operations in milliseconds
*/
setRegexTimeout(timeoutMs: number): BaseValidator;
/**
* Set minimum length/value
*/
min(length: number, message?: string): BaseValidator;
/**
* Set maximum length/value
*/
max(length: number, message?: string): BaseValidator;
/**
* Validate against regex pattern (synchronous)
*/
pattern(regex: RegExp, message?: string): BaseValidator;
/**
* Validate against regex pattern with timeout protection (asynchronous)
*/
patternAsync(regex: RegExp, message?: string): BaseValidator;
/**
* Conditional validation
*/
when(
condition: boolean | ConditionalFunction,
validator: BaseValidator | ConditionalValidatorFunction
): BaseValidator;
/**
* Custom synchronous validation
*/
custom(
validatorFn: CustomValidatorFunction,
message?: string
): BaseValidator;
/**
* Custom asynchronous validation
*/
customAsync(
validatorFn: AsyncValidatorFunction,
message?: string
): BaseValidator;
/**
* Execute synchronous validation
*/
validate(): ValidationResult;
/**
* Execute asynchronous validation (includes sync rules)
*/
validateAsync(): Promise<ValidationResult>;
}
/**
* Predefined validators
*/
export interface Validators {
email(value: string): BaseValidator;
phone(value: string, format?: PhoneFormat): BaseValidator;
creditCard(value: string): BaseValidator;
url(value: string): BaseValidator;
password(value: string, options?: PasswordOptions): BaseValidator;
alphanumeric(value: string): BaseValidator;
numeric(value: string): BaseValidator;
zipCode(value: string, country?: CountryCode): BaseValidator;
}
/**
* Result of schema validation
*/
export interface SchemaValidationResult {
isValid: boolean;
errors: { [field: string]: ValidationResult };
getErrors(): { [field: string]: string[] };
}
/**
* Validation function type for schema
*/
export type ValidationFunction = (value: any) => BaseValidator;
/**
* Schema definition type
*/
export type Schema = { [field: string]: ValidationFunction | BaseValidator };
/**
* Predefined validator instances
*/
export const validators: Validators;
/**
* Validate data against schema synchronously
*/
export function validate(
schema: Schema,
data: { [key: string]: any }
): SchemaValidationResult;
/**
* Validate data against schema asynchronously
*/
export function validateAsync(
schema: Schema,
data: { [key: string]: any }
): Promise<SchemaValidationResult>;
/**
* Safely test regex with timeout protection (asynchronous)
*/
export function safeRegexTest(
regex: RegExp,
str: string,
timeoutMs?: number
): Promise<boolean>;
/**
* Safely test regex with input length protection (synchronous)
*/
export function safeRegexTestSync(
regex: RegExp,
str: string,
maxLength?: number
): boolean;
/**
* Check if a regex pattern is safe to use (ReDoS protection)
*/
export function isRegexSafe(regex: RegExp): boolean;
}