UNPKG

ts-comply

Version:

TypeTools is a Typescript library for providing extensible tooling runtime validations and type helpers.

372 lines 16.3 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.CommonValidationsNamedImpl = exports.CommonValidations = exports.Validatable = exports.ValidatableExtensionData = exports.ValidatableSettings = void 0; var type_tools_1 = require("./type-tools"); var data_importable_1 = require("./data-importable"); var properties_controller_1 = require("./properties-controller"); var context_1 = require("./context"); var class_lineage_1 = require("./class-lineage"); var common_iface_1 = require("./upstream/common.iface"); var ValidatableSettings = exports.ValidatableSettings = (function (_super) { __extends(ValidatableSettings, _super); function ValidatableSettings(init) { var _this = _super.call(this, init) || this; _this.extensionValidatable = ValidatableSettings.extensionValidatable; if (init) { Object.assign(_this, init); } return _this; } ValidatableSettings.extensionValidatable = 'Validatable'; return ValidatableSettings; }(properties_controller_1.PropertiesControllerSettings)); var ValidatableExtensionData = (function () { function ValidatableExtensionData() { } return ValidatableExtensionData; }()); exports.ValidatableExtensionData = ValidatableExtensionData; var Validatable = (function () { function Validatable(settings) { this.settings = (0, type_tools_1.settingsInitialize)(ValidatableSettings, settings); } Validatable.getExtensionData = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } return type_tools_1.TypeToolsBase.getExtension(target, settings.extensionValidatable, settings); }; Validatable.typeCheck = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } return target && !!Validatable.getExtensionData(target, settings); }; Validatable.implementOn = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } if (!type_tools_1.TypeToolsBase.checkContext(Validatable)) { return false; } if (!Validatable.getExtensionData(target, settings)) { data_importable_1.DataImportable.implementOn(target); properties_controller_1.PropertiesController.implementOn(target, settings); var pcExtension = properties_controller_1.PropertiesController.getExtensionData(target, settings); var managedProps_1 = pcExtension.managed; var extension_1 = { errors: [], cancels: [] }; pcExtension.oncancels.push(function (tracer) { context_1.Context.validationError = tracer.trace; if (!context_1.Context.trackCancels) { return; } var reg = managedProps_1[tracer.e.property]; if (reg.extension.validatable) { extension_1.cancels.push(tracer); } }); pcExtension.onerrors.push(function (tracer) { context_1.Context.validationError = tracer.trace; if (!context_1.Context.trackErrors) { return; } var reg = managedProps_1[tracer.e.property]; if (reg.extension.validatable) { extension_1.errors.push(tracer); } }); type_tools_1.TypeToolsBase.addExtension(target, settings.extensionValidatable, extension_1); } return true; }; Validatable.enforce = function (target, options, setterRubric, settings) { if (settings === void 0) { settings = ValidatableSettings; } if (!Validatable.implementOn(target, settings)) { return; } var type = class_lineage_1.ClassLineage.typeOf(target); if (!type.validationRules) { type.validationRules = {}; } if (!options) { options = {}; } if (context_1.Context.current && !context_1.Context.current.test) { var type_1 = context_1.Context.current; type_1.test = type_1.check = function (target2, throwError) { if (throwError === void 0) { throwError = false; } return Validatable.test(target2, type_1, throwError); }; } var validatedKeys = Object.keys(setterRubric); var descriptorsRubric = {}; for (var _i = 0, validatedKeys_1 = validatedKeys; _i < validatedKeys_1.length; _i++) { var propName = validatedKeys_1[_i]; type.validationRules[propName] = setterRubric[propName]; descriptorsRubric[propName] = { set: setterRubric[propName] }; } var manageOptions = {}; if (options.prepend) { manageOptions.prepend = true; } properties_controller_1.PropertiesController.manage(target, manageOptions, descriptorsRubric, settings); var managedProps = properties_controller_1.PropertiesController.getExtensionData(target, settings).managed; for (var _a = 0, validatedKeys_2 = validatedKeys; _a < validatedKeys_2.length; _a++) { var propName = validatedKeys_2[_a]; if (managedProps[propName]) { managedProps[propName].extension.validatable = true; } } data_importable_1.DataImportable.getExtensionData(target).import(options.init); }; Validatable.check = function (data, againstType, throwError) { if (throwError === void 0) { throwError = false; } return Validatable.test(data, againstType, throwError); }; Validatable.testProp = function (ruleType, propname, value, thisArg) { if (!ruleType.validationRules) { return true; } var setterRubric = ruleType.validationRules[propname]; var e = new properties_controller_1.PropertyAccessEvent({ property: propname, className: ruleType.name, classRealPath: (0, common_iface_1.typeFullName)(ruleType), path: ruleType.name + '.' + propname, class: ruleType, value: value, }); var passed = true; try { setterRubric.apply(thisArg, [value, e]); } catch (e) { passed = false; } if (e.thrown || e.data.canceled) { passed = false; } return passed; }; Validatable.test = function (data, againstType, throwError) { if (throwError === void 0) { throwError = false; } if (!data) { if (throwError) { throw type_tools_1.TypeToolsBase.reusedTrace('Validatable.validate::null_data', 'Cannot validate null data', true); } else { return false; } } var inst = type_tools_1.TypeToolsBase.getSampleInstance(againstType); var isValType = true; var extBase = inst[type_tools_1.TypeToolsSettings.typeToolsKey]; if (!extBase) { isValType = false; } var valExt = extBase ? extBase[ValidatableSettings.extensionValidatable] : null; if (!valExt) { isValType = false; } if (!isValType) { if (throwError) { throw type_tools_1.TypeToolsBase.reusedTrace('Validatable.validate::not_validatable', "".concat((0, common_iface_1.typeFullName)(againstType), " type is not validatable.")); } else { return false; } } var skel = type_tools_1.TypeToolsBase.getSkeleton(againstType); var throwErrorsSaved = context_1.Context.throwErrors; var trackErrorsSaved = context_1.Context.trackErrors; var trackCancelsSaved = context_1.Context.trackCancels; context_1.Context.throwErrors = context_1.Context.trackErrors = context_1.Context.trackCancels = false; var error; try { data_importable_1.DataImportable.getExtensionData(inst).import(data, skel, true); } catch (e) { error = e; } context_1.Context.throwErrors = throwErrorsSaved; context_1.Context.trackErrors = trackErrorsSaved; context_1.Context.trackCancels = trackCancelsSaved; if (type_tools_1.TypeToolsBase.topError) { if (throwError) { throw type_tools_1.TypeToolsBase.topError; } return false; } if (type_tools_1.TypeToolsBase.topCancel) { return false; } return true; }; Validatable.convertInto = function (type, data, throwOnError) { if (throwOnError === void 0) { throwOnError = true; } var validatableData; try { return validatableData = new type(data); } catch (e) { if (throwOnError) { throw e; } return null; } }; Validatable.errorsOf = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } var extension = Validatable.getExtensionData(target, settings); return extension.errors; }; Validatable.cancelsOf = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } var extension = Validatable.getExtensionData(target, settings); return extension.cancels; }; Validatable.resultOf = function (target, settings) { if (settings === void 0) { settings = ValidatableSettings; } var extension = Validatable.getExtensionData(target, settings); return extension.errors.length === 0 && extension.cancels.length === 0; }; Validatable.prototype.getExtensionData = function (target) { return Validatable.getExtensionData(target, this.settings); }; Validatable.prototype.typeCheck = function (target) { return Validatable.typeCheck(target, this.settings); }; Validatable.prototype.implementOn = function (target) { return Validatable.implementOn(target, this.settings); }; Validatable.prototype.enforce = function (target, options, setterRubric) { return Validatable.enforce(target, options, setterRubric, this.settings); }; Validatable.prototype.convertInto = function (type, data, throwOnError) { if (throwOnError === void 0) { throwOnError = true; } return Validatable.convertInto(type, data, throwOnError); }; Validatable.prototype.test = function (data, againstType, throwError) { if (throwError === void 0) { throwError = false; } return Validatable.test(data, againstType, throwError); }; return Validatable; }()); exports.Validatable = Validatable; context_1.Context.cast = function (a, type) { var unlockedSaved = context_1.Context.defineOnUnlock; context_1.Context.defineOnUnlock = true; var cast = Validatable.convertInto(type, a, false); context_1.Context.defineOnUnlock = unlockedSaved; return cast; }; exports.CommonValidations = { notNull: 'notNull', boolean: 'boolean', number: 'number', string: 'string', object: 'object', array: 'array', function: 'function', modelInstance: 'modelInstance', modelCollection: 'modelCollection', list: 'list', dict: 'dict', custom: function (validator) { return validator; }, extends: function (type) { var typename = typeof type === 'string' ? type : (0, common_iface_1.typeFullName)(type); return function (e, value) { if (!type) { return false; } return value && typeof value === 'object' && class_lineage_1.ClassLineage.mapOf(value)[typename]; }; }, extendsNot: function (type) { var typename = typeof type === 'string' ? type : (0, common_iface_1.typeFullName)(type); return function (e, value) { if (!type) { return true; } return !(value && typeof value === 'object' && class_lineage_1.ClassLineage.mapOf(value)[typename]); }; }, class: function (type) { var typename = typeof type === 'string' ? type : (0, common_iface_1.typeFullName)(type); return function (e, value) { if (!type) { return false; } return value && typeof value === 'object' && value.constructor.name === typename; }; }, classIn: function () { var types = []; for (var _i = 0; _i < arguments.length; _i++) { types[_i] = arguments[_i]; } var typenames = types.map(function (t) { return typeof t === 'string' ? t : (0, common_iface_1.typeFullName)(t); }); return function (e, value) { if (!types || types.length === 0) { return false; } return value && typeof value === 'object' && typenames.indexOf(value.constructor.name) >= 0; }; }, classNot: function (type) { var typename = typeof type === 'string' ? type : (0, common_iface_1.typeFullName)(type); return function (e, value) { if (!type) { return false; } return !(value && typeof value === 'object' && value.constructor.name === typename); }; }, classNotIn: function () { var types = []; for (var _i = 0; _i < arguments.length; _i++) { types[_i] = arguments[_i]; } var typenames = types.map(function (t) { return typeof t === 'string' ? t : (0, common_iface_1.typeFullName)(t); }); return function (e, value) { if (!types || types.length === 0) { return true; } return !(value && typeof value === 'object' && typenames.indexOf(value.constructor.name) >= 0); }; }, range: function () { var exprs = []; for (var _i = 0; _i < arguments.length; _i++) { exprs[_i] = arguments[_i]; } }, email: { toString: function () { return 'email'; }, }, phone: { toString: function () { return 'phone'; }, intl: 'phone_intl', }, phoneNumber: 1, }; exports.CommonValidationsNamedImpl = { 'notNull': function (e, value) { return value !== null && value !== undefined; }, 'boolean': function (e, value) { return value === true || value === false; }, 'number': function (e, value) { return typeof value === 'number'; }, 'integer': function (e, value) { return Math.floor(value) === value; }, 'naturalNumber': function (e, value) { return value > 0 && Math.floor(value) === value; }, 'wholeNumber': function (e, value) { return value >= 0 && Math.floor(value) === value; }, 'string': function (e, value) { return typeof value === 'string'; }, 'object': function (e, value) { return typeof value === 'object'; }, 'array': function (e, value) { return Array.isArray(value); }, 'function': function (e, value) { return (0, type_tools_1.isFunction)(value); }, 'modelInstance': function (e, value) { return type_tools_1.TypeToolsBase.typeCheck(value); }, 'modelCollection': function (e, value) { return (0, type_tools_1.isModelCollection)(value); }, 'list': function (e, value) { return type_tools_1.List.check(value); }, 'dict': function (e, value) { return type_tools_1.Dict.check(value); }, }; //# sourceMappingURL=validatable.js.map