Class: ArrayNode

ArrayNode

new ArrayNode(){ArrayNode}

The ArrayNode class represents a validation of an array value

Returns:
ArrayNode instance.

Methods

addAdditionalItemsValidation(node){ArrayNode}

Controls whether it’s valid to have additional items in the array beyond what is defined in the schema

Name Type Description
node object

validation node for the additional items

Examples
// Create an Array validation that requires positional elements as well as additional items validation

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  StringNode = require('vitesse').StringNode,
  IntegerNode = require('vitesse').IntegerNode,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var integer = new IntegerNode(null, null, {typeCheck:true});
var string = new StringNode(null, null, {typeCheck:true});
var schema = new ArrayNode(null, null, {typeCheck:true})
  .addPositionalItemValidation(0, string)
  .addPositionalItemValidation(1, integer)
  .addAdditionalItemsValidation(integer);

// Create a compiler
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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(1, results.length);
assert.equal('field is not a string', results[0].message);
assert.deepEqual(['object', '0'], results[0].path);
assert.ok(results[0].rule === string);

// Validate ['1', '1']
var results = func.validate(['1', '1']);
assert.equal(1, results.length);
assert.equal('field is not an integer', results[0].message);
assert.deepEqual(['object', '1'], results[0].path);
assert.ok(results[0].rule === integer);

// Validate ['1', 2, 'test']
var results = func.validate(['1', 2, 'test']);
assert.equal(1, results.length);
assert.equal('field is not an integer', results[0].message);
assert.deepEqual(['object', '2'], results[0].path);
assert.ok(results[0].rule === integer);

// Validate ['1']
var results = func.validate(['1']);
assert.equal(0, results.length);
// Create an Array validation that requires positional elements as well as additional items validation

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  StringNode = require('vitesse').StringNode,
  IntegerNode = require('vitesse').IntegerNode,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var integer = new IntegerNode(null, null, {typeCheck:true});
var string = new StringNode(null, null, {typeCheck:true});
var schema = new ArrayNode(null, null, {typeCheck:true})
  .addPositionalItemValidation(0, string)
  .addPositionalItemValidation(1, integer)
  .addAdditionalItemsValidation(false);

// Create a compiler
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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(1, results.length);
assert.equal('field is not a string', results[0].message);
assert.deepEqual(['object', '0'], results[0].path);
assert.ok(results[0].rule === string);

// Validate ['1', '1']
var results = func.validate(['1', '1']);
assert.equal(1, results.length);
assert.equal('field is not an integer', results[0].message);
assert.deepEqual(['object', '1'], results[0].path);
assert.ok(results[0].rule === integer);

// Validate ['1', 2, 'test']
var results = func.validate(['1', 2, 'test']);
assert.equal(1, results.length);
assert.equal('array contains invalid items', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate ['1']
var results = func.validate(['1']);
assert.equal(0, results.length);

addCustomValidator(node){ArrayNode}

Add a custom object validator

Name Type Description
node CustomNode

custom validation node to be used for this field validation

Example
// Create a Custom validator

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');

var customValidator = new CustomNode()
  .setContext({ max: 4 })
  .setValidator(function(object, context) {
    if(object.length > context.max) {
      return new Error('array longer than maximum size ' + context.max);
    }
  });

var schema = new ArrayNode(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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1, 2, 3, 4, 5]
var results = func.validate([1, 2, 3, 4, 5]);
assert.equal(1, results.length);
assert.equal('array longer than maximum size 4', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === customValidator);

// Validate [1, 2, 3]
var results = func.validate([1, 2, 3]);
assert.equal(0, results.length);

addItemValidation(node){ArrayNode}

Validate all items in the array against the provided validation

Name Type Description
node object

validation node for the additional items

Example
// Create an Array validation that requires all elements to be a string.

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  StringNode = require('vitesse').StringNode,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var string = new StringNode(null, null, {typeCheck:true});
var schema = new ArrayNode(null, null, {typeCheck:true})
  .addItemValidation(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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(1, results.length);
assert.equal('field is not a string', results[0].message);
assert.deepEqual(['object', '0'], results[0].path);
assert.ok(results[0].rule === string);

// Validate ['1']
var results = func.validate(['1']);
assert.equal(0, results.length);

addPositionalItemValidation(i, node){ArrayNode}

Add a array positional validation (say validate item 1 as a string, item 2 as a number)

Name Type Description
i number

the index in the array to validate

node object

validation node for this item

Example
// Create an Array validation that requires positional elements to pass specific validations

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  StringNode = require('vitesse').StringNode,
  IntegerNode = require('vitesse').IntegerNode,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var integer = new IntegerNode(null, null, {typeCheck:true});
var string = new StringNode(null, null, {typeCheck:true});
var schema = new ArrayNode(null, null, {typeCheck:true})
  .addPositionalItemValidation(0, string)
  .addPositionalItemValidation(1, integer);

// Create a compiler
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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(1, results.length);
assert.equal('field is not a string', results[0].message);
assert.deepEqual(['object', '0'], results[0].path);
assert.ok(results[0].rule === string);

// Validate ['1', '1']
var results = func.validate(['1', '1']);
assert.equal(1, results.length);
assert.equal('field is not an integer', results[0].message);
assert.deepEqual(['object', '1'], results[0].path);
assert.ok(results[0].rule === integer);

// Validate ['1', 2, 'test']
var results = func.validate(['1', 2, 'test']);
assert.equal(0, results.length);

// Validate ['1']
var results = func.validate(['1']);
assert.equal(0, results.length);

addValidation(validation){ArrayNode}

Add a validation language node

Name Type Description
validation object

validation operation valid ones are $gt,$gte,$lt,$lte

Example
// Create an Array validation that validates the length of the array and type.

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var schema = new ArrayNode(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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(1, results.length);
assert.equal('array fails length validation {"$gte":2,"$lte":5}', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate number 100
var results = func.validate([1, 2, 3]);
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

setTypeCheck(typeCheck){ArrayNode}

Type check value

Name Type Description
typeCheck boolean

type check value

uniqueItems(uniqueItems){ArrayNode}

Type check value

Name Type Description
uniqueItems boolean

all entries in the array should be unique

Example
// Create an Array validation that requires all elements to be unique

assert = require('assert'),
  Compiler = require('vitesse').Compiler,
  ArrayNode = require('vitesse').ArrayNode,
  CustomNode = require('../lib/custom');
var schema = new ArrayNode(null, null, {typeCheck:true})
  .uniqueItems(true);

// Create a compiler
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 array', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);

// Validate [1]
var results = func.validate([1]);
assert.equal(0, results.length);

// Validate [1, 2, 1]
var results = func.validate([1, 2, 1]);
assert.equal(1, results.length);
assert.equal('array contains duplicate values', results[0].message);
assert.deepEqual(['object'], results[0].path);
assert.ok(results[0].rule === schema);
comments powered by Disqus