json-schema-to-joi
Version:
Converts JSON schema to Joi typescript code
94 lines • 3.02 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateArrayJoi = exports.resolveJoiArraySchema = void 0;
const types_1 = require("./types");
const _ = require("lodash");
const resolve_1 = require("./resolve");
const generate_1 = require("./generate");
const any_1 = require("./any");
function resolveAsArray(schema, options) {
if (_.isArray(schema)) {
return schema.map((v) => {
return resolve_1.resolveJSONSchema(v, options);
});
}
return [resolve_1.resolveJSONSchema(schema, options)];
}
function resolveJoiArraySchema(schema, options) {
const joiSchema = types_1.createJoiItem('array');
if (schema.items) {
let itemsIsArray = false;
if (_.isArray(schema.items)) {
itemsIsArray = true;
}
const items = resolveAsArray(schema.items, options);
if (itemsIsArray) {
joiSchema.ordered = items;
if (schema.additionalItems === true || schema.additionalItems === undefined) {
joiSchema.items = [{ type: 'any' }];
}
else if (schema.additionalItems !== false) {
joiSchema.items = [resolve_1.resolveJSONSchema(schema.additionalItems, options)];
}
}
else {
joiSchema.items = items;
}
}
_.isNumber(schema.minItems) && (joiSchema.min = schema.minItems);
_.isNumber(schema.maxItems) && (joiSchema.max = schema.maxItems);
_.isBoolean(schema.uniqueItems) && (joiSchema.unique = schema.uniqueItems);
any_1.resolveJoiAnyMeta(joiSchema, schema);
return joiSchema;
}
exports.resolveJoiArraySchema = resolveJoiArraySchema;
function generateArrayJoi(schema) {
const content = generate_1.openJoi([
200,
'array()'
]);
if (schema.ordered) {
content.push(...[
'.ordered',
"(",
]);
const items = schema.ordered;
items.forEach((item, i) => {
content.push(...generate_1.generateJoiStatement(item));
if (i !== items.length - 1) {
content.push(...[
",",
]);
}
});
content.push(...[
")",
]);
}
if (schema.items) {
content.push(...[
'.items',
"(",
]);
const items = schema.items;
items.forEach((item, i) => {
content.push(...generate_1.generateJoiStatement(item));
if (i !== items.length - 1) {
content.push(",");
}
});
content.push(...[
")",
]);
}
if (schema.min !== undefined) {
content.push(`.min(${schema.min})`);
}
if (schema.max !== undefined) {
content.push(`.max(${schema.max})`);
}
content.push(...any_1.generateAnyJoi(schema));
return generate_1.closeJoi(content);
}
exports.generateArrayJoi = generateArrayJoi;
//# sourceMappingURL=array.js.map
;