-
Alvaro Cabrera authoredAlvaro Cabrera authored
traverse.js 1.35 KiB
'use strict';
var random = require('./random'),
combine = require('./combine');
function reduce(obj) {
var mix = obj.allOf || obj.anyOf || obj.oneOf;
if (!(mix && mix.length)) {
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object' && !(key === 'enum' || key === 'required')) {
reduce(value);
}
}
return;
}
if ((obj.oneOf || obj.anyOf) && mix.length) {
mix = [random.pick(mix)];
}
delete obj.allOf;
delete obj.anyOf;
delete obj.oneOf;
var fixed = {};
mix.forEach(function(value) {
combine(fixed, value);
});
combine(obj, fixed);
while (obj.allOf || obj.anyOf || obj.oneOf) {
reduce(obj);
}
}
function traverse(obj) {
var primitives = require('./primitives');
var copy = {};
if (Array.isArray(obj)) {
copy = [];
}
reduce(obj);
if (obj.enum) {
return random.pick(obj.enum);
}
if (obj.type) {
var type = obj.type;
if (Array.isArray(type)) {
type = random.pick(type);
}
if (!primitives[type]) {
throw new Error('Unknown primitive "' + type + '"');
}
return primitives[type](obj);
}
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object') {
copy[key] = traverse(value);
} else {
copy[key] = value;
}
}
return copy;
}
module.exports = traverse;