@decaf-ts/decorator-validation
Version:
simple decorator based validation engine
88 lines • 3.24 kB
JavaScript
import { ValidatorRegistry } from "./Validators/ValidatorRegistry.js";
import { ValidationKeys } from "./Validators/constants.js";
import { ModelKeys } from "./../utils/constants.js";
import { Metadata } from "@decaf-ts/decoration";
/**
* @summary Static class acting as a namespace for the Validation
*
* @class Validation
* @static
*
* @category Validation
*/
export class Validation {
static { this.actingValidatorRegistry = undefined; }
constructor() { }
/**
* @summary Defines the acting ValidatorRegistry
*
* @param {IValidatorRegistry} validatorRegistry the new implementation of the validator Registry
* @param {function(Validator): Validator} [migrationHandler] the method to map the validator if required;
*/
static setRegistry(validatorRegistry, migrationHandler) {
if (migrationHandler && Validation.actingValidatorRegistry)
Validation.actingValidatorRegistry.getKeys().forEach((k) => {
const validator = validatorRegistry.get(k);
if (validator)
validatorRegistry.register(migrationHandler(validator));
});
Validation.actingValidatorRegistry = validatorRegistry;
}
/**
* @summary Returns the current ValidatorRegistry
*
* @return IValidatorRegistry, defaults to {@link ValidatorRegistry}
*/
static getRegistry() {
if (!Validation.actingValidatorRegistry)
Validation.actingValidatorRegistry = new ValidatorRegistry();
return Validation.actingValidatorRegistry;
}
/**
* @summary Retrieves a validator
*
* @param {string} validatorKey one of the {@link ValidationKeys}
* @return {Validator | undefined} the registered Validator or undefined if there is nono matching the provided key
*/
static get(validatorKey) {
return Validation.getRegistry().get(validatorKey);
}
/**
* @summary Registers the provided validators onto the registry
*
* @param {T[] | ValidatorDefinition[]} validator
*/
static register(...validator) {
return Validation.getRegistry().register(...validator);
}
/**
* @summary Builds the key to store as Metadata under Reflections
* @description concatenates {@link ValidationKeys#REFLECT} with the provided key
*
* @param {string} key
*/
static key(key) {
return ValidationKeys.REFLECT + key;
}
/**
* @summary Returns all registered validation keys
*/
static keys() {
return this.getRegistry().getKeys();
}
static registerDecorator(key, decorator) {
const meta = Metadata["innerGet"](Symbol.for(ModelKeys.DECORATORS), Metadata.key(ValidationKeys.REFLECT, key));
if (meta?.[key])
return;
Metadata.set(ModelKeys.DECORATORS, Metadata.key(ValidationKeys.REFLECT, key), decorator);
}
static decoratorFromKey(key) {
try {
return Metadata["innerGet"](Symbol.for(ModelKeys.DECORATORS), Metadata.key(ValidationKeys.REFLECT, key));
}
catch (e) {
throw new Error(`No decorator registered under ${key}: ${e}`);
}
}
}
//# sourceMappingURL=Validation.js.map