decoval
Version:
DecoVal is a decorator-driven validation pattern that allows you to add validation rules directly to the properties of TypeScript classes, simplifying data control and increasing code readability and reusability.
36 lines (28 loc) • 1.12 kB
text/typescript
import { ValidationSkipError } from "./error/validation.SkipError";
import { validationMetadata } from "./register.validation";
type ValidationErrors = Record<string, string[]>;
export function decoValidation<T extends object>(instance: T): Promise<T> {
return new Promise((resolve, reject) => {
const errors: ValidationErrors = {};
const constructorName = instance.constructor.name;
for (const key of Object.keys(instance)) {
const propertyKey = `${constructorName}.${key}`;
const value = (instance as any)[key];
const validators = validationMetadata.get(propertyKey);
if (!validators) continue;
try {
for (const validate of validators) {
validate(value);
}
} catch (err) {
if (err instanceof ValidationSkipError) {
continue;
}
const message = err instanceof Error ? err.message : String(err);
if (!errors[key]) errors[key] = [];
errors[key].push(message);
}
}
Object.keys(errors).length > 0 ? reject(errors) : resolve(instance);
});
}