UNPKG

json-schema-to-joi

Version:

Converts JSON schema to Joi typescript code

135 lines 4.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateAlternativesJoi = exports.resolveJoiAlternativesSchema = void 0; const types_1 = require("./types"); const resolve_1 = require("./resolve"); const generate_1 = require("./generate"); const any_1 = require("./any"); function resolveCombiningSchemas(schemas, parentSchema, mode = 'any', options) { const joiSchema = types_1.createJoiItem('alternatives'); if (mode === 'all') { joiSchema.allOf = schemas.map((v) => resolve_1.resolveJSONSchema(v, options)); } else if (mode === 'one') { joiSchema.oneOf = schemas.map((v) => resolve_1.resolveJSONSchema(v, options)); } else { joiSchema.anyOf = schemas.map((v) => resolve_1.resolveJSONSchema(v, options)); } any_1.resolveJoiAnyMeta(joiSchema, parentSchema); return joiSchema; } function resolveNot(schema, parentSchema, options) { const joiSchema = types_1.createJoiItem('alternatives'); joiSchema.not = resolve_1.resolveJSONSchema(schema, options); any_1.resolveJoiAnyMeta(joiSchema, parentSchema); return joiSchema; } function resolveAnyOf(schemas, parentSchema, options) { const joiSchema = types_1.createJoiItem('alternatives'); joiSchema.anyOf = schemas.map((v) => { return resolve_1.resolveJSONSchema(v, options); }); any_1.resolveJoiAnyMeta(joiSchema, parentSchema); return joiSchema; } function resolveJoiAlternativesSchema(schema, options) { if (schema.not) { return resolveNot(schema.not, schema, options); } if (options && options.useDeprecatedJoi && options.useExtendedJoi) { if (schema.anyOf) { return resolveAnyOf(schema.anyOf, schema, options); } } else { if (schema.anyOf) { return resolveCombiningSchemas(schema.anyOf, schema, 'any', options); } if (schema.allOf) { return resolveCombiningSchemas(schema.allOf, schema, 'all', options); } if (schema.oneOf) { return resolveCombiningSchemas(schema.oneOf, schema, 'one', options); } } return types_1.createJoiItem('alternatives'); } exports.resolveJoiAlternativesSchema = resolveJoiAlternativesSchema; function generateNot(not) { const content = generate_1.openJoi([ 200, 'any()', ]); content.push(...[ '.when', "(", 200, 'alternatives().try', "(", ...generate_1.generateJoiStatement(not), ")", ",", "{", 'then: ', 200, 'any().forbidden()', ",", 'otherwise: ', 200, 'any(),', "}", ")", ]); return generate_1.closeJoi(content); } function generateCombineSchema(schemas, mode) { const content = generate_1.openJoi([ 200, 'alternatives()' ]); if (mode !== 'any') { content.push(...[ `.match('${mode}')`, ]); } content.push(...[ '.try', "(", ]); schemas.forEach((schema) => { content.push(...[ ...generate_1.generateJoiStatement(schema), ",", ]); }); content.push(...[ ")", ]); return generate_1.closeJoi(content); } function generateAlternativesJoi(schema) { let content; if (schema.not) { content = generateNot(schema.not); } else if (schema.anyOf) { content = generateCombineSchema(schema.anyOf, 'any'); } else if (schema.allOf) { content = generateCombineSchema(schema.allOf, 'all'); } else if (schema.oneOf) { content = generateCombineSchema(schema.oneOf, 'one'); } else { content = generate_1.openJoi([ 200, 'alternatives()' ]); } content.push(...any_1.generateAnyJoi(schema)); return generate_1.closeJoi(content); } exports.generateAlternativesJoi = generateAlternativesJoi; //# sourceMappingURL=alternatives.js.map