joi-model

0.0.8 • Public • Published

joi-model

Model encapsulation of a Joi schema

Build Status

Usage

First create a schema

var Joi = require('joi');
 
var schema = {
    a: Joi.string().required(),
    b: Joi.string().min(4)
};

Create a model class for that schema:

var joiModel = require('joi-model');
 
var MyModel = joiModel(schema);

Create a document based on the model:

var document = new MyModel();

Manipulate the document:

 
document.setData({
    a: 'hello',
    b: 'world'
});
 
document.updateData({
    a: 'hello',
});
 
document.a = 'test';
document.b = 'another';
 
document.a = 3; // throws a type error
 
document.a = null; // throws a required error
 
document.b = 'hel'; // throws a length error
 
JSON.stringify(document); // '{"a":"test","b":"another"}'
 

The object is validated after each action and will throw any errors that are found.

Data can also be set to the document as it is created:

var document = new MyModel({
    a: 'hello',
    b: 'world'
});

More Complex Objects

var Joi = require('joi');
var joiModel = require('joi-model');
 
var adult = Joi.object({
    name: Joi.string().required(),
    job: Joi.string()
});
 
var child = Joi.object({
    name: Joi.string().required(),
    age: Joi.number().min(0).max(17).required()
});
 
var family = Joi.object({
    surname: Joi.string().required(),
    adults: Joi.array().includes(adult).min(1).max(2).required(),
    children: Joi.array().includes(child).max(4)
});
 
var FamilyModel = joiModel(family);
 
var family = new FamilyModel({
    surname: 'Smith',
    adults: [{
        name: 'John',
        job: 'Clerk'
    }, {
        name: 'Jane',
        job: 'Programmer'
    }],
    children: [{
        name: 'Jimmy',
        age: 3
    }, {
        name: 'Jenny',
        age: 5
    }]
});
 
family.children.push({
    name: 'Betty',
    age: 3
});
 
family.children.push({
    name: 'Harry',
    age: 2
});
 
 
// this push will throw an error as this would be the 5th child
 
family.children.push({
    name: 'Missy',
    age: 1.5
});
 

Readme

Keywords

Package Sidebar

Install

npm i joi-model

Weekly Downloads

1

Version

0.0.8

License

none

Last publish

Collaborators

  • hughepaul