@cerios/openapi-to-zod 0.5.1 → 0.5.3

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/openapi-generator.ts","../src/utils/name-utils.ts","../src/generators/enum-generator.ts","../src/utils/string-utils.ts","../src/generators/jsdoc-generator.ts","../src/utils/lru-cache.ts","../src/validators/array-validator.ts","../src/validators/composition-validator.ts","../src/validators/number-validator.ts","../src/validators/conditional-validator.ts","../src/validators/object-validator.ts","../src/validators/string-validator.ts","../src/generators/property-generator.ts","../src/utils/operation-filters.ts","../src/types.ts"],"sourcesContent":["export {\n\tCircularReferenceError,\n\tCliOptionsError,\n\tConfigValidationError,\n\tFileOperationError,\n\tGeneratorError,\n\tSchemaGenerationError,\n\tSpecValidationError,\n} from \"./errors\";\nexport { OpenApiGenerator } from \"./openapi-generator\";\nexport type {\n\tConfigFile,\n\tExecutionMode,\n\tOpenAPISpec,\n\tOpenApiGeneratorOptions,\n\tOperationFilters,\n} from \"./types\";\nexport { defineConfig } from \"./types\";\nexport {\n\tcreateFilterStatistics,\n\ttype FilterStatistics,\n\tformatFilterStatistics,\n\tshouldIncludeOperation,\n\tvalidateFilters,\n} from \"./utils/operation-filters\";\n","/**\n * Custom error classes for better error handling and debugging\n */\n\n/**\n * Base error class for all generator errors\n */\nexport class GeneratorError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly context?: Record<string, unknown>\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"GeneratorError\";\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n}\n\n/**\n * Error thrown when OpenAPI spec validation fails\n */\nexport class SpecValidationError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"SPEC_VALIDATION_ERROR\", context);\n\t\tthis.name = \"SpecValidationError\";\n\t}\n}\n\n/**\n * Error thrown when file operations fail\n */\nexport class FileOperationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly filePath: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"FILE_OPERATION_ERROR\", { ...context, filePath });\n\t\tthis.name = \"FileOperationError\";\n\t}\n}\n\n/**\n * Error thrown when config file is invalid\n */\nexport class ConfigValidationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly configPath?: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"CONFIG_VALIDATION_ERROR\", { ...context, configPath });\n\t\tthis.name = \"ConfigValidationError\";\n\t}\n}\n\n/**\n * Error thrown when schema generation fails\n */\nexport class SchemaGenerationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly schemaName: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"SCHEMA_GENERATION_ERROR\", { ...context, schemaName });\n\t\tthis.name = \"SchemaGenerationError\";\n\t}\n}\n\n/**\n * Error thrown when circular reference is detected in schema\n */\nexport class CircularReferenceError extends SchemaGenerationError {\n\tconstructor(\n\t\tschemaName: string,\n\t\tpublic readonly referencePath: string[]\n\t) {\n\t\tconst pathStr = referencePath.join(\" -> \");\n\t\tsuper(`Circular reference detected in schema: ${pathStr}`, schemaName, { referencePath, circularPath: pathStr });\n\t\tthis.name = \"CircularReferenceError\";\n\t}\n}\n\n/**\n * Error thrown when CLI options are invalid\n */\nexport class CliOptionsError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"CLI_OPTIONS_ERROR\", context);\n\t\tthis.name = \"CliOptionsError\";\n\t}\n}\n\n/**\n * Error thrown when configuration is invalid or missing required values\n */\nexport class ConfigurationError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"CONFIGURATION_ERROR\", context);\n\t\tthis.name = \"ConfigurationError\";\n\t}\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, normalize } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { ConfigurationError, FileOperationError, SchemaGenerationError, SpecValidationError } from \"./errors\";\nimport { generateEnum } from \"./generators/enum-generator\";\nimport { generateJSDoc } from \"./generators/jsdoc-generator\";\nimport { PropertyGenerator } from \"./generators/property-generator\";\nimport type { OpenAPISchema, OpenAPISpec, OpenApiGeneratorOptions, ResolvedOptions, TypeMode } from \"./types\";\nimport { resolveRef, toCamelCase, toPascalCase } from \"./utils/name-utils\";\nimport {\n\tcreateFilterStatistics,\n\ttype FilterStatistics,\n\tformatFilterStatistics,\n\tshouldIncludeOperation,\n\tvalidateFilters,\n} from \"./utils/operation-filters\";\n\ntype SchemaContext = \"request\" | \"response\" | \"both\";\n\nexport class OpenApiGenerator {\n\tprivate schemas: Map<string, string> = new Map();\n\tprivate types: Map<string, string> = new Map();\n\tprivate enums: Map<string, string> = new Map();\n\tprivate nativeEnums: Map<string, string> = new Map();\n\tprivate schemaDependencies: Map<string, Set<string>> = new Map();\n\tprivate options: OpenApiGeneratorOptions;\n\tprivate spec: OpenAPISpec;\n\tprivate propertyGenerator: PropertyGenerator;\n\tprivate schemaUsageMap: Map<string, SchemaContext> = new Map();\n\tprivate schemaTypeModeMap: Map<string, TypeMode> = new Map();\n\tprivate requestOptions: ResolvedOptions;\n\tprivate responseOptions: ResolvedOptions;\n\tprivate needsZodImport = false;\n\tprivate filterStats: FilterStatistics = createFilterStatistics();\n\n\tconstructor(options: OpenApiGeneratorOptions) {\n\t\t// Validate input path early\n\t\tif (!options.input) {\n\t\t\tthrow new ConfigurationError(\"Input path is required\", { providedOptions: options });\n\t\t}\n\n\t\tthis.options = {\n\t\t\tmode: options.mode || \"normal\",\n\t\t\tinput: options.input,\n\t\t\toutput: options.output,\n\t\t\tincludeDescriptions: options.includeDescriptions ?? true,\n\t\t\tenumType: options.enumType || \"zod\",\n\t\t\tuseDescribe: options.useDescribe ?? false,\n\t\t\tschemaType: options.schemaType || \"all\",\n\t\t\tprefix: options.prefix,\n\t\t\tsuffix: options.suffix,\n\t\t\tshowStats: options.showStats ?? true,\n\t\t\tnativeEnumType: options.nativeEnumType || \"union\",\n\t\t\trequest: options.request,\n\t\t\tresponse: options.response,\n\t\t\toperationFilters: options.operationFilters,\n\t\t};\n\n\t\t// Validate input file exists\n\t\ttry {\n\t\t\tconst fs = require(\"node:fs\");\n\t\t\tif (!fs.existsSync(this.options.input)) {\n\t\t\t\tthrow new FileOperationError(`Input file not found: ${this.options.input}`, this.options.input);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileOperationError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t// If fs.existsSync fails for another reason, continue and let readFileSync throw\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = readFileSync(this.options.input, \"utf-8\");\n\n\t\t\t// Try parsing as YAML first (works for both YAML and JSON)\n\t\t\ttry {\n\t\t\t\tthis.spec = parse(content);\n\t\t\t} catch (yamlError) {\n\t\t\t\t// If YAML parsing fails, try JSON\n\t\t\t\ttry {\n\t\t\t\t\tthis.spec = JSON.parse(content);\n\t\t\t\t} catch {\n\t\t\t\t\tif (yamlError instanceof Error) {\n\t\t\t\t\t\tconst errorMessage = [\n\t\t\t\t\t\t\t`Failed to parse OpenAPI specification from: ${this.options.input}`,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t`Error: ${yamlError.message}`,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\"Please ensure:\",\n\t\t\t\t\t\t\t\" - The file exists and is readable\",\n\t\t\t\t\t\t\t\" - The file contains valid YAML or JSON syntax\",\n\t\t\t\t\t\t\t\" - The file is a valid OpenAPI 3.x specification\",\n\t\t\t\t\t\t].join(\"\\n\");\n\t\t\t\t\t\tthrow new SpecValidationError(errorMessage, {\n\t\t\t\t\t\t\tfilePath: this.options.input,\n\t\t\t\t\t\t\toriginalError: yamlError.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthrow yamlError;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof SpecValidationError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (error instanceof Error) {\n\t\t\t\tconst errorMessage = [\n\t\t\t\t\t`Failed to read OpenAPI specification from: ${this.options.input}`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t`Error: ${error.message}`,\n\t\t\t\t].join(\"\\n\");\n\t\t\t\tthrow new SpecValidationError(errorMessage, { filePath: this.options.input, originalError: error.message });\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\tthis.validateSpec();\n\n\t\t// Resolve options for request and response contexts\n\t\tthis.requestOptions = this.resolveOptionsForContext(\"request\");\n\t\tthis.responseOptions = this.resolveOptionsForContext(\"response\");\n\n\t\t// Analyze schema usage to determine context (request/response/both)\n\t\tthis.analyzeSchemaUsage();\n\n\t\t// Determine typeMode for each schema based on usage context\n\t\tthis.determineSchemaTypeModes();\n\n\t\t// Initialize property generator with context\n\t\t// We'll update this dynamically based on schema context during generation\n\t\tthis.propertyGenerator = new PropertyGenerator({\n\t\t\tspec: this.spec,\n\t\t\tschemaDependencies: this.schemaDependencies,\n\t\t\tschemaType: this.options.schemaType || \"all\",\n\t\t\tmode: this.requestOptions.mode,\n\t\t\tincludeDescriptions: this.requestOptions.includeDescriptions,\n\t\t\tuseDescribe: this.requestOptions.useDescribe,\n\t\t\ttypeMode: this.requestOptions.typeMode,\n\t\t\tnativeEnumType: this.requestOptions.nativeEnumType,\n\t\t\tnamingOptions: {\n\t\t\t\tprefix: this.options.prefix,\n\t\t\t\tsuffix: this.options.suffix,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Generate schemas as a string (without writing to file)\n\t * @returns The generated TypeScript code as a string\n\t */\n\tgenerateString(): string {\n\t\tif (!this.spec.components?.schemas) {\n\t\t\tthrow new SpecValidationError(\"No schemas found in OpenAPI spec\", { filePath: this.options.input });\n\t\t}\n\n\t\t// First pass: generate enums\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\tif (schema.enum) {\n\t\t\t\tconst context = this.schemaUsageMap.get(name);\n\t\t\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\n\t\t\t\t// For enums, use enumType option to determine generation strategy\n\t\t\t\tif (resolvedOptions.enumType === \"typescript\") {\n\t\t\t\t\t// Generate native TypeScript enum\n\t\t\t\t\tthis.generateNativeEnum(name, schema);\n\t\t\t\t} else {\n\t\t\t\t\t// Generate Zod enum - will create schema in second pass\n\t\t\t\t\tconst { enumCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\t\tenumType: \"zod\",\n\t\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t\t});\n\t\t\t\t\tif (enumCode) {\n\t\t\t\t\t\tthis.enums.set(name, enumCode);\n\t\t\t\t\t\t// Mark that we need Zod import for enum schemas\n\t\t\t\t\t\tthis.needsZodImport = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: generate schemas/types and track dependencies\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\tthis.generateComponentSchema(name, schema);\n\t\t}\n\n\t\t// Third pass: generate query parameter schemas from path operations\n\t\tthis.generateQueryParameterSchemas();\n\n\t\t// Fourth pass: generate header parameter schemas from path operations\n\t\tthis.generateHeaderParameterSchemas();\n\n\t\t// Validate filters and emit warnings if needed\n\t\tvalidateFilters(this.filterStats, this.options.operationFilters);\n\n\t\t// Sort schemas by dependencies\n\t\tconst orderedSchemaNames = this.topologicalSort();\n\n\t\t// Build output\n\t\tconst output: string[] = [\"// Auto-generated by @cerios/openapi-to-zod\", \"// Do not edit this file manually\", \"\"];\n\n\t\t// Add statistics if enabled (must be explicitly true)\n\t\tif (this.options.showStats === true) {\n\t\t\toutput.push(...this.generateStats());\n\t\t\toutput.push(\"\");\n\t\t}\n\n\t\t// Conditionally import Zod only if needed\n\t\tif (this.needsZodImport) {\n\t\t\toutput.push('import { z } from \"zod\";');\n\t\t\toutput.push(\"\");\n\t\t}\n\n\t\t// Add native enums first (they have no dependencies and are referenced by value)\n\t\tif (this.nativeEnums.size > 0) {\n\t\t\toutput.push(\"// Native Enums\");\n\t\t\tfor (const enumCode of this.nativeEnums.values()) {\n\t\t\t\toutput.push(enumCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\n\n\t\t// Add schemas, types, and zod enums in dependency order (grouped by schema)\n\t\toutput.push(\"// Schemas and Types\");\n\t\tfor (const name of orderedSchemaNames) {\n\t\t\tconst enumCode = this.enums.get(name);\n\t\t\tconst schemaCode = this.schemas.get(name);\n\t\t\tconst typeCode = this.types.get(name);\n\n\t\t\tif (enumCode) {\n\t\t\t\t// Zod enum schema\n\t\t\t\toutput.push(enumCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (schemaCode) {\n\t\t\t\t// Zod schema with inferred type\n\t\t\t\toutput.push(schemaCode);\n\n\t\t\t\t// Add type immediately after schema (if not already included)\n\t\t\t\tif (!schemaCode.includes(`export type ${name}`)) {\n\t\t\t\t\tconst schemaName = `${toCamelCase(name, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\t\t\toutput.push(`export type ${name} = z.infer<typeof ${schemaName}>;`);\n\t\t\t\t}\n\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (typeCode) {\n\t\t\t\t// Native TypeScript type\n\t\t\t\toutput.push(typeCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\n\n\t\treturn output.join(\"\\n\");\n\t}\n\n\t/**\n\t * Ensure directory exists for a file path\n\t */\n\tprivate ensureDirectoryExists(filePath: string): void {\n\t\tconst normalizedPath = normalize(filePath);\n\t\tconst dir = dirname(normalizedPath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\t}\n\n\t/**\n\t * Generate the complete output file\n\t */\n\tgenerate(): void {\n\t\tif (!this.options.output) {\n\t\t\tthrow new ConfigurationError(\n\t\t\t\t\"Output path is required when calling generate(). \" +\n\t\t\t\t\t\"Either provide an 'output' option or use generateString() to get the result as a string.\",\n\t\t\t\t{ hasOutput: false }\n\t\t\t);\n\t\t}\n\t\tconst output = this.generateString();\n\t\tconst normalizedOutput = normalize(this.options.output);\n\t\tthis.ensureDirectoryExists(normalizedOutput);\n\t\twriteFileSync(normalizedOutput, output);\n\t}\n\n\t/**\n\t * Resolve options for a specific context (request or response)\n\t * Nested options silently override root-level options\n\t * Response schemas always use 'inferred' mode (Zod schemas)\n\t */\n\tprivate resolveOptionsForContext(context: \"request\" | \"response\"): ResolvedOptions {\n\t\tconst contextOptions = context === \"request\" ? this.options.request : this.options.response;\n\n\t\t// For nativeEnumType, only access it from request options since ResponseOptions doesn't have it\n\t\tconst nativeEnumType =\n\t\t\tcontext === \"request\"\n\t\t\t\t? (this.options.request?.nativeEnumType ?? this.options.nativeEnumType ?? \"union\")\n\t\t\t\t: (this.options.nativeEnumType ?? \"union\");\n\n\t\treturn {\n\t\t\tmode: contextOptions?.mode ?? this.options.mode ?? \"normal\",\n\t\t\tenumType: contextOptions?.enumType ?? this.options.enumType ?? \"zod\",\n\t\t\tuseDescribe: contextOptions?.useDescribe ?? this.options.useDescribe ?? false,\n\t\t\tincludeDescriptions: contextOptions?.includeDescriptions ?? this.options.includeDescriptions ?? true,\n\t\t\t// Response schemas always use 'inferred' mode (Zod schemas are required)\n\t\t\t// Request schemas can optionally use 'native' mode\n\t\t\ttypeMode: context === \"response\" ? \"inferred\" : (this.options.request?.typeMode ?? \"inferred\"),\n\t\t\tnativeEnumType,\n\t\t};\n\t}\n\n\t/**\n\t * Analyze schema usage across the OpenAPI spec to determine if schemas\n\t * are used in request, response, or both contexts\n\t */\n\tprivate analyzeSchemaUsage(): void {\n\t\tconst requestSchemas = new Set<string>();\n\t\tconst responseSchemas = new Set<string>();\n\n\t\t// Analyze paths section if available\n\t\tif (this.spec.paths) {\n\t\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\t\t\t\tfor (const method of methods) {\n\t\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\t\tif (typeof operation !== \"object\" || !operation) continue;\n\n\t\t\t\t\t// Track total operations\n\t\t\t\t\tthis.filterStats.totalOperations++;\n\n\t\t\t\t\t// Apply operation filters\n\t\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters, this.filterStats)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Count included operation\n\t\t\t\t\tthis.filterStats.includedOperations++;\n\n\t\t\t\t\t// Check request bodies\n\t\t\t\t\tif (\n\t\t\t\t\t\t\"requestBody\" in operation &&\n\t\t\t\t\t\toperation.requestBody &&\n\t\t\t\t\t\ttypeof operation.requestBody === \"object\" &&\n\t\t\t\t\t\t\"content\" in operation.requestBody &&\n\t\t\t\t\t\toperation.requestBody.content\n\t\t\t\t\t) {\n\t\t\t\t\t\tfor (const mediaType of Object.values(operation.requestBody.content)) {\n\t\t\t\t\t\t\tif (mediaType && typeof mediaType === \"object\" && \"schema\" in mediaType && mediaType.schema) {\n\t\t\t\t\t\t\t\tthis.extractSchemaRefs(mediaType.schema, requestSchemas);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check responses\n\t\t\t\t\tif (\"responses\" in operation && operation.responses && typeof operation.responses === \"object\") {\n\t\t\t\t\t\tfor (const response of Object.values(operation.responses)) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tresponse &&\n\t\t\t\t\t\t\t\ttypeof response === \"object\" &&\n\t\t\t\t\t\t\t\t\"content\" in response &&\n\t\t\t\t\t\t\t\tresponse.content &&\n\t\t\t\t\t\t\t\ttypeof response.content === \"object\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tfor (const mediaType of Object.values(response.content)) {\n\t\t\t\t\t\t\t\t\tif (mediaType && typeof mediaType === \"object\" && \"schema\" in mediaType && mediaType.schema) {\n\t\t\t\t\t\t\t\t\t\tthis.extractSchemaRefs(mediaType.schema, responseSchemas);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check parameters\n\t\t\t\t\tif (\"parameters\" in operation && Array.isArray(operation.parameters)) {\n\t\t\t\t\t\tfor (const param of operation.parameters) {\n\t\t\t\t\t\t\tif (param && typeof param === \"object\" && \"schema\" in param && param.schema) {\n\t\t\t\t\t\t\t\tthis.extractSchemaRefs(param.schema, requestSchemas);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand to include all transitively referenced schemas\n\t\t\tthis.expandTransitiveReferences(requestSchemas);\n\t\t\tthis.expandTransitiveReferences(responseSchemas);\n\t\t}\n\n\t\t// Fallback: analyze readOnly/writeOnly properties if paths not available\n\t\tif (!this.spec.paths || (requestSchemas.size === 0 && responseSchemas.size === 0)) {\n\t\t\tfor (const [name, schema] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\t\tconst hasReadOnly = this.hasReadOnlyProperties(schema);\n\t\t\t\tconst hasWriteOnly = this.hasWriteOnlyProperties(schema);\n\n\t\t\t\tif (hasWriteOnly && !hasReadOnly) {\n\t\t\t\t\trequestSchemas.add(name);\n\t\t\t\t} else if (hasReadOnly && !hasWriteOnly) {\n\t\t\t\t\tresponseSchemas.add(name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build usage map with circular reference detection\n\t\tfor (const [name] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\tif (requestSchemas.has(name) && responseSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"both\");\n\t\t\t} else if (requestSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"request\");\n\t\t\t} else if (responseSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"response\");\n\t\t\t}\n\t\t\t// Unreferenced schemas are not added to map (will use root typeMode)\n\t\t}\n\n\t\t// Detect circular references and mark entire chain as \"both\"\n\t\tthis.detectCircularReferences();\n\t}\n\n\t/**\n\t * Expand a set of schemas to include all transitively referenced schemas\n\t */\n\tprivate expandTransitiveReferences(schemas: Set<string>): void {\n\t\tconst toProcess = Array.from(schemas);\n\t\tconst processed = new Set<string>();\n\n\t\twhile (toProcess.length > 0) {\n\t\t\tconst schemaName = toProcess.pop();\n\t\t\tif (!schemaName || processed.has(schemaName)) continue;\n\n\t\t\tprocessed.add(schemaName);\n\n\t\t\tconst schema = this.spec.components?.schemas?.[schemaName];\n\t\t\tif (schema) {\n\t\t\t\tconst refs = new Set<string>();\n\t\t\t\tthis.extractSchemaRefs(schema, refs);\n\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\tif (!schemas.has(ref)) {\n\t\t\t\t\t\tschemas.add(ref);\n\t\t\t\t\t\ttoProcess.push(ref);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract schema names from $ref and nested structures\n\t */\n\tprivate extractSchemaRefs(schema: any, refs: Set<string>): void {\n\t\tif (!schema) return;\n\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\trefs.add(refName);\n\t\t}\n\n\t\tif (schema.allOf) {\n\t\t\tfor (const subSchema of schema.allOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.oneOf) {\n\t\t\tfor (const subSchema of schema.oneOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.anyOf) {\n\t\t\tfor (const subSchema of schema.anyOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.items) {\n\t\t\tthis.extractSchemaRefs(schema.items, refs);\n\t\t}\n\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tthis.extractSchemaRefs(prop, refs);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if schema has readOnly properties\n\t */\n\tprivate hasReadOnlyProperties(schema: OpenAPISchema): boolean {\n\t\tif (schema.readOnly) return true;\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tif (this.hasReadOnlyProperties(prop)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if schema has writeOnly properties\n\t */\n\tprivate hasWriteOnlyProperties(schema: OpenAPISchema): boolean {\n\t\tif (schema.writeOnly) return true;\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tif (this.hasWriteOnlyProperties(prop)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Detect circular references and mark them as \"both\" context for safety\n\t */\n\tprivate detectCircularReferences(): void {\n\t\tconst visited = new Set<string>();\n\t\tconst recursionStack = new Set<string>();\n\n\t\tconst detectCycle = (name: string): boolean => {\n\t\t\tif (recursionStack.has(name)) {\n\t\t\t\t// Found a cycle - mark all schemas in the cycle as \"both\"\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (visited.has(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvisited.add(name);\n\t\t\trecursionStack.add(name);\n\n\t\t\tconst schema = this.spec.components?.schemas?.[name];\n\t\t\tif (schema) {\n\t\t\t\tconst refs = new Set<string>();\n\t\t\t\tthis.extractSchemaRefs(schema, refs);\n\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\tif (detectCycle(ref)) {\n\t\t\t\t\t\t// Mark this schema as \"both\" since it's part of a circular chain\n\t\t\t\t\t\tthis.schemaUsageMap.set(name, \"both\");\n\t\t\t\t\t\trecursionStack.delete(name);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecursionStack.delete(name);\n\t\t\treturn false;\n\t\t};\n\n\t\tfor (const name of Object.keys(this.spec.components?.schemas || {})) {\n\t\t\tdetectCycle(name);\n\t\t}\n\t}\n\n\t/**\n\t * Determine the typeMode for each schema based on its usage context\n\t * Response schemas always use 'inferred' mode\n\t */\n\tprivate determineSchemaTypeModes(): void {\n\t\tfor (const [name] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\tconst context = this.schemaUsageMap.get(name);\n\n\t\t\tif (context === \"request\") {\n\t\t\t\tthis.schemaTypeModeMap.set(name, this.requestOptions.typeMode);\n\t\t\t} else if (context === \"response\") {\n\t\t\t\t// Response schemas always use 'inferred' mode (Zod schemas are required)\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t} else if (context === \"both\") {\n\t\t\t\t// Safety: always use inferred for schemas used in both contexts\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t} else {\n\t\t\t\t// Unreferenced schemas default to inferred\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t}\n\n\t\t\t// Track if we need Zod import\n\t\t\tif (this.schemaTypeModeMap.get(name) === \"inferred\") {\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate the OpenAPI specification\n\t */\n\tprivate validateSpec(): void {\n\t\tif (!this.spec.components?.schemas) {\n\t\t\tthrow new SpecValidationError(\n\t\t\t\t`No schemas found in OpenAPI spec at ${this.options.input}. Expected to find schemas at components.schemas`,\n\t\t\t\t{ filePath: this.options.input }\n\t\t\t);\n\t\t}\n\n\t\t// Validate all $refs can be resolved\n\t\tconst allSchemas = Object.keys(this.spec.components.schemas);\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\ttry {\n\t\t\t\tthis.validateSchemaRefs(name, schema, allSchemas);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tthrow new SchemaGenerationError(`Invalid schema '${name}': ${error.message}`, name, {\n\t\t\t\t\t\toriginalError: error.message,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate all $ref references in a schema\n\t */\n\tprivate validateSchemaRefs(schemaName: string, schema: OpenAPISchema, allSchemas: string[], path = \"\"): void {\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\tif (!allSchemas.includes(refName)) {\n\t\t\t\tthrow new SpecValidationError(\n\t\t\t\t\t`Invalid reference${path ? ` at '${path}'` : \"\"}: ` +\n\t\t\t\t\t\t`'${schema.$ref}' points to non-existent schema '${refName}'`,\n\t\t\t\t\t{ schemaName, path, ref: schema.$ref, refName }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Recursively validate nested schemas\n\t\tif (schema.properties) {\n\t\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\t\tthis.validateSchemaRefs(schemaName, propSchema, allSchemas, path ? `${path}.${propName}` : propName);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.items) {\n\t\t\tthis.validateSchemaRefs(schemaName, schema.items, allSchemas, `${path}[]`);\n\t\t}\n\n\t\tif (schema.prefixItems) {\n\t\t\tschema.prefixItems.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.prefixItems[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.allOf) {\n\t\t\tschema.allOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.allOf[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.oneOf) {\n\t\t\tschema.oneOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.oneOf[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.anyOf) {\n\t\t\tschema.anyOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.anyOf[${i}]`);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Generate schema for a component\n\t */\n\tprivate generateComponentSchema(name: string, schema: OpenAPISchema): void {\n\t\t// Initialize dependencies for this schema\n\t\tif (!this.schemaDependencies.has(name)) {\n\t\t\tthis.schemaDependencies.set(name, new Set());\n\t\t}\n\n\t\t// Get the typeMode for this schema\n\t\tconst typeMode = this.schemaTypeModeMap.get(name) || \"inferred\";\n\t\tconst context = this.schemaUsageMap.get(name);\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\n\t\t// Handle enums at the top level\n\t\tif (schema.enum) {\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t\t// Use enumType to determine generation strategy\n\t\t\tif (resolvedOptions.enumType === \"typescript\") {\n\t\t\t\t// TypeScript enum - native enum was generated in first pass, now generate schema\n\t\t\t\tconst { schemaCode, typeCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\tenumType: \"typescript\",\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t});\n\n\t\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\t} else {\n\t\t\t\t// Zod enum\n\t\t\t\tconst { enumCode, schemaCode, typeCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\tenumType: \"zod\",\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t});\n\n\t\t\t\tif (enumCode) {\n\t\t\t\t\tthis.enums.set(name, enumCode);\n\t\t\t\t}\n\n\t\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeMode === \"native\") {\n\t\t\t// Generate native TypeScript type\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\t\t\tconst jsdocWithConstraints = this.addConstraintsToJSDoc(jsdoc, schema, resolvedOptions.includeDescriptions);\n\t\t\tconst typeDefinition = this.generateNativeTypeDefinition(schema, name);\n\t\t\tconst typeCode = `${jsdocWithConstraints}export type ${name} = ${typeDefinition};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t} else {\n\t\t\t// Generate Zod schema\n\t\t\tconst schemaName = `${toCamelCase(name, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t\t// For allOf with single $ref, track dependency manually since we simplify it\n\t\t\tif (schema.allOf && schema.allOf.length === 1 && schema.allOf[0].$ref) {\n\t\t\t\tconst refName = resolveRef(schema.allOf[0].$ref);\n\t\t\t\tthis.schemaDependencies.get(name)?.add(refName);\n\t\t\t}\n\n\t\t\t// Update property generator context for this schema\n\t\t\tthis.propertyGenerator = new PropertyGenerator({\n\t\t\t\tspec: this.spec,\n\t\t\t\tschemaDependencies: this.schemaDependencies,\n\t\t\t\tschemaType: this.options.schemaType || \"all\",\n\t\t\t\tmode: resolvedOptions.mode,\n\t\t\t\tincludeDescriptions: resolvedOptions.includeDescriptions,\n\t\t\t\tuseDescribe: resolvedOptions.useDescribe,\n\t\t\t\ttypeMode: resolvedOptions.typeMode,\n\t\t\t\tnativeEnumType: resolvedOptions.nativeEnumType,\n\t\t\t\tnamingOptions: {\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Check if this is just a simple $ref (alias)\n\t\t\tconst isAlias = !!(schema.$ref && !schema.properties && !schema.allOf && !schema.oneOf && !schema.anyOf);\n\t\t\tconst zodSchema = this.propertyGenerator.generatePropertySchema(schema, name, isAlias);\n\t\t\tconst zodSchemaCode = `${jsdoc}export const ${schemaName} = ${zodSchema};`;\n\n\t\t\t// Track dependencies from discriminated unions\n\t\t\t// Extract schema references like \"carSchema, truckSchema\" from discriminatedUnion calls\n\t\t\tif (zodSchema.includes(\"z.discriminatedUnion(\")) {\n\t\t\t\tconst match = zodSchema.match(/z\\.discriminatedUnion\\([^,]+,\\s*\\[([^\\]]+)\\]/);\n\t\t\t\tif (match) {\n\t\t\t\t\tconst refs = match[1].split(\",\").map(ref => ref.trim());\n\t\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\t\t// Extract schema name from camelCase reference (e.g., \"carSchema\" -> \"Car\")\n\t\t\t\t\t\tconst depMatch = ref.match(/^([a-z][a-zA-Z0-9]*?)Schema$/);\n\t\t\t\t\t\tif (depMatch) {\n\t\t\t\t\t\t\t// Convert camelCase to PascalCase (carSchema -> Car)\n\t\t\t\t\t\t\tconst depName = depMatch[1].charAt(0).toUpperCase() + depMatch[1].slice(1);\n\t\t\t\t\t\t\tthis.schemaDependencies.get(name)?.add(depName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.schemas.set(name, zodSchemaCode);\n\t\t}\n\t}\n\n\t/**\n\t * Generate query parameter schemas for each operation\n\t */\n\tprivate generateQueryParameterSchemas(): void {\n\t\tif (!this.spec.paths) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\tif (!pathItem || typeof pathItem !== \"object\") continue;\n\n\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\tif (!operation) continue;\n\n\t\t\t\t// Apply operation filters (stats already tracked in analyzeSchemaUsage)\n\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip operations without operationId or parameters\n\t\t\t\tif (!operation.operationId || !operation.parameters || !Array.isArray(operation.parameters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter for query parameters only\n\t\t\t\tconst queryParams = operation.parameters.filter(\n\t\t\t\t\t(param: any) => param && typeof param === \"object\" && param.in === \"query\"\n\t\t\t\t);\n\n\t\t\t\tif (queryParams.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Generate schema name from operationId\n\t\t\t\t// Use toPascalCase only for kebab-case IDs, simple capitalization for camelCase\n\t\t\t\tconst pascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\tconst schemaName = `${pascalOperationId}QueryParams`; // Initialize dependencies for this schema\n\t\t\t\tif (!this.schemaDependencies.has(schemaName)) {\n\t\t\t\t\tthis.schemaDependencies.set(schemaName, new Set());\n\t\t\t\t}\n\n\t\t\t\t// Build object schema properties\n\t\t\t\tconst properties: Record<string, string> = {};\n\t\t\t\tconst required: string[] = [];\n\n\t\t\t\tfor (const param of queryParams) {\n\t\t\t\t\tconst paramName = param.name;\n\t\t\t\t\tconst isRequired = param.required === true;\n\t\t\t\t\tconst paramSchema = param.schema;\n\n\t\t\t\t\tif (!paramSchema) continue;\n\n\t\t\t\t\t// Generate Zod schema for this parameter\n\t\t\t\t\tlet zodType = this.generateQueryParamType(paramSchema, param);\n\n\t\t\t\t\t// Handle arrays with serialization styles\n\t\t\t\t\tif (paramSchema.type === \"array\" && paramSchema.items) {\n\t\t\t\t\t\tconst itemType = this.generateQueryParamType(paramSchema.items, param);\n\n\t\t\t\t\t\t// Note: Query param arrays are sent as strings and need to be split on the client side\n\t\t\t\t\t\t// The style is documented but validation is for the array type\n\t\t\t\t\t\tzodType = `z.array(${itemType})`;\n\n\t\t\t\t\t\t// Description is handled by addDescription below\n\t\t\t\t\t} // Add description if available (before .optional())\n\t\t\t\t\tif (param.description && this.requestOptions.includeDescriptions) {\n\t\t\t\t\t\tif (this.requestOptions.useDescribe) {\n\t\t\t\t\t\t\tzodType = `${zodType}.describe(${JSON.stringify(param.description)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Make optional if not required (don't add defaults)\n\t\t\t\t\tif (!isRequired) {\n\t\t\t\t\t\tzodType = `${zodType}.optional()`;\n\t\t\t\t\t}\n\n\t\t\t\t\tproperties[paramName] = zodType;\n\t\t\t\t\tif (isRequired) {\n\t\t\t\t\t\trequired.push(paramName);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Track dependencies from schema references\n\t\t\t\t\tif (paramSchema.$ref) {\n\t\t\t\t\t\tconst refName = resolveRef(paramSchema.$ref);\n\t\t\t\t\t\tthis.schemaDependencies.get(schemaName)?.add(refName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Generate the object schema code\n\t\t\t\tconst objectMode = this.requestOptions.mode;\n\t\t\t\tconst zodMethod = objectMode === \"strict\" ? \"strictObject\" : objectMode === \"loose\" ? \"looseObject\" : \"object\";\n\n\t\t\t\tconst propsCode = Object.entries(properties)\n\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t// Quote property names that contain special characters or are not valid identifiers\n\t\t\t\t\t\tconst needsQuotes = !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key);\n\t\t\t\t\t\tconst quotedKey = needsQuotes ? `\"${key}\"` : key;\n\t\t\t\t\t\treturn ` ${quotedKey}: ${value}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\",\\n\");\n\n\t\t\t\tconst schemaCode = `z.${zodMethod}({\\n${propsCode}\\n})`; // Apply prefix/suffix to the operation name only, then add QueryParams and Schema\n\t\t\t\tconst operationName = pascalOperationId; // Already PascalCase\n\t\t\t\tconst prefixedName = this.options.prefix\n\t\t\t\t\t? `${toPascalCase(this.options.prefix)}${operationName}`\n\t\t\t\t\t: operationName;\n\t\t\t\tconst suffixedName = this.options.suffix ? `${prefixedName}${toPascalCase(this.options.suffix)}` : prefixedName;\n\t\t\t\tconst camelCaseSchemaName = `${suffixedName.charAt(0).toLowerCase() + suffixedName.slice(1)}QueryParamsSchema`;\n\n\t\t\t\t// Generate JSDoc\n\t\t\t\tconst jsdoc = `/**\\n * Query parameters for ${operation.operationId}\\n */\\n`;\n\t\t\t\tconst fullSchemaCode = `${jsdoc}export const ${camelCaseSchemaName} = ${schemaCode};`;\n\n\t\t\t\tthis.schemas.set(schemaName, fullSchemaCode);\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate header parameter schemas for each operation\n\t * Header parameters are always string type (HTTP header semantics)\n\t */\n\tprivate generateHeaderParameterSchemas(): void {\n\t\tif (!this.spec.paths) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\tif (!pathItem || typeof pathItem !== \"object\") continue;\n\n\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\tif (!operation) continue;\n\n\t\t\t\t// Apply operation filters\n\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip operations without operationId or parameters\n\t\t\t\tif (!operation.operationId || !operation.parameters || !Array.isArray(operation.parameters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter for header parameters only\n\t\t\t\tconst headerParams = operation.parameters.filter(\n\t\t\t\t\t(param: any) => param && typeof param === \"object\" && param.in === \"header\"\n\t\t\t\t);\n\n\t\t\t\tif (headerParams.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Generate schema name from operationId\n\t\t\t\tconst pascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\tconst schemaName = `${pascalOperationId}HeaderParams`;\n\n\t\t\t\t// Initialize dependencies for this schema\n\t\t\t\tif (!this.schemaDependencies.has(schemaName)) {\n\t\t\t\t\tthis.schemaDependencies.set(schemaName, new Set());\n\t\t\t\t}\n\n\t\t\t\t// Build object schema properties (headers are always strings)\n\t\t\t\tconst properties: Record<string, string> = {};\n\n\t\t\t\tfor (const param of headerParams) {\n\t\t\t\t\tconst paramName = param.name;\n\t\t\t\t\tconst paramSchema = param.schema;\n\n\t\t\t\t\tif (!paramSchema) continue;\n\n\t\t\t\t\t// Headers are always strings in HTTP, regardless of schema type\n\t\t\t\t\tlet zodType = \"z.string()\";\n\n\t\t\t\t\t// Add description if available\n\t\t\t\t\tif (param.description && this.requestOptions.includeDescriptions) {\n\t\t\t\t\t\tif (this.requestOptions.useDescribe) {\n\t\t\t\t\t\t\tzodType = `${zodType}.describe(${JSON.stringify(param.description)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Headers are always optional in service layer (as per requirements)\n\t\t\t\t\tzodType = `${zodType}.optional()`;\n\n\t\t\t\t\tproperties[paramName] = zodType;\n\n\t\t\t\t\t// Track dependencies from schema references (if any)\n\t\t\t\t\tif (paramSchema.$ref) {\n\t\t\t\t\t\tconst refName = resolveRef(paramSchema.$ref);\n\t\t\t\t\t\tthis.schemaDependencies.get(schemaName)?.add(refName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Generate the object schema code\n\t\t\t\tconst objectMode = this.requestOptions.mode;\n\t\t\t\tconst zodMethod = objectMode === \"strict\" ? \"strictObject\" : objectMode === \"loose\" ? \"looseObject\" : \"object\";\n\n\t\t\t\tconst propsCode = Object.entries(properties)\n\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t// Quote property names that contain special characters or are not valid identifiers\n\t\t\t\t\t\tconst needsQuotes = !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key);\n\t\t\t\t\t\tconst quotedKey = needsQuotes ? `\"${key}\"` : key;\n\t\t\t\t\t\treturn ` ${quotedKey}: ${value}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\",\\n\");\n\n\t\t\t\tconst schemaCode = `z.${zodMethod}({\\n${propsCode}\\n})`;\n\n\t\t\t\t// Apply prefix/suffix to the operation name only, then add HeaderParams and Schema\n\t\t\t\tconst operationName = pascalOperationId;\n\t\t\t\tconst prefixedName = this.options.prefix\n\t\t\t\t\t? `${toPascalCase(this.options.prefix)}${operationName}`\n\t\t\t\t\t: operationName;\n\t\t\t\tconst suffixedName = this.options.suffix ? `${prefixedName}${toPascalCase(this.options.suffix)}` : prefixedName;\n\t\t\t\tconst camelCaseSchemaName = `${suffixedName.charAt(0).toLowerCase() + suffixedName.slice(1)}HeaderParamsSchema`;\n\n\t\t\t\t// Generate JSDoc\n\t\t\t\tconst jsdoc = `/**\\n * Header parameters for ${operation.operationId}\\n */\\n`;\n\t\t\t\tconst fullSchemaCode = `${jsdoc}export const ${camelCaseSchemaName} = ${schemaCode};`;\n\n\t\t\t\tthis.schemas.set(schemaName, fullSchemaCode);\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate Zod type for a query parameter schema\n\t */\n\tprivate generateQueryParamType(schema: OpenAPISchema, param: any): string {\n\t\t// Handle references\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\tconst schemaName = toCamelCase(refName, { prefix: this.options.prefix, suffix: this.options.suffix });\n\t\t\treturn `${schemaName}Schema`;\n\t\t}\n\n\t\t// Handle enums\n\t\tif (schema.enum) {\n\t\t\tconst enumValues = schema.enum.map(v => (typeof v === \"string\" ? `\"${v}\"` : v)).join(\", \");\n\t\t\treturn `z.enum([${enumValues}])`;\n\t\t}\n\n\t\t// Handle primitive types\n\t\tconst type = schema.type;\n\n\t\tif (type === \"string\") {\n\t\t\tlet zodType = \"z.string()\";\n\t\t\t// Add string validations\n\t\t\tif (schema.minLength !== undefined) zodType = `${zodType}.min(${schema.minLength})`;\n\t\t\tif (schema.maxLength !== undefined) zodType = `${zodType}.max(${schema.maxLength})`;\n\t\t\tif (schema.pattern) zodType = `${zodType}.regex(/${schema.pattern}/)`;\n\t\t\tif (schema.format === \"email\") zodType = `${zodType}.email()`;\n\t\t\tif (schema.format === \"uri\" || schema.format === \"url\") zodType = `${zodType}.url()`;\n\t\t\tif (schema.format === \"uuid\") zodType = `${zodType}.uuid()`;\n\t\t\treturn zodType;\n\t\t}\n\n\t\tif (type === \"number\" || type === \"integer\") {\n\t\t\tlet zodType = type === \"integer\" ? \"z.number().int()\" : \"z.number()\";\n\t\t\t// Add number validations\n\t\t\tif (schema.minimum !== undefined) {\n\t\t\t\tzodType = schema.exclusiveMinimum ? `${zodType}.gt(${schema.minimum})` : `${zodType}.gte(${schema.minimum})`;\n\t\t\t}\n\t\t\tif (schema.maximum !== undefined) {\n\t\t\t\tzodType = schema.exclusiveMaximum ? `${zodType}.lt(${schema.maximum})` : `${zodType}.lte(${schema.maximum})`;\n\t\t\t}\n\t\t\treturn zodType;\n\t\t}\n\n\t\tif (type === \"boolean\") {\n\t\t\treturn \"z.boolean()\";\n\t\t}\n\n\t\tif (type === \"array\" && schema.items) {\n\t\t\tconst itemType = this.generateQueryParamType(schema.items, param);\n\t\t\tlet arrayType = `z.array(${itemType})`;\n\t\t\t// Add array validations\n\t\t\tif (schema.minItems !== undefined) arrayType = `${arrayType}.min(${schema.minItems})`;\n\t\t\tif (schema.maxItems !== undefined) arrayType = `${arrayType}.max(${schema.maxItems})`;\n\t\t\treturn arrayType;\n\t\t}\n\n\t\t// Fallback to z.unknown() for unhandled types\n\t\treturn \"z.unknown()\";\n\t}\n\n\t/**\n\t * Generate native TypeScript enum\n\t */\n\tprivate generateNativeEnum(name: string, schema: OpenAPISchema): void {\n\t\tif (!schema.enum) return;\n\n\t\tconst context = this.schemaUsageMap.get(name);\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\tif (resolvedOptions.nativeEnumType === \"enum\") {\n\t\t\t// Generate TypeScript enum with Enum suffix (no prefix/suffix)\n\t\t\tconst enumName = `${name}Enum`;\n\t\t\tconst members = schema.enum\n\t\t\t\t.map(value => {\n\t\t\t\t\tconst key = typeof value === \"string\" ? this.toEnumKey(value) : `N${value}`;\n\t\t\t\t\tconst val = typeof value === \"string\" ? `\"${value}\"` : value;\n\t\t\t\t\treturn ` ${key} = ${val}`;\n\t\t\t\t})\n\t\t\t\t.join(\",\\n\");\n\n\t\t\tconst enumCode = `${jsdoc}export enum ${enumName} {\\n${members}\\n}`;\n\t\t\tthis.nativeEnums.set(name, enumCode);\n\n\t\t\t// Also create a type alias for convenience\n\t\t\tconst typeCode = `export type ${name} = ${enumName};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t} else {\n\t\t\t// Generate union type\n\t\t\tconst unionType = schema.enum.map(v => (typeof v === \"string\" ? `\"${v}\"` : v)).join(\" | \");\n\t\t\tconst typeCode = `${jsdoc}export type ${name} = ${unionType};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t}\n\t}\n\n\t/**\n\t * Convert string to valid enum key\n\t */\n\tprivate toEnumKey(value: string): string {\n\t\t// Convert to PascalCase and ensure it starts with a letter\n\t\tconst cleaned = value.replace(/[^a-zA-Z0-9]/g, \"_\");\n\t\tconst pascalCase = cleaned\n\t\t\t.split(\"_\")\n\t\t\t.map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n\t\t\t.join(\"\");\n\t\treturn pascalCase || \"Value\";\n\t}\n\n\t/**\n\t * Add constraint annotations to JSDoc for native types\n\t */\n\tprivate addConstraintsToJSDoc(jsdoc: string, schema: OpenAPISchema, includeDescriptions: boolean): string {\n\t\tif (!includeDescriptions) return jsdoc;\n\n\t\tconst constraints: string[] = [];\n\n\t\tif (schema.minLength !== undefined) constraints.push(`@minLength ${schema.minLength}`);\n\t\tif (schema.maxLength !== undefined) constraints.push(`@maxLength ${schema.maxLength}`);\n\t\tif (schema.pattern) constraints.push(`@pattern ${schema.pattern}`);\n\t\tif (schema.minimum !== undefined) constraints.push(`@minimum ${schema.minimum}`);\n\t\tif (schema.maximum !== undefined) constraints.push(`@maximum ${schema.maximum}`);\n\t\tif (schema.minItems !== undefined) constraints.push(`@minItems ${schema.minItems}`);\n\t\tif (schema.maxItems !== undefined) constraints.push(`@maxItems ${schema.maxItems}`);\n\t\tif (schema.minProperties !== undefined) constraints.push(`@minProperties ${schema.minProperties}`);\n\t\tif (schema.maxProperties !== undefined) constraints.push(`@maxProperties ${schema.maxProperties}`);\n\t\tif (schema.multipleOf !== undefined) constraints.push(`@multipleOf ${schema.multipleOf}`);\n\t\tif (schema.format) constraints.push(`@format ${schema.format}`);\n\n\t\tif (constraints.length === 0) return jsdoc;\n\n\t\t// If there's already a JSDoc, add constraints to it\n\t\tif (jsdoc) {\n\t\t\tconst lines = jsdoc.trim().split(\"\\n\");\n\t\t\tif (lines[0] === \"/**\" && lines[lines.length - 1] === \" */\") {\n\t\t\t\t// Multi-line JSDoc\n\t\t\t\tconst newLines = [...lines.slice(0, -1), ...constraints.map(c => ` * ${c}`), \" */\\n\"];\n\t\t\t\treturn newLines.join(\"\\n\");\n\t\t\t}\n\t\t\t// Single-line JSDoc\n\t\t\tconst content = jsdoc.replace(\"/** \", \"\").replace(\" */\\n\", \"\");\n\t\t\treturn `/**\\n * ${content}\\n${constraints.map(c => ` * ${c}`).join(\"\\n\")}\\n */\\n`;\n\t\t}\n\n\t\t// No existing JSDoc, create new one with just constraints\n\t\treturn `/**\\n${constraints.map(c => ` * ${c}`).join(\"\\n\")}\\n */\\n`;\n\t}\n\n\t/**\n\t * Generate native TypeScript type definition from OpenAPI schema\n\t */\n\tprivate generateNativeTypeDefinition(schema: OpenAPISchema, _schemaName?: string): string {\n\t\t// Handle $ref\n\t\tif (schema.$ref) {\n\t\t\treturn resolveRef(schema.$ref);\n\t\t}\n\n\t\t// Handle const\n\t\tif (schema.const !== undefined) {\n\t\t\treturn typeof schema.const === \"string\" ? `\"${schema.const}\"` : String(schema.const);\n\t\t}\n\n\t\t// Handle nullable\n\t\tconst isNullable = schema.nullable || (Array.isArray(schema.type) && schema.type.includes(\"null\"));\n\t\tconst wrapNullable = (type: string) => (isNullable ? `(${type}) | null` : type);\n\n\t\t// Get primary type\n\t\tconst primaryType = Array.isArray(schema.type) ? schema.type.find(t => t !== \"null\") : schema.type;\n\n\t\t// Handle different types\n\t\tswitch (primaryType) {\n\t\t\tcase \"string\":\n\t\t\t\treturn wrapNullable(\"string\");\n\t\t\tcase \"number\":\n\t\t\tcase \"integer\":\n\t\t\t\treturn wrapNullable(\"number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn wrapNullable(\"boolean\");\n\t\t\tcase \"array\":\n\t\t\t\tif (schema.items) {\n\t\t\t\t\tconst itemType = this.generateNativeTypeDefinition(schema.items);\n\t\t\t\t\treturn wrapNullable(`${itemType}[]`);\n\t\t\t\t}\n\t\t\t\treturn wrapNullable(\"unknown[]\");\n\t\t\tcase \"object\":\n\t\t\t\treturn wrapNullable(this.generateObjectType(schema));\n\t\t\tdefault:\n\t\t\t\t// Handle composition schemas\n\t\t\t\tif (schema.allOf) {\n\t\t\t\t\tconst types = schema.allOf.map(s => this.generateNativeTypeDefinition(s));\n\t\t\t\t\treturn wrapNullable(types.join(\" & \"));\n\t\t\t\t}\n\t\t\t\tif (schema.oneOf || schema.anyOf) {\n\t\t\t\t\tconst schemas = schema.oneOf || schema.anyOf || [];\n\t\t\t\t\tconst types = schemas.map(s => this.generateNativeTypeDefinition(s));\n\t\t\t\t\treturn wrapNullable(types.join(\" | \"));\n\t\t\t\t}\n\t\t\t\treturn wrapNullable(\"unknown\");\n\t\t}\n\t}\n\n\t/**\n\t * Generate TypeScript object type definition\n\t */\n\tprivate generateObjectType(schema: OpenAPISchema): string {\n\t\tif (!schema.properties || Object.keys(schema.properties).length === 0) {\n\t\t\treturn \"Record<string, unknown>\";\n\t\t}\n\n\t\tconst context = this.schemaUsageMap.get(schema.$ref ? resolveRef(schema.$ref) : \"\");\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\t\tconst required = new Set(schema.required || []);\n\t\tconst props: string[] = [];\n\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propType = this.generateNativeTypeDefinition(propSchema);\n\t\t\tconst optional = !required.has(propName) ? \"?\" : \"\";\n\n\t\t\t// Generate JSDoc with constraints\n\t\t\tlet propJsdoc = generateJSDoc(propSchema, propName, { includeDescriptions: resolvedOptions.includeDescriptions });\n\t\t\tif (resolvedOptions.includeDescriptions && !propJsdoc) {\n\t\t\t\t// Add constraint-only JSDoc if no description exists\n\t\t\t\tpropJsdoc = this.addConstraintsToJSDoc(\"\", propSchema, resolvedOptions.includeDescriptions);\n\t\t\t} else if (propJsdoc && resolvedOptions.includeDescriptions) {\n\t\t\t\t// Add constraints to existing JSDoc\n\t\t\t\tpropJsdoc = this.addConstraintsToJSDoc(propJsdoc, propSchema, resolvedOptions.includeDescriptions);\n\t\t\t}\n\n\t\t\tif (propJsdoc) {\n\t\t\t\t// Remove trailing newline for inline property JSDoc\n\t\t\t\tconst cleanJsdoc = propJsdoc.trimEnd();\n\t\t\t\tprops.push(` ${cleanJsdoc}\\n ${propName}${optional}: ${propType};`);\n\t\t\t} else {\n\t\t\t\tprops.push(` ${propName}${optional}: ${propType};`);\n\t\t\t}\n\t\t}\n\n\t\treturn `{\\n${props.join(\"\\n\")}\\n}`;\n\t}\n\n\t/**\n\t * Topological sort for schema dependencies\n\t * Returns schemas in the order they should be declared\n\t */\n\tprivate topologicalSort(): string[] {\n\t\tconst sorted: string[] = [];\n\t\tconst visited = new Set<string>();\n\t\tconst visiting = new Set<string>();\n\t\tconst aliases: string[] = [];\n\t\tconst circularDeps = new Set<string>(); // Track schemas involved in circular dependencies\n\n\t\t// Performance optimization: Cache schema and type code lookups\n\t\tconst codeCache = new Map<string, string>();\n\t\tfor (const [name, code] of this.enums) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\t\tfor (const [name, code] of this.schemas) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\t\tfor (const [name, code] of this.types) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\n\t\tconst visit = (name: string): void => {\n\t\t\tif (visited.has(name)) return;\n\n\t\t\t// Detect circular dependencies\n\t\t\tif (visiting.has(name)) {\n\t\t\t\t// Mark this as a circular dependency but don't add it yet\n\t\t\t\tcircularDeps.add(name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisiting.add(name);\n\n\t\t\t// Check if this is a simple alias (just assigns another schema directly)\n\t\t\tconst code = codeCache.get(name) || \"\";\n\t\t\tconst isSimpleAlias =\n\t\t\t\tcode.match(/= (\\w+Schema);$/) !== null &&\n\t\t\t\t!code.includes(\"z.object\") &&\n\t\t\t\t!code.includes(\"z.enum\") &&\n\t\t\t\t!code.includes(\"z.union\") &&\n\t\t\t\t!code.includes(\"z.array\") &&\n\t\t\t\t!code.includes(\".and(\");\n\n\t\t\tif (isSimpleAlias) {\n\t\t\t\t// For simple aliases, just mark as visited and add to aliases list\n\t\t\t\tvisiting.delete(name);\n\t\t\t\tvisited.add(name);\n\t\t\t\taliases.push(name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Visit dependencies first for non-alias schemas\n\t\t\tconst deps = this.schemaDependencies.get(name);\n\t\t\tif (deps && deps.size > 0) {\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tif (this.enums.has(dep) || this.schemas.has(dep) || this.types.has(dep)) {\n\t\t\t\t\t\tvisit(dep);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvisiting.delete(name);\n\t\t\tvisited.add(name);\n\n\t\t\t// Don't add circular dependencies yet - they need special handling\n\t\t\tif (!circularDeps.has(name)) {\n\t\t\t\tsorted.push(name);\n\t\t\t}\n\t\t};\n\n\t\t// Visit all enums, schemas and types\n\t\tconst allNames = new Set([...this.enums.keys(), ...this.schemas.keys(), ...this.types.keys()]);\n\t\tfor (const name of allNames) {\n\t\t\tvisit(name);\n\t\t}\n\n\t\t// Add circular dependencies at the end (before aliases)\n\t\t// This ensures they come after their non-circular dependencies\n\t\tfor (const name of circularDeps) {\n\t\t\tif (!visited.has(name)) {\n\t\t\t\tsorted.push(name);\n\t\t\t\tvisited.add(name);\n\t\t\t}\n\t\t}\n\n\t\t// Add aliases at the end\n\t\treturn [...sorted, ...aliases];\n\t}\n\n\t/**\n\t * Generate statistics about the generated schemas\n\t */\n\tprivate generateStats(): string[] {\n\t\tconst stats = {\n\t\t\ttotalSchemas: this.schemas.size,\n\t\t\tenums: this.enums.size,\n\t\t\twithCircularRefs: 0,\n\t\t\twithDiscriminators: 0,\n\t\t\twithConstraints: 0,\n\t\t};\n\n\t\t// Count schemas with special features\n\t\tfor (const code of this.schemas.values()) {\n\t\t\tif (code.includes(\"z.lazy(\")) stats.withCircularRefs++;\n\t\t\tif (code.includes(\"z.discriminatedUnion\")) stats.withDiscriminators++;\n\t\t\tif (code.includes(\".min(\") || code.includes(\".max(\") || code.includes(\".gte(\")) {\n\t\t\t\tstats.withConstraints++;\n\t\t\t}\n\t\t}\n\n\t\tconst output = [\n\t\t\t\"// Generation Statistics:\",\n\t\t\t`// Total schemas: ${stats.totalSchemas}`,\n\t\t\t`// Enums: ${stats.enums}`,\n\t\t\t`// Circular references: ${stats.withCircularRefs}`,\n\t\t\t`// Discriminated unions: ${stats.withDiscriminators}`,\n\t\t\t`// With constraints: ${stats.withConstraints}`,\n\t\t];\n\n\t\t// Add filter statistics if filtering was used\n\t\tif (this.options.operationFilters && this.filterStats.totalOperations > 0) {\n\t\t\toutput.push(\"//\");\n\t\t\tconst filterStatsStr = formatFilterStatistics(this.filterStats);\n\t\t\tfor (const line of filterStatsStr.split(\"\\n\")) {\n\t\t\t\toutput.push(`// ${line}`);\n\t\t\t}\n\t\t}\n\n\t\toutput.push(`// Generated at: ${new Date().toISOString()}`);\n\n\t\treturn output;\n\t}\n}\n","/**\n * Name conversion utilities\n */\n\nexport interface NamingOptions {\n\tprefix?: string;\n\tsuffix?: string;\n}\n\n/**\n * Convert schema name to camelCase with optional prefix/suffix\n */\nexport function toCamelCase(str: string, options?: NamingOptions): string {\n\tlet name = str.charAt(0).toLowerCase() + str.slice(1);\n\n\t// Add prefix\n\tif (options?.prefix) {\n\t\tconst prefix = options.prefix.toLowerCase();\n\t\tname = prefix + name.charAt(0).toUpperCase() + name.slice(1);\n\t}\n\n\t// Add suffix before \"Schema\"\n\tif (options?.suffix) {\n\t\tconst suffix = options.suffix;\n\t\tname = name + suffix.charAt(0).toUpperCase() + suffix.slice(1).toLowerCase();\n\t}\n\n\treturn name;\n}\n\n/**\n * Convert enum value to PascalCase and sanitize for TypeScript enum keys\n */\nexport function toPascalCase(str: string | number): string {\n\tconst stringValue = String(str);\n\t// Replace ALL special characters (not just dots/spaces) with underscores, then convert to PascalCase\n\t// Valid identifier chars: letters, digits, underscore. Everything else becomes underscore.\n\tlet result = stringValue\n\t\t.replace(/[^a-zA-Z0-9_]+/g, \"_\") // Replace all non-identifier chars with underscore\n\t\t.split(/[-_]+/)\n\t\t.filter(word => word.length > 0) // Remove empty parts\n\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n\t\t.join(\"\");\n\n\t// Enum keys can't start with a number - prefix with 'N'\n\tif (/^\\d/.test(result)) {\n\t\tresult = `N${result}`;\n\t}\n\n\t// If result is empty or only underscores, use a default\n\tif (!result || /^_+$/.test(result)) {\n\t\tresult = \"Value\";\n\t}\n\n\treturn result;\n}\n\n/**\n * Resolve $ref to schema name\n */\nexport function resolveRef(ref: string): string {\n\tconst parts = ref.split(\"/\");\n\treturn parts[parts.length - 1];\n}\n","import type { NamingOptions } from \"../utils/name-utils\";\nimport { toCamelCase, toPascalCase } from \"../utils/name-utils\";\n\nexport type EnumType = \"zod\" | \"typescript\";\n\nexport interface EnumOpenApiGeneratorOptions extends NamingOptions {\n\tenumType: EnumType;\n}\n\nexport interface EnumResult {\n\tenumCode: string | null;\n\tschemaCode: string;\n\ttypeCode: string;\n}\n\n/**\n * Generate enum as TypeScript enum or Zod enum\n */\nexport function generateEnum(\n\tname: string,\n\tvalues: (string | number)[],\n\toptions: EnumOpenApiGeneratorOptions\n): EnumResult {\n\tconst enumName = name.endsWith(\"EnumOptions\") ? name.replace(\"EnumOptions\", \"Enum\") : `${name}Enum`;\n\tconst schemaName = `${toCamelCase(name, options)}Schema`;\n\n\tif (options.enumType === \"typescript\") {\n\t\t// Generate TypeScript enum\n\t\tconst usedKeys = new Set<string>();\n\t\tconst enumEntries = values\n\t\t\t.map(value => {\n\t\t\t\tlet key = toPascalCase(value);\n\n\t\t\t\t// Handle duplicate keys by appending a suffix\n\t\t\t\tif (usedKeys.has(key)) {\n\t\t\t\t\tlet counter = 2;\n\t\t\t\t\twhile (usedKeys.has(`${key}${counter}`)) {\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t}\n\t\t\t\t\tkey = `${key}${counter}`;\n\t\t\t\t}\n\t\t\t\tusedKeys.add(key);\n\n\t\t\t\tconst stringValue = typeof value === \"string\" ? `\"${value}\"` : value;\n\t\t\t\treturn ` ${key} = ${stringValue},`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\t\tconst enumCode = `export enum ${enumName} {\\n${enumEntries}\\n}`;\n\t\tconst schemaCode = `export const ${schemaName} = z.nativeEnum(${enumName});`;\n\t\tconst typeCode = `export type ${name} = z.infer<typeof ${schemaName}>;`;\n\n\t\treturn { enumCode, schemaCode, typeCode };\n\t}\n\n\t// Generate Zod enum (default)\n\t// Note: z.enum only accepts string values, so convert numbers to strings\n\tconst enumValues = values.map(v => `\"${v}\"`).join(\", \");\n\tconst schemaCode = `export const ${schemaName} = z.enum([${enumValues}]);`;\n\tconst typeCode = `export type ${name} = z.infer<typeof ${schemaName}>;`;\n\n\treturn { enumCode: null, schemaCode, typeCode };\n}\n","/**\n * String utility functions for escaping and formatting\n */\n\nimport type { OpenAPISchema } from \"../types\";\n\n/**\n * Escape string for description in .describe()\n */\nexport function escapeDescription(str: string): string {\n\treturn str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n}\n\n/**\n * Escape regex pattern for use in code\n */\nexport function escapePattern(str: string): string {\n\treturn str.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n}\n\n/**\n * Escape JSDoc comment content\n */\nexport function escapeJSDoc(str: string): string {\n\treturn str.replace(/\\*\\//g, \"*\\\\/\");\n}\n\n/**\n * Wrap validation with .nullable() if needed\n */\nexport function wrapNullable(validation: string, isNullable: boolean): string {\n\treturn isNullable ? `${validation}.nullable()` : validation;\n}\n\n/**\n * Check if schema is nullable (supports both OpenAPI 3.0 and 3.1 syntax)\n */\nexport function isNullable(schema: OpenAPISchema): boolean {\n\t// OpenAPI 3.0 style: nullable: true\n\tif (schema.nullable === true) {\n\t\treturn true;\n\t}\n\t// OpenAPI 3.1 style: type can be an array including \"null\"\n\tif (Array.isArray(schema.type)) {\n\t\treturn schema.type.includes(\"null\");\n\t}\n\treturn false;\n}\n\n/**\n * Get the primary type from schema (handles OpenAPI 3.1 type arrays)\n */\nexport function getPrimaryType(schema: OpenAPISchema): string | undefined {\n\tif (Array.isArray(schema.type)) {\n\t\t// OpenAPI 3.1: type can be an array like [\"string\", \"null\"]\n\t\t// Return the first non-null type\n\t\tconst nonNullType = schema.type.find(t => t !== \"null\");\n\t\treturn nonNullType;\n\t}\n\treturn schema.type;\n}\n\n/**\n * Check if schema has multiple non-null types\n */\nexport function hasMultipleTypes(schema: OpenAPISchema): boolean {\n\tif (Array.isArray(schema.type)) {\n\t\tconst nonNullTypes = schema.type.filter(t => t !== \"null\");\n\t\treturn nonNullTypes.length > 1;\n\t}\n\treturn false;\n}\n\n/**\n * Add description to a schema validation string\n */\nexport function addDescription(validation: string, description: string | undefined, useDescribe: boolean): string {\n\tif (!description || !useDescribe) return validation;\n\n\tconst escapedDesc = escapeDescription(description);\n\treturn `${validation}.describe(\"${escapedDesc}\")`;\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { escapeJSDoc } from \"../utils/string-utils\";\n\nexport interface JSDocOptions {\n\tincludeDescriptions: boolean;\n}\n\n/**\n * Generate JSDoc comment for a schema or property\n * Type-safe with input validation to prevent JSDoc injection\n */\nexport function generateJSDoc(\n\tschema: OpenAPISchema,\n\tname?: string,\n\toptions: JSDocOptions = { includeDescriptions: true }\n): string {\n\t// Type safety: Validate schema input\n\tif (!schema || typeof schema !== \"object\") {\n\t\treturn \"\";\n\t}\n\n\tif (!options.includeDescriptions) {\n\t\t// Only add @deprecated if descriptions are disabled\n\t\tif (schema.deprecated) {\n\t\t\treturn \"/** @deprecated */\\n\";\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t// Check if we have anything to document\n\tif (!schema.description && !schema.title && !schema.deprecated && !schema.examples && schema.example === undefined) {\n\t\treturn \"\";\n\t}\n\n\tconst parts: string[] = [];\n\n\t// Add title if different from name (sanitized)\n\tif (schema.title && typeof schema.title === \"string\" && (!name || schema.title !== name)) {\n\t\t// Sanitize title to prevent JSDoc injection\n\t\tconst sanitizedTitle = escapeJSDoc(schema.title).replace(/@/g, \"\\\\@\");\n\t\tparts.push(sanitizedTitle);\n\t}\n\n\t// Add description (sanitized to prevent injection)\n\tif (schema.description && typeof schema.description === \"string\") {\n\t\t// Escape @ symbols and other JSDoc tags to prevent injection\n\t\tconst sanitizedDesc = escapeJSDoc(schema.description).replace(/@/g, \"\\\\@\").replace(/\\*\\//g, \"*\\\\/\");\n\t\tparts.push(sanitizedDesc);\n\t}\n\n\t// Add examples (with type safety)\n\tif (schema.examples && Array.isArray(schema.examples) && schema.examples.length > 0) {\n\t\ttry {\n\t\t\tconst examplesStr = schema.examples.map(ex => JSON.stringify(ex)).join(\", \");\n\t\t\tparts.push(`@example ${examplesStr}`);\n\t\t} catch (error) {\n\t\t\t// Skip examples that can't be serialized\n\t\t\tconsole.warn(\"Warning: Could not serialize schema examples\", error);\n\t\t}\n\t} else if (schema.example !== undefined) {\n\t\ttry {\n\t\t\tparts.push(`@example ${JSON.stringify(schema.example)}`);\n\t\t} catch (error) {\n\t\t\t// Skip example that can't be serialized\n\t\t\tconsole.warn(\"Warning: Could not serialize schema example\", error);\n\t\t}\n\t}\n\n\t// Add deprecated\n\tif (schema.deprecated) {\n\t\tparts.push(\"@deprecated\");\n\t}\n\n\tif (parts.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst fullComment = parts.join(\" \");\n\treturn `/** ${fullComment} */\\n`;\n}\n","/**\n * Simple LRU Cache implementation for performance optimization\n * Prevents memory leaks from unbounded cache growth\n */\nexport class LRUCache<K, V> {\n\tprivate cache = new Map<K, V>();\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number) {\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.cache.has(key)) return undefined;\n\t\t// Move to end (most recently used)\n\t\tconst value = this.cache.get(key);\n\t\tif (value === undefined) return undefined;\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, value);\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key);\n\t\t} else if (this.cache.size >= this.maxSize) {\n\t\t\t// Remove least recently used (first item)\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tif (firstKey !== undefined) {\n\t\t\t\tthis.cache.delete(firstKey);\n\t\t\t}\n\t\t}\n\t\tthis.cache.set(key, value);\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\tsize(): number {\n\t\treturn this.cache.size;\n\t}\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { addDescription } from \"../utils/string-utils\";\n\nexport interface ArrayValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string) => string;\n\tuseDescribe: boolean;\n\tcurrentSchema?: string;\n}\n\n/**\n * Generate array or tuple validation\n */\nexport function generateArrayValidation(schema: OpenAPISchema, context: ArrayValidatorContext): string {\n\tlet validation: string;\n\n\t// Handle prefixItems (tuple validation - OpenAPI 3.1)\n\tif (schema.prefixItems && schema.prefixItems.length > 0) {\n\t\tconst tupleItems = schema.prefixItems.map(item => context.generatePropertySchema(item, context.currentSchema));\n\t\tvalidation = `z.tuple([${tupleItems.join(\", \")}])`;\n\n\t\t// Add rest items if specified (items after the fixed prefix)\n\t\t// items takes precedence over unevaluatedItems\n\t\tif (schema.items) {\n\t\t\tconst restSchema = context.generatePropertySchema(schema.items, context.currentSchema);\n\t\t\tvalidation += `.rest(${restSchema})`;\n\t\t} else if (schema.unevaluatedItems && typeof schema.unevaluatedItems === \"object\") {\n\t\t\t// Use unevaluatedItems as rest schema if items not specified\n\t\t\tconst restSchema = context.generatePropertySchema(schema.unevaluatedItems, context.currentSchema);\n\t\t\tvalidation += `.rest(${restSchema})`;\n\t\t}\n\t\t// If unevaluatedItems is false (or undefined), tuple has fixed length by default\n\t} else if (schema.items) {\n\t\tconst itemSchema = context.generatePropertySchema(schema.items, context.currentSchema);\n\t\tvalidation = `z.array(${itemSchema})`;\n\n\t\t// Add array constraints\n\t\tif (schema.minItems !== undefined) {\n\t\t\tvalidation += `.min(${schema.minItems})`;\n\t\t}\n\t\tif (schema.maxItems !== undefined) {\n\t\t\tvalidation += `.max(${schema.maxItems})`;\n\t\t}\n\n\t\t// Add uniqueItems constraint\n\t\tif (schema.uniqueItems === true) {\n\t\t\tvalidation += `.refine((items) => new Set(items).size === items.length, { message: \"Array items must be unique\" })`;\n\t\t}\n\t} else {\n\t\tvalidation = \"z.array(z.unknown())\";\n\t}\n\n\t// Handle contains with min/max constraints\n\tif (schema.contains) {\n\t\tconst containsSchema = context.generatePropertySchema(schema.contains, context.currentSchema);\n\t\tconst minCount = schema.minContains ?? 1;\n\t\tconst maxCount = schema.maxContains;\n\n\t\tif (maxCount !== undefined) {\n\t\t\t// Both min and max\n\t\t\tvalidation += `.refine((arr) => { const matches = arr.filter(item => ${containsSchema}.safeParse(item).success); return matches.length >= ${minCount} && matches.length <= ${maxCount}; }, { message: \"Array must contain between ${minCount} and ${maxCount} items matching the schema\" })`;\n\t\t} else {\n\t\t\t// Just min\n\t\t\tvalidation += `.refine((arr) => arr.filter(item => ${containsSchema}.safeParse(item).success).length >= ${minCount}, { message: \"Array must contain at least ${minCount} item(s) matching the schema\" })`;\n\t\t}\n\t}\n\n\t// Handle unevaluatedItems (OpenAPI 3.1) - only applies to prefixItems scenarios\n\t// Note: unevaluatedItems with prefixItems should use .rest() which was already handled above\n\t// This section handles the false case which needs to restrict the length\n\tif (schema.unevaluatedItems === false && schema.prefixItems && schema.prefixItems.length > 0 && !schema.items) {\n\t\t// No items beyond prefixItems allowed - add length restriction\n\t\tconst prefixCount = schema.prefixItems.length;\n\t\tvalidation += `.refine((arr) => arr.length <= ${prefixCount}, { message: \"No unevaluated items allowed beyond prefix items\" })`;\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, context.useDescribe);\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { wrapNullable } from \"../utils/string-utils\";\n\nexport interface CompositionValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string, isTopLevel?: boolean) => string;\n\tresolveDiscriminatorMapping?: (mapping: Record<string, string>, schemas: OpenAPISchema[]) => OpenAPISchema[];\n}\n\nexport interface UnionOptions {\n\tpassthrough?: boolean;\n\tdiscriminatorMapping?: Record<string, string>;\n}\n\n/**\n * Generate union validation\n */\nexport function generateUnion(\n\tschemas: OpenAPISchema[],\n\tdiscriminator: string | undefined,\n\tisNullable: boolean,\n\tcontext: CompositionValidatorContext,\n\toptions?: UnionOptions,\n\tcurrentSchema?: string\n): string {\n\tif (discriminator) {\n\t\t// Apply discriminator mapping if provided\n\t\tlet resolvedSchemas = schemas;\n\t\tif (options?.discriminatorMapping && context.resolveDiscriminatorMapping) {\n\t\t\tresolvedSchemas = context.resolveDiscriminatorMapping(options.discriminatorMapping, schemas);\n\t\t}\n\n\t\t// Use discriminated union for better type inference\n\t\tlet schemaStrings = resolvedSchemas.map(s => context.generatePropertySchema(s, currentSchema));\n\t\tif (options?.passthrough) {\n\t\t\tschemaStrings = schemaStrings.map(s => (s.includes(\".catchall(\") ? s : `${s}.catchall(z.unknown())`));\n\t\t}\n\t\tconst union = `z.discriminatedUnion(\"${discriminator}\", [${schemaStrings.join(\", \")}])`;\n\t\treturn wrapNullable(union, isNullable);\n\t}\n\n\tlet schemaStrings = schemas.map(s => context.generatePropertySchema(s, currentSchema));\n\tif (options?.passthrough) {\n\t\tschemaStrings = schemaStrings.map(s => (s.includes(\".catchall(\") ? s : `${s}.catchall(z.unknown())`));\n\t}\n\tconst union = `z.union([${schemaStrings.join(\", \")}])`;\n\treturn wrapNullable(union, isNullable);\n}\n\n/**\n * Generate allOf validation\n */\nexport function generateAllOf(\n\tschemas: OpenAPISchema[],\n\tisNullable: boolean,\n\tcontext: CompositionValidatorContext,\n\tcurrentSchema?: string\n): string {\n\tif (schemas.length === 1) {\n\t\tconst singleSchema = context.generatePropertySchema(schemas[0], currentSchema, false);\n\t\treturn wrapNullable(singleSchema, isNullable);\n\t}\n\n\t// Check if all schemas are objects (for .merge() support)\n\tconst allObjects = schemas.every(s => s.type === \"object\" || s.properties || s.$ref || s.allOf);\n\n\tconst schemaStrings = schemas.map(s => context.generatePropertySchema(s, currentSchema, false));\n\n\tif (allObjects) {\n\t\t// Use .merge() for object schemas (better type inference)\n\t\tlet merged = schemaStrings[0];\n\t\tfor (let i = 1; i < schemaStrings.length; i++) {\n\t\t\tmerged = `${merged}.merge(${schemaStrings[i]})`;\n\t\t}\n\t\treturn wrapNullable(merged, isNullable);\n\t}\n\n\t// Use .and() for non-object schemas (intersection)\n\tlet merged = schemaStrings[0];\n\tfor (let i = 1; i < schemaStrings.length; i++) {\n\t\tmerged = `${merged}.and(${schemaStrings[i]})`;\n\t}\n\treturn wrapNullable(merged, isNullable);\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { addDescription } from \"../utils/string-utils\";\n\n/**\n * Generate Zod validation for number\n */\nexport function generateNumberValidation(schema: OpenAPISchema, isInt: boolean, useDescribe: boolean): string {\n\tlet validation = isInt ? \"z.number().int()\" : \"z.number()\";\n\n\t// Handle minimum with exclusive bounds\n\tif (schema.minimum !== undefined) {\n\t\tconst isExclusive = schema.exclusiveMinimum === true;\n\t\tvalidation += isExclusive ? `.gt(${schema.minimum})` : `.gte(${schema.minimum})`;\n\t} else if (typeof schema.exclusiveMinimum === \"number\") {\n\t\t// OpenAPI 3.1 style: exclusiveMinimum as number\n\t\tvalidation += `.gt(${schema.exclusiveMinimum})`;\n\t}\n\n\t// Handle maximum with exclusive bounds\n\tif (schema.maximum !== undefined) {\n\t\tconst isExclusive = schema.exclusiveMaximum === true;\n\t\tvalidation += isExclusive ? `.lt(${schema.maximum})` : `.lte(${schema.maximum})`;\n\t} else if (typeof schema.exclusiveMaximum === \"number\") {\n\t\t// OpenAPI 3.1 style: exclusiveMaximum as number\n\t\tvalidation += `.lt(${schema.exclusiveMaximum})`;\n\t}\n\n\tif (schema.multipleOf !== undefined) {\n\t\tvalidation += `.multipleOf(${schema.multipleOf})`;\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, useDescribe);\n}\n","import type { OpenAPISchema } from \"../types\";\r\n\r\n/**\r\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\r\n */\r\nfunction generatePropertyAccess(propName: string): string {\r\n\t// Valid identifier: starts with letter/underscore/$, followed by letters/digits/underscores/$\r\n\tconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\r\n\treturn validIdentifier.test(propName) ? `obj.${propName}` : `obj[\"${propName}\"]`;\r\n}\r\n\r\n/**\r\n * Generate validation for dependencies (OpenAPI 3.0)\r\n * Generates detailed error messages showing which specific fields are missing\r\n */\r\nexport function generateDependencies(\r\n\tschema: OpenAPISchema,\r\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\r\n\tcurrentSchema?: string\r\n): string {\r\n\tif (!schema.dependencies) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\r\n\t\tif (Array.isArray(dependency)) {\r\n\t\t\t// Skip empty dependency arrays (no dependencies to enforce)\r\n\t\t\tif (dependency.length === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Property dependency - show specific missing properties in error message\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tconst checkLogic = dependency\r\n\t\t\t\t.map(p => {\r\n\t\t\t\t\tconst pAccess = generatePropertyAccess(p);\r\n\t\t\t\t\treturn `if (${pAccess} === undefined) missing.push('${p}');`;\r\n\t\t\t\t})\r\n\t\t\t\t.join(\"\\n\\t\\t\");\r\n\r\n\t\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\t\tconst missing: string[] = [];\r\n\t\t\t\t${checkLogic}\r\n\t\t\t\tif (missing.length > 0) {\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t})`;\r\n\t\t} else if (generatePropertySchema) {\r\n\t\t\t// Schema dependency - show detailed validation errors\r\n\t\t\tconst depSchema: OpenAPISchema = { ...dependency, type: dependency.type || \"object\" };\r\n\t\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\r\n\t\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\r\n\t\t\t\tif (!validation.success) {\r\n\t\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, object must satisfy additional constraints:\\\\n\\${errors}\\`,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t})`;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Generate condition check for if/then/else\r\n */\r\nexport function generateConditionalCheck(schema: OpenAPISchema): string {\r\n\tconst conditions: string[] = [];\r\n\r\n\t// Check properties\r\n\tif (schema.properties) {\r\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tif (propSchema.type) {\r\n\t\t\t\tconditions.push(`typeof ${propAccess} === \"${propSchema.type}\"`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.const !== undefined) {\r\n\t\t\t\tconst value = typeof propSchema.const === \"string\" ? `\"${propSchema.const}\"` : propSchema.const;\r\n\t\t\t\tconditions.push(`${propAccess} === ${value}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.minimum !== undefined) {\r\n\t\t\t\tconditions.push(`${propAccess} >= ${propSchema.minimum}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.maximum !== undefined) {\r\n\t\t\t\tconditions.push(`${propAccess} <= ${propSchema.maximum}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Check required properties\r\n\tif (schema.required) {\r\n\t\tfor (const prop of schema.required) {\r\n\t\t\tconditions.push(`${generatePropertyAccess(prop)} !== undefined`);\r\n\t\t}\r\n\t}\r\n\r\n\treturn conditions.length > 0 ? conditions.join(\" && \") : \"true\";\r\n}\r\n\r\n/**\r\n * Generate validation for then/else clauses\r\n */\r\nexport function generateConditionalValidation(schema: OpenAPISchema): string {\r\n\tconst checks: string[] = [];\r\n\r\n\t// Check required properties\r\n\tif (schema.required) {\r\n\t\tfor (const prop of schema.required) {\r\n\t\t\tchecks.push(`${generatePropertyAccess(prop)} !== undefined`);\r\n\t\t}\r\n\t}\r\n\r\n\t// Check properties constraints\r\n\tif (schema.properties) {\r\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tif (propSchema.minimum !== undefined) {\r\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} >= ${propSchema.minimum}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.maximum !== undefined) {\r\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} <= ${propSchema.maximum}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn checks.length > 0 ? checks.join(\" && \") : \"true\";\r\n}\r\n\r\n/**\r\n * Generate if/then/else conditional validation with better error messages\r\n * Uses superRefine with detailed error messages for complex cases\r\n */\r\nexport function generateIfThenElse(schema: OpenAPISchema): string {\r\n\tif (!schema.if || (!schema.then && !schema.else)) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tconst ifCondition = generateConditionalCheck(schema.if);\r\n\r\n\tif (schema.then && schema.else) {\r\n\t\t// Both then and else - provide detailed error messages\r\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\r\n\t\tconst elseValidation = generateConditionalValidation(schema.else);\r\n\r\n\t\t// Try to detect which specific validations failed\r\n\t\tconst thenRequiredProps = schema.then.required || [];\r\n\t\tconst elseRequiredProps = schema.else.required || [];\r\n\r\n\t\treturn `.superRefine((obj, ctx) => {\r\n\t\t\tconst ifConditionMet = ${ifCondition};\r\n\t\t\tif (ifConditionMet) {\r\n\t\t\t\t// Then branch\r\n\t\t\t\tconst thenValid = ${thenValidation};\r\n\t\t\t\tif (!thenValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\tthenRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingThenProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingThenProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingThenProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// Else branch\r\n\t\t\t\tconst elseValid = ${elseValidation};\r\n\t\t\t\tif (!elseValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\telseRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingElseProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingElseProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingElseProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\tif (schema.then) {\r\n\t\t// Only then - provide detailed error message\r\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\r\n\t\tconst thenRequiredProps = schema.then.required || [];\r\n\r\n\t\treturn `.superRefine((obj, ctx) => {\r\n\t\t\tconst ifConditionMet = ${ifCondition};\r\n\t\t\tif (ifConditionMet) {\r\n\t\t\t\tconst thenValid = ${thenValidation};\r\n\t\t\t\tif (!thenValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\tthenRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\t// Only else - provide detailed error message\r\n\tif (!schema.else) return \"\";\r\n\tconst elseValidation = generateConditionalValidation(schema.else);\r\n\tconst elseRequiredProps = schema.else.required || [];\r\n\r\n\treturn `.superRefine((obj, ctx) => {\r\n\t\tconst ifConditionMet = ${ifCondition};\r\n\t\tif (!ifConditionMet) {\r\n\t\t\tconst elseValid = ${elseValidation};\r\n\t\t\tif (!elseValid) {\r\n\t\t\t\t${\r\n\t\t\t\t\telseRequiredProps.length > 0\r\n\t\t\t\t\t\t? `\r\n\t\t\t\tconst missingProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\tconst message = missingProps.length > 0 \r\n\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingProps.join(', ')}\\`\r\n\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t`\r\n\t\t\t\t\t\t: `\r\n\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t`\r\n\t\t\t\t}\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: message,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t})`;\r\n}\r\n\r\n/**\r\n * Generate dependent required validation (OpenAPI 3.1)\r\n * Generates detailed error messages showing which specific fields are missing\r\n */\r\nexport function generateDependentRequired(schema: OpenAPISchema): string {\r\n\tif (!schema.dependentRequired) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, requiredProps] of Object.entries(schema.dependentRequired)) {\r\n\t\t// Skip empty required arrays (no dependencies to enforce)\r\n\t\tif (requiredProps.length === 0) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\tconst checkLogic = requiredProps\r\n\t\t\t.map(rp => {\r\n\t\t\t\tconst rpAccess = generatePropertyAccess(rp);\r\n\t\t\t\treturn `if (${rpAccess} === undefined) missing.push('${rp}');`;\r\n\t\t\t})\r\n\t\t\t.join(\"\\n\\t\\t\");\r\n\r\n\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\tconst missing: string[] = [];\r\n\t\t\t${checkLogic}\r\n\t\t\tif (missing.length > 0) {\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Generate dependent schemas validation (JSON Schema 2019-09 / OpenAPI 3.1)\r\n * This is the modern replacement for schema-based dependencies\r\n * Generates detailed error messages showing validation failures\r\n */\r\nexport function generateDependentSchemas(\r\n\tschema: OpenAPISchema & { dependentSchemas?: Record<string, OpenAPISchema> },\r\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\r\n\tcurrentSchema?: string\r\n): string {\r\n\tif (!schema.dependentSchemas || !generatePropertySchema) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, depSchema] of Object.entries(schema.dependentSchemas)) {\r\n\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\r\n\t\tconst propAccess = generatePropertyAccess(prop);\r\n\r\n\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\r\n\t\t\tif (!validation.success) {\r\n\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: \\`When '${prop}' is present, dependent schema validation failed:\\\\n\\${errors}\\`,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Validate dependency graph for circular dependencies\r\n * Returns validation result with any detected circular dependency errors\r\n */\r\nexport function validateDependencyGraph(\r\n\tschema: OpenAPISchema,\r\n\tschemaName: string\r\n): { valid: boolean; errors: string[] } {\r\n\tconst errors: string[] = [];\r\n\r\n\tif (!schema.dependencies && !schema.dependentRequired) {\r\n\t\treturn { valid: true, errors: [] };\r\n\t}\r\n\r\n\t// Build dependency graph\r\n\tconst graph = new Map<string, Set<string>>();\r\n\r\n\t// Add dependentRequired edges\r\n\tif (schema.dependentRequired) {\r\n\t\tfor (const [prop, deps] of Object.entries(schema.dependentRequired)) {\r\n\t\t\tif (!graph.has(prop)) {\r\n\t\t\t\tgraph.set(prop, new Set());\r\n\t\t\t}\r\n\t\t\tconst propDeps = graph.get(prop);\r\n\t\t\tif (propDeps) {\r\n\t\t\t\tfor (const dep of deps) {\r\n\t\t\t\t\tpropDeps.add(dep);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Add dependencies (array type) edges\r\n\tif (schema.dependencies) {\r\n\t\tfor (const [prop, dep] of Object.entries(schema.dependencies)) {\r\n\t\t\tif (Array.isArray(dep)) {\r\n\t\t\t\tif (!graph.has(prop)) {\r\n\t\t\t\t\tgraph.set(prop, new Set());\r\n\t\t\t\t}\r\n\t\t\t\tconst propDeps = graph.get(prop);\r\n\t\t\t\tif (propDeps) {\r\n\t\t\t\t\tfor (const d of dep) {\r\n\t\t\t\t\t\tpropDeps.add(d);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Detect cycles using DFS\r\n\tconst visited = new Set<string>();\r\n\tconst recStack = new Set<string>();\r\n\tconst path: string[] = [];\r\n\r\n\tfunction detectCycle(prop: string): boolean {\r\n\t\tvisited.add(prop);\r\n\t\trecStack.add(prop);\r\n\t\tpath.push(prop);\r\n\r\n\t\tconst deps = graph.get(prop) || new Set();\r\n\t\tfor (const dep of deps) {\r\n\t\t\tif (!visited.has(dep)) {\r\n\t\t\t\tif (detectCycle(dep)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t} else if (recStack.has(dep)) {\r\n\t\t\t\t// Cycle detected\r\n\t\t\t\tconst cycleStart = path.indexOf(dep);\r\n\t\t\t\tconst cycle = [...path.slice(cycleStart), dep];\r\n\t\t\t\terrors.push(`Circular dependency detected in schema '${schemaName}': ${cycle.join(\" -> \")}`);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\trecStack.delete(prop);\r\n\t\tpath.pop();\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Check all roots\r\n\tfor (const prop of graph.keys()) {\r\n\t\tif (!visited.has(prop)) {\r\n\t\t\tdetectCycle(prop);\r\n\t\t}\r\n\t}\r\n\r\n\treturn { valid: errors.length === 0, errors };\r\n}\r\n\r\n/**\r\n * Extract schema dependencies as reusable schemas\r\n * Useful for code generation and schema reuse\r\n */\r\nexport function extractSchemaDependencies(schema: OpenAPISchema, schemaName: string): Map<string, OpenAPISchema> {\r\n\tconst extracted = new Map<string, OpenAPISchema>();\r\n\r\n\tif (!schema.dependencies) {\r\n\t\treturn extracted;\r\n\t}\r\n\r\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\r\n\t\tif (!Array.isArray(dependency)) {\r\n\t\t\t// This is a schema dependency\r\n\t\t\tconst depSchemaName = `${schemaName}_${prop}_Dependency`;\r\n\t\t\tconst depSchema: OpenAPISchema = {\r\n\t\t\t\t...dependency,\r\n\t\t\t\ttype: dependency.type || \"object\",\r\n\t\t\t};\r\n\t\t\textracted.set(depSchemaName, depSchema);\r\n\t\t}\r\n\t}\r\n\r\n\treturn extracted;\r\n}\r\n","import { generateJSDoc } from \"../generators/jsdoc-generator\";\nimport type { OpenAPISchema } from \"../types\";\nimport { generateDependencies, generateDependentRequired, generateIfThenElse } from \"./conditional-validator\";\n\n/**\n * Check if a property name needs to be quoted in TypeScript object literal\n */\nfunction needsQuoting(propName: string): boolean {\n\t// Valid identifier: starts with letter/underscore/$, followed by letters/digits/underscores/$\n\tconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\treturn !validIdentifier.test(propName);\n}\n\n/**\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\n */\nfunction generatePropertyAccess(propName: string): string {\n\treturn needsQuoting(propName) ? `obj[\"${propName}\"]` : `obj.${propName}`;\n}\n\nexport type ObjectMode = \"strict\" | \"normal\" | \"loose\";\n\nexport interface ObjectValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string) => string;\n\tshouldIncludeProperty: (schema: OpenAPISchema) => boolean;\n\tmode: ObjectMode;\n\tincludeDescriptions: boolean;\n\tuseDescribe: boolean;\n}\n\n/**\n * Generate object schema\n */\nexport function generateObjectSchema(\n\tschema: OpenAPISchema,\n\tcontext: ObjectValidatorContext,\n\tcurrentSchema?: string\n): string {\n\tconst required = new Set(schema.required || []);\n\tconst properties: string[] = [];\n\n\t// Process properties if they exist\n\tif (schema.properties) {\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\t// Skip properties based on readOnly/writeOnly and schemaType\n\t\t\tif (!context.shouldIncludeProperty(propSchema)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isRequired = required.has(propName);\n\t\t\tconst zodSchema = context.generatePropertySchema(propSchema, currentSchema);\n\n\t\t\t// Quote property name if it contains special characters\n\t\t\tconst quotedPropName = needsQuoting(propName) ? `\"${propName}\"` : propName;\n\t\t\tlet propertyDef = ` ${quotedPropName}: ${zodSchema}`;\n\t\t\tif (!isRequired) {\n\t\t\t\tpropertyDef += \".optional()\";\n\t\t\t}\n\n\t\t\t// Add JSDoc for property if enabled\n\t\t\tconst jsdoc = generateJSDoc(propSchema, propName, { includeDescriptions: context.includeDescriptions });\n\t\t\tif (jsdoc) {\n\t\t\t\tproperties.push(`${jsdoc.trimEnd()}\\n${propertyDef}`);\n\t\t\t} else {\n\t\t\t\tproperties.push(propertyDef);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Determine object method based on mode and additionalProperties\n\tlet objectMethod: string;\n\n\t// additionalProperties: false always uses strictObject\n\tif (schema.additionalProperties === false) {\n\t\tobjectMethod = \"z.strictObject\";\n\t} else {\n\t\t// Otherwise respect the mode setting\n\t\tswitch (context.mode) {\n\t\t\tcase \"strict\":\n\t\t\t\tobjectMethod = \"z.strictObject\";\n\t\t\t\tbreak;\n\t\t\tcase \"loose\":\n\t\t\t\tobjectMethod = \"z.looseObject\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tobjectMethod = \"z.object\";\n\t\t}\n\t}\n\n\tlet objectDef = `${objectMethod}({\\n${properties.join(\",\\n\")}\\n})`;\n\n\t// Handle additionalProperties for typed catchall\n\tif (schema.additionalProperties !== undefined) {\n\t\tif (typeof schema.additionalProperties === \"object\") {\n\t\t\t// Additional properties with specific schema\n\t\t\tconst additionalSchema = context.generatePropertySchema(schema.additionalProperties, currentSchema);\n\t\t\tobjectDef += `.catchall(${additionalSchema})`;\n\t\t} else if (schema.additionalProperties === true) {\n\t\t\t// Any additional properties allowed\n\t\t\tobjectDef += \".catchall(z.unknown())\";\n\t\t}\n\t\t// Note: additionalProperties: false is handled by using z.strictObject\n\t} else if (schema.patternProperties) {\n\t\t// If pattern properties are defined but additionalProperties is not, allow properties through\n\t\t// so they can be validated by pattern property refinements\n\t\tobjectDef += \".catchall(z.unknown())\";\n\t}\n\n\t// Handle minProperties and maxProperties\n\tif (schema.minProperties !== undefined || schema.maxProperties !== undefined) {\n\t\tconst conditions: string[] = [];\n\t\tif (schema.minProperties !== undefined) {\n\t\t\tconditions.push(`Object.keys(obj).length >= ${schema.minProperties}`);\n\t\t}\n\t\tif (schema.maxProperties !== undefined) {\n\t\t\tconditions.push(`Object.keys(obj).length <= ${schema.maxProperties}`);\n\t\t}\n\t\tconst condition = conditions.join(\" && \");\n\t\tlet message = \"Object \";\n\t\tif (schema.minProperties !== undefined && schema.maxProperties !== undefined) {\n\t\t\tmessage += `must have between ${schema.minProperties} and ${schema.maxProperties} properties`;\n\t\t} else if (schema.minProperties !== undefined) {\n\t\t\tmessage += `must have at least ${schema.minProperties} ${schema.minProperties === 1 ? \"property\" : \"properties\"}`;\n\t\t} else {\n\t\t\tmessage += `must have at most ${schema.maxProperties} ${schema.maxProperties === 1 ? \"property\" : \"properties\"}`;\n\t\t}\n\t\tobjectDef += `.refine((obj) => ${condition}, { message: \"${message}\" })`;\n\t}\n\n\t// Handle required fields that aren't in properties (common in schema dependencies)\n\tconst definedProps = new Set(Object.keys(schema.properties || {}));\n\tconst undefinedRequired = (schema.required || []).filter(prop => !definedProps.has(prop));\n\tif (undefinedRequired.length > 0) {\n\t\t// Need catchall to allow required fields that aren't in properties\n\t\tif (!objectDef.includes(\".catchall(\")) {\n\t\t\tobjectDef += \".catchall(z.unknown())\";\n\t\t}\n\t\tconst requiredChecks = undefinedRequired.map(prop => `${generatePropertyAccess(prop)} !== undefined`).join(\" && \");\n\t\tconst propList = undefinedRequired.join(\", \");\n\t\tobjectDef += `.refine((obj) => ${requiredChecks}, { message: \"Missing required fields: ${propList}\" })`;\n\t}\n\n\t// Handle pattern properties with first-match-wins priority\n\tif (schema.patternProperties) {\n\t\tconst definedProps = Object.keys(schema.properties || {});\n\t\tconst definedPropsSet = `new Set(${JSON.stringify(definedProps)})`;\n\t\tconst patterns = Object.entries(schema.patternProperties);\n\n\t\t// Generate schemas for all patterns\n\t\tconst patternSchemas = patterns.map(([pattern, patternSchema]) => ({\n\t\t\tpattern,\n\t\t\tescapedPattern: pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\"),\n\t\t\tzodSchema: context.generatePropertySchema(patternSchema, currentSchema),\n\t\t}));\n\n\t\t// Single superRefine for all patterns (more efficient)\n\t\tobjectDef += `.superRefine((obj, ctx) => {\n\t\t\tconst definedPropsSet = ${definedPropsSet};\n\t\t\tconst patterns = ${JSON.stringify(patternSchemas.map(p => ({ pattern: p.escapedPattern })))};\n\t\t\tconst schemas = [${patternSchemas.map(p => p.zodSchema).join(\", \")}];\n\t\t\tconst regexps = patterns.map(p => new RegExp(p.pattern));\n\n\t\t\t// Check all object keys\n\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\t// Skip properties that are explicitly defined\n\t\t\t\tif (definedPropsSet.has(key)) continue;\n\n\t\t\t\t// Find first matching pattern (first-match-wins priority)\n\t\t\t\tfor (let i = 0; i < regexps.length; i++) {\n\t\t\t\t\tif (regexps[i].test(key)) {\n\t\t\t\t\t\tconst validation = schemas[i].safeParse(obj[key]);\n\t\t\t\t\t\tif (!validation.success) {\n\t\t\t\t\t\t\t// Add detailed error messages with property name and pattern\n\t\t\t\t\t\t\tfor (const issue of validation.error.issues) {\n\t\t\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\t\t\t...issue,\n\t\t\t\t\t\t\t\t\tpath: [key, ...issue.path],\n\t\t\t\t\t\t\t\t\tmessage: \\`Property '\\${key}' (pattern '\\${patterns[i].pattern}'): \\${issue.message}\\`\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak; // First match wins, stop checking other patterns\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\t// Handle property names validation (consolidated for efficiency)\n\tif (schema.propertyNames) {\n\t\tconst hasPattern = schema.propertyNames.pattern !== undefined;\n\t\tconst hasMinLength = schema.propertyNames.minLength !== undefined;\n\t\tconst hasMaxLength = schema.propertyNames.maxLength !== undefined;\n\n\t\tif (hasPattern || hasMinLength || hasMaxLength) {\n\t\t\tconst escapedPattern =\n\t\t\t\thasPattern && schema.propertyNames.pattern\n\t\t\t\t\t? schema.propertyNames.pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")\n\t\t\t\t\t: null;\n\t\t\tconst minLen = schema.propertyNames.minLength;\n\t\t\tconst maxLen = schema.propertyNames.maxLength;\n\n\t\t\tobjectDef += `.superRefine((obj, ctx) => {\n\t\t\t\t${escapedPattern ? `const pattern = /${escapedPattern}/;` : \"\"}\n\n\t\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\t\tconst failures: string[] = [];\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasPattern\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (!pattern.test(key)) {\n\t\t\t\t\t\tfailures.push(\"must match pattern '${schema.propertyNames.pattern}'\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasMinLength\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (key.length < ${minLen}) {\n\t\t\t\t\t\tfailures.push(\"must be at least ${minLen} characters\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasMaxLength\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (key.length > ${maxLen}) {\n\t\t\t\t\t\tfailures.push(\"must be at most ${maxLen} characters\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\tif (failures.length > 0) {\n\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\t\tmessage: \\`Property name '\\${key}' \\${failures.join(\", \")}\\`,\n\t\t\t\t\t\t\tpath: [key]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})`;\n\t\t}\n\t}\n\n\t// Handle dependencies (OpenAPI 3.0)\n\tobjectDef += generateDependencies(schema, context.generatePropertySchema, currentSchema);\n\n\t// Handle dependentRequired\n\tobjectDef += generateDependentRequired(schema);\n\n\t// Handle if/then/else conditionals\n\tobjectDef += generateIfThenElse(schema);\n\n\treturn objectDef;\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport { addDescription, escapePattern } from \"../utils/string-utils\";\n\n// Performance optimization: Cache compiled regex patterns with size limit\nconst PATTERN_CACHE = new LRUCache<string, string>(1000);\n\nconst FORMAT_MAP: Record<string, string> = {\n\tuuid: \"z.uuid()\",\n\temail: \"z.email()\",\n\turi: \"z.url()\",\n\turl: \"z.url()\",\n\t\"uri-reference\": 'z.string().refine((val) => !/\\\\s/.test(val), { message: \"Must be a valid URI reference\" })',\n\thostname:\n\t\t'z.string().refine((val) => /^(?=.{1,253}$)(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)\\\\.)*(?!-)[A-Za-z0-9-]{1,63}(?<!-)$/.test(val), { message: \"Must be a valid hostname\" })',\n\tbyte: \"z.base64()\",\n\tbinary: \"z.string()\",\n\tdate: \"z.iso.date()\",\n\t\"date-time\": \"z.iso.datetime()\",\n\ttime: \"z.iso.time()\",\n\tduration:\n\t\t'z.string().refine((val) => /^P(?:(?:\\\\d+Y)?(?:\\\\d+M)?(?:\\\\d+D)?(?:T(?:\\\\d+H)?(?:\\\\d+M)?(?:\\\\d+(?:\\\\.\\\\d+)?S)?)?|\\\\d+W)$/.test(val) && !/^PT?$/.test(val), { message: \"Must be a valid ISO 8601 duration\" })',\n\tipv4: \"z.ipv4()\",\n\tipv6: \"z.ipv6()\",\n\temoji: \"z.emoji()\",\n\tbase64: \"z.base64()\",\n\tbase64url: \"z.base64url()\",\n\tnanoid: \"z.nanoid()\",\n\tcuid: \"z.cuid()\",\n\tcuid2: \"z.cuid2()\",\n\tulid: \"z.ulid()\",\n\tcidr: \"z.cidrv4()\", // Default to v4\n\tcidrv4: \"z.cidrv4()\",\n\tcidrv6: \"z.cidrv6()\",\n\t\"json-pointer\":\n\t\t'z.string().refine((val) => val === \"\" || /^(\\\\/([^~/]|~0|~1)+)+$/.test(val), { message: \"Must be a valid JSON Pointer (RFC 6901)\" })',\n\t\"relative-json-pointer\":\n\t\t'z.string().refine((val) => /^(0|[1-9]\\\\d*)(#|(\\\\/([^~/]|~0|~1)+)*)$/.test(val), { message: \"Must be a valid relative JSON Pointer\" })',\n};\n\n/**\n * Generate Zod validation for string with format (Zod v4 compatible)\n */\nexport function generateStringValidation(schema: OpenAPISchema, useDescribe: boolean): string {\n\t// Handle format with Zod v4 top-level functions (performance optimized with map)\n\tlet validation = FORMAT_MAP[schema.format || \"\"] || \"z.string()\";\n\n\t// Add length constraints\n\tif (schema.minLength !== undefined) {\n\t\tvalidation += `.min(${schema.minLength})`;\n\t}\n\tif (schema.maxLength !== undefined) {\n\t\tvalidation += `.max(${schema.maxLength})`;\n\t}\n\n\t// Add pattern (with cached escaping for performance)\n\tif (schema.pattern) {\n\t\tlet escapedPattern = PATTERN_CACHE.get(schema.pattern);\n\t\tif (escapedPattern === undefined) {\n\t\t\tescapedPattern = escapePattern(schema.pattern);\n\t\t\tPATTERN_CACHE.set(schema.pattern, escapedPattern);\n\t\t}\n\t\tvalidation += `.regex(/${escapedPattern}/)`;\n\t}\n\n\t// Handle content encoding (OpenAPI 3.1)\n\tif (schema.contentEncoding && !schema.format) {\n\t\tswitch (schema.contentEncoding) {\n\t\t\tcase \"base64\":\n\t\t\t\tvalidation = \"z.base64()\";\n\t\t\t\tbreak;\n\t\t\tcase \"base64url\":\n\t\t\t\tvalidation = \"z.base64url()\";\n\t\t\t\tbreak;\n\t\t\tcase \"quoted-printable\":\n\t\t\t\t// Quoted-printable validation\n\t\t\t\tvalidation =\n\t\t\t\t\t'z.string().refine((val) => /^[\\\\x20-\\\\x7E\\\\r\\\\n=]*$/.test(val), { message: \"Must be valid quoted-printable encoding\" })';\n\t\t\t\tbreak;\n\t\t\tcase \"7bit\":\n\t\t\tcase \"8bit\":\n\t\t\tcase \"binary\":\n\t\t\t\t// Basic string validation for these encodings\n\t\t\t\tvalidation = \"z.string()\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Unknown encoding, use string with refinement note\n\t\t\t\tvalidation = `z.string().describe(\"Content encoding: ${schema.contentEncoding}\")`;\n\t\t}\n\n\t\t// Re-apply constraints after encoding\n\t\tif (schema.minLength !== undefined) {\n\t\t\tvalidation += `.min(${schema.minLength})`;\n\t\t}\n\t\tif (schema.maxLength !== undefined) {\n\t\t\tvalidation += `.max(${schema.maxLength})`;\n\t\t}\n\t\tif (schema.pattern) {\n\t\t\tlet escapedPattern = PATTERN_CACHE.get(schema.pattern);\n\t\t\tif (escapedPattern === undefined) {\n\t\t\t\tescapedPattern = escapePattern(schema.pattern);\n\t\t\t\tPATTERN_CACHE.set(schema.pattern, escapedPattern);\n\t\t\t}\n\t\t\tvalidation += `.regex(/${escapedPattern}/)`;\n\t\t}\n\t} else if (schema.contentMediaType) {\n\t\t// Add refinement for media type validation\n\t\tconst mediaType = schema.contentMediaType;\n\t\tif (mediaType === \"application/json\") {\n\t\t\tvalidation += `.refine((val) => { try { JSON.parse(val); return true; } catch { return false; } }, { message: \"Must be valid JSON\" })`;\n\t\t} else if (mediaType === \"application/xml\" || mediaType === \"text/xml\") {\n\t\t\t// Basic XML validation - check for well-formed XML structure\n\t\t\tvalidation += `.refine((val) => { try { if (typeof DOMParser !== \"undefined\") { const parser = new DOMParser(); const doc = parser.parseFromString(val, \"text/xml\"); return !doc.querySelector(\"parsererror\"); } return /^\\\\s*<[^>]+>/.test(val); } catch { return false; } }, { message: \"Must be valid XML\" })`;\n\t\t} else if (mediaType === \"application/yaml\" || mediaType === \"application/x-yaml\" || mediaType === \"text/yaml\") {\n\t\t\t// Basic YAML validation - check for basic YAML structure\n\t\t\tvalidation += `.refine((val) => { try { return val.trim().length > 0 && !/^[[{]/.test(val.trim()); } catch { return false; } }, { message: \"Must be valid YAML\" })`;\n\t\t} else if (mediaType === \"text/html\") {\n\t\t\t// Basic HTML validation - check for HTML tags\n\t\t\tvalidation += `.refine((val) => /<[^>]+>/.test(val), { message: \"Must contain HTML tags\" })`;\n\t\t} else if (mediaType === \"text/plain\") {\n\t\t\t// Plain text - no special validation needed, but mark it\n\t\t\tvalidation += `.refine(() => true, { message: \"Plain text content\" })`;\n\t\t}\n\t\t// Other media types default to no validation beyond string\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, useDescribe);\n}\n","import type { NativeEnumType, OpenAPISchema, OpenAPISpec, TypeMode } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport type { NamingOptions } from \"../utils/name-utils\";\nimport { resolveRef, toCamelCase } from \"../utils/name-utils\";\nimport { addDescription, getPrimaryType, hasMultipleTypes, isNullable, wrapNullable } from \"../utils/string-utils\";\nimport { generateArrayValidation } from \"../validators/array-validator\";\nimport { generateAllOf, generateUnion } from \"../validators/composition-validator\";\nimport { generateNumberValidation } from \"../validators/number-validator\";\nimport type { ObjectMode } from \"../validators/object-validator\";\nimport { generateObjectSchema } from \"../validators/object-validator\";\nimport { generateStringValidation } from \"../validators/string-validator\";\n\nexport interface PropertyGeneratorContext {\n\tspec: OpenAPISpec;\n\tschemaDependencies: Map<string, Set<string>>;\n\tschemaType: \"all\" | \"request\" | \"response\";\n\tmode: ObjectMode;\n\tincludeDescriptions: boolean;\n\tuseDescribe: boolean;\n\ttypeMode: TypeMode;\n\tnativeEnumType: NativeEnumType;\n\tnamingOptions: NamingOptions;\n}\n\n/**\n * Property schema generator with memoization for performance\n */\nexport class PropertyGenerator {\n\tprivate context: PropertyGeneratorContext;\n\t// Performance optimization: Memoize filtered property results\n\tprivate filteredPropsCache = new Map<string, OpenAPISchema>();\n\t// Performance optimization: LRU cache for generated schemas\n\tprivate schemaCache = new LRUCache<string, string>(500);\n\n\t// Performance optimization: Lookup table for faster inclusion checks\n\tstatic readonly INCLUSION_RULES = {\n\t\trequest: (schema: OpenAPISchema) => !schema.readOnly,\n\t\tresponse: (schema: OpenAPISchema) => !schema.writeOnly,\n\t\tall: () => true,\n\t} as const;\n\n\tconstructor(context: PropertyGeneratorContext) {\n\t\tthis.context = context;\n\t}\n\n\t/**\n\t * Check if a property should be included based on schemaType and readOnly/writeOnly flags\n\t */\n\tshouldIncludeProperty(schema: OpenAPISchema): boolean {\n\t\tconst rule = PropertyGenerator.INCLUSION_RULES[this.context.schemaType];\n\t\treturn rule(schema);\n\t}\n\n\t/**\n\t * Recursively filter any schema type (helper for composition schemas)\n\t */\n\tprivate filterSchemaRecursive(schema: OpenAPISchema): OpenAPISchema {\n\t\tif (schema.$ref) {\n\t\t\t// Don't filter refs, they'll be filtered when resolved\n\t\t\treturn schema;\n\t\t}\n\n\t\tif (schema.properties) {\n\t\t\treturn this.filterNestedProperties(schema);\n\t\t}\n\n\t\tif (schema.type === \"array\" && schema.items && typeof schema.items === \"object\" && schema.items.properties) {\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\titems: this.filterNestedProperties(schema.items),\n\t\t\t};\n\t\t}\n\n\t\treturn schema;\n\t}\n\n\t/**\n\t * Recursively filter properties in nested objects based on readOnly/writeOnly\n\t * Performance optimized with memoization\n\t */\n\tprivate filterNestedProperties(schema: OpenAPISchema): OpenAPISchema {\n\t\t// Performance optimization: More efficient cache key generation\n\t\tconst propKeys = schema.properties ? Object.keys(schema.properties).sort().join(\",\") : \"\";\n\t\tconst cacheKey = `${this.context.schemaType}:${schema.type || \"unknown\"}:${propKeys}:${schema.required?.join(\",\") || \"\"}`;\n\t\tconst cached = this.filteredPropsCache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tif (!schema.properties) {\n\t\t\treturn schema;\n\t\t}\n\n\t\tconst filteredProperties: Record<string, OpenAPISchema> = {};\n\t\tconst filteredRequired: string[] = [];\n\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\tif (!this.shouldIncludeProperty(propSchema)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Recursively filter nested structures\n\t\t\tlet filteredPropSchema = propSchema;\n\n\t\t\tif (propSchema.type === \"object\" && propSchema.properties) {\n\t\t\t\t// Nested object\n\t\t\t\tfilteredPropSchema = this.filterNestedProperties(propSchema);\n\t\t\t} else if (\n\t\t\t\tpropSchema.type === \"array\" &&\n\t\t\t\tpropSchema.items &&\n\t\t\t\ttypeof propSchema.items === \"object\" &&\n\t\t\t\tpropSchema.items.properties\n\t\t\t) {\n\t\t\t\t// Array of objects\n\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t...propSchema,\n\t\t\t\t\titems: this.filterNestedProperties(propSchema.items),\n\t\t\t\t};\n\t\t\t} else if (propSchema.allOf || propSchema.oneOf || propSchema.anyOf) {\n\t\t\t\t// Composition schemas - filter each branch\n\t\t\t\tif (propSchema.allOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\tallOf: propSchema.allOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t} else if (propSchema.oneOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\toneOf: propSchema.oneOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t} else if (propSchema.anyOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\tanyOf: propSchema.anyOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfilteredProperties[propName] = filteredPropSchema;\n\n\t\t\t// Keep required status if property is included\n\t\t\tif (schema.required?.includes(propName)) {\n\t\t\t\tfilteredRequired.push(propName);\n\t\t\t}\n\t\t}\n\n\t\tconst result = {\n\t\t\t...schema,\n\t\t\tproperties: filteredProperties,\n\t\t\trequired: filteredRequired.length > 0 ? filteredRequired : undefined,\n\t\t};\n\n\t\t// Cache the result\n\t\tthis.filteredPropsCache.set(cacheKey, result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Resolve discriminator mapping to actual schema references\n\t */\n\tprivate resolveDiscriminatorMapping(mapping: Record<string, string>, schemas: OpenAPISchema[]): OpenAPISchema[] {\n\t\t// If mapping is provided, use it to reorder/filter schemas\n\t\t// The mapping maps discriminator values to schema references\n\t\tconst mappedSchemas: OpenAPISchema[] = [];\n\n\t\tfor (const [_, schemaRef] of Object.entries(mapping)) {\n\t\t\t// Find the schema that matches this reference\n\t\t\tconst matchingSchema = schemas.find(s => {\n\t\t\t\tif (s.$ref) {\n\t\t\t\t\t// Check if the ref matches\n\t\t\t\t\treturn s.$ref === schemaRef || s.$ref.endsWith(schemaRef);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tif (matchingSchema) {\n\t\t\t\tmappedSchemas.push(matchingSchema);\n\t\t\t} else {\n\t\t\t\t// Schema not found in oneOf/anyOf, create a reference\n\t\t\t\tmappedSchemas.push({ $ref: schemaRef });\n\t\t\t}\n\t\t}\n\n\t\t// Include any schemas that weren't in the mapping\n\t\tfor (const schema of schemas) {\n\t\t\tif (!mappedSchemas.includes(schema)) {\n\t\t\t\tmappedSchemas.push(schema);\n\t\t\t}\n\t\t}\n\n\t\treturn mappedSchemas;\n\t}\n\n\t/**\n\t * Resolve a schema name through any aliases to get the actual schema name\n\t * If the schema is an alias (allOf with single $ref), return the target name\n\t */\n\tprivate resolveSchemaAlias(schemaName: string): string {\n\t\tconst schema = this.context.spec.components?.schemas?.[schemaName];\n\t\tif (!schema) return schemaName;\n\n\t\t// Check if this is a simple alias (allOf with single $ref and nothing else)\n\t\tif (\n\t\t\tschema.allOf &&\n\t\t\tschema.allOf.length === 1 &&\n\t\t\tschema.allOf[0].$ref &&\n\t\t\t!schema.properties &&\n\t\t\t!schema.oneOf &&\n\t\t\t!schema.anyOf\n\t\t) {\n\t\t\tconst targetName = resolveRef(schema.allOf[0].$ref);\n\t\t\t// Recursively resolve in case of chained aliases\n\t\t\treturn this.resolveSchemaAlias(targetName);\n\t\t}\n\n\t\treturn schemaName;\n\t}\n\n\t/**\n\t * Check if this is a circular dependency through aliases\n\t */\n\tprivate isCircularThroughAlias(fromSchema: string, toSchema: string): boolean {\n\t\tconst toSchemaSpec = this.context.spec.components?.schemas?.[toSchema];\n\t\tif (!toSchemaSpec) return false;\n\n\t\t// Check if toSchema is a simple alias (allOf with single $ref)\n\t\tif (toSchemaSpec.allOf && toSchemaSpec.allOf.length === 1 && toSchemaSpec.allOf[0].$ref) {\n\t\t\tconst aliasTarget = resolveRef(toSchemaSpec.allOf[0].$ref);\n\t\t\t// If the alias points back to the original schema, it's circular\n\t\t\treturn aliasTarget === fromSchema;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Generate union for multiple types (OpenAPI 3.1)\n\t */\n\tprivate generateMultiTypeUnion(schema: OpenAPISchema, currentSchema?: string): string {\n\t\tif (!Array.isArray(schema.type)) {\n\t\t\treturn \"z.unknown()\";\n\t\t}\n\t\tconst nonNullTypes = schema.type.filter(t => t !== \"null\");\n\t\tconst schemas = nonNullTypes.map(type => {\n\t\t\tconst typeSchema = { ...schema, type };\n\t\t\treturn this.generatePropertySchema(typeSchema, currentSchema);\n\t\t});\n\t\treturn `z.union([${schemas.join(\", \")}])`;\n\t}\n\n\t/**\n\t * Apply unevaluatedProperties validation to a schema\n\t */\n\tprivate applyUnevaluatedProperties(baseSchema: string, schema: OpenAPISchema): string {\n\t\t// Collect all evaluated properties from the schema and its composition\n\t\tconst evaluatedProps = new Set<string>();\n\n\t\t// Add properties from this schema\n\t\tif (schema.properties) {\n\t\t\tfor (const propName of Object.keys(schema.properties)) {\n\t\t\t\tevaluatedProps.add(propName);\n\t\t\t}\n\t\t}\n\n\t\t// Add properties from allOf/oneOf/anyOf (shallow scan)\n\t\tconst collectPropsFromComposition = (schemas?: OpenAPISchema[]) => {\n\t\t\tif (!schemas) return;\n\t\t\tfor (const subSchema of schemas) {\n\t\t\t\tif (subSchema.properties) {\n\t\t\t\t\tfor (const propName of Object.keys(subSchema.properties)) {\n\t\t\t\t\t\tevaluatedProps.add(propName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Also check $ref schemas\n\t\t\t\tif (subSchema.$ref) {\n\t\t\t\t\tconst refSchema = this.context.spec.components?.schemas?.[subSchema.$ref.split(\"/\").pop() || \"\"];\n\t\t\t\t\tif (refSchema?.properties) {\n\t\t\t\t\t\tfor (const propName of Object.keys(refSchema.properties)) {\n\t\t\t\t\t\t\tevaluatedProps.add(propName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tcollectPropsFromComposition(schema.allOf);\n\t\tcollectPropsFromComposition(schema.oneOf);\n\t\tcollectPropsFromComposition(schema.anyOf);\n\n\t\tconst evaluatedPropsSet = `new Set(${JSON.stringify([...evaluatedProps])})`;\n\n\t\t// For unions (oneOf/anyOf), we need to add .catchall(z.unknown()) to EACH branch\n\t\t// For allOf with merge(), add catchall to the final result\n\t\tlet schemaWithCatchall = baseSchema;\n\t\tif (baseSchema.includes(\".union([\") || baseSchema.includes(\".discriminatedUnion(\")) {\n\t\t\t// For unions, we need to make each branch allow additional properties\n\t\t\t// This is complex, so we'll apply refinement and let the refinement check the raw input\n\t\t\t// The union will have already validated structure, refinement checks extra props\n\t\t\tschemaWithCatchall = baseSchema;\n\t\t} else if (baseSchema.includes(\".merge(\")) {\n\t\t\t// Wrap in catchall - apply to final result\n\t\t\tschemaWithCatchall = `${baseSchema}.catchall(z.unknown())`;\n\t\t}\n\n\t\tif (schema.unevaluatedProperties === false) {\n\t\t\t// No unevaluated properties allowed\n\t\t\treturn `${schemaWithCatchall}.refine((obj) => Object.keys(obj).every(key => ${evaluatedPropsSet}.has(key)), { message: \"No unevaluated properties allowed\" })`;\n\t\t} else if (typeof schema.unevaluatedProperties === \"object\") {\n\t\t\t// Unevaluated properties must match schema\n\t\t\tconst unevalSchema = this.generatePropertySchema(schema.unevaluatedProperties);\n\t\t\treturn `${schemaWithCatchall}.refine((obj) => Object.keys(obj).filter(key => !${evaluatedPropsSet}.has(key)).every(key => ${unevalSchema}.safeParse(obj[key]).success), { message: \"Unevaluated properties must match the schema\" })`;\n\t\t}\n\n\t\treturn baseSchema;\n\t}\n\n\t/**\n\t * Generate Zod schema for a property\n\t */\n\tgeneratePropertySchema(schema: OpenAPISchema, currentSchema?: string, isTopLevel = false): string {\n\t\t// Performance optimization: Check cache for simple schemas\n\t\t// Only cache schemas without $ref or complex compositions to avoid stale circular refs\n\t\tconst isCacheable = !schema.$ref && !schema.allOf && !schema.oneOf && !schema.anyOf && !currentSchema;\n\t\tif (isCacheable) {\n\t\t\tconst cacheKey = JSON.stringify({ schema, type: this.context.schemaType, mode: this.context.mode });\n\t\t\tconst cached = this.schemaCache.get(cacheKey);\n\t\t\tif (cached) {\n\t\t\t\treturn cached;\n\t\t\t}\n\t\t}\n\n\t\t// Apply nested property filtering if needed\n\t\tif ((this.context.schemaType === \"request\" || this.context.schemaType === \"response\") && schema.properties) {\n\t\t\tschema = this.filterNestedProperties(schema);\n\t\t}\n\n\t\tconst nullable = isNullable(schema);\n\n\t\t// Handle multiple types (OpenAPI 3.1)\n\t\tif (hasMultipleTypes(schema)) {\n\t\t\tconst union = this.generateMultiTypeUnion(schema, currentSchema);\n\t\t\treturn wrapNullable(union, nullable);\n\t\t}\n\n\t\t// Handle $ref\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\t// Resolve through any aliases to get the actual schema\n\t\t\tconst resolvedRefName = this.resolveSchemaAlias(refName);\n\n\t\t\t// Track dependency (but not if it's just an alias at top level)\n\t\t\tif (currentSchema && refName !== currentSchema && !isTopLevel) {\n\t\t\t\tif (!this.context.schemaDependencies.has(currentSchema)) {\n\t\t\t\t\tthis.context.schemaDependencies.set(currentSchema, new Set());\n\t\t\t\t}\n\t\t\t\tthis.context.schemaDependencies.get(currentSchema)?.add(refName);\n\t\t\t}\n\t\t\t// Use the resolved name for the schema reference\n\t\t\tconst schemaName = `${toCamelCase(resolvedRefName, this.context.namingOptions)}Schema`;\n\n\t\t\t// Check for circular dependency through alias\n\t\t\tif (currentSchema && this.isCircularThroughAlias(currentSchema, refName)) {\n\t\t\t\t// Use lazy evaluation for circular references with explicit type annotation\n\t\t\t\tconst lazySchema = `z.lazy((): z.ZodTypeAny => ${schemaName})`;\n\t\t\t\treturn wrapNullable(lazySchema, nullable);\n\t\t\t}\n\n\t\t\treturn wrapNullable(schemaName, nullable);\n\t\t}\n\n\t\t// Handle const (literal values)\n\t\tif (schema.const !== undefined) {\n\t\t\tconst literalValue = typeof schema.const === \"string\" ? `\"${schema.const}\"` : schema.const;\n\t\t\tconst zodLiteral = `z.literal(${literalValue})`;\n\t\t\treturn wrapNullable(zodLiteral, nullable);\n\t\t}\n\n\t\t// Handle enum\n\t\tif (schema.enum) {\n\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\tconst zodEnum = `z.enum([${enumValues}])`;\n\t\t\treturn wrapNullable(zodEnum, nullable);\n\t\t}\n\n\t\t// Handle allOf\n\t\tif (schema.allOf) {\n\t\t\tlet composition = generateAllOf(\n\t\t\t\tschema.allOf,\n\t\t\t\tnullable,\n\t\t\t\t{ generatePropertySchema: this.generatePropertySchema.bind(this) },\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle oneOf with discriminator support\n\t\tif (schema.oneOf) {\n\t\t\tconst needsPassthrough = schema.unevaluatedProperties !== undefined;\n\t\t\tlet composition = generateUnion(\n\t\t\t\tschema.oneOf,\n\t\t\t\tschema.discriminator?.propertyName,\n\t\t\t\tnullable,\n\t\t\t\t{\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tresolveDiscriminatorMapping: this.resolveDiscriminatorMapping.bind(this),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpassthrough: needsPassthrough,\n\t\t\t\t\tdiscriminatorMapping: schema.discriminator?.mapping,\n\t\t\t\t},\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle anyOf with discriminator support\n\t\tif (schema.anyOf) {\n\t\t\tconst needsPassthrough = schema.unevaluatedProperties !== undefined;\n\t\t\tlet composition = generateUnion(\n\t\t\t\tschema.anyOf,\n\t\t\t\tschema.discriminator?.propertyName,\n\t\t\t\tnullable,\n\t\t\t\t{\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tresolveDiscriminatorMapping: this.resolveDiscriminatorMapping.bind(this),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpassthrough: needsPassthrough,\n\t\t\t\t\tdiscriminatorMapping: schema.discriminator?.mapping,\n\t\t\t\t},\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle not keyword (must be after compositions)\n\t\tif (schema.not) {\n\t\t\tconst notSchema = this.generatePropertySchema(schema.not, currentSchema);\n\t\t\tlet baseValidation: string;\n\n\t\t\t// If schema has a type, generate validation for that type first\n\t\t\tif (schema.type || schema.properties || schema.items) {\n\t\t\t\t// Create a copy without 'not' to generate base validation\n\t\t\t\tconst { not: _, ...baseSchema } = schema;\n\t\t\t\tbaseValidation = this.generatePropertySchema(baseSchema, currentSchema);\n\t\t\t} else {\n\t\t\t\t// No specific type, use unknown\n\t\t\t\tbaseValidation = \"z.unknown()\";\n\t\t\t}\n\n\t\t\tconst refined = `${baseValidation}.refine((val) => !${notSchema}.safeParse(val).success, { message: \"Value must not match the excluded schema\" })`;\n\t\t\treturn wrapNullable(refined, nullable);\n\t\t}\n\n\t\tlet validation = \"\";\n\t\tconst primaryType = getPrimaryType(schema);\n\n\t\tswitch (primaryType) {\n\t\t\tcase \"string\":\n\t\t\t\tvalidation = generateStringValidation(schema, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"number\":\n\t\t\t\tvalidation = generateNumberValidation(schema, false, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"integer\":\n\t\t\t\tvalidation = generateNumberValidation(schema, true, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"boolean\":\n\t\t\t\tvalidation = \"z.boolean()\";\n\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"array\":\n\t\t\t\tvalidation = generateArrayValidation(schema, {\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tuseDescribe: this.context.useDescribe,\n\t\t\t\t\tcurrentSchema,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"object\":\n\t\t\t\tif (\n\t\t\t\t\tschema.properties ||\n\t\t\t\t\tschema.required ||\n\t\t\t\t\tschema.minProperties !== undefined ||\n\t\t\t\t\tschema.maxProperties !== undefined ||\n\t\t\t\t\tschema.patternProperties ||\n\t\t\t\t\tschema.propertyNames\n\t\t\t\t) {\n\t\t\t\t\tvalidation = generateObjectSchema(\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\t\t\tshouldIncludeProperty: this.shouldIncludeProperty.bind(this),\n\t\t\t\t\t\t\tmode: this.context.mode,\n\t\t\t\t\t\t\tincludeDescriptions: this.context.includeDescriptions,\n\t\t\t\t\t\t\tuseDescribe: this.context.useDescribe,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSchema\n\t\t\t\t\t);\n\t\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\t} else {\n\t\t\t\t\tvalidation = \"z.record(z.string(), z.unknown())\";\n\t\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvalidation = \"z.unknown()\";\n\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t}\n\n\t\tconst result = wrapNullable(validation, nullable);\n\n\t\t// Store in cache if cacheable\n\t\tif (isCacheable) {\n\t\t\tconst cacheKey = JSON.stringify({ schema, type: this.context.schemaType, mode: this.context.mode });\n\t\t\tthis.schemaCache.set(cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { minimatch } from \"minimatch\";\nimport type { OperationFilters } from \"../types\";\n\n/**\n * Filter statistics to track which operations were included/excluded\n */\nexport interface FilterStatistics {\n\ttotalOperations: number;\n\tincludedOperations: number;\n\tfilteredByTags: number;\n\tfilteredByPaths: number;\n\tfilteredByMethods: number;\n\tfilteredByOperationIds: number;\n\tfilteredByDeprecated: number;\n}\n\n/**\n * Create a new filter statistics object with all counters initialized to zero\n */\nexport function createFilterStatistics(): FilterStatistics {\n\treturn {\n\t\ttotalOperations: 0,\n\t\tincludedOperations: 0,\n\t\tfilteredByTags: 0,\n\t\tfilteredByPaths: 0,\n\t\tfilteredByMethods: 0,\n\t\tfilteredByOperationIds: 0,\n\t\tfilteredByDeprecated: 0,\n\t};\n}\n\n/**\n * Check if a value matches any of the patterns (supports glob patterns)\n * Empty patterns array = no constraint (returns true)\n */\nfunction matchesAnyPattern(value: string | undefined, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) {\n\t\treturn false; // No constraint means \"don't use this filter\"\n\t}\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn patterns.some(pattern => minimatch(value, pattern));\n}\n\n/**\n * Check if an array contains any of the specified values\n * Empty values array = no constraint (returns false)\n */\nfunction containsAny(arr: string[] | undefined, values: string[] | undefined): boolean {\n\tif (!values || values.length === 0) {\n\t\treturn false; // No constraint means \"don't use this filter\"\n\t}\n\tif (!arr || arr.length === 0) {\n\t\treturn false;\n\t}\n\treturn values.some(value => arr.includes(value));\n}\n\n/**\n * Determine if an operation should be included based on filter criteria\n *\n * Filter logic:\n * 1. If no filters specified, include all operations\n * 2. Empty arrays are treated as \"no constraint\" (not as \"exclude all\")\n * 3. Include filters are applied first (allowlist)\n * 4. Exclude filters are applied second (blocklist)\n * 5. Exclude rules always win over include rules\n *\n * @param operation - The OpenAPI operation object\n * @param path - The operation path (e.g., \"/users/{id}\")\n * @param method - The HTTP method (e.g., \"get\", \"post\")\n * @param filters - Optional filter configuration\n * @param stats - Optional statistics object to track filtering reasons\n * @returns true if the operation should be included, false otherwise\n */\nexport function shouldIncludeOperation(\n\toperation: any,\n\tpath: string,\n\tmethod: string,\n\tfilters?: OperationFilters,\n\tstats?: FilterStatistics\n): boolean {\n\t// If no filters specified, include all operations\n\tif (!filters) {\n\t\treturn true;\n\t}\n\n\tconst methodLower = method.toLowerCase();\n\tconst operationId = operation?.operationId;\n\tconst tags = operation?.tags || [];\n\tconst deprecated = operation?.deprecated === true;\n\n\t// Apply include filters first (allowlist)\n\t// If any include filter is specified and the operation doesn't match, exclude it\n\n\t// Check includeTags\n\tif (filters.includeTags && filters.includeTags.length > 0) {\n\t\tif (!containsAny(tags, filters.includeTags)) {\n\t\t\tif (stats) stats.filteredByTags++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includePaths\n\tif (filters.includePaths && filters.includePaths.length > 0) {\n\t\tif (!matchesAnyPattern(path, filters.includePaths)) {\n\t\t\tif (stats) stats.filteredByPaths++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includeMethods\n\tif (filters.includeMethods && filters.includeMethods.length > 0) {\n\t\tconst methodsLower = filters.includeMethods.map(m => m.toLowerCase());\n\t\tif (!methodsLower.includes(methodLower)) {\n\t\t\tif (stats) stats.filteredByMethods++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includeOperationIds\n\tif (filters.includeOperationIds && filters.includeOperationIds.length > 0) {\n\t\tif (!matchesAnyPattern(operationId, filters.includeOperationIds)) {\n\t\t\tif (stats) stats.filteredByOperationIds++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Apply exclude filters second (blocklist)\n\t// If the operation matches any exclude filter, exclude it\n\n\t// Check excludeDeprecated\n\tif (filters.excludeDeprecated === true && deprecated) {\n\t\tif (stats) stats.filteredByDeprecated++;\n\t\treturn false;\n\t}\n\n\t// Check excludeTags\n\tif (filters.excludeTags && filters.excludeTags.length > 0) {\n\t\tif (containsAny(tags, filters.excludeTags)) {\n\t\t\tif (stats) stats.filteredByTags++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludePaths\n\tif (filters.excludePaths && filters.excludePaths.length > 0) {\n\t\tif (matchesAnyPattern(path, filters.excludePaths)) {\n\t\t\tif (stats) stats.filteredByPaths++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludeMethods\n\tif (filters.excludeMethods && filters.excludeMethods.length > 0) {\n\t\tconst methodsLower = filters.excludeMethods.map(m => m.toLowerCase());\n\t\tif (methodsLower.includes(methodLower)) {\n\t\t\tif (stats) stats.filteredByMethods++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludeOperationIds\n\tif (filters.excludeOperationIds && filters.excludeOperationIds.length > 0) {\n\t\tif (matchesAnyPattern(operationId, filters.excludeOperationIds)) {\n\t\t\tif (stats) stats.filteredByOperationIds++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Operation passed all filters\n\treturn true;\n}\n\n/**\n * Validate filter statistics and emit warnings for filters that matched nothing\n * Helps users debug filter configurations that might be too restrictive or contain typos\n *\n * @param stats - Filter statistics object\n * @param filters - The filter configuration to validate\n */\nexport function validateFilters(stats: FilterStatistics, filters?: OperationFilters): void {\n\tif (!filters || stats.totalOperations === 0) {\n\t\treturn;\n\t}\n\n\t// If all operations were filtered out, emit a warning\n\tif (stats.includedOperations === 0) {\n\t\tconsole.warn(\n\t\t\t`⚠️ Warning: All ${stats.totalOperations} operations were filtered out. Check your operationFilters configuration.`\n\t\t);\n\n\t\t// Provide specific guidance about which filters might be the issue\n\t\tconst filterBreakdown: string[] = [];\n\t\tif (stats.filteredByTags > 0) filterBreakdown.push(`${stats.filteredByTags} by tags`);\n\t\tif (stats.filteredByPaths > 0) filterBreakdown.push(`${stats.filteredByPaths} by paths`);\n\t\tif (stats.filteredByMethods > 0) filterBreakdown.push(`${stats.filteredByMethods} by methods`);\n\t\tif (stats.filteredByOperationIds > 0) filterBreakdown.push(`${stats.filteredByOperationIds} by operationIds`);\n\t\tif (stats.filteredByDeprecated > 0) filterBreakdown.push(`${stats.filteredByDeprecated} by deprecated flag`);\n\n\t\tif (filterBreakdown.length > 0) {\n\t\t\tconsole.warn(` Filtered: ${filterBreakdown.join(\", \")}`);\n\t\t}\n\t}\n}\n\n/**\n * Format filter statistics for display in generated output\n * Returns a formatted string suitable for inclusion in comments\n *\n * @param stats - Filter statistics object\n * @returns Formatted statistics string\n */\nexport function formatFilterStatistics(stats: FilterStatistics): string {\n\tif (stats.totalOperations === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines: string[] = [];\n\tlines.push(\"Operation Filtering:\");\n\tlines.push(` Total operations: ${stats.totalOperations}`);\n\tlines.push(` Included operations: ${stats.includedOperations}`);\n\n\tconst filteredCount =\n\t\tstats.filteredByTags +\n\t\tstats.filteredByPaths +\n\t\tstats.filteredByMethods +\n\t\tstats.filteredByOperationIds +\n\t\tstats.filteredByDeprecated;\n\n\tif (filteredCount > 0) {\n\t\tlines.push(` Filtered operations: ${filteredCount}`);\n\t\tif (stats.filteredByTags > 0) lines.push(` - By tags: ${stats.filteredByTags}`);\n\t\tif (stats.filteredByPaths > 0) lines.push(` - By paths: ${stats.filteredByPaths}`);\n\t\tif (stats.filteredByMethods > 0) lines.push(` - By methods: ${stats.filteredByMethods}`);\n\t\tif (stats.filteredByOperationIds > 0) lines.push(` - By operationIds: ${stats.filteredByOperationIds}`);\n\t\tif (stats.filteredByDeprecated > 0) lines.push(` - By deprecated: ${stats.filteredByDeprecated}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n","/**\n * Type generation mode\n * - 'inferred': Generate Zod schemas with z.infer<typeof schema> types (default)\n * - 'native': Generate native TypeScript types without Zod schemas\n */\nexport type TypeMode = \"inferred\" | \"native\";\n\n/**\n * Native enum generation type (used when typeMode is 'native')\n * - 'union': Generate union types like 'a' | 'b' | 'c' (default)\n * - 'enum': Generate TypeScript enums like enum StatusEnum { A = 'a', B = 'b' }\n */\nexport type NativeEnumType = \"union\" | \"enum\";\n\n/**\n * Common options shared by both request and response contexts\n */\ninterface CommonSchemaOptions {\n\t/**\n\t * Object validation mode\n\t * - 'strict': Uses z.strictObject() - no additional properties allowed\n\t * - 'normal': Uses z.object() - additional properties allowed\n\t * - 'loose': Uses z.looseObject() - explicitly allows additional properties\n\t */\n\tmode?: \"strict\" | \"normal\" | \"loose\";\n\n\t/**\n\t * Enum generation type\n\t * - 'zod': Uses z.enum() with inferred types (default)\n\t * - 'typescript': Uses TypeScript enums with z.enum() referencing them\n\t */\n\tenumType?: \"zod\" | \"typescript\";\n\n\t/**\n\t * Whether to add .describe() calls for better error messages\n\t * @default false\n\t */\n\tuseDescribe?: boolean;\n\n\t/**\n\t * Whether to include descriptions as JSDoc comments\n\t */\n\tincludeDescriptions?: boolean;\n}\n\n/**\n * Request-specific options that can override root-level options\n * Requests support native TypeScript type generation as an alternative to Zod schemas\n */\nexport interface RequestOptions extends CommonSchemaOptions {\n\t/**\n\t * Type generation mode\n\t * - 'inferred': Generate Zod schemas with z.infer types (default)\n\t * - 'native': Generate native TypeScript types without Zod validation\n\t */\n\ttypeMode?: TypeMode;\n\n\t/**\n\t * Native enum generation type (when typeMode is 'native')\n\t * - 'union': Generate union types (default)\n\t * - 'enum': Generate TypeScript enums\n\t */\n\tnativeEnumType?: NativeEnumType;\n}\n\n/**\n * Response-specific options that can override root-level options\n * Responses always use Zod schemas for runtime validation\n */\nexport interface ResponseOptions extends CommonSchemaOptions {\n\t// Responses don't support typeMode - always generate Zod schemas\n}\n\nexport interface OpenApiGeneratorOptions {\n\t/**\n\t * Object validation mode\n\t * - 'strict': Uses z.strictObject() - no additional properties allowed\n\t * - 'normal': Uses z.object() - additional properties allowed\n\t * - 'loose': Uses z.looseObject() - explicitly allows additional properties\n\t */\n\tmode?: \"strict\" | \"normal\" | \"loose\";\n\n\t/**\n\t * Input OpenAPI YAML file path\n\t */\n\tinput: string;\n\n\t/**\n\t * Output TypeScript file path\n\t * Optional when using string generation methods (generateString)\n\t * Required when calling generate() to write to a file\n\t */\n\toutput?: string;\n\n\t/**\n\t * Whether to include descriptions as JSDoc comments\n\t */\n\tincludeDescriptions?: boolean;\n\n\t/**\n\t * Enum generation type\n\t * - 'zod': Uses z.enum() with inferred types (default)\n\t * - 'typescript': Uses TypeScript enums with z.enum() referencing them\n\t */\n\tenumType?: \"zod\" | \"typescript\";\n\n\t/**\n\t * Whether to add .describe() calls for better error messages\n\t * @default false\n\t */\n\tuseDescribe?: boolean;\n\n\t/**\n\t * Schema filtering mode\n\t * - 'all': Generate all schemas (default)\n\t * - 'request': Only include schemas suitable for requests (excludes readOnly)\n\t * - 'response': Only include schemas suitable for responses (excludes writeOnly)\n\t */\n\tschemaType?: \"all\" | \"request\" | \"response\";\n\n\t/**\n\t * Prefix to add to all generated schema names\n\t * @example \"api\" -> \"apiUserSchema\"\n\t */\n\tprefix?: string;\n\n\t/**\n\t * Suffix to add before \"Schema\" in generated names\n\t * @example \"dto\" -> \"userDtoSchema\"\n\t */\n\tsuffix?: string;\n\n\t/**\n\t * Whether to include generation statistics in output file\n\t * @default true\n\t */\n\tshowStats?: boolean;\n\n\t/**\n\t * Native enum generation type (when typeMode is 'native')\n\t * - 'union': Generate union types (default)\n\t * - 'enum': Generate TypeScript enums with 'Enum' suffix\n\t * @default 'union'\n\t */\n\tnativeEnumType?: NativeEnumType;\n\n\t/**\n\t * Request-specific options that override root-level options\n\t * Applied when schemas are used in request contexts\n\t * Supports native TypeScript type generation\n\t */\n\trequest?: RequestOptions;\n\n\t/**\n\t * Response-specific options that override root-level options\n\t * Applied when schemas are used in response contexts\n\t * Always generates Zod schemas for runtime validation\n\t */\n\tresponse?: ResponseOptions;\n\n\t/**\n\t * Filter which operations to include/exclude from generation\n\t * Useful for generating separate schemas for different API subsets\n\t *\n\t * Filtering logic:\n\t * 1. If no filters specified, all operations are included\n\t * 2. Empty arrays are treated as \"no constraint\" (not as \"exclude all\")\n\t * 3. Include filters are applied first (allowlist)\n\t * 4. Exclude filters are applied second (blocklist)\n\t * 5. Exclude rules always win over include rules\n\t *\n\t * Supports glob patterns for paths and operationIds (e.g., \"/api/v1/**\", \"get*\")\n\t *\n\t * @example\n\t * // Only generate schemas for user-related endpoints\n\t * operationFilters: {\n\t * includeTags: [\"users\"]\n\t * }\n\t *\n\t * @example\n\t * // Generate only GET endpoints, excluding deprecated ones\n\t * operationFilters: {\n\t * includeMethods: [\"get\"],\n\t * excludeDeprecated: true\n\t * }\n\t *\n\t * @example\n\t * // Generate only v1 API endpoints\n\t * operationFilters: {\n\t * includePaths: [\"/api/v1/**\"]\n\t * }\n\t */\n\toperationFilters?: OperationFilters;\n}\n\n/**\n * Operation filtering options\n * Controls which operations from the OpenAPI spec are included in generation\n */\nexport interface OperationFilters {\n\t/**\n\t * Include only operations with these tags\n\t * If specified, only operations with at least one matching tag are included\n\t * Empty array = no constraint\n\t */\n\tincludeTags?: string[];\n\n\t/**\n\t * Exclude operations with these tags\n\t * Operations with any matching tag are excluded\n\t * Empty array = no constraint\n\t */\n\texcludeTags?: string[];\n\n\t/**\n\t * Include only operations matching these path patterns\n\t * Supports glob patterns (e.g., \"/users/**\", \"/api/v1/*\")\n\t * Empty array = no constraint\n\t */\n\tincludePaths?: string[];\n\n\t/**\n\t * Exclude operations matching these path patterns\n\t * Supports glob patterns (e.g., \"/internal/**\", \"/admin/*\")\n\t * Empty array = no constraint\n\t */\n\texcludePaths?: string[];\n\n\t/**\n\t * Include only these HTTP methods\n\t * Valid values: \"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"\n\t * Empty array = no constraint\n\t */\n\tincludeMethods?: string[];\n\n\t/**\n\t * Exclude these HTTP methods\n\t * Valid values: \"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"\n\t * Empty array = no constraint\n\t */\n\texcludeMethods?: string[];\n\n\t/**\n\t * Include only operations matching these operationId patterns\n\t * Supports glob patterns (e.g., \"getUser*\", \"*Admin\")\n\t * Empty array = no constraint\n\t */\n\tincludeOperationIds?: string[];\n\n\t/**\n\t * Exclude operations matching these operationId patterns\n\t * Supports glob patterns (e.g., \"deleteUser*\", \"*Internal\")\n\t * Empty array = no constraint\n\t */\n\texcludeOperationIds?: string[];\n\n\t/**\n\t * Whether to exclude deprecated operations\n\t * @default false\n\t */\n\texcludeDeprecated?: boolean;\n}\n\nexport interface OpenAPISchema {\n\ttype?: string | string[];\n\tformat?: string;\n\tenum?: (string | number)[];\n\tconst?: string | number | boolean | null;\n\tproperties?: Record<string, OpenAPISchema>;\n\trequired?: string[];\n\titems?: OpenAPISchema;\n\tprefixItems?: OpenAPISchema[];\n\tallOf?: OpenAPISchema[];\n\toneOf?: OpenAPISchema[];\n\tanyOf?: OpenAPISchema[];\n\t$ref?: string;\n\tnullable?: boolean;\n\tminLength?: number;\n\tmaxLength?: number;\n\tminimum?: number;\n\tmaximum?: number;\n\texclusiveMinimum?: boolean | number;\n\texclusiveMaximum?: boolean | number;\n\tmultipleOf?: number;\n\tpattern?: string;\n\tdescription?: string;\n\ttitle?: string;\n\texample?: any;\n\texamples?: any[];\n\tadditionalProperties?: boolean | OpenAPISchema;\n\tminProperties?: number;\n\tmaxProperties?: number;\n\tminItems?: number;\n\tmaxItems?: number;\n\tuniqueItems?: boolean;\n\tcontains?: OpenAPISchema;\n\tminContains?: number;\n\tmaxContains?: number;\n\tdiscriminator?: {\n\t\tpropertyName: string;\n\t\tmapping?: Record<string, string>;\n\t};\n\treadOnly?: boolean;\n\twriteOnly?: boolean;\n\tdeprecated?: boolean;\n\tdependentRequired?: Record<string, string[]>;\n\tdependencies?: Record<string, string[] | OpenAPISchema>;\n\tpatternProperties?: Record<string, OpenAPISchema>;\n\tpropertyNames?: OpenAPISchema;\n\tcontentMediaType?: string;\n\tcontentEncoding?: string;\n\tnot?: OpenAPISchema;\n\tif?: OpenAPISchema;\n\tthen?: OpenAPISchema;\n\telse?: OpenAPISchema;\n\tunevaluatedProperties?: boolean | OpenAPISchema;\n\tunevaluatedItems?: boolean | OpenAPISchema;\n}\n\nexport interface OpenAPISpec {\n\tcomponents?: {\n\t\tschemas?: Record<string, OpenAPISchema>;\n\t};\n\tpaths?: Record<string, any>;\n}\n\n/**\n * Execution mode for batch processing\n * - 'parallel': Process all specs concurrently (default, faster)\n * - 'sequential': Process specs one at a time (safer for resource constraints)\n */\nexport type ExecutionMode = \"parallel\" | \"sequential\";\n\n/**\n * Root configuration file structure\n */\nexport interface ConfigFile {\n\t/**\n\t * Global default options applied to all specs\n\t * Can be overridden by individual spec configurations\n\t */\n\tdefaults?: Partial<Omit<OpenApiGeneratorOptions, \"input\" | \"output\">>;\n\n\t/**\n\t * Array of OpenAPI specifications to process\n\t * Each spec must have input and output paths\n\t */\n\tspecs: OpenApiGeneratorOptions[];\n\n\t/**\n\t * Execution mode for batch processing\n\t * @default \"parallel\"\n\t */\n\texecutionMode?: ExecutionMode;\n}\n\n/**\n * Resolved options for a specific schema context (request or response)\n * All optional fields from RequestResponseOptions are required here\n */\nexport interface ResolvedOptions {\n\tmode: \"strict\" | \"normal\" | \"loose\";\n\tenumType: \"zod\" | \"typescript\";\n\tuseDescribe: boolean;\n\tincludeDescriptions: boolean;\n\ttypeMode: TypeMode;\n\tnativeEnumType: NativeEnumType;\n}\n\n/**\n * Helper function for type-safe config file creation\n * Provides IDE autocomplete and type checking for config files\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@cerios/openapi-to-zod';\n *\n * export default defineConfig({\n * defaults: {\n * mode: 'strict',\n * includeDescriptions: true\n * },\n * specs: [\n * { input: 'api-v1.yaml', output: 'schemas/v1.ts' },\n * { input: 'api-v2.yaml', output: 'schemas/v2.ts', mode: 'normal' }\n * ]\n * });\n * ```\n */\nexport function defineConfig(config: ConfigFile): ConfigFile {\n\treturn config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACzC,YACC,SACgB,MACA,SACf;AAZH;AAaE,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AACZ,gBAAM,sBAAN,+BAA0B,MAAM,KAAK;AAAA,EACtC;AACD;AAKO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EACvD,YAAY,SAAiB,SAAmC;AAC/D,UAAM,SAAS,yBAAyB,OAAO;AAC/C,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EACtD,YACC,SACgB,UAChB,SACC;AACD,UAAM,SAAS,wBAAwB,EAAE,GAAG,SAAS,SAAS,CAAC;AAH/C;AAIhB,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,wBAAN,cAAoC,eAAe;AAAA,EACzD,YACC,SACgB,YAChB,SACC;AACD,UAAM,SAAS,2BAA2B,EAAE,GAAG,SAAS,WAAW,CAAC;AAHpD;AAIhB,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,wBAAN,cAAoC,eAAe;AAAA,EACzD,YACC,SACgB,YAChB,SACC;AACD,UAAM,SAAS,2BAA2B,EAAE,GAAG,SAAS,WAAW,CAAC;AAHpD;AAIhB,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,yBAAN,cAAqC,sBAAsB;AAAA,EACjE,YACC,YACgB,eACf;AACD,UAAM,UAAU,cAAc,KAAK,MAAM;AACzC,UAAM,0CAA0C,OAAO,IAAI,YAAY,EAAE,eAAe,cAAc,QAAQ,CAAC;AAH/F;AAIhB,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,kBAAN,cAA8B,eAAe;AAAA,EACnD,YAAY,SAAiB,SAAmC;AAC/D,UAAM,SAAS,qBAAqB,OAAO;AAC3C,SAAK,OAAO;AAAA,EACb;AACD;AAKO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EACtD,YAAY,SAAiB,SAAmC;AAC/D,UAAM,SAAS,uBAAuB,OAAO;AAC7C,SAAK,OAAO;AAAA,EACb;AACD;;;ACvGA,qBAAmE;AACnE,uBAAmC;AACnC,kBAAsB;;;ACUf,SAAS,YAAY,KAAa,SAAiC;AACzE,MAAI,OAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAGpD,MAAI,mCAAS,QAAQ;AACpB,UAAM,SAAS,QAAQ,OAAO,YAAY;AAC1C,WAAO,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,EAC5D;AAGA,MAAI,mCAAS,QAAQ;AACpB,UAAM,SAAS,QAAQ;AACvB,WAAO,OAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,EAAE,YAAY;AAAA,EAC5E;AAEA,SAAO;AACR;AAKO,SAAS,aAAa,KAA8B;AAC1D,QAAM,cAAc,OAAO,GAAG;AAG9B,MAAI,SAAS,YACX,QAAQ,mBAAmB,GAAG,EAC9B,MAAM,OAAO,EACb,OAAO,UAAQ,KAAK,SAAS,CAAC,EAC9B,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE;AAGT,MAAI,MAAM,KAAK,MAAM,GAAG;AACvB,aAAS,IAAI,MAAM;AAAA,EACpB;AAGA,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,GAAG;AACnC,aAAS;AAAA,EACV;AAEA,SAAO;AACR;AAKO,SAAS,WAAW,KAAqB;AAC/C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,SAAO,MAAM,MAAM,SAAS,CAAC;AAC9B;;;AC7CO,SAAS,aACf,MACA,QACA,SACa;AACb,QAAM,WAAW,KAAK,SAAS,aAAa,IAAI,KAAK,QAAQ,eAAe,MAAM,IAAI,GAAG,IAAI;AAC7F,QAAM,aAAa,GAAG,YAAY,MAAM,OAAO,CAAC;AAEhD,MAAI,QAAQ,aAAa,cAAc;AAEtC,UAAM,WAAW,oBAAI,IAAY;AACjC,UAAM,cAAc,OAClB,IAAI,WAAS;AACb,UAAI,MAAM,aAAa,KAAK;AAG5B,UAAI,SAAS,IAAI,GAAG,GAAG;AACtB,YAAI,UAAU;AACd,eAAO,SAAS,IAAI,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG;AACxC;AAAA,QACD;AACA,cAAM,GAAG,GAAG,GAAG,OAAO;AAAA,MACvB;AACA,eAAS,IAAI,GAAG;AAEhB,YAAM,cAAc,OAAO,UAAU,WAAW,IAAI,KAAK,MAAM;AAC/D,aAAO,KAAK,GAAG,MAAM,WAAW;AAAA,IACjC,CAAC,EACA,KAAK,IAAI;AAEX,UAAM,WAAW,eAAe,QAAQ;AAAA,EAAO,WAAW;AAAA;AAC1D,UAAMA,cAAa,gBAAgB,UAAU,mBAAmB,QAAQ;AACxE,UAAMC,YAAW,eAAe,IAAI,qBAAqB,UAAU;AAEnE,WAAO,EAAE,UAAU,YAAAD,aAAY,UAAAC,UAAS;AAAA,EACzC;AAIA,QAAM,aAAa,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACtD,QAAM,aAAa,gBAAgB,UAAU,cAAc,UAAU;AACrE,QAAM,WAAW,eAAe,IAAI,qBAAqB,UAAU;AAEnE,SAAO,EAAE,UAAU,MAAM,YAAY,SAAS;AAC/C;;;ACrDO,SAAS,kBAAkB,KAAqB;AACtD,SAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AAC5E;AAKO,SAAS,cAAc,KAAqB;AAClD,SAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AACtD;AAKO,SAAS,YAAY,KAAqB;AAChD,SAAO,IAAI,QAAQ,SAAS,MAAM;AACnC;AAKO,SAAS,aAAa,YAAoBC,aAA6B;AAC7E,SAAOA,cAAa,GAAG,UAAU,gBAAgB;AAClD;AAKO,SAAS,WAAW,QAAgC;AAE1D,MAAI,OAAO,aAAa,MAAM;AAC7B,WAAO;AAAA,EACR;AAEA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,WAAO,OAAO,KAAK,SAAS,MAAM;AAAA,EACnC;AACA,SAAO;AACR;AAKO,SAAS,eAAe,QAA2C;AACzE,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAG/B,UAAM,cAAc,OAAO,KAAK,KAAK,OAAK,MAAM,MAAM;AACtD,WAAO;AAAA,EACR;AACA,SAAO,OAAO;AACf;AAKO,SAAS,iBAAiB,QAAgC;AAChE,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,UAAM,eAAe,OAAO,KAAK,OAAO,OAAK,MAAM,MAAM;AACzD,WAAO,aAAa,SAAS;AAAA,EAC9B;AACA,SAAO;AACR;AAKO,SAAS,eAAe,YAAoB,aAAiC,aAA8B;AACjH,MAAI,CAAC,eAAe,CAAC,YAAa,QAAO;AAEzC,QAAM,cAAc,kBAAkB,WAAW;AACjD,SAAO,GAAG,UAAU,cAAc,WAAW;AAC9C;;;ACtEO,SAAS,cACf,QACA,MACA,UAAwB,EAAE,qBAAqB,KAAK,GAC3C;AAET,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AAC1C,WAAO;AAAA,EACR;AAEA,MAAI,CAAC,QAAQ,qBAAqB;AAEjC,QAAI,OAAO,YAAY;AACtB,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AAGA,MAAI,CAAC,OAAO,eAAe,CAAC,OAAO,SAAS,CAAC,OAAO,cAAc,CAAC,OAAO,YAAY,OAAO,YAAY,QAAW;AACnH,WAAO;AAAA,EACR;AAEA,QAAM,QAAkB,CAAC;AAGzB,MAAI,OAAO,SAAS,OAAO,OAAO,UAAU,aAAa,CAAC,QAAQ,OAAO,UAAU,OAAO;AAEzF,UAAM,iBAAiB,YAAY,OAAO,KAAK,EAAE,QAAQ,MAAM,KAAK;AACpE,UAAM,KAAK,cAAc;AAAA,EAC1B;AAGA,MAAI,OAAO,eAAe,OAAO,OAAO,gBAAgB,UAAU;AAEjE,UAAM,gBAAgB,YAAY,OAAO,WAAW,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,SAAS,MAAM;AAClG,UAAM,KAAK,aAAa;AAAA,EACzB;AAGA,MAAI,OAAO,YAAY,MAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAAS,GAAG;AACpF,QAAI;AACH,YAAM,cAAc,OAAO,SAAS,IAAI,QAAM,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,IAAI;AAC3E,YAAM,KAAK,YAAY,WAAW,EAAE;AAAA,IACrC,SAAS,OAAO;AAEf,cAAQ,KAAK,gDAAgD,KAAK;AAAA,IACnE;AAAA,EACD,WAAW,OAAO,YAAY,QAAW;AACxC,QAAI;AACH,YAAM,KAAK,YAAY,KAAK,UAAU,OAAO,OAAO,CAAC,EAAE;AAAA,IACxD,SAAS,OAAO;AAEf,cAAQ,KAAK,+CAA+C,KAAK;AAAA,IAClE;AAAA,EACD;AAGA,MAAI,OAAO,YAAY;AACtB,UAAM,KAAK,aAAa;AAAA,EACzB;AAEA,MAAI,MAAM,WAAW,GAAG;AACvB,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,MAAM,KAAK,GAAG;AAClC,SAAO,OAAO,WAAW;AAAA;AAC1B;;;AC3EO,IAAM,WAAN,MAAqB;AAAA,EAI3B,YAAY,SAAiB;AAH7B,SAAQ,QAAQ,oBAAI,IAAU;AAI7B,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,KAAuB;AAC1B,QAAI,CAAC,KAAK,MAAM,IAAI,GAAG,EAAG,QAAO;AAEjC,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,UAAU,OAAW,QAAO;AAChC,SAAK,MAAM,OAAO,GAAG;AACrB,SAAK,MAAM,IAAI,KAAK,KAAK;AACzB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC3B,QAAI,KAAK,MAAM,IAAI,GAAG,GAAG;AACxB,WAAK,MAAM,OAAO,GAAG;AAAA,IACtB,WAAW,KAAK,MAAM,QAAQ,KAAK,SAAS;AAE3C,YAAM,WAAW,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC1C,UAAI,aAAa,QAAW;AAC3B,aAAK,MAAM,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACD;AACA,SAAK,MAAM,IAAI,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,IAAI,KAAiB;AACpB,WAAO,KAAK,MAAM,IAAI,GAAG;AAAA,EAC1B;AAAA,EAEA,QAAc;AACb,SAAK,MAAM,MAAM;AAAA,EAClB;AAAA,EAEA,OAAe;AACd,WAAO,KAAK,MAAM;AAAA,EACnB;AACD;;;AClCO,SAAS,wBAAwB,QAAuB,SAAwC;AAZvG;AAaC,MAAI;AAGJ,MAAI,OAAO,eAAe,OAAO,YAAY,SAAS,GAAG;AACxD,UAAM,aAAa,OAAO,YAAY,IAAI,UAAQ,QAAQ,uBAAuB,MAAM,QAAQ,aAAa,CAAC;AAC7G,iBAAa,YAAY,WAAW,KAAK,IAAI,CAAC;AAI9C,QAAI,OAAO,OAAO;AACjB,YAAM,aAAa,QAAQ,uBAAuB,OAAO,OAAO,QAAQ,aAAa;AACrF,oBAAc,SAAS,UAAU;AAAA,IAClC,WAAW,OAAO,oBAAoB,OAAO,OAAO,qBAAqB,UAAU;AAElF,YAAM,aAAa,QAAQ,uBAAuB,OAAO,kBAAkB,QAAQ,aAAa;AAChG,oBAAc,SAAS,UAAU;AAAA,IAClC;AAAA,EAED,WAAW,OAAO,OAAO;AACxB,UAAM,aAAa,QAAQ,uBAAuB,OAAO,OAAO,QAAQ,aAAa;AACrF,iBAAa,WAAW,UAAU;AAGlC,QAAI,OAAO,aAAa,QAAW;AAClC,oBAAc,QAAQ,OAAO,QAAQ;AAAA,IACtC;AACA,QAAI,OAAO,aAAa,QAAW;AAClC,oBAAc,QAAQ,OAAO,QAAQ;AAAA,IACtC;AAGA,QAAI,OAAO,gBAAgB,MAAM;AAChC,oBAAc;AAAA,IACf;AAAA,EACD,OAAO;AACN,iBAAa;AAAA,EACd;AAGA,MAAI,OAAO,UAAU;AACpB,UAAM,iBAAiB,QAAQ,uBAAuB,OAAO,UAAU,QAAQ,aAAa;AAC5F,UAAM,YAAW,YAAO,gBAAP,YAAsB;AACvC,UAAM,WAAW,OAAO;AAExB,QAAI,aAAa,QAAW;AAE3B,oBAAc,yDAAyD,cAAc,uDAAuD,QAAQ,yBAAyB,QAAQ,+CAA+C,QAAQ,QAAQ,QAAQ;AAAA,IAC7P,OAAO;AAEN,oBAAc,uCAAuC,cAAc,uCAAuC,QAAQ,6CAA6C,QAAQ;AAAA,IACxK;AAAA,EACD;AAKA,MAAI,OAAO,qBAAqB,SAAS,OAAO,eAAe,OAAO,YAAY,SAAS,KAAK,CAAC,OAAO,OAAO;AAE9G,UAAM,cAAc,OAAO,YAAY;AACvC,kBAAc,kCAAkC,WAAW;AAAA,EAC5D;AAGA,SAAO,eAAe,YAAY,OAAO,aAAa,QAAQ,WAAW;AAC1E;;;AC7DO,SAAS,cACf,SACA,eACAC,aACA,SACA,SACA,eACS;AACT,MAAI,eAAe;AAElB,QAAI,kBAAkB;AACtB,SAAI,mCAAS,yBAAwB,QAAQ,6BAA6B;AACzE,wBAAkB,QAAQ,4BAA4B,QAAQ,sBAAsB,OAAO;AAAA,IAC5F;AAGA,QAAIC,iBAAgB,gBAAgB,IAAI,OAAK,QAAQ,uBAAuB,GAAG,aAAa,CAAC;AAC7F,QAAI,mCAAS,aAAa;AACzB,MAAAA,iBAAgBA,eAAc,IAAI,OAAM,EAAE,SAAS,YAAY,IAAI,IAAI,GAAG,CAAC,wBAAyB;AAAA,IACrG;AACA,UAAMC,SAAQ,yBAAyB,aAAa,OAAOD,eAAc,KAAK,IAAI,CAAC;AACnF,WAAO,aAAaC,QAAOF,WAAU;AAAA,EACtC;AAEA,MAAI,gBAAgB,QAAQ,IAAI,OAAK,QAAQ,uBAAuB,GAAG,aAAa,CAAC;AACrF,MAAI,mCAAS,aAAa;AACzB,oBAAgB,cAAc,IAAI,OAAM,EAAE,SAAS,YAAY,IAAI,IAAI,GAAG,CAAC,wBAAyB;AAAA,EACrG;AACA,QAAM,QAAQ,YAAY,cAAc,KAAK,IAAI,CAAC;AAClD,SAAO,aAAa,OAAOA,WAAU;AACtC;AAKO,SAAS,cACf,SACAA,aACA,SACA,eACS;AACT,MAAI,QAAQ,WAAW,GAAG;AACzB,UAAM,eAAe,QAAQ,uBAAuB,QAAQ,CAAC,GAAG,eAAe,KAAK;AACpF,WAAO,aAAa,cAAcA,WAAU;AAAA,EAC7C;AAGA,QAAM,aAAa,QAAQ,MAAM,OAAK,EAAE,SAAS,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK;AAE9F,QAAM,gBAAgB,QAAQ,IAAI,OAAK,QAAQ,uBAAuB,GAAG,eAAe,KAAK,CAAC;AAE9F,MAAI,YAAY;AAEf,QAAIG,UAAS,cAAc,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC9C,MAAAA,UAAS,GAAGA,OAAM,UAAU,cAAc,CAAC,CAAC;AAAA,IAC7C;AACA,WAAO,aAAaA,SAAQH,WAAU;AAAA,EACvC;AAGA,MAAI,SAAS,cAAc,CAAC;AAC5B,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC9C,aAAS,GAAG,MAAM,QAAQ,cAAc,CAAC,CAAC;AAAA,EAC3C;AACA,SAAO,aAAa,QAAQA,WAAU;AACvC;;;AC5EO,SAAS,yBAAyB,QAAuB,OAAgB,aAA8B;AAC7G,MAAI,aAAa,QAAQ,qBAAqB;AAG9C,MAAI,OAAO,YAAY,QAAW;AACjC,UAAM,cAAc,OAAO,qBAAqB;AAChD,kBAAc,cAAc,OAAO,OAAO,OAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EAC9E,WAAW,OAAO,OAAO,qBAAqB,UAAU;AAEvD,kBAAc,OAAO,OAAO,gBAAgB;AAAA,EAC7C;AAGA,MAAI,OAAO,YAAY,QAAW;AACjC,UAAM,cAAc,OAAO,qBAAqB;AAChD,kBAAc,cAAc,OAAO,OAAO,OAAO,MAAM,QAAQ,OAAO,OAAO;AAAA,EAC9E,WAAW,OAAO,OAAO,qBAAqB,UAAU;AAEvD,kBAAc,OAAO,OAAO,gBAAgB;AAAA,EAC7C;AAEA,MAAI,OAAO,eAAe,QAAW;AACpC,kBAAc,eAAe,OAAO,UAAU;AAAA,EAC/C;AAGA,SAAO,eAAe,YAAY,OAAO,aAAa,WAAW;AAClE;;;AC5BA,SAAS,uBAAuB,UAA0B;AAEzD,QAAM,kBAAkB;AACxB,SAAO,gBAAgB,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,QAAQ;AAC7E;AAMO,SAAS,qBACf,QACA,wBACA,eACS;AACT,MAAI,CAAC,OAAO,cAAc;AACzB,WAAO;AAAA,EACR;AAEA,MAAI,SAAS;AACb,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACrE,QAAI,MAAM,QAAQ,UAAU,GAAG;AAE9B,UAAI,WAAW,WAAW,GAAG;AAC5B;AAAA,MACD;AAGA,YAAM,aAAa,uBAAuB,IAAI;AAC9C,YAAM,aAAa,WACjB,IAAI,OAAK;AACT,cAAM,UAAU,uBAAuB,CAAC;AACxC,eAAO,OAAO,OAAO,iCAAiC,CAAC;AAAA,MACxD,CAAC,EACA,KAAK,MAAQ;AAEf,gBAAU;AAAA,UACH,UAAU;AAAA;AAAA,MAEd,UAAU;AAAA;AAAA;AAAA;AAAA,yBAIS,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,IAK3B,WAAW,wBAAwB;AAElC,YAAM,YAA2B,EAAE,GAAG,YAAY,MAAM,WAAW,QAAQ,SAAS;AACpF,YAAM,sBAAsB,uBAAuB,WAAW,aAAa;AAC3E,YAAM,aAAa,uBAAuB,IAAI;AAE9C,gBAAU;AAAA,UACH,UAAU;AAAA,yBACK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKnB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,IAK3B;AAAA,EACD;AACA,SAAO;AACR;AAKO,SAAS,yBAAyB,QAA+B;AACvE,QAAM,aAAuB,CAAC;AAG9B,MAAI,OAAO,YAAY;AACtB,eAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,YAAM,aAAa,uBAAuB,IAAI;AAC9C,UAAI,WAAW,MAAM;AACpB,mBAAW,KAAK,UAAU,UAAU,SAAS,WAAW,IAAI,GAAG;AAAA,MAChE;AACA,UAAI,WAAW,UAAU,QAAW;AACnC,cAAM,QAAQ,OAAO,WAAW,UAAU,WAAW,IAAI,WAAW,KAAK,MAAM,WAAW;AAC1F,mBAAW,KAAK,GAAG,UAAU,QAAQ,KAAK,EAAE;AAAA,MAC7C;AACA,UAAI,WAAW,YAAY,QAAW;AACrC,mBAAW,KAAK,GAAG,UAAU,OAAO,WAAW,OAAO,EAAE;AAAA,MACzD;AACA,UAAI,WAAW,YAAY,QAAW;AACrC,mBAAW,KAAK,GAAG,UAAU,OAAO,WAAW,OAAO,EAAE;AAAA,MACzD;AAAA,IACD;AAAA,EACD;AAGA,MAAI,OAAO,UAAU;AACpB,eAAW,QAAQ,OAAO,UAAU;AACnC,iBAAW,KAAK,GAAG,uBAAuB,IAAI,CAAC,gBAAgB;AAAA,IAChE;AAAA,EACD;AAEA,SAAO,WAAW,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI;AAC1D;AAKO,SAAS,8BAA8B,QAA+B;AAC5E,QAAM,SAAmB,CAAC;AAG1B,MAAI,OAAO,UAAU;AACpB,eAAW,QAAQ,OAAO,UAAU;AACnC,aAAO,KAAK,GAAG,uBAAuB,IAAI,CAAC,gBAAgB;AAAA,IAC5D;AAAA,EACD;AAGA,MAAI,OAAO,YAAY;AACtB,eAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,YAAM,aAAa,uBAAuB,IAAI;AAC9C,UAAI,WAAW,YAAY,QAAW;AACrC,eAAO,KAAK,GAAG,UAAU,qBAAqB,UAAU,OAAO,WAAW,OAAO,EAAE;AAAA,MACpF;AACA,UAAI,WAAW,YAAY,QAAW;AACrC,eAAO,KAAK,GAAG,UAAU,qBAAqB,UAAU,OAAO,WAAW,OAAO,EAAE;AAAA,MACpF;AAAA,IACD;AAAA,EACD;AAEA,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,MAAM,IAAI;AAClD;AAMO,SAAS,mBAAmB,QAA+B;AACjE,MAAI,CAAC,OAAO,MAAO,CAAC,OAAO,QAAQ,CAAC,OAAO,MAAO;AACjD,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,yBAAyB,OAAO,EAAE;AAEtD,MAAI,OAAO,QAAQ,OAAO,MAAM;AAE/B,UAAM,iBAAiB,8BAA8B,OAAO,IAAI;AAChE,UAAMI,kBAAiB,8BAA8B,OAAO,IAAI;AAGhE,UAAM,oBAAoB,OAAO,KAAK,YAAY,CAAC;AACnD,UAAMC,qBAAoB,OAAO,KAAK,YAAY,CAAC;AAEnD,WAAO;AAAA,4BACmB,WAAW;AAAA;AAAA;AAAA,wBAGf,cAAc;AAAA;AAAA,OAGhC,kBAAkB,SAAS,IACxB;AAAA,gCACuB,KAAK,UAAU,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,SAKxD;AAAA;AAAA,MAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBASmBD,eAAc;AAAA;AAAA,OAGhCC,mBAAkB,SAAS,IACxB;AAAA,gCACuB,KAAK,UAAUA,kBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,SAKxD;AAAA;AAAA,MAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ;AAEA,MAAI,OAAO,MAAM;AAEhB,UAAM,iBAAiB,8BAA8B,OAAO,IAAI;AAChE,UAAM,oBAAoB,OAAO,KAAK,YAAY,CAAC;AAEnD,WAAO;AAAA,4BACmB,WAAW;AAAA;AAAA,wBAEf,cAAc;AAAA;AAAA,OAGhC,kBAAkB,SAAS,IACxB;AAAA,4BACmB,KAAK,UAAU,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,SAKpD;AAAA;AAAA,MAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ;AAGA,MAAI,CAAC,OAAO,KAAM,QAAO;AACzB,QAAM,iBAAiB,8BAA8B,OAAO,IAAI;AAChE,QAAM,oBAAoB,OAAO,KAAK,YAAY,CAAC;AAEnD,SAAO;AAAA,2BACmB,WAAW;AAAA;AAAA,uBAEf,cAAc;AAAA;AAAA,MAGhC,kBAAkB,SAAS,IACxB;AAAA,2BACmB,KAAK,UAAU,iBAAiB,CAAC;AAAA;AAAA;AAAA;AAAA,QAKpD;AAAA;AAAA,KAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASJ;AAMO,SAAS,0BAA0B,QAA+B;AACxE,MAAI,CAAC,OAAO,mBAAmB;AAC9B,WAAO;AAAA,EACR;AAEA,MAAI,SAAS;AACb,aAAW,CAAC,MAAM,aAAa,KAAK,OAAO,QAAQ,OAAO,iBAAiB,GAAG;AAE7E,QAAI,cAAc,WAAW,GAAG;AAC/B;AAAA,IACD;AAEA,UAAM,aAAa,uBAAuB,IAAI;AAC9C,UAAM,aAAa,cACjB,IAAI,QAAM;AACV,YAAM,WAAW,uBAAuB,EAAE;AAC1C,aAAO,OAAO,QAAQ,iCAAiC,EAAE;AAAA,IAC1D,CAAC,EACA,KAAK,MAAQ;AAEf,cAAU;AAAA,SACH,UAAU;AAAA;AAAA,KAEd,UAAU;AAAA;AAAA;AAAA;AAAA,wBAIS,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B;AAEA,SAAO;AACR;;;ACnTA,SAAS,aAAa,UAA2B;AAEhD,QAAM,kBAAkB;AACxB,SAAO,CAAC,gBAAgB,KAAK,QAAQ;AACtC;AAKA,SAASC,wBAAuB,UAA0B;AACzD,SAAO,aAAa,QAAQ,IAAI,QAAQ,QAAQ,OAAO,OAAO,QAAQ;AACvE;AAeO,SAAS,qBACf,QACA,SACA,eACS;AACT,QAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAC9C,QAAM,aAAuB,CAAC;AAG9B,MAAI,OAAO,YAAY;AACtB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAEvE,UAAI,CAAC,QAAQ,sBAAsB,UAAU,GAAG;AAC/C;AAAA,MACD;AAEA,YAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,YAAM,YAAY,QAAQ,uBAAuB,YAAY,aAAa;AAG1E,YAAM,iBAAiB,aAAa,QAAQ,IAAI,IAAI,QAAQ,MAAM;AAClE,UAAI,cAAc,KAAK,cAAc,KAAK,SAAS;AACnD,UAAI,CAAC,YAAY;AAChB,uBAAe;AAAA,MAChB;AAGA,YAAM,QAAQ,cAAc,YAAY,UAAU,EAAE,qBAAqB,QAAQ,oBAAoB,CAAC;AACtG,UAAI,OAAO;AACV,mBAAW,KAAK,GAAG,MAAM,QAAQ,CAAC;AAAA,EAAK,WAAW,EAAE;AAAA,MACrD,OAAO;AACN,mBAAW,KAAK,WAAW;AAAA,MAC5B;AAAA,IACD;AAAA,EACD;AAGA,MAAI;AAGJ,MAAI,OAAO,yBAAyB,OAAO;AAC1C,mBAAe;AAAA,EAChB,OAAO;AAEN,YAAQ,QAAQ,MAAM;AAAA,MACrB,KAAK;AACJ,uBAAe;AACf;AAAA,MACD,KAAK;AACJ,uBAAe;AACf;AAAA,MACD;AACC,uBAAe;AAAA,IACjB;AAAA,EACD;AAEA,MAAI,YAAY,GAAG,YAAY;AAAA,EAAO,WAAW,KAAK,KAAK,CAAC;AAAA;AAG5D,MAAI,OAAO,yBAAyB,QAAW;AAC9C,QAAI,OAAO,OAAO,yBAAyB,UAAU;AAEpD,YAAM,mBAAmB,QAAQ,uBAAuB,OAAO,sBAAsB,aAAa;AAClG,mBAAa,aAAa,gBAAgB;AAAA,IAC3C,WAAW,OAAO,yBAAyB,MAAM;AAEhD,mBAAa;AAAA,IACd;AAAA,EAED,WAAW,OAAO,mBAAmB;AAGpC,iBAAa;AAAA,EACd;AAGA,MAAI,OAAO,kBAAkB,UAAa,OAAO,kBAAkB,QAAW;AAC7E,UAAM,aAAuB,CAAC;AAC9B,QAAI,OAAO,kBAAkB,QAAW;AACvC,iBAAW,KAAK,8BAA8B,OAAO,aAAa,EAAE;AAAA,IACrE;AACA,QAAI,OAAO,kBAAkB,QAAW;AACvC,iBAAW,KAAK,8BAA8B,OAAO,aAAa,EAAE;AAAA,IACrE;AACA,UAAM,YAAY,WAAW,KAAK,MAAM;AACxC,QAAI,UAAU;AACd,QAAI,OAAO,kBAAkB,UAAa,OAAO,kBAAkB,QAAW;AAC7E,iBAAW,qBAAqB,OAAO,aAAa,QAAQ,OAAO,aAAa;AAAA,IACjF,WAAW,OAAO,kBAAkB,QAAW;AAC9C,iBAAW,sBAAsB,OAAO,aAAa,IAAI,OAAO,kBAAkB,IAAI,aAAa,YAAY;AAAA,IAChH,OAAO;AACN,iBAAW,qBAAqB,OAAO,aAAa,IAAI,OAAO,kBAAkB,IAAI,aAAa,YAAY;AAAA,IAC/G;AACA,iBAAa,oBAAoB,SAAS,iBAAiB,OAAO;AAAA,EACnE;AAGA,QAAM,eAAe,IAAI,IAAI,OAAO,KAAK,OAAO,cAAc,CAAC,CAAC,CAAC;AACjE,QAAM,qBAAqB,OAAO,YAAY,CAAC,GAAG,OAAO,UAAQ,CAAC,aAAa,IAAI,IAAI,CAAC;AACxF,MAAI,kBAAkB,SAAS,GAAG;AAEjC,QAAI,CAAC,UAAU,SAAS,YAAY,GAAG;AACtC,mBAAa;AAAA,IACd;AACA,UAAM,iBAAiB,kBAAkB,IAAI,UAAQ,GAAGA,wBAAuB,IAAI,CAAC,gBAAgB,EAAE,KAAK,MAAM;AACjH,UAAM,WAAW,kBAAkB,KAAK,IAAI;AAC5C,iBAAa,oBAAoB,cAAc,0CAA0C,QAAQ;AAAA,EAClG;AAGA,MAAI,OAAO,mBAAmB;AAC7B,UAAMC,gBAAe,OAAO,KAAK,OAAO,cAAc,CAAC,CAAC;AACxD,UAAM,kBAAkB,WAAW,KAAK,UAAUA,aAAY,CAAC;AAC/D,UAAM,WAAW,OAAO,QAAQ,OAAO,iBAAiB;AAGxD,UAAM,iBAAiB,SAAS,IAAI,CAAC,CAAC,SAAS,aAAa,OAAO;AAAA,MAClE;AAAA,MACA,gBAAgB,QAAQ,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAAA,MAClE,WAAW,QAAQ,uBAAuB,eAAe,aAAa;AAAA,IACvE,EAAE;AAGF,iBAAa;AAAA,6BACc,eAAe;AAAA,sBACtB,KAAK,UAAU,eAAe,IAAI,QAAM,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;AAAA,sBACxE,eAAe,IAAI,OAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BpE;AAGA,MAAI,OAAO,eAAe;AACzB,UAAM,aAAa,OAAO,cAAc,YAAY;AACpD,UAAM,eAAe,OAAO,cAAc,cAAc;AACxD,UAAM,eAAe,OAAO,cAAc,cAAc;AAExD,QAAI,cAAc,gBAAgB,cAAc;AAC/C,YAAM,iBACL,cAAc,OAAO,cAAc,UAChC,OAAO,cAAc,QAAQ,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,IACvE;AACJ,YAAM,SAAS,OAAO,cAAc;AACpC,YAAM,SAAS,OAAO,cAAc;AAEpC,mBAAa;AAAA,MACV,iBAAiB,oBAAoB,cAAc,OAAO,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,OAM5D,aACG;AAAA;AAAA,2CAEkC,OAAO,cAAc,OAAO;AAAA;AAAA,SAG9D,EACJ;AAAA;AAAA,OAGC,eACG;AAAA,wBACe,MAAM;AAAA,wCACU,MAAM;AAAA;AAAA,SAGrC,EACJ;AAAA;AAAA,OAGC,eACG;AAAA,wBACe,MAAM;AAAA,uCACS,MAAM;AAAA;AAAA,SAGpC,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWH;AAAA,EACD;AAGA,eAAa,qBAAqB,QAAQ,QAAQ,wBAAwB,aAAa;AAGvF,eAAa,0BAA0B,MAAM;AAG7C,eAAa,mBAAmB,MAAM;AAEtC,SAAO;AACR;;;AC/PA,IAAM,gBAAgB,IAAI,SAAyB,GAAI;AAEvD,IAAM,aAAqC;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,iBAAiB;AAAA,EACjB,UACC;AAAA,EACD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UACC;AAAA,EACD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBACC;AAAA,EACD,yBACC;AACF;AAKO,SAAS,yBAAyB,QAAuB,aAA8B;AAE7F,MAAI,aAAa,WAAW,OAAO,UAAU,EAAE,KAAK;AAGpD,MAAI,OAAO,cAAc,QAAW;AACnC,kBAAc,QAAQ,OAAO,SAAS;AAAA,EACvC;AACA,MAAI,OAAO,cAAc,QAAW;AACnC,kBAAc,QAAQ,OAAO,SAAS;AAAA,EACvC;AAGA,MAAI,OAAO,SAAS;AACnB,QAAI,iBAAiB,cAAc,IAAI,OAAO,OAAO;AACrD,QAAI,mBAAmB,QAAW;AACjC,uBAAiB,cAAc,OAAO,OAAO;AAC7C,oBAAc,IAAI,OAAO,SAAS,cAAc;AAAA,IACjD;AACA,kBAAc,WAAW,cAAc;AAAA,EACxC;AAGA,MAAI,OAAO,mBAAmB,CAAC,OAAO,QAAQ;AAC7C,YAAQ,OAAO,iBAAiB;AAAA,MAC/B,KAAK;AACJ,qBAAa;AACb;AAAA,MACD,KAAK;AACJ,qBAAa;AACb;AAAA,MACD,KAAK;AAEJ,qBACC;AACD;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEJ,qBAAa;AACb;AAAA,MACD;AAEC,qBAAa,0CAA0C,OAAO,eAAe;AAAA,IAC/E;AAGA,QAAI,OAAO,cAAc,QAAW;AACnC,oBAAc,QAAQ,OAAO,SAAS;AAAA,IACvC;AACA,QAAI,OAAO,cAAc,QAAW;AACnC,oBAAc,QAAQ,OAAO,SAAS;AAAA,IACvC;AACA,QAAI,OAAO,SAAS;AACnB,UAAI,iBAAiB,cAAc,IAAI,OAAO,OAAO;AACrD,UAAI,mBAAmB,QAAW;AACjC,yBAAiB,cAAc,OAAO,OAAO;AAC7C,sBAAc,IAAI,OAAO,SAAS,cAAc;AAAA,MACjD;AACA,oBAAc,WAAW,cAAc;AAAA,IACxC;AAAA,EACD,WAAW,OAAO,kBAAkB;AAEnC,UAAM,YAAY,OAAO;AACzB,QAAI,cAAc,oBAAoB;AACrC,oBAAc;AAAA,IACf,WAAW,cAAc,qBAAqB,cAAc,YAAY;AAEvE,oBAAc;AAAA,IACf,WAAW,cAAc,sBAAsB,cAAc,wBAAwB,cAAc,aAAa;AAE/G,oBAAc;AAAA,IACf,WAAW,cAAc,aAAa;AAErC,oBAAc;AAAA,IACf,WAAW,cAAc,cAAc;AAEtC,oBAAc;AAAA,IACf;AAAA,EAED;AAGA,SAAO,eAAe,YAAY,OAAO,aAAa,WAAW;AAClE;;;ACrGO,IAAM,qBAAN,MAAM,mBAAkB;AAAA,EAc9B,YAAY,SAAmC;AAX/C;AAAA,SAAQ,qBAAqB,oBAAI,IAA2B;AAE5D;AAAA,SAAQ,cAAc,IAAI,SAAyB,GAAG;AAUrD,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,QAAgC;AACrD,UAAM,OAAO,mBAAkB,gBAAgB,KAAK,QAAQ,UAAU;AACtE,WAAO,KAAK,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAsC;AACnE,QAAI,OAAO,MAAM;AAEhB,aAAO;AAAA,IACR;AAEA,QAAI,OAAO,YAAY;AACtB,aAAO,KAAK,uBAAuB,MAAM;AAAA,IAC1C;AAEA,QAAI,OAAO,SAAS,WAAW,OAAO,SAAS,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,YAAY;AAC3G,aAAO;AAAA,QACN,GAAG;AAAA,QACH,OAAO,KAAK,uBAAuB,OAAO,KAAK;AAAA,MAChD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,QAAsC;AAhFtE;AAkFE,UAAM,WAAW,OAAO,aAAa,OAAO,KAAK,OAAO,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;AACvF,UAAM,WAAW,GAAG,KAAK,QAAQ,UAAU,IAAI,OAAO,QAAQ,SAAS,IAAI,QAAQ,MAAI,YAAO,aAAP,mBAAiB,KAAK,SAAQ,EAAE;AACvH,UAAM,SAAS,KAAK,mBAAmB,IAAI,QAAQ;AACnD,QAAI,QAAQ;AACX,aAAO;AAAA,IACR;AAEA,QAAI,CAAC,OAAO,YAAY;AACvB,aAAO;AAAA,IACR;AAEA,UAAM,qBAAoD,CAAC;AAC3D,UAAM,mBAA6B,CAAC;AAEpC,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACvE,UAAI,CAAC,KAAK,sBAAsB,UAAU,GAAG;AAC5C;AAAA,MACD;AAGA,UAAI,qBAAqB;AAEzB,UAAI,WAAW,SAAS,YAAY,WAAW,YAAY;AAE1D,6BAAqB,KAAK,uBAAuB,UAAU;AAAA,MAC5D,WACC,WAAW,SAAS,WACpB,WAAW,SACX,OAAO,WAAW,UAAU,YAC5B,WAAW,MAAM,YAChB;AAED,6BAAqB;AAAA,UACpB,GAAG;AAAA,UACH,OAAO,KAAK,uBAAuB,WAAW,KAAK;AAAA,QACpD;AAAA,MACD,WAAW,WAAW,SAAS,WAAW,SAAS,WAAW,OAAO;AAEpE,YAAI,WAAW,OAAO;AACrB,+BAAqB;AAAA,YACpB,GAAG;AAAA,YACH,OAAO,WAAW,MAAM,IAAI,OAAK,KAAK,sBAAsB,CAAC,CAAC;AAAA,UAC/D;AAAA,QACD,WAAW,WAAW,OAAO;AAC5B,+BAAqB;AAAA,YACpB,GAAG;AAAA,YACH,OAAO,WAAW,MAAM,IAAI,OAAK,KAAK,sBAAsB,CAAC,CAAC;AAAA,UAC/D;AAAA,QACD,WAAW,WAAW,OAAO;AAC5B,+BAAqB;AAAA,YACpB,GAAG;AAAA,YACH,OAAO,WAAW,MAAM,IAAI,OAAK,KAAK,sBAAsB,CAAC,CAAC;AAAA,UAC/D;AAAA,QACD;AAAA,MACD;AAEA,yBAAmB,QAAQ,IAAI;AAG/B,WAAI,YAAO,aAAP,mBAAiB,SAAS,WAAW;AACxC,yBAAiB,KAAK,QAAQ;AAAA,MAC/B;AAAA,IACD;AAEA,UAAM,SAAS;AAAA,MACd,GAAG;AAAA,MACH,YAAY;AAAA,MACZ,UAAU,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,IAC5D;AAGA,SAAK,mBAAmB,IAAI,UAAU,MAAM;AAC5C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,SAAiC,SAA2C;AAG/G,UAAM,gBAAiC,CAAC;AAExC,eAAW,CAAC,GAAG,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAErD,YAAM,iBAAiB,QAAQ,KAAK,OAAK;AACxC,YAAI,EAAE,MAAM;AAEX,iBAAO,EAAE,SAAS,aAAa,EAAE,KAAK,SAAS,SAAS;AAAA,QACzD;AACA,eAAO;AAAA,MACR,CAAC;AAED,UAAI,gBAAgB;AACnB,sBAAc,KAAK,cAAc;AAAA,MAClC,OAAO;AAEN,sBAAc,KAAK,EAAE,MAAM,UAAU,CAAC;AAAA,MACvC;AAAA,IACD;AAGA,eAAW,UAAU,SAAS;AAC7B,UAAI,CAAC,cAAc,SAAS,MAAM,GAAG;AACpC,sBAAc,KAAK,MAAM;AAAA,MAC1B;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,YAA4B;AArMxD;AAsME,UAAM,UAAS,gBAAK,QAAQ,KAAK,eAAlB,mBAA8B,YAA9B,mBAAwC;AACvD,QAAI,CAAC,OAAQ,QAAO;AAGpB,QACC,OAAO,SACP,OAAO,MAAM,WAAW,KACxB,OAAO,MAAM,CAAC,EAAE,QAChB,CAAC,OAAO,cACR,CAAC,OAAO,SACR,CAAC,OAAO,OACP;AACD,YAAM,aAAa,WAAW,OAAO,MAAM,CAAC,EAAE,IAAI;AAElD,aAAO,KAAK,mBAAmB,UAAU;AAAA,IAC1C;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,YAAoB,UAA2B;AA7N/E;AA8NE,UAAM,gBAAe,gBAAK,QAAQ,KAAK,eAAlB,mBAA8B,YAA9B,mBAAwC;AAC7D,QAAI,CAAC,aAAc,QAAO;AAG1B,QAAI,aAAa,SAAS,aAAa,MAAM,WAAW,KAAK,aAAa,MAAM,CAAC,EAAE,MAAM;AACxF,YAAM,cAAc,WAAW,aAAa,MAAM,CAAC,EAAE,IAAI;AAEzD,aAAO,gBAAgB;AAAA,IACxB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAuB,eAAgC;AACrF,QAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,GAAG;AAChC,aAAO;AAAA,IACR;AACA,UAAM,eAAe,OAAO,KAAK,OAAO,OAAK,MAAM,MAAM;AACzD,UAAM,UAAU,aAAa,IAAI,UAAQ;AACxC,YAAM,aAAa,EAAE,GAAG,QAAQ,KAAK;AACrC,aAAO,KAAK,uBAAuB,YAAY,aAAa;AAAA,IAC7D,CAAC;AACD,WAAO,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,YAAoB,QAA+B;AAErF,UAAM,iBAAiB,oBAAI,IAAY;AAGvC,QAAI,OAAO,YAAY;AACtB,iBAAW,YAAY,OAAO,KAAK,OAAO,UAAU,GAAG;AACtD,uBAAe,IAAI,QAAQ;AAAA,MAC5B;AAAA,IACD;AAGA,UAAM,8BAA8B,CAAC,YAA8B;AAzQrE;AA0QG,UAAI,CAAC,QAAS;AACd,iBAAW,aAAa,SAAS;AAChC,YAAI,UAAU,YAAY;AACzB,qBAAW,YAAY,OAAO,KAAK,UAAU,UAAU,GAAG;AACzD,2BAAe,IAAI,QAAQ;AAAA,UAC5B;AAAA,QACD;AAEA,YAAI,UAAU,MAAM;AACnB,gBAAM,aAAY,gBAAK,QAAQ,KAAK,eAAlB,mBAA8B,YAA9B,mBAAwC,UAAU,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC7F,cAAI,uCAAW,YAAY;AAC1B,uBAAW,YAAY,OAAO,KAAK,UAAU,UAAU,GAAG;AACzD,6BAAe,IAAI,QAAQ;AAAA,YAC5B;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AACA,gCAA4B,OAAO,KAAK;AACxC,gCAA4B,OAAO,KAAK;AACxC,gCAA4B,OAAO,KAAK;AAExC,UAAM,oBAAoB,WAAW,KAAK,UAAU,CAAC,GAAG,cAAc,CAAC,CAAC;AAIxE,QAAI,qBAAqB;AACzB,QAAI,WAAW,SAAS,UAAU,KAAK,WAAW,SAAS,sBAAsB,GAAG;AAInF,2BAAqB;AAAA,IACtB,WAAW,WAAW,SAAS,SAAS,GAAG;AAE1C,2BAAqB,GAAG,UAAU;AAAA,IACnC;AAEA,QAAI,OAAO,0BAA0B,OAAO;AAE3C,aAAO,GAAG,kBAAkB,kDAAkD,iBAAiB;AAAA,IAChG,WAAW,OAAO,OAAO,0BAA0B,UAAU;AAE5D,YAAM,eAAe,KAAK,uBAAuB,OAAO,qBAAqB;AAC7E,aAAO,GAAG,kBAAkB,oDAAoD,iBAAiB,2BAA2B,YAAY;AAAA,IACzI;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,QAAuB,eAAwB,aAAa,OAAe;AA9TnG;AAiUE,UAAM,cAAc,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAS,CAAC,OAAO,SAAS,CAAC,OAAO,SAAS,CAAC;AACxF,QAAI,aAAa;AAChB,YAAM,WAAW,KAAK,UAAU,EAAE,QAAQ,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,QAAQ,KAAK,CAAC;AAClG,YAAM,SAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,UAAI,QAAQ;AACX,eAAO;AAAA,MACR;AAAA,IACD;AAGA,SAAK,KAAK,QAAQ,eAAe,aAAa,KAAK,QAAQ,eAAe,eAAe,OAAO,YAAY;AAC3G,eAAS,KAAK,uBAAuB,MAAM;AAAA,IAC5C;AAEA,UAAM,WAAW,WAAW,MAAM;AAGlC,QAAI,iBAAiB,MAAM,GAAG;AAC7B,YAAM,QAAQ,KAAK,uBAAuB,QAAQ,aAAa;AAC/D,aAAO,aAAa,OAAO,QAAQ;AAAA,IACpC;AAGA,QAAI,OAAO,MAAM;AAChB,YAAM,UAAU,WAAW,OAAO,IAAI;AAEtC,YAAM,kBAAkB,KAAK,mBAAmB,OAAO;AAGvD,UAAI,iBAAiB,YAAY,iBAAiB,CAAC,YAAY;AAC9D,YAAI,CAAC,KAAK,QAAQ,mBAAmB,IAAI,aAAa,GAAG;AACxD,eAAK,QAAQ,mBAAmB,IAAI,eAAe,oBAAI,IAAI,CAAC;AAAA,QAC7D;AACA,mBAAK,QAAQ,mBAAmB,IAAI,aAAa,MAAjD,mBAAoD,IAAI;AAAA,MACzD;AAEA,YAAM,aAAa,GAAG,YAAY,iBAAiB,KAAK,QAAQ,aAAa,CAAC;AAG9E,UAAI,iBAAiB,KAAK,uBAAuB,eAAe,OAAO,GAAG;AAEzE,cAAM,aAAa,8BAA8B,UAAU;AAC3D,eAAO,aAAa,YAAY,QAAQ;AAAA,MACzC;AAEA,aAAO,aAAa,YAAY,QAAQ;AAAA,IACzC;AAGA,QAAI,OAAO,UAAU,QAAW;AAC/B,YAAM,eAAe,OAAO,OAAO,UAAU,WAAW,IAAI,OAAO,KAAK,MAAM,OAAO;AACrF,YAAM,aAAa,aAAa,YAAY;AAC5C,aAAO,aAAa,YAAY,QAAQ;AAAA,IACzC;AAGA,QAAI,OAAO,MAAM;AAChB,YAAM,aAAa,OAAO,KAAK,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC3D,YAAM,UAAU,WAAW,UAAU;AACrC,aAAO,aAAa,SAAS,QAAQ;AAAA,IACtC;AAGA,QAAI,OAAO,OAAO;AACjB,UAAI,cAAc;AAAA,QACjB,OAAO;AAAA,QACP;AAAA,QACA,EAAE,wBAAwB,KAAK,uBAAuB,KAAK,IAAI,EAAE;AAAA,QACjE;AAAA,MACD;AAGA,UAAI,OAAO,0BAA0B,QAAW;AAC/C,sBAAc,KAAK,2BAA2B,aAAa,MAAM;AAAA,MAClE;AAEA,aAAO;AAAA,IACR;AAGA,QAAI,OAAO,OAAO;AACjB,YAAM,mBAAmB,OAAO,0BAA0B;AAC1D,UAAI,cAAc;AAAA,QACjB,OAAO;AAAA,SACP,YAAO,kBAAP,mBAAsB;AAAA,QACtB;AAAA,QACA;AAAA,UACC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,UAC7D,6BAA6B,KAAK,4BAA4B,KAAK,IAAI;AAAA,QACxE;AAAA,QACA;AAAA,UACC,aAAa;AAAA,UACb,uBAAsB,YAAO,kBAAP,mBAAsB;AAAA,QAC7C;AAAA,QACA;AAAA,MACD;AAGA,UAAI,OAAO,0BAA0B,QAAW;AAC/C,sBAAc,KAAK,2BAA2B,aAAa,MAAM;AAAA,MAClE;AAEA,aAAO;AAAA,IACR;AAGA,QAAI,OAAO,OAAO;AACjB,YAAM,mBAAmB,OAAO,0BAA0B;AAC1D,UAAI,cAAc;AAAA,QACjB,OAAO;AAAA,SACP,YAAO,kBAAP,mBAAsB;AAAA,QACtB;AAAA,QACA;AAAA,UACC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,UAC7D,6BAA6B,KAAK,4BAA4B,KAAK,IAAI;AAAA,QACxE;AAAA,QACA;AAAA,UACC,aAAa;AAAA,UACb,uBAAsB,YAAO,kBAAP,mBAAsB;AAAA,QAC7C;AAAA,QACA;AAAA,MACD;AAGA,UAAI,OAAO,0BAA0B,QAAW;AAC/C,sBAAc,KAAK,2BAA2B,aAAa,MAAM;AAAA,MAClE;AAEA,aAAO;AAAA,IACR;AAGA,QAAI,OAAO,KAAK;AACf,YAAM,YAAY,KAAK,uBAAuB,OAAO,KAAK,aAAa;AACvE,UAAI;AAGJ,UAAI,OAAO,QAAQ,OAAO,cAAc,OAAO,OAAO;AAErD,cAAM,EAAE,KAAK,GAAG,GAAG,WAAW,IAAI;AAClC,yBAAiB,KAAK,uBAAuB,YAAY,aAAa;AAAA,MACvE,OAAO;AAEN,yBAAiB;AAAA,MAClB;AAEA,YAAM,UAAU,GAAG,cAAc,qBAAqB,SAAS;AAC/D,aAAO,aAAa,SAAS,QAAQ;AAAA,IACtC;AAEA,QAAI,aAAa;AACjB,UAAM,cAAc,eAAe,MAAM;AAEzC,YAAQ,aAAa;AAAA,MACpB,KAAK;AACJ,qBAAa,yBAAyB,QAAQ,KAAK,QAAQ,WAAW;AACtE;AAAA,MAED,KAAK;AACJ,qBAAa,yBAAyB,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAC7E;AAAA,MAED,KAAK;AACJ,qBAAa,yBAAyB,QAAQ,MAAM,KAAK,QAAQ,WAAW;AAC5E;AAAA,MAED,KAAK;AACJ,qBAAa;AACb,qBAAa,eAAe,YAAY,OAAO,aAAa,KAAK,QAAQ,WAAW;AACpF;AAAA,MAED,KAAK;AACJ,qBAAa,wBAAwB,QAAQ;AAAA,UAC5C,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,UAC7D,aAAa,KAAK,QAAQ;AAAA,UAC1B;AAAA,QACD,CAAC;AACD;AAAA,MAED,KAAK;AACJ,YACC,OAAO,cACP,OAAO,YACP,OAAO,kBAAkB,UACzB,OAAO,kBAAkB,UACzB,OAAO,qBACP,OAAO,eACN;AACD,uBAAa;AAAA,YACZ;AAAA,YACA;AAAA,cACC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,cAC7D,uBAAuB,KAAK,sBAAsB,KAAK,IAAI;AAAA,cAC3D,MAAM,KAAK,QAAQ;AAAA,cACnB,qBAAqB,KAAK,QAAQ;AAAA,cAClC,aAAa,KAAK,QAAQ;AAAA,YAC3B;AAAA,YACA;AAAA,UACD;AACA,uBAAa,eAAe,YAAY,OAAO,aAAa,KAAK,QAAQ,WAAW;AAAA,QACrF,OAAO;AACN,uBAAa;AACb,uBAAa,eAAe,YAAY,OAAO,aAAa,KAAK,QAAQ,WAAW;AAAA,QACrF;AACA;AAAA,MACD;AACC,qBAAa;AACb,qBAAa,eAAe,YAAY,OAAO,aAAa,KAAK,QAAQ,WAAW;AAAA,IACtF;AAEA,UAAM,SAAS,aAAa,YAAY,QAAQ;AAGhD,QAAI,aAAa;AAChB,YAAM,WAAW,KAAK,UAAU,EAAE,QAAQ,MAAM,KAAK,QAAQ,YAAY,MAAM,KAAK,QAAQ,KAAK,CAAC;AAClG,WAAK,YAAY,IAAI,UAAU,MAAM;AAAA,IACtC;AAEA,WAAO;AAAA,EACR;AACD;AAAA;AAlgBa,mBAQI,kBAAkB;AAAA,EACjC,SAAS,CAAC,WAA0B,CAAC,OAAO;AAAA,EAC5C,UAAU,CAAC,WAA0B,CAAC,OAAO;AAAA,EAC7C,KAAK,MAAM;AACZ;AAZM,IAAM,oBAAN;;;AC3BP,uBAA0B;AAmBnB,SAAS,yBAA2C;AAC1D,SAAO;AAAA,IACN,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,mBAAmB;AAAA,IACnB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,EACvB;AACD;AAMA,SAAS,kBAAkB,OAA2B,UAAyC;AAC9F,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACvC,WAAO;AAAA,EACR;AACA,MAAI,CAAC,OAAO;AACX,WAAO;AAAA,EACR;AACA,SAAO,SAAS,KAAK,iBAAW,4BAAU,OAAO,OAAO,CAAC;AAC1D;AAMA,SAAS,YAAY,KAA2B,QAAuC;AACtF,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AACnC,WAAO;AAAA,EACR;AACA,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC7B,WAAO;AAAA,EACR;AACA,SAAO,OAAO,KAAK,WAAS,IAAI,SAAS,KAAK,CAAC;AAChD;AAmBO,SAAS,uBACf,WACA,MACA,QACA,SACA,OACU;AAEV,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,OAAO,YAAY;AACvC,QAAM,cAAc,uCAAW;AAC/B,QAAM,QAAO,uCAAW,SAAQ,CAAC;AACjC,QAAM,cAAa,uCAAW,gBAAe;AAM7C,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AAC1D,QAAI,CAAC,YAAY,MAAM,QAAQ,WAAW,GAAG;AAC5C,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC5D,QAAI,CAAC,kBAAkB,MAAM,QAAQ,YAAY,GAAG;AACnD,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAAG;AAChE,UAAM,eAAe,QAAQ,eAAe,IAAI,OAAK,EAAE,YAAY,CAAC;AACpE,QAAI,CAAC,aAAa,SAAS,WAAW,GAAG;AACxC,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,uBAAuB,QAAQ,oBAAoB,SAAS,GAAG;AAC1E,QAAI,CAAC,kBAAkB,aAAa,QAAQ,mBAAmB,GAAG;AACjE,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAMA,MAAI,QAAQ,sBAAsB,QAAQ,YAAY;AACrD,QAAI,MAAO,OAAM;AACjB,WAAO;AAAA,EACR;AAGA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AAC1D,QAAI,YAAY,MAAM,QAAQ,WAAW,GAAG;AAC3C,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC5D,QAAI,kBAAkB,MAAM,QAAQ,YAAY,GAAG;AAClD,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,kBAAkB,QAAQ,eAAe,SAAS,GAAG;AAChE,UAAM,eAAe,QAAQ,eAAe,IAAI,OAAK,EAAE,YAAY,CAAC;AACpE,QAAI,aAAa,SAAS,WAAW,GAAG;AACvC,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,MAAI,QAAQ,uBAAuB,QAAQ,oBAAoB,SAAS,GAAG;AAC1E,QAAI,kBAAkB,aAAa,QAAQ,mBAAmB,GAAG;AAChE,UAAI,MAAO,OAAM;AACjB,aAAO;AAAA,IACR;AAAA,EACD;AAGA,SAAO;AACR;AASO,SAAS,gBAAgB,OAAyB,SAAkC;AAC1F,MAAI,CAAC,WAAW,MAAM,oBAAoB,GAAG;AAC5C;AAAA,EACD;AAGA,MAAI,MAAM,uBAAuB,GAAG;AACnC,YAAQ;AAAA,MACP,8BAAoB,MAAM,eAAe;AAAA,IAC1C;AAGA,UAAM,kBAA4B,CAAC;AACnC,QAAI,MAAM,iBAAiB,EAAG,iBAAgB,KAAK,GAAG,MAAM,cAAc,UAAU;AACpF,QAAI,MAAM,kBAAkB,EAAG,iBAAgB,KAAK,GAAG,MAAM,eAAe,WAAW;AACvF,QAAI,MAAM,oBAAoB,EAAG,iBAAgB,KAAK,GAAG,MAAM,iBAAiB,aAAa;AAC7F,QAAI,MAAM,yBAAyB,EAAG,iBAAgB,KAAK,GAAG,MAAM,sBAAsB,kBAAkB;AAC5G,QAAI,MAAM,uBAAuB,EAAG,iBAAgB,KAAK,GAAG,MAAM,oBAAoB,qBAAqB;AAE3G,QAAI,gBAAgB,SAAS,GAAG;AAC/B,cAAQ,KAAK,gBAAgB,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1D;AAAA,EACD;AACD;AASO,SAAS,uBAAuB,OAAiC;AACvE,MAAI,MAAM,oBAAoB,GAAG;AAChC,WAAO;AAAA,EACR;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,uBAAuB,MAAM,eAAe,EAAE;AACzD,QAAM,KAAK,0BAA0B,MAAM,kBAAkB,EAAE;AAE/D,QAAM,gBACL,MAAM,iBACN,MAAM,kBACN,MAAM,oBACN,MAAM,yBACN,MAAM;AAEP,MAAI,gBAAgB,GAAG;AACtB,UAAM,KAAK,0BAA0B,aAAa,EAAE;AACpD,QAAI,MAAM,iBAAiB,EAAG,OAAM,KAAK,kBAAkB,MAAM,cAAc,EAAE;AACjF,QAAI,MAAM,kBAAkB,EAAG,OAAM,KAAK,mBAAmB,MAAM,eAAe,EAAE;AACpF,QAAI,MAAM,oBAAoB,EAAG,OAAM,KAAK,qBAAqB,MAAM,iBAAiB,EAAE;AAC1F,QAAI,MAAM,yBAAyB,EAAG,OAAM,KAAK,0BAA0B,MAAM,sBAAsB,EAAE;AACzG,QAAI,MAAM,uBAAuB,EAAG,OAAM,KAAK,wBAAwB,MAAM,oBAAoB,EAAE;AAAA,EACpG;AAEA,SAAO,MAAM,KAAK,IAAI;AACvB;;;Ab9NO,IAAM,mBAAN,MAAuB;AAAA,EAgB7B,YAAY,SAAkC;AAf9C,SAAQ,UAA+B,oBAAI,IAAI;AAC/C,SAAQ,QAA6B,oBAAI,IAAI;AAC7C,SAAQ,QAA6B,oBAAI,IAAI;AAC7C,SAAQ,cAAmC,oBAAI,IAAI;AACnD,SAAQ,qBAA+C,oBAAI,IAAI;AAI/D,SAAQ,iBAA6C,oBAAI,IAAI;AAC7D,SAAQ,oBAA2C,oBAAI,IAAI;AAG3D,SAAQ,iBAAiB;AACzB,SAAQ,cAAgC,uBAAuB;AAjChE;AAqCE,QAAI,CAAC,QAAQ,OAAO;AACnB,YAAM,IAAI,mBAAmB,0BAA0B,EAAE,iBAAiB,QAAQ,CAAC;AAAA,IACpF;AAEA,SAAK,UAAU;AAAA,MACd,MAAM,QAAQ,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,sBAAqB,aAAQ,wBAAR,YAA+B;AAAA,MACpD,UAAU,QAAQ,YAAY;AAAA,MAC9B,cAAa,aAAQ,gBAAR,YAAuB;AAAA,MACpC,YAAY,QAAQ,cAAc;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,YAAW,aAAQ,cAAR,YAAqB;AAAA,MAChC,gBAAgB,QAAQ,kBAAkB;AAAA,MAC1C,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,kBAAkB,QAAQ;AAAA,IAC3B;AAGA,QAAI;AACH,YAAM,KAAK,QAAQ,IAAS;AAC5B,UAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,KAAK,GAAG;AACvC,cAAM,IAAI,mBAAmB,yBAAyB,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK;AAAA,MAC/F;AAAA,IACD,SAAS,OAAO;AACf,UAAI,iBAAiB,oBAAoB;AACxC,cAAM;AAAA,MACP;AAAA,IAED;AAEA,QAAI;AACH,YAAM,cAAU,6BAAa,KAAK,QAAQ,OAAO,OAAO;AAGxD,UAAI;AACH,aAAK,WAAO,mBAAM,OAAO;AAAA,MAC1B,SAAS,WAAW;AAEnB,YAAI;AACH,eAAK,OAAO,KAAK,MAAM,OAAO;AAAA,QAC/B,QAAQ;AACP,cAAI,qBAAqB,OAAO;AAC/B,kBAAM,eAAe;AAAA,cACpB,+CAA+C,KAAK,QAAQ,KAAK;AAAA,cACjE;AAAA,cACA,UAAU,UAAU,OAAO;AAAA,cAC3B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACD,EAAE,KAAK,IAAI;AACX,kBAAM,IAAI,oBAAoB,cAAc;AAAA,cAC3C,UAAU,KAAK,QAAQ;AAAA,cACvB,eAAe,UAAU;AAAA,YAC1B,CAAC;AAAA,UACF;AACA,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD,SAAS,OAAO;AACf,UAAI,iBAAiB,qBAAqB;AACzC,cAAM;AAAA,MACP;AACA,UAAI,iBAAiB,OAAO;AAC3B,cAAM,eAAe;AAAA,UACpB,8CAA8C,KAAK,QAAQ,KAAK;AAAA,UAChE;AAAA,UACA,UAAU,MAAM,OAAO;AAAA,QACxB,EAAE,KAAK,IAAI;AACX,cAAM,IAAI,oBAAoB,cAAc,EAAE,UAAU,KAAK,QAAQ,OAAO,eAAe,MAAM,QAAQ,CAAC;AAAA,MAC3G;AACA,YAAM;AAAA,IACP;AAEA,SAAK,aAAa;AAGlB,SAAK,iBAAiB,KAAK,yBAAyB,SAAS;AAC7D,SAAK,kBAAkB,KAAK,yBAAyB,UAAU;AAG/D,SAAK,mBAAmB;AAGxB,SAAK,yBAAyB;AAI9B,SAAK,oBAAoB,IAAI,kBAAkB;AAAA,MAC9C,MAAM,KAAK;AAAA,MACX,oBAAoB,KAAK;AAAA,MACzB,YAAY,KAAK,QAAQ,cAAc;AAAA,MACvC,MAAM,KAAK,eAAe;AAAA,MAC1B,qBAAqB,KAAK,eAAe;AAAA,MACzC,aAAa,KAAK,eAAe;AAAA,MACjC,UAAU,KAAK,eAAe;AAAA,MAC9B,gBAAgB,KAAK,eAAe;AAAA,MACpC,eAAe;AAAA,QACd,QAAQ,KAAK,QAAQ;AAAA,QACrB,QAAQ,KAAK,QAAQ;AAAA,MACtB;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAyB;AAtJ1B;AAuJE,QAAI,GAAC,UAAK,KAAK,eAAV,mBAAsB,UAAS;AACnC,YAAM,IAAI,oBAAoB,oCAAoC,EAAE,UAAU,KAAK,QAAQ,MAAM,CAAC;AAAA,IACnG;AAGA,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,WAAW,OAAO,GAAG;AAC1E,UAAI,OAAO,MAAM;AAChB,cAAM,UAAU,KAAK,eAAe,IAAI,IAAI;AAC5C,cAAM,kBAAkB,YAAY,aAAa,KAAK,kBAAkB,KAAK;AAG7E,YAAI,gBAAgB,aAAa,cAAc;AAE9C,eAAK,mBAAmB,MAAM,MAAM;AAAA,QACrC,OAAO;AAEN,gBAAM,EAAE,SAAS,IAAI,aAAa,MAAM,OAAO,MAAM;AAAA,YACpD,UAAU;AAAA,YACV,QAAQ,KAAK,QAAQ;AAAA,YACrB,QAAQ,KAAK,QAAQ;AAAA,UACtB,CAAC;AACD,cAAI,UAAU;AACb,iBAAK,MAAM,IAAI,MAAM,QAAQ;AAE7B,iBAAK,iBAAiB;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAGA,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,WAAW,OAAO,GAAG;AAC1E,WAAK,wBAAwB,MAAM,MAAM;AAAA,IAC1C;AAGA,SAAK,8BAA8B;AAGnC,SAAK,+BAA+B;AAGpC,oBAAgB,KAAK,aAAa,KAAK,QAAQ,gBAAgB;AAG/D,UAAM,qBAAqB,KAAK,gBAAgB;AAGhD,UAAM,SAAmB,CAAC,+CAA+C,qCAAqC,EAAE;AAGhH,QAAI,KAAK,QAAQ,cAAc,MAAM;AACpC,aAAO,KAAK,GAAG,KAAK,cAAc,CAAC;AACnC,aAAO,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,KAAK,gBAAgB;AACxB,aAAO,KAAK,0BAA0B;AACtC,aAAO,KAAK,EAAE;AAAA,IACf;AAGA,QAAI,KAAK,YAAY,OAAO,GAAG;AAC9B,aAAO,KAAK,iBAAiB;AAC7B,iBAAW,YAAY,KAAK,YAAY,OAAO,GAAG;AACjD,eAAO,KAAK,QAAQ;AACpB,eAAO,KAAK,EAAE;AAAA,MACf;AAAA,IACD;AAGA,WAAO,KAAK,sBAAsB;AAClC,eAAW,QAAQ,oBAAoB;AACtC,YAAM,WAAW,KAAK,MAAM,IAAI,IAAI;AACpC,YAAM,aAAa,KAAK,QAAQ,IAAI,IAAI;AACxC,YAAM,WAAW,KAAK,MAAM,IAAI,IAAI;AAEpC,UAAI,UAAU;AAEb,eAAO,KAAK,QAAQ;AACpB,eAAO,KAAK,EAAE;AAAA,MACf,WAAW,YAAY;AAEtB,eAAO,KAAK,UAAU;AAGtB,YAAI,CAAC,WAAW,SAAS,eAAe,IAAI,EAAE,GAAG;AAChD,gBAAM,aAAa,GAAG,YAAY,MAAM,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC,CAAC;AACrG,iBAAO,KAAK,eAAe,IAAI,qBAAqB,UAAU,IAAI;AAAA,QACnE;AAEA,eAAO,KAAK,EAAE;AAAA,MACf,WAAW,UAAU;AAEpB,eAAO,KAAK,QAAQ;AACpB,eAAO,KAAK,EAAE;AAAA,MACf;AAAA,IACD;AAEA,WAAO,OAAO,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,UAAwB;AACrD,UAAM,qBAAiB,4BAAU,QAAQ;AACzC,UAAM,UAAM,0BAAQ,cAAc;AAClC,QAAI,KAAC,2BAAW,GAAG,GAAG;AACrB,oCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACnC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AAChB,QAAI,CAAC,KAAK,QAAQ,QAAQ;AACzB,YAAM,IAAI;AAAA,QACT;AAAA,QAEA,EAAE,WAAW,MAAM;AAAA,MACpB;AAAA,IACD;AACA,UAAM,SAAS,KAAK,eAAe;AACnC,UAAM,uBAAmB,4BAAU,KAAK,QAAQ,MAAM;AACtD,SAAK,sBAAsB,gBAAgB;AAC3C,sCAAc,kBAAkB,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,yBAAyB,SAAkD;AA/RpF;AAgSE,UAAM,iBAAiB,YAAY,YAAY,KAAK,QAAQ,UAAU,KAAK,QAAQ;AAGnF,UAAM,iBACL,YAAY,aACR,sBAAK,QAAQ,YAAb,mBAAsB,mBAAtB,YAAwC,KAAK,QAAQ,mBAArD,YAAuE,WACvE,UAAK,QAAQ,mBAAb,YAA+B;AAEpC,WAAO;AAAA,MACN,OAAM,4DAAgB,SAAhB,YAAwB,KAAK,QAAQ,SAArC,YAA6C;AAAA,MACnD,WAAU,4DAAgB,aAAhB,YAA4B,KAAK,QAAQ,aAAzC,YAAqD;AAAA,MAC/D,cAAa,4DAAgB,gBAAhB,YAA+B,KAAK,QAAQ,gBAA5C,YAA2D;AAAA,MACxE,sBAAqB,4DAAgB,wBAAhB,YAAuC,KAAK,QAAQ,wBAApD,YAA2E;AAAA;AAAA;AAAA,MAGhG,UAAU,YAAY,aAAa,cAAc,gBAAK,QAAQ,YAAb,mBAAsB,aAAtB,YAAkC;AAAA,MACnF;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAA2B;AAxTpC;AAyTE,UAAM,iBAAiB,oBAAI,IAAY;AACvC,UAAM,kBAAkB,oBAAI,IAAY;AAGxC,QAAI,KAAK,KAAK,OAAO;AACpB,iBAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,KAAK,GAAG;AAC/D,cAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,SAAS;AAC3E,mBAAW,UAAU,SAAS;AAC7B,gBAAM,YAAa,SAAiB,MAAM;AAC1C,cAAI,OAAO,cAAc,YAAY,CAAC,UAAW;AAGjD,eAAK,YAAY;AAGjB,cAAI,CAAC,uBAAuB,WAAW,MAAM,QAAQ,KAAK,QAAQ,kBAAkB,KAAK,WAAW,GAAG;AACtG;AAAA,UACD;AAGA,eAAK,YAAY;AAGjB,cACC,iBAAiB,aACjB,UAAU,eACV,OAAO,UAAU,gBAAgB,YACjC,aAAa,UAAU,eACvB,UAAU,YAAY,SACrB;AACD,uBAAW,aAAa,OAAO,OAAO,UAAU,YAAY,OAAO,GAAG;AACrE,kBAAI,aAAa,OAAO,cAAc,YAAY,YAAY,aAAa,UAAU,QAAQ;AAC5F,qBAAK,kBAAkB,UAAU,QAAQ,cAAc;AAAA,cACxD;AAAA,YACD;AAAA,UACD;AAGA,cAAI,eAAe,aAAa,UAAU,aAAa,OAAO,UAAU,cAAc,UAAU;AAC/F,uBAAW,YAAY,OAAO,OAAO,UAAU,SAAS,GAAG;AAC1D,kBACC,YACA,OAAO,aAAa,YACpB,aAAa,YACb,SAAS,WACT,OAAO,SAAS,YAAY,UAC3B;AACD,2BAAW,aAAa,OAAO,OAAO,SAAS,OAAO,GAAG;AACxD,sBAAI,aAAa,OAAO,cAAc,YAAY,YAAY,aAAa,UAAU,QAAQ;AAC5F,yBAAK,kBAAkB,UAAU,QAAQ,eAAe;AAAA,kBACzD;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAGA,cAAI,gBAAgB,aAAa,MAAM,QAAQ,UAAU,UAAU,GAAG;AACrE,uBAAW,SAAS,UAAU,YAAY;AACzC,kBAAI,SAAS,OAAO,UAAU,YAAY,YAAY,SAAS,MAAM,QAAQ;AAC5E,qBAAK,kBAAkB,MAAM,QAAQ,cAAc;AAAA,cACpD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAGA,WAAK,2BAA2B,cAAc;AAC9C,WAAK,2BAA2B,eAAe;AAAA,IAChD;AAGA,QAAI,CAAC,KAAK,KAAK,SAAU,eAAe,SAAS,KAAK,gBAAgB,SAAS,GAAI;AAClF,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,UAAQ,UAAK,KAAK,eAAV,mBAAsB,YAAW,CAAC,CAAC,GAAG;AACjF,cAAM,cAAc,KAAK,sBAAsB,MAAM;AACrD,cAAM,eAAe,KAAK,uBAAuB,MAAM;AAEvD,YAAI,gBAAgB,CAAC,aAAa;AACjC,yBAAe,IAAI,IAAI;AAAA,QACxB,WAAW,eAAe,CAAC,cAAc;AACxC,0BAAgB,IAAI,IAAI;AAAA,QACzB;AAAA,MACD;AAAA,IACD;AAGA,eAAW,CAAC,IAAI,KAAK,OAAO,UAAQ,UAAK,KAAK,eAAV,mBAAsB,YAAW,CAAC,CAAC,GAAG;AACzE,UAAI,eAAe,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,GAAG;AAC1D,aAAK,eAAe,IAAI,MAAM,MAAM;AAAA,MACrC,WAAW,eAAe,IAAI,IAAI,GAAG;AACpC,aAAK,eAAe,IAAI,MAAM,SAAS;AAAA,MACxC,WAAW,gBAAgB,IAAI,IAAI,GAAG;AACrC,aAAK,eAAe,IAAI,MAAM,UAAU;AAAA,MACzC;AAAA,IAED;AAGA,SAAK,yBAAyB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,SAA4B;AAlahE;AAmaE,UAAM,YAAY,MAAM,KAAK,OAAO;AACpC,UAAM,YAAY,oBAAI,IAAY;AAElC,WAAO,UAAU,SAAS,GAAG;AAC5B,YAAM,aAAa,UAAU,IAAI;AACjC,UAAI,CAAC,cAAc,UAAU,IAAI,UAAU,EAAG;AAE9C,gBAAU,IAAI,UAAU;AAExB,YAAM,UAAS,gBAAK,KAAK,eAAV,mBAAsB,YAAtB,mBAAgC;AAC/C,UAAI,QAAQ;AACX,cAAM,OAAO,oBAAI,IAAY;AAC7B,aAAK,kBAAkB,QAAQ,IAAI;AAEnC,mBAAW,OAAO,MAAM;AACvB,cAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACtB,oBAAQ,IAAI,GAAG;AACf,sBAAU,KAAK,GAAG;AAAA,UACnB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAa,MAAyB;AAC/D,QAAI,CAAC,OAAQ;AAEb,QAAI,OAAO,MAAM;AAChB,YAAM,UAAU,WAAW,OAAO,IAAI;AACtC,WAAK,IAAI,OAAO;AAAA,IACjB;AAEA,QAAI,OAAO,OAAO;AACjB,iBAAW,aAAa,OAAO,OAAO;AACrC,aAAK,kBAAkB,WAAW,IAAI;AAAA,MACvC;AAAA,IACD;AAEA,QAAI,OAAO,OAAO;AACjB,iBAAW,aAAa,OAAO,OAAO;AACrC,aAAK,kBAAkB,WAAW,IAAI;AAAA,MACvC;AAAA,IACD;AAEA,QAAI,OAAO,OAAO;AACjB,iBAAW,aAAa,OAAO,OAAO;AACrC,aAAK,kBAAkB,WAAW,IAAI;AAAA,MACvC;AAAA,IACD;AAEA,QAAI,OAAO,OAAO;AACjB,WAAK,kBAAkB,OAAO,OAAO,IAAI;AAAA,IAC1C;AAEA,QAAI,OAAO,YAAY;AACtB,iBAAW,QAAQ,OAAO,OAAO,OAAO,UAAU,GAAG;AACpD,aAAK,kBAAkB,MAAM,IAAI;AAAA,MAClC;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,QAAgC;AAC7D,QAAI,OAAO,SAAU,QAAO;AAC5B,QAAI,OAAO,YAAY;AACtB,iBAAW,QAAQ,OAAO,OAAO,OAAO,UAAU,GAAG;AACpD,YAAI,KAAK,sBAAsB,IAAI,EAAG,QAAO;AAAA,MAC9C;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAgC;AAC9D,QAAI,OAAO,UAAW,QAAO;AAC7B,QAAI,OAAO,YAAY;AACtB,iBAAW,QAAQ,OAAO,OAAO,OAAO,UAAU,GAAG;AACpD,YAAI,KAAK,uBAAuB,IAAI,EAAG,QAAO;AAAA,MAC/C;AAAA,IACD;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAiC;AAhgB1C;AAigBE,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,iBAAiB,oBAAI,IAAY;AAEvC,UAAM,cAAc,CAAC,SAA0B;AApgBjD,UAAAC,KAAA;AAqgBG,UAAI,eAAe,IAAI,IAAI,GAAG;AAE7B,eAAO;AAAA,MACR;AAEA,UAAI,QAAQ,IAAI,IAAI,GAAG;AACtB,eAAO;AAAA,MACR;AAEA,cAAQ,IAAI,IAAI;AAChB,qBAAe,IAAI,IAAI;AAEvB,YAAM,UAAS,MAAAA,MAAA,KAAK,KAAK,eAAV,gBAAAA,IAAsB,YAAtB,mBAAgC;AAC/C,UAAI,QAAQ;AACX,cAAM,OAAO,oBAAI,IAAY;AAC7B,aAAK,kBAAkB,QAAQ,IAAI;AAEnC,mBAAW,OAAO,MAAM;AACvB,cAAI,YAAY,GAAG,GAAG;AAErB,iBAAK,eAAe,IAAI,MAAM,MAAM;AACpC,2BAAe,OAAO,IAAI;AAC1B,mBAAO;AAAA,UACR;AAAA,QACD;AAAA,MACD;AAEA,qBAAe,OAAO,IAAI;AAC1B,aAAO;AAAA,IACR;AAEA,eAAW,QAAQ,OAAO,OAAK,UAAK,KAAK,eAAV,mBAAsB,YAAW,CAAC,CAAC,GAAG;AACpE,kBAAY,IAAI;AAAA,IACjB;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,2BAAiC;AA7iB1C;AA8iBE,eAAW,CAAC,IAAI,KAAK,OAAO,UAAQ,UAAK,KAAK,eAAV,mBAAsB,YAAW,CAAC,CAAC,GAAG;AACzE,YAAM,UAAU,KAAK,eAAe,IAAI,IAAI;AAE5C,UAAI,YAAY,WAAW;AAC1B,aAAK,kBAAkB,IAAI,MAAM,KAAK,eAAe,QAAQ;AAAA,MAC9D,WAAW,YAAY,YAAY;AAElC,aAAK,kBAAkB,IAAI,MAAM,UAAU;AAAA,MAC5C,WAAW,YAAY,QAAQ;AAE9B,aAAK,kBAAkB,IAAI,MAAM,UAAU;AAAA,MAC5C,OAAO;AAEN,aAAK,kBAAkB,IAAI,MAAM,UAAU;AAAA,MAC5C;AAGA,UAAI,KAAK,kBAAkB,IAAI,IAAI,MAAM,YAAY;AACpD,aAAK,iBAAiB;AAAA,MACvB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAxkB9B;AAykBE,QAAI,GAAC,UAAK,KAAK,eAAV,mBAAsB,UAAS;AACnC,YAAM,IAAI;AAAA,QACT,uCAAuC,KAAK,QAAQ,KAAK;AAAA,QACzD,EAAE,UAAU,KAAK,QAAQ,MAAM;AAAA,MAChC;AAAA,IACD;AAGA,UAAM,aAAa,OAAO,KAAK,KAAK,KAAK,WAAW,OAAO;AAC3D,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,WAAW,OAAO,GAAG;AAC1E,UAAI;AACH,aAAK,mBAAmB,MAAM,QAAQ,UAAU;AAAA,MACjD,SAAS,OAAO;AACf,YAAI,iBAAiB,OAAO;AAC3B,gBAAM,IAAI,sBAAsB,mBAAmB,IAAI,MAAM,MAAM,OAAO,IAAI,MAAM;AAAA,YACnF,eAAe,MAAM;AAAA,UACtB,CAAC;AAAA,QACF;AACA,cAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,YAAoB,QAAuB,YAAsB,OAAO,IAAU;AAC5G,QAAI,OAAO,MAAM;AAChB,YAAM,UAAU,WAAW,OAAO,IAAI;AACtC,UAAI,CAAC,WAAW,SAAS,OAAO,GAAG;AAClC,cAAM,IAAI;AAAA,UACT,oBAAoB,OAAO,QAAQ,IAAI,MAAM,EAAE,MAC1C,OAAO,IAAI,oCAAoC,OAAO;AAAA,UAC3D,EAAE,YAAY,MAAM,KAAK,OAAO,MAAM,QAAQ;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAGA,QAAI,OAAO,YAAY;AACtB,iBAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACvE,aAAK,mBAAmB,YAAY,YAAY,YAAY,OAAO,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ;AAAA,MACpG;AAAA,IACD;AAEA,QAAI,OAAO,OAAO;AACjB,WAAK,mBAAmB,YAAY,OAAO,OAAO,YAAY,GAAG,IAAI,IAAI;AAAA,IAC1E;AAEA,QAAI,OAAO,aAAa;AACvB,aAAO,YAAY,QAAQ,CAAC,GAAG,MAAM;AACpC,aAAK,mBAAmB,YAAY,GAAG,YAAY,GAAG,IAAI,gBAAgB,CAAC,GAAG;AAAA,MAC/E,CAAC;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AACjB,aAAO,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC9B,aAAK,mBAAmB,YAAY,GAAG,YAAY,GAAG,IAAI,UAAU,CAAC,GAAG;AAAA,MACzE,CAAC;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AACjB,aAAO,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC9B,aAAK,mBAAmB,YAAY,GAAG,YAAY,GAAG,IAAI,UAAU,CAAC,GAAG;AAAA,MACzE,CAAC;AAAA,IACF;AAEA,QAAI,OAAO,OAAO;AACjB,aAAO,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC9B,aAAK,mBAAmB,YAAY,GAAG,YAAY,GAAG,IAAI,UAAU,CAAC,GAAG;AAAA,MACzE,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,MAAc,QAA6B;AAtpB5E;AAwpBE,QAAI,CAAC,KAAK,mBAAmB,IAAI,IAAI,GAAG;AACvC,WAAK,mBAAmB,IAAI,MAAM,oBAAI,IAAI,CAAC;AAAA,IAC5C;AAGA,UAAM,WAAW,KAAK,kBAAkB,IAAI,IAAI,KAAK;AACrD,UAAM,UAAU,KAAK,eAAe,IAAI,IAAI;AAC5C,UAAM,kBAAkB,YAAY,aAAa,KAAK,kBAAkB,KAAK;AAG7E,QAAI,OAAO,MAAM;AAChB,YAAM,QAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAGtG,UAAI,gBAAgB,aAAa,cAAc;AAE9C,cAAM,EAAE,YAAY,SAAS,IAAI,aAAa,MAAM,OAAO,MAAM;AAAA,UAChE,UAAU;AAAA,UACV,QAAQ,KAAK,QAAQ;AAAA,UACrB,QAAQ,KAAK,QAAQ;AAAA,QACtB,CAAC;AAED,cAAM,iBAAiB,GAAG,KAAK,GAAG,UAAU;AAAA,EAAK,QAAQ;AACzD,aAAK,QAAQ,IAAI,MAAM,cAAc;AAAA,MACtC,OAAO;AAEN,cAAM,EAAE,UAAU,YAAY,SAAS,IAAI,aAAa,MAAM,OAAO,MAAM;AAAA,UAC1E,UAAU;AAAA,UACV,QAAQ,KAAK,QAAQ;AAAA,UACrB,QAAQ,KAAK,QAAQ;AAAA,QACtB,CAAC;AAED,YAAI,UAAU;AACb,eAAK,MAAM,IAAI,MAAM,QAAQ;AAAA,QAC9B;AAEA,cAAM,iBAAiB,GAAG,KAAK,GAAG,UAAU;AAAA,EAAK,QAAQ;AACzD,aAAK,QAAQ,IAAI,MAAM,cAAc;AAAA,MACtC;AACA;AAAA,IACD;AAEA,QAAI,aAAa,UAAU;AAE1B,YAAM,QAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AACtG,YAAM,uBAAuB,KAAK,sBAAsB,OAAO,QAAQ,gBAAgB,mBAAmB;AAC1G,YAAM,iBAAiB,KAAK,6BAA6B,QAAQ,IAAI;AACrE,YAAM,WAAW,GAAG,oBAAoB,eAAe,IAAI,MAAM,cAAc;AAC/E,WAAK,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC9B,OAAO;AAEN,YAAM,aAAa,GAAG,YAAY,MAAM,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC,CAAC;AACrG,YAAM,QAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAGtG,UAAI,OAAO,SAAS,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,CAAC,EAAE,MAAM;AACtE,cAAM,UAAU,WAAW,OAAO,MAAM,CAAC,EAAE,IAAI;AAC/C,mBAAK,mBAAmB,IAAI,IAAI,MAAhC,mBAAmC,IAAI;AAAA,MACxC;AAGA,WAAK,oBAAoB,IAAI,kBAAkB;AAAA,QAC9C,MAAM,KAAK;AAAA,QACX,oBAAoB,KAAK;AAAA,QACzB,YAAY,KAAK,QAAQ,cAAc;AAAA,QACvC,MAAM,gBAAgB;AAAA,QACtB,qBAAqB,gBAAgB;AAAA,QACrC,aAAa,gBAAgB;AAAA,QAC7B,UAAU,gBAAgB;AAAA,QAC1B,gBAAgB,gBAAgB;AAAA,QAChC,eAAe;AAAA,UACd,QAAQ,KAAK,QAAQ;AAAA,UACrB,QAAQ,KAAK,QAAQ;AAAA,QACtB;AAAA,MACD,CAAC;AAGD,YAAM,UAAU,CAAC,EAAE,OAAO,QAAQ,CAAC,OAAO,cAAc,CAAC,OAAO,SAAS,CAAC,OAAO,SAAS,CAAC,OAAO;AAClG,YAAM,YAAY,KAAK,kBAAkB,uBAAuB,QAAQ,MAAM,OAAO;AACrF,YAAM,gBAAgB,GAAG,KAAK,gBAAgB,UAAU,MAAM,SAAS;AAIvE,UAAI,UAAU,SAAS,uBAAuB,GAAG;AAChD,cAAM,QAAQ,UAAU,MAAM,8CAA8C;AAC5E,YAAI,OAAO;AACV,gBAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,SAAO,IAAI,KAAK,CAAC;AACtD,qBAAW,OAAO,MAAM;AAEvB,kBAAM,WAAW,IAAI,MAAM,8BAA8B;AACzD,gBAAI,UAAU;AAEb,oBAAM,UAAU,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AACzE,yBAAK,mBAAmB,IAAI,IAAI,MAAhC,mBAAmC,IAAI;AAAA,YACxC;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,WAAK,QAAQ,IAAI,MAAM,aAAa;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,gCAAsC;AAlwB/C;AAmwBE,QAAI,CAAC,KAAK,KAAK,OAAO;AACrB;AAAA,IACD;AAEA,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,KAAK,GAAG;AAC/D,UAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAE/C,YAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,SAAS;AAE3E,iBAAW,UAAU,SAAS;AAC7B,cAAM,YAAa,SAAiB,MAAM;AAC1C,YAAI,CAAC,UAAW;AAGhB,YAAI,CAAC,uBAAuB,WAAW,MAAM,QAAQ,KAAK,QAAQ,gBAAgB,GAAG;AACpF;AAAA,QACD;AAGA,YAAI,CAAC,UAAU,eAAe,CAAC,UAAU,cAAc,CAAC,MAAM,QAAQ,UAAU,UAAU,GAAG;AAC5F;AAAA,QACD;AAGA,cAAM,cAAc,UAAU,WAAW;AAAA,UACxC,CAAC,UAAe,SAAS,OAAO,UAAU,YAAY,MAAM,OAAO;AAAA,QACpE;AAEA,YAAI,YAAY,WAAW,GAAG;AAC7B;AAAA,QACD;AAIA,cAAM,oBAAoB,UAAU,YAAY,SAAS,GAAG,IACzD,aAAa,UAAU,WAAW,IAClC,UAAU,YAAY,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,YAAY,MAAM,CAAC;AAChF,cAAM,aAAa,GAAG,iBAAiB;AACvC,YAAI,CAAC,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAC7C,eAAK,mBAAmB,IAAI,YAAY,oBAAI,IAAI,CAAC;AAAA,QAClD;AAGA,cAAM,aAAqC,CAAC;AAC5C,cAAM,WAAqB,CAAC;AAE5B,mBAAW,SAAS,aAAa;AAChC,gBAAM,YAAY,MAAM;AACxB,gBAAM,aAAa,MAAM,aAAa;AACtC,gBAAM,cAAc,MAAM;AAE1B,cAAI,CAAC,YAAa;AAGlB,cAAI,UAAU,KAAK,uBAAuB,aAAa,KAAK;AAG5D,cAAI,YAAY,SAAS,WAAW,YAAY,OAAO;AACtD,kBAAM,WAAW,KAAK,uBAAuB,YAAY,OAAO,KAAK;AAIrE,sBAAU,WAAW,QAAQ;AAAA,UAG9B;AACA,cAAI,MAAM,eAAe,KAAK,eAAe,qBAAqB;AACjE,gBAAI,KAAK,eAAe,aAAa;AACpC,wBAAU,GAAG,OAAO,aAAa,KAAK,UAAU,MAAM,WAAW,CAAC;AAAA,YACnE;AAAA,UACD;AAGA,cAAI,CAAC,YAAY;AAChB,sBAAU,GAAG,OAAO;AAAA,UACrB;AAEA,qBAAW,SAAS,IAAI;AACxB,cAAI,YAAY;AACf,qBAAS,KAAK,SAAS;AAAA,UACxB;AAGA,cAAI,YAAY,MAAM;AACrB,kBAAM,UAAU,WAAW,YAAY,IAAI;AAC3C,uBAAK,mBAAmB,IAAI,UAAU,MAAtC,mBAAyC,IAAI;AAAA,UAC9C;AAAA,QACD;AAGA,cAAM,aAAa,KAAK,eAAe;AACvC,cAAM,YAAY,eAAe,WAAW,iBAAiB,eAAe,UAAU,gBAAgB;AAEtG,cAAM,YAAY,OAAO,QAAQ,UAAU,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAEtB,gBAAM,cAAc,CAAC,6BAA6B,KAAK,GAAG;AAC1D,gBAAM,YAAY,cAAc,IAAI,GAAG,MAAM;AAC7C,iBAAO,KAAK,SAAS,KAAK,KAAK;AAAA,QAChC,CAAC,EACA,KAAK,KAAK;AAEZ,cAAM,aAAa,KAAK,SAAS;AAAA,EAAO,SAAS;AAAA;AACjD,cAAM,gBAAgB;AACtB,cAAM,eAAe,KAAK,QAAQ,SAC/B,GAAG,aAAa,KAAK,QAAQ,MAAM,CAAC,GAAG,aAAa,KACpD;AACH,cAAM,eAAe,KAAK,QAAQ,SAAS,GAAG,YAAY,GAAG,aAAa,KAAK,QAAQ,MAAM,CAAC,KAAK;AACnG,cAAM,sBAAsB,GAAG,aAAa,OAAO,CAAC,EAAE,YAAY,IAAI,aAAa,MAAM,CAAC,CAAC;AAG3F,cAAM,QAAQ;AAAA,0BAAgC,UAAU,WAAW;AAAA;AAAA;AACnE,cAAM,iBAAiB,GAAG,KAAK,gBAAgB,mBAAmB,MAAM,UAAU;AAElF,aAAK,QAAQ,IAAI,YAAY,cAAc;AAC3C,aAAK,iBAAiB;AAAA,MACvB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iCAAuC;AA/3BhD;AAg4BE,QAAI,CAAC,KAAK,KAAK,OAAO;AACrB;AAAA,IACD;AAEA,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,KAAK,GAAG;AAC/D,UAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAE/C,YAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,SAAS;AAE3E,iBAAW,UAAU,SAAS;AAC7B,cAAM,YAAa,SAAiB,MAAM;AAC1C,YAAI,CAAC,UAAW;AAGhB,YAAI,CAAC,uBAAuB,WAAW,MAAM,QAAQ,KAAK,QAAQ,gBAAgB,GAAG;AACpF;AAAA,QACD;AAGA,YAAI,CAAC,UAAU,eAAe,CAAC,UAAU,cAAc,CAAC,MAAM,QAAQ,UAAU,UAAU,GAAG;AAC5F;AAAA,QACD;AAGA,cAAM,eAAe,UAAU,WAAW;AAAA,UACzC,CAAC,UAAe,SAAS,OAAO,UAAU,YAAY,MAAM,OAAO;AAAA,QACpE;AAEA,YAAI,aAAa,WAAW,GAAG;AAC9B;AAAA,QACD;AAGA,cAAM,oBAAoB,UAAU,YAAY,SAAS,GAAG,IACzD,aAAa,UAAU,WAAW,IAClC,UAAU,YAAY,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,YAAY,MAAM,CAAC;AAChF,cAAM,aAAa,GAAG,iBAAiB;AAGvC,YAAI,CAAC,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAC7C,eAAK,mBAAmB,IAAI,YAAY,oBAAI,IAAI,CAAC;AAAA,QAClD;AAGA,cAAM,aAAqC,CAAC;AAE5C,mBAAW,SAAS,cAAc;AACjC,gBAAM,YAAY,MAAM;AACxB,gBAAM,cAAc,MAAM;AAE1B,cAAI,CAAC,YAAa;AAGlB,cAAI,UAAU;AAGd,cAAI,MAAM,eAAe,KAAK,eAAe,qBAAqB;AACjE,gBAAI,KAAK,eAAe,aAAa;AACpC,wBAAU,GAAG,OAAO,aAAa,KAAK,UAAU,MAAM,WAAW,CAAC;AAAA,YACnE;AAAA,UACD;AAGA,oBAAU,GAAG,OAAO;AAEpB,qBAAW,SAAS,IAAI;AAGxB,cAAI,YAAY,MAAM;AACrB,kBAAM,UAAU,WAAW,YAAY,IAAI;AAC3C,uBAAK,mBAAmB,IAAI,UAAU,MAAtC,mBAAyC,IAAI;AAAA,UAC9C;AAAA,QACD;AAGA,cAAM,aAAa,KAAK,eAAe;AACvC,cAAM,YAAY,eAAe,WAAW,iBAAiB,eAAe,UAAU,gBAAgB;AAEtG,cAAM,YAAY,OAAO,QAAQ,UAAU,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAEtB,gBAAM,cAAc,CAAC,6BAA6B,KAAK,GAAG;AAC1D,gBAAM,YAAY,cAAc,IAAI,GAAG,MAAM;AAC7C,iBAAO,KAAK,SAAS,KAAK,KAAK;AAAA,QAChC,CAAC,EACA,KAAK,KAAK;AAEZ,cAAM,aAAa,KAAK,SAAS;AAAA,EAAO,SAAS;AAAA;AAGjD,cAAM,gBAAgB;AACtB,cAAM,eAAe,KAAK,QAAQ,SAC/B,GAAG,aAAa,KAAK,QAAQ,MAAM,CAAC,GAAG,aAAa,KACpD;AACH,cAAM,eAAe,KAAK,QAAQ,SAAS,GAAG,YAAY,GAAG,aAAa,KAAK,QAAQ,MAAM,CAAC,KAAK;AACnG,cAAM,sBAAsB,GAAG,aAAa,OAAO,CAAC,EAAE,YAAY,IAAI,aAAa,MAAM,CAAC,CAAC;AAG3F,cAAM,QAAQ;AAAA,2BAAiC,UAAU,WAAW;AAAA;AAAA;AACpE,cAAM,iBAAiB,GAAG,KAAK,gBAAgB,mBAAmB,MAAM,UAAU;AAElF,aAAK,QAAQ,IAAI,YAAY,cAAc;AAC3C,aAAK,iBAAiB;AAAA,MACvB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAuB,OAAoB;AAEzE,QAAI,OAAO,MAAM;AAChB,YAAM,UAAU,WAAW,OAAO,IAAI;AACtC,YAAM,aAAa,YAAY,SAAS,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC;AACpG,aAAO,GAAG,UAAU;AAAA,IACrB;AAGA,QAAI,OAAO,MAAM;AAChB,YAAM,aAAa,OAAO,KAAK,IAAI,OAAM,OAAO,MAAM,WAAW,IAAI,CAAC,MAAM,CAAE,EAAE,KAAK,IAAI;AACzF,aAAO,WAAW,UAAU;AAAA,IAC7B;AAGA,UAAM,OAAO,OAAO;AAEpB,QAAI,SAAS,UAAU;AACtB,UAAI,UAAU;AAEd,UAAI,OAAO,cAAc,OAAW,WAAU,GAAG,OAAO,QAAQ,OAAO,SAAS;AAChF,UAAI,OAAO,cAAc,OAAW,WAAU,GAAG,OAAO,QAAQ,OAAO,SAAS;AAChF,UAAI,OAAO,QAAS,WAAU,GAAG,OAAO,WAAW,OAAO,OAAO;AACjE,UAAI,OAAO,WAAW,QAAS,WAAU,GAAG,OAAO;AACnD,UAAI,OAAO,WAAW,SAAS,OAAO,WAAW,MAAO,WAAU,GAAG,OAAO;AAC5E,UAAI,OAAO,WAAW,OAAQ,WAAU,GAAG,OAAO;AAClD,aAAO;AAAA,IACR;AAEA,QAAI,SAAS,YAAY,SAAS,WAAW;AAC5C,UAAI,UAAU,SAAS,YAAY,qBAAqB;AAExD,UAAI,OAAO,YAAY,QAAW;AACjC,kBAAU,OAAO,mBAAmB,GAAG,OAAO,OAAO,OAAO,OAAO,MAAM,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,MAC1G;AACA,UAAI,OAAO,YAAY,QAAW;AACjC,kBAAU,OAAO,mBAAmB,GAAG,OAAO,OAAO,OAAO,OAAO,MAAM,GAAG,OAAO,QAAQ,OAAO,OAAO;AAAA,MAC1G;AACA,aAAO;AAAA,IACR;AAEA,QAAI,SAAS,WAAW;AACvB,aAAO;AAAA,IACR;AAEA,QAAI,SAAS,WAAW,OAAO,OAAO;AACrC,YAAM,WAAW,KAAK,uBAAuB,OAAO,OAAO,KAAK;AAChE,UAAI,YAAY,WAAW,QAAQ;AAEnC,UAAI,OAAO,aAAa,OAAW,aAAY,GAAG,SAAS,QAAQ,OAAO,QAAQ;AAClF,UAAI,OAAO,aAAa,OAAW,aAAY,GAAG,SAAS,QAAQ,OAAO,QAAQ;AAClF,aAAO;AAAA,IACR;AAGA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAc,QAA6B;AACrE,QAAI,CAAC,OAAO,KAAM;AAElB,UAAM,UAAU,KAAK,eAAe,IAAI,IAAI;AAC5C,UAAM,kBAAkB,YAAY,aAAa,KAAK,kBAAkB,KAAK;AAC7E,UAAM,QAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAEtG,QAAI,gBAAgB,mBAAmB,QAAQ;AAE9C,YAAM,WAAW,GAAG,IAAI;AACxB,YAAM,UAAU,OAAO,KACrB,IAAI,WAAS;AACb,cAAM,MAAM,OAAO,UAAU,WAAW,KAAK,UAAU,KAAK,IAAI,IAAI,KAAK;AACzE,cAAM,MAAM,OAAO,UAAU,WAAW,IAAI,KAAK,MAAM;AACvD,eAAO,KAAK,GAAG,MAAM,GAAG;AAAA,MACzB,CAAC,EACA,KAAK,KAAK;AAEZ,YAAM,WAAW,GAAG,KAAK,eAAe,QAAQ;AAAA,EAAO,OAAO;AAAA;AAC9D,WAAK,YAAY,IAAI,MAAM,QAAQ;AAGnC,YAAM,WAAW,eAAe,IAAI,MAAM,QAAQ;AAClD,WAAK,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC9B,OAAO;AAEN,YAAM,YAAY,OAAO,KAAK,IAAI,OAAM,OAAO,MAAM,WAAW,IAAI,CAAC,MAAM,CAAE,EAAE,KAAK,KAAK;AACzF,YAAM,WAAW,GAAG,KAAK,eAAe,IAAI,MAAM,SAAS;AAC3D,WAAK,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC9B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,OAAuB;AAExC,UAAM,UAAU,MAAM,QAAQ,iBAAiB,GAAG;AAClD,UAAM,aAAa,QACjB,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACtE,KAAK,EAAE;AACT,WAAO,cAAc;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAe,QAAuB,qBAAsC;AACzG,QAAI,CAAC,oBAAqB,QAAO;AAEjC,UAAM,cAAwB,CAAC;AAE/B,QAAI,OAAO,cAAc,OAAW,aAAY,KAAK,cAAc,OAAO,SAAS,EAAE;AACrF,QAAI,OAAO,cAAc,OAAW,aAAY,KAAK,cAAc,OAAO,SAAS,EAAE;AACrF,QAAI,OAAO,QAAS,aAAY,KAAK,YAAY,OAAO,OAAO,EAAE;AACjE,QAAI,OAAO,YAAY,OAAW,aAAY,KAAK,YAAY,OAAO,OAAO,EAAE;AAC/E,QAAI,OAAO,YAAY,OAAW,aAAY,KAAK,YAAY,OAAO,OAAO,EAAE;AAC/E,QAAI,OAAO,aAAa,OAAW,aAAY,KAAK,aAAa,OAAO,QAAQ,EAAE;AAClF,QAAI,OAAO,aAAa,OAAW,aAAY,KAAK,aAAa,OAAO,QAAQ,EAAE;AAClF,QAAI,OAAO,kBAAkB,OAAW,aAAY,KAAK,kBAAkB,OAAO,aAAa,EAAE;AACjG,QAAI,OAAO,kBAAkB,OAAW,aAAY,KAAK,kBAAkB,OAAO,aAAa,EAAE;AACjG,QAAI,OAAO,eAAe,OAAW,aAAY,KAAK,eAAe,OAAO,UAAU,EAAE;AACxF,QAAI,OAAO,OAAQ,aAAY,KAAK,WAAW,OAAO,MAAM,EAAE;AAE9D,QAAI,YAAY,WAAW,EAAG,QAAO;AAGrC,QAAI,OAAO;AACV,YAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,IAAI;AACrC,UAAI,MAAM,CAAC,MAAM,SAAS,MAAM,MAAM,SAAS,CAAC,MAAM,OAAO;AAE5D,cAAM,WAAW,CAAC,GAAG,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,YAAY,IAAI,OAAK,MAAM,CAAC,EAAE,GAAG,OAAO;AACpF,eAAO,SAAS,KAAK,IAAI;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE,EAAE,QAAQ,SAAS,EAAE;AAC7D,aAAO;AAAA,KAAW,OAAO;AAAA,EAAK,YAAY,IAAI,OAAK,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IACzE;AAGA,WAAO;AAAA,EAAQ,YAAY,IAAI,OAAK,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,QAAuB,aAA8B;AAEzF,QAAI,OAAO,MAAM;AAChB,aAAO,WAAW,OAAO,IAAI;AAAA,IAC9B;AAGA,QAAI,OAAO,UAAU,QAAW;AAC/B,aAAO,OAAO,OAAO,UAAU,WAAW,IAAI,OAAO,KAAK,MAAM,OAAO,OAAO,KAAK;AAAA,IACpF;AAGA,UAAMC,cAAa,OAAO,YAAa,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,MAAM;AAChG,UAAMC,gBAAe,CAAC,SAAkBD,cAAa,IAAI,IAAI,aAAa;AAG1E,UAAM,cAAc,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,KAAK,KAAK,OAAK,MAAM,MAAM,IAAI,OAAO;AAG9F,YAAQ,aAAa;AAAA,MACpB,KAAK;AACJ,eAAOC,cAAa,QAAQ;AAAA,MAC7B,KAAK;AAAA,MACL,KAAK;AACJ,eAAOA,cAAa,QAAQ;AAAA,MAC7B,KAAK;AACJ,eAAOA,cAAa,SAAS;AAAA,MAC9B,KAAK;AACJ,YAAI,OAAO,OAAO;AACjB,gBAAM,WAAW,KAAK,6BAA6B,OAAO,KAAK;AAC/D,iBAAOA,cAAa,GAAG,QAAQ,IAAI;AAAA,QACpC;AACA,eAAOA,cAAa,WAAW;AAAA,MAChC,KAAK;AACJ,eAAOA,cAAa,KAAK,mBAAmB,MAAM,CAAC;AAAA,MACpD;AAEC,YAAI,OAAO,OAAO;AACjB,gBAAM,QAAQ,OAAO,MAAM,IAAI,OAAK,KAAK,6BAA6B,CAAC,CAAC;AACxE,iBAAOA,cAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QACtC;AACA,YAAI,OAAO,SAAS,OAAO,OAAO;AACjC,gBAAM,UAAU,OAAO,SAAS,OAAO,SAAS,CAAC;AACjD,gBAAM,QAAQ,QAAQ,IAAI,OAAK,KAAK,6BAA6B,CAAC,CAAC;AACnE,iBAAOA,cAAa,MAAM,KAAK,KAAK,CAAC;AAAA,QACtC;AACA,eAAOA,cAAa,SAAS;AAAA,IAC/B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,QAA+B;AACzD,QAAI,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACtE,aAAO;AAAA,IACR;AAEA,UAAM,UAAU,KAAK,eAAe,IAAI,OAAO,OAAO,WAAW,OAAO,IAAI,IAAI,EAAE;AAClF,UAAM,kBAAkB,YAAY,aAAa,KAAK,kBAAkB,KAAK;AAC7E,UAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAC9C,UAAM,QAAkB,CAAC;AAEzB,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACvE,YAAM,WAAW,KAAK,6BAA6B,UAAU;AAC7D,YAAM,WAAW,CAAC,SAAS,IAAI,QAAQ,IAAI,MAAM;AAGjD,UAAI,YAAY,cAAc,YAAY,UAAU,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAChH,UAAI,gBAAgB,uBAAuB,CAAC,WAAW;AAEtD,oBAAY,KAAK,sBAAsB,IAAI,YAAY,gBAAgB,mBAAmB;AAAA,MAC3F,WAAW,aAAa,gBAAgB,qBAAqB;AAE5D,oBAAY,KAAK,sBAAsB,WAAW,YAAY,gBAAgB,mBAAmB;AAAA,MAClG;AAEA,UAAI,WAAW;AAEd,cAAM,aAAa,UAAU,QAAQ;AACrC,cAAM,KAAK,KAAK,UAAU;AAAA,IAAO,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG;AAAA,MACrE,OAAO;AACN,cAAM,KAAK,KAAK,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG;AAAA,MACpD;AAAA,IACD;AAEA,WAAO;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAA4B;AACnC,UAAM,SAAmB,CAAC;AAC1B,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,WAAW,oBAAI,IAAY;AACjC,UAAM,UAAoB,CAAC;AAC3B,UAAM,eAAe,oBAAI,IAAY;AAGrC,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACtC,gBAAU,IAAI,MAAM,IAAI;AAAA,IACzB;AACA,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS;AACxC,gBAAU,IAAI,MAAM,IAAI;AAAA,IACzB;AACA,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACtC,gBAAU,IAAI,MAAM,IAAI;AAAA,IACzB;AAEA,UAAM,QAAQ,CAAC,SAAuB;AACrC,UAAI,QAAQ,IAAI,IAAI,EAAG;AAGvB,UAAI,SAAS,IAAI,IAAI,GAAG;AAEvB,qBAAa,IAAI,IAAI;AACrB;AAAA,MACD;AAEA,eAAS,IAAI,IAAI;AAGjB,YAAM,OAAO,UAAU,IAAI,IAAI,KAAK;AACpC,YAAM,gBACL,KAAK,MAAM,iBAAiB,MAAM,QAClC,CAAC,KAAK,SAAS,UAAU,KACzB,CAAC,KAAK,SAAS,QAAQ,KACvB,CAAC,KAAK,SAAS,SAAS,KACxB,CAAC,KAAK,SAAS,SAAS,KACxB,CAAC,KAAK,SAAS,OAAO;AAEvB,UAAI,eAAe;AAElB,iBAAS,OAAO,IAAI;AACpB,gBAAQ,IAAI,IAAI;AAChB,gBAAQ,KAAK,IAAI;AACjB;AAAA,MACD;AAGA,YAAM,OAAO,KAAK,mBAAmB,IAAI,IAAI;AAC7C,UAAI,QAAQ,KAAK,OAAO,GAAG;AAC1B,mBAAW,OAAO,MAAM;AACvB,cAAI,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,GAAG;AACxE,kBAAM,GAAG;AAAA,UACV;AAAA,QACD;AAAA,MACD;AAEA,eAAS,OAAO,IAAI;AACpB,cAAQ,IAAI,IAAI;AAGhB,UAAI,CAAC,aAAa,IAAI,IAAI,GAAG;AAC5B,eAAO,KAAK,IAAI;AAAA,MACjB;AAAA,IACD;AAGA,UAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG,KAAK,QAAQ,KAAK,GAAG,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAC7F,eAAW,QAAQ,UAAU;AAC5B,YAAM,IAAI;AAAA,IACX;AAIA,eAAW,QAAQ,cAAc;AAChC,UAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACvB,eAAO,KAAK,IAAI;AAChB,gBAAQ,IAAI,IAAI;AAAA,MACjB;AAAA,IACD;AAGA,WAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAA0B;AACjC,UAAM,QAAQ;AAAA,MACb,cAAc,KAAK,QAAQ;AAAA,MAC3B,OAAO,KAAK,MAAM;AAAA,MAClB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,IAClB;AAGA,eAAW,QAAQ,KAAK,QAAQ,OAAO,GAAG;AACzC,UAAI,KAAK,SAAS,SAAS,EAAG,OAAM;AACpC,UAAI,KAAK,SAAS,sBAAsB,EAAG,OAAM;AACjD,UAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,GAAG;AAC/E,cAAM;AAAA,MACP;AAAA,IACD;AAEA,UAAM,SAAS;AAAA,MACd;AAAA,MACA,uBAAuB,MAAM,YAAY;AAAA,MACzC,eAAe,MAAM,KAAK;AAAA,MAC1B,6BAA6B,MAAM,gBAAgB;AAAA,MACnD,8BAA8B,MAAM,kBAAkB;AAAA,MACtD,0BAA0B,MAAM,eAAe;AAAA,IAChD;AAGA,QAAI,KAAK,QAAQ,oBAAoB,KAAK,YAAY,kBAAkB,GAAG;AAC1E,aAAO,KAAK,IAAI;AAChB,YAAM,iBAAiB,uBAAuB,KAAK,WAAW;AAC9D,iBAAW,QAAQ,eAAe,MAAM,IAAI,GAAG;AAC9C,eAAO,KAAK,QAAQ,IAAI,EAAE;AAAA,MAC3B;AAAA,IACD;AAEA,WAAO,KAAK,uBAAsB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AAE5D,WAAO;AAAA,EACR;AACD;;;Ac59BO,SAAS,aAAa,QAAgC;AAC5D,SAAO;AACR;","names":["schemaCode","typeCode","isNullable","isNullable","schemaStrings","union","merged","elseValidation","elseRequiredProps","generatePropertyAccess","definedProps","_a","isNullable","wrapNullable"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/openapi-generator.ts","../src/utils/name-utils.ts","../src/generators/enum-generator.ts","../src/utils/string-utils.ts","../src/generators/jsdoc-generator.ts","../src/utils/lru-cache.ts","../src/validators/array-validator.ts","../src/validators/composition-validator.ts","../src/validators/number-validator.ts","../src/validators/conditional-validator.ts","../src/validators/object-validator.ts","../src/validators/string-validator.ts","../src/generators/property-generator.ts","../src/utils/operation-filters.ts","../src/types.ts"],"sourcesContent":["export {\n\tCircularReferenceError,\n\tCliOptionsError,\n\tConfigValidationError,\n\tFileOperationError,\n\tGeneratorError,\n\tSchemaGenerationError,\n\tSpecValidationError,\n} from \"./errors\";\nexport { OpenApiGenerator } from \"./openapi-generator\";\nexport type {\n\tCommonSchemaOptions,\n\tConfigFile,\n\tExecutionMode,\n\tNativeEnumType,\n\tOpenAPISchema,\n\tOpenAPISpec,\n\tOpenApiGeneratorOptions,\n\tOperationFilters,\n\tRequestOptions,\n\tResponseOptions,\n\tTypeMode,\n} from \"./types\";\nexport { defineConfig } from \"./types\";\nexport {\n\tcreateFilterStatistics,\n\ttype FilterStatistics,\n\tformatFilterStatistics,\n\tshouldIncludeOperation,\n\tvalidateFilters,\n} from \"./utils/operation-filters\";\n","/**\n * Custom error classes for better error handling and debugging\n */\n\n/**\n * Base error class for all generator errors\n */\nexport class GeneratorError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly context?: Record<string, unknown>\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"GeneratorError\";\n\t\tError.captureStackTrace?.(this, this.constructor);\n\t}\n}\n\n/**\n * Error thrown when OpenAPI spec validation fails\n */\nexport class SpecValidationError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"SPEC_VALIDATION_ERROR\", context);\n\t\tthis.name = \"SpecValidationError\";\n\t}\n}\n\n/**\n * Error thrown when file operations fail\n */\nexport class FileOperationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly filePath: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"FILE_OPERATION_ERROR\", { ...context, filePath });\n\t\tthis.name = \"FileOperationError\";\n\t}\n}\n\n/**\n * Error thrown when config file is invalid\n */\nexport class ConfigValidationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly configPath?: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"CONFIG_VALIDATION_ERROR\", { ...context, configPath });\n\t\tthis.name = \"ConfigValidationError\";\n\t}\n}\n\n/**\n * Error thrown when schema generation fails\n */\nexport class SchemaGenerationError extends GeneratorError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly schemaName: string,\n\t\tcontext?: Record<string, unknown>\n\t) {\n\t\tsuper(message, \"SCHEMA_GENERATION_ERROR\", { ...context, schemaName });\n\t\tthis.name = \"SchemaGenerationError\";\n\t}\n}\n\n/**\n * Error thrown when circular reference is detected in schema\n */\nexport class CircularReferenceError extends SchemaGenerationError {\n\tconstructor(\n\t\tschemaName: string,\n\t\tpublic readonly referencePath: string[]\n\t) {\n\t\tconst pathStr = referencePath.join(\" -> \");\n\t\tsuper(`Circular reference detected in schema: ${pathStr}`, schemaName, { referencePath, circularPath: pathStr });\n\t\tthis.name = \"CircularReferenceError\";\n\t}\n}\n\n/**\n * Error thrown when CLI options are invalid\n */\nexport class CliOptionsError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"CLI_OPTIONS_ERROR\", context);\n\t\tthis.name = \"CliOptionsError\";\n\t}\n}\n\n/**\n * Error thrown when configuration is invalid or missing required values\n */\nexport class ConfigurationError extends GeneratorError {\n\tconstructor(message: string, context?: Record<string, unknown>) {\n\t\tsuper(message, \"CONFIGURATION_ERROR\", context);\n\t\tthis.name = \"ConfigurationError\";\n\t}\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, normalize } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { ConfigurationError, FileOperationError, SchemaGenerationError, SpecValidationError } from \"./errors\";\nimport { generateEnum } from \"./generators/enum-generator\";\nimport { generateJSDoc } from \"./generators/jsdoc-generator\";\nimport { PropertyGenerator } from \"./generators/property-generator\";\nimport type { OpenAPISchema, OpenAPISpec, OpenApiGeneratorOptions, ResolvedOptions, TypeMode } from \"./types\";\nimport { resolveRef, toCamelCase, toPascalCase } from \"./utils/name-utils\";\nimport {\n\tcreateFilterStatistics,\n\ttype FilterStatistics,\n\tformatFilterStatistics,\n\tshouldIncludeOperation,\n\tvalidateFilters,\n} from \"./utils/operation-filters\";\n\ntype SchemaContext = \"request\" | \"response\" | \"both\";\n\nexport class OpenApiGenerator {\n\tprivate schemas: Map<string, string> = new Map();\n\tprivate types: Map<string, string> = new Map();\n\tprivate enums: Map<string, string> = new Map();\n\tprivate nativeEnums: Map<string, string> = new Map();\n\tprivate schemaDependencies: Map<string, Set<string>> = new Map();\n\tprivate options: OpenApiGeneratorOptions;\n\tprivate spec: OpenAPISpec;\n\tprivate propertyGenerator: PropertyGenerator;\n\tprivate schemaUsageMap: Map<string, SchemaContext> = new Map();\n\tprivate schemaTypeModeMap: Map<string, TypeMode> = new Map();\n\tprivate requestOptions: ResolvedOptions;\n\tprivate responseOptions: ResolvedOptions;\n\tprivate needsZodImport = false;\n\tprivate filterStats: FilterStatistics = createFilterStatistics();\n\n\tconstructor(options: OpenApiGeneratorOptions) {\n\t\t// Validate input path early\n\t\tif (!options.input) {\n\t\t\tthrow new ConfigurationError(\"Input path is required\", { providedOptions: options });\n\t\t}\n\n\t\tthis.options = {\n\t\t\tmode: options.mode || \"normal\",\n\t\t\tinput: options.input,\n\t\t\toutput: options.output,\n\t\t\tincludeDescriptions: options.includeDescriptions ?? true,\n\t\t\tenumType: options.enumType || \"zod\",\n\t\t\tuseDescribe: options.useDescribe ?? false,\n\t\t\tschemaType: options.schemaType || \"all\",\n\t\t\tprefix: options.prefix,\n\t\t\tsuffix: options.suffix,\n\t\t\tshowStats: options.showStats ?? true,\n\t\t\tnativeEnumType: options.nativeEnumType || \"union\",\n\t\t\trequest: options.request,\n\t\t\tresponse: options.response,\n\t\t\toperationFilters: options.operationFilters,\n\t\t};\n\n\t\t// Validate input file exists\n\t\ttry {\n\t\t\tconst fs = require(\"node:fs\");\n\t\t\tif (!fs.existsSync(this.options.input)) {\n\t\t\t\tthrow new FileOperationError(`Input file not found: ${this.options.input}`, this.options.input);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileOperationError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\t// If fs.existsSync fails for another reason, continue and let readFileSync throw\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = readFileSync(this.options.input, \"utf-8\");\n\n\t\t\t// Try parsing as YAML first (works for both YAML and JSON)\n\t\t\ttry {\n\t\t\t\tthis.spec = parse(content);\n\t\t\t} catch (yamlError) {\n\t\t\t\t// If YAML parsing fails, try JSON\n\t\t\t\ttry {\n\t\t\t\t\tthis.spec = JSON.parse(content);\n\t\t\t\t} catch {\n\t\t\t\t\tif (yamlError instanceof Error) {\n\t\t\t\t\t\tconst errorMessage = [\n\t\t\t\t\t\t\t`Failed to parse OpenAPI specification from: ${this.options.input}`,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t`Error: ${yamlError.message}`,\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\"Please ensure:\",\n\t\t\t\t\t\t\t\" - The file exists and is readable\",\n\t\t\t\t\t\t\t\" - The file contains valid YAML or JSON syntax\",\n\t\t\t\t\t\t\t\" - The file is a valid OpenAPI 3.x specification\",\n\t\t\t\t\t\t].join(\"\\n\");\n\t\t\t\t\t\tthrow new SpecValidationError(errorMessage, {\n\t\t\t\t\t\t\tfilePath: this.options.input,\n\t\t\t\t\t\t\toriginalError: yamlError.message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthrow yamlError;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof SpecValidationError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (error instanceof Error) {\n\t\t\t\tconst errorMessage = [\n\t\t\t\t\t`Failed to read OpenAPI specification from: ${this.options.input}`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t`Error: ${error.message}`,\n\t\t\t\t].join(\"\\n\");\n\t\t\t\tthrow new SpecValidationError(errorMessage, { filePath: this.options.input, originalError: error.message });\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\tthis.validateSpec();\n\n\t\t// Resolve options for request and response contexts\n\t\tthis.requestOptions = this.resolveOptionsForContext(\"request\");\n\t\tthis.responseOptions = this.resolveOptionsForContext(\"response\");\n\n\t\t// Analyze schema usage to determine context (request/response/both)\n\t\tthis.analyzeSchemaUsage();\n\n\t\t// Determine typeMode for each schema based on usage context\n\t\tthis.determineSchemaTypeModes();\n\n\t\t// Initialize property generator with context\n\t\t// We'll update this dynamically based on schema context during generation\n\t\tthis.propertyGenerator = new PropertyGenerator({\n\t\t\tspec: this.spec,\n\t\t\tschemaDependencies: this.schemaDependencies,\n\t\t\tschemaType: this.options.schemaType || \"all\",\n\t\t\tmode: this.requestOptions.mode,\n\t\t\tincludeDescriptions: this.requestOptions.includeDescriptions,\n\t\t\tuseDescribe: this.requestOptions.useDescribe,\n\t\t\ttypeMode: this.requestOptions.typeMode,\n\t\t\tnativeEnumType: this.requestOptions.nativeEnumType,\n\t\t\tnamingOptions: {\n\t\t\t\tprefix: this.options.prefix,\n\t\t\t\tsuffix: this.options.suffix,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Generate schemas as a string (without writing to file)\n\t * @returns The generated TypeScript code as a string\n\t */\n\tgenerateString(): string {\n\t\tif (!this.spec.components?.schemas) {\n\t\t\tthrow new SpecValidationError(\"No schemas found in OpenAPI spec\", { filePath: this.options.input });\n\t\t}\n\n\t\t// First pass: generate enums\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\tif (schema.enum) {\n\t\t\t\tconst context = this.schemaUsageMap.get(name);\n\t\t\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\n\t\t\t\t// For enums, use enumType option to determine generation strategy\n\t\t\t\tif (resolvedOptions.enumType === \"typescript\") {\n\t\t\t\t\t// Generate native TypeScript enum\n\t\t\t\t\tthis.generateNativeEnum(name, schema);\n\t\t\t\t} else {\n\t\t\t\t\t// Generate Zod enum - will create schema in second pass\n\t\t\t\t\tconst { enumCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\t\tenumType: \"zod\",\n\t\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t\t});\n\t\t\t\t\tif (enumCode) {\n\t\t\t\t\t\tthis.enums.set(name, enumCode);\n\t\t\t\t\t\t// Mark that we need Zod import for enum schemas\n\t\t\t\t\t\tthis.needsZodImport = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Second pass: generate schemas/types and track dependencies\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\tthis.generateComponentSchema(name, schema);\n\t\t}\n\n\t\t// Third pass: generate query parameter schemas from path operations\n\t\tthis.generateQueryParameterSchemas();\n\n\t\t// Fourth pass: generate header parameter schemas from path operations\n\t\tthis.generateHeaderParameterSchemas();\n\n\t\t// Validate filters and emit warnings if needed\n\t\tvalidateFilters(this.filterStats, this.options.operationFilters);\n\n\t\t// Sort schemas by dependencies\n\t\tconst orderedSchemaNames = this.topologicalSort();\n\n\t\t// Build output\n\t\tconst output: string[] = [\"// Auto-generated by @cerios/openapi-to-zod\", \"// Do not edit this file manually\", \"\"];\n\n\t\t// Add statistics if enabled (must be explicitly true)\n\t\tif (this.options.showStats === true) {\n\t\t\toutput.push(...this.generateStats());\n\t\t\toutput.push(\"\");\n\t\t}\n\n\t\t// Conditionally import Zod only if needed\n\t\tif (this.needsZodImport) {\n\t\t\toutput.push('import { z } from \"zod\";');\n\t\t\toutput.push(\"\");\n\t\t}\n\n\t\t// Add native enums first (they have no dependencies and are referenced by value)\n\t\tif (this.nativeEnums.size > 0) {\n\t\t\toutput.push(\"// Native Enums\");\n\t\t\tfor (const enumCode of this.nativeEnums.values()) {\n\t\t\t\toutput.push(enumCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\n\n\t\t// Add schemas, types, and zod enums in dependency order (grouped by schema)\n\t\toutput.push(\"// Schemas and Types\");\n\t\tfor (const name of orderedSchemaNames) {\n\t\t\tconst enumCode = this.enums.get(name);\n\t\t\tconst schemaCode = this.schemas.get(name);\n\t\t\tconst typeCode = this.types.get(name);\n\n\t\t\tif (enumCode) {\n\t\t\t\t// Zod enum schema\n\t\t\t\toutput.push(enumCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (schemaCode) {\n\t\t\t\t// Zod schema with inferred type\n\t\t\t\toutput.push(schemaCode);\n\n\t\t\t\t// Add type immediately after schema (if not already included)\n\t\t\t\tif (!schemaCode.includes(`export type ${name}`)) {\n\t\t\t\t\tconst schemaName = `${toCamelCase(name, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\t\t\toutput.push(`export type ${name} = z.infer<typeof ${schemaName}>;`);\n\t\t\t\t}\n\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (typeCode) {\n\t\t\t\t// Native TypeScript type\n\t\t\t\toutput.push(typeCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\n\n\t\treturn output.join(\"\\n\");\n\t}\n\n\t/**\n\t * Ensure directory exists for a file path\n\t */\n\tprivate ensureDirectoryExists(filePath: string): void {\n\t\tconst normalizedPath = normalize(filePath);\n\t\tconst dir = dirname(normalizedPath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\t}\n\n\t/**\n\t * Generate the complete output file\n\t */\n\tgenerate(): void {\n\t\tif (!this.options.output) {\n\t\t\tthrow new ConfigurationError(\n\t\t\t\t\"Output path is required when calling generate(). \" +\n\t\t\t\t\t\"Either provide an 'output' option or use generateString() to get the result as a string.\",\n\t\t\t\t{ hasOutput: false }\n\t\t\t);\n\t\t}\n\t\tconst output = this.generateString();\n\t\tconst normalizedOutput = normalize(this.options.output);\n\t\tthis.ensureDirectoryExists(normalizedOutput);\n\t\twriteFileSync(normalizedOutput, output);\n\t}\n\n\t/**\n\t * Resolve options for a specific context (request or response)\n\t * Nested options silently override root-level options\n\t * Response schemas always use 'inferred' mode (Zod schemas)\n\t */\n\tprivate resolveOptionsForContext(context: \"request\" | \"response\"): ResolvedOptions {\n\t\tconst contextOptions = context === \"request\" ? this.options.request : this.options.response;\n\n\t\t// For nativeEnumType, only access it from request options since ResponseOptions doesn't have it\n\t\tconst nativeEnumType =\n\t\t\tcontext === \"request\"\n\t\t\t\t? (this.options.request?.nativeEnumType ?? this.options.nativeEnumType ?? \"union\")\n\t\t\t\t: (this.options.nativeEnumType ?? \"union\");\n\n\t\treturn {\n\t\t\tmode: contextOptions?.mode ?? this.options.mode ?? \"normal\",\n\t\t\tenumType: contextOptions?.enumType ?? this.options.enumType ?? \"zod\",\n\t\t\tuseDescribe: contextOptions?.useDescribe ?? this.options.useDescribe ?? false,\n\t\t\tincludeDescriptions: contextOptions?.includeDescriptions ?? this.options.includeDescriptions ?? true,\n\t\t\t// Response schemas always use 'inferred' mode (Zod schemas are required)\n\t\t\t// Request schemas can optionally use 'native' mode\n\t\t\ttypeMode: context === \"response\" ? \"inferred\" : (this.options.request?.typeMode ?? \"inferred\"),\n\t\t\tnativeEnumType,\n\t\t};\n\t}\n\n\t/**\n\t * Analyze schema usage across the OpenAPI spec to determine if schemas\n\t * are used in request, response, or both contexts\n\t */\n\tprivate analyzeSchemaUsage(): void {\n\t\tconst requestSchemas = new Set<string>();\n\t\tconst responseSchemas = new Set<string>();\n\n\t\t// Analyze paths section if available\n\t\tif (this.spec.paths) {\n\t\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\t\t\t\tfor (const method of methods) {\n\t\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\t\tif (typeof operation !== \"object\" || !operation) continue;\n\n\t\t\t\t\t// Track total operations\n\t\t\t\t\tthis.filterStats.totalOperations++;\n\n\t\t\t\t\t// Apply operation filters\n\t\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters, this.filterStats)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Count included operation\n\t\t\t\t\tthis.filterStats.includedOperations++;\n\n\t\t\t\t\t// Check request bodies\n\t\t\t\t\tif (\n\t\t\t\t\t\t\"requestBody\" in operation &&\n\t\t\t\t\t\toperation.requestBody &&\n\t\t\t\t\t\ttypeof operation.requestBody === \"object\" &&\n\t\t\t\t\t\t\"content\" in operation.requestBody &&\n\t\t\t\t\t\toperation.requestBody.content\n\t\t\t\t\t) {\n\t\t\t\t\t\tfor (const mediaType of Object.values(operation.requestBody.content)) {\n\t\t\t\t\t\t\tif (mediaType && typeof mediaType === \"object\" && \"schema\" in mediaType && mediaType.schema) {\n\t\t\t\t\t\t\t\tthis.extractSchemaRefs(mediaType.schema, requestSchemas);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check responses\n\t\t\t\t\tif (\"responses\" in operation && operation.responses && typeof operation.responses === \"object\") {\n\t\t\t\t\t\tfor (const response of Object.values(operation.responses)) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tresponse &&\n\t\t\t\t\t\t\t\ttypeof response === \"object\" &&\n\t\t\t\t\t\t\t\t\"content\" in response &&\n\t\t\t\t\t\t\t\tresponse.content &&\n\t\t\t\t\t\t\t\ttypeof response.content === \"object\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tfor (const mediaType of Object.values(response.content)) {\n\t\t\t\t\t\t\t\t\tif (mediaType && typeof mediaType === \"object\" && \"schema\" in mediaType && mediaType.schema) {\n\t\t\t\t\t\t\t\t\t\tthis.extractSchemaRefs(mediaType.schema, responseSchemas);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check parameters\n\t\t\t\t\tif (\"parameters\" in operation && Array.isArray(operation.parameters)) {\n\t\t\t\t\t\tfor (const param of operation.parameters) {\n\t\t\t\t\t\t\tif (param && typeof param === \"object\" && \"schema\" in param && param.schema) {\n\t\t\t\t\t\t\t\tthis.extractSchemaRefs(param.schema, requestSchemas);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand to include all transitively referenced schemas\n\t\t\tthis.expandTransitiveReferences(requestSchemas);\n\t\t\tthis.expandTransitiveReferences(responseSchemas);\n\t\t}\n\n\t\t// Fallback: analyze readOnly/writeOnly properties if paths not available\n\t\tif (!this.spec.paths || (requestSchemas.size === 0 && responseSchemas.size === 0)) {\n\t\t\tfor (const [name, schema] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\t\tconst hasReadOnly = this.hasReadOnlyProperties(schema);\n\t\t\t\tconst hasWriteOnly = this.hasWriteOnlyProperties(schema);\n\n\t\t\t\tif (hasWriteOnly && !hasReadOnly) {\n\t\t\t\t\trequestSchemas.add(name);\n\t\t\t\t} else if (hasReadOnly && !hasWriteOnly) {\n\t\t\t\t\tresponseSchemas.add(name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Build usage map with circular reference detection\n\t\tfor (const [name] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\tif (requestSchemas.has(name) && responseSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"both\");\n\t\t\t} else if (requestSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"request\");\n\t\t\t} else if (responseSchemas.has(name)) {\n\t\t\t\tthis.schemaUsageMap.set(name, \"response\");\n\t\t\t}\n\t\t\t// Unreferenced schemas are not added to map (will use root typeMode)\n\t\t}\n\n\t\t// Detect circular references and mark entire chain as \"both\"\n\t\tthis.detectCircularReferences();\n\t}\n\n\t/**\n\t * Expand a set of schemas to include all transitively referenced schemas\n\t */\n\tprivate expandTransitiveReferences(schemas: Set<string>): void {\n\t\tconst toProcess = Array.from(schemas);\n\t\tconst processed = new Set<string>();\n\n\t\twhile (toProcess.length > 0) {\n\t\t\tconst schemaName = toProcess.pop();\n\t\t\tif (!schemaName || processed.has(schemaName)) continue;\n\n\t\t\tprocessed.add(schemaName);\n\n\t\t\tconst schema = this.spec.components?.schemas?.[schemaName];\n\t\t\tif (schema) {\n\t\t\t\tconst refs = new Set<string>();\n\t\t\t\tthis.extractSchemaRefs(schema, refs);\n\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\tif (!schemas.has(ref)) {\n\t\t\t\t\t\tschemas.add(ref);\n\t\t\t\t\t\ttoProcess.push(ref);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract schema names from $ref and nested structures\n\t */\n\tprivate extractSchemaRefs(schema: any, refs: Set<string>): void {\n\t\tif (!schema) return;\n\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\trefs.add(refName);\n\t\t}\n\n\t\tif (schema.allOf) {\n\t\t\tfor (const subSchema of schema.allOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.oneOf) {\n\t\t\tfor (const subSchema of schema.oneOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.anyOf) {\n\t\t\tfor (const subSchema of schema.anyOf) {\n\t\t\t\tthis.extractSchemaRefs(subSchema, refs);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.items) {\n\t\t\tthis.extractSchemaRefs(schema.items, refs);\n\t\t}\n\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tthis.extractSchemaRefs(prop, refs);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if schema has readOnly properties\n\t */\n\tprivate hasReadOnlyProperties(schema: OpenAPISchema): boolean {\n\t\tif (schema.readOnly) return true;\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tif (this.hasReadOnlyProperties(prop)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if schema has writeOnly properties\n\t */\n\tprivate hasWriteOnlyProperties(schema: OpenAPISchema): boolean {\n\t\tif (schema.writeOnly) return true;\n\t\tif (schema.properties) {\n\t\t\tfor (const prop of Object.values(schema.properties)) {\n\t\t\t\tif (this.hasWriteOnlyProperties(prop)) return true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Detect circular references and mark them as \"both\" context for safety\n\t */\n\tprivate detectCircularReferences(): void {\n\t\tconst visited = new Set<string>();\n\t\tconst recursionStack = new Set<string>();\n\n\t\tconst detectCycle = (name: string): boolean => {\n\t\t\tif (recursionStack.has(name)) {\n\t\t\t\t// Found a cycle - mark all schemas in the cycle as \"both\"\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (visited.has(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvisited.add(name);\n\t\t\trecursionStack.add(name);\n\n\t\t\tconst schema = this.spec.components?.schemas?.[name];\n\t\t\tif (schema) {\n\t\t\t\tconst refs = new Set<string>();\n\t\t\t\tthis.extractSchemaRefs(schema, refs);\n\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\tif (detectCycle(ref)) {\n\t\t\t\t\t\t// Mark this schema as \"both\" since it's part of a circular chain\n\t\t\t\t\t\tthis.schemaUsageMap.set(name, \"both\");\n\t\t\t\t\t\trecursionStack.delete(name);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecursionStack.delete(name);\n\t\t\treturn false;\n\t\t};\n\n\t\tfor (const name of Object.keys(this.spec.components?.schemas || {})) {\n\t\t\tdetectCycle(name);\n\t\t}\n\t}\n\n\t/**\n\t * Determine the typeMode for each schema based on its usage context\n\t * Response schemas always use 'inferred' mode\n\t */\n\tprivate determineSchemaTypeModes(): void {\n\t\tfor (const [name] of Object.entries(this.spec.components?.schemas || {})) {\n\t\t\tconst context = this.schemaUsageMap.get(name);\n\n\t\t\tif (context === \"request\") {\n\t\t\t\tthis.schemaTypeModeMap.set(name, this.requestOptions.typeMode);\n\t\t\t} else if (context === \"response\") {\n\t\t\t\t// Response schemas always use 'inferred' mode (Zod schemas are required)\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t} else if (context === \"both\") {\n\t\t\t\t// Safety: always use inferred for schemas used in both contexts\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t} else {\n\t\t\t\t// Unreferenced schemas default to inferred\n\t\t\t\tthis.schemaTypeModeMap.set(name, \"inferred\");\n\t\t\t}\n\n\t\t\t// Track if we need Zod import\n\t\t\tif (this.schemaTypeModeMap.get(name) === \"inferred\") {\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate the OpenAPI specification\n\t */\n\tprivate validateSpec(): void {\n\t\tif (!this.spec.components?.schemas) {\n\t\t\tthrow new SpecValidationError(\n\t\t\t\t`No schemas found in OpenAPI spec at ${this.options.input}. Expected to find schemas at components.schemas`,\n\t\t\t\t{ filePath: this.options.input }\n\t\t\t);\n\t\t}\n\n\t\t// Validate all $refs can be resolved\n\t\tconst allSchemas = Object.keys(this.spec.components.schemas);\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\ttry {\n\t\t\t\tthis.validateSchemaRefs(name, schema, allSchemas);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tthrow new SchemaGenerationError(`Invalid schema '${name}': ${error.message}`, name, {\n\t\t\t\t\t\toriginalError: error.message,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validate all $ref references in a schema\n\t */\n\tprivate validateSchemaRefs(schemaName: string, schema: OpenAPISchema, allSchemas: string[], path = \"\"): void {\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\tif (!allSchemas.includes(refName)) {\n\t\t\t\tthrow new SpecValidationError(\n\t\t\t\t\t`Invalid reference${path ? ` at '${path}'` : \"\"}: ` +\n\t\t\t\t\t\t`'${schema.$ref}' points to non-existent schema '${refName}'`,\n\t\t\t\t\t{ schemaName, path, ref: schema.$ref, refName }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Recursively validate nested schemas\n\t\tif (schema.properties) {\n\t\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\t\tthis.validateSchemaRefs(schemaName, propSchema, allSchemas, path ? `${path}.${propName}` : propName);\n\t\t\t}\n\t\t}\n\n\t\tif (schema.items) {\n\t\t\tthis.validateSchemaRefs(schemaName, schema.items, allSchemas, `${path}[]`);\n\t\t}\n\n\t\tif (schema.prefixItems) {\n\t\t\tschema.prefixItems.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.prefixItems[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.allOf) {\n\t\t\tschema.allOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.allOf[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.oneOf) {\n\t\t\tschema.oneOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.oneOf[${i}]`);\n\t\t\t});\n\t\t}\n\n\t\tif (schema.anyOf) {\n\t\t\tschema.anyOf.forEach((s, i) => {\n\t\t\t\tthis.validateSchemaRefs(schemaName, s, allSchemas, `${path}.anyOf[${i}]`);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Generate schema for a component\n\t */\n\tprivate generateComponentSchema(name: string, schema: OpenAPISchema): void {\n\t\t// Initialize dependencies for this schema\n\t\tif (!this.schemaDependencies.has(name)) {\n\t\t\tthis.schemaDependencies.set(name, new Set());\n\t\t}\n\n\t\t// Get the typeMode for this schema\n\t\tconst typeMode = this.schemaTypeModeMap.get(name) || \"inferred\";\n\t\tconst context = this.schemaUsageMap.get(name);\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\n\t\t// Handle enums at the top level\n\t\tif (schema.enum) {\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t\t// Use enumType to determine generation strategy\n\t\t\tif (resolvedOptions.enumType === \"typescript\") {\n\t\t\t\t// TypeScript enum - native enum was generated in first pass, now generate schema\n\t\t\t\tconst { schemaCode, typeCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\tenumType: \"typescript\",\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t});\n\n\t\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\t} else {\n\t\t\t\t// Zod enum\n\t\t\t\tconst { enumCode, schemaCode, typeCode } = generateEnum(name, schema.enum, {\n\t\t\t\t\tenumType: \"zod\",\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t});\n\n\t\t\t\tif (enumCode) {\n\t\t\t\t\tthis.enums.set(name, enumCode);\n\t\t\t\t}\n\n\t\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeMode === \"native\") {\n\t\t\t// Generate native TypeScript type\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\t\t\tconst jsdocWithConstraints = this.addConstraintsToJSDoc(jsdoc, schema, resolvedOptions.includeDescriptions);\n\t\t\tconst typeDefinition = this.generateNativeTypeDefinition(schema, name);\n\t\t\tconst typeCode = `${jsdocWithConstraints}export type ${name} = ${typeDefinition};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t} else {\n\t\t\t// Generate Zod schema\n\t\t\tconst schemaName = `${toCamelCase(name, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t\t// For allOf with single $ref, track dependency manually since we simplify it\n\t\t\tif (schema.allOf && schema.allOf.length === 1 && schema.allOf[0].$ref) {\n\t\t\t\tconst refName = resolveRef(schema.allOf[0].$ref);\n\t\t\t\tthis.schemaDependencies.get(name)?.add(refName);\n\t\t\t}\n\n\t\t\t// Update property generator context for this schema\n\t\t\tthis.propertyGenerator = new PropertyGenerator({\n\t\t\t\tspec: this.spec,\n\t\t\t\tschemaDependencies: this.schemaDependencies,\n\t\t\t\tschemaType: this.options.schemaType || \"all\",\n\t\t\t\tmode: resolvedOptions.mode,\n\t\t\t\tincludeDescriptions: resolvedOptions.includeDescriptions,\n\t\t\t\tuseDescribe: resolvedOptions.useDescribe,\n\t\t\t\ttypeMode: resolvedOptions.typeMode,\n\t\t\t\tnativeEnumType: resolvedOptions.nativeEnumType,\n\t\t\t\tnamingOptions: {\n\t\t\t\t\tprefix: this.options.prefix,\n\t\t\t\t\tsuffix: this.options.suffix,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// Check if this is just a simple $ref (alias)\n\t\t\tconst isAlias = !!(schema.$ref && !schema.properties && !schema.allOf && !schema.oneOf && !schema.anyOf);\n\t\t\tconst zodSchema = this.propertyGenerator.generatePropertySchema(schema, name, isAlias);\n\t\t\tconst zodSchemaCode = `${jsdoc}export const ${schemaName} = ${zodSchema};`;\n\n\t\t\t// Track dependencies from discriminated unions\n\t\t\t// Extract schema references like \"carSchema, truckSchema\" from discriminatedUnion calls\n\t\t\tif (zodSchema.includes(\"z.discriminatedUnion(\")) {\n\t\t\t\tconst match = zodSchema.match(/z\\.discriminatedUnion\\([^,]+,\\s*\\[([^\\]]+)\\]/);\n\t\t\t\tif (match) {\n\t\t\t\t\tconst refs = match[1].split(\",\").map(ref => ref.trim());\n\t\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\t\t// Extract schema name from camelCase reference (e.g., \"carSchema\" -> \"Car\")\n\t\t\t\t\t\tconst depMatch = ref.match(/^([a-z][a-zA-Z0-9]*?)Schema$/);\n\t\t\t\t\t\tif (depMatch) {\n\t\t\t\t\t\t\t// Convert camelCase to PascalCase (carSchema -> Car)\n\t\t\t\t\t\t\tconst depName = depMatch[1].charAt(0).toUpperCase() + depMatch[1].slice(1);\n\t\t\t\t\t\t\tthis.schemaDependencies.get(name)?.add(depName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.schemas.set(name, zodSchemaCode);\n\t\t}\n\t}\n\n\t/**\n\t * Generate query parameter schemas for each operation\n\t */\n\tprivate generateQueryParameterSchemas(): void {\n\t\tif (!this.spec.paths) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\tif (!pathItem || typeof pathItem !== \"object\") continue;\n\n\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\tif (!operation) continue;\n\n\t\t\t\t// Apply operation filters (stats already tracked in analyzeSchemaUsage)\n\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip operations without operationId or parameters\n\t\t\t\tif (!operation.operationId || !operation.parameters || !Array.isArray(operation.parameters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter for query parameters only\n\t\t\t\tconst queryParams = operation.parameters.filter(\n\t\t\t\t\t(param: any) => param && typeof param === \"object\" && param.in === \"query\"\n\t\t\t\t);\n\n\t\t\t\tif (queryParams.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Generate schema name from operationId\n\t\t\t\t// Use toPascalCase only for kebab-case IDs, simple capitalization for camelCase\n\t\t\t\tconst pascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\tconst schemaName = `${pascalOperationId}QueryParams`; // Initialize dependencies for this schema\n\t\t\t\tif (!this.schemaDependencies.has(schemaName)) {\n\t\t\t\t\tthis.schemaDependencies.set(schemaName, new Set());\n\t\t\t\t}\n\n\t\t\t\t// Build object schema properties\n\t\t\t\tconst properties: Record<string, string> = {};\n\t\t\t\tconst required: string[] = [];\n\n\t\t\t\tfor (const param of queryParams) {\n\t\t\t\t\tconst paramName = param.name;\n\t\t\t\t\tconst isRequired = param.required === true;\n\t\t\t\t\tconst paramSchema = param.schema;\n\n\t\t\t\t\tif (!paramSchema) continue;\n\n\t\t\t\t\t// Generate Zod schema for this parameter\n\t\t\t\t\tlet zodType = this.generateQueryParamType(paramSchema, param);\n\n\t\t\t\t\t// Handle arrays with serialization styles\n\t\t\t\t\tif (paramSchema.type === \"array\" && paramSchema.items) {\n\t\t\t\t\t\tconst itemType = this.generateQueryParamType(paramSchema.items, param);\n\n\t\t\t\t\t\t// Note: Query param arrays are sent as strings and need to be split on the client side\n\t\t\t\t\t\t// The style is documented but validation is for the array type\n\t\t\t\t\t\tzodType = `z.array(${itemType})`;\n\n\t\t\t\t\t\t// Description is handled by addDescription below\n\t\t\t\t\t} // Add description if available (before .optional())\n\t\t\t\t\tif (param.description && this.requestOptions.includeDescriptions) {\n\t\t\t\t\t\tif (this.requestOptions.useDescribe) {\n\t\t\t\t\t\t\tzodType = `${zodType}.describe(${JSON.stringify(param.description)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Make optional if not required (don't add defaults)\n\t\t\t\t\tif (!isRequired) {\n\t\t\t\t\t\tzodType = `${zodType}.optional()`;\n\t\t\t\t\t}\n\n\t\t\t\t\tproperties[paramName] = zodType;\n\t\t\t\t\tif (isRequired) {\n\t\t\t\t\t\trequired.push(paramName);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Track dependencies from schema references\n\t\t\t\t\tif (paramSchema.$ref) {\n\t\t\t\t\t\tconst refName = resolveRef(paramSchema.$ref);\n\t\t\t\t\t\tthis.schemaDependencies.get(schemaName)?.add(refName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Generate the object schema code\n\t\t\t\tconst objectMode = this.requestOptions.mode;\n\t\t\t\tconst zodMethod = objectMode === \"strict\" ? \"strictObject\" : objectMode === \"loose\" ? \"looseObject\" : \"object\";\n\n\t\t\t\tconst propsCode = Object.entries(properties)\n\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t// Quote property names that contain special characters or are not valid identifiers\n\t\t\t\t\t\tconst needsQuotes = !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key);\n\t\t\t\t\t\tconst quotedKey = needsQuotes ? `\"${key}\"` : key;\n\t\t\t\t\t\treturn ` ${quotedKey}: ${value}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\",\\n\");\n\n\t\t\t\tconst schemaCode = `z.${zodMethod}({\\n${propsCode}\\n})`; // Apply prefix/suffix to the operation name only, then add QueryParams and Schema\n\t\t\t\tconst operationName = pascalOperationId; // Already PascalCase\n\t\t\t\tconst prefixedName = this.options.prefix\n\t\t\t\t\t? `${toPascalCase(this.options.prefix)}${operationName}`\n\t\t\t\t\t: operationName;\n\t\t\t\tconst suffixedName = this.options.suffix ? `${prefixedName}${toPascalCase(this.options.suffix)}` : prefixedName;\n\t\t\t\tconst camelCaseSchemaName = `${suffixedName.charAt(0).toLowerCase() + suffixedName.slice(1)}QueryParamsSchema`;\n\n\t\t\t\t// Generate JSDoc\n\t\t\t\tconst jsdoc = `/**\\n * Query parameters for ${operation.operationId}\\n */\\n`;\n\t\t\t\tconst fullSchemaCode = `${jsdoc}export const ${camelCaseSchemaName} = ${schemaCode};`;\n\n\t\t\t\tthis.schemas.set(schemaName, fullSchemaCode);\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate header parameter schemas for each operation\n\t * Header parameters are always string type (HTTP header semantics)\n\t */\n\tprivate generateHeaderParameterSchemas(): void {\n\t\tif (!this.spec.paths) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [path, pathItem] of Object.entries(this.spec.paths)) {\n\t\t\tif (!pathItem || typeof pathItem !== \"object\") continue;\n\n\t\t\tconst methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"];\n\n\t\t\tfor (const method of methods) {\n\t\t\t\tconst operation = (pathItem as any)[method];\n\t\t\t\tif (!operation) continue;\n\n\t\t\t\t// Apply operation filters\n\t\t\t\tif (!shouldIncludeOperation(operation, path, method, this.options.operationFilters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip operations without operationId or parameters\n\t\t\t\tif (!operation.operationId || !operation.parameters || !Array.isArray(operation.parameters)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Filter for header parameters only\n\t\t\t\tconst headerParams = operation.parameters.filter(\n\t\t\t\t\t(param: any) => param && typeof param === \"object\" && param.in === \"header\"\n\t\t\t\t);\n\n\t\t\t\tif (headerParams.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Generate schema name from operationId\n\t\t\t\tconst pascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\tconst schemaName = `${pascalOperationId}HeaderParams`;\n\n\t\t\t\t// Initialize dependencies for this schema\n\t\t\t\tif (!this.schemaDependencies.has(schemaName)) {\n\t\t\t\t\tthis.schemaDependencies.set(schemaName, new Set());\n\t\t\t\t}\n\n\t\t\t\t// Build object schema properties (headers are always strings)\n\t\t\t\tconst properties: Record<string, string> = {};\n\n\t\t\t\tfor (const param of headerParams) {\n\t\t\t\t\tconst paramName = param.name;\n\t\t\t\t\tconst paramSchema = param.schema;\n\n\t\t\t\t\tif (!paramSchema) continue;\n\n\t\t\t\t\t// Headers are always strings in HTTP, regardless of schema type\n\t\t\t\t\tlet zodType = \"z.string()\";\n\n\t\t\t\t\t// Add description if available\n\t\t\t\t\tif (param.description && this.requestOptions.includeDescriptions) {\n\t\t\t\t\t\tif (this.requestOptions.useDescribe) {\n\t\t\t\t\t\t\tzodType = `${zodType}.describe(${JSON.stringify(param.description)})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Headers are always optional in service layer (as per requirements)\n\t\t\t\t\tzodType = `${zodType}.optional()`;\n\n\t\t\t\t\tproperties[paramName] = zodType;\n\n\t\t\t\t\t// Track dependencies from schema references (if any)\n\t\t\t\t\tif (paramSchema.$ref) {\n\t\t\t\t\t\tconst refName = resolveRef(paramSchema.$ref);\n\t\t\t\t\t\tthis.schemaDependencies.get(schemaName)?.add(refName);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Generate the object schema code\n\t\t\t\tconst objectMode = this.requestOptions.mode;\n\t\t\t\tconst zodMethod = objectMode === \"strict\" ? \"strictObject\" : objectMode === \"loose\" ? \"looseObject\" : \"object\";\n\n\t\t\t\tconst propsCode = Object.entries(properties)\n\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t// Quote property names that contain special characters or are not valid identifiers\n\t\t\t\t\t\tconst needsQuotes = !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key);\n\t\t\t\t\t\tconst quotedKey = needsQuotes ? `\"${key}\"` : key;\n\t\t\t\t\t\treturn ` ${quotedKey}: ${value}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\",\\n\");\n\n\t\t\t\tconst schemaCode = `z.${zodMethod}({\\n${propsCode}\\n})`;\n\n\t\t\t\t// Apply prefix/suffix to the operation name only, then add HeaderParams and Schema\n\t\t\t\tconst operationName = pascalOperationId;\n\t\t\t\tconst prefixedName = this.options.prefix\n\t\t\t\t\t? `${toPascalCase(this.options.prefix)}${operationName}`\n\t\t\t\t\t: operationName;\n\t\t\t\tconst suffixedName = this.options.suffix ? `${prefixedName}${toPascalCase(this.options.suffix)}` : prefixedName;\n\t\t\t\tconst camelCaseSchemaName = `${suffixedName.charAt(0).toLowerCase() + suffixedName.slice(1)}HeaderParamsSchema`;\n\n\t\t\t\t// Generate JSDoc\n\t\t\t\tconst jsdoc = `/**\\n * Header parameters for ${operation.operationId}\\n */\\n`;\n\t\t\t\tconst fullSchemaCode = `${jsdoc}export const ${camelCaseSchemaName} = ${schemaCode};`;\n\n\t\t\t\tthis.schemas.set(schemaName, fullSchemaCode);\n\t\t\t\tthis.needsZodImport = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate Zod type for a query parameter schema\n\t */\n\tprivate generateQueryParamType(schema: OpenAPISchema, param: any): string {\n\t\t// Handle references\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\tconst schemaName = toCamelCase(refName, { prefix: this.options.prefix, suffix: this.options.suffix });\n\t\t\treturn `${schemaName}Schema`;\n\t\t}\n\n\t\t// Handle enums\n\t\tif (schema.enum) {\n\t\t\tconst enumValues = schema.enum.map(v => (typeof v === \"string\" ? `\"${v}\"` : v)).join(\", \");\n\t\t\treturn `z.enum([${enumValues}])`;\n\t\t}\n\n\t\t// Handle primitive types\n\t\tconst type = schema.type;\n\n\t\tif (type === \"string\") {\n\t\t\tlet zodType = \"z.string()\";\n\t\t\t// Add string validations\n\t\t\tif (schema.minLength !== undefined) zodType = `${zodType}.min(${schema.minLength})`;\n\t\t\tif (schema.maxLength !== undefined) zodType = `${zodType}.max(${schema.maxLength})`;\n\t\t\tif (schema.pattern) zodType = `${zodType}.regex(/${schema.pattern}/)`;\n\t\t\tif (schema.format === \"email\") zodType = `${zodType}.email()`;\n\t\t\tif (schema.format === \"uri\" || schema.format === \"url\") zodType = `${zodType}.url()`;\n\t\t\tif (schema.format === \"uuid\") zodType = `${zodType}.uuid()`;\n\t\t\treturn zodType;\n\t\t}\n\n\t\tif (type === \"number\" || type === \"integer\") {\n\t\t\tlet zodType = type === \"integer\" ? \"z.number().int()\" : \"z.number()\";\n\t\t\t// Add number validations\n\t\t\tif (schema.minimum !== undefined) {\n\t\t\t\tzodType = schema.exclusiveMinimum ? `${zodType}.gt(${schema.minimum})` : `${zodType}.gte(${schema.minimum})`;\n\t\t\t}\n\t\t\tif (schema.maximum !== undefined) {\n\t\t\t\tzodType = schema.exclusiveMaximum ? `${zodType}.lt(${schema.maximum})` : `${zodType}.lte(${schema.maximum})`;\n\t\t\t}\n\t\t\treturn zodType;\n\t\t}\n\n\t\tif (type === \"boolean\") {\n\t\t\treturn \"z.boolean()\";\n\t\t}\n\n\t\tif (type === \"array\" && schema.items) {\n\t\t\tconst itemType = this.generateQueryParamType(schema.items, param);\n\t\t\tlet arrayType = `z.array(${itemType})`;\n\t\t\t// Add array validations\n\t\t\tif (schema.minItems !== undefined) arrayType = `${arrayType}.min(${schema.minItems})`;\n\t\t\tif (schema.maxItems !== undefined) arrayType = `${arrayType}.max(${schema.maxItems})`;\n\t\t\treturn arrayType;\n\t\t}\n\n\t\t// Fallback to z.unknown() for unhandled types\n\t\treturn \"z.unknown()\";\n\t}\n\n\t/**\n\t * Generate native TypeScript enum\n\t */\n\tprivate generateNativeEnum(name: string, schema: OpenAPISchema): void {\n\t\tif (!schema.enum) return;\n\n\t\tconst context = this.schemaUsageMap.get(name);\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\tif (resolvedOptions.nativeEnumType === \"enum\") {\n\t\t\t// Generate TypeScript enum with Enum suffix (no prefix/suffix)\n\t\t\tconst enumName = `${name}Enum`;\n\t\t\tconst members = schema.enum\n\t\t\t\t.map(value => {\n\t\t\t\t\tconst key = typeof value === \"string\" ? this.toEnumKey(value) : `N${value}`;\n\t\t\t\t\tconst val = typeof value === \"string\" ? `\"${value}\"` : value;\n\t\t\t\t\treturn ` ${key} = ${val}`;\n\t\t\t\t})\n\t\t\t\t.join(\",\\n\");\n\n\t\t\tconst enumCode = `${jsdoc}export enum ${enumName} {\\n${members}\\n}`;\n\t\t\tthis.nativeEnums.set(name, enumCode);\n\n\t\t\t// Also create a type alias for convenience\n\t\t\tconst typeCode = `export type ${name} = ${enumName};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t} else {\n\t\t\t// Generate union type\n\t\t\tconst unionType = schema.enum.map(v => (typeof v === \"string\" ? `\"${v}\"` : v)).join(\" | \");\n\t\t\tconst typeCode = `${jsdoc}export type ${name} = ${unionType};`;\n\t\t\tthis.types.set(name, typeCode);\n\t\t}\n\t}\n\n\t/**\n\t * Convert string to valid enum key\n\t */\n\tprivate toEnumKey(value: string): string {\n\t\t// Convert to PascalCase and ensure it starts with a letter\n\t\tconst cleaned = value.replace(/[^a-zA-Z0-9]/g, \"_\");\n\t\tconst pascalCase = cleaned\n\t\t\t.split(\"_\")\n\t\t\t.map(part => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n\t\t\t.join(\"\");\n\t\treturn pascalCase || \"Value\";\n\t}\n\n\t/**\n\t * Add constraint annotations to JSDoc for native types\n\t */\n\tprivate addConstraintsToJSDoc(jsdoc: string, schema: OpenAPISchema, includeDescriptions: boolean): string {\n\t\tif (!includeDescriptions) return jsdoc;\n\n\t\tconst constraints: string[] = [];\n\n\t\tif (schema.minLength !== undefined) constraints.push(`@minLength ${schema.minLength}`);\n\t\tif (schema.maxLength !== undefined) constraints.push(`@maxLength ${schema.maxLength}`);\n\t\tif (schema.pattern) constraints.push(`@pattern ${schema.pattern}`);\n\t\tif (schema.minimum !== undefined) constraints.push(`@minimum ${schema.minimum}`);\n\t\tif (schema.maximum !== undefined) constraints.push(`@maximum ${schema.maximum}`);\n\t\tif (schema.minItems !== undefined) constraints.push(`@minItems ${schema.minItems}`);\n\t\tif (schema.maxItems !== undefined) constraints.push(`@maxItems ${schema.maxItems}`);\n\t\tif (schema.minProperties !== undefined) constraints.push(`@minProperties ${schema.minProperties}`);\n\t\tif (schema.maxProperties !== undefined) constraints.push(`@maxProperties ${schema.maxProperties}`);\n\t\tif (schema.multipleOf !== undefined) constraints.push(`@multipleOf ${schema.multipleOf}`);\n\t\tif (schema.format) constraints.push(`@format ${schema.format}`);\n\n\t\tif (constraints.length === 0) return jsdoc;\n\n\t\t// If there's already a JSDoc, add constraints to it\n\t\tif (jsdoc) {\n\t\t\tconst lines = jsdoc.trim().split(\"\\n\");\n\t\t\tif (lines[0] === \"/**\" && lines[lines.length - 1] === \" */\") {\n\t\t\t\t// Multi-line JSDoc\n\t\t\t\tconst newLines = [...lines.slice(0, -1), ...constraints.map(c => ` * ${c}`), \" */\\n\"];\n\t\t\t\treturn newLines.join(\"\\n\");\n\t\t\t}\n\t\t\t// Single-line JSDoc\n\t\t\tconst content = jsdoc.replace(\"/** \", \"\").replace(\" */\\n\", \"\");\n\t\t\treturn `/**\\n * ${content}\\n${constraints.map(c => ` * ${c}`).join(\"\\n\")}\\n */\\n`;\n\t\t}\n\n\t\t// No existing JSDoc, create new one with just constraints\n\t\treturn `/**\\n${constraints.map(c => ` * ${c}`).join(\"\\n\")}\\n */\\n`;\n\t}\n\n\t/**\n\t * Generate native TypeScript type definition from OpenAPI schema\n\t */\n\tprivate generateNativeTypeDefinition(schema: OpenAPISchema, _schemaName?: string): string {\n\t\t// Handle $ref\n\t\tif (schema.$ref) {\n\t\t\treturn resolveRef(schema.$ref);\n\t\t}\n\n\t\t// Handle const\n\t\tif (schema.const !== undefined) {\n\t\t\treturn typeof schema.const === \"string\" ? `\"${schema.const}\"` : String(schema.const);\n\t\t}\n\n\t\t// Handle nullable\n\t\tconst isNullable = schema.nullable || (Array.isArray(schema.type) && schema.type.includes(\"null\"));\n\t\tconst wrapNullable = (type: string) => (isNullable ? `(${type}) | null` : type);\n\n\t\t// Get primary type\n\t\tconst primaryType = Array.isArray(schema.type) ? schema.type.find(t => t !== \"null\") : schema.type;\n\n\t\t// Handle different types\n\t\tswitch (primaryType) {\n\t\t\tcase \"string\":\n\t\t\t\treturn wrapNullable(\"string\");\n\t\t\tcase \"number\":\n\t\t\tcase \"integer\":\n\t\t\t\treturn wrapNullable(\"number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn wrapNullable(\"boolean\");\n\t\t\tcase \"array\":\n\t\t\t\tif (schema.items) {\n\t\t\t\t\tconst itemType = this.generateNativeTypeDefinition(schema.items);\n\t\t\t\t\treturn wrapNullable(`${itemType}[]`);\n\t\t\t\t}\n\t\t\t\treturn wrapNullable(\"unknown[]\");\n\t\t\tcase \"object\":\n\t\t\t\treturn wrapNullable(this.generateObjectType(schema));\n\t\t\tdefault:\n\t\t\t\t// Handle composition schemas\n\t\t\t\tif (schema.allOf) {\n\t\t\t\t\tconst types = schema.allOf.map(s => this.generateNativeTypeDefinition(s));\n\t\t\t\t\treturn wrapNullable(types.join(\" & \"));\n\t\t\t\t}\n\t\t\t\tif (schema.oneOf || schema.anyOf) {\n\t\t\t\t\tconst schemas = schema.oneOf || schema.anyOf || [];\n\t\t\t\t\tconst types = schemas.map(s => this.generateNativeTypeDefinition(s));\n\t\t\t\t\treturn wrapNullable(types.join(\" | \"));\n\t\t\t\t}\n\t\t\t\treturn wrapNullable(\"unknown\");\n\t\t}\n\t}\n\n\t/**\n\t * Generate TypeScript object type definition\n\t */\n\tprivate generateObjectType(schema: OpenAPISchema): string {\n\t\tif (!schema.properties || Object.keys(schema.properties).length === 0) {\n\t\t\treturn \"Record<string, unknown>\";\n\t\t}\n\n\t\tconst context = this.schemaUsageMap.get(schema.$ref ? resolveRef(schema.$ref) : \"\");\n\t\tconst resolvedOptions = context === \"response\" ? this.responseOptions : this.requestOptions;\n\t\tconst required = new Set(schema.required || []);\n\t\tconst props: string[] = [];\n\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propType = this.generateNativeTypeDefinition(propSchema);\n\t\t\tconst optional = !required.has(propName) ? \"?\" : \"\";\n\n\t\t\t// Generate JSDoc with constraints\n\t\t\tlet propJsdoc = generateJSDoc(propSchema, propName, { includeDescriptions: resolvedOptions.includeDescriptions });\n\t\t\tif (resolvedOptions.includeDescriptions && !propJsdoc) {\n\t\t\t\t// Add constraint-only JSDoc if no description exists\n\t\t\t\tpropJsdoc = this.addConstraintsToJSDoc(\"\", propSchema, resolvedOptions.includeDescriptions);\n\t\t\t} else if (propJsdoc && resolvedOptions.includeDescriptions) {\n\t\t\t\t// Add constraints to existing JSDoc\n\t\t\t\tpropJsdoc = this.addConstraintsToJSDoc(propJsdoc, propSchema, resolvedOptions.includeDescriptions);\n\t\t\t}\n\n\t\t\tif (propJsdoc) {\n\t\t\t\t// Remove trailing newline for inline property JSDoc\n\t\t\t\tconst cleanJsdoc = propJsdoc.trimEnd();\n\t\t\t\tprops.push(` ${cleanJsdoc}\\n ${propName}${optional}: ${propType};`);\n\t\t\t} else {\n\t\t\t\tprops.push(` ${propName}${optional}: ${propType};`);\n\t\t\t}\n\t\t}\n\n\t\treturn `{\\n${props.join(\"\\n\")}\\n}`;\n\t}\n\n\t/**\n\t * Topological sort for schema dependencies\n\t * Returns schemas in the order they should be declared\n\t */\n\tprivate topologicalSort(): string[] {\n\t\tconst sorted: string[] = [];\n\t\tconst visited = new Set<string>();\n\t\tconst visiting = new Set<string>();\n\t\tconst aliases: string[] = [];\n\t\tconst circularDeps = new Set<string>(); // Track schemas involved in circular dependencies\n\n\t\t// Performance optimization: Cache schema and type code lookups\n\t\tconst codeCache = new Map<string, string>();\n\t\tfor (const [name, code] of this.enums) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\t\tfor (const [name, code] of this.schemas) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\t\tfor (const [name, code] of this.types) {\n\t\t\tcodeCache.set(name, code);\n\t\t}\n\n\t\tconst visit = (name: string): void => {\n\t\t\tif (visited.has(name)) return;\n\n\t\t\t// Detect circular dependencies\n\t\t\tif (visiting.has(name)) {\n\t\t\t\t// Mark this as a circular dependency but don't add it yet\n\t\t\t\tcircularDeps.add(name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisiting.add(name);\n\n\t\t\t// Check if this is a simple alias (just assigns another schema directly)\n\t\t\tconst code = codeCache.get(name) || \"\";\n\t\t\tconst isSimpleAlias =\n\t\t\t\tcode.match(/= (\\w+Schema);$/) !== null &&\n\t\t\t\t!code.includes(\"z.object\") &&\n\t\t\t\t!code.includes(\"z.enum\") &&\n\t\t\t\t!code.includes(\"z.union\") &&\n\t\t\t\t!code.includes(\"z.array\") &&\n\t\t\t\t!code.includes(\".and(\");\n\n\t\t\tif (isSimpleAlias) {\n\t\t\t\t// For simple aliases, just mark as visited and add to aliases list\n\t\t\t\tvisiting.delete(name);\n\t\t\t\tvisited.add(name);\n\t\t\t\taliases.push(name);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Visit dependencies first for non-alias schemas\n\t\t\tconst deps = this.schemaDependencies.get(name);\n\t\t\tif (deps && deps.size > 0) {\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tif (this.enums.has(dep) || this.schemas.has(dep) || this.types.has(dep)) {\n\t\t\t\t\t\tvisit(dep);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvisiting.delete(name);\n\t\t\tvisited.add(name);\n\n\t\t\t// Don't add circular dependencies yet - they need special handling\n\t\t\tif (!circularDeps.has(name)) {\n\t\t\t\tsorted.push(name);\n\t\t\t}\n\t\t};\n\n\t\t// Visit all enums, schemas and types\n\t\tconst allNames = new Set([...this.enums.keys(), ...this.schemas.keys(), ...this.types.keys()]);\n\t\tfor (const name of allNames) {\n\t\t\tvisit(name);\n\t\t}\n\n\t\t// Add circular dependencies at the end (before aliases)\n\t\t// This ensures they come after their non-circular dependencies\n\t\tfor (const name of circularDeps) {\n\t\t\tif (!visited.has(name)) {\n\t\t\t\tsorted.push(name);\n\t\t\t\tvisited.add(name);\n\t\t\t}\n\t\t}\n\n\t\t// Add aliases at the end\n\t\treturn [...sorted, ...aliases];\n\t}\n\n\t/**\n\t * Generate statistics about the generated schemas\n\t */\n\tprivate generateStats(): string[] {\n\t\tconst stats = {\n\t\t\ttotalSchemas: this.schemas.size,\n\t\t\tenums: this.enums.size,\n\t\t\twithCircularRefs: 0,\n\t\t\twithDiscriminators: 0,\n\t\t\twithConstraints: 0,\n\t\t};\n\n\t\t// Count schemas with special features\n\t\tfor (const code of this.schemas.values()) {\n\t\t\tif (code.includes(\"z.lazy(\")) stats.withCircularRefs++;\n\t\t\tif (code.includes(\"z.discriminatedUnion\")) stats.withDiscriminators++;\n\t\t\tif (code.includes(\".min(\") || code.includes(\".max(\") || code.includes(\".gte(\")) {\n\t\t\t\tstats.withConstraints++;\n\t\t\t}\n\t\t}\n\n\t\tconst output = [\n\t\t\t\"// Generation Statistics:\",\n\t\t\t`// Total schemas: ${stats.totalSchemas}`,\n\t\t\t`// Enums: ${stats.enums}`,\n\t\t\t`// Circular references: ${stats.withCircularRefs}`,\n\t\t\t`// Discriminated unions: ${stats.withDiscriminators}`,\n\t\t\t`// With constraints: ${stats.withConstraints}`,\n\t\t];\n\n\t\t// Add filter statistics if filtering was used\n\t\tif (this.options.operationFilters && this.filterStats.totalOperations > 0) {\n\t\t\toutput.push(\"//\");\n\t\t\tconst filterStatsStr = formatFilterStatistics(this.filterStats);\n\t\t\tfor (const line of filterStatsStr.split(\"\\n\")) {\n\t\t\t\toutput.push(`// ${line}`);\n\t\t\t}\n\t\t}\n\n\t\toutput.push(`// Generated at: ${new Date().toISOString()}`);\n\n\t\treturn output;\n\t}\n}\n","/**\n * Name conversion utilities\n */\n\nexport interface NamingOptions {\n\tprefix?: string;\n\tsuffix?: string;\n}\n\n/**\n * Convert schema name to camelCase with optional prefix/suffix\n */\nexport function toCamelCase(str: string, options?: NamingOptions): string {\n\tlet name = str.charAt(0).toLowerCase() + str.slice(1);\n\n\t// Add prefix\n\tif (options?.prefix) {\n\t\tconst prefix = options.prefix.toLowerCase();\n\t\tname = prefix + name.charAt(0).toUpperCase() + name.slice(1);\n\t}\n\n\t// Add suffix before \"Schema\"\n\tif (options?.suffix) {\n\t\tconst suffix = options.suffix;\n\t\tname = name + suffix.charAt(0).toUpperCase() + suffix.slice(1).toLowerCase();\n\t}\n\n\treturn name;\n}\n\n/**\n * Convert enum value to PascalCase and sanitize for TypeScript enum keys\n */\nexport function toPascalCase(str: string | number): string {\n\tconst stringValue = String(str);\n\t// Replace ALL special characters (not just dots/spaces) with underscores, then convert to PascalCase\n\t// Valid identifier chars: letters, digits, underscore. Everything else becomes underscore.\n\tlet result = stringValue\n\t\t.replace(/[^a-zA-Z0-9_]+/g, \"_\") // Replace all non-identifier chars with underscore\n\t\t.split(/[-_]+/)\n\t\t.filter(word => word.length > 0) // Remove empty parts\n\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n\t\t.join(\"\");\n\n\t// Enum keys can't start with a number - prefix with 'N'\n\tif (/^\\d/.test(result)) {\n\t\tresult = `N${result}`;\n\t}\n\n\t// If result is empty or only underscores, use a default\n\tif (!result || /^_+$/.test(result)) {\n\t\tresult = \"Value\";\n\t}\n\n\treturn result;\n}\n\n/**\n * Resolve $ref to schema name\n */\nexport function resolveRef(ref: string): string {\n\tconst parts = ref.split(\"/\");\n\treturn parts[parts.length - 1];\n}\n","import type { NamingOptions } from \"../utils/name-utils\";\nimport { toCamelCase, toPascalCase } from \"../utils/name-utils\";\n\nexport type EnumType = \"zod\" | \"typescript\";\n\nexport interface EnumOpenApiGeneratorOptions extends NamingOptions {\n\tenumType: EnumType;\n}\n\nexport interface EnumResult {\n\tenumCode: string | null;\n\tschemaCode: string;\n\ttypeCode: string;\n}\n\n/**\n * Generate enum as TypeScript enum or Zod enum\n */\nexport function generateEnum(\n\tname: string,\n\tvalues: (string | number)[],\n\toptions: EnumOpenApiGeneratorOptions\n): EnumResult {\n\tconst enumName = name.endsWith(\"EnumOptions\") ? name.replace(\"EnumOptions\", \"Enum\") : `${name}Enum`;\n\tconst schemaName = `${toCamelCase(name, options)}Schema`;\n\n\tif (options.enumType === \"typescript\") {\n\t\t// Generate TypeScript enum\n\t\tconst usedKeys = new Set<string>();\n\t\tconst enumEntries = values\n\t\t\t.map(value => {\n\t\t\t\tlet key = toPascalCase(value);\n\n\t\t\t\t// Handle duplicate keys by appending a suffix\n\t\t\t\tif (usedKeys.has(key)) {\n\t\t\t\t\tlet counter = 2;\n\t\t\t\t\twhile (usedKeys.has(`${key}${counter}`)) {\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t}\n\t\t\t\t\tkey = `${key}${counter}`;\n\t\t\t\t}\n\t\t\t\tusedKeys.add(key);\n\n\t\t\t\tconst stringValue = typeof value === \"string\" ? `\"${value}\"` : value;\n\t\t\t\treturn ` ${key} = ${stringValue},`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\n\t\tconst enumCode = `export enum ${enumName} {\\n${enumEntries}\\n}`;\n\t\tconst schemaCode = `export const ${schemaName} = z.nativeEnum(${enumName});`;\n\t\tconst typeCode = `export type ${name} = z.infer<typeof ${schemaName}>;`;\n\n\t\treturn { enumCode, schemaCode, typeCode };\n\t}\n\n\t// Generate Zod enum (default)\n\t// Note: z.enum only accepts string values, so convert numbers to strings\n\tconst enumValues = values.map(v => `\"${v}\"`).join(\", \");\n\tconst schemaCode = `export const ${schemaName} = z.enum([${enumValues}]);`;\n\tconst typeCode = `export type ${name} = z.infer<typeof ${schemaName}>;`;\n\n\treturn { enumCode: null, schemaCode, typeCode };\n}\n","/**\n * String utility functions for escaping and formatting\n */\n\nimport type { OpenAPISchema } from \"../types\";\n\n/**\n * Escape string for description in .describe()\n */\nexport function escapeDescription(str: string): string {\n\treturn str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\");\n}\n\n/**\n * Escape regex pattern for use in code\n */\nexport function escapePattern(str: string): string {\n\treturn str.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n}\n\n/**\n * Escape JSDoc comment content\n */\nexport function escapeJSDoc(str: string): string {\n\treturn str.replace(/\\*\\//g, \"*\\\\/\");\n}\n\n/**\n * Wrap validation with .nullable() if needed\n */\nexport function wrapNullable(validation: string, isNullable: boolean): string {\n\treturn isNullable ? `${validation}.nullable()` : validation;\n}\n\n/**\n * Check if schema is nullable (supports both OpenAPI 3.0 and 3.1 syntax)\n */\nexport function isNullable(schema: OpenAPISchema): boolean {\n\t// OpenAPI 3.0 style: nullable: true\n\tif (schema.nullable === true) {\n\t\treturn true;\n\t}\n\t// OpenAPI 3.1 style: type can be an array including \"null\"\n\tif (Array.isArray(schema.type)) {\n\t\treturn schema.type.includes(\"null\");\n\t}\n\treturn false;\n}\n\n/**\n * Get the primary type from schema (handles OpenAPI 3.1 type arrays)\n */\nexport function getPrimaryType(schema: OpenAPISchema): string | undefined {\n\tif (Array.isArray(schema.type)) {\n\t\t// OpenAPI 3.1: type can be an array like [\"string\", \"null\"]\n\t\t// Return the first non-null type\n\t\tconst nonNullType = schema.type.find(t => t !== \"null\");\n\t\treturn nonNullType;\n\t}\n\treturn schema.type;\n}\n\n/**\n * Check if schema has multiple non-null types\n */\nexport function hasMultipleTypes(schema: OpenAPISchema): boolean {\n\tif (Array.isArray(schema.type)) {\n\t\tconst nonNullTypes = schema.type.filter(t => t !== \"null\");\n\t\treturn nonNullTypes.length > 1;\n\t}\n\treturn false;\n}\n\n/**\n * Add description to a schema validation string\n */\nexport function addDescription(validation: string, description: string | undefined, useDescribe: boolean): string {\n\tif (!description || !useDescribe) return validation;\n\n\tconst escapedDesc = escapeDescription(description);\n\treturn `${validation}.describe(\"${escapedDesc}\")`;\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { escapeJSDoc } from \"../utils/string-utils\";\n\nexport interface JSDocOptions {\n\tincludeDescriptions: boolean;\n}\n\n/**\n * Generate JSDoc comment for a schema or property\n * Type-safe with input validation to prevent JSDoc injection\n */\nexport function generateJSDoc(\n\tschema: OpenAPISchema,\n\tname?: string,\n\toptions: JSDocOptions = { includeDescriptions: true }\n): string {\n\t// Type safety: Validate schema input\n\tif (!schema || typeof schema !== \"object\") {\n\t\treturn \"\";\n\t}\n\n\tif (!options.includeDescriptions) {\n\t\t// Only add @deprecated if descriptions are disabled\n\t\tif (schema.deprecated) {\n\t\t\treturn \"/** @deprecated */\\n\";\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t// Check if we have anything to document\n\tif (!schema.description && !schema.title && !schema.deprecated && !schema.examples && schema.example === undefined) {\n\t\treturn \"\";\n\t}\n\n\tconst parts: string[] = [];\n\n\t// Add title if different from name (sanitized)\n\tif (schema.title && typeof schema.title === \"string\" && (!name || schema.title !== name)) {\n\t\t// Sanitize title to prevent JSDoc injection\n\t\tconst sanitizedTitle = escapeJSDoc(schema.title).replace(/@/g, \"\\\\@\");\n\t\tparts.push(sanitizedTitle);\n\t}\n\n\t// Add description (sanitized to prevent injection)\n\tif (schema.description && typeof schema.description === \"string\") {\n\t\t// Escape @ symbols and other JSDoc tags to prevent injection\n\t\tconst sanitizedDesc = escapeJSDoc(schema.description).replace(/@/g, \"\\\\@\").replace(/\\*\\//g, \"*\\\\/\");\n\t\tparts.push(sanitizedDesc);\n\t}\n\n\t// Add examples (with type safety)\n\tif (schema.examples && Array.isArray(schema.examples) && schema.examples.length > 0) {\n\t\ttry {\n\t\t\tconst examplesStr = schema.examples.map(ex => JSON.stringify(ex)).join(\", \");\n\t\t\tparts.push(`@example ${examplesStr}`);\n\t\t} catch (error) {\n\t\t\t// Skip examples that can't be serialized\n\t\t\tconsole.warn(\"Warning: Could not serialize schema examples\", error);\n\t\t}\n\t} else if (schema.example !== undefined) {\n\t\ttry {\n\t\t\tparts.push(`@example ${JSON.stringify(schema.example)}`);\n\t\t} catch (error) {\n\t\t\t// Skip example that can't be serialized\n\t\t\tconsole.warn(\"Warning: Could not serialize schema example\", error);\n\t\t}\n\t}\n\n\t// Add deprecated\n\tif (schema.deprecated) {\n\t\tparts.push(\"@deprecated\");\n\t}\n\n\tif (parts.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst fullComment = parts.join(\" \");\n\treturn `/** ${fullComment} */\\n`;\n}\n","/**\n * Simple LRU Cache implementation for performance optimization\n * Prevents memory leaks from unbounded cache growth\n */\nexport class LRUCache<K, V> {\n\tprivate cache = new Map<K, V>();\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number) {\n\t\tthis.maxSize = maxSize;\n\t}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.cache.has(key)) return undefined;\n\t\t// Move to end (most recently used)\n\t\tconst value = this.cache.get(key);\n\t\tif (value === undefined) return undefined;\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, value);\n\t\treturn value;\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key);\n\t\t} else if (this.cache.size >= this.maxSize) {\n\t\t\t// Remove least recently used (first item)\n\t\t\tconst firstKey = this.cache.keys().next().value;\n\t\t\tif (firstKey !== undefined) {\n\t\t\t\tthis.cache.delete(firstKey);\n\t\t\t}\n\t\t}\n\t\tthis.cache.set(key, value);\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.cache.has(key);\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\tsize(): number {\n\t\treturn this.cache.size;\n\t}\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { addDescription } from \"../utils/string-utils\";\n\nexport interface ArrayValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string) => string;\n\tuseDescribe: boolean;\n\tcurrentSchema?: string;\n}\n\n/**\n * Generate array or tuple validation\n */\nexport function generateArrayValidation(schema: OpenAPISchema, context: ArrayValidatorContext): string {\n\tlet validation: string;\n\n\t// Handle prefixItems (tuple validation - OpenAPI 3.1)\n\tif (schema.prefixItems && schema.prefixItems.length > 0) {\n\t\tconst tupleItems = schema.prefixItems.map(item => context.generatePropertySchema(item, context.currentSchema));\n\t\tvalidation = `z.tuple([${tupleItems.join(\", \")}])`;\n\n\t\t// Add rest items if specified (items after the fixed prefix)\n\t\t// items takes precedence over unevaluatedItems\n\t\tif (schema.items) {\n\t\t\tconst restSchema = context.generatePropertySchema(schema.items, context.currentSchema);\n\t\t\tvalidation += `.rest(${restSchema})`;\n\t\t} else if (schema.unevaluatedItems && typeof schema.unevaluatedItems === \"object\") {\n\t\t\t// Use unevaluatedItems as rest schema if items not specified\n\t\t\tconst restSchema = context.generatePropertySchema(schema.unevaluatedItems, context.currentSchema);\n\t\t\tvalidation += `.rest(${restSchema})`;\n\t\t}\n\t\t// If unevaluatedItems is false (or undefined), tuple has fixed length by default\n\t} else if (schema.items) {\n\t\tconst itemSchema = context.generatePropertySchema(schema.items, context.currentSchema);\n\t\tvalidation = `z.array(${itemSchema})`;\n\n\t\t// Add array constraints\n\t\tif (schema.minItems !== undefined) {\n\t\t\tvalidation += `.min(${schema.minItems})`;\n\t\t}\n\t\tif (schema.maxItems !== undefined) {\n\t\t\tvalidation += `.max(${schema.maxItems})`;\n\t\t}\n\n\t\t// Add uniqueItems constraint\n\t\tif (schema.uniqueItems === true) {\n\t\t\tvalidation += `.refine((items) => new Set(items).size === items.length, { message: \"Array items must be unique\" })`;\n\t\t}\n\t} else {\n\t\tvalidation = \"z.array(z.unknown())\";\n\t}\n\n\t// Handle contains with min/max constraints\n\tif (schema.contains) {\n\t\tconst containsSchema = context.generatePropertySchema(schema.contains, context.currentSchema);\n\t\tconst minCount = schema.minContains ?? 1;\n\t\tconst maxCount = schema.maxContains;\n\n\t\tif (maxCount !== undefined) {\n\t\t\t// Both min and max\n\t\t\tvalidation += `.refine((arr) => { const matches = arr.filter(item => ${containsSchema}.safeParse(item).success); return matches.length >= ${minCount} && matches.length <= ${maxCount}; }, { message: \"Array must contain between ${minCount} and ${maxCount} items matching the schema\" })`;\n\t\t} else {\n\t\t\t// Just min\n\t\t\tvalidation += `.refine((arr) => arr.filter(item => ${containsSchema}.safeParse(item).success).length >= ${minCount}, { message: \"Array must contain at least ${minCount} item(s) matching the schema\" })`;\n\t\t}\n\t}\n\n\t// Handle unevaluatedItems (OpenAPI 3.1) - only applies to prefixItems scenarios\n\t// Note: unevaluatedItems with prefixItems should use .rest() which was already handled above\n\t// This section handles the false case which needs to restrict the length\n\tif (schema.unevaluatedItems === false && schema.prefixItems && schema.prefixItems.length > 0 && !schema.items) {\n\t\t// No items beyond prefixItems allowed - add length restriction\n\t\tconst prefixCount = schema.prefixItems.length;\n\t\tvalidation += `.refine((arr) => arr.length <= ${prefixCount}, { message: \"No unevaluated items allowed beyond prefix items\" })`;\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, context.useDescribe);\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { wrapNullable } from \"../utils/string-utils\";\n\nexport interface CompositionValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string, isTopLevel?: boolean) => string;\n\tresolveDiscriminatorMapping?: (mapping: Record<string, string>, schemas: OpenAPISchema[]) => OpenAPISchema[];\n}\n\nexport interface UnionOptions {\n\tpassthrough?: boolean;\n\tdiscriminatorMapping?: Record<string, string>;\n}\n\n/**\n * Generate union validation\n */\nexport function generateUnion(\n\tschemas: OpenAPISchema[],\n\tdiscriminator: string | undefined,\n\tisNullable: boolean,\n\tcontext: CompositionValidatorContext,\n\toptions?: UnionOptions,\n\tcurrentSchema?: string\n): string {\n\tif (discriminator) {\n\t\t// Apply discriminator mapping if provided\n\t\tlet resolvedSchemas = schemas;\n\t\tif (options?.discriminatorMapping && context.resolveDiscriminatorMapping) {\n\t\t\tresolvedSchemas = context.resolveDiscriminatorMapping(options.discriminatorMapping, schemas);\n\t\t}\n\n\t\t// Use discriminated union for better type inference\n\t\tlet schemaStrings = resolvedSchemas.map(s => context.generatePropertySchema(s, currentSchema));\n\t\tif (options?.passthrough) {\n\t\t\tschemaStrings = schemaStrings.map(s => (s.includes(\".catchall(\") ? s : `${s}.catchall(z.unknown())`));\n\t\t}\n\t\tconst union = `z.discriminatedUnion(\"${discriminator}\", [${schemaStrings.join(\", \")}])`;\n\t\treturn wrapNullable(union, isNullable);\n\t}\n\n\tlet schemaStrings = schemas.map(s => context.generatePropertySchema(s, currentSchema));\n\tif (options?.passthrough) {\n\t\tschemaStrings = schemaStrings.map(s => (s.includes(\".catchall(\") ? s : `${s}.catchall(z.unknown())`));\n\t}\n\tconst union = `z.union([${schemaStrings.join(\", \")}])`;\n\treturn wrapNullable(union, isNullable);\n}\n\n/**\n * Generate allOf validation\n */\nexport function generateAllOf(\n\tschemas: OpenAPISchema[],\n\tisNullable: boolean,\n\tcontext: CompositionValidatorContext,\n\tcurrentSchema?: string\n): string {\n\tif (schemas.length === 1) {\n\t\tconst singleSchema = context.generatePropertySchema(schemas[0], currentSchema, false);\n\t\treturn wrapNullable(singleSchema, isNullable);\n\t}\n\n\t// Check if all schemas are objects (for .merge() support)\n\tconst allObjects = schemas.every(s => s.type === \"object\" || s.properties || s.$ref || s.allOf);\n\n\tconst schemaStrings = schemas.map(s => context.generatePropertySchema(s, currentSchema, false));\n\n\tif (allObjects) {\n\t\t// Use .merge() for object schemas (better type inference)\n\t\tlet merged = schemaStrings[0];\n\t\tfor (let i = 1; i < schemaStrings.length; i++) {\n\t\t\tmerged = `${merged}.merge(${schemaStrings[i]})`;\n\t\t}\n\t\treturn wrapNullable(merged, isNullable);\n\t}\n\n\t// Use .and() for non-object schemas (intersection)\n\tlet merged = schemaStrings[0];\n\tfor (let i = 1; i < schemaStrings.length; i++) {\n\t\tmerged = `${merged}.and(${schemaStrings[i]})`;\n\t}\n\treturn wrapNullable(merged, isNullable);\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { addDescription } from \"../utils/string-utils\";\n\n/**\n * Generate Zod validation for number\n */\nexport function generateNumberValidation(schema: OpenAPISchema, isInt: boolean, useDescribe: boolean): string {\n\tlet validation = isInt ? \"z.number().int()\" : \"z.number()\";\n\n\t// Handle minimum with exclusive bounds\n\tif (schema.minimum !== undefined) {\n\t\tconst isExclusive = schema.exclusiveMinimum === true;\n\t\tvalidation += isExclusive ? `.gt(${schema.minimum})` : `.gte(${schema.minimum})`;\n\t} else if (typeof schema.exclusiveMinimum === \"number\") {\n\t\t// OpenAPI 3.1 style: exclusiveMinimum as number\n\t\tvalidation += `.gt(${schema.exclusiveMinimum})`;\n\t}\n\n\t// Handle maximum with exclusive bounds\n\tif (schema.maximum !== undefined) {\n\t\tconst isExclusive = schema.exclusiveMaximum === true;\n\t\tvalidation += isExclusive ? `.lt(${schema.maximum})` : `.lte(${schema.maximum})`;\n\t} else if (typeof schema.exclusiveMaximum === \"number\") {\n\t\t// OpenAPI 3.1 style: exclusiveMaximum as number\n\t\tvalidation += `.lt(${schema.exclusiveMaximum})`;\n\t}\n\n\tif (schema.multipleOf !== undefined) {\n\t\tvalidation += `.multipleOf(${schema.multipleOf})`;\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, useDescribe);\n}\n","import type { OpenAPISchema } from \"../types\";\r\n\r\n/**\r\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\r\n */\r\nfunction generatePropertyAccess(propName: string): string {\r\n\t// Valid identifier: starts with letter/underscore/$, followed by letters/digits/underscores/$\r\n\tconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\r\n\treturn validIdentifier.test(propName) ? `obj.${propName}` : `obj[\"${propName}\"]`;\r\n}\r\n\r\n/**\r\n * Generate validation for dependencies (OpenAPI 3.0)\r\n * Generates detailed error messages showing which specific fields are missing\r\n */\r\nexport function generateDependencies(\r\n\tschema: OpenAPISchema,\r\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\r\n\tcurrentSchema?: string\r\n): string {\r\n\tif (!schema.dependencies) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\r\n\t\tif (Array.isArray(dependency)) {\r\n\t\t\t// Skip empty dependency arrays (no dependencies to enforce)\r\n\t\t\tif (dependency.length === 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Property dependency - show specific missing properties in error message\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tconst checkLogic = dependency\r\n\t\t\t\t.map(p => {\r\n\t\t\t\t\tconst pAccess = generatePropertyAccess(p);\r\n\t\t\t\t\treturn `if (${pAccess} === undefined) missing.push('${p}');`;\r\n\t\t\t\t})\r\n\t\t\t\t.join(\"\\n\\t\\t\");\r\n\r\n\t\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\t\tconst missing: string[] = [];\r\n\t\t\t\t${checkLogic}\r\n\t\t\t\tif (missing.length > 0) {\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t})`;\r\n\t\t} else if (generatePropertySchema) {\r\n\t\t\t// Schema dependency - show detailed validation errors\r\n\t\t\tconst depSchema: OpenAPISchema = { ...dependency, type: dependency.type || \"object\" };\r\n\t\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\r\n\t\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\r\n\t\t\t\tif (!validation.success) {\r\n\t\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, object must satisfy additional constraints:\\\\n\\${errors}\\`,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t})`;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Generate condition check for if/then/else\r\n */\r\nexport function generateConditionalCheck(schema: OpenAPISchema): string {\r\n\tconst conditions: string[] = [];\r\n\r\n\t// Check properties\r\n\tif (schema.properties) {\r\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tif (propSchema.type) {\r\n\t\t\t\tconditions.push(`typeof ${propAccess} === \"${propSchema.type}\"`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.const !== undefined) {\r\n\t\t\t\tconst value = typeof propSchema.const === \"string\" ? `\"${propSchema.const}\"` : propSchema.const;\r\n\t\t\t\tconditions.push(`${propAccess} === ${value}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.minimum !== undefined) {\r\n\t\t\t\tconditions.push(`${propAccess} >= ${propSchema.minimum}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.maximum !== undefined) {\r\n\t\t\t\tconditions.push(`${propAccess} <= ${propSchema.maximum}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Check required properties\r\n\tif (schema.required) {\r\n\t\tfor (const prop of schema.required) {\r\n\t\t\tconditions.push(`${generatePropertyAccess(prop)} !== undefined`);\r\n\t\t}\r\n\t}\r\n\r\n\treturn conditions.length > 0 ? conditions.join(\" && \") : \"true\";\r\n}\r\n\r\n/**\r\n * Generate validation for then/else clauses\r\n */\r\nexport function generateConditionalValidation(schema: OpenAPISchema): string {\r\n\tconst checks: string[] = [];\r\n\r\n\t// Check required properties\r\n\tif (schema.required) {\r\n\t\tfor (const prop of schema.required) {\r\n\t\t\tchecks.push(`${generatePropertyAccess(prop)} !== undefined`);\r\n\t\t}\r\n\t}\r\n\r\n\t// Check properties constraints\r\n\tif (schema.properties) {\r\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\r\n\t\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\t\tif (propSchema.minimum !== undefined) {\r\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} >= ${propSchema.minimum}`);\r\n\t\t\t}\r\n\t\t\tif (propSchema.maximum !== undefined) {\r\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} <= ${propSchema.maximum}`);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn checks.length > 0 ? checks.join(\" && \") : \"true\";\r\n}\r\n\r\n/**\r\n * Generate if/then/else conditional validation with better error messages\r\n * Uses superRefine with detailed error messages for complex cases\r\n */\r\nexport function generateIfThenElse(schema: OpenAPISchema): string {\r\n\tif (!schema.if || (!schema.then && !schema.else)) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tconst ifCondition = generateConditionalCheck(schema.if);\r\n\r\n\tif (schema.then && schema.else) {\r\n\t\t// Both then and else - provide detailed error messages\r\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\r\n\t\tconst elseValidation = generateConditionalValidation(schema.else);\r\n\r\n\t\t// Try to detect which specific validations failed\r\n\t\tconst thenRequiredProps = schema.then.required || [];\r\n\t\tconst elseRequiredProps = schema.else.required || [];\r\n\r\n\t\treturn `.superRefine((obj, ctx) => {\r\n\t\t\tconst ifConditionMet = ${ifCondition};\r\n\t\t\tif (ifConditionMet) {\r\n\t\t\t\t// Then branch\r\n\t\t\t\tconst thenValid = ${thenValidation};\r\n\t\t\t\tif (!thenValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\tthenRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingThenProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingThenProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingThenProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// Else branch\r\n\t\t\t\tconst elseValid = ${elseValidation};\r\n\t\t\t\tif (!elseValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\telseRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingElseProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingElseProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingElseProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\tif (schema.then) {\r\n\t\t// Only then - provide detailed error message\r\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\r\n\t\tconst thenRequiredProps = schema.then.required || [];\r\n\r\n\t\treturn `.superRefine((obj, ctx) => {\r\n\t\t\tconst ifConditionMet = ${ifCondition};\r\n\t\t\tif (ifConditionMet) {\r\n\t\t\t\tconst thenValid = ${thenValidation};\r\n\t\t\t\tif (!thenValid) {\r\n\t\t\t\t\t${\r\n\t\t\t\t\t\tthenRequiredProps.length > 0\r\n\t\t\t\t\t\t\t? `\r\n\t\t\t\t\tconst missingProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\t\tconst message = missingProps.length > 0 \r\n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingProps.join(', ')}\\`\r\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t\t\t: `\r\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\r\n\t\t\t\t\t`\r\n\t\t\t\t\t}\r\n\t\t\t\t\tctx.addIssue({\r\n\t\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\t\tmessage: message,\r\n\t\t\t\t\t\tpath: []\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\t// Only else - provide detailed error message\r\n\tif (!schema.else) return \"\";\r\n\tconst elseValidation = generateConditionalValidation(schema.else);\r\n\tconst elseRequiredProps = schema.else.required || [];\r\n\r\n\treturn `.superRefine((obj, ctx) => {\r\n\t\tconst ifConditionMet = ${ifCondition};\r\n\t\tif (!ifConditionMet) {\r\n\t\t\tconst elseValid = ${elseValidation};\r\n\t\t\tif (!elseValid) {\r\n\t\t\t\t${\r\n\t\t\t\t\telseRequiredProps.length > 0\r\n\t\t\t\t\t\t? `\r\n\t\t\t\tconst missingProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\r\n\t\t\t\tconst message = missingProps.length > 0 \r\n\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingProps.join(', ')}\\`\r\n\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t`\r\n\t\t\t\t\t\t: `\r\n\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\r\n\t\t\t\t`\r\n\t\t\t\t}\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: message,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t})`;\r\n}\r\n\r\n/**\r\n * Generate dependent required validation (OpenAPI 3.1)\r\n * Generates detailed error messages showing which specific fields are missing\r\n */\r\nexport function generateDependentRequired(schema: OpenAPISchema): string {\r\n\tif (!schema.dependentRequired) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, requiredProps] of Object.entries(schema.dependentRequired)) {\r\n\t\t// Skip empty required arrays (no dependencies to enforce)\r\n\t\tif (requiredProps.length === 0) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst propAccess = generatePropertyAccess(prop);\r\n\t\tconst checkLogic = requiredProps\r\n\t\t\t.map(rp => {\r\n\t\t\t\tconst rpAccess = generatePropertyAccess(rp);\r\n\t\t\t\treturn `if (${rpAccess} === undefined) missing.push('${rp}');`;\r\n\t\t\t})\r\n\t\t\t.join(\"\\n\\t\\t\");\r\n\r\n\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\tconst missing: string[] = [];\r\n\t\t\t${checkLogic}\r\n\t\t\tif (missing.length > 0) {\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Generate dependent schemas validation (JSON Schema 2019-09 / OpenAPI 3.1)\r\n * This is the modern replacement for schema-based dependencies\r\n * Generates detailed error messages showing validation failures\r\n */\r\nexport function generateDependentSchemas(\r\n\tschema: OpenAPISchema & { dependentSchemas?: Record<string, OpenAPISchema> },\r\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\r\n\tcurrentSchema?: string\r\n): string {\r\n\tif (!schema.dependentSchemas || !generatePropertySchema) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tlet result = \"\";\r\n\tfor (const [prop, depSchema] of Object.entries(schema.dependentSchemas)) {\r\n\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\r\n\t\tconst propAccess = generatePropertyAccess(prop);\r\n\r\n\t\tresult += `.superRefine((obj, ctx) => {\r\n\t\t\tif (${propAccess} === undefined) return;\r\n\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\r\n\t\t\tif (!validation.success) {\r\n\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\r\n\t\t\t\tctx.addIssue({\r\n\t\t\t\t\tcode: \"custom\",\r\n\t\t\t\t\tmessage: \\`When '${prop}' is present, dependent schema validation failed:\\\\n\\${errors}\\`,\r\n\t\t\t\t\tpath: []\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t})`;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * Validate dependency graph for circular dependencies\r\n * Returns validation result with any detected circular dependency errors\r\n */\r\nexport function validateDependencyGraph(\r\n\tschema: OpenAPISchema,\r\n\tschemaName: string\r\n): { valid: boolean; errors: string[] } {\r\n\tconst errors: string[] = [];\r\n\r\n\tif (!schema.dependencies && !schema.dependentRequired) {\r\n\t\treturn { valid: true, errors: [] };\r\n\t}\r\n\r\n\t// Build dependency graph\r\n\tconst graph = new Map<string, Set<string>>();\r\n\r\n\t// Add dependentRequired edges\r\n\tif (schema.dependentRequired) {\r\n\t\tfor (const [prop, deps] of Object.entries(schema.dependentRequired)) {\r\n\t\t\tif (!graph.has(prop)) {\r\n\t\t\t\tgraph.set(prop, new Set());\r\n\t\t\t}\r\n\t\t\tconst propDeps = graph.get(prop);\r\n\t\t\tif (propDeps) {\r\n\t\t\t\tfor (const dep of deps) {\r\n\t\t\t\t\tpropDeps.add(dep);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Add dependencies (array type) edges\r\n\tif (schema.dependencies) {\r\n\t\tfor (const [prop, dep] of Object.entries(schema.dependencies)) {\r\n\t\t\tif (Array.isArray(dep)) {\r\n\t\t\t\tif (!graph.has(prop)) {\r\n\t\t\t\t\tgraph.set(prop, new Set());\r\n\t\t\t\t}\r\n\t\t\t\tconst propDeps = graph.get(prop);\r\n\t\t\t\tif (propDeps) {\r\n\t\t\t\t\tfor (const d of dep) {\r\n\t\t\t\t\t\tpropDeps.add(d);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Detect cycles using DFS\r\n\tconst visited = new Set<string>();\r\n\tconst recStack = new Set<string>();\r\n\tconst path: string[] = [];\r\n\r\n\tfunction detectCycle(prop: string): boolean {\r\n\t\tvisited.add(prop);\r\n\t\trecStack.add(prop);\r\n\t\tpath.push(prop);\r\n\r\n\t\tconst deps = graph.get(prop) || new Set();\r\n\t\tfor (const dep of deps) {\r\n\t\t\tif (!visited.has(dep)) {\r\n\t\t\t\tif (detectCycle(dep)) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t} else if (recStack.has(dep)) {\r\n\t\t\t\t// Cycle detected\r\n\t\t\t\tconst cycleStart = path.indexOf(dep);\r\n\t\t\t\tconst cycle = [...path.slice(cycleStart), dep];\r\n\t\t\t\terrors.push(`Circular dependency detected in schema '${schemaName}': ${cycle.join(\" -> \")}`);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\trecStack.delete(prop);\r\n\t\tpath.pop();\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Check all roots\r\n\tfor (const prop of graph.keys()) {\r\n\t\tif (!visited.has(prop)) {\r\n\t\t\tdetectCycle(prop);\r\n\t\t}\r\n\t}\r\n\r\n\treturn { valid: errors.length === 0, errors };\r\n}\r\n\r\n/**\r\n * Extract schema dependencies as reusable schemas\r\n * Useful for code generation and schema reuse\r\n */\r\nexport function extractSchemaDependencies(schema: OpenAPISchema, schemaName: string): Map<string, OpenAPISchema> {\r\n\tconst extracted = new Map<string, OpenAPISchema>();\r\n\r\n\tif (!schema.dependencies) {\r\n\t\treturn extracted;\r\n\t}\r\n\r\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\r\n\t\tif (!Array.isArray(dependency)) {\r\n\t\t\t// This is a schema dependency\r\n\t\t\tconst depSchemaName = `${schemaName}_${prop}_Dependency`;\r\n\t\t\tconst depSchema: OpenAPISchema = {\r\n\t\t\t\t...dependency,\r\n\t\t\t\ttype: dependency.type || \"object\",\r\n\t\t\t};\r\n\t\t\textracted.set(depSchemaName, depSchema);\r\n\t\t}\r\n\t}\r\n\r\n\treturn extracted;\r\n}\r\n","import { generateJSDoc } from \"../generators/jsdoc-generator\";\nimport type { OpenAPISchema } from \"../types\";\nimport { generateDependencies, generateDependentRequired, generateIfThenElse } from \"./conditional-validator\";\n\n/**\n * Check if a property name needs to be quoted in TypeScript object literal\n */\nfunction needsQuoting(propName: string): boolean {\n\t// Valid identifier: starts with letter/underscore/$, followed by letters/digits/underscores/$\n\tconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\treturn !validIdentifier.test(propName);\n}\n\n/**\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\n */\nfunction generatePropertyAccess(propName: string): string {\n\treturn needsQuoting(propName) ? `obj[\"${propName}\"]` : `obj.${propName}`;\n}\n\nexport type ObjectMode = \"strict\" | \"normal\" | \"loose\";\n\nexport interface ObjectValidatorContext {\n\tgeneratePropertySchema: (schema: OpenAPISchema, currentSchema?: string) => string;\n\tshouldIncludeProperty: (schema: OpenAPISchema) => boolean;\n\tmode: ObjectMode;\n\tincludeDescriptions: boolean;\n\tuseDescribe: boolean;\n}\n\n/**\n * Generate object schema\n */\nexport function generateObjectSchema(\n\tschema: OpenAPISchema,\n\tcontext: ObjectValidatorContext,\n\tcurrentSchema?: string\n): string {\n\tconst required = new Set(schema.required || []);\n\tconst properties: string[] = [];\n\n\t// Process properties if they exist\n\tif (schema.properties) {\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\t// Skip properties based on readOnly/writeOnly and schemaType\n\t\t\tif (!context.shouldIncludeProperty(propSchema)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isRequired = required.has(propName);\n\t\t\tconst zodSchema = context.generatePropertySchema(propSchema, currentSchema);\n\n\t\t\t// Quote property name if it contains special characters\n\t\t\tconst quotedPropName = needsQuoting(propName) ? `\"${propName}\"` : propName;\n\t\t\tlet propertyDef = ` ${quotedPropName}: ${zodSchema}`;\n\t\t\tif (!isRequired) {\n\t\t\t\tpropertyDef += \".optional()\";\n\t\t\t}\n\n\t\t\t// Add JSDoc for property if enabled\n\t\t\tconst jsdoc = generateJSDoc(propSchema, propName, { includeDescriptions: context.includeDescriptions });\n\t\t\tif (jsdoc) {\n\t\t\t\tproperties.push(`${jsdoc.trimEnd()}\\n${propertyDef}`);\n\t\t\t} else {\n\t\t\t\tproperties.push(propertyDef);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Determine object method based on mode and additionalProperties\n\tlet objectMethod: string;\n\n\t// additionalProperties: false always uses strictObject\n\tif (schema.additionalProperties === false) {\n\t\tobjectMethod = \"z.strictObject\";\n\t} else {\n\t\t// Otherwise respect the mode setting\n\t\tswitch (context.mode) {\n\t\t\tcase \"strict\":\n\t\t\t\tobjectMethod = \"z.strictObject\";\n\t\t\t\tbreak;\n\t\t\tcase \"loose\":\n\t\t\t\tobjectMethod = \"z.looseObject\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tobjectMethod = \"z.object\";\n\t\t}\n\t}\n\n\tlet objectDef = `${objectMethod}({\\n${properties.join(\",\\n\")}\\n})`;\n\n\t// Handle additionalProperties for typed catchall\n\tif (schema.additionalProperties !== undefined) {\n\t\tif (typeof schema.additionalProperties === \"object\") {\n\t\t\t// Additional properties with specific schema\n\t\t\tconst additionalSchema = context.generatePropertySchema(schema.additionalProperties, currentSchema);\n\t\t\tobjectDef += `.catchall(${additionalSchema})`;\n\t\t} else if (schema.additionalProperties === true) {\n\t\t\t// Any additional properties allowed\n\t\t\tobjectDef += \".catchall(z.unknown())\";\n\t\t}\n\t\t// Note: additionalProperties: false is handled by using z.strictObject\n\t} else if (schema.patternProperties) {\n\t\t// If pattern properties are defined but additionalProperties is not, allow properties through\n\t\t// so they can be validated by pattern property refinements\n\t\tobjectDef += \".catchall(z.unknown())\";\n\t}\n\n\t// Handle minProperties and maxProperties\n\tif (schema.minProperties !== undefined || schema.maxProperties !== undefined) {\n\t\tconst conditions: string[] = [];\n\t\tif (schema.minProperties !== undefined) {\n\t\t\tconditions.push(`Object.keys(obj).length >= ${schema.minProperties}`);\n\t\t}\n\t\tif (schema.maxProperties !== undefined) {\n\t\t\tconditions.push(`Object.keys(obj).length <= ${schema.maxProperties}`);\n\t\t}\n\t\tconst condition = conditions.join(\" && \");\n\t\tlet message = \"Object \";\n\t\tif (schema.minProperties !== undefined && schema.maxProperties !== undefined) {\n\t\t\tmessage += `must have between ${schema.minProperties} and ${schema.maxProperties} properties`;\n\t\t} else if (schema.minProperties !== undefined) {\n\t\t\tmessage += `must have at least ${schema.minProperties} ${schema.minProperties === 1 ? \"property\" : \"properties\"}`;\n\t\t} else {\n\t\t\tmessage += `must have at most ${schema.maxProperties} ${schema.maxProperties === 1 ? \"property\" : \"properties\"}`;\n\t\t}\n\t\tobjectDef += `.refine((obj) => ${condition}, { message: \"${message}\" })`;\n\t}\n\n\t// Handle required fields that aren't in properties (common in schema dependencies)\n\tconst definedProps = new Set(Object.keys(schema.properties || {}));\n\tconst undefinedRequired = (schema.required || []).filter(prop => !definedProps.has(prop));\n\tif (undefinedRequired.length > 0) {\n\t\t// Need catchall to allow required fields that aren't in properties\n\t\tif (!objectDef.includes(\".catchall(\")) {\n\t\t\tobjectDef += \".catchall(z.unknown())\";\n\t\t}\n\t\tconst requiredChecks = undefinedRequired.map(prop => `${generatePropertyAccess(prop)} !== undefined`).join(\" && \");\n\t\tconst propList = undefinedRequired.join(\", \");\n\t\tobjectDef += `.refine((obj) => ${requiredChecks}, { message: \"Missing required fields: ${propList}\" })`;\n\t}\n\n\t// Handle pattern properties with first-match-wins priority\n\tif (schema.patternProperties) {\n\t\tconst definedProps = Object.keys(schema.properties || {});\n\t\tconst definedPropsSet = `new Set(${JSON.stringify(definedProps)})`;\n\t\tconst patterns = Object.entries(schema.patternProperties);\n\n\t\t// Generate schemas for all patterns\n\t\tconst patternSchemas = patterns.map(([pattern, patternSchema]) => ({\n\t\t\tpattern,\n\t\t\tescapedPattern: pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\"),\n\t\t\tzodSchema: context.generatePropertySchema(patternSchema, currentSchema),\n\t\t}));\n\n\t\t// Single superRefine for all patterns (more efficient)\n\t\tobjectDef += `.superRefine((obj, ctx) => {\n\t\t\tconst definedPropsSet = ${definedPropsSet};\n\t\t\tconst patterns = ${JSON.stringify(patternSchemas.map(p => ({ pattern: p.escapedPattern })))};\n\t\t\tconst schemas = [${patternSchemas.map(p => p.zodSchema).join(\", \")}];\n\t\t\tconst regexps = patterns.map(p => new RegExp(p.pattern));\n\n\t\t\t// Check all object keys\n\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\t// Skip properties that are explicitly defined\n\t\t\t\tif (definedPropsSet.has(key)) continue;\n\n\t\t\t\t// Find first matching pattern (first-match-wins priority)\n\t\t\t\tfor (let i = 0; i < regexps.length; i++) {\n\t\t\t\t\tif (regexps[i].test(key)) {\n\t\t\t\t\t\tconst validation = schemas[i].safeParse(obj[key]);\n\t\t\t\t\t\tif (!validation.success) {\n\t\t\t\t\t\t\t// Add detailed error messages with property name and pattern\n\t\t\t\t\t\t\tfor (const issue of validation.error.issues) {\n\t\t\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\t\t\t...issue,\n\t\t\t\t\t\t\t\t\tpath: [key, ...issue.path],\n\t\t\t\t\t\t\t\t\tmessage: \\`Property '\\${key}' (pattern '\\${patterns[i].pattern}'): \\${issue.message}\\`\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak; // First match wins, stop checking other patterns\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\t// Handle property names validation (consolidated for efficiency)\n\tif (schema.propertyNames) {\n\t\tconst hasPattern = schema.propertyNames.pattern !== undefined;\n\t\tconst hasMinLength = schema.propertyNames.minLength !== undefined;\n\t\tconst hasMaxLength = schema.propertyNames.maxLength !== undefined;\n\n\t\tif (hasPattern || hasMinLength || hasMaxLength) {\n\t\t\tconst escapedPattern =\n\t\t\t\thasPattern && schema.propertyNames.pattern\n\t\t\t\t\t? schema.propertyNames.pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")\n\t\t\t\t\t: null;\n\t\t\tconst minLen = schema.propertyNames.minLength;\n\t\t\tconst maxLen = schema.propertyNames.maxLength;\n\n\t\t\tobjectDef += `.superRefine((obj, ctx) => {\n\t\t\t\t${escapedPattern ? `const pattern = /${escapedPattern}/;` : \"\"}\n\n\t\t\t\tfor (const key of Object.keys(obj)) {\n\t\t\t\t\tconst failures: string[] = [];\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasPattern\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (!pattern.test(key)) {\n\t\t\t\t\t\tfailures.push(\"must match pattern '${schema.propertyNames.pattern}'\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasMinLength\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (key.length < ${minLen}) {\n\t\t\t\t\t\tfailures.push(\"must be at least ${minLen} characters\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\t${\n\t\t\t\t\t\thasMaxLength\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tif (key.length > ${maxLen}) {\n\t\t\t\t\t\tfailures.push(\"must be at most ${maxLen} characters\");\n\t\t\t\t\t}\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: \"\"\n\t\t\t\t\t}\n\n\t\t\t\t\tif (failures.length > 0) {\n\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\t\tmessage: \\`Property name '\\${key}' \\${failures.join(\", \")}\\`,\n\t\t\t\t\t\t\tpath: [key]\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})`;\n\t\t}\n\t}\n\n\t// Handle dependencies (OpenAPI 3.0)\n\tobjectDef += generateDependencies(schema, context.generatePropertySchema, currentSchema);\n\n\t// Handle dependentRequired\n\tobjectDef += generateDependentRequired(schema);\n\n\t// Handle if/then/else conditionals\n\tobjectDef += generateIfThenElse(schema);\n\n\treturn objectDef;\n}\n","import type { OpenAPISchema } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport { addDescription, escapePattern } from \"../utils/string-utils\";\n\n// Performance optimization: Cache compiled regex patterns with size limit\nconst PATTERN_CACHE = new LRUCache<string, string>(1000);\n\nconst FORMAT_MAP: Record<string, string> = {\n\tuuid: \"z.uuid()\",\n\temail: \"z.email()\",\n\turi: \"z.url()\",\n\turl: \"z.url()\",\n\t\"uri-reference\": 'z.string().refine((val) => !/\\\\s/.test(val), { message: \"Must be a valid URI reference\" })',\n\thostname:\n\t\t'z.string().refine((val) => /^(?=.{1,253}$)(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)\\\\.)*(?!-)[A-Za-z0-9-]{1,63}(?<!-)$/.test(val), { message: \"Must be a valid hostname\" })',\n\tbyte: \"z.base64()\",\n\tbinary: \"z.string()\",\n\tdate: \"z.iso.date()\",\n\t\"date-time\": \"z.iso.datetime()\",\n\ttime: \"z.iso.time()\",\n\tduration:\n\t\t'z.string().refine((val) => /^P(?:(?:\\\\d+Y)?(?:\\\\d+M)?(?:\\\\d+D)?(?:T(?:\\\\d+H)?(?:\\\\d+M)?(?:\\\\d+(?:\\\\.\\\\d+)?S)?)?|\\\\d+W)$/.test(val) && !/^PT?$/.test(val), { message: \"Must be a valid ISO 8601 duration\" })',\n\tipv4: \"z.ipv4()\",\n\tipv6: \"z.ipv6()\",\n\temoji: \"z.emoji()\",\n\tbase64: \"z.base64()\",\n\tbase64url: \"z.base64url()\",\n\tnanoid: \"z.nanoid()\",\n\tcuid: \"z.cuid()\",\n\tcuid2: \"z.cuid2()\",\n\tulid: \"z.ulid()\",\n\tcidr: \"z.cidrv4()\", // Default to v4\n\tcidrv4: \"z.cidrv4()\",\n\tcidrv6: \"z.cidrv6()\",\n\t\"json-pointer\":\n\t\t'z.string().refine((val) => val === \"\" || /^(\\\\/([^~/]|~0|~1)+)+$/.test(val), { message: \"Must be a valid JSON Pointer (RFC 6901)\" })',\n\t\"relative-json-pointer\":\n\t\t'z.string().refine((val) => /^(0|[1-9]\\\\d*)(#|(\\\\/([^~/]|~0|~1)+)*)$/.test(val), { message: \"Must be a valid relative JSON Pointer\" })',\n};\n\n/**\n * Generate Zod validation for string with format (Zod v4 compatible)\n */\nexport function generateStringValidation(schema: OpenAPISchema, useDescribe: boolean): string {\n\t// Handle format with Zod v4 top-level functions (performance optimized with map)\n\tlet validation = FORMAT_MAP[schema.format || \"\"] || \"z.string()\";\n\n\t// Add length constraints\n\tif (schema.minLength !== undefined) {\n\t\tvalidation += `.min(${schema.minLength})`;\n\t}\n\tif (schema.maxLength !== undefined) {\n\t\tvalidation += `.max(${schema.maxLength})`;\n\t}\n\n\t// Add pattern (with cached escaping for performance)\n\tif (schema.pattern) {\n\t\tlet escapedPattern = PATTERN_CACHE.get(schema.pattern);\n\t\tif (escapedPattern === undefined) {\n\t\t\tescapedPattern = escapePattern(schema.pattern);\n\t\t\tPATTERN_CACHE.set(schema.pattern, escapedPattern);\n\t\t}\n\t\tvalidation += `.regex(/${escapedPattern}/)`;\n\t}\n\n\t// Handle content encoding (OpenAPI 3.1)\n\tif (schema.contentEncoding && !schema.format) {\n\t\tswitch (schema.contentEncoding) {\n\t\t\tcase \"base64\":\n\t\t\t\tvalidation = \"z.base64()\";\n\t\t\t\tbreak;\n\t\t\tcase \"base64url\":\n\t\t\t\tvalidation = \"z.base64url()\";\n\t\t\t\tbreak;\n\t\t\tcase \"quoted-printable\":\n\t\t\t\t// Quoted-printable validation\n\t\t\t\tvalidation =\n\t\t\t\t\t'z.string().refine((val) => /^[\\\\x20-\\\\x7E\\\\r\\\\n=]*$/.test(val), { message: \"Must be valid quoted-printable encoding\" })';\n\t\t\t\tbreak;\n\t\t\tcase \"7bit\":\n\t\t\tcase \"8bit\":\n\t\t\tcase \"binary\":\n\t\t\t\t// Basic string validation for these encodings\n\t\t\t\tvalidation = \"z.string()\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Unknown encoding, use string with refinement note\n\t\t\t\tvalidation = `z.string().describe(\"Content encoding: ${schema.contentEncoding}\")`;\n\t\t}\n\n\t\t// Re-apply constraints after encoding\n\t\tif (schema.minLength !== undefined) {\n\t\t\tvalidation += `.min(${schema.minLength})`;\n\t\t}\n\t\tif (schema.maxLength !== undefined) {\n\t\t\tvalidation += `.max(${schema.maxLength})`;\n\t\t}\n\t\tif (schema.pattern) {\n\t\t\tlet escapedPattern = PATTERN_CACHE.get(schema.pattern);\n\t\t\tif (escapedPattern === undefined) {\n\t\t\t\tescapedPattern = escapePattern(schema.pattern);\n\t\t\t\tPATTERN_CACHE.set(schema.pattern, escapedPattern);\n\t\t\t}\n\t\t\tvalidation += `.regex(/${escapedPattern}/)`;\n\t\t}\n\t} else if (schema.contentMediaType) {\n\t\t// Add refinement for media type validation\n\t\tconst mediaType = schema.contentMediaType;\n\t\tif (mediaType === \"application/json\") {\n\t\t\tvalidation += `.refine((val) => { try { JSON.parse(val); return true; } catch { return false; } }, { message: \"Must be valid JSON\" })`;\n\t\t} else if (mediaType === \"application/xml\" || mediaType === \"text/xml\") {\n\t\t\t// Basic XML validation - check for well-formed XML structure\n\t\t\tvalidation += `.refine((val) => { try { if (typeof DOMParser !== \"undefined\") { const parser = new DOMParser(); const doc = parser.parseFromString(val, \"text/xml\"); return !doc.querySelector(\"parsererror\"); } return /^\\\\s*<[^>]+>/.test(val); } catch { return false; } }, { message: \"Must be valid XML\" })`;\n\t\t} else if (mediaType === \"application/yaml\" || mediaType === \"application/x-yaml\" || mediaType === \"text/yaml\") {\n\t\t\t// Basic YAML validation - check for basic YAML structure\n\t\t\tvalidation += `.refine((val) => { try { return val.trim().length > 0 && !/^[[{]/.test(val.trim()); } catch { return false; } }, { message: \"Must be valid YAML\" })`;\n\t\t} else if (mediaType === \"text/html\") {\n\t\t\t// Basic HTML validation - check for HTML tags\n\t\t\tvalidation += `.refine((val) => /<[^>]+>/.test(val), { message: \"Must contain HTML tags\" })`;\n\t\t} else if (mediaType === \"text/plain\") {\n\t\t\t// Plain text - no special validation needed, but mark it\n\t\t\tvalidation += `.refine(() => true, { message: \"Plain text content\" })`;\n\t\t}\n\t\t// Other media types default to no validation beyond string\n\t}\n\n\t// Add description if useDescribe is enabled\n\treturn addDescription(validation, schema.description, useDescribe);\n}\n","import type { NativeEnumType, OpenAPISchema, OpenAPISpec, TypeMode } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport type { NamingOptions } from \"../utils/name-utils\";\nimport { resolveRef, toCamelCase } from \"../utils/name-utils\";\nimport { addDescription, getPrimaryType, hasMultipleTypes, isNullable, wrapNullable } from \"../utils/string-utils\";\nimport { generateArrayValidation } from \"../validators/array-validator\";\nimport { generateAllOf, generateUnion } from \"../validators/composition-validator\";\nimport { generateNumberValidation } from \"../validators/number-validator\";\nimport type { ObjectMode } from \"../validators/object-validator\";\nimport { generateObjectSchema } from \"../validators/object-validator\";\nimport { generateStringValidation } from \"../validators/string-validator\";\n\nexport interface PropertyGeneratorContext {\n\tspec: OpenAPISpec;\n\tschemaDependencies: Map<string, Set<string>>;\n\tschemaType: \"all\" | \"request\" | \"response\";\n\tmode: ObjectMode;\n\tincludeDescriptions: boolean;\n\tuseDescribe: boolean;\n\ttypeMode: TypeMode;\n\tnativeEnumType: NativeEnumType;\n\tnamingOptions: NamingOptions;\n}\n\n/**\n * Property schema generator with memoization for performance\n */\nexport class PropertyGenerator {\n\tprivate context: PropertyGeneratorContext;\n\t// Performance optimization: Memoize filtered property results\n\tprivate filteredPropsCache = new Map<string, OpenAPISchema>();\n\t// Performance optimization: LRU cache for generated schemas\n\tprivate schemaCache = new LRUCache<string, string>(500);\n\n\t// Performance optimization: Lookup table for faster inclusion checks\n\tstatic readonly INCLUSION_RULES = {\n\t\trequest: (schema: OpenAPISchema) => !schema.readOnly,\n\t\tresponse: (schema: OpenAPISchema) => !schema.writeOnly,\n\t\tall: () => true,\n\t} as const;\n\n\tconstructor(context: PropertyGeneratorContext) {\n\t\tthis.context = context;\n\t}\n\n\t/**\n\t * Check if a property should be included based on schemaType and readOnly/writeOnly flags\n\t */\n\tshouldIncludeProperty(schema: OpenAPISchema): boolean {\n\t\tconst rule = PropertyGenerator.INCLUSION_RULES[this.context.schemaType];\n\t\treturn rule(schema);\n\t}\n\n\t/**\n\t * Recursively filter any schema type (helper for composition schemas)\n\t */\n\tprivate filterSchemaRecursive(schema: OpenAPISchema): OpenAPISchema {\n\t\tif (schema.$ref) {\n\t\t\t// Don't filter refs, they'll be filtered when resolved\n\t\t\treturn schema;\n\t\t}\n\n\t\tif (schema.properties) {\n\t\t\treturn this.filterNestedProperties(schema);\n\t\t}\n\n\t\tif (schema.type === \"array\" && schema.items && typeof schema.items === \"object\" && schema.items.properties) {\n\t\t\treturn {\n\t\t\t\t...schema,\n\t\t\t\titems: this.filterNestedProperties(schema.items),\n\t\t\t};\n\t\t}\n\n\t\treturn schema;\n\t}\n\n\t/**\n\t * Recursively filter properties in nested objects based on readOnly/writeOnly\n\t * Performance optimized with memoization\n\t */\n\tprivate filterNestedProperties(schema: OpenAPISchema): OpenAPISchema {\n\t\t// Performance optimization: More efficient cache key generation\n\t\tconst propKeys = schema.properties ? Object.keys(schema.properties).sort().join(\",\") : \"\";\n\t\tconst cacheKey = `${this.context.schemaType}:${schema.type || \"unknown\"}:${propKeys}:${schema.required?.join(\",\") || \"\"}`;\n\t\tconst cached = this.filteredPropsCache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tif (!schema.properties) {\n\t\t\treturn schema;\n\t\t}\n\n\t\tconst filteredProperties: Record<string, OpenAPISchema> = {};\n\t\tconst filteredRequired: string[] = [];\n\n\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\tif (!this.shouldIncludeProperty(propSchema)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Recursively filter nested structures\n\t\t\tlet filteredPropSchema = propSchema;\n\n\t\t\tif (propSchema.type === \"object\" && propSchema.properties) {\n\t\t\t\t// Nested object\n\t\t\t\tfilteredPropSchema = this.filterNestedProperties(propSchema);\n\t\t\t} else if (\n\t\t\t\tpropSchema.type === \"array\" &&\n\t\t\t\tpropSchema.items &&\n\t\t\t\ttypeof propSchema.items === \"object\" &&\n\t\t\t\tpropSchema.items.properties\n\t\t\t) {\n\t\t\t\t// Array of objects\n\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t...propSchema,\n\t\t\t\t\titems: this.filterNestedProperties(propSchema.items),\n\t\t\t\t};\n\t\t\t} else if (propSchema.allOf || propSchema.oneOf || propSchema.anyOf) {\n\t\t\t\t// Composition schemas - filter each branch\n\t\t\t\tif (propSchema.allOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\tallOf: propSchema.allOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t} else if (propSchema.oneOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\toneOf: propSchema.oneOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t} else if (propSchema.anyOf) {\n\t\t\t\t\tfilteredPropSchema = {\n\t\t\t\t\t\t...propSchema,\n\t\t\t\t\t\tanyOf: propSchema.anyOf.map(s => this.filterSchemaRecursive(s)),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfilteredProperties[propName] = filteredPropSchema;\n\n\t\t\t// Keep required status if property is included\n\t\t\tif (schema.required?.includes(propName)) {\n\t\t\t\tfilteredRequired.push(propName);\n\t\t\t}\n\t\t}\n\n\t\tconst result = {\n\t\t\t...schema,\n\t\t\tproperties: filteredProperties,\n\t\t\trequired: filteredRequired.length > 0 ? filteredRequired : undefined,\n\t\t};\n\n\t\t// Cache the result\n\t\tthis.filteredPropsCache.set(cacheKey, result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Resolve discriminator mapping to actual schema references\n\t */\n\tprivate resolveDiscriminatorMapping(mapping: Record<string, string>, schemas: OpenAPISchema[]): OpenAPISchema[] {\n\t\t// If mapping is provided, use it to reorder/filter schemas\n\t\t// The mapping maps discriminator values to schema references\n\t\tconst mappedSchemas: OpenAPISchema[] = [];\n\n\t\tfor (const [_, schemaRef] of Object.entries(mapping)) {\n\t\t\t// Find the schema that matches this reference\n\t\t\tconst matchingSchema = schemas.find(s => {\n\t\t\t\tif (s.$ref) {\n\t\t\t\t\t// Check if the ref matches\n\t\t\t\t\treturn s.$ref === schemaRef || s.$ref.endsWith(schemaRef);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tif (matchingSchema) {\n\t\t\t\tmappedSchemas.push(matchingSchema);\n\t\t\t} else {\n\t\t\t\t// Schema not found in oneOf/anyOf, create a reference\n\t\t\t\tmappedSchemas.push({ $ref: schemaRef });\n\t\t\t}\n\t\t}\n\n\t\t// Include any schemas that weren't in the mapping\n\t\tfor (const schema of schemas) {\n\t\t\tif (!mappedSchemas.includes(schema)) {\n\t\t\t\tmappedSchemas.push(schema);\n\t\t\t}\n\t\t}\n\n\t\treturn mappedSchemas;\n\t}\n\n\t/**\n\t * Resolve a schema name through any aliases to get the actual schema name\n\t * If the schema is an alias (allOf with single $ref), return the target name\n\t */\n\tprivate resolveSchemaAlias(schemaName: string): string {\n\t\tconst schema = this.context.spec.components?.schemas?.[schemaName];\n\t\tif (!schema) return schemaName;\n\n\t\t// Check if this is a simple alias (allOf with single $ref and nothing else)\n\t\tif (\n\t\t\tschema.allOf &&\n\t\t\tschema.allOf.length === 1 &&\n\t\t\tschema.allOf[0].$ref &&\n\t\t\t!schema.properties &&\n\t\t\t!schema.oneOf &&\n\t\t\t!schema.anyOf\n\t\t) {\n\t\t\tconst targetName = resolveRef(schema.allOf[0].$ref);\n\t\t\t// Recursively resolve in case of chained aliases\n\t\t\treturn this.resolveSchemaAlias(targetName);\n\t\t}\n\n\t\treturn schemaName;\n\t}\n\n\t/**\n\t * Check if this is a circular dependency through aliases\n\t */\n\tprivate isCircularThroughAlias(fromSchema: string, toSchema: string): boolean {\n\t\tconst toSchemaSpec = this.context.spec.components?.schemas?.[toSchema];\n\t\tif (!toSchemaSpec) return false;\n\n\t\t// Check if toSchema is a simple alias (allOf with single $ref)\n\t\tif (toSchemaSpec.allOf && toSchemaSpec.allOf.length === 1 && toSchemaSpec.allOf[0].$ref) {\n\t\t\tconst aliasTarget = resolveRef(toSchemaSpec.allOf[0].$ref);\n\t\t\t// If the alias points back to the original schema, it's circular\n\t\t\treturn aliasTarget === fromSchema;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Generate union for multiple types (OpenAPI 3.1)\n\t */\n\tprivate generateMultiTypeUnion(schema: OpenAPISchema, currentSchema?: string): string {\n\t\tif (!Array.isArray(schema.type)) {\n\t\t\treturn \"z.unknown()\";\n\t\t}\n\t\tconst nonNullTypes = schema.type.filter(t => t !== \"null\");\n\t\tconst schemas = nonNullTypes.map(type => {\n\t\t\tconst typeSchema = { ...schema, type };\n\t\t\treturn this.generatePropertySchema(typeSchema, currentSchema);\n\t\t});\n\t\treturn `z.union([${schemas.join(\", \")}])`;\n\t}\n\n\t/**\n\t * Apply unevaluatedProperties validation to a schema\n\t */\n\tprivate applyUnevaluatedProperties(baseSchema: string, schema: OpenAPISchema): string {\n\t\t// Collect all evaluated properties from the schema and its composition\n\t\tconst evaluatedProps = new Set<string>();\n\n\t\t// Add properties from this schema\n\t\tif (schema.properties) {\n\t\t\tfor (const propName of Object.keys(schema.properties)) {\n\t\t\t\tevaluatedProps.add(propName);\n\t\t\t}\n\t\t}\n\n\t\t// Add properties from allOf/oneOf/anyOf (shallow scan)\n\t\tconst collectPropsFromComposition = (schemas?: OpenAPISchema[]) => {\n\t\t\tif (!schemas) return;\n\t\t\tfor (const subSchema of schemas) {\n\t\t\t\tif (subSchema.properties) {\n\t\t\t\t\tfor (const propName of Object.keys(subSchema.properties)) {\n\t\t\t\t\t\tevaluatedProps.add(propName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Also check $ref schemas\n\t\t\t\tif (subSchema.$ref) {\n\t\t\t\t\tconst refSchema = this.context.spec.components?.schemas?.[subSchema.$ref.split(\"/\").pop() || \"\"];\n\t\t\t\t\tif (refSchema?.properties) {\n\t\t\t\t\t\tfor (const propName of Object.keys(refSchema.properties)) {\n\t\t\t\t\t\t\tevaluatedProps.add(propName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tcollectPropsFromComposition(schema.allOf);\n\t\tcollectPropsFromComposition(schema.oneOf);\n\t\tcollectPropsFromComposition(schema.anyOf);\n\n\t\tconst evaluatedPropsSet = `new Set(${JSON.stringify([...evaluatedProps])})`;\n\n\t\t// For unions (oneOf/anyOf), we need to add .catchall(z.unknown()) to EACH branch\n\t\t// For allOf with merge(), add catchall to the final result\n\t\tlet schemaWithCatchall = baseSchema;\n\t\tif (baseSchema.includes(\".union([\") || baseSchema.includes(\".discriminatedUnion(\")) {\n\t\t\t// For unions, we need to make each branch allow additional properties\n\t\t\t// This is complex, so we'll apply refinement and let the refinement check the raw input\n\t\t\t// The union will have already validated structure, refinement checks extra props\n\t\t\tschemaWithCatchall = baseSchema;\n\t\t} else if (baseSchema.includes(\".merge(\")) {\n\t\t\t// Wrap in catchall - apply to final result\n\t\t\tschemaWithCatchall = `${baseSchema}.catchall(z.unknown())`;\n\t\t}\n\n\t\tif (schema.unevaluatedProperties === false) {\n\t\t\t// No unevaluated properties allowed\n\t\t\treturn `${schemaWithCatchall}.refine((obj) => Object.keys(obj).every(key => ${evaluatedPropsSet}.has(key)), { message: \"No unevaluated properties allowed\" })`;\n\t\t} else if (typeof schema.unevaluatedProperties === \"object\") {\n\t\t\t// Unevaluated properties must match schema\n\t\t\tconst unevalSchema = this.generatePropertySchema(schema.unevaluatedProperties);\n\t\t\treturn `${schemaWithCatchall}.refine((obj) => Object.keys(obj).filter(key => !${evaluatedPropsSet}.has(key)).every(key => ${unevalSchema}.safeParse(obj[key]).success), { message: \"Unevaluated properties must match the schema\" })`;\n\t\t}\n\n\t\treturn baseSchema;\n\t}\n\n\t/**\n\t * Generate Zod schema for a property\n\t */\n\tgeneratePropertySchema(schema: OpenAPISchema, currentSchema?: string, isTopLevel = false): string {\n\t\t// Performance optimization: Check cache for simple schemas\n\t\t// Only cache schemas without $ref or complex compositions to avoid stale circular refs\n\t\tconst isCacheable = !schema.$ref && !schema.allOf && !schema.oneOf && !schema.anyOf && !currentSchema;\n\t\tif (isCacheable) {\n\t\t\tconst cacheKey = JSON.stringify({ schema, type: this.context.schemaType, mode: this.context.mode });\n\t\t\tconst cached = this.schemaCache.get(cacheKey);\n\t\t\tif (cached) {\n\t\t\t\treturn cached;\n\t\t\t}\n\t\t}\n\n\t\t// Apply nested property filtering if needed\n\t\tif ((this.context.schemaType === \"request\" || this.context.schemaType === \"response\") && schema.properties) {\n\t\t\tschema = this.filterNestedProperties(schema);\n\t\t}\n\n\t\tconst nullable = isNullable(schema);\n\n\t\t// Handle multiple types (OpenAPI 3.1)\n\t\tif (hasMultipleTypes(schema)) {\n\t\t\tconst union = this.generateMultiTypeUnion(schema, currentSchema);\n\t\t\treturn wrapNullable(union, nullable);\n\t\t}\n\n\t\t// Handle $ref\n\t\tif (schema.$ref) {\n\t\t\tconst refName = resolveRef(schema.$ref);\n\t\t\t// Resolve through any aliases to get the actual schema\n\t\t\tconst resolvedRefName = this.resolveSchemaAlias(refName);\n\n\t\t\t// Track dependency (but not if it's just an alias at top level)\n\t\t\tif (currentSchema && refName !== currentSchema && !isTopLevel) {\n\t\t\t\tif (!this.context.schemaDependencies.has(currentSchema)) {\n\t\t\t\t\tthis.context.schemaDependencies.set(currentSchema, new Set());\n\t\t\t\t}\n\t\t\t\tthis.context.schemaDependencies.get(currentSchema)?.add(refName);\n\t\t\t}\n\t\t\t// Use the resolved name for the schema reference\n\t\t\tconst schemaName = `${toCamelCase(resolvedRefName, this.context.namingOptions)}Schema`;\n\n\t\t\t// Check for circular dependency through alias\n\t\t\tif (currentSchema && this.isCircularThroughAlias(currentSchema, refName)) {\n\t\t\t\t// Use lazy evaluation for circular references with explicit type annotation\n\t\t\t\tconst lazySchema = `z.lazy((): z.ZodTypeAny => ${schemaName})`;\n\t\t\t\treturn wrapNullable(lazySchema, nullable);\n\t\t\t}\n\n\t\t\treturn wrapNullable(schemaName, nullable);\n\t\t}\n\n\t\t// Handle const (literal values)\n\t\tif (schema.const !== undefined) {\n\t\t\tconst literalValue = typeof schema.const === \"string\" ? `\"${schema.const}\"` : schema.const;\n\t\t\tconst zodLiteral = `z.literal(${literalValue})`;\n\t\t\treturn wrapNullable(zodLiteral, nullable);\n\t\t}\n\n\t\t// Handle enum\n\t\tif (schema.enum) {\n\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\tconst zodEnum = `z.enum([${enumValues}])`;\n\t\t\treturn wrapNullable(zodEnum, nullable);\n\t\t}\n\n\t\t// Handle allOf\n\t\tif (schema.allOf) {\n\t\t\tlet composition = generateAllOf(\n\t\t\t\tschema.allOf,\n\t\t\t\tnullable,\n\t\t\t\t{ generatePropertySchema: this.generatePropertySchema.bind(this) },\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle oneOf with discriminator support\n\t\tif (schema.oneOf) {\n\t\t\tconst needsPassthrough = schema.unevaluatedProperties !== undefined;\n\t\t\tlet composition = generateUnion(\n\t\t\t\tschema.oneOf,\n\t\t\t\tschema.discriminator?.propertyName,\n\t\t\t\tnullable,\n\t\t\t\t{\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tresolveDiscriminatorMapping: this.resolveDiscriminatorMapping.bind(this),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpassthrough: needsPassthrough,\n\t\t\t\t\tdiscriminatorMapping: schema.discriminator?.mapping,\n\t\t\t\t},\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle anyOf with discriminator support\n\t\tif (schema.anyOf) {\n\t\t\tconst needsPassthrough = schema.unevaluatedProperties !== undefined;\n\t\t\tlet composition = generateUnion(\n\t\t\t\tschema.anyOf,\n\t\t\t\tschema.discriminator?.propertyName,\n\t\t\t\tnullable,\n\t\t\t\t{\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tresolveDiscriminatorMapping: this.resolveDiscriminatorMapping.bind(this),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpassthrough: needsPassthrough,\n\t\t\t\t\tdiscriminatorMapping: schema.discriminator?.mapping,\n\t\t\t\t},\n\t\t\t\tcurrentSchema\n\t\t\t);\n\n\t\t\t// Apply unevaluatedProperties if specified\n\t\t\tif (schema.unevaluatedProperties !== undefined) {\n\t\t\t\tcomposition = this.applyUnevaluatedProperties(composition, schema);\n\t\t\t}\n\n\t\t\treturn composition;\n\t\t}\n\n\t\t// Handle not keyword (must be after compositions)\n\t\tif (schema.not) {\n\t\t\tconst notSchema = this.generatePropertySchema(schema.not, currentSchema);\n\t\t\tlet baseValidation: string;\n\n\t\t\t// If schema has a type, generate validation for that type first\n\t\t\tif (schema.type || schema.properties || schema.items) {\n\t\t\t\t// Create a copy without 'not' to generate base validation\n\t\t\t\tconst { not: _, ...baseSchema } = schema;\n\t\t\t\tbaseValidation = this.generatePropertySchema(baseSchema, currentSchema);\n\t\t\t} else {\n\t\t\t\t// No specific type, use unknown\n\t\t\t\tbaseValidation = \"z.unknown()\";\n\t\t\t}\n\n\t\t\tconst refined = `${baseValidation}.refine((val) => !${notSchema}.safeParse(val).success, { message: \"Value must not match the excluded schema\" })`;\n\t\t\treturn wrapNullable(refined, nullable);\n\t\t}\n\n\t\tlet validation = \"\";\n\t\tconst primaryType = getPrimaryType(schema);\n\n\t\tswitch (primaryType) {\n\t\t\tcase \"string\":\n\t\t\t\tvalidation = generateStringValidation(schema, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"number\":\n\t\t\t\tvalidation = generateNumberValidation(schema, false, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"integer\":\n\t\t\t\tvalidation = generateNumberValidation(schema, true, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"boolean\":\n\t\t\t\tvalidation = \"z.boolean()\";\n\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\tbreak;\n\n\t\t\tcase \"array\":\n\t\t\t\tvalidation = generateArrayValidation(schema, {\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tuseDescribe: this.context.useDescribe,\n\t\t\t\t\tcurrentSchema,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"object\":\n\t\t\t\tif (\n\t\t\t\t\tschema.properties ||\n\t\t\t\t\tschema.required ||\n\t\t\t\t\tschema.minProperties !== undefined ||\n\t\t\t\t\tschema.maxProperties !== undefined ||\n\t\t\t\t\tschema.patternProperties ||\n\t\t\t\t\tschema.propertyNames\n\t\t\t\t) {\n\t\t\t\t\tvalidation = generateObjectSchema(\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\t\t\tshouldIncludeProperty: this.shouldIncludeProperty.bind(this),\n\t\t\t\t\t\t\tmode: this.context.mode,\n\t\t\t\t\t\t\tincludeDescriptions: this.context.includeDescriptions,\n\t\t\t\t\t\t\tuseDescribe: this.context.useDescribe,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSchema\n\t\t\t\t\t);\n\t\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\t} else {\n\t\t\t\t\tvalidation = \"z.record(z.string(), z.unknown())\";\n\t\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tvalidation = \"z.unknown()\";\n\t\t\t\tvalidation = addDescription(validation, schema.description, this.context.useDescribe);\n\t\t}\n\n\t\tconst result = wrapNullable(validation, nullable);\n\n\t\t// Store in cache if cacheable\n\t\tif (isCacheable) {\n\t\t\tconst cacheKey = JSON.stringify({ schema, type: this.context.schemaType, mode: this.context.mode });\n\t\t\tthis.schemaCache.set(cacheKey, result);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { minimatch } from \"minimatch\";\nimport type { OperationFilters } from \"../types\";\n\n/**\n * Filter statistics to track which operations were included/excluded\n */\nexport interface FilterStatistics {\n\ttotalOperations: number;\n\tincludedOperations: number;\n\tfilteredByTags: number;\n\tfilteredByPaths: number;\n\tfilteredByMethods: number;\n\tfilteredByOperationIds: number;\n\tfilteredByDeprecated: number;\n}\n\n/**\n * Create a new filter statistics object with all counters initialized to zero\n */\nexport function createFilterStatistics(): FilterStatistics {\n\treturn {\n\t\ttotalOperations: 0,\n\t\tincludedOperations: 0,\n\t\tfilteredByTags: 0,\n\t\tfilteredByPaths: 0,\n\t\tfilteredByMethods: 0,\n\t\tfilteredByOperationIds: 0,\n\t\tfilteredByDeprecated: 0,\n\t};\n}\n\n/**\n * Check if a value matches any of the patterns (supports glob patterns)\n * Empty patterns array = no constraint (returns true)\n */\nfunction matchesAnyPattern(value: string | undefined, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) {\n\t\treturn false; // No constraint means \"don't use this filter\"\n\t}\n\tif (!value) {\n\t\treturn false;\n\t}\n\treturn patterns.some(pattern => minimatch(value, pattern));\n}\n\n/**\n * Check if an array contains any of the specified values\n * Empty values array = no constraint (returns false)\n */\nfunction containsAny(arr: string[] | undefined, values: string[] | undefined): boolean {\n\tif (!values || values.length === 0) {\n\t\treturn false; // No constraint means \"don't use this filter\"\n\t}\n\tif (!arr || arr.length === 0) {\n\t\treturn false;\n\t}\n\treturn values.some(value => arr.includes(value));\n}\n\n/**\n * Determine if an operation should be included based on filter criteria\n *\n * Filter logic:\n * 1. If no filters specified, include all operations\n * 2. Empty arrays are treated as \"no constraint\" (not as \"exclude all\")\n * 3. Include filters are applied first (allowlist)\n * 4. Exclude filters are applied second (blocklist)\n * 5. Exclude rules always win over include rules\n *\n * @param operation - The OpenAPI operation object\n * @param path - The operation path (e.g., \"/users/{id}\")\n * @param method - The HTTP method (e.g., \"get\", \"post\")\n * @param filters - Optional filter configuration\n * @param stats - Optional statistics object to track filtering reasons\n * @returns true if the operation should be included, false otherwise\n */\nexport function shouldIncludeOperation(\n\toperation: any,\n\tpath: string,\n\tmethod: string,\n\tfilters?: OperationFilters,\n\tstats?: FilterStatistics\n): boolean {\n\t// If no filters specified, include all operations\n\tif (!filters) {\n\t\treturn true;\n\t}\n\n\tconst methodLower = method.toLowerCase();\n\tconst operationId = operation?.operationId;\n\tconst tags = operation?.tags || [];\n\tconst deprecated = operation?.deprecated === true;\n\n\t// Apply include filters first (allowlist)\n\t// If any include filter is specified and the operation doesn't match, exclude it\n\n\t// Check includeTags\n\tif (filters.includeTags && filters.includeTags.length > 0) {\n\t\tif (!containsAny(tags, filters.includeTags)) {\n\t\t\tif (stats) stats.filteredByTags++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includePaths\n\tif (filters.includePaths && filters.includePaths.length > 0) {\n\t\tif (!matchesAnyPattern(path, filters.includePaths)) {\n\t\t\tif (stats) stats.filteredByPaths++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includeMethods\n\tif (filters.includeMethods && filters.includeMethods.length > 0) {\n\t\tconst methodsLower = filters.includeMethods.map(m => m.toLowerCase());\n\t\tif (!methodsLower.includes(methodLower)) {\n\t\t\tif (stats) stats.filteredByMethods++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check includeOperationIds\n\tif (filters.includeOperationIds && filters.includeOperationIds.length > 0) {\n\t\tif (!matchesAnyPattern(operationId, filters.includeOperationIds)) {\n\t\t\tif (stats) stats.filteredByOperationIds++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Apply exclude filters second (blocklist)\n\t// If the operation matches any exclude filter, exclude it\n\n\t// Check excludeDeprecated\n\tif (filters.excludeDeprecated === true && deprecated) {\n\t\tif (stats) stats.filteredByDeprecated++;\n\t\treturn false;\n\t}\n\n\t// Check excludeTags\n\tif (filters.excludeTags && filters.excludeTags.length > 0) {\n\t\tif (containsAny(tags, filters.excludeTags)) {\n\t\t\tif (stats) stats.filteredByTags++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludePaths\n\tif (filters.excludePaths && filters.excludePaths.length > 0) {\n\t\tif (matchesAnyPattern(path, filters.excludePaths)) {\n\t\t\tif (stats) stats.filteredByPaths++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludeMethods\n\tif (filters.excludeMethods && filters.excludeMethods.length > 0) {\n\t\tconst methodsLower = filters.excludeMethods.map(m => m.toLowerCase());\n\t\tif (methodsLower.includes(methodLower)) {\n\t\t\tif (stats) stats.filteredByMethods++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check excludeOperationIds\n\tif (filters.excludeOperationIds && filters.excludeOperationIds.length > 0) {\n\t\tif (matchesAnyPattern(operationId, filters.excludeOperationIds)) {\n\t\t\tif (stats) stats.filteredByOperationIds++;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Operation passed all filters\n\treturn true;\n}\n\n/**\n * Validate filter statistics and emit warnings for filters that matched nothing\n * Helps users debug filter configurations that might be too restrictive or contain typos\n *\n * @param stats - Filter statistics object\n * @param filters - The filter configuration to validate\n */\nexport function validateFilters(stats: FilterStatistics, filters?: OperationFilters): void {\n\tif (!filters || stats.totalOperations === 0) {\n\t\treturn;\n\t}\n\n\t// If all operations were filtered out, emit a warning\n\tif (stats.includedOperations === 0) {\n\t\tconsole.warn(\n\t\t\t`⚠️ Warning: All ${stats.totalOperations} operations were filtered out. Check your operationFilters configuration.`\n\t\t);\n\n\t\t// Provide specific guidance about which filters might be the issue\n\t\tconst filterBreakdown: string[] = [];\n\t\tif (stats.filteredByTags > 0) filterBreakdown.push(`${stats.filteredByTags} by tags`);\n\t\tif (stats.filteredByPaths > 0) filterBreakdown.push(`${stats.filteredByPaths} by paths`);\n\t\tif (stats.filteredByMethods > 0) filterBreakdown.push(`${stats.filteredByMethods} by methods`);\n\t\tif (stats.filteredByOperationIds > 0) filterBreakdown.push(`${stats.filteredByOperationIds} by operationIds`);\n\t\tif (stats.filteredByDeprecated > 0) filterBreakdown.push(`${stats.filteredByDeprecated} by deprecated flag`);\n\n\t\tif (filterBreakdown.length > 0) {\n\t\t\tconsole.warn(` Filtered: ${filterBreakdown.join(\", \")}`);\n\t\t}\n\t}\n}\n\n/**\n * Format filter statistics for display in generated output\n * Returns a formatted string suitable for inclusion in comments\n *\n * @param stats - Filter statistics object\n * @returns Formatted statistics string\n */\nexport function formatFilterStatistics(stats: FilterStatistics): string {\n\tif (stats.totalOperations === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines: string[] = [];\n\tlines.push(\"Operation Filtering:\");\n\tlines.push(` Total operations: ${stats.totalOperations}`);\n\tlines.push(` Included operations: ${stats.includedOperations}`);\n\n\tconst filteredCount =\n\t\tstats.filteredByTags +\n\t\tstats.filteredByPaths +\n\t\tstats.filteredByMethods +\n\t\tstats.filteredByOperationIds +\n\t\tstats.filteredByDeprecated;\n\n\tif (filteredCount > 0) {\n\t\tlines.push(` Filtered operations: ${filteredCount}`);\n\t\tif (stats.filteredByTags > 0) lines.push(` - By tags: ${stats.filteredByTags}`);\n\t\tif (stats.filteredByPaths > 0) lines.push(` - By paths: ${stats.filteredByPaths}`);\n\t\tif (stats.filteredByMethods > 0) lines.push(` - By methods: ${stats.filteredByMethods}`);\n\t\tif (stats.filteredByOperationIds > 0) lines.push(` - By operationIds: ${stats.filteredByOperationIds}`);\n\t\tif (stats.filteredByDeprecated > 0) lines.push(` - By deprecated: ${stats.filteredByDeprecated}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n","/**\r\n * Type generation mode\r\n * - 'inferred': Generate Zod schemas with z.infer<typeof schema> types (default)\r\n * - 'native': Generate native TypeScript types without Zod schemas\r\n */\r\nexport type TypeMode = \"inferred\" | \"native\";\r\n\r\n/**\r\n * Native enum generation type (used when typeMode is 'native')\r\n * - 'union': Generate union types like 'a' | 'b' | 'c' (default)\r\n * - 'enum': Generate TypeScript enums like enum StatusEnum { A = 'a', B = 'b' }\r\n */\r\nexport type NativeEnumType = \"union\" | \"enum\";\r\n\r\n/**\r\n * Common options shared by both request and response contexts\r\n */\r\nexport interface CommonSchemaOptions {\r\n\t/**\r\n\t * Object validation mode\r\n\t * - 'strict': Uses z.strictObject() - no additional properties allowed\r\n\t * - 'normal': Uses z.object() - additional properties allowed\r\n\t * - 'loose': Uses z.looseObject() - explicitly allows additional properties\r\n\t */\r\n\tmode?: \"strict\" | \"normal\" | \"loose\";\r\n\r\n\t/**\r\n\t * Enum generation type\r\n\t * - 'zod': Uses z.enum() with inferred types (default)\r\n\t * - 'typescript': Uses TypeScript enums with z.enum() referencing them\r\n\t */\r\n\tenumType?: \"zod\" | \"typescript\";\r\n\r\n\t/**\r\n\t * Whether to add .describe() calls for better error messages\r\n\t * @default false\r\n\t */\r\n\tuseDescribe?: boolean;\r\n\r\n\t/**\r\n\t * Whether to include descriptions as JSDoc comments\r\n\t */\r\n\tincludeDescriptions?: boolean;\r\n}\r\n\r\n/**\r\n * Request-specific options that can override root-level options\r\n * Requests support native TypeScript type generation as an alternative to Zod schemas\r\n */\r\nexport interface RequestOptions extends CommonSchemaOptions {\r\n\t/**\r\n\t * Type generation mode\r\n\t * - 'inferred': Generate Zod schemas with z.infer types (default)\r\n\t * - 'native': Generate native TypeScript types without Zod validation\r\n\t */\r\n\ttypeMode?: TypeMode;\r\n\r\n\t/**\r\n\t * Native enum generation type (when typeMode is 'native')\r\n\t * - 'union': Generate union types (default)\r\n\t * - 'enum': Generate TypeScript enums\r\n\t */\r\n\tnativeEnumType?: NativeEnumType;\r\n}\r\n\r\n/**\r\n * Response-specific options that can override root-level options\r\n * Responses always use Zod schemas for runtime validation\r\n */\r\nexport interface ResponseOptions extends CommonSchemaOptions {\r\n\t// Responses don't support typeMode - always generate Zod schemas\r\n}\r\n\r\nexport interface OpenApiGeneratorOptions {\r\n\t/**\r\n\t * Object validation mode\r\n\t * - 'strict': Uses z.strictObject() - no additional properties allowed\r\n\t * - 'normal': Uses z.object() - additional properties allowed\r\n\t * - 'loose': Uses z.looseObject() - explicitly allows additional properties\r\n\t */\r\n\tmode?: \"strict\" | \"normal\" | \"loose\";\r\n\r\n\t/**\r\n\t * Input OpenAPI YAML file path\r\n\t */\r\n\tinput: string;\r\n\r\n\t/**\r\n\t * Output TypeScript file path\r\n\t * Optional when using string generation methods (generateString)\r\n\t * Required when calling generate() to write to a file\r\n\t */\r\n\toutput?: string;\r\n\r\n\t/**\r\n\t * Whether to include descriptions as JSDoc comments\r\n\t */\r\n\tincludeDescriptions?: boolean;\r\n\r\n\t/**\r\n\t * Enum generation type\r\n\t * - 'zod': Uses z.enum() with inferred types (default)\r\n\t * - 'typescript': Uses TypeScript enums with z.enum() referencing them\r\n\t */\r\n\tenumType?: \"zod\" | \"typescript\";\r\n\r\n\t/**\r\n\t * Whether to add .describe() calls for better error messages\r\n\t * @default false\r\n\t */\r\n\tuseDescribe?: boolean;\r\n\r\n\t/**\r\n\t * Schema filtering mode\r\n\t * - 'all': Generate all schemas (default)\r\n\t * - 'request': Only include schemas suitable for requests (excludes readOnly)\r\n\t * - 'response': Only include schemas suitable for responses (excludes writeOnly)\r\n\t */\r\n\tschemaType?: \"all\" | \"request\" | \"response\";\r\n\r\n\t/**\r\n\t * Prefix to add to all generated schema names\r\n\t * @example \"api\" -> \"apiUserSchema\"\r\n\t */\r\n\tprefix?: string;\r\n\r\n\t/**\r\n\t * Suffix to add before \"Schema\" in generated names\r\n\t * @example \"dto\" -> \"userDtoSchema\"\r\n\t */\r\n\tsuffix?: string;\r\n\r\n\t/**\r\n\t * Whether to include generation statistics in output file\r\n\t * @default true\r\n\t */\r\n\tshowStats?: boolean;\r\n\r\n\t/**\r\n\t * Native enum generation type (when typeMode is 'native')\r\n\t * - 'union': Generate union types (default)\r\n\t * - 'enum': Generate TypeScript enums with 'Enum' suffix\r\n\t * @default 'union'\r\n\t */\r\n\tnativeEnumType?: NativeEnumType;\r\n\r\n\t/**\r\n\t * Request-specific options that override root-level options\r\n\t * Applied when schemas are used in request contexts\r\n\t * Supports native TypeScript type generation\r\n\t */\r\n\trequest?: RequestOptions;\r\n\r\n\t/**\r\n\t * Response-specific options that override root-level options\r\n\t * Applied when schemas are used in response contexts\r\n\t * Always generates Zod schemas for runtime validation\r\n\t */\r\n\tresponse?: ResponseOptions;\r\n\r\n\t/**\r\n\t * Filter which operations to include/exclude from generation\r\n\t * Useful for generating separate schemas for different API subsets\r\n\t *\r\n\t * Filtering logic:\r\n\t * 1. If no filters specified, all operations are included\r\n\t * 2. Empty arrays are treated as \"no constraint\" (not as \"exclude all\")\r\n\t * 3. Include filters are applied first (allowlist)\r\n\t * 4. Exclude filters are applied second (blocklist)\r\n\t * 5. Exclude rules always win over include rules\r\n\t *\r\n\t * Supports glob patterns for paths and operationIds (e.g., \"/api/v1/**\", \"get*\")\r\n\t *\r\n\t * @example\r\n\t * // Only generate schemas for user-related endpoints\r\n\t * operationFilters: {\r\n\t * includeTags: [\"users\"]\r\n\t * }\r\n\t *\r\n\t * @example\r\n\t * // Generate only GET endpoints, excluding deprecated ones\r\n\t * operationFilters: {\r\n\t * includeMethods: [\"get\"],\r\n\t * excludeDeprecated: true\r\n\t * }\r\n\t *\r\n\t * @example\r\n\t * // Generate only v1 API endpoints\r\n\t * operationFilters: {\r\n\t * includePaths: [\"/api/v1/**\"]\r\n\t * }\r\n\t */\r\n\toperationFilters?: OperationFilters;\r\n}\r\n\r\n/**\r\n * Operation filtering options\r\n * Controls which operations from the OpenAPI spec are included in generation\r\n */\r\nexport interface OperationFilters {\r\n\t/**\r\n\t * Include only operations with these tags\r\n\t * If specified, only operations with at least one matching tag are included\r\n\t * Empty array = no constraint\r\n\t */\r\n\tincludeTags?: string[];\r\n\r\n\t/**\r\n\t * Exclude operations with these tags\r\n\t * Operations with any matching tag are excluded\r\n\t * Empty array = no constraint\r\n\t */\r\n\texcludeTags?: string[];\r\n\r\n\t/**\r\n\t * Include only operations matching these path patterns\r\n\t * Supports glob patterns (e.g., \"/users/**\", \"/api/v1/*\")\r\n\t * Empty array = no constraint\r\n\t */\r\n\tincludePaths?: string[];\r\n\r\n\t/**\r\n\t * Exclude operations matching these path patterns\r\n\t * Supports glob patterns (e.g., \"/internal/**\", \"/admin/*\")\r\n\t * Empty array = no constraint\r\n\t */\r\n\texcludePaths?: string[];\r\n\r\n\t/**\r\n\t * Include only these HTTP methods\r\n\t * Valid values: \"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"\r\n\t * Empty array = no constraint\r\n\t */\r\n\tincludeMethods?: string[];\r\n\r\n\t/**\r\n\t * Exclude these HTTP methods\r\n\t * Valid values: \"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"\r\n\t * Empty array = no constraint\r\n\t */\r\n\texcludeMethods?: string[];\r\n\r\n\t/**\r\n\t * Include only operations matching these operationId patterns\r\n\t * Supports glob patterns (e.g., \"getUser*\", \"*Admin\")\r\n\t * Empty array = no constraint\r\n\t */\r\n\tincludeOperationIds?: string[];\r\n\r\n\t/**\r\n\t * Exclude operations matching these operationId patterns\r\n\t * Supports glob patterns (e.g., \"deleteUser*\", \"*Internal\")\r\n\t * Empty array = no constraint\r\n\t */\r\n\texcludeOperationIds?: string[];\r\n\r\n\t/**\r\n\t * Whether to exclude deprecated operations\r\n\t * @default false\r\n\t */\r\n\texcludeDeprecated?: boolean;\r\n}\r\n\r\nexport interface OpenAPISchema {\r\n\ttype?: string | string[];\r\n\tformat?: string;\r\n\tenum?: (string | number)[];\r\n\tconst?: string | number | boolean | null;\r\n\tproperties?: Record<string, OpenAPISchema>;\r\n\trequired?: string[];\r\n\titems?: OpenAPISchema;\r\n\tprefixItems?: OpenAPISchema[];\r\n\tallOf?: OpenAPISchema[];\r\n\toneOf?: OpenAPISchema[];\r\n\tanyOf?: OpenAPISchema[];\r\n\t$ref?: string;\r\n\tnullable?: boolean;\r\n\tminLength?: number;\r\n\tmaxLength?: number;\r\n\tminimum?: number;\r\n\tmaximum?: number;\r\n\texclusiveMinimum?: boolean | number;\r\n\texclusiveMaximum?: boolean | number;\r\n\tmultipleOf?: number;\r\n\tpattern?: string;\r\n\tdescription?: string;\r\n\ttitle?: string;\r\n\texample?: any;\r\n\texamples?: any[];\r\n\tadditionalProperties?: boolean | OpenAPISchema;\r\n\tminProperties?: number;\r\n\tmaxProperties?: number;\r\n\tminItems?: number;\r\n\tmaxItems?: number;\r\n\tuniqueItems?: boolean;\r\n\tcontains?: OpenAPISchema;\r\n\tminContains?: number;\r\n\tmaxContains?: number;\r\n\tdiscriminator?: {\r\n\t\tpropertyName: string;\r\n\t\tmapping?: Record<string, string>;\r\n\t};\r\n\treadOnly?: boolean;\r\n\twriteOnly?: boolean;\r\n\tdeprecated?: boolean;\r\n\tdependentRequired?: Record<string, string[]>;\r\n\tdependencies?: Record<string, string[] | OpenAPISchema>;\r\n\tpatternProperties?: Record<string, OpenAPISchema>;\r\n\tpropertyNames?: OpenAPISchema;\r\n\tcontentMediaType?: string;\r\n\tcontentEncoding?: string;\r\n\tnot?: OpenAPISchema;\r\n\tif?: OpenAPISchema;\r\n\tthen?: OpenAPISchema;\r\n\telse?: OpenAPISchema;\r\n\tunevaluatedProperties?: boolean | OpenAPISchema;\r\n\tunevaluatedItems?: boolean | OpenAPISchema;\r\n}\r\n\r\nexport interface OpenAPISpec {\r\n\tcomponents?: {\r\n\t\tschemas?: Record<string, OpenAPISchema>;\r\n\t};\r\n\tpaths?: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Execution mode for batch processing\r\n * - 'parallel': Process all specs concurrently (default, faster)\r\n * - 'sequential': Process specs one at a time (safer for resource constraints)\r\n */\r\nexport type ExecutionMode = \"parallel\" | \"sequential\";\r\n\r\n/**\r\n * Root configuration file structure\r\n */\r\nexport interface ConfigFile {\r\n\t/**\r\n\t * Global default options applied to all specs\r\n\t * Can be overridden by individual spec configurations\r\n\t */\r\n\tdefaults?: Partial<Omit<OpenApiGeneratorOptions, \"input\" | \"output\">>;\r\n\r\n\t/**\r\n\t * Array of OpenAPI specifications to process\r\n\t * Each spec must have input and output paths\r\n\t */\r\n\tspecs: OpenApiGeneratorOptions[];\r\n\r\n\t/**\r\n\t * Execution mode for batch processing\r\n\t * @default \"parallel\"\r\n\t */\r\n\texecutionMode?: ExecutionMode;\r\n}\r\n\r\n/**\r\n * Resolved options for a specific schema context (request or response)\r\n * All optional fields from RequestResponseOptions are required here\r\n */\r\nexport interface ResolvedOptions {\r\n\tmode: \"strict\" | \"normal\" | \"loose\";\r\n\tenumType: \"zod\" | \"typescript\";\r\n\tuseDescribe: boolean;\r\n\tincludeDescriptions: boolean;\r\n\ttypeMode: TypeMode;\r\n\tnativeEnumType: NativeEnumType;\r\n}\r\n\r\n/**\r\n * Helper function for type-safe config file creation\r\n * Provides IDE autocomplete and type checking for config files\r\n *\r\n * @example\r\n * ```typescript\r\n * import { defineConfig } from '@cerios/openapi-to-zod';\r\n *\r\n * export default defineConfig({\r\n * defaults: {\r\n * mode: 'strict',\r\n * includeDescriptions: true\r\n * },\r\n * specs: [\r\n * { input: 'api-v1.yaml', output: 'schemas/v1.ts' },\r\n * { input: 'api-v2.yaml', output: 'schemas/v2.ts', mode: 'normal' }\r\n * ]\r\n * });\r\n * ```\r\n */\r\nexport function defineConfig(config: ConfigFile): ConfigFile {\r\n\treturn config;\r\n}\r\n"],"mappings":"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","names":["schemaCode","typeCode","isNullable","isNullable","schemaStrings","union","merged","elseValidation","elseRequiredProps","generatePropertyAccess","definedProps","_a","isNullable","wrapNullable"]}