@jovian/type-tools
Version:
TypeTools is a Typescript library for providing extensible tooling runtime validations and type helpers.
446 lines • 19 kB
JavaScript
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
;