fortify-schema
Version:
TypeScript interface-like schema validation system that's easier to use than Zod
80 lines (65 loc) • 2.3 kB
text/typescript
import { ValidationStats } from "../../../../types/extension.type";
import { SchemaInterface } from "../../../../types/SchemaValidator.type";
import { ValidationEngine } from "../../mods";
/**
* Stream validator for continuous data validation
*/
export class StreamValidator {
private validListeners: Array<(data: any) => void> = [];
private invalidListeners: Array<(data: any, errors: Record<string, string[]>) => void> = [];
private statsListeners: Array<(stats: ValidationStats) => void> = [];
private stats: ValidationStats = {
totalValidated: 0,
validCount: 0,
invalidCount: 0,
errorRate: 0,
startTime: new Date()
};
constructor(private schema: SchemaInterface) {}
/**
* Validate streaming data
*/
validate(data: any): void {
this.stats.totalValidated++;
// Use modular validation engine
const validationResult = ValidationEngine.validateObject(this.schema, data);
if (validationResult.isValid) {
this.stats.validCount++;
this.validListeners.forEach(listener => listener(data));
} else {
this.stats.invalidCount++;
this.invalidListeners.forEach(listener => listener(data, validationResult.errors));
}
this.updateStats();
}
/**
* Listen for valid data
*/
onValid(listener: (data: any) => void): void {
this.validListeners.push(listener);
}
/**
* Listen for invalid data
*/
onInvalid(listener: (data: any, errors: Record<string, string[]>) => void): void {
this.invalidListeners.push(listener);
}
/**
* Listen for validation statistics
*/
onStats(listener: (stats: ValidationStats) => void): void {
this.statsListeners.push(listener);
}
/**
* Get current validation statistics
*/
getStats(): ValidationStats {
return { ...this.stats };
}
private updateStats(): void {
this.stats.errorRate = this.stats.totalValidated > 0
? this.stats.invalidCount / this.stats.totalValidated
: 0;
this.statsListeners.forEach(listener => listener(this.stats));
}
}