• Stars
    star
    277
  • Rank 148,875 (Top 3 %)
  • Language
    JavaScript
  • License
    Apache License 2.0
  • Created about 10 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Converts a JSON schema to a Joi schema.

Build NPM version

enjoi

Converts a JSON schema to a Joi schema for object validation.

Schema Support

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.

API

  • enjoi.schema(schema [, options])
    • schema - a JSON schema or a string type representation (such as 'integer').
    • options - an (optional) object of additional options such as subSchemas and custom types.
  • enjoi.defaults(options) - configure defaults options to be used with all enjoi.schema calls. enjoi.schema options passed will always override defaults set here.

Options

  • subSchemas - an (optional) object with keys representing schema ids, and values representing schemas.
  • refineType(type, format) - an (optional) function to call to apply to type based on the type and format of the JSON schema.
  • refineSchema(joiSchema, jsonSchema) - an (optional) function to call to apply to adjust Joi schema base on the original JSON schema. Primary use case is handling nullable flag in OpenAPI 3.0
  • extensions - an array of extensions to pass joi.extend.
  • strictMode - make schemas strict(value) with a default value of false.

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']
});

const { error, value } = schema.validate({firstName: 'John', lastName: 'Doe', age: 45});

Sub Schemas

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'
            }
        }
    }
});

Defaults

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

Custom types can be provided through the extensions option.

const schema = Enjoi.schema({
    type: 'thing'
}, {
    extensions: [{
        type: 'thing',
        base: Joi.any()
    }]
});

Also with functions.

const schema = Enjoi.schema({
    type: 'thing'
}, {
    extensions: [{
        type: 'thing',
        validate(value, helpers) {
            if (value !== 'foobar') {
                return { value, errors: helpers.error('thing.foobar') };
            }
        },
        messages: {
            'thing.foobar': '{#label} must be \'foobar\''
        }
    }]
});

Refine Type

You can use the refine type function to help refine types based on type and format. This will allow transforming a type for lookup.

const schema = Enjoi.schema({
    type: 'string',
    format: 'email'
}, {
    extensions: [{
        type: 'email',
        base: Joi.string().email()
    }],
    refineType(type, format) {
        if (type === 'string' && format === 'email') {
            return 'email';
        }
    }
});

This can be used in conjunction with function based extensions for additional logic:

const schemaDesc = {
    type: 'string',
    format: 'email',
    'x-test': true
}
const schema = Enjoi.schema(schemaDesc, {
    extensions: [{
        type: 'email',
        validate(value, helpers) {
            const validator = schemaDesc['x-test'] ? Joi.string().email().equal('[email protected]') : Joi.string().email();
            const validation = validator.validate(value);
            if (validation.error) {
                return { value, errors: validation.error };
            }
        }
    }],
    refineType(type, format) {
        if (type === 'string' && format === 'email') {
            return 'email';
        }
    }
});

Extensions

Refer to Joi documentation on extensions: https://hapi.dev/module/joi/api/?v=17#extensions

More Repositories

1

hapi-react-redux-ssr

Play project with api, react, redux, server side rendering.
JavaScript
9
star
2

generator-es6-module

Yeoman generator for creating babel-runtime based es6 node.js modules.
JavaScript
9
star
3

graphql-seneca-example

Playing with GraphQL partials and seneca micro services
JavaScript
6
star
4

circuit-state

A flexible circuit breaker state machine.
JavaScript
6
star
5

hapistats

Hapi plugin for tracking metrics on HTTP requests.
JavaScript
5
star
6

xcode-node-template

Write native node.js module in xcode IDE.
C++
5
star
7

sopalin

Wipe up spilled milk in Hapi.
JavaScript
2
star
8

node-availability

NGINX load balancing node for high availability
JavaScript
2
star
9

graphql-moleculer-example

Playing with GraphQL partials and moleculer micro services over nats
JavaScript
2
star
10

merge-object-files

Merges a directory containing json or other files exporting objects and merges them into a single object.
JavaScript
2
star
11

rxlogstream

Global subject based log stream.
JavaScript
1
star
12

moleculer-whichcloud

Just an example
JavaScript
1
star
13

netstring-stream

Netstring reader/writer and streams.
JavaScript
1
star
14

graphql-query-splitting-express

Express middleware for demonstrating query splitting into multiple documents
JavaScript
1
star
15

graphql-routing-split

Playing with routing some graphql by splitting it across different microservices that represent distinct (with no cohesion) API destinations (i.e. use a query aggregate but do not have cohesive API to hit)
JavaScript
1
star
16

graphql-modules-playground

Playing with GraphQL modules
JavaScript
1
star
17

cachedns

Caching for dns functions.
JavaScript
1
star
18

rxkafka

Some RxJS wrapping of node-rdkafka
JavaScript
1
star
19

taped

Life cycle for tape.
JavaScript
1
star
20

camelscore

camelCase and under_score utilities for objects.
JavaScript
1
star
21

extrefs

Resolves external refs into an object containing subschemas.
JavaScript
1
star