0.0.5 • Published 6 years ago

@techdecaf/model v0.0.5

Weekly downloads
1
License
MIT
Repository
-
Last release
6 years ago

@techdecaf/model

object modeling framework based on joi

Contents

Requirements

Installation

npm install --save @techdecaf/model

Joi Documentation

Please see Joi's Documentation to reference schema creation

Usage

Basic

const {Model, joi} = require("@techdecaf/model");

defaultEmail = (obj) => {
    return `${obj.firstName}.${obj.lastName}@domain.io`;
};

const UserSchema = {
    firstName: joi.string().required().example("John"),
    lastName: joi.string().required().example("Doe"),
    email: joi.string()
      .email()
      .default(defaultEmail, "email")
      .example("John.Doe@domain.com"),
};

const User = new Model("User", UserSchema);

let user = new User({firstName: "foo", lastName: "bar"});
console.log(user)
// returns
// User {
//   firstName: 'foo',
//   lastName: 'bar',
//   email: 'foo.bar@domain.io'
// }

ES6 Class Inheritance

Base Classes

You can pass in a base class which you would like your model to inherit from. This is useful for extending @techdecaf/model with your own data storage layer or custom methods. Simply write your own base class and then extend model to include validation.

Warning: If your BaseClass has properties that are not part of your schema then validation will fail unless you also specify allowUnknown

class BaseClass {
  constructor(){
    this.greeting = "hello";
  }

  greet(){
    return `${this.greeting} ${this.firstName}`;
  }
}

const User = new Model("User", UserSchema, BaseClass);

let user = new User({firstName: "foo", lastName: "bar"});

console.log(user.greet());
// returns "hello foo"

Extending

Note: if you are going to extend a model adding additional non validated properties will result in an error unless you specify allowUnknown

const joiOptions = {allowUnknown: true};
const User = new Model("User", UserSchema, null, joiOptions);

class MyUser extends User {
    /**
     * @param {User} user
     */
    constructor(user) {
        super(user);
        this.greeting = "hello";
    }
    /**
     * greeting
     * @return {String}
     */
    greet() {
        return `${this.greeting} ${this.firstName}`;
    }
};

let user = new MyUser({firstName: "foo", lastName: "bar"});

console.log(user.validate().greet());
// returns "hello foo"

Testing and Documentation

Models support generating example object which you can use for documentation or in a test suite. to supprot the use of example objects, you must provide the joi.example() parameter to all of your keys

let example = User.example();

console.log(example);
// returns
// { firstName: 'John',
//   lastName: 'Doe',
//   email: 'John.Doe@domain.com' }

let user = new User(example);

console.log(user.validate());
// returns
// User {
//   firstName: 'John',
//   lastName: 'Doe',
//   email: 'John.Doe@domain.com' }

Development

  • deploy: npm run deploy
  • test: npm test

Contributing

  • Clone this repo
  • Create a feature branch from dev git checkout -b myFeature dev
  • Write your tests
  • Make your suggested changes
  • Submit a pull request
0.0.5

6 years ago

0.0.4

6 years ago

0.0.3

6 years ago