UNPKG

avifors

Version:

A MDE tool that generates code from a YAML definition of your app domain model.

187 lines (170 loc) 6.08 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; exports.getTypes = getTypes; /** * Core types */ function getTypes(avifors) { var types = {}; setListType(types, avifors); setMapType(types, avifors); setOneOfType(types, avifors); setBasicTypes(types, avifors); return types; } function setListType(types, avifors) { types.list = function (children) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$validators = _ref.validators, validators = _ref$validators === undefined ? [] : _ref$validators, _ref$builders = _ref.builders, builders = _ref$builders === undefined ? [] : _ref$builders; return { type: 'list', build: function build() { var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var result = value.map(function (i) { return children.build(i); }); builders.forEach(function (builder) { return result = builder(result); }); return result; }, normalize: function normalize() { return [children.normalize()]; }, validate: function validate(i, path) { avifors.assert(i == null || Array.isArray(i), path + ' must be a list, ' + i + ' given'); avifors.validate(validators, i, path); if (i == null) { return; } i.forEach(function (v, j) { return children.validate(v, path + '[' + j + ']'); }); } }; }; } function setMapType(types, avifors) { types.map = function (keys) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$validators = _ref2.validators, validators = _ref2$validators === undefined ? [] : _ref2$validators, _ref2$builders = _ref2.builders, builders = _ref2$builders === undefined ? [] : _ref2$builders, _ref2$defaults = _ref2.defaults, defaults = _ref2$defaults === undefined ? function () { return {}; } : _ref2$defaults, _ref2$strict = _ref2.strict, strict = _ref2$strict === undefined ? true : _ref2$strict; return { type: 'map', build: function build() { var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var result = {}; for (var i in keys) { result[i] = keys[i].build(value[i]); } result = Object.assign(defaults(result), result); builders.forEach(function (builder) { return result = builder(result); }); return result; }, normalize: function normalize() { var result = {}; for (var i in keys) { result[i] = keys[i].normalize(); } return result; }, validate: function validate(i, path) { avifors.assert(i == null || (typeof i === 'undefined' ? 'undefined' : _typeof(i)) === 'object' && !Array.isArray(i), path + ' must be a map, ' + i + ' given'); avifors.validate(validators, i, path); if (i == null) { return; } for (var j in i) { if (strict) { avifors.assert(j in keys, 'Unexpected key "' + j + '" in ' + path); } if (j in keys) { keys[j].validate(i[j], path + '.' + j); } } } }; }; } function setOneOfType(aTypes, avifors) { aTypes.oneOf = function (types, builder) { var getType = function getType(value) { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; return types.find(function (t) { try { return t.validate(value, path) == undefined; } catch (e) { return false; } }); }; var getTypeIndex = function getTypeIndex(value) { return types.indexOf(getType(value)); }; return { type: 'oneOf', build: function build(value) { var typeIndex = getTypeIndex(value); return types[typeIndex].build(builder(value, typeIndex)); }, normalize: function normalize() { return { 'one of': types.map(function (i) { return i.normalize(); }) }; }, validate: function validate(i, path) { return avifors.assert(getType(i, path) !== undefined, 'Could not resolve ' + path + ': no type could validate given value'); } }; }; } function setBasicTypes(types, avifors) { var basicTypes = ['string', 'number', 'boolean']; var buildBasicType = function buildBasicType(type) { return function () { var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$validators = _ref3.validators, validators = _ref3$validators === undefined ? [] : _ref3$validators, _ref3$builders = _ref3.builders, builders = _ref3$builders === undefined ? [] : _ref3$builders; return { type: type, build: function build(value) { var result = value; builders.forEach(function (builder) { return result = builder(result); }); return result; }, normalize: function normalize() { return type + (validators.length ? ' (' + validators.map(function (v) { return v.normalize(); }).join(', ') + ')' : ''); }, validate: function validate(i, path) { avifors.assert((typeof i === 'undefined' ? 'undefined' : _typeof(i)) === type || i == null, path + ' must be a ' + type + ', "' + i + '" given'); avifors.validate(validators, i, path); } }; }; }; basicTypes.forEach(function (type) { return types[type] = buildBasicType(type); }); }