mcp-from-openapi 0.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"parameter-resolver.js","sourceRoot":"","sources":["../../src/parameter-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from 'json-schema';\nimport type {\n ParameterMapper,\n ParameterObject,\n RequestBodyObject,\n NamingStrategy,\n ParameterLocation,\n SchemaObject,\n ReferenceObject,\n} from './types';\nimport { toJSONSchema7 } from './types';\n\n/**\n * Resolves parameters and handles naming conflicts\n */\nexport class ParameterResolver {\n private namingStrategy: NamingStrategy;\n\n constructor(namingStrategy?: NamingStrategy) {\n this.namingStrategy = namingStrategy ?? {\n conflictResolver: this.defaultConflictResolver,\n };\n }\n\n /**\n * Default conflict resolver: prefix with location\n */\n private defaultConflictResolver(\n paramName: string,\n location: ParameterLocation,\n index: number\n ): string {\n const locationPrefix = {\n path: 'path',\n query: 'query',\n header: 'header',\n cookie: 'cookie',\n body: 'body',\n }[location];\n\n return `${locationPrefix}${paramName.charAt(0).toUpperCase()}${paramName.slice(1)}`;\n }\n\n /**\n * Resolve all parameters for an operation\n */\n resolve(\n operation: any,\n pathParameters?: ParameterObject[]\n ): {\n inputSchema: JSONSchema7;\n mapper: ParameterMapper[];\n } {\n const allParameters: ParameterObject[] = [\n ...(pathParameters ?? []),\n ...(operation.parameters ?? []),\n ];\n\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n\n // Collect all parameter names and detect conflicts\n const parametersByName = new Map<string, ParameterInfo[]>();\n\n // Process standard parameters\n allParameters.forEach((param) => {\n const info: ParameterInfo = {\n name: param.name,\n location: param.in as ParameterLocation,\n required: param.required ?? (param.in === 'path'),\n schema: param.schema ?? { type: 'string' },\n description: param.description,\n style: param.style,\n explode: param.explode,\n allowReserved: param.allowReserved,\n deprecated: param.deprecated,\n };\n\n if (!parametersByName.has(param.name)) {\n parametersByName.set(param.name, []);\n }\n parametersByName.get(param.name)!.push(info);\n });\n\n // Process request body\n if (requestBody?.content) {\n const contentType = this.selectContentType(requestBody.content);\n const mediaType = requestBody.content[contentType];\n\n if (mediaType?.schema) {\n this.extractBodyParameters(\n mediaType.schema,\n parametersByName,\n requestBody.required ?? false,\n contentType\n );\n }\n }\n\n // Resolve conflicts and build schema + mapper\n const properties: Record<string, JSONSchema7> = {};\n const required: string[] = [];\n const mapper: ParameterMapper[] = [];\n\n for (const [originalName, params] of parametersByName.entries()) {\n if (params.length === 1) {\n // No conflict\n const param = params[0];\n const inputKey = originalName;\n\n properties[inputKey] = this.buildParameterSchema(param);\n if (param.required) {\n required.push(inputKey);\n }\n\n mapper.push({\n inputKey,\n type: param.location,\n key: originalName,\n required: param.required,\n style: param.style,\n explode: param.explode,\n serialization: param.serialization,\n });\n } else {\n // Conflict - need to resolve\n params.forEach((param, index) => {\n const inputKey = this.namingStrategy.conflictResolver(\n originalName,\n param.location,\n index\n );\n\n properties[inputKey] = this.buildParameterSchema(param);\n if (param.required) {\n required.push(inputKey);\n }\n\n mapper.push({\n inputKey,\n type: param.location,\n key: originalName,\n required: param.required,\n style: param.style,\n explode: param.explode,\n serialization: param.serialization,\n });\n });\n }\n }\n\n const inputSchema: JSONSchema7 = {\n type: 'object',\n properties,\n ...(required.length > 0 && { required }),\n additionalProperties: false,\n };\n\n return { inputSchema, mapper };\n }\n\n /**\n * Extract parameters from request body schema\n */\n private extractBodyParameters(\n schema: SchemaObject | ReferenceObject,\n parametersByName: Map<string, ParameterInfo[]>,\n required: boolean,\n contentType: string,\n prefix = ''\n ): void {\n if (!schema || typeof schema !== 'object') return;\n\n // Convert to JSONSchema7 for processing\n const jsonSchema = toJSONSchema7(schema);\n\n // Handle object schemas\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const requiredFields = new Set(jsonSchema.required ?? []);\n\n for (const [propName, propSchema] of Object.entries(jsonSchema.properties)) {\n const fullName = prefix ? `${prefix}.${propName}` : propName;\n const isRequired = required && requiredFields.has(propName);\n\n if (typeof propSchema === 'object' && !('$ref' in propSchema)) {\n const info: ParameterInfo = {\n name: fullName,\n location: 'body',\n required: isRequired,\n schema: propSchema as JSONSchema7,\n description: (propSchema as any).description,\n serialization: {\n contentType,\n },\n };\n\n if (!parametersByName.has(fullName)) {\n parametersByName.set(fullName, []);\n }\n parametersByName.get(fullName)!.push(info);\n }\n }\n } else {\n // For non-object bodies (arrays, primitives), treat as single parameter\n const bodyParamName = prefix || 'body';\n const info: ParameterInfo = {\n name: bodyParamName,\n location: 'body',\n required,\n schema,\n serialization: {\n contentType,\n },\n };\n\n if (!parametersByName.has(bodyParamName)) {\n parametersByName.set(bodyParamName, []);\n }\n parametersByName.get(bodyParamName)!.push(info);\n }\n }\n\n /**\n * Build JSON Schema for a parameter\n */\n private buildParameterSchema(param: ParameterInfo): JSONSchema7 {\n const schema: JSONSchema7 = toJSONSchema7(param.schema as any);\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.deprecated) {\n schema['deprecated'] = true;\n }\n\n // Add parameter metadata\n (schema as any)['x-parameter-location'] = param.location;\n if (param.style) {\n (schema as any)['x-parameter-style'] = param.style;\n }\n if (param.explode !== undefined) {\n (schema as any)['x-parameter-explode'] = param.explode;\n }\n\n return schema;\n }\n\n /**\n * Select the most appropriate content type\n */\n private selectContentType(content: Record<string, any>): string {\n // Preference order\n const preferences = [\n 'application/json',\n 'application/x-www-form-urlencoded',\n 'multipart/form-data',\n 'application/xml',\n 'text/plain',\n ];\n\n for (const pref of preferences) {\n if (content[pref]) return pref;\n }\n\n // Fallback to first available\n const firstKey = Object.keys(content)[0];\n if (!firstKey) {\n throw new Error('No content type available in request body');\n }\n return firstKey;\n }\n}\n\n/**\n * Internal parameter info structure\n */\ninterface ParameterInfo {\n name: string;\n location: ParameterLocation;\n required: boolean;\n schema: SchemaObject | ReferenceObject | JSONSchema7;\n description?: string;\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n deprecated?: boolean;\n serialization?: {\n contentType?: string;\n encoding?: Record<string, any>;\n };\n}\n"]}
1
+ {"version":3,"file":"parameter-resolver.js","sourceRoot":"","sources":["../../src/parameter-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\nimport type {\n ParameterMapper,\n ParameterObject,\n RequestBodyObject,\n NamingStrategy,\n ParameterLocation,\n SchemaObject,\n ReferenceObject,\n SecurityRequirement,\n SecurityParameterInfo,\n SecuritySchemeObject,\n} from './types';\nimport { toJsonSchema, isReferenceObject } from './types';\n\n/**\n * Resolves parameters and handles naming conflicts\n */\nexport class ParameterResolver {\n private namingStrategy: NamingStrategy;\n\n constructor(namingStrategy?: NamingStrategy) {\n this.namingStrategy = namingStrategy ?? {\n conflictResolver: this.defaultConflictResolver,\n };\n }\n\n /**\n * Default conflict resolver: prefix with location\n */\n private defaultConflictResolver(paramName: string, location: ParameterLocation, index: number): string {\n const locationPrefix = {\n path: 'path',\n query: 'query',\n header: 'header',\n cookie: 'cookie',\n body: 'body',\n }[location];\n\n return `${locationPrefix}${paramName.charAt(0).toUpperCase()}${paramName.slice(1)}`;\n }\n\n /**\n * Resolve all parameters for an operation\n */\n resolve(\n operation: any,\n pathParameters?: ParameterObject[],\n securityRequirements?: SecurityRequirement[],\n includeSecurityInInput?: boolean,\n ): {\n inputSchema: JsonSchema;\n mapper: ParameterMapper[];\n } {\n const allParameters: ParameterObject[] = [...(pathParameters ?? []), ...(operation.parameters ?? [])];\n\n const requestBody = operation.requestBody as RequestBodyObject | undefined;\n\n // Collect all parameter names and detect conflicts\n const parametersByName = new Map<string, ParameterInfo[]>();\n\n // Process standard parameters\n allParameters.forEach((param) => {\n const info: ParameterInfo = {\n name: param.name,\n location: param.in as ParameterLocation,\n required: param.required ?? param.in === 'path',\n schema: param.schema ?? { type: 'string' },\n description: param.description,\n style: param.style,\n explode: param.explode,\n allowReserved: param.allowReserved,\n deprecated: param.deprecated,\n };\n\n if (!parametersByName.has(param.name)) {\n parametersByName.set(param.name, []);\n }\n parametersByName.get(param.name)!.push(info);\n });\n\n // Process request body\n if (requestBody?.content) {\n const contentType = this.selectContentType(requestBody.content);\n const mediaType = requestBody.content[contentType];\n\n if (mediaType?.schema) {\n this.extractBodyParameters(mediaType.schema, parametersByName, requestBody.required ?? false, contentType);\n }\n }\n\n // Resolve conflicts and build schema + mapper\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n const mapper: ParameterMapper[] = [];\n\n for (const [originalName, params] of parametersByName.entries()) {\n if (params.length === 1) {\n // No conflict\n const param = params[0];\n const inputKey = originalName;\n\n properties[inputKey] = this.buildParameterSchema(param);\n if (param.required) {\n required.push(inputKey);\n }\n\n mapper.push({\n inputKey,\n type: param.location,\n key: originalName,\n required: param.required,\n style: param.style,\n explode: param.explode,\n serialization: param.serialization,\n });\n } else {\n // Conflict - need to resolve\n params.forEach((param, index) => {\n const inputKey = this.namingStrategy.conflictResolver(originalName, param.location, index);\n\n properties[inputKey] = this.buildParameterSchema(param);\n if (param.required) {\n required.push(inputKey);\n }\n\n mapper.push({\n inputKey,\n type: param.location,\n key: originalName,\n required: param.required,\n style: param.style,\n explode: param.explode,\n serialization: param.serialization,\n });\n });\n }\n }\n\n // Process security requirements\n if (securityRequirements && securityRequirements.length > 0) {\n this.processSecurityRequirements(\n securityRequirements,\n properties,\n required,\n mapper,\n includeSecurityInInput ?? false,\n );\n }\n\n const inputSchema: JsonSchema = {\n type: 'object',\n properties,\n ...(required.length > 0 && { required }),\n additionalProperties: false,\n };\n\n return { inputSchema, mapper };\n }\n\n /**\n * Extract parameters from request body schema\n */\n private extractBodyParameters(\n schema: SchemaObject | ReferenceObject,\n parametersByName: Map<string, ParameterInfo[]>,\n required: boolean,\n contentType: string,\n prefix = '',\n ): void {\n if (!schema || typeof schema !== 'object') return;\n\n // Convert to JsonSchema for processing\n const jsonSchema = toJsonSchema(schema);\n\n // Handle object schemas\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n const requiredFields = new Set(jsonSchema.required ?? []);\n\n for (const [propName, propSchema] of Object.entries(jsonSchema.properties)) {\n const fullName = prefix ? `${prefix}.${propName}` : propName;\n const isRequired = required && requiredFields.has(propName);\n\n if (typeof propSchema === 'object') {\n const info: ParameterInfo = {\n name: fullName,\n location: 'body',\n required: isRequired,\n schema: propSchema as JsonSchema,\n description: (propSchema as any).description,\n serialization: {\n contentType,\n },\n };\n\n if (!parametersByName.has(fullName)) {\n parametersByName.set(fullName, []);\n }\n parametersByName.get(fullName)!.push(info);\n }\n }\n } else {\n // For non-object bodies (arrays, primitives), treat as single parameter\n const bodyParamName = prefix || 'body';\n const info: ParameterInfo = {\n name: bodyParamName,\n location: 'body',\n required,\n schema,\n serialization: {\n contentType,\n },\n };\n\n if (!parametersByName.has(bodyParamName)) {\n parametersByName.set(bodyParamName, []);\n }\n parametersByName.get(bodyParamName)!.push(info);\n }\n }\n\n /**\n * Build JSON Schema for a parameter\n */\n private buildParameterSchema(param: ParameterInfo): JsonSchema {\n const schema: JsonSchema = toJsonSchema(param.schema as any);\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.deprecated) {\n schema['deprecated'] = true;\n }\n\n // Add parameter metadata\n (schema as any)['x-parameter-location'] = param.location;\n if (param.style) {\n (schema as any)['x-parameter-style'] = param.style;\n }\n if (param.explode !== undefined) {\n (schema as any)['x-parameter-explode'] = param.explode;\n }\n\n return schema;\n }\n\n /**\n * Select the most appropriate content type\n */\n private selectContentType(content: Record<string, any>): string {\n // Preference order\n const preferences = [\n 'application/json',\n 'application/x-www-form-urlencoded',\n 'multipart/form-data',\n 'application/xml',\n 'text/plain',\n ];\n\n for (const pref of preferences) {\n if (content[pref]) return pref;\n }\n\n // Fallback to first available\n const firstKey = Object.keys(content)[0];\n if (!firstKey) {\n throw new Error('No content type available in request body');\n }\n return firstKey;\n }\n\n /**\n * Process security requirements and add to mapper/inputSchema\n */\n private processSecurityRequirements(\n securityRequirements: SecurityRequirement[],\n properties: Record<string, JsonSchema>,\n required: string[],\n mapper: ParameterMapper[],\n includeInInput: boolean,\n ): void {\n for (const secReq of securityRequirements) {\n const { scheme, type, name: apiKeyName, in: apiKeyIn, scopes } = secReq;\n\n // Build security parameter info\n const securityInfo: SecurityParameterInfo = {\n scheme,\n type,\n scopes,\n };\n\n // Determine parameter details based on security type\n let inputKey: string;\n let headerKey: string;\n let paramLocation: ParameterLocation;\n let description: string;\n let schema: JsonSchema;\n\n if (type === 'http') {\n // HTTP auth (bearer, basic, etc.)\n inputKey = scheme;\n headerKey = 'Authorization';\n paramLocation = 'header';\n\n const httpScheme = 'httpScheme' in secReq && secReq.httpScheme ? secReq.httpScheme : 'bearer';\n const bearerFormat = 'bearerFormat' in secReq ? secReq.bearerFormat : undefined;\n\n securityInfo.httpScheme = httpScheme;\n if (bearerFormat) {\n securityInfo.bearerFormat = bearerFormat;\n }\n\n description = `${httpScheme.charAt(0).toUpperCase()}${httpScheme.slice(1)} authentication token`;\n if (bearerFormat) {\n description += ` (${bearerFormat})`;\n }\n\n schema = {\n type: 'string',\n description,\n };\n } else if (type === 'apiKey') {\n // API Key auth\n inputKey = scheme;\n headerKey = apiKeyName || 'X-API-Key';\n paramLocation = (apiKeyIn || 'header') as ParameterLocation;\n\n securityInfo.apiKeyName = apiKeyName;\n securityInfo.apiKeyIn = apiKeyIn;\n\n description = `API key for ${scheme}`;\n schema = {\n type: 'string',\n description,\n };\n } else if (type === 'oauth2' || type === 'openIdConnect') {\n // OAuth2 / OpenID Connect\n inputKey = scheme;\n headerKey = 'Authorization';\n paramLocation = 'header';\n\n description = `OAuth2 access token${scopes && scopes.length > 0 ? ` (scopes: ${scopes.join(', ')})` : ''}`;\n schema = {\n type: 'string',\n description,\n };\n } else {\n // Unknown type, skip\n continue;\n }\n\n // Add to mapper (always)\n mapper.push({\n inputKey,\n type: paramLocation,\n key: headerKey,\n required: true,\n security: securityInfo,\n });\n\n // Add to inputSchema (only if includeInInput is true)\n if (includeInInput) {\n properties[inputKey] = schema;\n required.push(inputKey);\n }\n }\n }\n}\n\n/**\n * Internal parameter info structure\n */\ninterface ParameterInfo {\n name: string;\n location: ParameterLocation;\n required: boolean;\n schema: SchemaObject | ReferenceObject | JsonSchema;\n description?: string;\n style?: string;\n explode?: boolean;\n allowReserved?: boolean;\n deprecated?: boolean;\n serialization?: {\n contentType?: string;\n encoding?: Record<string, any>;\n };\n}\n"]}
@@ -1,4 +1,6 @@
1
- import type { JSONSchema7 } from 'json-schema';
1
+ import type { JSONSchema } from 'zod/v4/core';
2
+ /** JSON Schema type from Zod v4 */
3
+ type JsonSchema = JSONSchema.JSONSchema;
2
4
  import type { GenerateOptions, ResponsesObject } from './types';
