Converts a JSON schema to a Joi schema for object validation.
enjoi does not support all of json-schema.
Here is a list of some known missing keyword support still being worked on:
object:patternProperties- unsupported due to Joi limitations.
Please file issues for other unsupported features.
enjoi.schema(schema [, options])schema- a JSON schema or a string type representation (such as'integer').options- an (optional) object of additional options such assubSchemasand customtypes.
enjoi.defaults(options)- configure defaultsoptionsto be used with allenjoi.schemacalls.enjoi.schemaoptions passed will always override defaults set here.
subSchemas- an (optional) object with keys representing schema ids, and values representing schemas.types- an (optional) object with keys representing type names and values representing a Joi type. Values can also be functions that are expected to return Joi types. These functions have a context bound to the Joi being used by Enjoi and a single argument,schema, which represents the current schema being evaluated.refineType(type, format)- an (optional) function to call to apply to type based on the type and format of the JSON schema.extensions- an array of extensions to pass joi.extend.strictMode- make schemasstrict(value)with a default value offalse.
Example:
const Joi = require('joi');
const Enjoi = require('enjoi');
const schema = Enjoi.schema({
type: 'object',
properties: {
firstName: {
description: 'First name.',
type: 'string'
},
lastName: {
description: 'Last name.',
type: 'string'
},
age: {
description: 'Age in years',
type: 'integer',
minimum: 1
}
},
'required': ['firstName', 'lastName']
});
Joi.validate({firstName: 'John', lastName: 'Doe', age: 45}, schema, function (error, value) {
error && console.log(error);
});Sub-schemas can be provided through the subSchemas option for $ref values to lookup against.
Example:
const schema = Enjoi.schema({
type: 'object',
properties: {
a: {
$ref: '#/b' // # is root schema
},
b: {
type: 'string'
},
c: {
$ref: '#sub/d' // #sub is 'sub' under subSchemas.
}
}
}, {
subSchemas: {
sub: {
d: {
'type': 'string'
}
}
}
});The above example subSchemas can be added instead via defaults:
const enjoi = Enjoi.defaults({
subSchemas: {
sub: {
d: {
'type': 'string'
}
}
}
});
const schema = enjoi.schema({
type: 'object',
properties: {
a: {
$ref: '#/b' // # is root schema
},
b: {
type: 'string'
},
c: {
$ref: '#sub/d' // #sub is 'sub' under subSchemas.
}
}
});Custom types can be provided through the types option.
const schema = Enjoi.schema({
type: 'thing'
}, {
types: {
thing: Joi.any()
}
});Also with functions.
const schema = Enjoi.schema({
type: 'thing'
}, {
types: {
thing(/* schema */) {
return this.any();
}
}
});You can use the refine type function to help refine types based on type and format. This will allow transforming a type for lookup against the custom types.
const schema = Enjoi.schema({
type: 'string',
format: 'email'
}, {
types: {
email: Joi.string().email()
},
refineType(type, format) {
if (type === 'string' && format === 'email') {
return 'email';
}
}
});This can be used in conjunction with function based type definitions for additional logic:
const schema = Enjoi.schema({
type: 'string',
format: 'email',
'x-test': true
}, {
types: {
email(schema) {
return schema['x-test'] ? : Joi.string().email().allow('test@example.com') : Joi.string().email()
}
},
refineType(type, format) {
if (type === 'string' && format === 'email') {
return 'email';
}
}
});Example:
const schema = Enjoi.schema({
type: 'foo'
}, {
extensions: [
{
name: 'string',
language: {
foobar: 'needs to be \'foobar\''
},
rules: [{
name: 'foobar',
validate(params, value, state, options) {
return value === 'foobar' || this.createError('string.foobar', null, state, options);
}
}]
}
]
});
