djvi
Version:
Json Schema Instance
174 lines (125 loc) • 4.37 kB
Markdown
[](https://travis-ci.org/korzio/djvi)
[](https://gitter.im/korzio/djvi?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Dynamic Json Schema Instance
This package contains json-schema utility for instantiating models based on [schema](tools.ietf.org/html/draft-zyp-json-schema-04).
This is a part of **djv** packages aimed to work with json-schema. In future (~1 year) all **djv** packages will be unified into single package with **djv** scope.
## Usage
For node - package is not minimized
```
npm install djvi
```
For browser
```
<script src="djvi/djvi.js"></script>
```
Use environment
```
var jsonSchema = {"common":{"properties":{"type":{"enum":["common"]}},"required":["type"]}};
var env = new djvi();
env.addSchema('test', jsonSchema);
env.instance('test#/common');
// => { type: 'common' }
```
JSON Schema instantiator should generate `minimal` object, valid to a given schema.
- **not required** properties will be ommitted
- **maximum** and **minimum** will be set up for given number
- primitives **types** are instantiated with default values
```
null: null
string: ''
boolean: false
number: 0
integer: 0
object: {}
array: []
```
- **not** recursively changes negative schema to use different types
- **anyOf** and **oneOf** are solved with first property instance (for **oneOf** it should be also checked with single matching only - it is not implemented yet)
- [simple](http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.8) **dependency** instantiates only for required fields
- **items** keyword instantiates an array with fit objects
- **minItems, maxItems** instantiates an array with default types
- Each instance is an unique object (Unless unique = false is not used)
```
env.instance('test#/common') !== env.instance('test#/common')
```
Primitives [types](https://github.com/json-schema/json-schema/wiki/Type) with default values
```
{"type":"number","default":100}
// => 100
{"type": "null"}
// => null
{"type": ["integer", "string"]}
// => 0
{"type": "array"}
// => []
```
[](https://github.com/json-schema/json-schema/wiki/anyOf,-allOf,-oneOf,-not#allof) types
```
{ "allOf":[
{"type":"object","properties":{"title":{"type":"string"}},"required":["title"]},
{"type":"object","properties":{"amount":{"type":"number","default":1}},"required":["amount"]}
]}
// => {"title":"","amount":1}
```
[](https://github.com/json-schema/json-schema/wiki/additionalItems-and-items) keywords should instantiate an array with objects
```
{"minItems": 1}
// => [{}]
{"items":[{"type":"integer"},{"type":"string"}]}
// => [0, ""]
```
instantiate an object that corresponds to a schema
```
env.instance('test#/common');
// => { type: 'common' }
```
add a schema to djvi environment
```
env.addSchema('test', jsonSchema);
```
removes a schema or the whole structure from djvi environment
```
env.removeSchema('test');
```
resolves name by existing environment
```
env.resolve('test');
// => { name: 'test', schema: {} }, fn: ... }
```
exports the whole structure object from environment or by resolved name
```
env.export();
// => { test: { name: 'test', schema: {}, ... } }
```
imports all found structure objects to internal environment structure
```
env.import(config);
```
returns `{ types, fieldTypes, fieldValidate, fieldFormat }` generators that can be overridden for use cases
```
env.utils();
```
- add `allOf` and other cases to `not` schema
- add `oneOf` complex example/generator
- add regexp instantiate (pattern and patternProperties tests)
- add uniqueItems custom logic
- add format generators
- move tests to separated repo/package
## Resources
- [JSON Schema wiki](https://github.com/json-schema/json-schema/wiki)
- [JSON schema specification](tools.ietf.org/html/draft-zyp-json-schema-04)
- [djv](https://github.com/korzio/djv)
- [djvu](https://github.com/korzio/djvu)
- [JSON Schema Instantiator tests](https://github.com/tomarad/JSON-Schema-Instantiator/blob/master/tests/tests.js)