3
5
  /**
4
6
  * Builds output schemas from OpenAPI response definitions
@@ -10,7 +12,7 @@ export declare class ResponseBuilder {
10
12
  /**
11
13
  * Build output schema from responses
12
14
  */
13
- build(responses?: ResponsesObject): JSONSchema7 | undefined;
15
+ build(responses?: ResponsesObject): JsonSchema | undefined;
14
16
  /**
15
17
  * Extract schemas from all responses
16
18
  */
@@ -28,3 +30,4 @@ export declare class ResponseBuilder {
28
30
  */
29
31
  private selectPreferredSchema;
30
32
  }
33
+ export {};
@@ -6,6 +6,8 @@ const types_1 = require("./types");
6
6
  * Builds output schemas from OpenAPI response definitions
7
7
  */
8
8
  class ResponseBuilder {
9
+ preferredStatusCodes;
10
+ includeAllResponses;
9
11
  constructor(options = {}) {
10
12
  this.preferredStatusCodes = options.preferredStatusCodes ?? [200, 201, 204, 202, 203, 206];
11
13
  this.includeAllResponses = options.includeAllResponses ?? true;
@@ -90,7 +92,7 @@ class ResponseBuilder {
90
92
  return null;
91
93
  }
92
94
  const schema = {
93
- ...(0, types_1.toJSONSchema7)(mediaType.schema),
95
+ ...(0, types_1.toJsonSchema)(mediaType.schema),
94
96
  'x-status-code': statusCode,
95
97
  };
96
98
  // Add description if not already present
@@ -1 +1 @@
1
- {"version":3,"file":"response-builder.js","sourceRoot":"","sources":["../../src/response-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from 'json-schema';\nimport type { ResponseObject, GenerateOptions, ResponsesObject } from './types';\nimport { isReferenceObject, toJSONSchema7 } from './types';\n\n/**\n * Builds output schemas from OpenAPI response definitions\n */\nexport class ResponseBuilder {\n private preferredStatusCodes: number[];\n private includeAllResponses: boolean;\n\n constructor(options: GenerateOptions = {}) {\n this.preferredStatusCodes = options.preferredStatusCodes ?? [200, 201, 204, 202, 203, 206];\n this.includeAllResponses = options.includeAllResponses ?? true;\n }\n\n /**\n * Build output schema from responses\n */\n build(responses?: ResponsesObject): JSONSchema7 | undefined {\n if (!responses || Object.keys(responses).length === 0) {\n return undefined;\n }\n\n const schemas = this.extractResponseSchemas(responses);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0].schema;\n }\n\n if (this.includeAllResponses) {\n // Return union of all response schemas\n return {\n oneOf: schemas.map((s) => s.schema),\n description: 'Response can be one of multiple status codes',\n };\n } else {\n // Return only the preferred status code\n const preferred = this.selectPreferredSchema(schemas);\n return preferred.schema;\n }\n }\n\n /**\n * Extract schemas from all responses\n */\n private extractResponseSchemas(responses: ResponsesObject): ResponseSchema[] {\n const schemas: ResponseSchema[] = [];\n\n for (const [statusCode, response] of Object.entries(responses)) {\n // Skip if it's a reference object\n if (isReferenceObject(response)) continue;\n\n // Skip 'default' for now, we'll handle it separately\n if (statusCode === 'default') continue;\n\n const code = parseInt(statusCode, 10);\n if (isNaN(code)) continue;\n\n const schema = this.extractResponseSchema(response, code);\n if (schema) {\n schemas.push(schema);\n }\n }\n\n // Handle default response if no other schemas found\n if (schemas.length === 0 && responses['default']) {\n const defaultResponse = responses['default'];\n if (!isReferenceObject(defaultResponse)) {\n const schema = this.extractResponseSchema(defaultResponse, 0);\n if (schema) {\n schemas.push(schema);\n }\n }\n }\n\n return schemas;\n }\n\n /**\n * Extract schema from a single response\n */\n private extractResponseSchema(response: ResponseObject, statusCode: number): ResponseSchema | null {\n if (!response.content) {\n // Response with no content (e.g., 204 No Content)\n return {\n statusCode,\n schema: {\n type: 'null',\n description: response.description,\n 'x-status-code': statusCode,\n } as JSONSchema7,\n };\n }\n\n const contentType = this.selectContentType(response.content);\n const mediaType = response.content[contentType];\n\n if (!mediaType?.schema) {\n return null;\n }\n\n const schema: JSONSchema7 & { 'x-status-code'?: number } = {\n ...toJSONSchema7(mediaType.schema),\n 'x-status-code': statusCode,\n };\n\n // Add description if not already present\n if (!schema.description && response.description) {\n schema.description = response.description;\n }\n\n // Add content type metadata\n (schema as any)['x-content-type'] = contentType;\n\n return { statusCode, schema };\n }\n\n /**\n * Select the most appropriate content type\n */\n private selectContentType(content: Record<string, any>): string {\n // Preference order for responses\n const preferences = [\n 'application/json',\n 'application/hal+json',\n 'application/problem+json',\n 'application/xml',\n 'text/plain',\n 'text/html',\n ];\n\n for (const pref of preferences) {\n if (content[pref]) return pref;\n }\n\n // Fallback to first available\n return Object.keys(content)[0];\n }\n\n /**\n * Select the preferred schema based on status code preferences\n */\n private selectPreferredSchema(schemas: ResponseSchema[]): ResponseSchema {\n // First, try to find exact match in preferred list\n for (const preferredCode of this.preferredStatusCodes) {\n const found = schemas.find((s) => s.statusCode === preferredCode);\n if (found) return found;\n }\n\n // Next, try to find any 2xx response\n const success = schemas.find((s) => s.statusCode >= 200 && s.statusCode < 300);\n if (success) return success;\n\n // Next, try to find any 3xx response\n const redirect = schemas.find((s) => s.statusCode >= 300 && s.statusCode < 400);\n if (redirect) return redirect;\n\n // Fallback to first available\n return schemas[0];\n }\n}\n\n/**\n * Internal response schema structure\n */\ninterface ResponseSchema {\n statusCode: number;\n schema: JSONSchema7;\n}\n"]}
1
+ {"version":3,"file":"response-builder.js","sourceRoot":"","sources":["../../src/response-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\nimport type { ResponseObject, GenerateOptions, ResponsesObject } from './types';\nimport { isReferenceObject, toJsonSchema } from './types';\n\n/**\n * Builds output schemas from OpenAPI response definitions\n */\nexport class ResponseBuilder {\n private preferredStatusCodes: number[];\n private includeAllResponses: boolean;\n\n constructor(options: GenerateOptions = {}) {\n this.preferredStatusCodes = options.preferredStatusCodes ?? [200, 201, 204, 202, 203, 206];\n this.includeAllResponses = options.includeAllResponses ?? true;\n }\n\n /**\n * Build output schema from responses\n */\n build(responses?: ResponsesObject): JsonSchema | undefined {\n if (!responses || Object.keys(responses).length === 0) {\n return undefined;\n }\n\n const schemas = this.extractResponseSchemas(responses);\n\n if (schemas.length === 0) {\n return undefined;\n }\n\n if (schemas.length === 1) {\n return schemas[0].schema;\n }\n\n if (this.includeAllResponses) {\n // Return union of all response schemas\n return {\n oneOf: schemas.map((s) => s.schema),\n description: 'Response can be one of multiple status codes',\n };\n } else {\n // Return only the preferred status code\n const preferred = this.selectPreferredSchema(schemas);\n return preferred.schema;\n }\n }\n\n /**\n * Extract schemas from all responses\n */\n private extractResponseSchemas(responses: ResponsesObject): ResponseSchema[] {\n const schemas: ResponseSchema[] = [];\n\n for (const [statusCode, response] of Object.entries(responses)) {\n // Skip if it's a reference object\n if (isReferenceObject(response)) continue;\n\n // Skip 'default' for now, we'll handle it separately\n if (statusCode === 'default') continue;\n\n const code = parseInt(statusCode, 10);\n if (isNaN(code)) continue;\n\n const schema = this.extractResponseSchema(response, code);\n if (schema) {\n schemas.push(schema);\n }\n }\n\n // Handle default response if no other schemas found\n if (schemas.length === 0 && responses['default']) {\n const defaultResponse = responses['default'];\n if (!isReferenceObject(defaultResponse)) {\n const schema = this.extractResponseSchema(defaultResponse, 0);\n if (schema) {\n schemas.push(schema);\n }\n }\n }\n\n return schemas;\n }\n\n /**\n * Extract schema from a single response\n */\n private extractResponseSchema(response: ResponseObject, statusCode: number): ResponseSchema | null {\n if (!response.content) {\n // Response with no content (e.g., 204 No Content)\n return {\n statusCode,\n schema: {\n type: 'null',\n description: response.description,\n 'x-status-code': statusCode,\n } as JsonSchema,\n };\n }\n\n const contentType = this.selectContentType(response.content);\n const mediaType = response.content[contentType];\n\n if (!mediaType?.schema) {\n return null;\n }\n\n const schema: JsonSchema & { 'x-status-code'?: number } = {\n ...toJsonSchema(mediaType.schema),\n 'x-status-code': statusCode,\n };\n\n // Add description if not already present\n if (!schema.description && response.description) {\n schema.description = response.description;\n }\n\n // Add content type metadata\n (schema as any)['x-content-type'] = contentType;\n\n return { statusCode, schema };\n }\n\n /**\n * Select the most appropriate content type\n */\n private selectContentType(content: Record<string, any>): string {\n // Preference order for responses\n const preferences = [\n 'application/json',\n 'application/hal+json',\n 'application/problem+json',\n 'application/xml',\n 'text/plain',\n 'text/html',\n ];\n\n for (const pref of preferences) {\n if (content[pref]) return pref;\n }\n\n // Fallback to first available\n return Object.keys(content)[0];\n }\n\n /**\n * Select the preferred schema based on status code preferences\n */\n private selectPreferredSchema(schemas: ResponseSchema[]): ResponseSchema {\n // First, try to find exact match in preferred list\n for (const preferredCode of this.preferredStatusCodes) {\n const found = schemas.find((s) => s.statusCode === preferredCode);\n if (found) return found;\n }\n\n // Next, try to find any 2xx response\n const success = schemas.find((s) => s.statusCode >= 200 && s.statusCode < 300);\n if (success) return success;\n\n // Next, try to find any 3xx response\n const redirect = schemas.find((s) => s.statusCode >= 300 && s.statusCode < 400);\n if (redirect) return redirect;\n\n // Fallback to first available\n return schemas[0];\n }\n}\n\n/**\n * Internal response schema structure\n */\ninterface ResponseSchema {\n statusCode: number;\n schema: JsonSchema;\n}\n"]}
@@ -1,4 +1,6 @@
1
- import type { JSONSchema7 } from 'json-schema';
1
+ import type { JSONSchema } from 'zod/v4/core';
2
+ /** JSON Schema type from Zod v4 */
3
+ type JsonSchema = JSONSchema.JSONSchema;
2
4
  /**
3
5
  * Helper class for building and manipulating JSON schemas
4
6
  */
@@ -6,74 +8,66 @@ export declare class SchemaBuilder {
6
8
  /**
7
9
  * Merge multiple schemas into one
8
10
  */
9
- static merge(schemas: JSONSchema7[]): JSONSchema7;
11
+ static merge(schemas: JsonSchema[]): JsonSchema;
10
12
  /**
11
13
  * Create a union schema (oneOf)
12
14
  */
13
- static union(schemas: JSONSchema7[]): JSONSchema7;
15
+ static union(schemas: JsonSchema[]): JsonSchema;
14
16
  /**
15
17
  * Deep clone a schema
16
18
  */
17
- static clone(schema: JSONSchema7): JSONSchema7;
19
+ static clone(schema: JsonSchema): JsonSchema;
18
20
  /**
19
21
  * Remove $ref from schema (assumes already dereferenced)
20
22
  */
21
- static removeRefs(schema: JSONSchema7): JSONSchema7;
23
+ static removeRefs(schema: JsonSchema): JsonSchema;
22
24
  private static removeRefsRecursive;
23
25
  /**
24
26
  * Add description to schema
25
27
  */
26
- static withDescription(schema: JSONSchema7, description: string): JSONSchema7;
27
- /**
28
- * Mark schema as required
29
- */
30
- static required(schema: JSONSchema7): JSONSchema7;
31
- /**
32
- * Mark schema as optional
33
- */
34
- static optional(schema: JSONSchema7): JSONSchema7;
28
+ static withDescription(schema: JsonSchema, description: string): JsonSchema;
35
29
  /**
36
30
  * Add example to schema
37
31
  */
38
- static withExample(schema: JSONSchema7, example: any): JSONSchema7;
32
+ static withExample(schema: JsonSchema, example: any): JsonSchema;
39
33
  /**
40
34
  * Add default value to schema
41
35
  */
42
- static withDefault(schema: JSONSchema7, defaultValue: any): JSONSchema7;
36
+ static withDefault(schema: JsonSchema, defaultValue: any): JsonSchema;
43
37
  /**
44
38
  * Add format to schema
45
39
  */
46
- static withFormat(schema: JSONSchema7, format: string): JSONSchema7;
40
+ static withFormat(schema: JsonSchema, format: string): JsonSchema;
47
41
  /**
48
42
  * Add pattern to schema
49
43
  */
50
- static withPattern(schema: JSONSchema7, pattern: string): JSONSchema7;
44
+ static withPattern(schema: JsonSchema, pattern: string): JsonSchema;
51
45
  /**
52
46
  * Add enum to schema
53
47
  */
54
- static withEnum(schema: JSONSchema7, values: any[]): JSONSchema7;
48
+ static withEnum(schema: JsonSchema, values: any[]): JsonSchema;
55
49
  /**
56
50
  * Add minimum/maximum constraints
57
51
  */
58
- static withRange(schema: JSONSchema7, min?: number, max?: number, options?: {
52
+ static withRange(schema: JsonSchema, min?: number, max?: number, options?: {
59
53
  exclusive?: boolean;
60
- }): JSONSchema7;
54
+ }): JsonSchema;
61
55
  /**
62
56
  * Add minLength/maxLength constraints
63
57
  */
64
- static withLength(schema: JSONSchema7, minLength?: number, maxLength?: number): JSONSchema7;
58
+ static withLength(schema: JsonSchema, minLength?: number, maxLength?: number): JsonSchema;
65
59
  /**
66
60
  * Create object schema
67
61
  */
68
- static object(properties: Record<string, JSONSchema7>, required?: string[]): JSONSchema7;
62
+ static object(properties: Record<string, JsonSchema>, required?: string[]): JsonSchema;
69
63
  /**
70
64
  * Create array schema
71
65
  */
72
- static array(items: JSONSchema7, constraints?: {
66
+ static array(items: JsonSchema, constraints?: {
73
67
  minItems?: number;
74
68
  maxItems?: number;
75
69
  uniqueItems?: boolean;
76
- }): JSONSchema7;
70
+ }): JsonSchema;
77
71
  /**
78
72
  * Create string schema
79
73
  */
@@ -83,7 +77,7 @@ export declare class SchemaBuilder {
83
77
  pattern?: string;
84
78
  format?: string;
85
79
  enum?: string[];
86
- }): JSONSchema7;
80
+ }): JsonSchema;
87
81
  /**
88
82
  * Create number schema
89
83
  */
