new ObjectNode(){ObjectNode}
The ObjectNode class represents object level validations
Returns:
ObjectNode instance.Methods
-
addAdditionalPropertiesValidator(node){ObjectNode}
-
Add a validation node to validate any additional properties that fall outside the explicitly defined field validations
Name Type Description node
boolean | object validation node to be used on any additional properties that fall outside the explicitly defined field validations
Examples
// Create an Object where any additional properties must be a string property assert = require('assert'), StringNode = require('vitesse').StringNode, Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var string = new StringNode(null, null, {typeCheck:true}); var schema = new ObjectNode(null, null, {typeCheck:true}) .addAdditionalPropertiesValidator(string); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {ca:1} var results = func.validate({ca:1}); assert.equal(1, results.length); assert.equal('field is not a string', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === string); // Validate {ca:'test'} var results = func.validate({ca:'test'}); assert.equal(0, results.length);
// Create an Object where any additional properties are not allowed assert = require('assert'), StringNode = require('vitesse').StringNode, Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var schema = new ObjectNode(null, null, {typeCheck:true}) .addAdditionalPropertiesValidator(false); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {ca:1} var results = func.validate({ca:1}); assert.equal(1, results.length); assert.equal('illegal fields on object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {} var results = func.validate({}); assert.equal(0, results.length);
-
addChild(field, node){ObjectNode}
-
Add field validation
Name Type Description field
string object field name to be validated
node
object validation node to be used for this field validation
Example
// Create an Object specifying a field to be of a specific type assert = require('assert'), StringNode = require('vitesse').StringNode, Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var string = new StringNode(null, null, {typeCheck:true}); var schema = new ObjectNode(null, null, {typeCheck:true}) .addChild('brand', string); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {ca:1} var results = func.validate({brand:100}); assert.equal(1, results.length); assert.equal('field is not a string', results[0].message); assert.deepEqual(['object', 'brand'], results[0].path); assert.ok(results[0].rule === string); // Validate {ca:'test'} var results = func.validate({brand:'test'}); assert.equal(0, results.length);
-
addCustomValidator(node){ObjectNode}
-
Add a custom object validator
Name Type Description node
CustomNode custom validation node to be used for this field validation
Example
// Create an Object custom validation that validates the number of properties on an object. assert = require('assert'), Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, CustomNode = require('../lib/custom'); var customValidator = new CustomNode() .setContext({ max: 4 }) .setValidator(function(object, context) { if(Object.keys(object).length > context.max) { return new Error('object contains more properties ' + context.max); } }); var schema = new ObjectNode(null, null, {typeCheck:true}) .addCustomValidator(customValidator); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema, {}); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1, b:2, c:3, d:4, e:5} var results = func.validate({a:1, b:2, c:3, d:4, e:5}); assert.equal(1, results.length); assert.equal('object contains more properties 4', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === customValidator); // Validate {a:1, b:2} var results = func.validate({a:1, b:2}); assert.equal(0, results.length);
-
addDependency(field, dependencyType, object){ObjectNode}
-
Add a dependency between fields (field b must exist if field a does/field a must be an integer and exist if b is an integer and exists)
Name Type Description field
string that is dependent on condition
dependencyType
string (['array', 'schema']) the type of node we are dependent on
object
array | object the array or schema object for the dependency
-
addPatternPropertiesValidator(patterns){ObjectNode}
-
Specifies an object of pattern validations {
: ..Node} Name Type Description patterns
object each pattern matches fields on the object that have to satisfy the validation node for that pattern.
Example
// Create an Object where certain pattern match fields must validate against specific schema assert = require('assert'), StringNode = require('vitesse').StringNode, Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var string = new StringNode(null, null, {typeCheck:true}); var schema = new ObjectNode(null, null, {typeCheck:true}) .addPatternPropertiesValidator({ "^ca$": string }); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {ca:1} var results = func.validate({ca:1}); assert.equal(1, results.length); assert.equal('field is not a string', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === string); // Validate {ca:'test'} var results = func.validate({ca:'test'}); assert.equal(0, results.length);
-
addValidation(validation){ObjectNode}
-
Add a validation language node
Name Type Description validation
object validation operation valid ones are $gt,$gte,$lt,$lte
Example
// Create an Object validation that validates the number of properties on an object. assert = require('assert'), Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, CustomNode = require('../lib/custom'); var schema = new ObjectNode(null, null, {typeCheck:true}) .addValidation({$gte: 2, $lte: 5}); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema, {}); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1} var results = func.validate({a:1}); assert.equal(1, results.length); assert.equal('number fails validation {"$gte":2,"$lte":5}', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1, b:2} var results = func.validate({a:1, b:2}); assert.equal(0, results.length);
-
generate(context)
-
Generate the code for this node
Name Type Description context
object the generation context for this node
-
path(){array}
-
Return the current object path
Returns:
array containing the path to this node
-
prohibitedFields(required){ObjectNode}
-
Specifies the prohibited fields on the object
Name Type Description required
array an array of prohibited fields for the object
Example
// Create an Object with prohibited fields assert = require('assert'), Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var schema = new ObjectNode(null, null, {typeCheck:true}) .prohibitedFields(['a', 'b']); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema, {}); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1} var results = func.validate({a:1}); assert.equal(1, results.length); assert.equal('object has prohibited fields ["a","b"]', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {c:1, d:2} var results = func.validate({c:1, d:2}); assert.equal(0, results.length);
-
requiredFields(required){ObjectNode}
-
Specifies required fields on the object
Name Type Description required
array an array of required fields for the object
Example
// Create an Object with required fields assert = require('assert'), Compiler = require('vitesse').Compiler, ObjectNode = require('vitesse').ObjectNode, var schema = new ObjectNode(null, null, {typeCheck:true}) .requiredFields(['a', 'b']); var compiler = new Compiler({}); // Compile the AST var func = compiler.compile(schema, {}); // Validate {} var results = func.validate([]); assert.equal(1, results.length); assert.equal('field is not an object', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1} var results = func.validate({a:1}); assert.equal(1, results.length); assert.equal('object is missing required fields ["a","b"]', results[0].message); assert.deepEqual(['object'], results[0].path); assert.ok(results[0].rule === schema); // Validate {a:1, b:2} var results = func.validate({a:1, b:2}); assert.equal(0, results.length);
-
setTypeCheck(typeCheck){ObjectNode}
-
Type check value
Name Type Description typeCheck
boolean type check value