UNPKG

@firefliesai/schema-forge

Version:

Transform TypeScript classes into JSON Schema definitions with automatic support for OpenAI, Anthropic, and Google Gemini function calling (tool) formats

56 lines (55 loc) 1.84 kB
"use strict"; /** * Core schema generation functionality */ Object.defineProperty(exports, "__esModule", { value: true }); exports.classToJsonSchema = classToJsonSchema; const types_1 = require("./types"); const utils_1 = require("./utils"); /** * Converts a TypeScript class to a JSON Schema * * @param target The class to convert * @param options Options for schema generation * @returns JSON Schema representation of the class * * @example * // Basic usage * const schema = classToJsonSchema(User); * * // With options * const schema = classToJsonSchema(User, { * forStructuredOutput: true, * propertyOverrides: { * 'username': { description: 'Custom description' } * }, * structuredOutputFormat: 'openai', // unused * }); */ function classToJsonSchema(target, options) { const properties = (0, utils_1.cloneMetadata)(Reflect.getMetadata(types_1.JSON_SCHEMA_METADATA_KEY, target.prototype) || {}); const requiredProps = [ ...(Reflect.getMetadata(types_1.REQUIRED_PROPS_METADATA_KEY, target.prototype) || []), ]; if (options?.propertyOverrides) { Object.entries(options.propertyOverrides).forEach(([path, updates]) => { const paths = path.split('.'); (0, decorators_1.applyPropertyUpdates)(properties, paths, updates, target); }); } const schema = { type: 'object', properties, }; if (requiredProps.length > 0) { schema.required = requiredProps; } // Handle structured output formatting based on provider if (options?.forStructuredOutput) { // For backward compatibility, use OpenAI format return (0, utils_1.prepareForOpenAIStructuredOutput)(schema, true); } return schema; } // Import here to handle circular dependencies const decorators_1 = require("./decorators");