@cerios/openapi-to-zod 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/utils/pattern-utils.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":["/**\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 { minimatch } from \"minimatch\";\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 } 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\";\nimport { stripPathPrefix, stripPrefix } from \"./utils/pattern-utils\";\nimport { configureDateTimeFormat, configurePatternCache } from \"./validators/string-validator\";\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 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 requestOptions: ResolvedOptions;\n\tprivate responseOptions: ResolvedOptions;\n\tprivate needsZodImport = true;\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\tuseDescribe: options.useDescribe ?? false,\n\t\t\tdefaultNullable: options.defaultNullable ?? false,\n\t\t\tschemaType: options.schemaType || \"all\",\n\t\t\tprefix: options.prefix,\n\t\t\tsuffix: options.suffix,\n\t\t\tstripSchemaPrefix: options.stripSchemaPrefix,\n\t\t\tstripPathPrefix: options.stripPathPrefix,\n\t\t\tshowStats: options.showStats ?? true,\n\t\t\trequest: options.request,\n\t\t\tresponse: options.response,\n\t\t\toperationFilters: options.operationFilters,\n\t\t\tignoreHeaders: options.ignoreHeaders,\n\t\t\tcacheSize: options.cacheSize ?? 1000,\n\t\t\tbatchSize: options.batchSize ?? 10,\n\t\t\tcustomDateTimeFormatRegex: options.customDateTimeFormatRegex,\n\t\t};\n\n\t\t// Configure pattern cache size if specified\n\t\tif (this.options.cacheSize) {\n\t\t\tconfigurePatternCache(this.options.cacheSize);\n\t\t}\n\n\t\t// Configure custom date-time format if specified\n\t\tif (this.options.customDateTimeFormatRegex) {\n\t\t\tconfigureDateTimeFormat(this.options.customDateTimeFormatRegex);\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// 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\tdefaultNullable: this.options.defaultNullable ?? false,\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\tstripSchemaPrefix: this.options.stripSchemaPrefix,\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// Generate schemas and track dependencies\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\t// Skip schemas not referenced by filtered operations when operation filters are active\n\t\t\tif (this.options.operationFilters && this.schemaUsageMap.size > 0 && !this.schemaUsageMap.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.generateComponentSchema(name, schema);\n\t\t}\n\n\t\t// Generate query parameter schemas from path operations\n\t\tthis.generateQueryParameterSchemas();\n\n\t\t// 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 schemas and types in dependency order\n\t\toutput.push(\"// Schemas and Types\");\n\t\tfor (const name of orderedSchemaNames) {\n\t\t\tconst schemaCode = this.schemas.get(name);\n\t\t\tconst typeCode = this.types.get(name);\n\n\t\t\tif (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\t// Convert schema name to valid TypeScript type name (handles dotted names)\n\t\t\t\t// Apply stripSchemaPrefix before type name generation\n\t\t\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\t\t\t\tconst typeName = toPascalCase(strippedName);\n\t\t\t\tif (!schemaCode.includes(`export type ${typeName}`)) {\n\t\t\t\t\tconst schemaName = `${toCamelCase(strippedName, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\t\t\toutput.push(`export type ${typeName} = z.infer<typeof ${schemaName}>;`);\n\t\t\t\t}\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (typeCode) {\n\t\t\t\t// Type only (shouldn't happen in Zod-only mode, but kept for safety)\n\t\t\t\toutput.push(typeCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\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\tconsole.log(` ✓ Generated ${normalizedOutput}`);\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 */\n\tprivate resolveOptionsForContext(context: \"request\" | \"response\"): ResolvedOptions {\n\t\tconst contextOptions = context === \"request\" ? this.options.request : this.options.response;\n\n\t\treturn {\n\t\t\tmode: contextOptions?.mode ?? this.options.mode ?? \"normal\",\n\t\t\tuseDescribe: contextOptions?.useDescribe ?? this.options.useDescribe ?? false,\n\t\t\tincludeDescriptions: contextOptions?.includeDescriptions ?? this.options.includeDescriptions ?? true,\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 * 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\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// Apply stripSchemaPrefix before generating enum\n\t\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\n\t\t\t// Generate Zod enum\n\t\t\tconst { schemaCode, typeCode } = generateEnum(strippedName, schema.enum, {\n\t\t\t\tprefix: this.options.prefix,\n\t\t\t\tsuffix: this.options.suffix,\n\t\t\t});\n\n\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\treturn;\n\t\t}\n\n\t\t// Generate Zod schema\n\t\t// Apply stripSchemaPrefix to get cleaner schema names\n\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\t\tconst schemaName = `${toCamelCase(strippedName, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t// For allOf with single $ref, track dependency manually since we simplify it\n\t\tif (schema.allOf && schema.allOf.length === 1 && schema.allOf[0].$ref) {\n\t\t\tconst refName = resolveRef(schema.allOf[0].$ref);\n\t\t\tthis.schemaDependencies.get(name)?.add(refName);\n\t\t}\n\n\t\t// Update property generator context for this schema\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: resolvedOptions.mode,\n\t\t\tincludeDescriptions: resolvedOptions.includeDescriptions,\n\t\t\tuseDescribe: resolvedOptions.useDescribe,\n\t\t\tdefaultNullable: this.options.defaultNullable ?? false,\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\tstripSchemaPrefix: this.options.stripSchemaPrefix,\n\t\t});\n\n\t\t// Check if this is just a simple $ref (alias)\n\t\t// Pass isTopLevel=true for top-level schema generation to prevent defaultNullable from applying\n\t\tconst zodSchema = this.propertyGenerator.generatePropertySchema(schema, name, true);\n\t\tconst zodSchemaCode = `${jsdoc}export const ${schemaName} = ${zodSchema};`;\n\n\t\t// Track dependencies from discriminated unions\n\t\t// Extract schema references like \"carSchema, truckSchema\" from discriminatedUnion calls\n\t\tif (zodSchema.includes(\"z.discriminatedUnion(\")) {\n\t\t\tconst match = zodSchema.match(/z\\.discriminatedUnion\\([^,]+,\\s*\\[([^\\]]+)\\]/);\n\t\t\tif (match) {\n\t\t\t\tconst refs = match[1].split(\",\").map(ref => ref.trim());\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\t// Extract schema name from camelCase reference (e.g., \"carSchema\" -> \"Car\")\n\t\t\t\t\tconst depMatch = ref.match(/^([a-z][a-zA-Z0-9]*?)Schema$/);\n\t\t\t\t\tif (depMatch) {\n\t\t\t\t\t\t// Convert camelCase to PascalCase (carSchema -> Car)\n\t\t\t\t\t\tconst depName = depMatch[1].charAt(0).toUpperCase() + depMatch[1].slice(1);\n\t\t\t\t\t\tthis.schemaDependencies.get(name)?.add(depName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.schemas.set(name, zodSchemaCode);\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 parameters\n\t\t\t\tif (!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 or path+method fallback\n\t\t\t\tlet pascalOperationId: string;\n\t\t\t\tif (operation.operationId) {\n\t\t\t\t\t// Use toPascalCase only for kebab-case IDs, simple capitalization for camelCase\n\t\t\t\t\tpascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback: generate name from path + method\n\t\t\t\t\t// Apply stripPathPrefix if configured (for consistency with Playwright service generator)\n\t\t\t\t\tconst strippedPath = stripPathPrefix(path, this.options.stripPathPrefix);\n\t\t\t\t\tpascalOperationId = this.generateMethodNameFromPath(method, strippedPath);\n\t\t\t\t}\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 - use operationId if available, otherwise use method + path\n\t\t\t\tconst jsdocOperationName = operation.operationId || `${method.toUpperCase()} ${path}`;\n\t\t\t\tconst jsdoc = `/**\\n * Query parameters for ${jsdocOperationName}\\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 a PascalCase method name from HTTP method and path\n\t * Used as fallback when operationId is not available\n\t * @internal\n\t */\n\tprivate generateMethodNameFromPath(method: string, path: string): string {\n\t\t// Convert path to PascalCase\n\t\t// e.g., GET /users/{userId}/posts -> GetUsersByUserIdPosts\n\t\t// e.g., GET /api/v0.1/users -> GetApiV01Users\n\t\tconst segments = path\n\t\t\t.split(\"/\")\n\t\t\t.filter(Boolean)\n\t\t\t.map(segment => {\n\t\t\t\tif (segment.startsWith(\"{\") && segment.endsWith(\"}\")) {\n\t\t\t\t\t// Path parameter - convert to \"ByParamName\"\n\t\t\t\t\tconst paramName = segment.slice(1, -1);\n\t\t\t\t\treturn `By${this.capitalizeSegment(paramName)}`;\n\t\t\t\t}\n\t\t\t\t// Regular segment - capitalize and handle special characters\n\t\t\t\treturn this.capitalizeSegment(segment);\n\t\t\t})\n\t\t\t.join(\"\");\n\n\t\t// Capitalize first letter of method\n\t\tconst capitalizedMethod = method.charAt(0).toUpperCase() + method.slice(1).toLowerCase();\n\t\treturn `${capitalizedMethod}${segments}`;\n\t}\n\n\t/**\n\t * Capitalizes a path segment, handling special characters like dashes, underscores, and dots\n\t * @internal\n\t */\n\tprivate capitalizeSegment(str: string): string {\n\t\t// Handle kebab-case, snake_case, and dots\n\t\tif (str.includes(\"-\") || str.includes(\"_\") || str.includes(\".\")) {\n\t\t\treturn str\n\t\t\t\t.split(/[-_.]/)\n\t\t\t\t.map(part => {\n\t\t\t\t\tif (!part) return \"\";\n\t\t\t\t\treturn part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t}\n\n\t\t// Regular word - just capitalize first letter\n\t\treturn str.charAt(0).toUpperCase() + str.slice(1);\n\t}\n\n\t/**\n\t * Check if a header should be ignored based on filter patterns\n\t * @internal\n\t */\n\tprivate shouldIgnoreHeader(headerName: string): boolean {\n\t\tconst ignorePatterns = this.options.ignoreHeaders;\n\t\tif (!ignorePatterns || ignorePatterns.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ignorePatterns.includes(\"*\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst headerLower = headerName.toLowerCase();\n\n\t\treturn ignorePatterns.some((pattern: string) => {\n\t\t\tconst patternLower = pattern.toLowerCase();\n\t\t\treturn minimatch(headerLower, patternLower);\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 parameters\n\t\t\t\tif (!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, excluding ignored ones\n\t\t\t\tconst headerParams = operation.parameters.filter(\n\t\t\t\t\t(param: any) =>\n\t\t\t\t\t\tparam && typeof param === \"object\" && param.in === \"header\" && !this.shouldIgnoreHeader(param.name)\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 or path+method fallback\n\t\t\t\tlet pascalOperationId: string;\n\t\t\t\tif (operation.operationId) {\n\t\t\t\t\tpascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback: generate name from path + method\n\t\t\t\t\t// Apply stripPathPrefix if configured (for consistency with Playwright service generator)\n\t\t\t\t\tconst strippedPath = stripPathPrefix(path, this.options.stripPathPrefix);\n\t\t\t\t\tpascalOperationId = this.generateMethodNameFromPath(method, strippedPath);\n\t\t\t\t}\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 - use operationId if available, otherwise use method + path\n\t\t\t\tconst jsdocOperationName = operation.operationId || `${method.toUpperCase()} ${path}`;\n\t\t\t\tconst jsdoc = `/**\\n * Header parameters for ${jsdocOperationName}\\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\t// Apply stripSchemaPrefix to referenced schema names\n\t\t\tconst strippedRefName = stripPrefix(refName, this.options.stripSchemaPrefix);\n\t\t\tconst schemaName = toCamelCase(strippedRefName, { 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\t// Check if all values are booleans\n\t\t\tconst allBooleans = schema.enum.every((v: any) => typeof v === \"boolean\");\n\t\t\tif (allBooleans) {\n\t\t\t\treturn \"z.boolean()\";\n\t\t\t}\n\n\t\t\t// Check if all values are strings\n\t\t\tconst allStrings = schema.enum.every((v: any) => typeof v === \"string\");\n\t\t\tif (allStrings) {\n\t\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\t\treturn `z.enum([${enumValues}])`;\n\t\t\t}\n\n\t\t\t// For numeric or mixed enums, use z.union with z.literal\n\t\t\tconst literalValues = schema.enum\n\t\t\t\t.map((v: any) => {\n\t\t\t\t\tif (typeof v === \"string\") {\n\t\t\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `z.literal(${v})`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\treturn `z.union([${literalValues}])`;\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// REMOVED: generateNativeEnum method - no longer needed as we only generate Zod schemas\n\t// REMOVED: toEnumKey method - was only used by generateNativeEnum\n\t// REMOVED: addConstraintsToJSDoc method - was only used for native TypeScript types\n\t// REMOVED: generateNativeTypeDefinition method - was only used for native TypeScript types\n\t// REMOVED: generateObjectType method - was only used for native TypeScript types\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.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.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 schemas and types\n\t\tconst allNames = new Set([...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\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`// 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 * Sanitize a string by replacing invalid identifier characters with underscores\n * Preserves dots, hyphens, underscores, and spaces as word separators\n * Example: \"User@Domain\" -> \"User_Domain\"\n * Example: \"User-Data@2024\" -> \"User-Data_2024\"\n */\nfunction sanitizeIdentifier(str: string): string {\n\t// Replace all non-identifier chars (except dots, hyphens, underscores, spaces) with underscores\n\t// Valid identifier chars: letters, digits, underscore\n\t// Preserve: dots, hyphens, underscores, spaces as word separators\n\treturn str.replace(/[^a-zA-Z0-9._\\-\\s]+/g, \"_\");\n}\n\n/**\n * Convert schema name to camelCase with optional prefix/suffix\n * Handles dotted names like \"Company.Models.User\" -> \"companyModelsUser\"\n */\nexport function toCamelCase(str: string, options?: NamingOptions): string {\n\t// Sanitize invalid characters first\n\tconst sanitized = sanitizeIdentifier(str);\n\n\t// Split by dots, hyphens, underscores, and spaces to get words\n\tconst words = sanitized.split(/[.\\-_\\s]+/).filter(word => word.length > 0);\n\n\t// Convert to camelCase: first word lowercase, rest PascalCase\n\tlet name: string;\n\tif (words.length === 0) {\n\t\tname = str.charAt(0).toLowerCase() + str.slice(1);\n\t} else if (words.length === 1) {\n\t\tname = words[0].charAt(0).toLowerCase() + words[0].slice(1);\n\t} else {\n\t\tname =\n\t\t\twords[0].charAt(0).toLowerCase() +\n\t\t\twords[0].slice(1) +\n\t\t\twords\n\t\t\t\t.slice(1)\n\t\t\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t\t.join(\"\");\n\t}\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 * @shared Convert enum value to PascalCase and sanitize for TypeScript enum keys\n * @since 1.0.0\n * Utility used by core and playwright packages\n * Handles dotted names like \"Company.Models.User\" -> \"CompanyModelsUser\"\n */\nexport function toPascalCase(str: string | number): string {\n\tconst stringValue = String(str);\n\n\t// Check if it's already a valid PascalCase or camelCase identifier\n\t// (only contains letters, digits, and no special characters)\n\tconst isAlreadyValidCase = /^[a-zA-Z][a-zA-Z0-9]*$/.test(stringValue);\n\n\tif (isAlreadyValidCase) {\n\t\t// Just ensure it starts with uppercase\n\t\treturn stringValue.charAt(0).toUpperCase() + stringValue.slice(1);\n\t}\n\n\t// Sanitize invalid characters first\n\tconst sanitized = sanitizeIdentifier(stringValue);\n\n\t// Split by dots, hyphens, underscores, and spaces to get words\n\tconst words = sanitized.split(/[.\\-_\\s]+/).filter(word => word.length > 0);\n\n\t// Convert all words to PascalCase\n\tlet result: string;\n\tif (words.length === 0) {\n\t\tresult = \"Value\";\n\t} else {\n\t\tresult = words.map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(\"\");\n\t}\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\treturn \"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 interface EnumOpenApiGeneratorOptions extends NamingOptions {}\n\nexport interface EnumResult {\n\tschemaCode: string;\n\ttypeCode: string;\n}\n\n/**\n * Generate Zod enum schema\n * - String-only enums: z.enum()\n * - Numeric enums: z.union([z.literal(), ...])\n * - Boolean enums: z.boolean()\n * - Mixed enums: z.union([z.literal(), ...])\n */\nexport function generateEnum(\n\tname: string,\n\tvalues: (string | number | boolean)[],\n\toptions: EnumOpenApiGeneratorOptions\n): EnumResult {\n\tconst schemaName = `${toCamelCase(name, options)}Schema`;\n\tconst typeName = toPascalCase(name);\n\n\t// Check if all values are booleans\n\tconst allBooleans = values.every(v => typeof v === \"boolean\");\n\tif (allBooleans) {\n\t\t// For boolean enums, use z.boolean()\n\t\tconst schemaCode = `export const ${schemaName} = z.boolean();`;\n\t\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\t\treturn { schemaCode, typeCode };\n\t}\n\n\t// Check if all values are strings\n\tconst allStrings = values.every(v => typeof v === \"string\");\n\tif (allStrings) {\n\t\t// z.enum only accepts string values\n\t\tconst enumValues = values.map(v => `\"${v}\"`).join(\", \");\n\t\tconst schemaCode = `export const ${schemaName} = z.enum([${enumValues}]);`;\n\t\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\t\treturn { schemaCode, typeCode };\n\t}\n\n\t// For numeric or mixed enums, use z.union with z.literal\n\tconst literalValues = values\n\t\t.map(v => {\n\t\t\tif (typeof v === \"string\") {\n\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t}\n\t\t\treturn `z.literal(${v})`;\n\t\t})\n\t\t.join(\", \");\n\n\tconst schemaCode = `export const ${schemaName} = z.union([${literalValues}]);`;\n\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\n\treturn { 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 * Only escapes forward slashes which would terminate the regex literal\n */\nexport function escapePattern(str: string): string {\n\treturn str.replace(/\\//g, \"\\\\/\");\n}\n\n/**\n * @shared Escape JSDoc comment content to prevent injection\n * @since 1.0.0\n * Utility used by core and playwright packages\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 * @param schema - The OpenAPI schema to check\n * @param defaultNullable - Default nullable behavior when not explicitly specified (default: false)\n */\nexport function isNullable(schema: OpenAPISchema, defaultNullable = false): boolean {\n\t// OpenAPI 3.0 style: nullable explicitly set\n\tif (schema.nullable === true) {\n\t\treturn true;\n\t}\n\tif (schema.nullable === false) {\n\t\treturn false;\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\t// No explicit nullable annotation - use default\n\treturn defaultNullable;\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 * @shared Simple LRU Cache implementation for performance optimization\n * @since 1.0.0\n * Utility used by core and playwright packages\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 capacity(): number {\n\t\treturn this.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 { minimatch } from \"minimatch\";\n\n/**\n * Pattern matching utilities for prefix stripping\n *\n * Shared utility used by core and playwright packages\n *\n * Supports both literal string matching and glob patterns for stripping\n * prefixes from strings (paths, schema names, etc.)\n */\n\n/**\n * Validates if a glob pattern is syntactically valid\n * @param pattern - The glob pattern to validate\n * @returns true if valid, false otherwise\n */\nfunction isValidGlobPattern(pattern: string): boolean {\n\ttry {\n\t\t// Try to create a minimatch instance to validate the pattern\n\t\tnew minimatch.Minimatch(pattern);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Checks if a pattern contains glob special characters\n * @param pattern - The pattern to check\n * @returns true if pattern contains glob wildcards\n */\nfunction isGlobPattern(pattern: string): boolean {\n\treturn /[*?[\\]{}!]/.test(pattern);\n}\n\n/**\n * @shared Strips a prefix from a string using either literal string matching or glob patterns\n * @since 1.1.0\n * Shared utility used by core and playwright packages\n *\n * @param input - The full string to strip from\n * @param pattern - The glob pattern to strip\n * @param ensureLeadingChar - Optional character to ensure at start (e.g., \"/\" for paths)\n * @returns The string with prefix removed, or original string if no match\n *\n * @example\n * // Literal string matching\n * stripPrefix(\"/api/v1/users\", \"/api/v1\") // => \"/users\"\n * stripPrefix(\"Company.Models.User\", \"Company.Models.\") // => \"User\"\n *\n * @example\n * // Glob pattern matching\n * stripPrefix(\"/api/v1.0/users\", \"/api/v*\") // => matches and strips\n * stripPrefix(\"Company.Models.User\", \"*.Models.\") // => \"User\"\n * stripPrefix(\"api_v2_UserSchema\", \"api_v[0-9]_\") // => \"UserSchema\"\n */\nexport function stripPrefix(input: string, pattern: string | undefined, ensureLeadingChar?: string): string {\n\tif (!pattern) {\n\t\treturn input;\n\t}\n\n\t// Validate glob pattern if it contains special characters\n\tif (isGlobPattern(pattern) && !isValidGlobPattern(pattern)) {\n\t\tconsole.warn(`⚠️ Invalid glob pattern \"${pattern}\": Pattern is malformed`);\n\t\treturn input;\n\t}\n\n\t// Check if pattern contains glob wildcards\n\tif (isGlobPattern(pattern)) {\n\t\t// Use glob matching to find the prefix\n\t\t// We need to find what part of the input matches the pattern as a prefix\n\t\t// Try matching progressively longer prefixes to find the longest match\n\t\tlet longestMatch = -1;\n\n\t\tfor (let i = 1; i <= input.length; i++) {\n\t\t\tconst testPrefix = input.substring(0, i);\n\t\t\tif (minimatch(testPrefix, pattern)) {\n\t\t\t\t// Found a match - keep looking for a longer match\n\t\t\t\tlongestMatch = i;\n\t\t\t}\n\t\t}\n\n\t\tif (longestMatch > 0) {\n\t\t\t// Strip the longest matching prefix\n\t\t\tconst stripped = input.substring(longestMatch);\n\n\t\t\t// Ensure result starts with specified character if provided\n\t\t\tif (ensureLeadingChar) {\n\t\t\t\tif (stripped === \"\") {\n\t\t\t\t\treturn ensureLeadingChar;\n\t\t\t\t}\n\t\t\t\tif (!stripped.startsWith(ensureLeadingChar)) {\n\t\t\t\t\treturn `${ensureLeadingChar}${stripped}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stripped === \"\" && !ensureLeadingChar ? input : stripped;\n\t\t}\n\n\t\t// No match found\n\t\treturn input;\n\t}\n\n\t// Literal string matching\n\tif (input.startsWith(pattern)) {\n\t\tconst stripped = input.substring(pattern.length);\n\n\t\t// Ensure result starts with specified character if provided\n\t\tif (ensureLeadingChar) {\n\t\t\tif (stripped === \"\") {\n\t\t\t\treturn ensureLeadingChar;\n\t\t\t}\n\t\t\tif (!stripped.startsWith(ensureLeadingChar)) {\n\t\t\t\treturn `${ensureLeadingChar}${stripped}`;\n\t\t\t}\n\t\t}\n\n\t\treturn stripped;\n\t}\n\n\t// No match - return original input\n\treturn input;\n}\n\n/**\n * @shared Strips a prefix from a path (ensures leading slash)\n * @since 1.1.0\n * Shared utility used by playwright package for path manipulation\n *\n * @param path - The full path to strip from\n * @param pattern - The glob pattern to strip\n * @returns The path with prefix removed, or original path if no match\n *\n * @example\n * stripPathPrefix(\"/api/v1/users\", \"/api/v1\") // => \"/users\"\n * stripPathPrefix(\"/api/v2/posts\", \"/api/v*\") // => \"/posts\"\n * stripPathPrefix(\"/api/v1.0/items\", \"/api/v[0-9].*\") // => \"/items\"\n */\nexport function stripPathPrefix(path: string, pattern: string | undefined): string {\n\tif (!pattern) {\n\t\treturn path;\n\t}\n\n\t// For literal string matching with paths, normalize the pattern\n\tif (!isGlobPattern(pattern)) {\n\t\tlet normalizedPattern = pattern.trim();\n\t\tif (!normalizedPattern.startsWith(\"/\")) {\n\t\t\tnormalizedPattern = `/${normalizedPattern}`;\n\t\t}\n\t\tif (normalizedPattern.endsWith(\"/\") && normalizedPattern !== \"/\") {\n\t\t\tnormalizedPattern = normalizedPattern.slice(0, -1);\n\t\t}\n\n\t\treturn stripPrefix(path, normalizedPattern, \"/\");\n\t}\n\n\t// For glob patterns, use as-is\n\treturn stripPrefix(path, pattern, \"/\");\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\";\n\n/**\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\n */\nfunction generatePropertyAccess(propName: string): string {\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) ? `obj.${propName}` : `obj[\"${propName}\"]`;\n}\n\n/**\n * Generate validation for dependencies (OpenAPI 3.0)\n * Generates detailed error messages showing which specific fields are missing\n */\nexport function generateDependencies(\n\tschema: OpenAPISchema,\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\n\tcurrentSchema?: string\n): string {\n\tif (!schema.dependencies) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\n\t\tif (Array.isArray(dependency)) {\n\t\t\t// Skip empty dependency arrays (no dependencies to enforce)\n\t\t\tif (dependency.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Property dependency - show specific missing properties in error message\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tconst checkLogic = dependency\n\t\t\t\t.map(p => {\n\t\t\t\t\tconst pAccess = generatePropertyAccess(p);\n\t\t\t\t\treturn `if (${pAccess} === undefined) missing.push('${p}');`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\t\\t\");\n\n\t\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\t\tif (${propAccess} === undefined) return;\n\t\t\t\tconst missing: string[] = [];\n\t\t\t\t${checkLogic}\n\t\t\t\tif (missing.length > 0) {\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})`;\n\t\t} else if (generatePropertySchema) {\n\t\t\t// Schema dependency - show detailed validation errors\n\t\t\tconst depSchema: OpenAPISchema = { ...dependency, type: dependency.type || \"object\" };\n\t\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\n\t\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\t\tif (${propAccess} === undefined) return;\n\t\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\n\t\t\t\tif (!validation.success) {\n\t\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, object must satisfy additional constraints:\\\\n\\${errors}\\`,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})`;\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Generate condition check for if/then/else\n */\nexport function generateConditionalCheck(schema: OpenAPISchema): string {\n\tconst conditions: string[] = [];\n\n\t// Check properties\n\tif (schema.properties) {\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tif (propSchema.type) {\n\t\t\t\tconditions.push(`typeof ${propAccess} === \"${propSchema.type}\"`);\n\t\t\t}\n\t\t\tif (propSchema.const !== undefined) {\n\t\t\t\tconst value = typeof propSchema.const === \"string\" ? `\"${propSchema.const}\"` : propSchema.const;\n\t\t\t\tconditions.push(`${propAccess} === ${value}`);\n\t\t\t}\n\t\t\tif (propSchema.minimum !== undefined) {\n\t\t\t\tconditions.push(`${propAccess} >= ${propSchema.minimum}`);\n\t\t\t}\n\t\t\tif (propSchema.maximum !== undefined) {\n\t\t\t\tconditions.push(`${propAccess} <= ${propSchema.maximum}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check required properties\n\tif (schema.required) {\n\t\tfor (const prop of schema.required) {\n\t\t\tconditions.push(`${generatePropertyAccess(prop)} !== undefined`);\n\t\t}\n\t}\n\n\treturn conditions.length > 0 ? conditions.join(\" && \") : \"true\";\n}\n\n/**\n * Generate validation for then/else clauses\n */\nexport function generateConditionalValidation(schema: OpenAPISchema): string {\n\tconst checks: string[] = [];\n\n\t// Check required properties\n\tif (schema.required) {\n\t\tfor (const prop of schema.required) {\n\t\t\tchecks.push(`${generatePropertyAccess(prop)} !== undefined`);\n\t\t}\n\t}\n\n\t// Check properties constraints\n\tif (schema.properties) {\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tif (propSchema.minimum !== undefined) {\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} >= ${propSchema.minimum}`);\n\t\t\t}\n\t\t\tif (propSchema.maximum !== undefined) {\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} <= ${propSchema.maximum}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn checks.length > 0 ? checks.join(\" && \") : \"true\";\n}\n\n/**\n * Generate if/then/else conditional validation with better error messages\n * Uses superRefine with detailed error messages for complex cases\n */\nexport function generateIfThenElse(schema: OpenAPISchema): string {\n\tif (!schema.if || (!schema.then && !schema.else)) {\n\t\treturn \"\";\n\t}\n\n\tconst ifCondition = generateConditionalCheck(schema.if);\n\n\tif (schema.then && schema.else) {\n\t\t// Both then and else - provide detailed error messages\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\n\t\tconst elseValidation = generateConditionalValidation(schema.else);\n\n\t\t// Try to detect which specific validations failed\n\t\tconst thenRequiredProps = schema.then.required || [];\n\t\tconst elseRequiredProps = schema.else.required || [];\n\n\t\treturn `.superRefine((obj, ctx) => {\n\t\t\tconst ifConditionMet = ${ifCondition};\n\t\t\tif (ifConditionMet) {\n\t\t\t\t// Then branch\n\t\t\t\tconst thenValid = ${thenValidation};\n\t\t\t\tif (!thenValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\tthenRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingThenProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingThenProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingThenProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Else branch\n\t\t\t\tconst elseValid = ${elseValidation};\n\t\t\t\tif (!elseValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\telseRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingElseProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingElseProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingElseProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\tif (schema.then) {\n\t\t// Only then - provide detailed error message\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\n\t\tconst thenRequiredProps = schema.then.required || [];\n\n\t\treturn `.superRefine((obj, ctx) => {\n\t\t\tconst ifConditionMet = ${ifCondition};\n\t\t\tif (ifConditionMet) {\n\t\t\t\tconst thenValid = ${thenValidation};\n\t\t\t\tif (!thenValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\tthenRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\t// Only else - provide detailed error message\n\tif (!schema.else) return \"\";\n\tconst elseValidation = generateConditionalValidation(schema.else);\n\tconst elseRequiredProps = schema.else.required || [];\n\n\treturn `.superRefine((obj, ctx) => {\n\t\tconst ifConditionMet = ${ifCondition};\n\t\tif (!ifConditionMet) {\n\t\t\tconst elseValid = ${elseValidation};\n\t\t\tif (!elseValid) {\n\t\t\t\t${\n\t\t\t\t\telseRequiredProps.length > 0\n\t\t\t\t\t\t? `\n\t\t\t\tconst missingProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\tconst message = missingProps.length > 0 \n\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingProps.join(', ')}\\`\n\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\n\t\t\t\t`\n\t\t\t\t\t\t: `\n\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\n\t\t\t\t`\n\t\t\t\t}\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: message,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t})`;\n}\n\n/**\n * Generate dependent required validation (OpenAPI 3.1)\n * Generates detailed error messages showing which specific fields are missing\n */\nexport function generateDependentRequired(schema: OpenAPISchema): string {\n\tif (!schema.dependentRequired) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, requiredProps] of Object.entries(schema.dependentRequired)) {\n\t\t// Skip empty required arrays (no dependencies to enforce)\n\t\tif (requiredProps.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst propAccess = generatePropertyAccess(prop);\n\t\tconst checkLogic = requiredProps\n\t\t\t.map(rp => {\n\t\t\t\tconst rpAccess = generatePropertyAccess(rp);\n\t\t\t\treturn `if (${rpAccess} === undefined) missing.push('${rp}');`;\n\t\t\t})\n\t\t\t.join(\"\\n\\t\\t\");\n\n\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\tif (${propAccess} === undefined) return;\n\t\t\tconst missing: string[] = [];\n\t\t\t${checkLogic}\n\t\t\tif (missing.length > 0) {\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t})`;\n\t}\n\n\treturn result;\n}\n\n/**\n * Generate dependent schemas validation (JSON Schema 2019-09 / OpenAPI 3.1)\n * This is the modern replacement for schema-based dependencies\n * Generates detailed error messages showing validation failures\n */\nexport function generateDependentSchemas(\n\tschema: OpenAPISchema & { dependentSchemas?: Record<string, OpenAPISchema> },\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\n\tcurrentSchema?: string\n): string {\n\tif (!schema.dependentSchemas || !generatePropertySchema) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, depSchema] of Object.entries(schema.dependentSchemas)) {\n\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\n\t\tconst propAccess = generatePropertyAccess(prop);\n\n\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\tif (${propAccess} === undefined) return;\n\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\n\t\t\tif (!validation.success) {\n\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: \\`When '${prop}' is present, dependent schema validation failed:\\\\n\\${errors}\\`,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t})`;\n\t}\n\treturn result;\n}\n\n/**\n * Validate dependency graph for circular dependencies\n * Returns validation result with any detected circular dependency errors\n */\nexport function validateDependencyGraph(\n\tschema: OpenAPISchema,\n\tschemaName: string\n): { valid: boolean; errors: string[] } {\n\tconst errors: string[] = [];\n\n\tif (!schema.dependencies && !schema.dependentRequired) {\n\t\treturn { valid: true, errors: [] };\n\t}\n\n\t// Build dependency graph\n\tconst graph = new Map<string, Set<string>>();\n\n\t// Add dependentRequired edges\n\tif (schema.dependentRequired) {\n\t\tfor (const [prop, deps] of Object.entries(schema.dependentRequired)) {\n\t\t\tif (!graph.has(prop)) {\n\t\t\t\tgraph.set(prop, new Set());\n\t\t\t}\n\t\t\tconst propDeps = graph.get(prop);\n\t\t\tif (propDeps) {\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tpropDeps.add(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add dependencies (array type) edges\n\tif (schema.dependencies) {\n\t\tfor (const [prop, dep] of Object.entries(schema.dependencies)) {\n\t\t\tif (Array.isArray(dep)) {\n\t\t\t\tif (!graph.has(prop)) {\n\t\t\t\t\tgraph.set(prop, new Set());\n\t\t\t\t}\n\t\t\t\tconst propDeps = graph.get(prop);\n\t\t\t\tif (propDeps) {\n\t\t\t\t\tfor (const d of dep) {\n\t\t\t\t\t\tpropDeps.add(d);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect cycles using DFS\n\tconst visited = new Set<string>();\n\tconst recStack = new Set<string>();\n\tconst path: string[] = [];\n\n\tfunction detectCycle(prop: string): boolean {\n\t\tvisited.add(prop);\n\t\trecStack.add(prop);\n\t\tpath.push(prop);\n\n\t\tconst deps = graph.get(prop) || new Set();\n\t\tfor (const dep of deps) {\n\t\t\tif (!visited.has(dep)) {\n\t\t\t\tif (detectCycle(dep)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (recStack.has(dep)) {\n\t\t\t\t// Cycle detected\n\t\t\t\tconst cycleStart = path.indexOf(dep);\n\t\t\t\tconst cycle = [...path.slice(cycleStart), dep];\n\t\t\t\terrors.push(`Circular dependency detected in schema '${schemaName}': ${cycle.join(\" -> \")}`);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\trecStack.delete(prop);\n\t\tpath.pop();\n\t\treturn false;\n\t}\n\n\t// Check all roots\n\tfor (const prop of graph.keys()) {\n\t\tif (!visited.has(prop)) {\n\t\t\tdetectCycle(prop);\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n/**\n * Extract schema dependencies as reusable schemas\n * Useful for code generation and schema reuse\n */\nexport function extractSchemaDependencies(schema: OpenAPISchema, schemaName: string): Map<string, OpenAPISchema> {\n\tconst extracted = new Map<string, OpenAPISchema>();\n\n\tif (!schema.dependencies) {\n\t\treturn extracted;\n\t}\n\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\n\t\tif (!Array.isArray(dependency)) {\n\t\t\t// This is a schema dependency\n\t\t\tconst depSchemaName = `${schemaName}_${prop}_Dependency`;\n\t\t\tconst depSchema: OpenAPISchema = {\n\t\t\t\t...dependency,\n\t\t\t\ttype: dependency.type || \"object\",\n\t\t\t};\n\t\t\textracted.set(depSchemaName, depSchema);\n\t\t}\n\t}\n\n\treturn extracted;\n}\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 configurable size limit\n// Cache is shared across all generators for performance, but size can be configured per generator\nlet PATTERN_CACHE = new LRUCache<string, string>(1000);\n\n/**\n * Configure the pattern cache size\n * Should be called before generating schemas for large specifications\n */\nexport function configurePatternCache(size: number): void {\n\tif (size > 0 && size !== PATTERN_CACHE.capacity) {\n\t\tPATTERN_CACHE = new LRUCache<string, string>(size);\n\t}\n}\n\n// Default format map (without date-time, which can be customized)\nconst DEFAULT_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\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// Mutable format map that includes date-time and can be configured\nlet FORMAT_MAP: Record<string, string> = {\n\t...DEFAULT_FORMAT_MAP,\n\t\"date-time\": \"z.iso.datetime()\",\n};\n\n/**\n * Configure custom date-time format validation\n * Overrides the default z.iso.datetime() with a custom regex pattern\n *\n * @param pattern - Regex pattern (string or RegExp) for date-time validation\n * @throws {Error} If the provided pattern is not a valid regular expression\n * @example\n * // String pattern (required for JSON/YAML configs)\n * configureDateTimeFormat('^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}$')\n *\n * @example\n * // RegExp literal (TypeScript configs only)\n * configureDateTimeFormat(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/)\n */\nexport function configureDateTimeFormat(pattern?: string | RegExp): void {\n\tif (!pattern) {\n\t\t// Reset to default\n\t\tFORMAT_MAP[\"date-time\"] = \"z.iso.datetime()\";\n\t\treturn;\n\t}\n\n\t// Convert RegExp to string if needed\n\tconst patternStr = pattern instanceof RegExp ? pattern.source : pattern;\n\n\t// Empty string resets to default\n\tif (patternStr === \"\") {\n\t\tFORMAT_MAP[\"date-time\"] = \"z.iso.datetime()\";\n\t\treturn;\n\t}\n\n\t// Validate the regex pattern\n\ttry {\n\t\tnew RegExp(patternStr);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid regular expression pattern for customDateTimeFormatRegex: ${patternStr}. ${\n\t\t\t\terror instanceof Error ? error.message : \"Pattern is malformed\"\n\t\t\t}`\n\t\t);\n\t}\n\n\t// Escape the pattern for use in generated code\n\tconst escapedPattern = escapePattern(patternStr);\n\n\t// Update the format map with the custom regex\n\tFORMAT_MAP[\"date-time\"] = `z.string().regex(/${escapedPattern}/)`;\n}\n\n/**\n * Reset format map to defaults (useful for testing)\n */\nexport function resetFormatMap(): void {\n\tFORMAT_MAP = {\n\t\t...DEFAULT_FORMAT_MAP,\n\t\t\"date-time\": \"z.iso.datetime()\",\n\t};\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 { OpenAPISchema, OpenAPISpec } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport type { NamingOptions } from \"../utils/name-utils\";\nimport { resolveRef, toCamelCase } from \"../utils/name-utils\";\nimport { stripPrefix } from \"../utils/pattern-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\tnamingOptions: NamingOptions;\n\tstripSchemaPrefix?: string;\n\t/**\n\t * Default nullable behavior when not explicitly specified\n\t * @default false\n\t */\n\tdefaultNullable: boolean;\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\t// defaultNullable should only apply to properties within objects, NOT to top-level schema definitions\n\t\t// Top-level schemas should only be nullable if explicitly marked as such\n\t\tconst effectiveDefaultNullable = isTopLevel ? false : this.context.defaultNullable;\n\t\tconst nullable = isNullable(schema, effectiveDefaultNullable);\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\t// Apply stripSchemaPrefix to get consistent schema names\n\t\t\tconst strippedRefName = stripPrefix(resolvedRefName, this.context.stripSchemaPrefix);\n\t\t\tconst schemaName = `${toCamelCase(strippedRefName, this.context.namingOptions)}Schema`; // Check for direct self-reference or circular dependency through alias\n\t\t\tif (currentSchema && (refName === 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\t// Check if all values are booleans\n\t\t\tconst allBooleans = schema.enum.every(v => typeof v === \"boolean\");\n\t\t\tif (allBooleans) {\n\t\t\t\tconst zodBoolean = \"z.boolean()\";\n\t\t\t\treturn wrapNullable(zodBoolean, nullable);\n\t\t\t}\n\n\t\t\t// Check if all values are strings\n\t\t\tconst allStrings = schema.enum.every(v => typeof v === \"string\");\n\t\t\tif (allStrings) {\n\t\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\t\tconst zodEnum = `z.enum([${enumValues}])`;\n\t\t\t\treturn wrapNullable(zodEnum, nullable);\n\t\t\t}\n\n\t\t\t// For numeric or mixed enums, use z.union with z.literal\n\t\t\tconst literalValues = schema.enum\n\t\t\t\t.map(v => {\n\t\t\t\t\tif (typeof v === \"string\") {\n\t\t\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `z.literal(${v})`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\tconst zodUnion = `z.union([${literalValues}])`;\n\t\t\treturn wrapNullable(zodUnion, 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 * Common options shared by both request and response contexts\n */\nexport interface 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 * 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\t/**\n\t * Default nullable behavior when not explicitly specified in the schema\n\t *\n\t * When true: Properties without explicit nullable annotation are treated as nullable.\n\t * This follows the industry de facto standard for OpenAPI 3.0.x where tooling convergence\n\t * made \"nullable by default\" the safest assumption.\n\t *\n\t * When false (default): Properties are only nullable when explicitly marked with `nullable: true`\n\t * (OpenAPI 3.0) or `type: [\"string\", \"null\"]` (OpenAPI 3.1).\n\t *\n\t * @default false\n\t */\n\tdefaultNullable?: boolean;\n}\n\n/**\n * Request-specific options that can override root-level options\n */\nexport interface RequestOptions extends CommonSchemaOptions {\n\t// All options inherited from CommonSchemaOptions\n}\n\n/**\n * Response-specific options that can override root-level options\n */\nexport interface ResponseOptions extends CommonSchemaOptions {\n\t// All options inherited from CommonSchemaOptions\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 * Whether to add .describe() calls for better error messages\n\t * @default false\n\t */\n\tuseDescribe?: boolean;\n\n\t/**\n\t * Default nullable behavior when not explicitly specified in the schema\n\t *\n\t * When true: Properties without explicit nullable annotation are treated as nullable.\n\t * This follows the industry de facto standard for OpenAPI 3.0.x where tooling convergence\n\t * made \"nullable by default\" the safest assumption.\n\t *\n\t * When false (default): Properties are only nullable when explicitly marked with `nullable: true`\n\t * (OpenAPI 3.0) or `type: [\"string\", \"null\"]` (OpenAPI 3.1).\n\t *\n\t * @default false\n\t */\n\tdefaultNullable?: 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 * Strip a common prefix from all schema names before processing\n\t * Useful when OpenAPI spec has redundant schema prefixes that you want to ignore\n\t *\n\t * Supports both literal strings and glob patterns:\n\t * - Literal string: \"Company.Models.\" (must match exactly)\n\t * - Glob pattern: \"*.Models.\" (uses minimatch for pattern matching)\n\t *\n\t * Glob pattern syntax:\n\t * - * matches any characters within a single segment (stops at .)\n\t * - ** matches any characters across multiple segments (crosses . boundaries)\n\t * - ? matches a single character\n\t * - [abc] matches any character in the set\n\t * - {a,b} matches any of the alternatives\n\t * - !(pattern) matches anything except the pattern\n\t *\n\t * This affects:\n\t * - Schema name generation (shorter, cleaner names)\n\t * - Type name generation\n\t * - References to schemas\n\t *\n\t * Applied before prefix/suffix options.\n\t *\n\t * @example\n\t * // Spec has: \"Company.Models.User\", \"Company.Models.Post\"\n\t * // stripSchemaPrefix: \"Company.Models.\"\n\t * // Results in: \"User\", \"Post\"\n\t * // Schema names: userSchema, postSchema\n\t *\n\t * @example\n\t * // Strip any namespace prefix using glob pattern\n\t * // stripSchemaPrefix: \"*.Models.\"\n\t * // Matches: \"Company.Models.User\", \"App.Models.User\", etc.\n\t *\n\t * @example\n\t * // Strip versioned prefix\n\t * // stripSchemaPrefix: \"api_v[0-9]_\"\n\t * // Matches: \"api_v1_User\", \"api_v2_Post\", etc.\n\t *\n\t * @default undefined (no stripping)\n\t */\n\tstripSchemaPrefix?: 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 * Request-specific options that override root-level options\n\t * Applied when schemas are used in request contexts\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 */\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\t/**\n\t * Header parameters to ignore during schema generation\n\t * Supports glob patterns for flexible matching\n\t * Case-insensitive matching (HTTP header semantics)\n\t *\n\t * @internal Used by Playwright generator\n\t */\n\tignoreHeaders?: string[];\n\n\t/**\n\t * Strip a common prefix from all paths before generating query/header parameter schema names\n\t * This is used when operationId is not available and schema names are derived from the path.\n\t *\n\t * Supports both literal strings and glob patterns:\n\t * - Literal string: \"/api/v1\" (must match exactly)\n\t * - Glob pattern: \"/api/v*\" (uses minimatch for pattern matching)\n\t *\n\t * @example\n\t * // Path: \"/api/v1/users\" with stripPathPrefix: \"/api/v1\"\n\t * // Results in: GetUsersQueryParams (not GetApiV1UsersQueryParams)\n\t *\n\t * @internal Used by Playwright generator\n\t * @default undefined (no stripping)\n\t */\n\tstripPathPrefix?: string;\n\n\t/**\n\t * Cache size for pattern regex compilation\n\t * Higher values improve performance for large specifications with many string patterns\n\t * @default 1000\n\t */\n\tcacheSize?: number;\n\n\t/**\n\t * Batch size for parallel execution\n\t * Controls how many specifications are processed concurrently in parallel mode\n\t * Higher values increase memory usage but may improve throughput\n\t * @default 10\n\t */\n\tbatchSize?: number;\n\n\t/**\n\t * Custom regex pattern for date-time format validation\n\t * Overrides the default z.iso.datetime() which requires ISO 8601 format with timezone suffix (Z)\n\t *\n\t * **Config File Formats:**\n\t * - JSON/YAML configs: Must use string pattern (requires double-escaping: `\\\\d`)\n\t * - TypeScript configs: Can use either string pattern OR RegExp literal (`/\\d/`)\n\t *\n\t * **Common Patterns:**\n\t * ```typescript\n\t * // No timezone suffix (e.g., \"2026-01-07T14:30:00\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}$'\n\t * // OR in TypeScript config:\n\t * customDateTimeFormatRegex: /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/\n\t *\n\t * // With milliseconds, no Z (e.g., \"2026-01-07T14:30:00.123\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{3}$'\n\t *\n\t * // Optional Z suffix (e.g., \"2026-01-07T14:30:00\" or \"2026-01-07T14:30:00Z\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z?$'\n\t * ```\n\t *\n\t * @default \"z.iso.datetime()\" (requires Z suffix per ISO 8601)\n\t */\n\tcustomDateTimeFormatRegex?: string | RegExp;\n}\n\n/**\n * Operation filtering options\n * Controls which operations from the OpenAPI specification 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 | boolean)[];\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 specifications concurrently (default, faster)\n * - 'sequential': Process specifications 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 specifications\n\t * Can be overridden by individual specification configurations\n\t */\n\tdefaults?: Partial<Omit<OpenApiGeneratorOptions, \"input\" | \"output\">>;\n\n\t/**\n\t * Array of OpenAPI specifications to process\n\t * Each specification 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 are required here\n */\nexport interface ResolvedOptions {\n\tmode: \"strict\" | \"normal\" | \"loose\";\n\tuseDescribe: boolean;\n\tincludeDescriptions: boolean;\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":"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","names":["minimatch","schemaCode","typeCode","isNullable","isNullable","schemaStrings","union","merged","elseValidation","elseRequiredProps","generatePropertyAccess","definedProps","minimatch","_a","jsdoc","strippedName","minimatch"]}
1
+ {"version":3,"sources":["../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/utils/pattern-utils.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/utils/ref-resolver.ts","../src/types.ts"],"sourcesContent":["/**\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 { minimatch } from \"minimatch\";\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 } 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\";\nimport { stripPathPrefix, stripPrefix } from \"./utils/pattern-utils\";\nimport { mergeParameters } from \"./utils/ref-resolver\";\nimport { configureDateTimeFormat, configurePatternCache } from \"./validators/string-validator\";\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 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 requestOptions: ResolvedOptions;\n\tprivate responseOptions: ResolvedOptions;\n\tprivate needsZodImport = true;\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\tuseDescribe: options.useDescribe ?? false,\n\t\t\tdefaultNullable: options.defaultNullable ?? false,\n\t\t\temptyObjectBehavior: options.emptyObjectBehavior ?? \"loose\",\n\t\t\tschemaType: options.schemaType || \"all\",\n\t\t\tprefix: options.prefix,\n\t\t\tsuffix: options.suffix,\n\t\t\tstripSchemaPrefix: options.stripSchemaPrefix,\n\t\t\tstripPathPrefix: options.stripPathPrefix,\n\t\t\tshowStats: options.showStats ?? true,\n\t\t\trequest: options.request,\n\t\t\tresponse: options.response,\n\t\t\toperationFilters: options.operationFilters,\n\t\t\tignoreHeaders: options.ignoreHeaders,\n\t\t\tcacheSize: options.cacheSize ?? 1000,\n\t\t\tbatchSize: options.batchSize ?? 10,\n\t\t\tcustomDateTimeFormatRegex: options.customDateTimeFormatRegex,\n\t\t};\n\n\t\t// Configure pattern cache size if specified\n\t\tif (this.options.cacheSize) {\n\t\t\tconfigurePatternCache(this.options.cacheSize);\n\t\t}\n\n\t\t// Configure custom date-time format if specified\n\t\tif (this.options.customDateTimeFormatRegex) {\n\t\t\tconfigureDateTimeFormat(this.options.customDateTimeFormatRegex);\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// 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\tdefaultNullable: this.options.defaultNullable ?? false,\n\t\t\temptyObjectBehavior: this.options.emptyObjectBehavior ?? \"loose\",\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\tstripSchemaPrefix: this.options.stripSchemaPrefix,\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// Generate schemas and track dependencies\n\t\tfor (const [name, schema] of Object.entries(this.spec.components.schemas)) {\n\t\t\t// Skip schemas not referenced by filtered operations when operation filters are active\n\t\t\tif (this.options.operationFilters && this.schemaUsageMap.size > 0 && !this.schemaUsageMap.has(name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.generateComponentSchema(name, schema);\n\t\t}\n\n\t\t// Generate query parameter schemas from path operations\n\t\tthis.generateQueryParameterSchemas();\n\n\t\t// 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 schemas and types in dependency order\n\t\toutput.push(\"// Schemas and Types\");\n\t\tfor (const name of orderedSchemaNames) {\n\t\t\tconst schemaCode = this.schemas.get(name);\n\t\t\tconst typeCode = this.types.get(name);\n\n\t\t\tif (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\t// Convert schema name to valid TypeScript type name (handles dotted names)\n\t\t\t\t// Apply stripSchemaPrefix before type name generation\n\t\t\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\t\t\t\tconst typeName = toPascalCase(strippedName);\n\t\t\t\tif (!schemaCode.includes(`export type ${typeName}`)) {\n\t\t\t\t\tconst schemaName = `${toCamelCase(strippedName, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\t\t\t\toutput.push(`export type ${typeName} = z.infer<typeof ${schemaName}>;`);\n\t\t\t\t}\n\t\t\t\toutput.push(\"\");\n\t\t\t} else if (typeCode) {\n\t\t\t\t// Type only (shouldn't happen in Zod-only mode, but kept for safety)\n\t\t\t\toutput.push(typeCode);\n\t\t\t\toutput.push(\"\");\n\t\t\t}\n\t\t}\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\tconsole.log(` ✓ Generated ${normalizedOutput}`);\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 */\n\tprivate resolveOptionsForContext(context: \"request\" | \"response\"): ResolvedOptions {\n\t\tconst contextOptions = context === \"request\" ? this.options.request : this.options.response;\n\n\t\treturn {\n\t\t\tmode: contextOptions?.mode ?? this.options.mode ?? \"normal\",\n\t\t\tuseDescribe: contextOptions?.useDescribe ?? this.options.useDescribe ?? false,\n\t\t\tincludeDescriptions: contextOptions?.includeDescriptions ?? this.options.includeDescriptions ?? true,\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 * 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\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// Apply stripSchemaPrefix before generating enum\n\t\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\n\t\t\t// Generate Zod enum\n\t\t\tconst { schemaCode, typeCode } = generateEnum(strippedName, schema.enum, {\n\t\t\t\tprefix: this.options.prefix,\n\t\t\t\tsuffix: this.options.suffix,\n\t\t\t});\n\n\t\t\tconst enumSchemaCode = `${jsdoc}${schemaCode}\\n${typeCode}`;\n\t\t\tthis.schemas.set(name, enumSchemaCode);\n\t\t\treturn;\n\t\t}\n\n\t\t// Generate Zod schema\n\t\t// Apply stripSchemaPrefix to get cleaner schema names\n\t\tconst strippedName = stripPrefix(name, this.options.stripSchemaPrefix);\n\t\tconst schemaName = `${toCamelCase(strippedName, { prefix: this.options.prefix, suffix: this.options.suffix })}Schema`;\n\t\tconst jsdoc = generateJSDoc(schema, name, { includeDescriptions: resolvedOptions.includeDescriptions });\n\n\t\t// For allOf with single $ref, track dependency manually since we simplify it\n\t\tif (schema.allOf && schema.allOf.length === 1 && schema.allOf[0].$ref) {\n\t\t\tconst refName = resolveRef(schema.allOf[0].$ref);\n\t\t\tthis.schemaDependencies.get(name)?.add(refName);\n\t\t}\n\n\t\t// Update property generator context for this schema\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: resolvedOptions.mode,\n\t\t\tincludeDescriptions: resolvedOptions.includeDescriptions,\n\t\t\tuseDescribe: resolvedOptions.useDescribe,\n\t\t\tdefaultNullable: this.options.defaultNullable ?? false,\n\t\t\temptyObjectBehavior: this.options.emptyObjectBehavior ?? \"loose\",\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\tstripSchemaPrefix: this.options.stripSchemaPrefix,\n\t\t});\n\n\t\t// Check if this is just a simple $ref (alias)\n\t\t// Pass isTopLevel=true for top-level schema generation to prevent defaultNullable from applying\n\t\tconst zodSchema = this.propertyGenerator.generatePropertySchema(schema, name, true);\n\t\tconst zodSchemaCode = `${jsdoc}export const ${schemaName} = ${zodSchema};`;\n\n\t\t// Track dependencies from discriminated unions\n\t\t// Extract schema references like \"carSchema, truckSchema\" from discriminatedUnion calls\n\t\tif (zodSchema.includes(\"z.discriminatedUnion(\")) {\n\t\t\tconst match = zodSchema.match(/z\\.discriminatedUnion\\([^,]+,\\s*\\[([^\\]]+)\\]/);\n\t\t\tif (match) {\n\t\t\t\tconst refs = match[1].split(\",\").map(ref => ref.trim());\n\t\t\t\tfor (const ref of refs) {\n\t\t\t\t\t// Extract schema name from camelCase reference (e.g., \"carSchema\" -> \"Car\")\n\t\t\t\t\tconst depMatch = ref.match(/^([a-z][a-zA-Z0-9]*?)Schema$/);\n\t\t\t\t\tif (depMatch) {\n\t\t\t\t\t\t// Convert camelCase to PascalCase (carSchema -> Car)\n\t\t\t\t\t\tconst depName = depMatch[1].charAt(0).toUpperCase() + depMatch[1].slice(1);\n\t\t\t\t\t\tthis.schemaDependencies.get(name)?.add(depName);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.schemas.set(name, zodSchemaCode);\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// Merge path-level and operation-level parameters, resolving $refs\n\t\t\t\tconst allParams = mergeParameters(pathItem.parameters, operation.parameters, this.spec);\n\n\t\t\t\t// Filter for query parameters only\n\t\t\t\tconst queryParams = allParams.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 or path+method fallback\n\t\t\t\tlet pascalOperationId: string;\n\t\t\t\tif (operation.operationId) {\n\t\t\t\t\t// Use toPascalCase only for kebab-case IDs, simple capitalization for camelCase\n\t\t\t\t\tpascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback: generate name from path + method\n\t\t\t\t\t// Apply stripPathPrefix if configured (for consistency with Playwright service generator)\n\t\t\t\t\tconst strippedPath = stripPathPrefix(path, this.options.stripPathPrefix);\n\t\t\t\t\tpascalOperationId = this.generateMethodNameFromPath(method, strippedPath);\n\t\t\t\t}\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 - use operationId if available, otherwise use method + path\n\t\t\t\tconst jsdocOperationName = operation.operationId || `${method.toUpperCase()} ${path}`;\n\t\t\t\tconst jsdoc = `/**\\n * Query parameters for ${jsdocOperationName}\\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 a PascalCase method name from HTTP method and path\n\t * Used as fallback when operationId is not available\n\t * @internal\n\t */\n\tprivate generateMethodNameFromPath(method: string, path: string): string {\n\t\t// Convert path to PascalCase\n\t\t// e.g., GET /users/{userId}/posts -> GetUsersByUserIdPosts\n\t\t// e.g., GET /api/v0.1/users -> GetApiV01Users\n\t\tconst segments = path\n\t\t\t.split(\"/\")\n\t\t\t.filter(Boolean)\n\t\t\t.map(segment => {\n\t\t\t\tif (segment.startsWith(\"{\") && segment.endsWith(\"}\")) {\n\t\t\t\t\t// Path parameter - convert to \"ByParamName\"\n\t\t\t\t\tconst paramName = segment.slice(1, -1);\n\t\t\t\t\treturn `By${this.capitalizeSegment(paramName)}`;\n\t\t\t\t}\n\t\t\t\t// Regular segment - capitalize and handle special characters\n\t\t\t\treturn this.capitalizeSegment(segment);\n\t\t\t})\n\t\t\t.join(\"\");\n\n\t\t// Capitalize first letter of method\n\t\tconst capitalizedMethod = method.charAt(0).toUpperCase() + method.slice(1).toLowerCase();\n\t\treturn `${capitalizedMethod}${segments}`;\n\t}\n\n\t/**\n\t * Capitalizes a path segment, handling special characters like dashes, underscores, and dots\n\t * @internal\n\t */\n\tprivate capitalizeSegment(str: string): string {\n\t\t// Handle kebab-case, snake_case, and dots\n\t\tif (str.includes(\"-\") || str.includes(\"_\") || str.includes(\".\")) {\n\t\t\treturn str\n\t\t\t\t.split(/[-_.]/)\n\t\t\t\t.map(part => {\n\t\t\t\t\tif (!part) return \"\";\n\t\t\t\t\treturn part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();\n\t\t\t\t})\n\t\t\t\t.join(\"\");\n\t\t}\n\n\t\t// Regular word - just capitalize first letter\n\t\treturn str.charAt(0).toUpperCase() + str.slice(1);\n\t}\n\n\t/**\n\t * Check if a header should be ignored based on filter patterns\n\t * @internal\n\t */\n\tprivate shouldIgnoreHeader(headerName: string): boolean {\n\t\tconst ignorePatterns = this.options.ignoreHeaders;\n\t\tif (!ignorePatterns || ignorePatterns.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (ignorePatterns.includes(\"*\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst headerLower = headerName.toLowerCase();\n\n\t\treturn ignorePatterns.some((pattern: string) => {\n\t\t\tconst patternLower = pattern.toLowerCase();\n\t\t\treturn minimatch(headerLower, patternLower);\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// Merge path-level and operation-level parameters, resolving $refs\n\t\t\t\tconst allParams = mergeParameters(pathItem.parameters, operation.parameters, this.spec);\n\n\t\t\t\t// Filter for header parameters only, excluding ignored ones\n\t\t\t\tconst headerParams = allParams.filter(\n\t\t\t\t\t(param: any) =>\n\t\t\t\t\t\tparam && typeof param === \"object\" && param.in === \"header\" && !this.shouldIgnoreHeader(param.name)\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 or path+method fallback\n\t\t\t\tlet pascalOperationId: string;\n\t\t\t\tif (operation.operationId) {\n\t\t\t\t\tpascalOperationId = operation.operationId.includes(\"-\")\n\t\t\t\t\t\t? toPascalCase(operation.operationId)\n\t\t\t\t\t\t: operation.operationId.charAt(0).toUpperCase() + operation.operationId.slice(1);\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback: generate name from path + method\n\t\t\t\t\t// Apply stripPathPrefix if configured (for consistency with Playwright service generator)\n\t\t\t\t\tconst strippedPath = stripPathPrefix(path, this.options.stripPathPrefix);\n\t\t\t\t\tpascalOperationId = this.generateMethodNameFromPath(method, strippedPath);\n\t\t\t\t}\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 - use operationId if available, otherwise use method + path\n\t\t\t\tconst jsdocOperationName = operation.operationId || `${method.toUpperCase()} ${path}`;\n\t\t\t\tconst jsdoc = `/**\\n * Header parameters for ${jsdocOperationName}\\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\t// Apply stripSchemaPrefix to referenced schema names\n\t\t\tconst strippedRefName = stripPrefix(refName, this.options.stripSchemaPrefix);\n\t\t\tconst schemaName = toCamelCase(strippedRefName, { 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\t// Check if all values are booleans\n\t\t\tconst allBooleans = schema.enum.every((v: any) => typeof v === \"boolean\");\n\t\t\tif (allBooleans) {\n\t\t\t\treturn \"z.boolean()\";\n\t\t\t}\n\n\t\t\t// Check if all values are strings\n\t\t\tconst allStrings = schema.enum.every((v: any) => typeof v === \"string\");\n\t\t\tif (allStrings) {\n\t\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\t\treturn `z.enum([${enumValues}])`;\n\t\t\t}\n\n\t\t\t// For numeric or mixed enums, use z.union with z.literal\n\t\t\tconst literalValues = schema.enum\n\t\t\t\t.map((v: any) => {\n\t\t\t\t\tif (typeof v === \"string\") {\n\t\t\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `z.literal(${v})`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\treturn `z.union([${literalValues}])`;\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\t// Use Zod v4 top-level format validators for known formats\n\t\t\tconst formatMap: Record<string, string> = {\n\t\t\t\temail: \"z.email()\",\n\t\t\t\turi: \"z.url()\",\n\t\t\t\turl: \"z.url()\",\n\t\t\t\tuuid: \"z.uuid()\",\n\t\t\t};\n\n\t\t\t// Check if format has a dedicated Zod v4 validator\n\t\t\tif (schema.format && formatMap[schema.format]) {\n\t\t\t\tlet zodType = formatMap[schema.format];\n\t\t\t\t// Add string validations (these still work on format types)\n\t\t\t\tif (schema.minLength !== undefined) zodType = `${zodType}.min(${schema.minLength})`;\n\t\t\t\tif (schema.maxLength !== undefined) zodType = `${zodType}.max(${schema.maxLength})`;\n\t\t\t\tif (schema.pattern) zodType = `${zodType}.regex(/${schema.pattern}/)`;\n\t\t\t\treturn zodType;\n\t\t\t}\n\n\t\t\t// Fallback to z.string() for unknown formats or no format\n\t\t\tlet zodType = \"z.string()\";\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\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 * 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.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.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 schemas and types\n\t\tconst allNames = new Set([...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\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`// 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 * Sanitize a string by replacing invalid identifier characters with underscores\n * Preserves dots, hyphens, underscores, and spaces as word separators\n * Example: \"User@Domain\" -> \"User_Domain\"\n * Example: \"User-Data@2024\" -> \"User-Data_2024\"\n */\nfunction sanitizeIdentifier(str: string): string {\n\t// Replace all non-identifier chars (except dots, hyphens, underscores, spaces) with underscores\n\t// Valid identifier chars: letters, digits, underscore\n\t// Preserve: dots, hyphens, underscores, spaces as word separators\n\treturn str.replace(/[^a-zA-Z0-9._\\-\\s]+/g, \"_\");\n}\n\n/**\n * Convert schema name to camelCase with optional prefix/suffix\n * Handles dotted names like \"Company.Models.User\" -> \"companyModelsUser\"\n */\nexport function toCamelCase(str: string, options?: NamingOptions): string {\n\t// Sanitize invalid characters first\n\tconst sanitized = sanitizeIdentifier(str);\n\n\t// Split by dots, hyphens, underscores, and spaces to get words\n\tconst words = sanitized.split(/[.\\-_\\s]+/).filter(word => word.length > 0);\n\n\t// Convert to camelCase: first word lowercase, rest PascalCase\n\tlet name: string;\n\tif (words.length === 0) {\n\t\tname = str.charAt(0).toLowerCase() + str.slice(1);\n\t} else if (words.length === 1) {\n\t\tname = words[0].charAt(0).toLowerCase() + words[0].slice(1);\n\t} else {\n\t\tname =\n\t\t\twords[0].charAt(0).toLowerCase() +\n\t\t\twords[0].slice(1) +\n\t\t\twords\n\t\t\t\t.slice(1)\n\t\t\t\t.map(word => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t\t.join(\"\");\n\t}\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 * @shared Convert enum value to PascalCase and sanitize for TypeScript enum keys\n * @since 1.0.0\n * Utility used by core and playwright packages\n * Handles dotted names like \"Company.Models.User\" -> \"CompanyModelsUser\"\n */\nexport function toPascalCase(str: string | number): string {\n\tconst stringValue = String(str);\n\n\t// Check if it's already a valid PascalCase or camelCase identifier\n\t// (only contains letters, digits, and no special characters)\n\tconst isAlreadyValidCase = /^[a-zA-Z][a-zA-Z0-9]*$/.test(stringValue);\n\n\tif (isAlreadyValidCase) {\n\t\t// Just ensure it starts with uppercase\n\t\treturn stringValue.charAt(0).toUpperCase() + stringValue.slice(1);\n\t}\n\n\t// Sanitize invalid characters first\n\tconst sanitized = sanitizeIdentifier(stringValue);\n\n\t// Split by dots, hyphens, underscores, and spaces to get words\n\tconst words = sanitized.split(/[.\\-_\\s]+/).filter(word => word.length > 0);\n\n\t// Convert all words to PascalCase\n\tlet result: string;\n\tif (words.length === 0) {\n\t\tresult = \"Value\";\n\t} else {\n\t\tresult = words.map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(\"\");\n\t}\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\treturn \"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 interface EnumOpenApiGeneratorOptions extends NamingOptions {}\n\nexport interface EnumResult {\n\tschemaCode: string;\n\ttypeCode: string;\n}\n\n/**\n * Generate Zod enum schema\n * - String-only enums: z.enum()\n * - Numeric enums: z.union([z.literal(), ...])\n * - Boolean enums: z.boolean()\n * - Mixed enums: z.union([z.literal(), ...])\n */\nexport function generateEnum(\n\tname: string,\n\tvalues: (string | number | boolean)[],\n\toptions: EnumOpenApiGeneratorOptions\n): EnumResult {\n\tconst schemaName = `${toCamelCase(name, options)}Schema`;\n\tconst typeName = toPascalCase(name);\n\n\t// Check if all values are booleans\n\tconst allBooleans = values.every(v => typeof v === \"boolean\");\n\tif (allBooleans) {\n\t\t// For boolean enums, use z.boolean()\n\t\tconst schemaCode = `export const ${schemaName} = z.boolean();`;\n\t\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\t\treturn { schemaCode, typeCode };\n\t}\n\n\t// Check if all values are strings\n\tconst allStrings = values.every(v => typeof v === \"string\");\n\tif (allStrings) {\n\t\t// z.enum only accepts string values\n\t\tconst enumValues = values.map(v => `\"${v}\"`).join(\", \");\n\t\tconst schemaCode = `export const ${schemaName} = z.enum([${enumValues}]);`;\n\t\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\t\treturn { schemaCode, typeCode };\n\t}\n\n\t// For numeric or mixed enums, use z.union with z.literal\n\tconst literalValues = values\n\t\t.map(v => {\n\t\t\tif (typeof v === \"string\") {\n\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t}\n\t\t\treturn `z.literal(${v})`;\n\t\t})\n\t\t.join(\", \");\n\n\tconst schemaCode = `export const ${schemaName} = z.union([${literalValues}]);`;\n\tconst typeCode = `export type ${typeName} = z.infer<typeof ${schemaName}>;`;\n\n\treturn { 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 * Only escapes forward slashes which would terminate the regex literal\n */\nexport function escapePattern(str: string): string {\n\treturn str.replace(/\\//g, \"\\\\/\");\n}\n\n/**\n * @shared Escape JSDoc comment content to prevent injection\n * @since 1.0.0\n * Utility used by core and playwright packages\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 * @param schema - The OpenAPI schema to check\n * @param defaultNullable - Default nullable behavior when not explicitly specified (default: false)\n */\nexport function isNullable(schema: OpenAPISchema, defaultNullable = false): boolean {\n\t// OpenAPI 3.0 style: nullable explicitly set\n\tif (schema.nullable === true) {\n\t\treturn true;\n\t}\n\tif (schema.nullable === false) {\n\t\treturn false;\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\t// No explicit nullable annotation - use default\n\treturn defaultNullable;\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 * @shared Simple LRU Cache implementation for performance optimization\n * @since 1.0.0\n * Utility used by core and playwright packages\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 capacity(): number {\n\t\treturn this.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 { minimatch } from \"minimatch\";\n\n/**\n * Pattern matching utilities for prefix stripping\n *\n * Shared utility used by core and playwright packages\n *\n * Supports both literal string matching and glob patterns for stripping\n * prefixes from strings (paths, schema names, etc.)\n */\n\n/**\n * Validates if a glob pattern is syntactically valid\n * @param pattern - The glob pattern to validate\n * @returns true if valid, false otherwise\n */\nfunction isValidGlobPattern(pattern: string): boolean {\n\ttry {\n\t\t// Try to create a minimatch instance to validate the pattern\n\t\tnew minimatch.Minimatch(pattern);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Checks if a pattern contains glob special characters\n * @param pattern - The pattern to check\n * @returns true if pattern contains glob wildcards\n */\nfunction isGlobPattern(pattern: string): boolean {\n\treturn /[*?[\\]{}!]/.test(pattern);\n}\n\n/**\n * @shared Strips a prefix from a string using either literal string matching or glob patterns\n * @since 1.1.0\n * Shared utility used by core and playwright packages\n *\n * @param input - The full string to strip from\n * @param pattern - The glob pattern to strip\n * @param ensureLeadingChar - Optional character to ensure at start (e.g., \"/\" for paths)\n * @returns The string with prefix removed, or original string if no match\n *\n * @example\n * // Literal string matching\n * stripPrefix(\"/api/v1/users\", \"/api/v1\") // => \"/users\"\n * stripPrefix(\"Company.Models.User\", \"Company.Models.\") // => \"User\"\n *\n * @example\n * // Glob pattern matching\n * stripPrefix(\"/api/v1.0/users\", \"/api/v*\") // => matches and strips\n * stripPrefix(\"Company.Models.User\", \"*.Models.\") // => \"User\"\n * stripPrefix(\"api_v2_UserSchema\", \"api_v[0-9]_\") // => \"UserSchema\"\n */\nexport function stripPrefix(input: string, pattern: string | undefined, ensureLeadingChar?: string): string {\n\tif (!pattern) {\n\t\treturn input;\n\t}\n\n\t// Validate glob pattern if it contains special characters\n\tif (isGlobPattern(pattern) && !isValidGlobPattern(pattern)) {\n\t\tconsole.warn(`⚠️ Invalid glob pattern \"${pattern}\": Pattern is malformed`);\n\t\treturn input;\n\t}\n\n\t// Check if pattern contains glob wildcards\n\tif (isGlobPattern(pattern)) {\n\t\t// Use glob matching to find the prefix\n\t\t// We need to find what part of the input matches the pattern as a prefix\n\t\t// Try matching progressively longer prefixes to find the longest match\n\t\tlet longestMatch = -1;\n\n\t\tfor (let i = 1; i <= input.length; i++) {\n\t\t\tconst testPrefix = input.substring(0, i);\n\t\t\tif (minimatch(testPrefix, pattern)) {\n\t\t\t\t// Found a match - keep looking for a longer match\n\t\t\t\tlongestMatch = i;\n\t\t\t}\n\t\t}\n\n\t\tif (longestMatch > 0) {\n\t\t\t// Strip the longest matching prefix\n\t\t\tconst stripped = input.substring(longestMatch);\n\n\t\t\t// Ensure result starts with specified character if provided\n\t\t\tif (ensureLeadingChar) {\n\t\t\t\tif (stripped === \"\") {\n\t\t\t\t\treturn ensureLeadingChar;\n\t\t\t\t}\n\t\t\t\tif (!stripped.startsWith(ensureLeadingChar)) {\n\t\t\t\t\treturn `${ensureLeadingChar}${stripped}`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stripped === \"\" && !ensureLeadingChar ? input : stripped;\n\t\t}\n\n\t\t// No match found\n\t\treturn input;\n\t}\n\n\t// Literal string matching\n\tif (input.startsWith(pattern)) {\n\t\tconst stripped = input.substring(pattern.length);\n\n\t\t// Ensure result starts with specified character if provided\n\t\tif (ensureLeadingChar) {\n\t\t\tif (stripped === \"\") {\n\t\t\t\treturn ensureLeadingChar;\n\t\t\t}\n\t\t\tif (!stripped.startsWith(ensureLeadingChar)) {\n\t\t\t\treturn `${ensureLeadingChar}${stripped}`;\n\t\t\t}\n\t\t}\n\n\t\treturn stripped;\n\t}\n\n\t// No match - return original input\n\treturn input;\n}\n\n/**\n * @shared Strips a prefix from a path (ensures leading slash)\n * @since 1.1.0\n * Shared utility used by playwright package for path manipulation\n *\n * @param path - The full path to strip from\n * @param pattern - The glob pattern to strip\n * @returns The path with prefix removed, or original path if no match\n *\n * @example\n * stripPathPrefix(\"/api/v1/users\", \"/api/v1\") // => \"/users\"\n * stripPathPrefix(\"/api/v2/posts\", \"/api/v*\") // => \"/posts\"\n * stripPathPrefix(\"/api/v1.0/items\", \"/api/v[0-9].*\") // => \"/items\"\n */\nexport function stripPathPrefix(path: string, pattern: string | undefined): string {\n\tif (!pattern) {\n\t\treturn path;\n\t}\n\n\t// For literal string matching with paths, normalize the pattern\n\tif (!isGlobPattern(pattern)) {\n\t\tlet normalizedPattern = pattern.trim();\n\t\tif (!normalizedPattern.startsWith(\"/\")) {\n\t\t\tnormalizedPattern = `/${normalizedPattern}`;\n\t\t}\n\t\tif (normalizedPattern.endsWith(\"/\") && normalizedPattern !== \"/\") {\n\t\t\tnormalizedPattern = normalizedPattern.slice(0, -1);\n\t\t}\n\n\t\treturn stripPrefix(path, normalizedPattern, \"/\");\n\t}\n\n\t// For glob patterns, use as-is\n\treturn stripPrefix(path, pattern, \"/\");\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\t/**\n\t * Generate inline object shape for use with .extend()\n\t * Returns just the shape object literal: { prop1: z.string(), prop2: z.number() }\n\t * This avoids the .nullable().shape bug when inline objects have nullable: true\n\t */\n\tgenerateInlineObjectShape?: (schema: OpenAPISchema, currentSchema?: string) => string;\n\tresolveDiscriminatorMapping?: (mapping: Record<string, string>, schemas: OpenAPISchema[]) => OpenAPISchema[];\n\tresolveSchemaRef?: (ref: string) => OpenAPISchema | undefined;\n}\n\nexport interface UnionOptions {\n\tpassthrough?: boolean;\n\tdiscriminatorMapping?: Record<string, string>;\n}\n\n/**\n * Check if discriminator property is required in all schemas\n */\nfunction isDiscriminatorRequired(\n\tschemas: OpenAPISchema[],\n\tdiscriminator: string,\n\tcontext: CompositionValidatorContext\n): { valid: boolean; invalidSchemas: string[] } {\n\tconst invalidSchemas: string[] = [];\n\n\tfor (const schema of schemas) {\n\t\tconst resolved = resolveSchema(schema, context);\n\t\tconst required = resolved.required || [];\n\n\t\tif (!required.includes(discriminator)) {\n\t\t\tconst schemaName = schema.$ref ? schema.$ref.split(\"/\").pop() || \"inline\" : \"inline\";\n\t\t\tinvalidSchemas.push(schemaName);\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: invalidSchemas.length === 0,\n\t\tinvalidSchemas,\n\t};\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\t// Handle empty oneOf/anyOf - malformed spec, warn and return z.never()\n\tif (schemas.length === 0) {\n\t\tconsole.warn(\n\t\t\t\"[openapi-to-zod] Warning: Empty oneOf/anyOf array encountered. This is likely a malformed OpenAPI spec. Generating z.never() as fallback.\"\n\t\t);\n\t\treturn wrapNullable(\n\t\t\t'z.never().describe(\"Empty oneOf/anyOf in OpenAPI spec - no valid schema defined\")',\n\t\t\tisNullable\n\t\t);\n\t}\n\n\t// Simplify single-item oneOf/anyOf - no union needed\n\tif (schemas.length === 1) {\n\t\tlet singleSchema = context.generatePropertySchema(schemas[0], currentSchema);\n\t\tif (options?.passthrough && !singleSchema.includes(\".catchall(\")) {\n\t\t\tsingleSchema = `${singleSchema}.catchall(z.unknown())`;\n\t\t}\n\t\treturn wrapNullable(singleSchema, isNullable);\n\t}\n\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// Check if discriminator is required in all schemas\n\t\tconst discriminatorCheck = isDiscriminatorRequired(resolvedSchemas, discriminator, context);\n\n\t\tif (!discriminatorCheck.valid) {\n\t\t\t// Discriminator is not required in all schemas - fallback to z.union()\n\t\t\tconsole.warn(\n\t\t\t\t`[openapi-to-zod] Warning: Discriminator \"${discriminator}\" is not required in schemas: ${discriminatorCheck.invalidSchemas.join(\", \")}. ` +\n\t\t\t\t\t\"Falling back to z.union() instead of z.discriminatedUnion().\"\n\t\t\t);\n\n\t\t\tlet schemaStrings = resolvedSchemas.map(s => context.generatePropertySchema(s, currentSchema));\n\t\t\tif (options?.passthrough) {\n\t\t\t\tschemaStrings = schemaStrings.map(s => (s.includes(\".catchall(\") ? s : `${s}.catchall(z.unknown())`));\n\t\t\t}\n\n\t\t\tconst fallbackDescription = `Discriminator \"${discriminator}\" is optional in some schemas (${discriminatorCheck.invalidSchemas.join(\", \")}), using z.union() instead of z.discriminatedUnion()`;\n\t\t\tconst union = `z.union([${schemaStrings.join(\", \")}]).describe(\"${fallbackDescription}\")`;\n\t\t\treturn wrapNullable(union, isNullable);\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 * Helper to resolve schema (follows $ref if needed)\n */\nfunction resolveSchema(schema: OpenAPISchema, context: CompositionValidatorContext): OpenAPISchema {\n\tif (schema.$ref && context.resolveSchemaRef) {\n\t\tconst resolved = context.resolveSchemaRef(schema.$ref);\n\t\tif (resolved) {\n\t\t\treturn resolved;\n\t\t}\n\t}\n\treturn schema;\n}\n\n/**\n * Collect properties from a schema (including nested allOf)\n */\nfunction collectProperties(\n\tschema: OpenAPISchema,\n\tcontext: CompositionValidatorContext\n): Map<string, { schema: OpenAPISchema; source: string }> {\n\tconst resolved = resolveSchema(schema, context);\n\tconst props = new Map<string, { schema: OpenAPISchema; source: string }>();\n\n\t// Get source name for error messages\n\tconst sourceName = schema.$ref ? schema.$ref.split(\"/\").pop() || \"unknown\" : \"inline\";\n\n\t// Collect direct properties\n\tif (resolved.properties) {\n\t\tfor (const [key, value] of Object.entries(resolved.properties)) {\n\t\t\tprops.set(key, { schema: value, source: sourceName });\n\t\t}\n\t}\n\n\t// Recursively collect from nested allOf\n\tif (resolved.allOf) {\n\t\tfor (const subSchema of resolved.allOf) {\n\t\t\tconst subProps = collectProperties(subSchema, context);\n\t\t\tfor (const [key, value] of subProps) {\n\t\t\t\tif (!props.has(key)) {\n\t\t\t\t\tprops.set(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\n/**\n * Check if two schemas are semantically equivalent\n */\nfunction schemasMatch(a: OpenAPISchema, b: OpenAPISchema): boolean {\n\t// Simple deep comparison for common cases\n\treturn JSON.stringify(a) === JSON.stringify(b);\n}\n\n/**\n * Detect conflicting properties across allOf schemas\n */\nfunction detectConflictingProperties(schemas: OpenAPISchema[], context: CompositionValidatorContext): string[] {\n\tconst conflicts: string[] = [];\n\tconst propertyMap = new Map<string, { schema: OpenAPISchema; source: string }>();\n\n\tfor (const schema of schemas) {\n\t\tconst schemaProps = collectProperties(schema, context);\n\n\t\tfor (const [propName, propInfo] of schemaProps) {\n\t\t\tconst existing = propertyMap.get(propName);\n\t\t\tif (existing) {\n\t\t\t\t// Check if the definitions match\n\t\t\t\tif (!schemasMatch(existing.schema, propInfo.schema)) {\n\t\t\t\t\tconflicts.push(\n\t\t\t\t\t\t`Property \"${propName}\" has conflicting definitions in ${existing.source} and ${propInfo.source}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpropertyMap.set(propName, propInfo);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn conflicts;\n}\n\n/**\n * Generate allOf validation\n *\n * Key fix: For inline objects in allOf, we generate the shape directly as an object literal\n * (e.g., { prop: z.string() }) instead of using z.object({...}).shape.\n * This avoids the invalid .nullable().shape pattern that occurs when inline objects\n * have nullable: true set.\n *\n * According to Zod docs (https://zod.dev/api?id=extend):\n * - .extend() accepts an object of shape definitions OR another schema's .shape\n * - For $refs: use baseSchema.extend(otherSchema.shape)\n * - For inline objects: use baseSchema.extend({ prop: z.string() })\n * - .nullable() must be applied AFTER all .extend() calls\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// Detect conflicting properties and warn\n\tconst conflicts = detectConflictingProperties(schemas, context);\n\tlet conflictDescription = \"\";\n\tif (conflicts.length > 0) {\n\t\tfor (const conflict of conflicts) {\n\t\t\tconsole.warn(`[openapi-to-zod] Warning: allOf composition conflict - ${conflict}`);\n\t\t}\n\t\tconflictDescription = `allOf property conflicts detected: ${conflicts.join(\"; \")}`;\n\t}\n\n\t// Check if all schemas are objects (for .extend() support)\n\tconst allObjects = schemas.every(s => s.type === \"object\" || s.properties || s.$ref || s.allOf);\n\n\tlet result: string;\n\tif (allObjects) {\n\t\t// Use .extend() for object schemas (Zod v4 compliant - .merge() is deprecated)\n\t\t// First schema is the base - generate it normally\n\t\tlet merged = context.generatePropertySchema(schemas[0], currentSchema, false);\n\n\t\t// For subsequent schemas, determine how to extend\n\t\tfor (let i = 1; i < schemas.length; i++) {\n\t\t\tconst schema = schemas[i];\n\n\t\t\tif (schema.$ref) {\n\t\t\t\t// For $ref schemas, use .extend(refSchema.shape)\n\t\t\t\t// The ref generates a schema variable name like \"userSchema\"\n\t\t\t\tconst refSchema = context.generatePropertySchema(schema, currentSchema, false);\n\t\t\t\tmerged = `${merged}.extend(${refSchema}.shape)`;\n\t\t\t} else if (context.generateInlineObjectShape && (schema.properties || schema.type === \"object\")) {\n\t\t\t\t// For inline objects, generate shape directly as object literal\n\t\t\t\t// This avoids the .nullable().shape bug - we pass { prop: z.string() }\n\t\t\t\t// directly to .extend() instead of z.object({...}).nullable().shape\n\t\t\t\tconst inlineShape = context.generateInlineObjectShape(schema, currentSchema);\n\t\t\t\tmerged = `${merged}.extend(${inlineShape})`;\n\t\t\t} else {\n\t\t\t\t// Fallback for schemas without properties (e.g., just has allOf)\n\t\t\t\t// Generate full schema and use .shape\n\t\t\t\tconst schemaString = context.generatePropertySchema(schema, currentSchema, false);\n\t\t\t\tmerged = `${merged}.extend(${schemaString}.shape)`;\n\t\t\t}\n\t\t}\n\t\tresult = merged;\n\t} else {\n\t\t// Use .and() for non-object schemas (intersection)\n\t\tconst schemaStrings = schemas.map(s => context.generatePropertySchema(s, currentSchema, false));\n\t\tlet merged = schemaStrings[0];\n\t\tfor (let i = 1; i < schemaStrings.length; i++) {\n\t\t\tmerged = `${merged}.and(${schemaStrings[i]})`;\n\t\t}\n\t\tresult = merged;\n\t}\n\n\t// Add description about conflicts if any\n\tif (conflictDescription) {\n\t\tresult = `${result}.describe(\"${conflictDescription}\")`;\n\t}\n\n\t// Apply nullable at the END, after all .extend() calls\n\t// This is critical - .nullable() must come after .extend(), not before\n\treturn wrapNullable(result, 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\";\n\n/**\n * Generate property access expression (use dot notation for valid identifiers, bracket notation otherwise)\n */\nfunction generatePropertyAccess(propName: string): string {\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) ? `obj.${propName}` : `obj[\"${propName}\"]`;\n}\n\n/**\n * Generate validation for dependencies (OpenAPI 3.0)\n * Generates detailed error messages showing which specific fields are missing\n */\nexport function generateDependencies(\n\tschema: OpenAPISchema,\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\n\tcurrentSchema?: string\n): string {\n\tif (!schema.dependencies) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\n\t\tif (Array.isArray(dependency)) {\n\t\t\t// Skip empty dependency arrays (no dependencies to enforce)\n\t\t\tif (dependency.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Property dependency - show specific missing properties in error message\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tconst checkLogic = dependency\n\t\t\t\t.map(p => {\n\t\t\t\t\tconst pAccess = generatePropertyAccess(p);\n\t\t\t\t\treturn `if (${pAccess} === undefined) missing.push('${p}');`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\t\\t\");\n\n\t\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\t\tif (${propAccess} === undefined) return;\n\t\t\t\tconst missing: string[] = [];\n\t\t\t\t${checkLogic}\n\t\t\t\tif (missing.length > 0) {\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})`;\n\t\t} else if (generatePropertySchema) {\n\t\t\t// Schema dependency - show detailed validation errors\n\t\t\tconst depSchema: OpenAPISchema = { ...dependency, type: dependency.type || \"object\" };\n\t\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\n\t\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\t\tif (${propAccess} === undefined) return;\n\t\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\n\t\t\t\tif (!validation.success) {\n\t\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: \\`When '${prop}' is present, object must satisfy additional constraints:\\\\n\\${errors}\\`,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})`;\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Generate condition check for if/then/else\n */\nexport function generateConditionalCheck(schema: OpenAPISchema): string {\n\tconst conditions: string[] = [];\n\n\t// Check properties\n\tif (schema.properties) {\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tif (propSchema.type) {\n\t\t\t\tconditions.push(`typeof ${propAccess} === \"${propSchema.type}\"`);\n\t\t\t}\n\t\t\tif (propSchema.const !== undefined) {\n\t\t\t\tconst value = typeof propSchema.const === \"string\" ? `\"${propSchema.const}\"` : propSchema.const;\n\t\t\t\tconditions.push(`${propAccess} === ${value}`);\n\t\t\t}\n\t\t\tif (propSchema.minimum !== undefined) {\n\t\t\t\tconditions.push(`${propAccess} >= ${propSchema.minimum}`);\n\t\t\t}\n\t\t\tif (propSchema.maximum !== undefined) {\n\t\t\t\tconditions.push(`${propAccess} <= ${propSchema.maximum}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check required properties\n\tif (schema.required) {\n\t\tfor (const prop of schema.required) {\n\t\t\tconditions.push(`${generatePropertyAccess(prop)} !== undefined`);\n\t\t}\n\t}\n\n\treturn conditions.length > 0 ? conditions.join(\" && \") : \"true\";\n}\n\n/**\n * Generate validation for then/else clauses\n */\nexport function generateConditionalValidation(schema: OpenAPISchema): string {\n\tconst checks: string[] = [];\n\n\t// Check required properties\n\tif (schema.required) {\n\t\tfor (const prop of schema.required) {\n\t\t\tchecks.push(`${generatePropertyAccess(prop)} !== undefined`);\n\t\t}\n\t}\n\n\t// Check properties constraints\n\tif (schema.properties) {\n\t\tfor (const [prop, propSchema] of Object.entries(schema.properties)) {\n\t\t\tconst propAccess = generatePropertyAccess(prop);\n\t\t\tif (propSchema.minimum !== undefined) {\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} >= ${propSchema.minimum}`);\n\t\t\t}\n\t\t\tif (propSchema.maximum !== undefined) {\n\t\t\t\tchecks.push(`${propAccess} === undefined || ${propAccess} <= ${propSchema.maximum}`);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn checks.length > 0 ? checks.join(\" && \") : \"true\";\n}\n\n/**\n * Generate if/then/else conditional validation with better error messages\n * Uses superRefine with detailed error messages for complex cases\n */\nexport function generateIfThenElse(schema: OpenAPISchema): string {\n\tif (!schema.if || (!schema.then && !schema.else)) {\n\t\treturn \"\";\n\t}\n\n\tconst ifCondition = generateConditionalCheck(schema.if);\n\n\tif (schema.then && schema.else) {\n\t\t// Both then and else - provide detailed error messages\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\n\t\tconst elseValidation = generateConditionalValidation(schema.else);\n\n\t\t// Try to detect which specific validations failed\n\t\tconst thenRequiredProps = schema.then.required || [];\n\t\tconst elseRequiredProps = schema.else.required || [];\n\n\t\treturn `.superRefine((obj, ctx) => {\n\t\t\tconst ifConditionMet = ${ifCondition};\n\t\t\tif (ifConditionMet) {\n\t\t\t\t// Then branch\n\t\t\t\tconst thenValid = ${thenValidation};\n\t\t\t\tif (!thenValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\tthenRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingThenProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingThenProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingThenProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Else branch\n\t\t\t\tconst elseValid = ${elseValidation};\n\t\t\t\tif (!elseValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\telseRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingElseProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingElseProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingElseProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\tif (schema.then) {\n\t\t// Only then - provide detailed error message\n\t\tconst thenValidation = generateConditionalValidation(schema.then);\n\t\tconst thenRequiredProps = schema.then.required || [];\n\n\t\treturn `.superRefine((obj, ctx) => {\n\t\t\tconst ifConditionMet = ${ifCondition};\n\t\t\tif (ifConditionMet) {\n\t\t\t\tconst thenValid = ${thenValidation};\n\t\t\t\tif (!thenValid) {\n\t\t\t\t\t${\n\t\t\t\t\t\tthenRequiredProps.length > 0\n\t\t\t\t\t\t\t? `\n\t\t\t\t\tconst missingProps = ${JSON.stringify(thenRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\t\tconst message = missingProps.length > 0 \n\t\t\t\t\t\t? \\`When condition is met, required properties are missing: \\${missingProps.join(', ')}\\`\n\t\t\t\t\t\t: \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: `\n\t\t\t\t\tconst message = \"When condition is met, validation constraints failed\";\n\t\t\t\t\t`\n\t\t\t\t\t}\n\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\tpath: []\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})`;\n\t}\n\n\t// Only else - provide detailed error message\n\tif (!schema.else) return \"\";\n\tconst elseValidation = generateConditionalValidation(schema.else);\n\tconst elseRequiredProps = schema.else.required || [];\n\n\treturn `.superRefine((obj, ctx) => {\n\t\tconst ifConditionMet = ${ifCondition};\n\t\tif (!ifConditionMet) {\n\t\t\tconst elseValid = ${elseValidation};\n\t\t\tif (!elseValid) {\n\t\t\t\t${\n\t\t\t\t\telseRequiredProps.length > 0\n\t\t\t\t\t\t? `\n\t\t\t\tconst missingProps = ${JSON.stringify(elseRequiredProps)}.filter(p => obj[p] === undefined);\n\t\t\t\tconst message = missingProps.length > 0 \n\t\t\t\t\t? \\`When condition is not met, required properties are missing: \\${missingProps.join(', ')}\\`\n\t\t\t\t\t: \"When condition is not met, validation constraints failed\";\n\t\t\t\t`\n\t\t\t\t\t\t: `\n\t\t\t\tconst message = \"When condition is not met, validation constraints failed\";\n\t\t\t\t`\n\t\t\t\t}\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: message,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t})`;\n}\n\n/**\n * Generate dependent required validation (OpenAPI 3.1)\n * Generates detailed error messages showing which specific fields are missing\n */\nexport function generateDependentRequired(schema: OpenAPISchema): string {\n\tif (!schema.dependentRequired) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, requiredProps] of Object.entries(schema.dependentRequired)) {\n\t\t// Skip empty required arrays (no dependencies to enforce)\n\t\tif (requiredProps.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst propAccess = generatePropertyAccess(prop);\n\t\tconst checkLogic = requiredProps\n\t\t\t.map(rp => {\n\t\t\t\tconst rpAccess = generatePropertyAccess(rp);\n\t\t\t\treturn `if (${rpAccess} === undefined) missing.push('${rp}');`;\n\t\t\t})\n\t\t\t.join(\"\\n\\t\\t\");\n\n\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\tif (${propAccess} === undefined) return;\n\t\t\tconst missing: string[] = [];\n\t\t\t${checkLogic}\n\t\t\tif (missing.length > 0) {\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: \\`When '${prop}' is present, the following properties are required: \\${missing.join(', ')}\\`,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t})`;\n\t}\n\n\treturn result;\n}\n\n/**\n * Generate dependent schemas validation (JSON Schema 2019-09 / OpenAPI 3.1)\n * This is the modern replacement for schema-based dependencies\n * Generates detailed error messages showing validation failures\n */\nexport function generateDependentSchemas(\n\tschema: OpenAPISchema & { dependentSchemas?: Record<string, OpenAPISchema> },\n\tgeneratePropertySchema?: (schema: OpenAPISchema, currentSchema?: string) => string,\n\tcurrentSchema?: string\n): string {\n\tif (!schema.dependentSchemas || !generatePropertySchema) {\n\t\treturn \"\";\n\t}\n\n\tlet result = \"\";\n\tfor (const [prop, depSchema] of Object.entries(schema.dependentSchemas)) {\n\t\tconst depSchemaValidation = generatePropertySchema(depSchema, currentSchema);\n\t\tconst propAccess = generatePropertyAccess(prop);\n\n\t\tresult += `.superRefine((obj, ctx) => {\n\t\t\tif (${propAccess} === undefined) return;\n\t\t\tconst validation = ${depSchemaValidation}.safeParse(obj);\n\t\t\tif (!validation.success) {\n\t\t\t\tconst errors = validation.error.issues.map(i => \\` - \\${i.path.join('.')}: \\${i.message}\\`).join('\\\\n');\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\tmessage: \\`When '${prop}' is present, dependent schema validation failed:\\\\n\\${errors}\\`,\n\t\t\t\t\tpath: []\n\t\t\t\t});\n\t\t\t}\n\t\t})`;\n\t}\n\treturn result;\n}\n\n/**\n * Validate dependency graph for circular dependencies\n * Returns validation result with any detected circular dependency errors\n */\nexport function validateDependencyGraph(\n\tschema: OpenAPISchema,\n\tschemaName: string\n): { valid: boolean; errors: string[] } {\n\tconst errors: string[] = [];\n\n\tif (!schema.dependencies && !schema.dependentRequired) {\n\t\treturn { valid: true, errors: [] };\n\t}\n\n\t// Build dependency graph\n\tconst graph = new Map<string, Set<string>>();\n\n\t// Add dependentRequired edges\n\tif (schema.dependentRequired) {\n\t\tfor (const [prop, deps] of Object.entries(schema.dependentRequired)) {\n\t\t\tif (!graph.has(prop)) {\n\t\t\t\tgraph.set(prop, new Set());\n\t\t\t}\n\t\t\tconst propDeps = graph.get(prop);\n\t\t\tif (propDeps) {\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tpropDeps.add(dep);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add dependencies (array type) edges\n\tif (schema.dependencies) {\n\t\tfor (const [prop, dep] of Object.entries(schema.dependencies)) {\n\t\t\tif (Array.isArray(dep)) {\n\t\t\t\tif (!graph.has(prop)) {\n\t\t\t\t\tgraph.set(prop, new Set());\n\t\t\t\t}\n\t\t\t\tconst propDeps = graph.get(prop);\n\t\t\t\tif (propDeps) {\n\t\t\t\t\tfor (const d of dep) {\n\t\t\t\t\t\tpropDeps.add(d);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Detect cycles using DFS\n\tconst visited = new Set<string>();\n\tconst recStack = new Set<string>();\n\tconst path: string[] = [];\n\n\tfunction detectCycle(prop: string): boolean {\n\t\tvisited.add(prop);\n\t\trecStack.add(prop);\n\t\tpath.push(prop);\n\n\t\tconst deps = graph.get(prop) || new Set();\n\t\tfor (const dep of deps) {\n\t\t\tif (!visited.has(dep)) {\n\t\t\t\tif (detectCycle(dep)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (recStack.has(dep)) {\n\t\t\t\t// Cycle detected\n\t\t\t\tconst cycleStart = path.indexOf(dep);\n\t\t\t\tconst cycle = [...path.slice(cycleStart), dep];\n\t\t\t\terrors.push(`Circular dependency detected in schema '${schemaName}': ${cycle.join(\" -> \")}`);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\trecStack.delete(prop);\n\t\tpath.pop();\n\t\treturn false;\n\t}\n\n\t// Check all roots\n\tfor (const prop of graph.keys()) {\n\t\tif (!visited.has(prop)) {\n\t\t\tdetectCycle(prop);\n\t\t}\n\t}\n\n\treturn { valid: errors.length === 0, errors };\n}\n\n/**\n * Extract schema dependencies as reusable schemas\n * Useful for code generation and schema reuse\n */\nexport function extractSchemaDependencies(schema: OpenAPISchema, schemaName: string): Map<string, OpenAPISchema> {\n\tconst extracted = new Map<string, OpenAPISchema>();\n\n\tif (!schema.dependencies) {\n\t\treturn extracted;\n\t}\n\n\tfor (const [prop, dependency] of Object.entries(schema.dependencies)) {\n\t\tif (!Array.isArray(dependency)) {\n\t\t\t// This is a schema dependency\n\t\t\tconst depSchemaName = `${schemaName}_${prop}_Dependency`;\n\t\t\tconst depSchema: OpenAPISchema = {\n\t\t\t\t...dependency,\n\t\t\t\ttype: dependency.type || \"object\",\n\t\t\t};\n\t\t\textracted.set(depSchemaName, depSchema);\n\t\t}\n\t}\n\n\treturn extracted;\n}\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 configurable size limit\n// Cache is shared across all generators for performance, but size can be configured per generator\nlet PATTERN_CACHE = new LRUCache<string, string>(1000);\n\n/**\n * Configure the pattern cache size\n * Should be called before generating schemas for large specifications\n */\nexport function configurePatternCache(size: number): void {\n\tif (size > 0 && size !== PATTERN_CACHE.capacity) {\n\t\tPATTERN_CACHE = new LRUCache<string, string>(size);\n\t}\n}\n\n// Default format map (without date-time, which can be customized)\nconst DEFAULT_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\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// Mutable format map that includes date-time and can be configured\nlet FORMAT_MAP: Record<string, string> = {\n\t...DEFAULT_FORMAT_MAP,\n\t\"date-time\": \"z.iso.datetime()\",\n};\n\n/**\n * Configure custom date-time format validation\n * Overrides the default z.iso.datetime() with a custom regex pattern\n *\n * @param pattern - Regex pattern (string or RegExp) for date-time validation\n * @throws {Error} If the provided pattern is not a valid regular expression\n * @example\n * // String pattern (required for JSON/YAML configs)\n * configureDateTimeFormat('^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}$')\n *\n * @example\n * // RegExp literal (TypeScript configs only)\n * configureDateTimeFormat(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/)\n */\nexport function configureDateTimeFormat(pattern?: string | RegExp): void {\n\tif (!pattern) {\n\t\t// Reset to default\n\t\tFORMAT_MAP[\"date-time\"] = \"z.iso.datetime()\";\n\t\treturn;\n\t}\n\n\t// Convert RegExp to string if needed\n\tconst patternStr = pattern instanceof RegExp ? pattern.source : pattern;\n\n\t// Empty string resets to default\n\tif (patternStr === \"\") {\n\t\tFORMAT_MAP[\"date-time\"] = \"z.iso.datetime()\";\n\t\treturn;\n\t}\n\n\t// Validate the regex pattern\n\ttry {\n\t\tnew RegExp(patternStr);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Invalid regular expression pattern for customDateTimeFormatRegex: ${patternStr}. ${\n\t\t\t\terror instanceof Error ? error.message : \"Pattern is malformed\"\n\t\t\t}`\n\t\t);\n\t}\n\n\t// Escape the pattern for use in generated code\n\tconst escapedPattern = escapePattern(patternStr);\n\n\t// Update the format map with the custom regex\n\tFORMAT_MAP[\"date-time\"] = `z.string().regex(/${escapedPattern}/)`;\n}\n\n/**\n * Reset format map to defaults (useful for testing)\n */\nexport function resetFormatMap(): void {\n\tFORMAT_MAP = {\n\t\t...DEFAULT_FORMAT_MAP,\n\t\t\"date-time\": \"z.iso.datetime()\",\n\t};\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 { OpenAPISchema, OpenAPISpec } from \"../types\";\nimport { LRUCache } from \"../utils/lru-cache\";\nimport type { NamingOptions } from \"../utils/name-utils\";\nimport { resolveRef, toCamelCase } from \"../utils/name-utils\";\nimport { stripPrefix } from \"../utils/pattern-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\tnamingOptions: NamingOptions;\n\tstripSchemaPrefix?: string;\n\t/**\n\t * Default nullable behavior when not explicitly specified\n\t * @default false\n\t */\n\tdefaultNullable: boolean;\n\t/**\n\t * Behavior for empty object schemas (objects with no properties defined)\n\t * @default 'loose'\n\t */\n\temptyObjectBehavior: \"strict\" | \"loose\" | \"record\";\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 $ref string to the actual schema\n\t */\n\tprivate resolveSchemaRef(ref: string): OpenAPISchema | undefined {\n\t\tconst schemaName = ref.split(\"/\").pop();\n\t\tif (!schemaName) return undefined;\n\t\treturn this.context.spec.components?.schemas?.[schemaName];\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 extend(), 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(\".extend(\")) {\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\t// Determine if defaultNullable should apply to this schema.\n\t\t// defaultNullable should ONLY apply to primitive property values within objects, NOT to:\n\t\t// 1. Top-level schema definitions (isTopLevel = true)\n\t\t// 2. Schema references ($ref) - nullability must be explicitly specified on the reference\n\t\t// 3. Enum values - enums define discrete values and shouldn't be nullable by default\n\t\t// 4. Const/literal values - these are exact values and shouldn't be nullable by default\n\t\t//\n\t\t// For $ref: The referenced schema controls its own structure. If you want\n\t\t// a nullable reference, you must explicitly add `nullable: true` to the\n\t\t// schema containing the $ref.\n\t\tconst isSchemaRef = !!schema.$ref;\n\t\tconst isEnum = !!schema.enum;\n\t\tconst isConst = schema.const !== undefined;\n\t\tconst shouldApplyDefaultNullable = !isTopLevel && !isSchemaRef && !isEnum && !isConst;\n\t\tconst effectiveDefaultNullable = shouldApplyDefaultNullable ? this.context.defaultNullable : false;\n\t\tconst nullable = isNullable(schema, effectiveDefaultNullable);\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\t// Apply stripSchemaPrefix to get consistent schema names\n\t\t\tconst strippedRefName = stripPrefix(resolvedRefName, this.context.stripSchemaPrefix);\n\t\t\tconst schemaName = `${toCamelCase(strippedRefName, this.context.namingOptions)}Schema`; // Check for direct self-reference or circular dependency through alias\n\t\t\tif (currentSchema && (refName === 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\t// Check if all values are booleans\n\t\t\tconst allBooleans = schema.enum.every(v => typeof v === \"boolean\");\n\t\t\tif (allBooleans) {\n\t\t\t\tconst zodBoolean = \"z.boolean()\";\n\t\t\t\treturn wrapNullable(zodBoolean, nullable);\n\t\t\t}\n\n\t\t\t// Check if all values are strings\n\t\t\tconst allStrings = schema.enum.every(v => typeof v === \"string\");\n\t\t\tif (allStrings) {\n\t\t\t\tconst enumValues = schema.enum.map(v => `\"${v}\"`).join(\", \");\n\t\t\t\tconst zodEnum = `z.enum([${enumValues}])`;\n\t\t\t\treturn wrapNullable(zodEnum, nullable);\n\t\t\t}\n\n\t\t\t// For numeric or mixed enums, use z.union with z.literal\n\t\t\tconst literalValues = schema.enum\n\t\t\t\t.map(v => {\n\t\t\t\t\tif (typeof v === \"string\") {\n\t\t\t\t\t\treturn `z.literal(\"${v}\")`;\n\t\t\t\t\t}\n\t\t\t\t\treturn `z.literal(${v})`;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t\tconst zodUnion = `z.union([${literalValues}])`;\n\t\t\treturn wrapNullable(zodUnion, 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{\n\t\t\t\t\tgeneratePropertySchema: this.generatePropertySchema.bind(this),\n\t\t\t\t\tgenerateInlineObjectShape: this.generateInlineObjectShape.bind(this),\n\t\t\t\t\tresolveSchemaRef: this.resolveSchemaRef.bind(this),\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 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\tresolveSchemaRef: this.resolveSchemaRef.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\tresolveSchemaRef: this.resolveSchemaRef.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\t// Empty object schema - behavior controlled by emptyObjectBehavior option\n\t\t\t\t\tswitch (this.context.emptyObjectBehavior) {\n\t\t\t\t\t\tcase \"strict\":\n\t\t\t\t\t\t\tvalidation = \"z.strictObject({})\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"loose\":\n\t\t\t\t\t\t\tvalidation = \"z.looseObject({})\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tvalidation = \"z.record(z.string(), z.unknown())\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\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\t/**\n\t * Generate inline object shape for use with .extend()\n\t * Returns just the shape object literal: { prop1: z.string(), prop2: z.number() }\n\t *\n\t * This method is specifically for allOf compositions where we need to pass\n\t * the shape directly to .extend() instead of using z.object({...}).shape.\n\t * This avoids the .nullable().shape bug when inline objects have nullable: true.\n\t *\n\t * According to Zod docs (https://zod.dev/api?id=extend):\n\t * - .extend() accepts an object of shape definitions\n\t * - e.g., baseSchema.extend({ prop: z.string() })\n\t */\n\tgenerateInlineObjectShape(schema: OpenAPISchema, currentSchema?: string): string {\n\t\tconst required = new Set(schema.required || []);\n\t\tconst properties: string[] = [];\n\n\t\tif (schema.properties) {\n\t\t\tfor (const [propName, propSchema] of Object.entries(schema.properties)) {\n\t\t\t\t// Skip properties based on readOnly/writeOnly\n\t\t\t\tif (!this.shouldIncludeProperty(propSchema)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst isRequired = required.has(propName);\n\t\t\t\tconst zodSchema = this.generatePropertySchema(propSchema, currentSchema);\n\n\t\t\t\t// Quote property name if it contains special characters\n\t\t\t\tconst validIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\t\t\t\tconst quotedPropName = validIdentifier.test(propName) ? propName : `\"${propName}\"`;\n\n\t\t\t\tlet propertyDef = `${quotedPropName}: ${zodSchema}`;\n\t\t\t\tif (!isRequired) {\n\t\t\t\t\tpropertyDef += \".optional()\";\n\t\t\t\t}\n\n\t\t\t\tproperties.push(propertyDef);\n\t\t\t}\n\t\t}\n\n\t\t// Return the shape as an object literal\n\t\tif (properties.length === 0) {\n\t\t\treturn \"{}\";\n\t\t}\n\n\t\treturn `{\\n${properties.map(p => `\\t${p}`).join(\",\\n\")}\\n}`;\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 * OpenAPI $ref resolution utilities\n *\n * Provides functions to resolve $ref references to component definitions\n * Supports: parameters, requestBodies, responses, schemas\n *\n * @internal Used by core and playwright packages\n */\n\nimport type { OpenAPIParameter, OpenAPIRequestBody, OpenAPIResponse, OpenAPISchema, OpenAPISpec } from \"../types\";\n\n/**\n * Type for any resolvable component\n */\ntype ResolvableComponent = OpenAPIParameter | OpenAPIRequestBody | OpenAPIResponse | OpenAPISchema | any;\n\n/**\n * Resolve a $ref to a component definition\n * Handles nested $refs by recursively resolving until no more refs found\n *\n * @param obj - Object that may contain a $ref\n * @param spec - The OpenAPI specification\n * @param maxDepth - Maximum recursion depth to prevent infinite loops (default: 10)\n * @returns The resolved component, or the original object if not a reference\n */\nexport function resolveRef<T extends ResolvableComponent>(obj: T | any, spec: OpenAPISpec, maxDepth = 10): T {\n\tif (!obj || typeof obj !== \"object\" || maxDepth <= 0) return obj;\n\tif (!obj.$ref) return obj;\n\n\tconst ref = obj.$ref as string;\n\tlet resolved: any = null;\n\n\t// Match different component types\n\tconst paramMatch = ref.match(/^#\\/components\\/parameters\\/(.+)$/);\n\tconst requestBodyMatch = ref.match(/^#\\/components\\/requestBodies\\/(.+)$/);\n\tconst responseMatch = ref.match(/^#\\/components\\/responses\\/(.+)$/);\n\tconst schemaMatch = ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n\n\tif (paramMatch && spec.components?.parameters) {\n\t\tconst name = paramMatch[1];\n\t\tresolved = spec.components.parameters[name];\n\t} else if (requestBodyMatch && spec.components?.requestBodies) {\n\t\tconst name = requestBodyMatch[1];\n\t\tresolved = spec.components.requestBodies[name];\n\t} else if (responseMatch && spec.components?.responses) {\n\t\tconst name = responseMatch[1];\n\t\tresolved = spec.components.responses[name];\n\t} else if (schemaMatch && spec.components?.schemas) {\n\t\tconst name = schemaMatch[1];\n\t\tresolved = spec.components.schemas[name];\n\t}\n\n\tif (resolved) {\n\t\t// Recursively resolve nested $refs\n\t\tif (resolved.$ref) {\n\t\t\treturn resolveRef(resolved, spec, maxDepth - 1);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\t// Return original if can't resolve\n\treturn obj;\n}\n\n/**\n * Resolve a parameter reference\n * Convenience wrapper for resolveRef with parameter type\n */\nexport function resolveParameterRef(param: any, spec: OpenAPISpec): OpenAPIParameter | any {\n\treturn resolveRef<OpenAPIParameter>(param, spec);\n}\n\n/**\n * Resolve a request body reference\n * Convenience wrapper for resolveRef with request body type\n */\nexport function resolveRequestBodyRef(requestBody: any, spec: OpenAPISpec): OpenAPIRequestBody | any {\n\treturn resolveRef<OpenAPIRequestBody>(requestBody, spec);\n}\n\n/**\n * Resolve a response reference\n * Convenience wrapper for resolveRef with response type\n */\nexport function resolveResponseRef(response: any, spec: OpenAPISpec): OpenAPIResponse | any {\n\treturn resolveRef<OpenAPIResponse>(response, spec);\n}\n\n/**\n * Merge path-level parameters with operation-level parameters\n * Operation parameters override path-level parameters with the same name and location\n *\n * @param pathParams - Parameters defined at the path level\n * @param operationParams - Parameters defined at the operation level\n * @param spec - The OpenAPI specification for resolving $refs\n * @returns Merged array of resolved parameters\n */\nexport function mergeParameters(\n\tpathParams: any[] | undefined,\n\toperationParams: any[] | undefined,\n\tspec: OpenAPISpec\n): any[] {\n\tconst resolvedPathParams = (pathParams || []).map(p => resolveParameterRef(p, spec));\n\tconst resolvedOperationParams = (operationParams || []).map(p => resolveParameterRef(p, spec));\n\n\t// Start with path-level params\n\tconst merged = [...resolvedPathParams];\n\n\t// Operation params override path params by name + in\n\tfor (const opParam of resolvedOperationParams) {\n\t\tif (!opParam || typeof opParam !== \"object\") continue;\n\n\t\tconst existingIndex = merged.findIndex(\n\t\t\tp => p && typeof p === \"object\" && p.name === opParam.name && p.in === opParam.in\n\t\t);\n\n\t\tif (existingIndex >= 0) {\n\t\t\t// Override existing param\n\t\t\tmerged[existingIndex] = opParam;\n\t\t} else {\n\t\t\t// Add new param\n\t\t\tmerged.push(opParam);\n\t\t}\n\t}\n\n\treturn merged;\n}\n","/**\n * Common options shared by both request and response contexts\n */\nexport interface 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 * 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\t/**\n\t * Default nullable behavior when not explicitly specified in the schema\n\t *\n\t * When true: Properties without explicit nullable annotation are treated as nullable.\n\t * This follows the industry de facto standard for OpenAPI 3.0.x where tooling convergence\n\t * made \"nullable by default\" the safest assumption.\n\t *\n\t * When false (default): Properties are only nullable when explicitly marked with `nullable: true`\n\t * (OpenAPI 3.0) or `type: [\"string\", \"null\"]` (OpenAPI 3.1).\n\t *\n\t * @default false\n\t */\n\tdefaultNullable?: boolean;\n\n\t/**\n\t * Behavior for empty object schemas (objects with no properties defined)\n\t *\n\t * - 'strict': Uses z.strictObject({}) - no additional properties allowed\n\t * - 'loose': Uses z.looseObject({}) - explicitly allows additional properties (Zod v4)\n\t * - 'record': Uses z.record(z.string(), z.unknown()) - treat as arbitrary key-value map\n\t *\n\t * Note: This option controls nested/property-level empty objects.\n\t * The top-level `mode` option controls how schema definitions are wrapped.\n\t *\n\t * @default 'loose'\n\t */\n\temptyObjectBehavior?: \"strict\" | \"loose\" | \"record\";\n}\n\n/**\n * Request-specific options that can override root-level options\n */\nexport interface RequestOptions extends CommonSchemaOptions {\n\t// All options inherited from CommonSchemaOptions\n}\n\n/**\n * Response-specific options that can override root-level options\n */\nexport interface ResponseOptions extends CommonSchemaOptions {\n\t// All options inherited from CommonSchemaOptions\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 * Whether to add .describe() calls for better error messages\n\t * @default false\n\t */\n\tuseDescribe?: boolean;\n\n\t/**\n\t * Default nullable behavior when not explicitly specified in the schema\n\t *\n\t * When true: Properties without explicit nullable annotation are treated as nullable.\n\t * This follows the industry de facto standard for OpenAPI 3.0.x where tooling convergence\n\t * made \"nullable by default\" the safest assumption.\n\t *\n\t * When false (default): Properties are only nullable when explicitly marked with `nullable: true`\n\t * (OpenAPI 3.0) or `type: [\"string\", \"null\"]` (OpenAPI 3.1).\n\t *\n\t * @default false\n\t */\n\tdefaultNullable?: boolean;\n\n\t/**\n\t * Behavior for empty object schemas (objects with no properties defined)\n\t *\n\t * - 'strict': Uses z.strictObject({}) - no additional properties allowed\n\t * - 'loose': Uses z.looseObject({}) - explicitly allows additional properties (Zod v4)\n\t * - 'record': Uses z.record(z.string(), z.unknown()) - treat as arbitrary key-value map\n\t *\n\t * Note: This option controls nested/property-level empty objects.\n\t * The top-level `mode` option controls how schema definitions are wrapped.\n\t *\n\t * @default 'loose'\n\t */\n\temptyObjectBehavior?: \"strict\" | \"loose\" | \"record\";\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 * Strip a common prefix from all schema names before processing\n\t * Useful when OpenAPI spec has redundant schema prefixes that you want to ignore\n\t *\n\t * Supports both literal strings and glob patterns:\n\t * - Literal string: \"Company.Models.\" (must match exactly)\n\t * - Glob pattern: \"*.Models.\" (uses minimatch for pattern matching)\n\t *\n\t * Glob pattern syntax:\n\t * - * matches any characters within a single segment (stops at .)\n\t * - ** matches any characters across multiple segments (crosses . boundaries)\n\t * - ? matches a single character\n\t * - [abc] matches any character in the set\n\t * - {a,b} matches any of the alternatives\n\t * - !(pattern) matches anything except the pattern\n\t *\n\t * This affects:\n\t * - Schema name generation (shorter, cleaner names)\n\t * - Type name generation\n\t * - References to schemas\n\t *\n\t * Applied before prefix/suffix options.\n\t *\n\t * @example\n\t * // Spec has: \"Company.Models.User\", \"Company.Models.Post\"\n\t * // stripSchemaPrefix: \"Company.Models.\"\n\t * // Results in: \"User\", \"Post\"\n\t * // Schema names: userSchema, postSchema\n\t *\n\t * @example\n\t * // Strip any namespace prefix using glob pattern\n\t * // stripSchemaPrefix: \"*.Models.\"\n\t * // Matches: \"Company.Models.User\", \"App.Models.User\", etc.\n\t *\n\t * @example\n\t * // Strip versioned prefix\n\t * // stripSchemaPrefix: \"api_v[0-9]_\"\n\t * // Matches: \"api_v1_User\", \"api_v2_Post\", etc.\n\t *\n\t * @default undefined (no stripping)\n\t */\n\tstripSchemaPrefix?: 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 * Request-specific options that override root-level options\n\t * Applied when schemas are used in request contexts\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 */\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\t/**\n\t * Header parameters to ignore during schema generation\n\t * Supports glob patterns for flexible matching\n\t * Case-insensitive matching (HTTP header semantics)\n\t *\n\t * @internal Used by Playwright generator\n\t */\n\tignoreHeaders?: string[];\n\n\t/**\n\t * Strip a common prefix from all paths before generating query/header parameter schema names\n\t * This is used when operationId is not available and schema names are derived from the path.\n\t *\n\t * Supports both literal strings and glob patterns:\n\t * - Literal string: \"/api/v1\" (must match exactly)\n\t * - Glob pattern: \"/api/v*\" (uses minimatch for pattern matching)\n\t *\n\t * @example\n\t * // Path: \"/api/v1/users\" with stripPathPrefix: \"/api/v1\"\n\t * // Results in: GetUsersQueryParams (not GetApiV1UsersQueryParams)\n\t *\n\t * @internal Used by Playwright generator\n\t * @default undefined (no stripping)\n\t */\n\tstripPathPrefix?: string;\n\n\t/**\n\t * Cache size for pattern regex compilation\n\t * Higher values improve performance for large specifications with many string patterns\n\t * @default 1000\n\t */\n\tcacheSize?: number;\n\n\t/**\n\t * Batch size for parallel execution\n\t * Controls how many specifications are processed concurrently in parallel mode\n\t * Higher values increase memory usage but may improve throughput\n\t * @default 10\n\t */\n\tbatchSize?: number;\n\n\t/**\n\t * Custom regex pattern for date-time format validation\n\t * Overrides the default z.iso.datetime() which requires ISO 8601 format with timezone suffix (Z)\n\t *\n\t * **Config File Formats:**\n\t * - JSON/YAML configs: Must use string pattern (requires double-escaping: `\\\\d`)\n\t * - TypeScript configs: Can use either string pattern OR RegExp literal (`/\\d/`)\n\t *\n\t * **Common Patterns:**\n\t * ```typescript\n\t * // No timezone suffix (e.g., \"2026-01-07T14:30:00\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}$'\n\t * // OR in TypeScript config:\n\t * customDateTimeFormatRegex: /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/\n\t *\n\t * // With milliseconds, no Z (e.g., \"2026-01-07T14:30:00.123\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d{3}$'\n\t *\n\t * // Optional Z suffix (e.g., \"2026-01-07T14:30:00\" or \"2026-01-07T14:30:00Z\")\n\t * customDateTimeFormatRegex: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}Z?$'\n\t * ```\n\t *\n\t * @default \"z.iso.datetime()\" (requires Z suffix per ISO 8601)\n\t */\n\tcustomDateTimeFormatRegex?: string | RegExp;\n}\n\n/**\n * Operation filtering options\n * Controls which operations from the OpenAPI specification 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 | boolean)[];\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\tparameters?: Record<string, OpenAPIParameter>;\n\t\trequestBodies?: Record<string, OpenAPIRequestBody>;\n\t\tresponses?: Record<string, OpenAPIResponse>;\n\t};\n\tpaths?: Record<string, any>;\n}\n\n/**\n * OpenAPI parameter definition for component parameters\n */\nexport interface OpenAPIParameter {\n\tname: string;\n\tin: \"query\" | \"header\" | \"path\" | \"cookie\";\n\tdescription?: string;\n\trequired?: boolean;\n\tschema?: OpenAPISchema;\n\tdeprecated?: boolean;\n\tallowEmptyValue?: boolean;\n\tstyle?: string;\n\texplode?: boolean;\n\tallowReserved?: boolean;\n\texample?: any;\n\texamples?: Record<string, any>;\n}\n\n/**\n * OpenAPI request body definition for component request bodies\n */\nexport interface OpenAPIRequestBody {\n\tdescription?: string;\n\tcontent?: Record<string, { schema?: OpenAPISchema }>;\n\trequired?: boolean;\n\t$ref?: string;\n}\n\n/**\n * OpenAPI response definition for component responses\n */\nexport interface OpenAPIResponse {\n\tdescription?: string;\n\tcontent?: Record<string, { schema?: OpenAPISchema }>;\n\theaders?: Record<string, { schema?: OpenAPISchema; description?: string }>;\n\t$ref?: string;\n}\n\n/**\n * Execution mode for batch processing\n * - 'parallel': Process all specifications concurrently (default, faster)\n * - 'sequential': Process specifications 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 specifications\n\t * Can be overridden by individual specification configurations\n\t */\n\tdefaults?: Partial<Omit<OpenApiGeneratorOptions, \"input\" | \"output\">>;\n\n\t/**\n\t * Array of OpenAPI specifications to process\n\t * Each specification 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 are required here\n */\nexport interface ResolvedOptions {\n\tmode: \"strict\" | \"normal\" | \"loose\";\n\tuseDescribe: boolean;\n\tincludeDescriptions: boolean;\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":";;;;;;;;AAOO,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,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,SAAS,iBAAiB;AACnC,SAAS,aAAAA,kBAAiB;AAC1B,SAAS,aAAa;;;ACYtB,SAAS,mBAAmB,KAAqB;AAIhD,SAAO,IAAI,QAAQ,wBAAwB,GAAG;AAC/C;AAMO,SAAS,YAAY,KAAa,SAAiC;AAEzE,QAAM,YAAY,mBAAmB,GAAG;AAGxC,QAAM,QAAQ,UAAU,MAAM,WAAW,EAAE,OAAO,UAAQ,KAAK,SAAS,CAAC;AAGzE,MAAI;AACJ,MAAI,MAAM,WAAW,GAAG;AACvB,WAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,EACjD,WAAW,MAAM,WAAW,GAAG;AAC9B,WAAO,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,CAAC,EAAE,MAAM,CAAC;AAAA,EAC3D,OAAO;AACN,WACC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,IAChB,MACE,MAAM,CAAC,EACP,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACxD,KAAK,EAAE;AAAA,EACX;AAGA,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;AAQO,SAAS,aAAa,KAA8B;AAC1D,QAAM,cAAc,OAAO,GAAG;AAI9B,QAAM,qBAAqB,yBAAyB,KAAK,WAAW;AAEpE,MAAI,oBAAoB;AAEvB,WAAO,YAAY,OAAO,CAAC,EAAE,YAAY,IAAI,YAAY,MAAM,CAAC;AAAA,EACjE;AAGA,QAAM,YAAY,mBAAmB,WAAW;AAGhD,QAAM,QAAQ,UAAU,MAAM,WAAW,EAAE,OAAO,UAAQ,KAAK,SAAS,CAAC;AAGzE,MAAI;AACJ,MAAI,MAAM,WAAW,GAAG;AACvB,aAAS;AAAA,EACV,OAAO;AACN,aAAS,MAAM,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,EACjF;AAGA,MAAI,MAAM,KAAK,MAAM,GAAG;AACvB,aAAS,IAAI,MAAM;AAAA,EACpB;AAGA,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,GAAG;AACnC,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAKO,SAAS,WAAW,KAAqB;AAC/C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,SAAO,MAAM,MAAM,SAAS,CAAC;AAC9B;;;AClGO,SAAS,aACf,MACA,QACA,SACa;AACb,QAAM,aAAa,GAAG,YAAY,MAAM,OAAO,CAAC;AAChD,QAAM,WAAW,aAAa,IAAI;AAGlC,QAAM,cAAc,OAAO,MAAM,OAAK,OAAO,MAAM,SAAS;AAC5D,MAAI,aAAa;AAEhB,UAAMC,cAAa,gBAAgB,UAAU;AAC7C,UAAMC,YAAW,eAAe,QAAQ,qBAAqB,UAAU;AACvE,WAAO,EAAE,YAAAD,aAAY,UAAAC,UAAS;AAAA,EAC/B;AAGA,QAAM,aAAa,OAAO,MAAM,OAAK,OAAO,MAAM,QAAQ;AAC1D,MAAI,YAAY;AAEf,UAAM,aAAa,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AACtD,UAAMD,cAAa,gBAAgB,UAAU,cAAc,UAAU;AACrE,UAAMC,YAAW,eAAe,QAAQ,qBAAqB,UAAU;AACvE,WAAO,EAAE,YAAAD,aAAY,UAAAC,UAAS;AAAA,EAC/B;AAGA,QAAM,gBAAgB,OACpB,IAAI,OAAK;AACT,QAAI,OAAO,MAAM,UAAU;AAC1B,aAAO,cAAc,CAAC;AAAA,IACvB;AACA,WAAO,aAAa,CAAC;AAAA,EACtB,CAAC,EACA,KAAK,IAAI;AAEX,QAAM,aAAa,gBAAgB,UAAU,eAAe,aAAa;AACzE,QAAM,WAAW,eAAe,QAAQ,qBAAqB,UAAU;AAEvE,SAAO,EAAE,YAAY,SAAS;AAC/B;;;ACjDO,SAAS,kBAAkB,KAAqB;AACtD,SAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AAC5E;AAMO,SAAS,cAAc,KAAqB;AAClD,SAAO,IAAI,QAAQ,OAAO,KAAK;AAChC;AAOO,SAAS,YAAY,KAAqB;AAChD,SAAO,IAAI,QAAQ,SAAS,MAAM;AACnC;AAKO,SAAS,aAAa,YAAoBC,aAA6B;AAC7E,SAAOA,cAAa,GAAG,UAAU,gBAAgB;AAClD;AAOO,SAAS,WAAW,QAAuB,kBAAkB,OAAgB;AAEnF,MAAI,OAAO,aAAa,MAAM;AAC7B,WAAO;AAAA,EACR;AACA,MAAI,OAAO,aAAa,OAAO;AAC9B,WAAO;AAAA,EACR;AAEA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC/B,WAAO,OAAO,KAAK,SAAS,MAAM;AAAA,EACnC;AAEA,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;;;AC/EO,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;;;ACzEO,IAAM,WAAN,MAAqB;AAAA,EAI3B,YAAY,SAAiB;AAH7B,SAAQ,QAAQ,oBAAI,IAAU;AAI7B,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,WAAmB;AACtB,WAAO,KAAK;AAAA,EACb;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;;;ACpDA,SAAS,iBAAiB;AAgB1B,SAAS,mBAAmB,SAA0B;AACrD,MAAI;AAEH,QAAI,UAAU,UAAU,OAAO;AAC/B,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAOA,SAAS,cAAc,SAA0B;AAChD,SAAO,aAAa,KAAK,OAAO;AACjC;AAuBO,SAAS,YAAY,OAAe,SAA6B,mBAAoC;AAC3G,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AAGA,MAAI,cAAc,OAAO,KAAK,CAAC,mBAAmB,OAAO,GAAG;AAC3D,YAAQ,KAAK,uCAA6B,OAAO,yBAAyB;AAC1E,WAAO;AAAA,EACR;AAGA,MAAI,cAAc,OAAO,GAAG;AAI3B,QAAI,eAAe;AAEnB,aAAS,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK;AACvC,YAAM,aAAa,MAAM,UAAU,GAAG,CAAC;AACvC,UAAI,UAAU,YAAY,OAAO,GAAG;AAEnC,uBAAe;AAAA,MAChB;AAAA,IACD;AAEA,QAAI,eAAe,GAAG;AAErB,YAAM,WAAW,MAAM,UAAU,YAAY;AAG7C,UAAI,mBAAmB;AACtB,YAAI,aAAa,IAAI;AACpB,iBAAO;AAAA,QACR;AACA,YAAI,CAAC,SAAS,WAAW,iBAAiB,GAAG;AAC5C,iBAAO,GAAG,iBAAiB,GAAG,QAAQ;AAAA,QACvC;AAAA,MACD;AAEA,aAAO,aAAa,MAAM,CAAC,oBAAoB,QAAQ;AAAA,IACxD;AAGA,WAAO;AAAA,EACR;AAGA,MAAI,MAAM,WAAW,OAAO,GAAG;AAC9B,UAAM,WAAW,MAAM,UAAU,QAAQ,MAAM;AAG/C,QAAI,mBAAmB;AACtB,UAAI,aAAa,IAAI;AACpB,eAAO;AAAA,MACR;AACA,UAAI,CAAC,SAAS,WAAW,iBAAiB,GAAG;AAC5C,eAAO,GAAG,iBAAiB,GAAG,QAAQ;AAAA,MACvC;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAGA,SAAO;AACR;AAgBO,SAAS,gBAAgB,MAAc,SAAqC;AAClF,MAAI,CAAC,SAAS;AACb,WAAO;AAAA,EACR;AAGA,MAAI,CAAC,cAAc,OAAO,GAAG;AAC5B,QAAI,oBAAoB,QAAQ,KAAK;AACrC,QAAI,CAAC,kBAAkB,WAAW,GAAG,GAAG;AACvC,0BAAoB,IAAI,iBAAiB;AAAA,IAC1C;AACA,QAAI,kBAAkB,SAAS,GAAG,KAAK,sBAAsB,KAAK;AACjE,0BAAoB,kBAAkB,MAAM,GAAG,EAAE;AAAA,IAClD;AAEA,WAAO,YAAY,MAAM,mBAAmB,GAAG;AAAA,EAChD;AAGA,SAAO,YAAY,MAAM,SAAS,GAAG;AACtC;;;AClJO,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;;;ACtDA,SAAS,wBACR,SACA,eACA,SAC+C;AAC/C,QAAM,iBAA2B,CAAC;AAElC,aAAW,UAAU,SAAS;AAC7B,UAAM,WAAW,cAAc,QAAQ,OAAO;AAC9C,UAAM,WAAW,SAAS,YAAY,CAAC;AAEvC,QAAI,CAAC,SAAS,SAAS,aAAa,GAAG;AACtC,YAAM,aAAa,OAAO,OAAO,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,WAAW;AAC5E,qBAAe,KAAK,UAAU;AAAA,IAC/B;AAAA,EACD;AAEA,SAAO;AAAA,IACN,OAAO,eAAe,WAAW;AAAA,IACjC;AAAA,EACD;AACD;AAKO,SAAS,cACf,SACA,eACAC,aACA,SACA,SACA,eACS;AAET,MAAI,QAAQ,WAAW,GAAG;AACzB,YAAQ;AAAA,MACP;AAAA,IACD;AACA,WAAO;AAAA,MACN;AAAA,MACAA;AAAA,IACD;AAAA,EACD;AAGA,MAAI,QAAQ,WAAW,GAAG;AACzB,QAAI,eAAe,QAAQ,uBAAuB,QAAQ,CAAC,GAAG,aAAa;AAC3E,SAAI,mCAAS,gBAAe,CAAC,aAAa,SAAS,YAAY,GAAG;AACjE,qBAAe,GAAG,YAAY;AAAA,IAC/B;AACA,WAAO,aAAa,cAAcA,WAAU;AAAA,EAC7C;AAEA,MAAI,eAAe;AAElB,QAAI,kBAAkB;AACtB,SAAI,mCAAS,yBAAwB,QAAQ,6BAA6B;AACzE,wBAAkB,QAAQ,4BAA4B,QAAQ,sBAAsB,OAAO;AAAA,IAC5F;AAGA,UAAM,qBAAqB,wBAAwB,iBAAiB,eAAe,OAAO;AAE1F,QAAI,CAAC,mBAAmB,OAAO;AAE9B,cAAQ;AAAA,QACP,4CAA4C,aAAa,iCAAiC,mBAAmB,eAAe,KAAK,IAAI,CAAC;AAAA,MAEvI;AAEA,UAAIC,iBAAgB,gBAAgB,IAAI,OAAK,QAAQ,uBAAuB,GAAG,aAAa,CAAC;AAC7F,UAAI,mCAAS,aAAa;AACzB,QAAAA,iBAAgBA,eAAc,IAAI,OAAM,EAAE,SAAS,YAAY,IAAI,IAAI,GAAG,CAAC,wBAAyB;AAAA,MACrG;AAEA,YAAM,sBAAsB,kBAAkB,aAAa,kCAAkC,mBAAmB,eAAe,KAAK,IAAI,CAAC;AACzI,YAAMC,SAAQ,YAAYD,eAAc,KAAK,IAAI,CAAC,gBAAgB,mBAAmB;AACrF,aAAO,aAAaC,QAAOF,WAAU;AAAA,IACtC;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;AAKA,SAAS,cAAc,QAAuB,SAAqD;AAClG,MAAI,OAAO,QAAQ,QAAQ,kBAAkB;AAC5C,UAAM,WAAW,QAAQ,iBAAiB,OAAO,IAAI;AACrD,QAAI,UAAU;AACb,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAKA,SAAS,kBACR,QACA,SACyD;AACzD,QAAM,WAAW,cAAc,QAAQ,OAAO;AAC9C,QAAM,QAAQ,oBAAI,IAAuD;AAGzE,QAAM,aAAa,OAAO,OAAO,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,YAAY;AAG7E,MAAI,SAAS,YAAY;AACxB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC/D,YAAM,IAAI,KAAK,EAAE,QAAQ,OAAO,QAAQ,WAAW,CAAC;AAAA,IACrD;AAAA,EACD;AAGA,MAAI,SAAS,OAAO;AACnB,eAAW,aAAa,SAAS,OAAO;AACvC,YAAM,WAAW,kBAAkB,WAAW,OAAO;AACrD,iBAAW,CAAC,KAAK,KAAK,KAAK,UAAU;AACpC,YAAI,CAAC,MAAM,IAAI,GAAG,GAAG;AACpB,gBAAM,IAAI,KAAK,KAAK;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;AAKA,SAAS,aAAa,GAAkB,GAA2B;AAElE,SAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAC9C;AAKA,SAAS,4BAA4B,SAA0B,SAAgD;AAC9G,QAAM,YAAsB,CAAC;AAC7B,QAAM,cAAc,oBAAI,IAAuD;AAE/E,aAAW,UAAU,SAAS;AAC7B,UAAM,cAAc,kBAAkB,QAAQ,OAAO;AAErD,eAAW,CAAC,UAAU,QAAQ,KAAK,aAAa;AAC/C,YAAM,WAAW,YAAY,IAAI,QAAQ;AACzC,UAAI,UAAU;AAEb,YAAI,CAAC,aAAa,SAAS,QAAQ,SAAS,MAAM,GAAG;AACpD,oBAAU;AAAA,YACT,aAAa,QAAQ,oCAAoC,SAAS,MAAM,QAAQ,SAAS,MAAM;AAAA,UAChG;AAAA,QACD;AAAA,MACD,OAAO;AACN,oBAAY,IAAI,UAAU,QAAQ;AAAA,MACnC;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;AAgBO,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,YAAY,4BAA4B,SAAS,OAAO;AAC9D,MAAI,sBAAsB;AAC1B,MAAI,UAAU,SAAS,GAAG;AACzB,eAAW,YAAY,WAAW;AACjC,cAAQ,KAAK,0DAA0D,QAAQ,EAAE;AAAA,IAClF;AACA,0BAAsB,sCAAsC,UAAU,KAAK,IAAI,CAAC;AAAA,EACjF;AAGA,QAAM,aAAa,QAAQ,MAAM,OAAK,EAAE,SAAS,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK;AAE9F,MAAI;AACJ,MAAI,YAAY;AAGf,QAAI,SAAS,QAAQ,uBAAuB,QAAQ,CAAC,GAAG,eAAe,KAAK;AAG5E,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,YAAM,SAAS,QAAQ,CAAC;AAExB,UAAI,OAAO,MAAM;AAGhB,cAAM,YAAY,QAAQ,uBAAuB,QAAQ,eAAe,KAAK;AAC7E,iBAAS,GAAG,MAAM,WAAW,SAAS;AAAA,MACvC,WAAW,QAAQ,8BAA8B,OAAO,cAAc,OAAO,SAAS,WAAW;AAIhG,cAAM,cAAc,QAAQ,0BAA0B,QAAQ,aAAa;AAC3E,iBAAS,GAAG,MAAM,WAAW,WAAW;AAAA,MACzC,OAAO;AAGN,cAAM,eAAe,QAAQ,uBAAuB,QAAQ,eAAe,KAAK;AAChF,iBAAS,GAAG,MAAM,WAAW,YAAY;AAAA,MAC1C;AAAA,IACD;AACA,aAAS;AAAA,EACV,OAAO;AAEN,UAAM,gBAAgB,QAAQ,IAAI,OAAK,QAAQ,uBAAuB,GAAG,eAAe,KAAK,CAAC;AAC9F,QAAI,SAAS,cAAc,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC9C,eAAS,GAAG,MAAM,QAAQ,cAAc,CAAC,CAAC;AAAA,IAC3C;AACA,aAAS;AAAA,EACV;AAGA,MAAI,qBAAqB;AACxB,aAAS,GAAG,MAAM,cAAc,mBAAmB;AAAA,EACpD;AAIA,SAAO,aAAa,QAAQA,WAAU;AACvC;;;AC5RO,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,UAAMG,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;;;AC9PA,IAAI,gBAAgB,IAAI,SAAyB,GAAI;AAM9C,SAAS,sBAAsB,MAAoB;AACzD,MAAI,OAAO,KAAK,SAAS,cAAc,UAAU;AAChD,oBAAgB,IAAI,SAAyB,IAAI;AAAA,EAClD;AACD;AAGA,IAAM,qBAA6C;AAAA,EAClD,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,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;AAGA,IAAI,aAAqC;AAAA,EACxC,GAAG;AAAA,EACH,aAAa;AACd;AAgBO,SAAS,wBAAwB,SAAiC;AACxE,MAAI,CAAC,SAAS;AAEb,eAAW,WAAW,IAAI;AAC1B;AAAA,EACD;AAGA,QAAM,aAAa,mBAAmB,SAAS,QAAQ,SAAS;AAGhE,MAAI,eAAe,IAAI;AACtB,eAAW,WAAW,IAAI;AAC1B;AAAA,EACD;AAGA,MAAI;AACH,QAAI,OAAO,UAAU;AAAA,EACtB,SAAS,OAAO;AACf,UAAM,IAAI;AAAA,MACT,qEAAqE,UAAU,KAC9E,iBAAiB,QAAQ,MAAM,UAAU,sBAC1C;AAAA,IACD;AAAA,EACD;AAGA,QAAM,iBAAiB,cAAc,UAAU;AAG/C,aAAW,WAAW,IAAI,qBAAqB,cAAc;AAC9D;AAeO,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;;;ACtKO,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;AA1FtE;AA4FE,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,EAKQ,iBAAiB,KAAwC;AA9MlE;AA+ME,UAAM,aAAa,IAAI,MAAM,GAAG,EAAE,IAAI;AACtC,QAAI,CAAC,WAAY,QAAO;AACxB,YAAO,gBAAK,QAAQ,KAAK,eAAlB,mBAA8B,YAA9B,mBAAwC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,YAA4B;AAxNxD;AAyNE,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;AAhP/E;AAiPE,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;AA5RrE;AA6RG,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,UAAU,GAAG;AAE3C,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;AAjVnG;AAoVE,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;AAYA,UAAM,cAAc,CAAC,CAAC,OAAO;AAC7B,UAAM,SAAS,CAAC,CAAC,OAAO;AACxB,UAAM,UAAU,OAAO,UAAU;AACjC,UAAM,6BAA6B,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC;AAC9E,UAAM,2BAA2B,6BAA6B,KAAK,QAAQ,kBAAkB;AAC7F,UAAM,WAAW,WAAW,QAAQ,wBAAwB;AAG5D,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;AAGA,YAAM,kBAAkB,YAAY,iBAAiB,KAAK,QAAQ,iBAAiB;AACnF,YAAM,aAAa,GAAG,YAAY,iBAAiB,KAAK,QAAQ,aAAa,CAAC;AAC9E,UAAI,kBAAkB,YAAY,iBAAiB,KAAK,uBAAuB,eAAe,OAAO,IAAI;AAExG,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;AAEhB,YAAM,cAAc,OAAO,KAAK,MAAM,OAAK,OAAO,MAAM,SAAS;AACjE,UAAI,aAAa;AAChB,cAAM,aAAa;AACnB,eAAO,aAAa,YAAY,QAAQ;AAAA,MACzC;AAGA,YAAM,aAAa,OAAO,KAAK,MAAM,OAAK,OAAO,MAAM,QAAQ;AAC/D,UAAI,YAAY;AACf,cAAM,aAAa,OAAO,KAAK,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC3D,cAAM,UAAU,WAAW,UAAU;AACrC,eAAO,aAAa,SAAS,QAAQ;AAAA,MACtC;AAGA,YAAM,gBAAgB,OAAO,KAC3B,IAAI,OAAK;AACT,YAAI,OAAO,MAAM,UAAU;AAC1B,iBAAO,cAAc,CAAC;AAAA,QACvB;AACA,eAAO,aAAa,CAAC;AAAA,MACtB,CAAC,EACA,KAAK,IAAI;AACX,YAAM,WAAW,YAAY,aAAa;AAC1C,aAAO,aAAa,UAAU,QAAQ;AAAA,IACvC;AAGA,QAAI,OAAO,OAAO;AACjB,UAAI,cAAc;AAAA,QACjB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,UACC,wBAAwB,KAAK,uBAAuB,KAAK,IAAI;AAAA,UAC7D,2BAA2B,KAAK,0BAA0B,KAAK,IAAI;AAAA,UACnE,kBAAkB,KAAK,iBAAiB,KAAK,IAAI;AAAA,QAClD;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,UACvE,kBAAkB,KAAK,iBAAiB,KAAK,IAAI;AAAA,QAClD;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,UACvE,kBAAkB,KAAK,iBAAiB,KAAK,IAAI;AAAA,QAClD;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;AAEN,kBAAQ,KAAK,QAAQ,qBAAqB;AAAA,YACzC,KAAK;AACJ,2BAAa;AACb;AAAA,YACD,KAAK;AACJ,2BAAa;AACb;AAAA,YACD;AACC,2BAAa;AACb;AAAA,UACF;AACA,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,0BAA0B,QAAuB,eAAgC;AAChF,UAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;AAC9C,UAAM,aAAuB,CAAC;AAE9B,QAAI,OAAO,YAAY;AACtB,iBAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAEvE,YAAI,CAAC,KAAK,sBAAsB,UAAU,GAAG;AAC5C;AAAA,QACD;AAEA,cAAM,aAAa,SAAS,IAAI,QAAQ;AACxC,cAAM,YAAY,KAAK,uBAAuB,YAAY,aAAa;AAGvE,cAAM,kBAAkB;AACxB,cAAM,iBAAiB,gBAAgB,KAAK,QAAQ,IAAI,WAAW,IAAI,QAAQ;AAE/E,YAAI,cAAc,GAAG,cAAc,KAAK,SAAS;AACjD,YAAI,CAAC,YAAY;AAChB,yBAAe;AAAA,QAChB;AAEA,mBAAW,KAAK,WAAW;AAAA,MAC5B;AAAA,IACD;AAGA,QAAI,WAAW,WAAW,GAAG;AAC5B,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EAAM,WAAW,IAAI,OAAK,IAAK,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC;AAAA;AAAA,EACvD;AACD;AAAA;AAjnBa,mBAQI,kBAAkB;AAAA,EACjC,SAAS,CAAC,WAA0B,CAAC,OAAO;AAAA,EAC5C,UAAU,CAAC,WAA0B,CAAC,OAAO;AAAA,EAC7C,KAAK,MAAM;AACZ;AAZM,IAAM,oBAAN;;;ACrCP,SAAS,aAAAC,kBAAiB;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,aAAWA,WAAU,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;;;ACxNO,SAASC,YAA0C,KAAc,MAAmB,WAAW,IAAO;AAzB7G;AA0BC,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,YAAY,EAAG,QAAO;AAC7D,MAAI,CAAC,IAAI,KAAM,QAAO;AAEtB,QAAM,MAAM,IAAI;AAChB,MAAI,WAAgB;AAGpB,QAAM,aAAa,IAAI,MAAM,mCAAmC;AAChE,QAAM,mBAAmB,IAAI,MAAM,sCAAsC;AACzE,QAAM,gBAAgB,IAAI,MAAM,kCAAkC;AAClE,QAAM,cAAc,IAAI,MAAM,gCAAgC;AAE9D,MAAI,gBAAc,UAAK,eAAL,mBAAiB,aAAY;AAC9C,UAAM,OAAO,WAAW,CAAC;AACzB,eAAW,KAAK,WAAW,WAAW,IAAI;AAAA,EAC3C,WAAW,sBAAoB,UAAK,eAAL,mBAAiB,gBAAe;AAC9D,UAAM,OAAO,iBAAiB,CAAC;AAC/B,eAAW,KAAK,WAAW,cAAc,IAAI;AAAA,EAC9C,WAAW,mBAAiB,UAAK,eAAL,mBAAiB,YAAW;AACvD,UAAM,OAAO,cAAc,CAAC;AAC5B,eAAW,KAAK,WAAW,UAAU,IAAI;AAAA,EAC1C,WAAW,iBAAe,UAAK,eAAL,mBAAiB,UAAS;AACnD,UAAM,OAAO,YAAY,CAAC;AAC1B,eAAW,KAAK,WAAW,QAAQ,IAAI;AAAA,EACxC;AAEA,MAAI,UAAU;AAEb,QAAI,SAAS,MAAM;AAClB,aAAOA,YAAW,UAAU,MAAM,WAAW,CAAC;AAAA,IAC/C;AACA,WAAO;AAAA,EACR;AAGA,SAAO;AACR;AAMO,SAAS,oBAAoB,OAAY,MAA2C;AAC1F,SAAOA,YAA6B,OAAO,IAAI;AAChD;AA2BO,SAAS,gBACf,YACA,iBACA,MACQ;AACR,QAAM,sBAAsB,cAAc,CAAC,GAAG,IAAI,OAAK,oBAAoB,GAAG,IAAI,CAAC;AACnF,QAAM,2BAA2B,mBAAmB,CAAC,GAAG,IAAI,OAAK,oBAAoB,GAAG,IAAI,CAAC;AAG7F,QAAM,SAAS,CAAC,GAAG,kBAAkB;AAGrC,aAAW,WAAW,yBAAyB;AAC9C,QAAI,CAAC,WAAW,OAAO,YAAY,SAAU;AAE7C,UAAM,gBAAgB,OAAO;AAAA,MAC5B,OAAK,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS,QAAQ,QAAQ,EAAE,OAAO,QAAQ;AAAA,IAChF;AAEA,QAAI,iBAAiB,GAAG;AAEvB,aAAO,aAAa,IAAI;AAAA,IACzB,OAAO;AAEN,aAAO,KAAK,OAAO;AAAA,IACpB;AAAA,EACD;AAEA,SAAO;AACR;;;AfvGO,IAAM,mBAAN,MAAuB;AAAA,EAa7B,YAAY,SAAkC;AAZ9C,SAAQ,UAA+B,oBAAI,IAAI;AAC/C,SAAQ,QAA6B,oBAAI,IAAI;AAC7C,SAAQ,qBAA+C,oBAAI,IAAI;AAI/D,SAAQ,iBAA6C,oBAAI,IAAI;AAG7D,SAAQ,iBAAiB;AACzB,SAAQ,cAAgC,uBAAuB;AAlChE;AAsCE,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,cAAa,aAAQ,gBAAR,YAAuB;AAAA,MACpC,kBAAiB,aAAQ,oBAAR,YAA2B;AAAA,MAC5C,sBAAqB,aAAQ,wBAAR,YAA+B;AAAA,MACpD,YAAY,QAAQ,cAAc;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,mBAAmB,QAAQ;AAAA,MAC3B,iBAAiB,QAAQ;AAAA,MACzB,YAAW,aAAQ,cAAR,YAAqB;AAAA,MAChC,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,kBAAkB,QAAQ;AAAA,MAC1B,eAAe,QAAQ;AAAA,MACvB,YAAW,aAAQ,cAAR,YAAqB;AAAA,MAChC,YAAW,aAAQ,cAAR,YAAqB;AAAA,MAChC,2BAA2B,QAAQ;AAAA,IACpC;AAGA,QAAI,KAAK,QAAQ,WAAW;AAC3B,4BAAsB,KAAK,QAAQ,SAAS;AAAA,IAC7C;AAGA,QAAI,KAAK,QAAQ,2BAA2B;AAC3C,8BAAwB,KAAK,QAAQ,yBAAyB;AAAA,IAC/D;AAGA,QAAI;AACH,YAAM,KAAK,UAAQ,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,UAAU,aAAa,KAAK,QAAQ,OAAO,OAAO;AAGxD,UAAI;AACH,aAAK,OAAO,MAAM,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;AAIxB,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,kBAAiB,UAAK,QAAQ,oBAAb,YAAgC;AAAA,MACjD,sBAAqB,UAAK,QAAQ,wBAAb,YAAoC;AAAA,MACzD,eAAe;AAAA,QACd,QAAQ,KAAK,QAAQ;AAAA,QACrB,QAAQ,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,mBAAmB,KAAK,QAAQ;AAAA,IACjC,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAyB;AArK1B;AAsKE,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;AAE1E,UAAI,KAAK,QAAQ,oBAAoB,KAAK,eAAe,OAAO,KAAK,CAAC,KAAK,eAAe,IAAI,IAAI,GAAG;AACpG;AAAA,MACD;AACA,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,WAAO,KAAK,sBAAsB;AAClC,eAAW,QAAQ,oBAAoB;AACtC,YAAM,aAAa,KAAK,QAAQ,IAAI,IAAI;AACxC,YAAM,WAAW,KAAK,MAAM,IAAI,IAAI;AAEpC,UAAI,YAAY;AAEf,eAAO,KAAK,UAAU;AAKtB,cAAM,eAAe,YAAY,MAAM,KAAK,QAAQ,iBAAiB;AACrE,cAAM,WAAW,aAAa,YAAY;AAC1C,YAAI,CAAC,WAAW,SAAS,eAAe,QAAQ,EAAE,GAAG;AACpD,gBAAM,aAAa,GAAG,YAAY,cAAc,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC,CAAC;AAC7G,iBAAO,KAAK,eAAe,QAAQ,qBAAqB,UAAU,IAAI;AAAA,QACvE;AACA,eAAO,KAAK,EAAE;AAAA,MACf,WAAW,UAAU;AAEpB,eAAO,KAAK,QAAQ;AACpB,eAAO,KAAK,EAAE;AAAA,MACf;AAAA,IACD;AACA,WAAO,OAAO,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,UAAwB;AACrD,UAAM,iBAAiB,UAAU,QAAQ;AACzC,UAAM,MAAM,QAAQ,cAAc;AAClC,QAAI,CAAC,WAAW,GAAG,GAAG;AACrB,gBAAU,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,mBAAmB,UAAU,KAAK,QAAQ,MAAM;AACtD,SAAK,sBAAsB,gBAAgB;AAC3C,kBAAc,kBAAkB,MAAM;AACtC,YAAQ,IAAI,sBAAiB,gBAAgB,EAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,SAAkD;AA5QpF;AA6QE,UAAM,iBAAiB,YAAY,YAAY,KAAK,QAAQ,UAAU,KAAK,QAAQ;AAEnF,WAAO;AAAA,MACN,OAAM,4DAAgB,SAAhB,YAAwB,KAAK,QAAQ,SAArC,YAA6C;AAAA,MACnD,cAAa,4DAAgB,gBAAhB,YAA+B,KAAK,QAAQ,gBAA5C,YAA2D;AAAA,MACxE,sBAAqB,4DAAgB,wBAAhB,YAAuC,KAAK,QAAQ,wBAApD,YAA2E;AAAA,IACjG;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAA2B;AA1RpC;AA2RE,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;AApYhE;AAqYE,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;AAle1C;AAmeE,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,iBAAiB,oBAAI,IAAY;AAEvC,UAAM,cAAc,CAAC,SAA0B;AAtejD,UAAAC,KAAA;AAueG,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,EAKQ,eAAqB;AA9gB9B;AA+gBE,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;AA5lB5E;AA8lBE,QAAI,CAAC,KAAK,mBAAmB,IAAI,IAAI,GAAG;AACvC,WAAK,mBAAmB,IAAI,MAAM,oBAAI,IAAI,CAAC;AAAA,IAC5C;AAEA,UAAM,UAAU,KAAK,eAAe,IAAI,IAAI;AAC5C,UAAM,kBAAkB,YAAY,aAAa,KAAK,kBAAkB,KAAK;AAG7E,QAAI,OAAO,MAAM;AAChB,YAAMC,SAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAGtG,YAAMC,gBAAe,YAAY,MAAM,KAAK,QAAQ,iBAAiB;AAGrE,YAAM,EAAE,YAAY,SAAS,IAAI,aAAaA,eAAc,OAAO,MAAM;AAAA,QACxE,QAAQ,KAAK,QAAQ;AAAA,QACrB,QAAQ,KAAK,QAAQ;AAAA,MACtB,CAAC;AAED,YAAM,iBAAiB,GAAGD,MAAK,GAAG,UAAU;AAAA,EAAK,QAAQ;AACzD,WAAK,QAAQ,IAAI,MAAM,cAAc;AACrC;AAAA,IACD;AAIA,UAAM,eAAe,YAAY,MAAM,KAAK,QAAQ,iBAAiB;AACrE,UAAM,aAAa,GAAG,YAAY,cAAc,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC,CAAC;AAC7G,UAAM,QAAQ,cAAc,QAAQ,MAAM,EAAE,qBAAqB,gBAAgB,oBAAoB,CAAC;AAGtG,QAAI,OAAO,SAAS,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,CAAC,EAAE,MAAM;AACtE,YAAM,UAAU,WAAW,OAAO,MAAM,CAAC,EAAE,IAAI;AAC/C,iBAAK,mBAAmB,IAAI,IAAI,MAAhC,mBAAmC,IAAI;AAAA,IACxC;AAGA,SAAK,oBAAoB,IAAI,kBAAkB;AAAA,MAC9C,MAAM,KAAK;AAAA,MACX,oBAAoB,KAAK;AAAA,MACzB,YAAY,KAAK,QAAQ,cAAc;AAAA,MACvC,MAAM,gBAAgB;AAAA,MACtB,qBAAqB,gBAAgB;AAAA,MACrC,aAAa,gBAAgB;AAAA,MAC7B,kBAAiB,UAAK,QAAQ,oBAAb,YAAgC;AAAA,MACjD,sBAAqB,UAAK,QAAQ,wBAAb,YAAoC;AAAA,MACzD,eAAe;AAAA,QACd,QAAQ,KAAK,QAAQ;AAAA,QACrB,QAAQ,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,mBAAmB,KAAK,QAAQ;AAAA,IACjC,CAAC;AAID,UAAM,YAAY,KAAK,kBAAkB,uBAAuB,QAAQ,MAAM,IAAI;AAClF,UAAM,gBAAgB,GAAG,KAAK,gBAAgB,UAAU,MAAM,SAAS;AAIvE,QAAI,UAAU,SAAS,uBAAuB,GAAG;AAChD,YAAM,QAAQ,UAAU,MAAM,8CAA8C;AAC5E,UAAI,OAAO;AACV,cAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,SAAO,IAAI,KAAK,CAAC;AACtD,mBAAW,OAAO,MAAM;AAEvB,gBAAM,WAAW,IAAI,MAAM,8BAA8B;AACzD,cAAI,UAAU;AAEb,kBAAM,UAAU,SAAS,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AACzE,uBAAK,mBAAmB,IAAI,IAAI,MAAhC,mBAAmC,IAAI;AAAA,UACxC;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,SAAK,QAAQ,IAAI,MAAM,aAAa;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,gCAAsC;AAjrB/C;AAkrBE,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,cAAM,YAAY,gBAAgB,SAAS,YAAY,UAAU,YAAY,KAAK,IAAI;AAGtF,cAAM,cAAc,UAAU;AAAA,UAC7B,CAAC,UAAe,SAAS,OAAO,UAAU,YAAY,MAAM,OAAO;AAAA,QACpE;AAEA,YAAI,YAAY,WAAW,GAAG;AAC7B;AAAA,QACD;AAGA,YAAI;AACJ,YAAI,UAAU,aAAa;AAE1B,8BAAoB,UAAU,YAAY,SAAS,GAAG,IACnD,aAAa,UAAU,WAAW,IAClC,UAAU,YAAY,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,YAAY,MAAM,CAAC;AAAA,QACjF,OAAO;AAGN,gBAAM,eAAe,gBAAgB,MAAM,KAAK,QAAQ,eAAe;AACvE,8BAAoB,KAAK,2BAA2B,QAAQ,YAAY;AAAA,QACzE;AACA,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,qBAAqB,UAAU,eAAe,GAAG,OAAO,YAAY,CAAC,IAAI,IAAI;AACnF,cAAM,QAAQ;AAAA,0BAAgC,kBAAkB;AAAA;AAAA;AAChE,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;AAAA,EAOQ,2BAA2B,QAAgB,MAAsB;AAIxE,UAAM,WAAW,KACf,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,aAAW;AACf,UAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAErD,cAAM,YAAY,QAAQ,MAAM,GAAG,EAAE;AACrC,eAAO,KAAK,KAAK,kBAAkB,SAAS,CAAC;AAAA,MAC9C;AAEA,aAAO,KAAK,kBAAkB,OAAO;AAAA,IACtC,CAAC,EACA,KAAK,EAAE;AAGT,UAAM,oBAAoB,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC,EAAE,YAAY;AACvF,WAAO,GAAG,iBAAiB,GAAG,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,KAAqB;AAE9C,QAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;AAChE,aAAO,IACL,MAAM,OAAO,EACb,IAAI,UAAQ;AACZ,YAAI,CAAC,KAAM,QAAO;AAClB,eAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,MACjE,CAAC,EACA,KAAK,EAAE;AAAA,IACV;AAGA,WAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,YAA6B;AACvD,UAAM,iBAAiB,KAAK,QAAQ;AACpC,QAAI,CAAC,kBAAkB,eAAe,WAAW,GAAG;AACnD,aAAO;AAAA,IACR;AAEA,QAAI,eAAe,SAAS,GAAG,GAAG;AACjC,aAAO;AAAA,IACR;AAEA,UAAM,cAAc,WAAW,YAAY;AAE3C,WAAO,eAAe,KAAK,CAAC,YAAoB;AAC/C,YAAM,eAAe,QAAQ,YAAY;AACzC,aAAOE,WAAU,aAAa,YAAY;AAAA,IAC3C,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iCAAuC;AA33BhD;AA43BE,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,cAAM,YAAY,gBAAgB,SAAS,YAAY,UAAU,YAAY,KAAK,IAAI;AAGtF,cAAM,eAAe,UAAU;AAAA,UAC9B,CAAC,UACA,SAAS,OAAO,UAAU,YAAY,MAAM,OAAO,YAAY,CAAC,KAAK,mBAAmB,MAAM,IAAI;AAAA,QACpG;AAEA,YAAI,aAAa,WAAW,GAAG;AAC9B;AAAA,QACD;AAGA,YAAI;AACJ,YAAI,UAAU,aAAa;AAC1B,8BAAoB,UAAU,YAAY,SAAS,GAAG,IACnD,aAAa,UAAU,WAAW,IAClC,UAAU,YAAY,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,YAAY,MAAM,CAAC;AAAA,QACjF,OAAO;AAGN,gBAAM,eAAe,gBAAgB,MAAM,KAAK,QAAQ,eAAe;AACvE,8BAAoB,KAAK,2BAA2B,QAAQ,YAAY;AAAA,QACzE;AACA,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,qBAAqB,UAAU,eAAe,GAAG,OAAO,YAAY,CAAC,IAAI,IAAI;AACnF,cAAM,QAAQ;AAAA,2BAAiC,kBAAkB;AAAA;AAAA;AACjE,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;AAEtC,YAAM,kBAAkB,YAAY,SAAS,KAAK,QAAQ,iBAAiB;AAC3E,YAAM,aAAa,YAAY,iBAAiB,EAAE,QAAQ,KAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAC5G,aAAO,GAAG,UAAU;AAAA,IACrB;AAGA,QAAI,OAAO,MAAM;AAEhB,YAAM,cAAc,OAAO,KAAK,MAAM,CAAC,MAAW,OAAO,MAAM,SAAS;AACxE,UAAI,aAAa;AAChB,eAAO;AAAA,MACR;AAGA,YAAM,aAAa,OAAO,KAAK,MAAM,CAAC,MAAW,OAAO,MAAM,QAAQ;AACtE,UAAI,YAAY;AACf,cAAM,aAAa,OAAO,KAAK,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI;AAC3D,eAAO,WAAW,UAAU;AAAA,MAC7B;AAGA,YAAM,gBAAgB,OAAO,KAC3B,IAAI,CAAC,MAAW;AAChB,YAAI,OAAO,MAAM,UAAU;AAC1B,iBAAO,cAAc,CAAC;AAAA,QACvB;AACA,eAAO,aAAa,CAAC;AAAA,MACtB,CAAC,EACA,KAAK,IAAI;AACX,aAAO,YAAY,aAAa;AAAA,IACjC;AAGA,UAAM,OAAO,OAAO;AAEpB,QAAI,SAAS,UAAU;AAEtB,YAAM,YAAoC;AAAA,QACzC,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,MACP;AAGA,UAAI,OAAO,UAAU,UAAU,OAAO,MAAM,GAAG;AAC9C,YAAIC,WAAU,UAAU,OAAO,MAAM;AAErC,YAAI,OAAO,cAAc,OAAW,CAAAA,WAAU,GAAGA,QAAO,QAAQ,OAAO,SAAS;AAChF,YAAI,OAAO,cAAc,OAAW,CAAAA,WAAU,GAAGA,QAAO,QAAQ,OAAO,SAAS;AAChF,YAAI,OAAO,QAAS,CAAAA,WAAU,GAAGA,QAAO,WAAW,OAAO,OAAO;AACjE,eAAOA;AAAA,MACR;AAGA,UAAI,UAAU;AACd,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,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;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,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,QAAQ,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,GAAG,GAAG;AACjD,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,QAAQ,KAAK,GAAG,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACvE,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,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,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;;;AgBtrBO,SAAS,aAAa,QAAgC;AAC5D,SAAO;AACR;","names":["minimatch","schemaCode","typeCode","isNullable","isNullable","schemaStrings","union","elseValidation","elseRequiredProps","generatePropertyAccess","definedProps","minimatch","resolveRef","_a","jsdoc","strippedName","minimatch","zodType"]}