1.0.1 • Published 10 years ago
def-schema v1.0.1
def-schema
Define Object schema and test or validate target object.
Important: Only support ECMAScript 6, both node engine and browsers.
Install
npm install def-schemaand
let def = require('def-schema');Example: Basic
def(String).match(123); // return false
def(String).match('123'); // return true
def(String).validate(123); // throw IncompatibleTypeError if not match
def(String).validate('123'); // passed with silencedef define a new Schema object. Use match to test type of target object, use validate to assert target object.
validate is as same as match except it will throw exception if not match.
Example: Object
let Person = def({name:String, age:Number});
Person.match({name:'foo', age: 123, otherPro:'111'}); //return true
Person.match({age:123}); //return false, missing name
Person.match({name: 123}); //return false, name is not stringExample: Function
let Person = def({
name: String,
age: Number,
sayHello: Function
});
let person = {
name: 'test',
age: 123,
sayHello() {
//...
}
};
Person.match(person); // retrun trueExample: Array
def([]).match([1,2,'test']); //return true
def([Number]).match([1,2,'test']); //return false
def([Number]).match([1,2,3]); //return true
def[Number,String].match([1,'test']); //return true
def[Number,String].match([1,'test',4,5]); //return trueExample: Combine Array and Object
let Person = def({
name: String
age: Number
skills: [String]
});
let person1 = {name:'foo', age:123, skill: ['js', 'java']};
let person2 = {name:'foo', age:123, skill: 'js'};
Person.match(person1); //return true;
Person.match(person2); //return false;
def([Person]).match([person1, person2]); //return false;Example: Customize validator
let Integer = def.fn(x => def(Number).match(x) && value % 1 === 0 && value >= -2147483648 && value <= 2147483647);
Integer.match(123); //return true;
Integer.match(1.23); //return false;Here, by define the validate function we can decided what is 'Integer' in our program.
Example: Nest definition
Defined new type by leverage existing type, I mean:
let Integer = def.fn(x => def(Number).match(x) && value % 1 === 0 && value >= -2147483648 && value <= 2147483647);
let Person = def({
name: String,
age: Integer
});
Person.match({name: 'foo', age:123}); //return true;
Person.match({name: 'foo', age:1.23}); //return false;
}); Example: Opertional property
let Person = def({
name: String,
age: def.opt(Number)
});
Person.match({name:'foo', age:1234}); //return true;
Person.match({name:'foo'}); //return true;
Person.match({name:'foo', age:'bar'}); //return false;Example: Other buildin functions
def.or(String,Number).match('hello'); //return true;
def.and({name:String},{age:Number}).match({name:'foo', age:123}); //return true;
let proto = {name:String};
let target = Object.create(proto);
def.asProto(proto).match(target); //return true;
let Range = def.param( (x, from, to) => def(Number).match(x) && x >= from && x <= to );
Range(1,10).match(5); //return true;
Range(1,10).match(-5); //return return false;Example: Reuse definition partially
let Person = def({
name: {
first: String,
last: String
},
age: Number
});
Person.name.match({first:'foo', last:'bar'}); //return true
Person.name.match({first:'foo'}); //return falseExample: Generate random instance
let Person = def({
name: String,
age:Number
})
Person.random //return random instance which match definition of PersonThanks :)