json-schema-generator
Version:
JSON schema generator based on draft-v4.
112 lines (100 loc) • 2.46 kB
JavaScript
;
var utils = require('./utils');
/**
Schema generator using a AST
tree.
@class Compiler
*/
var Compiler = function() {
if (!this instanceof Compiler) {
return new Compiler();
}
this.schema = {};
};
/**
Generates a JSON schema based on the provided AST tree.
@method generate
@param {Object} tree AST
@param {Object} schema The schema object
@param {Object} parent Schema node parent object
@return void
*/
Compiler.prototype.generate = function(tree, schema, parent) {
for (var i in tree.children) {
var child = tree.children[i];
if (child.type === 'object') {
if (utils.isArray(parent.required)) {
parent.required.push(i);
}
schema[i] = {
type: 'object'
,properties: {}
,required: []
};
this.generate(child, schema[i].properties, schema[i]);
} else if (child.type === 'array') {
if (utils.isArray(parent.required)) {
parent.required.push(i);
}
schema[i] = {
type: 'array'
,uniqueItems: child.uniqueItems
,minItems: child.minItems
,items: {
required:[]
,properties: {}
}
}
this.generate(child, schema[i].items.properties, schema[i]);
} else {
schema[i] = {};
if (child.type) {
schema[i].type = child.type;
}
if (child.minLength) {
schema[i].minLength = child.minLength;
}
if (child.required) {
if (parent.items && utils.isArray(parent.items.required)) {
parent.items.required.push(i);
} else {
parent.required.push(i);
}
}
}
}
};
/**
Initates compiling the given AST into a
JSON schema.
@method compile
@param {Object} tree AST object
@return void
*/
Compiler.prototype.compile = function(tree) {
if (tree.type === 'object') {
this.schema = {
'$schema': 'http://json-schema.org/draft-04/schema#'
,description: ''
,type: 'object'
,properties: {}
,required: []
};
this.generate(tree, this.schema.properties, this.schema);
} else {
this.schema = {
type: 'array'
,'$schema': 'http://json-schema.org/draft-04/schema#'
,'description': ''
,minItems: 1
,uniqueItems: true
,items: {
type: 'object'
,required: []
,properties: {}
}
};
this.generate(tree, this.schema.items.properties, this.schema.items);
}
};
module.exports = Compiler;