UNPKG

tsbase

Version:

Base class libraries for TypeScript

96 lines 3.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Model = void 0; const Regex_1 = require("../System/Regex"); const Strings_1 = require("../System/Strings"); const Result_1 = require("../Patterns/Result/Result"); const module_1 = require("../Patterns/Validator/module"); const MetadataKeys_1 = require("./MetadataKeys"); const hiddenFields = [ 'IsTemplate' ]; class Model { static GetKeyFromMemberFunc(member) { try { const postReturnString = member.toString().split('=>')[1]; const splitChar = postReturnString.includes('.') ? '.' : '['; return postReturnString.split(splitChar)[1].replace(Regex_1.Regex.NonAlphaNumeric, '').trim(); } catch (_a) { return Strings_1.Strings.Empty; } } constructor(IsTemplate = false) { this.IsTemplate = IsTemplate; } get ModelKeys() { return Object.keys(this).filter(k => !hiddenFields.includes(k)); } LabelFor(member) { return this.getMetadata(MetadataKeys_1.MetadataKeys.Label, member, typeof member === 'string' ? member : Model.GetKeyFromMemberFunc(member)); } DescriptionFor(member) { return this.getMetadata(MetadataKeys_1.MetadataKeys.Description, member, typeof member === 'string' ? member : Model.GetKeyFromMemberFunc(member)); } InputTypeFor(member) { return this.getMetadata(MetadataKeys_1.MetadataKeys.InputType, member, typeof member === 'string' ? member : Model.GetKeyFromMemberFunc(member)); } OptionsFor(member) { return this.getMetadata(MetadataKeys_1.MetadataKeys.Options, member, {}); } ValidationsFor(member) { return this.getMetadata(MetadataKeys_1.MetadataKeys.Validations, member, []); } Validate(member) { return member ? this.ValidateField(member) : this.validateModel(); } ValidateField(member) { const validations = this.ValidationsFor(member); const validator = new module_1.Validator(validations); return validator.Validate(this); } validateModel() { let result = new Result_1.Result(null); this.ModelKeys.forEach(key => { const isDataModel = !!this[key]['ModelKeys']; if (isDataModel) { const nestedDataModel = this[key]; result = result.CombineWith(nestedDataModel.Validate()); } else if (this.fieldIsArrayOfDataModel(this[key])) { result = this.validateDataModelArray(key, result); } else { const validations = this.ValidationsFor(key); result = result.CombineWith(new module_1.Validator(validations).Validate(this)); } }); return result; } validateDataModelArray(key, result) { const nestedDataModelArray = this[key]; nestedDataModelArray.forEach(model => { if (!model.IsTemplate) { result = result.CombineWith(model.Validate()); } }); return result; } fieldIsArrayOfDataModel(field) { return typeof field === 'object' && field[0] && field[0]['ModelKeys']; } getMetadata(metadataKey, member, defaultValue) { var _a; const key = typeof member === 'string' ? member : Model.GetKeyFromMemberFunc(member); const subKey = `${this.constructor.name}-${key}`; return ((_a = Model.Metadata[metadataKey]) === null || _a === void 0 ? void 0 : _a[subKey]) || defaultValue; } } exports.Model = Model; Model.Metadata = {}; //# sourceMappingURL=Model.js.map