json-schema-to-joi
Version:
Converts JSON schema to Joi typescript code
135 lines • 4.03 kB
JavaScript
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
;