@@ -93,7 +87,7 @@ export declare class SchemaBuilder {
93
87
  exclusiveMinimum?: number;
94
88
  exclusiveMaximum?: number;
95
89
  multipleOf?: number;
96
- }): JSONSchema7;
90
+ }): JsonSchema;
97
91
  /**
98
92
  * Create integer schema
99
93
  */
@@ -103,21 +97,22 @@ export declare class SchemaBuilder {
103
97
  exclusiveMinimum?: number;
104
98
  exclusiveMaximum?: number;
105
99
  multipleOf?: number;
106
- }): JSONSchema7;
100
+ }): JsonSchema;
107
101
  /**
108
102
  * Create boolean schema
109
103
  */
110
- static boolean(): JSONSchema7;
104
+ static boolean(): JsonSchema;
111
105
  /**
112
106
  * Create null schema
113
107
  */
114
- static null(): JSONSchema7;
108
+ static null(): JsonSchema;
115
109
  /**
116
110
  * Flatten nested oneOf/anyOf/allOf schemas
117
111
  */
118
- static flatten(schema: JSONSchema7, maxDepth?: number): JSONSchema7;
112
+ static flatten(schema: JsonSchema, maxDepth?: number): JsonSchema;
119
113
  /**
120
114
  * Simplify schema by removing unnecessary fields
121
115
  */
