Awesome
djvi
Dynamic Json Schema Instance
This package contains json-schema utility for instantiating models based on schema. 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' }
Concepts
JSON Schema instantiator should generate minimal
object, valid to a given schema.
- not required properties will be omitted
- 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 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')
Examples
Primitives types with default values
{"type":"number","default":100}
// => 100
{"type": "null"}
// => null
{"type": ["integer", "string"]}
// => 0
{"type": "array"}
// => []
All of types
{ "allOf":[
{"type":"object","properties":{"title":{"type":"string"}},"required":["title"]},
{"type":"object","properties":{"amount":{"type":"number","default":1}},"required":["amount"]}
]}
// => {"title":"","amount":1}
Items keywords should instantiate an array with objects
{"minItems": 1}
// => [{}]
{"items":[{"type":"integer"},{"type":"string"}]}
// => [0, ""]
API
instance(name, unique)
instantiate an object that corresponds to a schema
env.instance('test#/common');
// => { type: 'common' }
addSchema(name, schema)
add a schema to djvi environment
env.addSchema('test', jsonSchema);
removeSchema(name)
removes a schema or the whole structure from djvi environment
env.removeSchema('test');
resolve(name)
resolves name by existing environment
env.resolve('test');
// => { name: 'test', schema: {} }, fn: ... }
export(name)
exports the whole structure object from environment or by resolved name
env.export();
// => { test: { name: 'test', schema: {}, ... } }
import(config)
imports all found structure objects to internal environment structure
env.import(config);
utils()
returns { types, fieldTypes, fieldValidate, fieldFormat }
generators that can be overridden for use cases
env.utils();
TODO
- add
allOf
and other cases tonot
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