hey-api-builders
Version:
A custom plugin for @hey-api/openapi-ts that generates mock data builders with a lightweight custom runtime, Zod integration, or static mock generation.
190 lines • 6.64 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateStaticMockCode = generateStaticMockCode;
/**
* Static mock value generators
*/
/**
* Generates static TypeScript code that creates mock data without runtime dependencies
* @param schema - JSON Schema
* @param typeName - TypeScript type name
* @returns Static mock code
*/
function generateStaticMockCode(schema, typeName) {
return generateStaticMockInternal(schema, typeName, 0);
}
function generateStaticMockInternal(schema, typeName, depth) {
if (!schema || typeof schema !== 'object') {
return 'null';
}
if (schema.anyOf && Array.isArray(schema.anyOf)) {
const enumValues = schema.anyOf
.filter((item) => item && typeof item === 'object' && 'const' in item)
.map((item) => item.const);
if (enumValues.length > 0) {
return JSON.stringify(enumValues[0]);
}
}
if (schema.enum && Array.isArray(schema.enum)) {
return JSON.stringify(schema.enum[0]);
}
if (Array.isArray(schema.type)) {
const types = schema.type.filter((t) => t !== 'null');
if (types.length > 0 && types[0]) {
return generateStaticForSingleType(types[0], schema, typeName, depth);
}
}
if (typeof schema.type === 'string') {
return generateStaticForSingleType(schema.type, schema, typeName, depth);
}
if (schema.properties && !schema.type) {
return generateStaticObject(schema, typeName, depth);
}
if (schema.items && !schema.type) {
return generateStaticArray(schema, typeName, depth);
}
return 'null';
}
function generateStaticForSingleType(type, schema, typeName, depth) {
switch (type) {
case 'string':
return generateStaticString(schema);
case 'number':
return generateStaticNumber(schema);
case 'integer':
return generateStaticInteger(schema);
case 'boolean':
return 'true';
case 'null':
return 'null';
case 'array':
return generateStaticArray(schema, typeName, depth);
case 'object':
return generateStaticObject(schema, typeName, depth);
default:
return 'null';
}
}
/**
* Generates static string mock value
*/
function generateStaticString(schema) {
if (schema.format) {
const formatValue = getFormatDefaultValue(schema.format);
if (formatValue) {
return JSON.stringify(formatValue);
}
}
if (schema.default !== undefined) {
return JSON.stringify(schema.default);
}
if (schema.examples && Array.isArray(schema.examples) && schema.examples.length > 0) {
return JSON.stringify(schema.examples[0]);
}
if (schema.pattern) {
return '"pattern-match"';
}
const minLength = typeof schema.minLength === 'number' ? schema.minLength : 5;
const targetLength = Math.max(minLength, 5);
return JSON.stringify('a'.repeat(targetLength));
}
/**
* Gets default value for a given format
*/
function getFormatDefaultValue(format) {
const formatDefaults = {
uuid: '550e8400-e29b-41d4-a716-446655440000',
email: 'user@example.com',
uri: 'https://example.com',
url: 'https://example.com',
date: '2024-01-01',
'date-time': '2024-01-01T00:00:00.000Z',
phone: '+15551234567',
};
return formatDefaults[format] || null;
}
/**
* Generates static number mock value
*/
function generateStaticNumber(schema) {
if (typeof schema.default === 'number') {
return String(schema.default);
}
if (schema.examples && Array.isArray(schema.examples) && schema.examples.length > 0) {
const example = schema.examples[0];
if (typeof example === 'number') {
return String(example);
}
}
const min = typeof schema.minimum === 'number' ? schema.minimum : 0;
const max = typeof schema.maximum === 'number' ? schema.maximum : 100;
const value = min + Math.floor((max - min) / 2);
return String(value);
}
/**
* Generates static integer mock value
*/
function generateStaticInteger(schema) {
if (typeof schema.default === 'number') {
return String(Math.floor(schema.default));
}
if (schema.examples && Array.isArray(schema.examples) && schema.examples.length > 0) {
const example = schema.examples[0];
if (typeof example === 'number') {
return String(Math.floor(example));
}
}
const min = typeof schema.minimum === 'number' ? Math.ceil(schema.minimum) : 0;
const max = typeof schema.maximum === 'number' ? Math.floor(schema.maximum) : 100;
const value = min + Math.floor((max - min) / 2);
return String(value);
}
/**
* Generates static array mock value
*/
function generateStaticArray(schema, typeName, depth) {
if (!schema.items) {
return '[]';
}
const indent = ' '.repeat(depth);
const nextIndent = ' '.repeat(depth + 1);
const minItems = typeof schema.minItems === 'number' ? schema.minItems : 1;
const itemCount = Math.max(minItems, 1);
if (Array.isArray(schema.items)) {
const items = schema.items.map((item) => generateStaticMockInternal(item, typeName, depth + 1));
return `[\n${nextIndent}${items.join(`,\n${nextIndent}`)}\n${indent}]`;
}
else {
const itemMock = generateStaticMockInternal(schema.items, typeName, depth + 1);
if (itemCount === 1) {
return `[${itemMock}]`;
}
const items = Array(itemCount).fill(itemMock);
return `[\n${nextIndent}${items.join(`,\n${nextIndent}`)}\n${indent}]`;
}
}
/**
* Generates static object mock value
*/
function generateStaticObject(schema, typeName, depth) {
if (!schema.properties) {
return '{}';
}
const indent = ' '.repeat(depth);
const nextIndent = ' '.repeat(depth + 1);
const properties = [];
const required = new Set(schema.required || []);
for (const [key, propSchema] of Object.entries(schema.properties)) {
if (!required.has(key)) {
continue;
}
const propValue = generateStaticMockInternal(propSchema, typeName, depth + 1);
const safePropName = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key) ? key : `"${key}"`;
properties.push(`${safePropName}: ${propValue}`);
}
if (properties.length === 0) {
return '{}';
}
return `{\n${nextIndent}${properties.join(`,\n${nextIndent}`)}\n${indent}}`;
}
//# sourceMappingURL=static-mock-generator.js.map