UNPKG

nowjs-core

Version:

NowCanDo Javascript Core [nowjs-core] is a library written by TypeScript code maintains under Apache 2.0 licence

147 lines (146 loc) 5.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const index_1 = require("./index"); const ValidationDefinition_1 = require("./ValidationDefinition"); const ValidatorBase_1 = require("./ValidatorBase"); class Validation { static registerValidator(data, validator) { let name = ''; if (typeof data === 'string' && !validator) { name = data; } else if (data instanceof ValidatorBase_1.ValidatorBase) { name = data.Name; } else { name = data.constructor.name; } Validation.validators.set(name, validator); return this; } static registerDefinition(name, definition) { if (!name) { return this; } Validation.definitions.set(name, definition); return this; } static jsonDefine(definition, json) { if (definition && json) { for (const itemName in json) { const item = json[itemName]; if (item && item.validators) { for (const validatorName in item.validators) { const validatorItem = item.validators[validatorName]; if (validatorItem) { const validatorFn = definition.on(itemName)[`${validatorName}`]; if (validatorFn) { validatorItem[index_1.VALIDATION_DEFINIIONITEM_KEY] = index_1.VALIDATION_DEFINIIONITEM_KEY; validatorFn.apply(definition, [validatorItem]); } } } } } } } static define(name, json) { if (!name) { return new ValidationDefinition_1.ValidationDefinition(); } const definition = new ValidationDefinition_1.ValidationDefinition(); if (json) { Validation.jsonDefine(definition, json); } Validation.definitions.set(name, definition); return definition; } static nestedValidatorDefine(definition, target, parentPropertyName) { if (target && typeof target !== 'object') { return; } for (const propertyKey of Reflect.ownKeys(Object.getPrototypeOf(target))) { let propertyName = propertyKey.toString(); if (propertyName === 'constructor') { continue; } if (typeof target[propertyKey] === 'function') { continue; } else if (typeof target[propertyKey] === 'object') { propertyName = parentPropertyName ? parentPropertyName + index_1.VALIDATION_PROPERTYPATH_SEPRATOR + propertyName : propertyName; Validation.nestedValidatorDefine(definition, target[propertyKey], propertyName); } else { const validatorIf = Reflect.getMetadata(index_1.VALIDATION_VALIDATEIF_METADATA_KEY, target, propertyName); if (validatorIf) { const result = validatorIf.apply(target); if (!result) { continue; } } const validator = Reflect.getMetadata(index_1.VALIDATOR_METADATA_KEY, target, propertyName); if (validator) { propertyName = parentPropertyName ? parentPropertyName + index_1.VALIDATION_PROPERTYPATH_SEPRATOR + propertyName : propertyName; definition.on(propertyName).add(validator); } } } } static async validate(target, arg1) { let definitionName = ''; const validatorPromises = []; if (!arg1) { if (Validation.definitions.has(target.constructor.name)) { definitionName = target.constructor.name; } else { const definition = Validation.define(); arg1 = definition; Validation.nestedValidatorDefine(definition, target); } } else if (typeof arg1 === 'string') { definitionName = arg1; arg1 = Validation.definitions.get(definitionName); if (!arg1) { throw new Error(`There is no registered definition by name : "${definitionName}"`); } } if (arg1 && arg1 instanceof ValidationDefinition_1.ValidationDefinition) { for (const item of arg1.Definitions) { const validators = item[1]; const context = new index_1.ValidationContext(target, item[0]); for (const validator of validators) { validatorPromises.push(validator.validate(context)); } } } else if (arg1 instanceof Array || typeof arg1 === 'object') { const context = new index_1.ValidationContext(target, ''); const validators = new Map(); if (typeof arg1 === 'object') { validators.set(arg1.Name, arg1); } else { for (const member of arg1) { validators.set(member.Name, member); } } for (const item of validators) { validatorPromises.push(item[1].validate(context)); } } return Promise.all(validatorPromises).then(results => { return results.every(item => item === true); }); } } exports.Validation = Validation; Validation.definitions = new Map(); Validation.validators = new Map();