Native Models provides a way to map objects in a clean and typed way. The main goal is to ensure runtime type checking and consistent models for APIs.
import { createModel } from 'nativemodels';
import { array, boolean, computed, date, int, object, string } from 'nativemodels/datatypes';
const photoSchema = {
ext: string(),
url: string().required(),
};
const contactSchema = {
email: string(),
phone: string(),
url: string(),
};
const userSchema = {
accountID: int().nullable(),
contact: object(contactSchema),
created: date(),
firstName: string().required(),
fullName: computed((record) => `${record.firstName} ${record.lastName}`),
isAdmin: boolean().nullable(),
lastName: string().required(),
photos: array(object(photoSchema)),
typeID: int().default(2),
};
const userModel = createModel(userSchema);
const johnSmith = userModel({
contact: {
email: 'j.smith@example.com',
},
firstName: 'John',
lastName: 'Smith',
photos: [
{
ext: '.jpg',
url: 'https://example.com/img.jpg',
},
],
});
// => { firstName: 'John', lastName: 'Smith', fullName: 'John Smith', ...}
const userRecords = [
{
firstName: 'John',
lastName: 'Smith',
},
{
firstName: 'Jane',
lastName: 'Doe',
},
];
const users = userRecords.map(userModel);
// => [{ firstName: 'John', lastName: 'Smith', fullName: 'John Smith', ...}]
const janeDoe = userModel({
...johnSmith,
firstName: 'Jane',
lastName: 'Doe',
});
// => { firstName: 'Jane', lastName: 'Doe', fullName: 'Jane Doe', ...}
Datatype methods that can be chained when defining schema.
Sets a default value if no value is set
Allows the value set to be null (useful for database models)
Forces the value to be required. Is ignored if default value is set
- array
- boolean
- computed
- date
- float
- int
- object
- string
If value is valid, returns true, else throws error. Name is key on object;
Parses the value being set. Used to extend base datatype