Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/AlexxNB/aovi
AOVI is a tiny dependency free library to validate values in declarative way.
https://github.com/AlexxNB/aovi
Last synced: about 1 month ago
JSON representation
AOVI is a tiny dependency free library to validate values in declarative way.
- Host: GitHub
- URL: https://github.com/AlexxNB/aovi
- Owner: AlexxNB
- License: mit
- Created: 2020-04-11T07:21:15.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-10-29T09:36:20.000Z (about 3 years ago)
- Last Synced: 2024-04-29T11:45:47.517Z (8 months ago)
- Language: JavaScript
- Homepage:
- Size: 144 KB
- Stars: 12
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-starred - AlexxNB/aovi - AOVI is a tiny dependency free library to validate values in declarative way. (others)
README
# aovi
AOVI is a lightweight dependency free library to validate values of the simple object's properties in declarative way. May be used in Node or in browser as well.
## Usage
### Node
```js
const {aovi} = require('aovi');const test_object = {name:'John'};
const result = aovi(test_object)
.check('name')
.required()
.match(/^[a-z]+$/i)console.log(result.valid); // true
```### Browser
```html...
const {aovi} = Aovi;
const test_object = {
password: document.getElementById('password').value
};const result = aovi(test_object)
.check('password')
.required()
.minLength(5)console.log(result.valid); // true
```
## Example
```js
const {aovi} = require('aovi');const test_object = {
user: 'John',
sex: 'male',
email: 'no',
age: 16
}const result = aovi(test_object)
.check('user') // the property name
.required() // check something
.type('string') // check more
.check('sex') // and once again with another property
.required()
.oneof(['male','female'])
.check('email')
.match(/[^@]+@[^\.]+\..+/,'E-Mail is invalid')
.minLength(6) // skipped, because match already failed
.check('age')
.min(18)
.check('name')
.type('string') // skipped, because name is undefined and not requiredconsole.log(result.valid); // false
console.log(result.text()); // E-Mail is invalid. age must be greater than 18.
console.log(result.json()); // [{"name": "email", "error":"E-Mail is invalid"},{"name": "age", "error":"age must be greater than 18"}]
```### Asynchronus example
```js
// http-request with body_parser.json middleware example
async function(req,res){// asynchronously request db and check password
const check_password = async function(userid,password) {
const user = await db.getuser(userid);
return user.password===password;
}const data = req.body;
const result = aovi(data)
.check('password')
.required()
.is(async (password) => {
return await check_password( data.userid, password )
},'Wrong password')
.check('userid')
.required()
.type('number')// don't miss await keyword here
console.log(await result.valid);
console.log(await result.text());
console.log(await result.json());
}```
## Custom validators
You may add your own reusable validators to the `aovi` object. Custom validator is the function which must return object containing properties below:
* `name` - name for validator method
* `test` - test function must return `true` or `false`. When `true` value of the property is valid. Function gets the value of the property as its parameter.
* `message` - default validation error message. Name of the property or its label will be added at the start of this text.
* `notMessage` - default validation error message if used `.not` operator before. Name of the property or its label will be added at the start of this text. If ommited, `.not` operator will not be allowing to use with this custom validator.
### Custom validator example
```js
// a,b - params, which should be be passed to the validator by user
const my_custom_validator = (a,b) => {
return {
// name of the validator method
name: 'between',
// test function gets value, must return true or false
test: (v)=>(v>=a && v<=b),
// error message, when test returns false
message: `%Label% must be between ${a} and ${b}`
// error message, when used .not and test returns true
notMessage: `%Label% must not be between ${a} and ${b}`
}
}const test_object={number1:5, number2:42, number3:100};
const result = aovi(test_object)
.use(my_custom_validator)
.check('number1')
.between(10,50)
.check('number2')
.not.between(0,100)
.check('number3')
.between(1,10,'The value is out of range')console.log(result.text()); // number1 must be between 10 and 50. number2 must not be between 0 and 100. The value is out of range.
```## Meassages variables
There is a set ov placeholders, which you may use in validators custom messages or in the messages of custom validators. They will be replaced by their values in result.* `%label%` - label (or name, if label not specified) of the tested property.
* `%Label%` - same, but with capitalized first letter.
* `%name%` - name of the tested property.
* `%Name%` - same, but with capitalized first letter.
* `%value%` - provided property value.## API
### `aovi(test_object)`
Detrmine object for validation
### `.use(validator_function)`
Add custom validator to the `aovi` object. See [Custom validators](#custom-validators) for more info.
### `.check(property_name,[label])`
Set which property will be validate by next functions. `label` is the name for the property which will be shown in default error messages
### `.not`
Invert result of the next validator. Can be used before `type`,`match`,`is`,`oneof` and `length` validators. Example `.not.length(5)`.
### `.required([custom_message])`
Check if the propertyis defined in object and its value is not equal empty string.
### `.type(type,[custom_message])`
Check if the property's value is of specified `type`, like 'string','number' etc.
### `.match(regular_expression,[custom_message])`
Check if the property's value is match `regular_expression`.
### `.is(function,[custom_message])`
Pass if the `function` returns `true`. This function accept one parameter which is a value of the current property. If `function` is asynchronous, you must call result functions (`.text()`, `.json()`, `.array()` and `.valid`) asynchronously too.
### `.oneof(array_of_variants,[custom_message])`
Check if the property's value is in the `array_of_variants` array.
### `.length(needed_length,[custom_message])`
Check if the property's value length is exact `needed_length`.
### `.minLength(min_length,[custom_message])`
Check if the property's value length is greater than or equal `min_length`.
### `.maxLength(max_length,[custom_message])`
Check if the property's value length is less than or equal `max_length`.
### `.min(minimum,[custom_message])`
Check if the property's valueis greater than or equal `minimum`.
### `.max(maximum,[custom_message])`
Check if the property's value is less than or equal `maximum`.
### `.valid`
Is `true` when no errors where occured during validation chain. Will be `false` in other case.
### `.text()`
Return errors as string. Will return `''` if no errors.
### `.json()`
Return errors as JSON-string. Will return `'[]'` if no errors.
### `.array()`
Return errors as array. Will return `[]` if no errors.