mirror of https://gitee.com/bigwinds/arangodb
313 lines
8.5 KiB
JavaScript
313 lines
8.5 KiB
JavaScript
'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.default = convert;
|
|
|
|
var _assert = require('assert');
|
|
|
|
var _assert2 = _interopRequireDefault(_assert);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
// Converter helpers for Joi types.
|
|
|
|
var TYPES = {
|
|
|
|
alternatives: function alternatives(schema, joi, transformer) {
|
|
|
|
var result = schema.oneOf = [];
|
|
|
|
joi._inner.matches.forEach(function (match) {
|
|
|
|
if (match.schema) {
|
|
return result.push(convert(match.schema, transformer));
|
|
}
|
|
|
|
if (!match.is) {
|
|
throw new Error('joi.when requires an "is"');
|
|
}
|
|
if (!(match.then || match.otherwise)) {
|
|
throw new Error('joi.when requires one or both of "then" and "otherwise"');
|
|
}
|
|
|
|
if (match.then) {
|
|
result.push(convert(match.then, transformer));
|
|
}
|
|
|
|
if (match.otherwise) {
|
|
result.push(convert(match.otherwise, transformer));
|
|
}
|
|
});
|
|
return schema;
|
|
},
|
|
|
|
date: function date(schema, joi) {
|
|
if (joi._flags.timestamp) {
|
|
schema.type = 'integer';
|
|
return schema;
|
|
}
|
|
|
|
schema.type = 'string';
|
|
schema.format = 'date-time';
|
|
return schema;
|
|
},
|
|
|
|
any: function any(schema) {
|
|
schema.type = ["array", "boolean", 'number', "object", 'string', "null"];
|
|
return schema;
|
|
},
|
|
|
|
array: function array(schema, joi, transformer) {
|
|
schema.type = 'array';
|
|
|
|
joi._tests.forEach(function (test) {
|
|
switch (test.name) {
|
|
case 'unique':
|
|
schema.uniqueItems = true;
|
|
break;
|
|
case 'length':
|
|
schema.minItems = schema.maxItems = test.arg;
|
|
break;
|
|
case 'min':
|
|
schema.minItems = test.arg;
|
|
break;
|
|
case 'max':
|
|
schema.maxItems = test.arg;
|
|
break;
|
|
}
|
|
});
|
|
|
|
if (joi._inner) {
|
|
if (joi._inner.ordereds.length) {
|
|
schema.ordered = joi._inner.ordereds.map(function (item) {
|
|
return convert(item, transformer);
|
|
});
|
|
}
|
|
|
|
var list = void 0;
|
|
if (joi._inner.inclusions.length) {
|
|
list = joi._inner.inclusions;
|
|
} else if (joi._inner.requireds.length) {
|
|
list = joi._inner.requireds;
|
|
}
|
|
|
|
if (list) {
|
|
schema.items = convert(list[0], transformer);
|
|
}
|
|
}
|
|
|
|
return schema;
|
|
},
|
|
|
|
binary: function binary(schema, joi) {
|
|
schema.type = 'string';
|
|
schema.contentMediaType = joi._meta.length > 0 && joi._meta[0].contentMediaType ? joi._meta[0].contentMediaType : 'text/plain';
|
|
schema.contentEncoding = joi._flags.encoding ? joi._flags.encoding : 'binary';
|
|
return schema;
|
|
},
|
|
|
|
boolean: function boolean(schema) {
|
|
schema.type = 'boolean';
|
|
return schema;
|
|
},
|
|
|
|
number: function number(schema, joi) {
|
|
schema.type = 'number';
|
|
joi._tests.forEach(function (test) {
|
|
switch (test.name) {
|
|
case 'integer':
|
|
schema.type = 'integer';
|
|
break;
|
|
case 'less':
|
|
schema.exclusiveMaximum = true;
|
|
schema.maximum = test.arg;
|
|
break;
|
|
case 'greater':
|
|
schema.exclusiveMinimum = true;
|
|
schema.minimum = test.arg;
|
|
break;
|
|
case 'min':
|
|
schema.minimum = test.arg;
|
|
break;
|
|
case 'max':
|
|
schema.maximum = test.arg;
|
|
break;
|
|
case 'precision':
|
|
var multipleOf = void 0;
|
|
if (test.arg > 1) {
|
|
multipleOf = JSON.parse('0.' + '0'.repeat(test.arg - 1) + '1');
|
|
} else {
|
|
multipleOf = 1;
|
|
}
|
|
schema.multipleOf = multipleOf;
|
|
break;
|
|
}
|
|
});
|
|
return schema;
|
|
},
|
|
|
|
string: function string(schema, joi) {
|
|
schema.type = 'string';
|
|
|
|
joi._tests.forEach(function (test) {
|
|
switch (test.name) {
|
|
case 'email':
|
|
schema.format = 'email';
|
|
break;
|
|
case 'regex':
|
|
// for backward compatibility
|
|
var arg = test.arg;
|
|
|
|
// This is required for backward compatibility
|
|
// Location "pattern" had changed since Joi v9.0.0
|
|
//
|
|
// For example:
|
|
//
|
|
// before Joi v9: test.arg
|
|
// since Joi v9: test.arg.pattern
|
|
|
|
var pattern = arg && arg.pattern ? arg.pattern : arg;
|
|
schema.pattern = String(pattern).replace(/^\//, '').replace(/\/$/, '');
|
|
break;
|
|
case 'min':
|
|
schema.minLength = test.arg;
|
|
break;
|
|
case 'max':
|
|
schema.maxLength = test.arg;
|
|
break;
|
|
case 'length':
|
|
schema.minLength = schema.maxLength = test.arg;
|
|
break;
|
|
case 'uri':
|
|
schema.format = 'uri';
|
|
break;
|
|
}
|
|
});
|
|
|
|
return schema;
|
|
},
|
|
|
|
object: function object(schema, joi, transformer) {
|
|
schema.type = 'object';
|
|
schema.properties = {};
|
|
schema.additionalProperties = Boolean(joi._flags.allowUnknown);
|
|
schema.patterns = joi._inner.patterns.map(function (pattern) {
|
|
return { regex: pattern.regex, rule: convert(pattern.rule, transformer) };
|
|
});
|
|
|
|
if (!joi._inner.children) {
|
|
return schema;
|
|
}
|
|
|
|
joi._inner.children.forEach(function (property) {
|
|
if (property.schema._flags.presence !== 'forbidden') {
|
|
schema.properties[property.key] = convert(property.schema, transformer);
|
|
if (property.schema._flags.presence === 'required') {
|
|
schema.required = schema.required || [];
|
|
schema.required.push(property.key);
|
|
}
|
|
}
|
|
});
|
|
|
|
return schema;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Converts the supplied joi validation object into a JSON schema object,
|
|
* optionally applying a transformation.
|
|
*
|
|
* @param {JoiValidation} joi
|
|
* @param {TransformFunction} [transformer=null]
|
|
* @returns {JSONSchema}
|
|
*/
|
|
function convert(joi) {
|
|
var transformer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
|
|
|
|
(0, _assert2.default)('object' === (typeof joi === 'undefined' ? 'undefined' : _typeof(joi)) && true === joi.isJoi, 'requires a joi schema object');
|
|
|
|
(0, _assert2.default)(joi._type, 'joi schema object must have a type');
|
|
|
|
if (!TYPES[joi._type]) {
|
|
throw new Error('sorry, do not know how to convert unknown joi type: "' + joi._type + '"');
|
|
}
|
|
|
|
if (transformer) {
|
|
(0, _assert2.default)('function' === typeof transformer, 'transformer must be a function');
|
|
}
|
|
|
|
// JSON Schema root for this type.
|
|
var schema = {};
|
|
|
|
// Copy over the details that all schemas may have...
|
|
if (joi._description) {
|
|
schema.description = joi._description;
|
|
}
|
|
|
|
if (joi._examples && joi._examples.length > 0) {
|
|
schema.examples = joi._examples;
|
|
}
|
|
|
|
if (joi._examples && joi._examples.length === 1) {
|
|
schema.example = joi._examples[0];
|
|
}
|
|
|
|
// Add the label as a title if it exists
|
|
if (joi._settings && joi._settings.language && joi._settings.language.label) {
|
|
schema.title = joi._settings.language.label;
|
|
} else if (joi._flags && joi._flags.label) {
|
|
schema.title = joi._flags.label;
|
|
}
|
|
|
|
// Checking for undefined and null explicitly to allow false and 0 values
|
|
if (joi._flags && joi._flags.default !== undefined && joi._flags.default !== null) {
|
|
schema['default'] = joi._flags.default;
|
|
}
|
|
|
|
if (joi._valids && joi._valids._set && (joi._valids._set.size || joi._valids._set.length)) {
|
|
if (Array.isArray(joi._inner.children) || !joi._flags.allowOnly) {
|
|
return {
|
|
'anyOf': [{
|
|
'type': joi._type,
|
|
'enum': [].concat(_toConsumableArray(joi._valids._set))
|
|
}, TYPES[joi._type](schema, joi, transformer)]
|
|
};
|
|
}
|
|
schema['enum'] = [].concat(_toConsumableArray(joi._valids._set));
|
|
}
|
|
|
|
var result = TYPES[joi._type](schema, joi, transformer);
|
|
|
|
if (transformer) {
|
|
result = transformer(result, joi);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
module.exports = exports = convert;
|
|
convert.TYPES = TYPES;
|
|
|
|
/**
|
|
* Joi Validation Object
|
|
* @typedef {object} JoiValidation
|
|
*/
|
|
|
|
/**
|
|
* Transformation Function - applied just before `convert()` returns and called as `function(object):object`
|
|
* @typedef {function} TransformFunction
|
|
*/
|
|
|
|
/**
|
|
* JSON Schema Object
|
|
* @typedef {object} JSONSchema
|
|
*/
|
|
//# sourceMappingURL=index.js.map
|