UNPKG

@yellow-ticket/seed-json-schema

Version:

Seed a JSON Schema with random values.

46 lines (45 loc) 1.83 kB
import { invariant } from 'outvariant'; import { faker } from '@faker-js/faker'; import { repeat } from './utils/repeat.js'; import { seedSchema } from './seed-schema.js'; export function seedObject(schema) { // Always use the explicit "default" value. if (schema.default) { return schema.default; } // Always us an explicit example, if provided. if (schema.examples) { return schema.examples; } const json = {}; // Support explicit "properties". if (schema.properties) { for (const [key, propertyDefinition] of Object.entries(schema.properties)) { if (typeof propertyDefinition === 'boolean') { continue; } invariant(!('$ref' in propertyDefinition), 'Failed to generate mock from the schema property definition (%j): found unresolved reference.', propertyDefinition); const value = seedSchema(propertyDefinition); if (typeof value !== 'undefined') { json[key] = value; } } } // Support "additionalProperties". if (schema.additionalProperties) { const additionalPropertiesSchema = schema.additionalProperties; if (additionalPropertiesSchema === true) { repeat(0, 4, () => { const propertyName = faker.word.sample().toLowerCase(); json[propertyName] = faker.string.sample(); }); return json; } invariant(!('$ref' in additionalPropertiesSchema), 'Failed to generate mock from the "additionalProperties" schema: found unresolved reference.'); repeat(0, 4, () => { const propertyName = faker.word.sample().toLowerCase(); json[propertyName] = seedSchema(additionalPropertiesSchema); }); } return json; }