@yellow-ticket/seed-json-schema
Version:
Seed a JSON Schema with random values.
68 lines (67 loc) • 1.92 kB
JavaScript
import { seedString } from './seed-string.js';
import { seedNumber } from './seed-number.js';
import { seedInteger } from './seed-integer.js';
import { seedBoolean } from './seed-boolean.js';
import { seedArray } from './seed-array.js';
import { seedObject } from './seed-object.js';
import { merge } from './utils/merge.js';
import { isObject } from './utils/is-object.js';
export function seedSchema(schema) {
if (schema.allOf) {
const { allOf, ...rest } = schema;
return seedSchema(merge([rest, ...allOf]));
}
if (schema.oneOf) {
const first = schema.oneOf.at(0);
if (isObject(first)) {
const { oneOf, ...rest } = schema;
return seedSchema(merge([rest, first]));
}
}
if (schema.anyOf) {
const first = schema.anyOf.at(0);
if (isObject(first)) {
const { anyOf, ...rest } = schema;
return seedSchema(merge([rest, first]));
}
}
if (schema.enum != null) {
const enumValue = schema.enum[0];
if (Array.isArray(enumValue)) {
return seedArray({
type: 'array',
...enumValue,
});
}
if (isObject(enumValue)) {
return seedSchema({
type: 'object',
...enumValue,
});
}
return enumValue;
}
switch (schema.type) {
case 'string': {
return seedString(schema);
}
case 'number': {
return seedNumber(schema);
}
case 'integer': {
return seedInteger(schema);
}
case 'boolean': {
return seedBoolean(schema);
}
case 'array': {
return seedArray(schema);
}
case 'object': {
return seedObject(schema);
}
case 'null': {
return null;
}
}
}