122
- static simplify(schema: JSONSchema7): JSONSchema7;
116
+ static simplify(schema: JsonSchema): JsonSchema;
123
117
  }
118
+ export {};
@@ -72,7 +72,7 @@ class SchemaBuilder {
72
72
  delete obj.$ref;
73
73
  }
74
74
  for (const key in obj) {
75
- if (obj.hasOwnProperty(key)) {
75
+ if (key in obj) {
76
76
  const value = obj[key];
77
77
  if (value && typeof value === 'object') {
78
78
  this.removeRefsRecursive(value);
@@ -89,18 +89,6 @@ class SchemaBuilder {
89
89
  description,
90
90
  };
91
91
  }
92
- /**
93
- * Mark schema as required
94
- */
95
- static required(schema) {
96
- return schema;
97
- }
98
- /**
99
- * Mark schema as optional
100
- */
101
- static optional(schema) {
102
- return schema;
103
- }
104
92
  /**
105
93
  * Add example to schema
106
94
  */
@@ -268,6 +256,13 @@ class SchemaBuilder {
268
256
  });
269
257
  cloned.anyOf = flattened;
270
258
  }
259
+ if (cloned.allOf) {
260
+ const flattened = cloned.allOf.flatMap((s) => {
261
+ const sub = this.flatten(s, maxDepth - 1);
262
+ return sub.allOf ? sub.allOf : [sub];
263
+ });
264
+ cloned.allOf = flattened;
265
+ }
271
266
  return cloned;
272
267
  }
