UNPKG

@jovian/type-tools

Version:

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

446 lines 19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.superArgs = exports.beforeSuper = exports.beforeDefinitionOf = exports.perPropDefine = exports.ephemeral = exports.ModelDef = exports.defineOn = exports.TypeTools = exports.TypeToolsLibrary = void 0; var class_lineage_1 = require("./class-lineage"); var context_1 = require("./context"); var derivables_1 = require("./derivables"); var data_importable_1 = require("./data-importable"); var ephemerals_1 = require("./ephemerals"); var properties_controller_1 = require("./properties-controller"); var type_tools_1 = require("./type-tools"); var validatable_1 = require("./validatable"); var upstream_1 = require("./upstream"); var common_iface_1 = require("./upstream/common.iface"); var TypeToolsLibrary = (function () { function TypeToolsLibrary() { this.currentContext = context_1.Context; this.validatable = validatable_1.Validatable; this.ephemerals = ephemerals_1.Ephemerals; this.derivables = derivables_1.Derivables; this.propertiesController = properties_controller_1.PropertiesController; this.classLineage = class_lineage_1.ClassLineage; this.importable = data_importable_1.DataImportable; this.upstream = upstream_1.Upstream; this.initialize = function (target, init) { data_importable_1.DataImportable.implementOn(target); data_importable_1.DataImportable.getExtensionData(target).import(init); }; this.enforce = perPropDefine; this.client = { validatable: validatable_1.Validatable, ephemerals: ephemerals_1.Ephemerals, derivables: derivables_1.Derivables, propertiesController: properties_controller_1.PropertiesController, upstream: upstream_1.Upstream, }; this.server = { validatable: validatable_1.Validatable, ephemerals: ephemerals_1.Ephemerals, derivables: derivables_1.Derivables, propertiesController: properties_controller_1.PropertiesController, upstream: upstream_1.Upstream, }; this.validate = validatable_1.Validatable.test; this.config = { disable: function () { context_1.Context.disabled = true; }, ennable: function () { context_1.Context.disabled = false; }, disableThrow: function () { context_1.Context.throwErrors = false; }, enableThrow: function () { context_1.Context.throwErrors = false; }, disableExtensions: function () { var extClasses = []; for (var _i = 0; _i < arguments.length; _i++) { extClasses[_i] = arguments[_i]; } for (var _a = 0, extClasses_1 = extClasses; _a < extClasses_1.length; _a++) { var cls = extClasses_1[_a]; context_1.Context.disabledExtensions[(0, common_iface_1.typeFullName)(cls)] = cls; } }, enableExtensions: function () { var extClasses = []; for (var _i = 0; _i < arguments.length; _i++) { extClasses[_i] = arguments[_i]; } for (var _a = 0, extClasses_2 = extClasses; _a < extClasses_2.length; _a++) { var cls = extClasses_2[_a]; if (context_1.Context.disabledExtensions[(0, common_iface_1.typeFullName)(cls)]) { delete context_1.Context.disabledExtensions[(0, common_iface_1.typeFullName)(cls)]; } } }, disableClasses: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_1 = classes; _a < classes_1.length; _a++) { var cls = classes_1[_a]; context_1.Context.disabledClasses[(0, common_iface_1.typeFullName)(cls)] = cls; } }, enableClasses: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_2 = classes; _a < classes_2.length; _a++) { var cls = classes_2[_a]; if (context_1.Context.disabledClasses[(0, common_iface_1.typeFullName)(cls)]) { delete context_1.Context.disabledClasses[(0, common_iface_1.typeFullName)(cls)]; } } }, disableGettersFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_3 = classes; _a < classes_3.length; _a++) { var cls = classes_3[_a]; context_1.Context.getter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)] = cls; } }, enableGettersFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_4 = classes; _a < classes_4.length; _a++) { var cls = classes_4[_a]; if (context_1.Context.getter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]) { delete context_1.Context.getter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]; } } }, disableSettersFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_5 = classes; _a < classes_5.length; _a++) { var cls = classes_5[_a]; context_1.Context.setter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)] = cls; } }, enableSettersFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_6 = classes; _a < classes_6.length; _a++) { var cls = classes_6[_a]; if (context_1.Context.setter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]) { delete context_1.Context.setter.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]; } } }, disableOnValueChangesFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_7 = classes; _a < classes_7.length; _a++) { var cls = classes_7[_a]; context_1.Context.change.ignoredClasses[(0, common_iface_1.typeFullName)(cls)] = cls; } }, enableOnValueChangesFrom: function () { var classes = []; for (var _i = 0; _i < arguments.length; _i++) { classes[_i] = arguments[_i]; } for (var _a = 0, classes_8 = classes; _a < classes_8.length; _a++) { var cls = classes_8[_a]; if (context_1.Context.change.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]) { delete context_1.Context.change.ignoredClasses[(0, common_iface_1.typeFullName)(cls)]; } } }, }; } return TypeToolsLibrary; }()); exports.TypeToolsLibrary = TypeToolsLibrary; exports.TypeTools = new Proxy(new TypeToolsLibrary(), { get: function (target, prop) { switch (prop) { case 'client': context_1.Context.location = 'client'; break; case 'server': context_1.Context.location = 'server'; break; default: context_1.Context.location = 'all'; break; } return target[prop]; } }); function defineOn(target, asType, definer) { if (target && !target._tt_define) { Object.defineProperty(target, '_tt_define', { value: {} }); } if (context_1.Context.disabled || context_1.Context.defineDisabled) { return; } var typename = (0, common_iface_1.typeFullName)(asType); if (context_1.Context.disabledClasses[typename]) { return; } var contextCurrentSaved = context_1.Context.current; if (contextCurrentSaved && !context_1.Context.defineOnUnlock) { throw type_tools_1.TypeToolsBase.reusedTrace('TypeToolsLibrary.defineOn', 'defineOn cannot be called again within defineOn block.', true); } context_1.Context.target = target; if (context_1.Context.beforeDefinition[typename]) { var beforeDevCtxSaved = context_1.Context.beforeDefCurrent; context_1.Context.beforeDefCurrent = asType; for (var _i = 0, _a = context_1.Context.beforeDefinition[typename]; _i < _a.length; _i++) { var predef = _a[_i]; try { predef(target); } catch (e) { if (predef.onerror) { try { predef.onerror(e); } catch (e2) { } } } } context_1.Context.beforeDefCurrent = beforeDevCtxSaved; context_1.Context.beforeDefinition[typename] = null; } var error; context_1.Context.current = asType; if (asType.predefines) { for (var _b = 0, _c = asType.predefines; _b < _c.length; _b++) { var predefiner = _c[_b]; try { predefiner(target); } catch (e) { } } } try { definer(exports.TypeTools); } catch (e) { error = e; } if (asType.postdefines) { for (var _d = 0, _e = asType.postdefines; _d < _e.length; _d++) { var postdefiner = _e[_d]; try { postdefiner(target); } catch (e) { } } } context_1.Context.current = contextCurrentSaved; if (error) { throw error; } } exports.defineOn = defineOn; function ModelDef(target, type, init, rubric) { if (!target.__model_defs) { Object.defineProperty(target, '__model_defs', { value: {} }); } var modeldef = target.__model_defs; if (modeldef[type.name]) { throw new Error("Cannot have multiple model definitions for ".concat(type.name)); } modeldef[type.name] = type; defineOn(target, type, function (lib) { var options = {}; if (init) { options.init = init; } lib.enforce(target, options, rubric); if (type === target.constructor) { if (upstream_1.Upstream.hasUpstream(target.constructor)) { lib.upstream.setupOn(target, type); } } }); } exports.ModelDef = ModelDef; function ephemeral() { } exports.ephemeral = ephemeral; function perPropDefine(target, options, rubric) { if (!rubric) { rubric = {}; } var type = context_1.Context.current; if (!options) { options = {}; } if (!type) { type = class_lineage_1.ClassLineage.typeOf(target); } var propList = type_tools_1.TypeToolsBase.typeCacheGet(type, 'propList'); var ephemMap = type_tools_1.TypeToolsBase.typeCacheGet(type, 'propEphem'); var featuresMap = type_tools_1.TypeToolsBase.typeCacheGet(type, 'featuresMap'); var featuresMapMissing = featuresMap ? false : true; if (!featuresMap) { featuresMap = { validatable: false, derivables: false, ephemerals: false, }; } if (!propList) { propList = Object.keys(rubric); type_tools_1.TypeToolsBase.typeCacheSet(type, 'propList', propList); } var validatableRubric = {}; var ephemeralsRubric = ephemMap ? ephemMap : {}; var derivablesRubric = {}; propList.forEach(function (propName) { var propDef = rubric[propName]; var preValidations = []; if (!propDef) { return; } if (propDef.ephemeral !== undefined) { if (featuresMapMissing) { featuresMap.ephemerals = true; } if (!ephemMap) { ephemeralsRubric[propName] = propDef.ephemeral; } } if (propDef.derive) { if (featuresMapMissing) { featuresMap.derivables = true; } derivablesRubric[propName] = propDef.derive; } if (propDef.listOf) { target[propName]._set_args({ parent: target, prop: propName, type: propDef.listOf }); var propSkel = type_tools_1.TypeToolsBase.getSkeleton(type)[propName]; if (!propSkel._get_args.parent) { propSkel._set_args({ parent: target, prop: propName, type: propDef.listOf }); } preValidations.push(validatable_1.CommonValidations.notNull); preValidations.push(validatable_1.CommonValidations.list); if (!propDef.validate) { propDef.validate = function () { return []; }; } } if (propDef.dictOf) { target[propName]._set_args({ parent: target, prop: propName, rubric: propDef.dictOf }); var propSkel = type_tools_1.TypeToolsBase.getSkeleton(type)[propName]; if (!propSkel._get_args.parent) { propSkel._set_args({ parent: target, prop: propName, rubric: propDef.dictOf }); } preValidations.push(validatable_1.CommonValidations.notNull); preValidations.push(validatable_1.CommonValidations.dict); if (!propDef.validate) { propDef.validate = function () { return []; }; } } if (propDef.validate) { if (featuresMapMissing) { featuresMap.validatable = true; } var list_1 = propDef.validate(validatable_1.CommonValidations); if (preValidations.length > 0) { for (var i = preValidations.length - 1; i >= 0; --i) { list_1.unshift(preValidations[i]); } } validatableRubric[propName] = function (value, e) { var result; for (var _i = 0, list_2 = list_1; _i < list_2.length; _i++) { var validation = list_2[_i]; if (!validation) { continue; } if ((0, type_tools_1.isFunction)(validation)) { var funcName = validation.name; result = validation(e, e.value); if (result === false || e.data.canceled || e.data.stopped) { if (!e.thrown && !e.data.canceled) { var criteria = e.data.criteria ? '::' + e.data.criteria : ''; if (context_1.Context.throwErrorsForCommonValidations) { e.throw("Validation.function.".concat(funcName).concat(criteria)); } else { e.cancel("Validation.function.".concat(funcName).concat(criteria)); } } return result; } } else { var commonValidationName = validation + ''; var validator = validatable_1.CommonValidationsNamedImpl[commonValidationName]; if (validator) { result = validator(e, e.value); if (result === false || e.data.canceled || e.data.stopped) { if (!e.thrown && !e.data.canceled) { if (context_1.Context.throwErrorsForCommonValidations) { e.throw("Validation.common.".concat(commonValidationName)); } else { e.cancel("Validation.common.".concat(commonValidationName)); } } return result; } } } } return result; }; } }); if (!ephemMap) { type_tools_1.TypeToolsBase.typeCacheSet(type, 'propEphem', ephemMap); } if (featuresMapMissing) { type_tools_1.TypeToolsBase.typeCacheSet(type, 'featuresMap', featuresMap); } validatable_1.Validatable.enforce(target, {}, validatableRubric); ephemerals_1.Ephemerals.of(target, ephemeralsRubric); derivables_1.Derivables.of(target, {}, derivablesRubric); if (options.init && type === target.constructor && !context_1.Context.beforeSuper) { data_importable_1.DataImportable.getExtensionData(target).import(options.init); } } exports.perPropDefine = perPropDefine; function beforeDefinitionOf(type, predefiner, onerror) { var typename = (0, common_iface_1.typeFullName)(type); if (context_1.Context.disabled || context_1.Context.disabledClasses[typename] || context_1.Context.gettingSkeleton) { return; } if (!context_1.Context.beforeDefinition[typename]) { context_1.Context.beforeDefinition[typename] = []; } context_1.Context.beforeDefinition[typename].unshift(predefiner); if (onerror) { predefiner.onerror = onerror; } } exports.beforeDefinitionOf = beforeDefinitionOf; function beforeSuper(predefiner, args) { var saved = context_1.Context.beforeSuper; context_1.Context.beforeSuper = true; predefiner(); context_1.Context.beforeSuper = saved; return args; } exports.beforeSuper = beforeSuper; function superArgs() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return args; } exports.superArgs = superArgs; //# sourceMappingURL=feature-library.js.map