tsbase
Version:
Base class libraries for TypeScript
96 lines • 3.7 kB
JavaScript
"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