Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jacomyal/typology
A data validation library for Node.js and browser
https://github.com/jacomyal/typology
Last synced: 22 days ago
JSON representation
A data validation library for Node.js and browser
- Host: GitHub
- URL: https://github.com/jacomyal/typology
- Owner: jacomyal
- License: mit
- Created: 2014-09-09T14:17:03.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2023-04-15T22:20:28.000Z (over 1 year ago)
- Last Synced: 2024-05-02T00:56:37.076Z (7 months ago)
- Language: JavaScript
- Homepage:
- Size: 461 KB
- Stars: 46
- Watchers: 6
- Forks: 4
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Typology
Typology is a lightweight data validation library for Node.js and the browser (with or without [Browserify](http://browserify.org/)).
It can validate variables against native JavaScript types as well as against custom types you can define.
## Installation
Install with npm:
```bash
// Latest release
npm install typology// Development version
npm install git+https://github.com/jacomyal/typology.git
```## Usage
### Get the native type of a given variable
```js
var types = require('typology');types.get(true);
>>> 'boolean'types.get(/abc/);
>>> 'regexp'// Native types being:
// 'boolean', 'number', 'string'
// 'function', 'array', 'arguments'
// 'regexp', 'date', 'object'
// 'null', 'undefined', 'primitive'
// 'map', 'set', 'weakmap', 'weakset', 'symbol'
```### Deal with custom types
A custom type can be either be defined by a function returning a boolean or an expressive string or object describing the type you want to check.
*Example*
```js
// Type defined by a function
var customType = function(variable) {
// Here is an example to know if a variable is an integer:
return typeof variable === 'number' && variable === (variable | 0);
};// Type defined by an expressive string
var customType = '?string'; // Means you want an optional string
var customType = 'string|number'; // Means you want either a string or a number// Type defined by a complex object
var customType = {
firstname: 'string',
lastname: 'string',
age: 'number'
};
```#### Custom types syntax
|Expression|Description|Examples|Validates|
|---|---|---|---|
|`'type'`|required|`'string'`|`'hello'`|
|`'?type'`|optional|`'?string'`|`'hello'`, `undefined`, `null`|
|`'type1\|type2'`|multi-types|`'string\|number'`|`'hello'`, `45`, `2.34`|
|`{prop: 'type'}`|complex|`{firstname: 'string'}`|`{firstname: 'Joachim'}`|
|`['type']`|lists|`['number']`|`[1, 2, 3]`|
|`'!type'`|exclusive|`'!string'`|`42`|Note also that expression can be combined. For instance `'?string|number'` means an optional string or number variable and `'!string|object'` means anything but a string or an object.
*Overkill example*
```js
var myCustomType = {
firstname: 'string',
pseudo: '?string',
account: {
total: '?number|string',
bills: ['number']
}
}
```*Using functions to perform ad-hoc validation*
```js
var myCustomType = {
age: 'number',
name: function(v) {
return v === 'Jack' || v === 'John';
}
};
```#### Validate a variable against a custom type
```js
var types = require('typology');types.check(myType, myVariable);
// Example
types.check('number', 1);
>>> truetypes.check(
{
firstname: 'string',
lastname: 'string',
age: 'number'
},
{
firstname: 'Joachim',
lastname: 'Murat'
}
);
>>> false
```#### Getting more information about what does not match
```js
var types = require('typology');types.scan(myType, myVariable);
// Example
types.scan('number', 1);
>>> { expected: 'number',
>>> type: 'number',
>>> value: 1 }types.scan(
{
firstname: 'string',
lastname: 'string',
age: 'number'
},
{
firstname: 'Joachim',
lastname: 'Murat'
}
);
>>> { error: 'Expected a "number" but found a "undefined".',
>>> expected: 'number',
>>> type: 'undefined',
>>> value: undefined,
>>> path: [ 'age' ] }
```#### Create your own typology to add custom types
```js
var Typology = require('typology');var myTypology = new Typology();
// Then add custom definitions
myTypology.add(myCustomType);// Example
myTypology.add('User', {
firstname: 'string',
lastname: 'string',
age: '?number'
});// Then you can use it likewise
myTypology.check('User', {hello: 'world'});
>>> false// And use it in other types' definition
myTypology.check('User|number', myVar);
```#### Checking whether a custom type's definition is valid
```js
var types = require('typology');types.isValid(customType);
// Example
types.isValid('?string');
>>> truetypes.isValid('randomcrap');
>>> false
```## Contribution
[![Build Status](https://travis-ci.org/jacomyal/typology.svg)](https://travis-ci.org/jacomyal/typology)
Contributions are welcome. Please be sure to add and pass unit tests if relevant before submitting any code.
To setup the project, just install npm dependencies with `npm install` and run tests with `npm test`.
## Code style
We use prettier for the code style, with its default setup. It is plugged as a precommit hook, so you don't have to worry about it.
Also, as an internal convention, please:
- Write `__myVar` for any global private variable
- Write `_myVar` for any instance private variable
- Write `myVar` any local variable## License
Typology is under a MIT license.