@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
JavaScript
;
/**
* 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");