UNPKG

type-arango

Version:

ArangoDB Foxx decorators and utilities for TypeScript

127 lines 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.joiDefaults = exports.enjoi = exports.toJoi = void 0; var joi_1 = require("../joi"); var models_1 = require("../models"); var _1 = require("."); /** * Convert type or alias to joi */ function toJoi(inp, presence) { var _a; if (presence === void 0) { presence = 'optional'; } if (inp) { if (inp.isJoi) return inp; if (inp.schema) return inp.schema; } var j = joi_1.Joi.any(); switch (inp) { case String: case 'string': j = joi_1.Joi.string(); break; case Number: case 'number': j = joi_1.Joi.number(); break; case Array: case 'array': j = joi_1.Joi.array(); break; case Boolean: case 'boolean': j = joi_1.Joi.boolean(); break; case 'binary': j = joi_1.Joi.binary(); break; case Date: case 'date': j = joi_1.Joi.date(); break; case Function: case 'func': case 'function': j = joi_1.Joi.func(); break; case Object: case 'object': j = joi_1.Joi.object(); break; case null: case 'any': j = joi_1.Joi.any(); break; case 'alternatives': j = joi_1.Joi.alternatives(); break; default: if (!inp) break; if (Array.isArray(inp)) { j = (_a = joi_1.Joi.any()).valid.apply(_a, inp); } else if (_1.isObject(inp)) { if (inp.prototype) { var doc = models_1.getDocumentForContainer(inp); if (doc) j = joi_1.Joi.object().keys(doc.schema); break; } else { Object.keys(inp).forEach(function (k) { return inp[k] = toJoi(inp[k]); }); j = joi_1.Joi.object().keys(inp); } } // @Nested else if (typeof inp === 'function' && models_1.findDocumentForContainer(inp)) { j = models_1.findDocumentForContainer(inp).joi; } break; } if (!j) { j = joi_1.Joi.any(); } if (presence === 'required') { j = j.required(); } return j; } exports.toJoi = toJoi; /** * Enhance joi a little */ function enjoi(inp, presence) { if (presence === void 0) { presence = 'optional'; } if (inp === undefined) return joi_1.Joi; // return document schema for entity references if (typeof inp === 'function') { var doc = models_1.findDocumentForContainer(inp); return doc ? doc.schema : toJoi(inp, presence); } return toJoi(inp, presence); } exports.enjoi = enjoi; function joiDefaults(obj, override) { if (override === void 0) { override = {}; } return Array.isArray(obj._inner.children) ? obj._inner.children.reduce(function (res, child) { var key = child.key; if (child.schema._type == 'object') { res[key] = joiDefaults(child.schema, override[key]); } else { // convert strings to integer / floats when the attribute type is a number (this should be done by joi's .validate, inside ArangoDB Foxx) if (override[key] && child.schema._type === 'number') { override[key] = child.schema._tests.find(function (t) { return t.name === 'integer'; }) ? parseInt(override[key], 10) : parseFloat(override[key]); } if (override[key] || child.schema._flags.default) res[key] = override[key] || child.schema._flags.default; } return res; }, {}) : undefined; } exports.joiDefaults = joiDefaults; //# sourceMappingURL=enjoi.js.map