Superlight, schema-based, extensible Node.js object validator. Useful for Express req.body/params/query, or MongoDB document before inserting into collection if don't want to use Mongoose.
- Added
numberString
type to check for number strings
- Added
jsonString
type to check for JSON strings
- Extensiblity - Add your own custom validators with the
add()
method - Cleaner namespace management - put all your rules in the
_rules
object for each property in the schema - Code rewritten to be simpler and more elegant
- Added
dateString
type to check for valid date strings - Renamed
ObjectID
type toobjectId
to be consistent with other type names - Renamed
hexString
type toobjectIdString
to be more intuitive
$ npm install stefie
Firstly, model a schema of the object you want to validate. Then, call stefie
and see if she returns an error or null.
var stefie = require('stefie');
var movie = {
title: '300',
crew: {
director: 'Zack Snyder',
writers: ['Frank Miller', 'Zack Snyder']
}
};
var movieSchema = {
title: { _rules: { type: 'string' } },
crew: {
director: { _rules: { type: 'string' } },
writers: { _rules: { type: 'array', arrayType: 'string' } }
}
};
var error = stefie(movie, movieSchema);
if (error != null) {
console.log(error);
}
Add all the rules that apply to a property in the _rules
object in the schema.
var schema = {
title: { _rules: { type: 'string' } },
rating: { _rules: { type: 'number', required: true, null: false, min: 1, max: 10 } }
};
If there are no errors, stefie()
returns null.
If there are errors, she returns an object with each property that failed validation and the reason why.
var movie2 = {
title: 300,
crew: {
director: 'Zack Snyder',
writers: 'Frank Miller, Zack Snyder'
}
};
var error = stefie(movie2, movieSchema);
if (error != null) {
console.log(error);
}
Output:
{
title: 'Invalid type',
crew: {
writers: 'Invalid type'
}
}
The following are keys you can use in the _rules
object in your schema.
Rule precedence: If you have required
and/or null
rules, required will be evaluated first, then null, then any other rule.
Rule skip: Rules will not be evaluated if the property value is undefined. The exception is the required
rule.
Data type: boolean
If true
, property must be defined. If false
, property can be undefined.
var schema = {
title: { _rules: { required: true } }
};
Note: Setting this rule to false
is logically the same as not using it at all.
Data type: boolean
If true
, property can be null
. If false
, property cannot be null
.
var schema = {
rating: { _rules: { null: true } }
};
Note: required
and null
rules can coexist together.
Data type: string
Checks if property is of the specified type.
Possible values | Notes |
---|---|
array | |
boolean | |
date | Checks if property is a JavaScript Date object |
dateString | Checks if property can be parsed with Date.parse() |
jsonString | Checks if property can be parsed with JSON.parse() |
number | |
numberString | |
object | |
objectId | Checks if property is a MongoDB ObjectID object |
objectIdString | Checks if property is a valid MongoDB ObjectID string |
string |
var schema = {
rating: { _rules: { type: 'number' } }
};
Data type: string
Checks if an array's elements are of the specified type.
See type for possible values.
var schema = {
writers: { _rules: { type: 'array', arrayType: 'string' } }
};
Data type: number
Checks if property is equal to or greater than the specified number.
var schema = {
rating: { _rules: { type: 'number', min: 1 } }
};
Data type: number
Checks if property is equal to or less than the specified number.
var schema = {
rating: { _rules: { type: 'number', max: 10 } }
};
Data type: number
Checks if array/string has a length equal to or greater than the specified number.
var schema = {
name: { _rules: { type: 'string', minLength: 1 } },
writers: { _rules: { type: 'array', arrayType: 'string', minLength: 1 } }
};
Data type: number
Checks if array/string has a length equal to or less than the specified number.
var schema = {
name: { _rules: { type: 'string', maxLength: 100 } },
writers: { _rules: { type: 'array', arrayType: 'string', maxLength: 10 } }
};
Data type: array
If property is a single-value, checks if it is one of the enumerated values. If property is an array, checks if each of its elements is one of the enumerated values.
var schema = {
director: { _rules: { type: 'string', enum: ['Zack Snyder', 'JJ Abrams'] } },
cast: { _rules: { type: 'array', enum: ['Gerald Butler', 'Lena Headey', 'Michael Fassbender'] } }
};
Data type: regular expression
Checks if property matches the specified regular expression.
var schema = {
email: { _rules: { regex: /.+@.+/ } }
};
You can add your own custom validator functions to stefie, and use it in the _rules
object in your schema.
Arguments:
rule
(string): Name of the rulefn
(function): Validator function
The validator function must have a signature of function(val, ruleVal)
where val
is the value of the property of the object we are validating and ruleVal
is the value of the rule.
var fn = function(val, ruleVal) {
return (val !== ruleVal ? null : 'Value is disallowed');
};
stefie.add('disallow', fn);
var person = {
name: 'Stranger'
};
var error = stefie(person, {
name: { _rules: { type: 'string', disallow: 'Stranger' } }
});
console.log(error);
Output:
{
name: 'Value is disallowed'
}
Removes a validator. Cannot remove required and null.
Arguments:
rule
(string): Name of the rule
stefie.remove('disallow');
To run the test cases, cd
into the stefie directory then do:
npm test