273
268
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"schema-builder.js","sourceRoot":"","sources":["../../src/schema-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from 'json-schema';\n\n/**\n * Helper class for building and manipulating JSON schemas\n */\nexport class SchemaBuilder {\n /**\n * Merge multiple schemas into one\n */\n static merge(schemas: JSONSchema7[]): JSONSchema7 {\n if (schemas.length === 0) {\n return { type: 'object' };\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n const merged: JSONSchema7 = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n const allRequired = new Set<string>();\n\n for (const schema of schemas) {\n if (schema.properties) {\n merged.properties = {\n ...merged.properties,\n ...schema.properties,\n };\n }\n\n if (schema.required) {\n schema.required.forEach((field) => allRequired.add(field));\n }\n }\n\n if (allRequired.size > 0) {\n merged.required = Array.from(allRequired);\n }\n\n return merged;\n }\n\n /**\n * Create a union schema (oneOf)\n */\n static union(schemas: JSONSchema7[]): JSONSchema7 {\n if (schemas.length === 0) {\n return {};\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return {\n oneOf: schemas,\n };\n }\n\n /**\n * Deep clone a schema\n */\n static clone(schema: JSONSchema7): JSONSchema7 {\n return JSON.parse(JSON.stringify(schema));\n }\n\n /**\n * Remove $ref from schema (assumes already dereferenced)\n */\n static removeRefs(schema: JSONSchema7): JSONSchema7 {\n const cloned = this.clone(schema);\n this.removeRefsRecursive(cloned);\n return cloned;\n }\n\n private static removeRefsRecursive(obj: any): void {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.$ref) {\n delete obj.$ref;\n }\n\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (value && typeof value === 'object') {\n this.removeRefsRecursive(value);\n }\n }\n }\n }\n\n /**\n * Add description to schema\n */\n static withDescription(schema: JSONSchema7, description: string): JSONSchema7 {\n return {\n ...schema,\n description,\n };\n }\n\n /**\n * Mark schema as required\n */\n static required(schema: JSONSchema7): JSONSchema7 {\n return schema;\n }\n\n /**\n * Mark schema as optional\n */\n static optional(schema: JSONSchema7): JSONSchema7 {\n return schema;\n }\n\n /**\n * Add example to schema\n */\n static withExample(schema: JSONSchema7, example: any): JSONSchema7 {\n const existingExamples = Array.isArray(schema.examples) ? schema.examples : [];\n return {\n ...schema,\n examples: [...existingExamples, example],\n };\n }\n\n /**\n * Add default value to schema\n */\n static withDefault(schema: JSONSchema7, defaultValue: any): JSONSchema7 {\n return {\n ...schema,\n default: defaultValue,\n };\n }\n\n /**\n * Add format to schema\n */\n static withFormat(schema: JSONSchema7, format: string): JSONSchema7 {\n return {\n ...schema,\n format,\n };\n }\n\n /**\n * Add pattern to schema\n */\n static withPattern(schema: JSONSchema7, pattern: string): JSONSchema7 {\n return {\n ...schema,\n pattern,\n };\n }\n\n /**\n * Add enum to schema\n */\n static withEnum(schema: JSONSchema7, values: any[]): JSONSchema7 {\n return {\n ...schema,\n enum: values,\n };\n }\n\n /**\n * Add minimum/maximum constraints\n */\n static withRange(\n schema: JSONSchema7,\n min?: number,\n max?: number,\n options: { exclusive?: boolean } = {}\n ): JSONSchema7 {\n const result = { ...schema };\n\n if (min !== undefined) {\n if (options.exclusive) {\n result.exclusiveMinimum = min;\n } else {\n result.minimum = min;\n }\n }\n\n if (max !== undefined) {\n if (options.exclusive) {\n result.exclusiveMaximum = max;\n } else {\n result.maximum = max;\n }\n }\n\n return result;\n }\n\n /**\n * Add minLength/maxLength constraints\n */\n static withLength(schema: JSONSchema7, minLength?: number, maxLength?: number): JSONSchema7 {\n const result = { ...schema };\n\n if (minLength !== undefined) {\n result.minLength = minLength;\n }\n\n if (maxLength !== undefined) {\n result.maxLength = maxLength;\n }\n\n return result;\n }\n\n /**\n * Create object schema\n */\n static object(\n properties: Record<string, JSONSchema7>,\n required?: string[]\n ): JSONSchema7 {\n return {\n type: 'object',\n properties,\n ...(required && required.length > 0 && { required }),\n additionalProperties: false,\n };\n }\n\n /**\n * Create array schema\n */\n static array(items: JSONSchema7, constraints?: {\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n }): JSONSchema7 {\n return {\n type: 'array',\n items,\n ...constraints,\n };\n }\n\n /**\n * Create string schema\n */\n static string(constraints?: {\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n enum?: string[];\n }): JSONSchema7 {\n return {\n type: 'string',\n ...constraints,\n };\n }\n\n /**\n * Create number schema\n */\n static number(constraints?: {\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n }): JSONSchema7 {\n return {\n type: 'number',\n ...constraints,\n };\n }\n\n /**\n * Create integer schema\n */\n static integer(constraints?: {\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n }): JSONSchema7 {\n return {\n type: 'integer',\n ...constraints,\n };\n }\n\n /**\n * Create boolean schema\n */\n static boolean(): JSONSchema7 {\n return {\n type: 'boolean',\n };\n }\n\n /**\n * Create null schema\n */\n static null(): JSONSchema7 {\n return {\n type: 'null',\n };\n }\n\n /**\n * Flatten nested oneOf/anyOf/allOf schemas\n */\n static flatten(schema: JSONSchema7, maxDepth = 10): JSONSchema7 {\n if (maxDepth <= 0) return schema;\n\n const cloned = this.clone(schema);\n\n if (cloned.oneOf) {\n const flattened = cloned.oneOf.flatMap((s) => {\n const sub = this.flatten(s as JSONSchema7, maxDepth - 1);\n return sub.oneOf ? sub.oneOf : [sub];\n });\n cloned.oneOf = flattened as JSONSchema7[];\n }\n\n if (cloned.anyOf) {\n const flattened = cloned.anyOf.flatMap((s) => {\n const sub = this.flatten(s as JSONSchema7, maxDepth - 1);\n return sub.anyOf ? sub.anyOf : [sub];\n });\n cloned.anyOf = flattened as JSONSchema7[];\n }\n\n return cloned;\n }\n\n /**\n * Simplify schema by removing unnecessary fields\n */\n static simplify(schema: JSONSchema7): JSONSchema7 {\n const cloned = this.clone(schema);\n\n // Remove empty arrays/objects\n if (Array.isArray(cloned.required) && cloned.required.length === 0) {\n delete cloned.required;\n }\n\n if (cloned.properties && Object.keys(cloned.properties).length === 0) {\n delete cloned.properties;\n }\n\n if (Array.isArray(cloned.examples) && cloned.examples.length === 0) {\n delete cloned.examples;\n }\n\n // Remove title if it matches description\n if (cloned.title && cloned.description && cloned.title === cloned.description) {\n delete cloned.title;\n }\n\n return cloned;\n }\n}\n"]}
1
+ {"version":3,"file":"schema-builder.js","sourceRoot":"","sources":["../../src/schema-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema } from 'zod/v4/core';\n\n/** JSON Schema type from Zod v4 */\ntype JsonSchema = JSONSchema.JSONSchema;\n\n/**\n * Helper class for building and manipulating JSON schemas\n */\nexport class SchemaBuilder {\n /**\n * Merge multiple schemas into one\n */\n static merge(schemas: JsonSchema[]): JsonSchema {\n if (schemas.length === 0) {\n return { type: 'object' };\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n const merged: JsonSchema = {\n type: 'object',\n properties: {},\n required: [],\n };\n\n const allRequired = new Set<string>();\n\n for (const schema of schemas) {\n if (schema.properties) {\n merged.properties = {\n ...merged.properties,\n ...schema.properties,\n };\n }\n\n if (schema.required) {\n schema.required.forEach((field) => allRequired.add(field));\n }\n }\n\n if (allRequired.size > 0) {\n merged.required = Array.from(allRequired);\n }\n\n return merged;\n }\n\n /**\n * Create a union schema (oneOf)\n */\n static union(schemas: JsonSchema[]): JsonSchema {\n if (schemas.length === 0) {\n return {};\n }\n\n if (schemas.length === 1) {\n return schemas[0];\n }\n\n return {\n oneOf: schemas,\n };\n }\n\n /**\n * Deep clone a schema\n */\n static clone(schema: JsonSchema): JsonSchema {\n return JSON.parse(JSON.stringify(schema));\n }\n\n /**\n * Remove $ref from schema (assumes already dereferenced)\n */\n static removeRefs(schema: JsonSchema): JsonSchema {\n const cloned = this.clone(schema);\n this.removeRefsRecursive(cloned);\n return cloned;\n }\n\n private static removeRefsRecursive(obj: any): void {\n if (!obj || typeof obj !== 'object') return;\n\n if (obj.$ref) {\n delete obj.$ref;\n }\n\n for (const key in obj) {\n if (key in obj) {\n const value = obj[key];\n if (value && typeof value === 'object') {\n this.removeRefsRecursive(value);\n }\n }\n }\n }\n\n /**\n * Add description to schema\n */\n static withDescription(schema: JsonSchema, description: string): JsonSchema {\n return {\n ...schema,\n description,\n };\n }\n\n /**\n * Add example to schema\n */\n static withExample(schema: JsonSchema, example: any): JsonSchema {\n const existingExamples = Array.isArray(schema.examples) ? schema.examples : [];\n return {\n ...schema,\n examples: [...existingExamples, example],\n };\n }\n\n /**\n * Add default value to schema\n */\n static withDefault(schema: JsonSchema, defaultValue: any): JsonSchema {\n return {\n ...schema,\n default: defaultValue,\n };\n }\n\n /**\n * Add format to schema\n */\n static withFormat(schema: JsonSchema, format: string): JsonSchema {\n return {\n ...schema,\n format,\n };\n }\n\n /**\n * Add pattern to schema\n */\n static withPattern(schema: JsonSchema, pattern: string): JsonSchema {\n return {\n ...schema,\n pattern,\n };\n }\n\n /**\n * Add enum to schema\n */\n static withEnum(schema: JsonSchema, values: any[]): JsonSchema {\n return {\n ...schema,\n enum: values,\n };\n }\n\n /**\n * Add minimum/maximum constraints\n */\n static withRange(schema: JsonSchema, min?: number, max?: number, options: { exclusive?: boolean } = {}): JsonSchema {\n const result = { ...schema };\n\n if (min !== undefined) {\n if (options.exclusive) {\n result.exclusiveMinimum = min;\n } else {\n result.minimum = min;\n }\n }\n\n if (max !== undefined) {\n if (options.exclusive) {\n result.exclusiveMaximum = max;\n } else {\n result.maximum = max;\n }\n }\n\n return result;\n }\n\n /**\n * Add minLength/maxLength constraints\n */\n static withLength(schema: JsonSchema, minLength?: number, maxLength?: number): JsonSchema {\n const result = { ...schema };\n\n if (minLength !== undefined) {\n result.minLength = minLength;\n }\n\n if (maxLength !== undefined) {\n result.maxLength = maxLength;\n }\n\n return result;\n }\n\n /**\n * Create object schema\n */\n static object(properties: Record<string, JsonSchema>, required?: string[]): JsonSchema {\n return {\n type: 'object',\n properties,\n ...(required && required.length > 0 && { required }),\n additionalProperties: false,\n };\n }\n\n /**\n * Create array schema\n */\n static array(\n items: JsonSchema,\n constraints?: {\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n },\n ): JsonSchema {\n return {\n type: 'array',\n items,\n ...constraints,\n };\n }\n\n /**\n * Create string schema\n */\n static string(constraints?: {\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n format?: string;\n enum?: string[];\n }): JsonSchema {\n return {\n type: 'string',\n ...constraints,\n };\n }\n\n /**\n * Create number schema\n */\n static number(constraints?: {\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n }): JsonSchema {\n return {\n type: 'number',\n ...constraints,\n };\n }\n\n /**\n * Create integer schema\n */\n static integer(constraints?: {\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n }): JsonSchema {\n return {\n type: 'integer',\n ...constraints,\n };\n }\n\n /**\n * Create boolean schema\n */\n static boolean(): JsonSchema {\n return {\n type: 'boolean',\n };\n }\n\n /**\n * Create null schema\n */\n static null(): JsonSchema {\n return {\n type: 'null',\n };\n }\n\n /**\n * Flatten nested oneOf/anyOf/allOf schemas\n */\n static flatten(schema: JsonSchema, maxDepth = 10): JsonSchema {\n if (maxDepth <= 0) return schema;\n\n const cloned = this.clone(schema);\n\n if (cloned.oneOf) {\n const flattened = cloned.oneOf.flatMap((s) => {\n const sub = this.flatten(s as JsonSchema, maxDepth - 1);\n return sub.oneOf ? sub.oneOf : [sub];\n });\n cloned.oneOf = flattened as JsonSchema[];\n }\n\n if (cloned.anyOf) {\n const flattened = cloned.anyOf.flatMap((s) => {\n const sub = this.flatten(s as JsonSchema, maxDepth - 1);\n return sub.anyOf ? sub.anyOf : [sub];\n });\n cloned.anyOf = flattened as JsonSchema[];\n }\n\n if (cloned.allOf) {\n const flattened = cloned.allOf.flatMap((s) => {\n const sub = this.flatten(s as JsonSchema, maxDepth - 1);\n return sub.allOf ? sub.allOf : [sub];\n });\n cloned.allOf = flattened as JsonSchema[];\n }\n\n return cloned;\n }\n\n /**\n * Simplify schema by removing unnecessary fields\n */\n static simplify(schema: JsonSchema): JsonSchema {\n const cloned = this.clone(schema);\n\n // Remove empty arrays/objects\n if (Array.isArray(cloned.required) && cloned.required.length === 0) {\n delete cloned.required;\n }\n\n if (cloned.properties && Object.keys(cloned.properties).length === 0) {\n delete cloned.properties;\n }\n\n if (Array.isArray(cloned.examples) && cloned.examples.length === 0) {\n delete cloned.examples;\n }\n\n // Remove title if it matches description\n if (cloned.title && cloned.description && cloned.title === cloned.description) {\n delete cloned.title;\n }\n\n return cloned;\n }\n}\n"]}