type-arango
Version:
ArangoDB Foxx decorators and utilities for TypeScript
127 lines • 4.12 kB
JavaScript
;
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