Javascript data schemas. Validate data structures, ensure data types, assign virtual methods to datum, generate virtual properties for a data set.
npm install data-modelbash
bower install data-model --save
`
Via NPM
`bash
npm install data-model --save
`
If you are using Node.js
`javascript
var datamodel = require('data-model');
`
Creating a Dataset Model
The dataset schema is to define what the expected format of a dataset is to be. There are three patterns that are used: Collections, Schemas (and nested schemas), and primitives. Further, there are two ways to define a schema: Caching, or instance.
Primitive Pattern
Primitives are the most basic element, and end recursive checks. You use primitives to define the type pattern required for proper use.$3
`javascript
datamodel('personName')
.setTemplate(String);
`
$3
`javascript
datamodel('personName')
.setTemplate([String]);
`$3
`javascript
datamodel('personName')
.setTemplate([{ name:String }]);
`Schema Pattern
A schema definition has a similar meaning to what what is understood as the Object javascript primitive. It is a definition of a key/value data structure, and uses the Object primitive syntax for defining the pattern. Nested schemas are supported for complex objects.$3
`javascript
datamodel('person')
.setTemplate({
name:String,
age:Number
});
`$3
`javascript
datamodel('person')
.setTemplate({
name:String,
details:{
age:Number
}
});
`
Collection Pattern
A collection defines repetition in a data set. The collection is denoted with the array primitive syntax.$3
`javascript
datamodel('pageHits')
.setTemplate([{
name:String,
hits:[Number]
}]);
`$3
`javascript
datamodel('myHits')
.setTemplate({
name:String,
hits:[Number]
});
`Validating Against Models
Examples
$3
`javascript
datamodel('personName')
.setTemplate(String);var ValidData = "Jordan";
var InvalidData = 23; //wrong type...
datamodel('personName')
.validate(ValidData); //true
datamodel('personName')
.validate(InvalidData); //false
`$3
`javascript
datamodel('personName')
.setTemplate([String]);var ValidData = ["Jordan", "Chapian"];
var InvalidData = [23, "Jordan"]; //wrong type
datamodel('personName')
.validate(ValidData); //true
datamodel('personName')
.validate(InvalidData); //false
`
$3
`javascript
datamodel('personName')
.setTemplate([{name:String}]);var ValidData = [{name:"Jordan"}, {name:"Chapian"}];
var InvalidData = [{name:"Jordan"}, "Jordan"]; //wrong type
datamodel('personName')
.validate(ValidData); //true
datamodel('personName')
.validate(InvalidData); //false
`$3
`javascript
datamodel('person')
.setTemplate({
name:String,
age:Number
});var ValidData = {name:'Jordan', age:10};
var InvalidData = {name:'Jordan'}; //missing age..
datamodel('person')
.validate(ValidData); //true
datamodel('person')
.validate(InvalidData); //false
`$3
`javascript
datamodel('person')
.setTemplate({
name:String,
details:{
age:Number
}
});var ValidData = {name:'Jordan', details:{age:10}};
var InvalidData = {name:'Jordan', details:{age:"10"}}; //age, wrong type..
datamodel('person')
.validate(ValidData); //true
datamodel('person')
.validate(InvalidData); //false
`$3
`javascript
datamodel('pageHits')
.setTemplate([{
name:String,
hits:[Number]
}]);var ValidDataset = [{name:"Jordan", hits:[5,7,6]}, {name:"Chapian", hits:[]}];
var InvalidDataset = [{name:"Jordan", hits:["5", 7, 6]}, {name:"Chapian", hits:[8]}];
datamodel('pageHits')
.validate(ValidDataset); //true
datamodel('pageHits')
.validate(InvalidDataset); //false
`$3
`javascript
datamodel('myHits')
.setTemplate({
name:String,
hits:[Number]
});var ValidDataset = {name:"Jordan", hits:[5, 10, 15, 20]};
var InvalidDataset = {name:"Jordan", hits:12};
datamodel('myHits')
.validate(ValidDataset); //true
datamodel('myHits')
.validate(InvalidDataset); //false
`Internal Representation
A graph is used to represent a data structure, where each node is represented by one of three subclasses of a TemplateNode. Recursive patterns are used to traverse the structures. Consider the below model specification.`javascript
datamodel('users')
.setTemplate([{
name:String,
email:String,
posts:[{
title:String,
views:Number,
body:Number,
posted:Date
}],
loginPosts:[[Number]]
}]);
``This is represented by the following graph structure:
!gs