adorn-api 1.0.12 → 1.0.14

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.
Files changed (171) hide show
  1. package/dist/adapter/express/auth.d.ts +8 -0
  2. package/dist/adapter/express/auth.d.ts.map +1 -1
  3. package/dist/adapter/express/bootstrap.d.ts +12 -0
  4. package/dist/adapter/express/bootstrap.d.ts.map +1 -1
  5. package/dist/adapter/express/coercion.d.ts +81 -1
  6. package/dist/adapter/express/coercion.d.ts.map +1 -1
  7. package/dist/adapter/express/index.d.ts +1 -0
  8. package/dist/adapter/express/index.d.ts.map +1 -1
  9. package/dist/adapter/express/merge.d.ts +17 -0
  10. package/dist/adapter/express/merge.d.ts.map +1 -1
  11. package/dist/adapter/express/openapi.d.ts +55 -0
  12. package/dist/adapter/express/openapi.d.ts.map +1 -1
  13. package/dist/adapter/express/router.d.ts +6 -0
  14. package/dist/adapter/express/router.d.ts.map +1 -1
  15. package/dist/adapter/express/swagger.d.ts +6 -0
  16. package/dist/adapter/express/swagger.d.ts.map +1 -1
  17. package/dist/adapter/express/types.d.ts +26 -0
  18. package/dist/adapter/express/types.d.ts.map +1 -1
  19. package/dist/adapter/express/validation.d.ts +19 -2
  20. package/dist/adapter/express/validation.d.ts.map +1 -1
  21. package/dist/cli.cjs +1016 -445
  22. package/dist/cli.cjs.map +1 -1
  23. package/dist/cli.js +1016 -445
  24. package/dist/cli.js.map +1 -1
  25. package/dist/compiler/analyze/index.d.ts +5 -0
  26. package/dist/compiler/analyze/index.d.ts.map +1 -0
  27. package/dist/compiler/analyze/scanControllers.d.ts +52 -0
  28. package/dist/compiler/analyze/scanControllers.d.ts.map +1 -1
  29. package/dist/compiler/cache/isStale.d.ts +26 -0
  30. package/dist/compiler/cache/isStale.d.ts.map +1 -1
  31. package/dist/compiler/cache/loadArtifacts.d.ts +36 -0
  32. package/dist/compiler/cache/loadArtifacts.d.ts.map +1 -1
  33. package/dist/compiler/cache/schema.d.ts +14 -0
  34. package/dist/compiler/cache/schema.d.ts.map +1 -1
  35. package/dist/compiler/cache/writeCache.d.ts +6 -0
  36. package/dist/compiler/cache/writeCache.d.ts.map +1 -1
  37. package/dist/compiler/gems.d.ts +75 -0
  38. package/dist/compiler/gems.d.ts.map +1 -0
  39. package/dist/compiler/generator/index.d.ts +7 -0
  40. package/dist/compiler/generator/index.d.ts.map +1 -0
  41. package/dist/compiler/generator/manifest.d.ts +23 -0
  42. package/dist/compiler/generator/manifest.d.ts.map +1 -0
  43. package/dist/compiler/generator/openapi.d.ts +118 -0
  44. package/dist/compiler/generator/openapi.d.ts.map +1 -0
  45. package/dist/compiler/graph/builder.d.ts +24 -0
  46. package/dist/compiler/graph/builder.d.ts.map +1 -0
  47. package/dist/compiler/graph/index.d.ts +7 -0
  48. package/dist/compiler/graph/index.d.ts.map +1 -0
  49. package/dist/compiler/graph/schemaGraph.d.ts +67 -0
  50. package/dist/compiler/graph/schemaGraph.d.ts.map +1 -0
  51. package/dist/compiler/graph/types.d.ts +203 -0
  52. package/dist/compiler/graph/types.d.ts.map +1 -0
  53. package/dist/compiler/index.d.ts +12 -0
  54. package/dist/compiler/index.d.ts.map +1 -0
  55. package/dist/compiler/ir/index.d.ts +7 -0
  56. package/dist/compiler/ir/index.d.ts.map +1 -0
  57. package/dist/compiler/ir/pipeline.d.ts +82 -0
  58. package/dist/compiler/ir/pipeline.d.ts.map +1 -0
  59. package/dist/compiler/ir/stages.d.ts +40 -0
  60. package/dist/compiler/ir/stages.d.ts.map +1 -0
  61. package/dist/compiler/ir/visitor.d.ts +98 -0
  62. package/dist/compiler/ir/visitor.d.ts.map +1 -0
  63. package/dist/compiler/manifest/emit.d.ts +14 -0
  64. package/dist/compiler/manifest/emit.d.ts.map +1 -1
  65. package/dist/compiler/manifest/format.d.ts +42 -0
  66. package/dist/compiler/manifest/format.d.ts.map +1 -1
  67. package/dist/compiler/manifest/index.d.ts +6 -0
  68. package/dist/compiler/manifest/index.d.ts.map +1 -0
  69. package/dist/compiler/runner/createProgram.d.ts +16 -0
  70. package/dist/compiler/runner/createProgram.d.ts.map +1 -1
  71. package/dist/compiler/runner/index.d.ts +5 -0
  72. package/dist/compiler/runner/index.d.ts.map +1 -0
  73. package/dist/compiler/schema/extractAnnotations.d.ts +47 -0
  74. package/dist/compiler/schema/extractAnnotations.d.ts.map +1 -1
  75. package/dist/compiler/schema/index.d.ts +6 -0
  76. package/dist/compiler/schema/index.d.ts.map +1 -0
  77. package/dist/compiler/schema/intersectionHandler.d.ts +44 -0
  78. package/dist/compiler/schema/intersectionHandler.d.ts.map +1 -0
  79. package/dist/compiler/schema/objectHandler.d.ts +106 -0
  80. package/dist/compiler/schema/objectHandler.d.ts.map +1 -0
  81. package/dist/compiler/schema/openapi.d.ts +16 -1
  82. package/dist/compiler/schema/openapi.d.ts.map +1 -1
  83. package/dist/compiler/schema/parameters.d.ts +90 -0
  84. package/dist/compiler/schema/parameters.d.ts.map +1 -0
  85. package/dist/compiler/schema/primitives.d.ts +68 -0
  86. package/dist/compiler/schema/primitives.d.ts.map +1 -0
  87. package/dist/compiler/schema/typeToJsonSchema.d.ts +22 -51
  88. package/dist/compiler/schema/typeToJsonSchema.d.ts.map +1 -1
  89. package/dist/compiler/schema/types.d.ts +69 -0
  90. package/dist/compiler/schema/types.d.ts.map +1 -0
  91. package/dist/compiler/schema/unionHandler.d.ts +70 -0
  92. package/dist/compiler/schema/unionHandler.d.ts.map +1 -0
  93. package/dist/compiler/transform/dedup.d.ts +35 -0
  94. package/dist/compiler/transform/dedup.d.ts.map +1 -0
  95. package/dist/compiler/transform/flatten.d.ts +50 -0
  96. package/dist/compiler/transform/flatten.d.ts.map +1 -0
  97. package/dist/compiler/transform/index.d.ts +7 -0
  98. package/dist/compiler/transform/index.d.ts.map +1 -0
  99. package/dist/compiler/transform/inline.d.ts +46 -0
  100. package/dist/compiler/transform/inline.d.ts.map +1 -0
  101. package/dist/compiler/validation/emitPrecompiledValidators.d.ts +16 -0
  102. package/dist/compiler/validation/emitPrecompiledValidators.d.ts.map +1 -1
  103. package/dist/compiler/validation/index.d.ts +5 -0
  104. package/dist/compiler/validation/index.d.ts.map +1 -0
  105. package/dist/decorators/Auth.d.ts +17 -0
  106. package/dist/decorators/Auth.d.ts.map +1 -1
  107. package/dist/decorators/Controller.d.ts +15 -0
  108. package/dist/decorators/Controller.d.ts.map +1 -1
  109. package/dist/decorators/Public.d.ts +13 -0
  110. package/dist/decorators/Public.d.ts.map +1 -1
  111. package/dist/decorators/Use.d.ts +18 -0
  112. package/dist/decorators/Use.d.ts.map +1 -1
  113. package/dist/decorators/methods.d.ts +20 -0
  114. package/dist/decorators/methods.d.ts.map +1 -1
  115. package/dist/express.cjs +73 -54
  116. package/dist/express.cjs.map +1 -1
  117. package/dist/express.js +73 -54
  118. package/dist/express.js.map +1 -1
  119. package/dist/http.d.ts +1 -2
  120. package/dist/http.d.ts.map +1 -1
  121. package/dist/index.cjs +161 -4
  122. package/dist/index.cjs.map +1 -1
  123. package/dist/index.d.ts +2 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +156 -3
  126. package/dist/index.js.map +1 -1
  127. package/dist/metal/applyListQuery.d.ts +73 -0
  128. package/dist/metal/applyListQuery.d.ts.map +1 -1
  129. package/dist/metal/index.cjs +2 -2
  130. package/dist/metal/index.cjs.map +1 -1
  131. package/dist/metal/index.d.ts +4 -0
  132. package/dist/metal/index.d.ts.map +1 -1
  133. package/dist/metal/index.js +2 -2
  134. package/dist/metal/index.js.map +1 -1
  135. package/dist/metal/listQuery.d.ts +19 -0
  136. package/dist/metal/listQuery.d.ts.map +1 -1
  137. package/dist/metal/queryOptions.d.ts +8 -0
  138. package/dist/metal/queryOptions.d.ts.map +1 -1
  139. package/dist/metal/readMetalBag.d.ts +36 -0
  140. package/dist/metal/readMetalBag.d.ts.map +1 -1
  141. package/dist/metal/registerMetalEntities.d.ts +20 -0
  142. package/dist/metal/registerMetalEntities.d.ts.map +1 -1
  143. package/dist/metal/schemaFromEntity.d.ts +30 -0
  144. package/dist/metal/schemaFromEntity.d.ts.map +1 -1
  145. package/dist/metal/searchWhere.d.ts +39 -0
  146. package/dist/metal/searchWhere.d.ts.map +1 -1
  147. package/dist/metal/symbolMetadata.d.ts +6 -0
  148. package/dist/metal/symbolMetadata.d.ts.map +1 -1
  149. package/dist/runtime/auth/runtime.d.ts +155 -6
  150. package/dist/runtime/auth/runtime.d.ts.map +1 -1
  151. package/dist/runtime/metadata/bucket.d.ts +1 -2
  152. package/dist/runtime/metadata/bucket.d.ts.map +1 -1
  153. package/dist/runtime/metadata/key.d.ts +1 -1
  154. package/dist/runtime/metadata/key.d.ts.map +1 -1
  155. package/dist/runtime/metadata/read.d.ts +1 -2
  156. package/dist/runtime/metadata/read.d.ts.map +1 -1
  157. package/dist/runtime/metadata/types.d.ts +74 -0
  158. package/dist/runtime/metadata/types.d.ts.map +1 -1
  159. package/dist/runtime/polyfill.d.ts +1 -1
  160. package/dist/runtime/polyfill.d.ts.map +1 -1
  161. package/dist/runtime/upload.d.ts +37 -0
  162. package/dist/runtime/upload.d.ts.map +1 -1
  163. package/dist/runtime/validation/ajv.d.ts +100 -0
  164. package/dist/runtime/validation/ajv.d.ts.map +1 -1
  165. package/dist/runtime/validation/index.d.ts +9 -0
  166. package/dist/runtime/validation/index.d.ts.map +1 -1
  167. package/dist/scripts/adorn-example.cjs +238 -6
  168. package/dist/scripts/adorn-example.cjs.map +1 -1
  169. package/dist/utils/port.d.ts +9 -0
  170. package/dist/utils/port.d.ts.map +1 -0
  171. package/package.json +4 -1
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/compiler/runner/createProgram.ts","../src/compiler/analyze/scanControllers.ts","../src/utils/operationId.ts","../src/compiler/schema/openapi.ts","../src/compiler/schema/typeToJsonSchema.ts","../src/compiler/schema/extractAnnotations.ts","../src/compiler/manifest/emit.ts","../src/compiler/validation/emitPrecompiledValidators.ts","../src/compiler/cache/isStale.ts","../src/compiler/cache/writeCache.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { writeFileSync, mkdirSync, rmSync, existsSync, readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { createProgramFromConfig } from \"./compiler/runner/createProgram.js\";\nimport { scanControllers } from \"./compiler/analyze/scanControllers.js\";\nimport { generateOpenAPI } from \"./compiler/schema/openapi.js\";\nimport { generateManifest } from \"./compiler/manifest/emit.js\";\nimport { emitPrecompiledValidators } from \"./compiler/validation/emitPrecompiledValidators.js\";\nimport { isStale } from \"./compiler/cache/isStale.js\";\nimport { writeCache } from \"./compiler/cache/writeCache.js\";\nimport ts from \"typescript\";\nimport process from \"node:process\";\n\nconst ADORN_VERSION = \"0.1.0\";\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\nfunction log(msg: string) {\n process.stdout.write(msg + \"\\n\");\n}\n\nfunction debug(...args: unknown[]) {\n if (process.env.ADORN_DEBUG) {\n console.error(\"[adorn-api]\", ...args);\n }\n}\n\nfunction sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) {\n return obj.map(item => sanitizeForJson(item));\n }\n \n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key.startsWith(\"__@\") || key.startsWith(\"[\")) continue;\n if (typeof value === \"function\") continue;\n if (value !== null && typeof value === \"object\") {\n const typeName = (value as any).constructor?.name;\n if (typeName && ![\"Object\", \"Array\", \"String\", \"Number\", \"Boolean\", \"Date\", \"RegExp\"].includes(typeName)) {\n continue;\n }\n }\n result[key] = sanitizeForJson(value);\n }\n return result;\n}\n\nasync function buildCommand(args: string[]) {\n const projectIndex = args.indexOf(\"-p\");\n const projectPath = projectIndex !== -1 ? args[projectIndex + 1] : \"./tsconfig.json\";\n const outputDir = args.includes(\"--output\")\n ? args[args.indexOf(\"--output\") + 1]\n : \".adorn\";\n const ifStale = args.includes(\"--if-stale\");\n \n const validationModeIndex = args.indexOf(\"--validation-mode\");\n const validationMode: ValidationMode = validationModeIndex !== -1 \n ? (args[validationModeIndex + 1] as ValidationMode) \n : \"ajv-runtime\";\n\n if (validationMode !== \"none\" && validationMode !== \"ajv-runtime\" && validationMode !== \"precompiled\") {\n console.error(`Invalid validation mode: ${validationMode}. Valid values: none, ajv-runtime, precompiled`);\n process.exit(1);\n }\n\n const outputPath = resolve(outputDir);\n\n if (ifStale) {\n const stale = await isStale({\n outDir: outputDir,\n project: projectPath,\n adornVersion: ADORN_VERSION,\n typescriptVersion: ts.version\n });\n\n if (!stale.stale) {\n log(\"adorn-api: artifacts up-to-date\");\n return;\n }\n\n log(`adorn-api: building artifacts (reason: ${stale.reason}${stale.detail ? `: ${stale.detail}` : \"\"})`);\n debug(\"Stale detail:\", stale.detail);\n } else {\n log(\"adorn-api: building artifacts (reason: forced-build)\");\n }\n\n const { program, checker, sourceFiles } = createProgramFromConfig(projectPath);\n const controllers = scanControllers(sourceFiles, checker);\n\n if (controllers.length === 0) {\n console.warn(\"No controllers found!\");\n process.exit(1);\n }\n\n log(`Found ${controllers.length} controller(s)`);\n\n const openapi = generateOpenAPI(controllers, checker, { title: \"API\", version: \"1.0.0\" });\n const manifest = generateManifest(controllers, checker, ADORN_VERSION, validationMode);\n\n mkdirSync(outputPath, { recursive: true });\n\n writeFileSync(resolve(outputPath, \"openapi.json\"), JSON.stringify(sanitizeForJson(openapi), null, 2));\n writeFileSync(resolve(outputPath, \"manifest.json\"), JSON.stringify(manifest, null, 2));\n\n if (validationMode === \"precompiled\") {\n log(\"Generating precompiled validators...\");\n \n const manifestObj = JSON.parse(readFileSync(resolve(outputPath, \"manifest.json\"), \"utf-8\"));\n \n await emitPrecompiledValidators({\n outDir: outputPath,\n openapi,\n manifest: manifestObj,\n strict: \"off\",\n formatsMode: \"full\"\n });\n\n manifestObj.validation = {\n mode: \"precompiled\",\n precompiledModule: \"./validators.mjs\"\n };\n \n writeFileSync(resolve(outputPath, \"manifest.json\"), JSON.stringify(manifestObj, null, 2));\n \n log(\" - validators.cjs\");\n log(\" - validators.mjs\");\n log(\" - validators.meta.json\");\n }\n\n writeCache({\n outDir: outputDir,\n tsconfigAbs: resolve(projectPath),\n program,\n adornVersion: ADORN_VERSION\n });\n\n log(`Written to ${outputPath}/`);\n log(\" - openapi.json\");\n log(\" - manifest.json\");\n log(\" - cache.json\");\n}\n\nfunction cleanCommand(args: string[]) {\n const outputDir = args.includes(\"--output\")\n ? args[args.indexOf(\"--output\") + 1]\n : \".adorn\";\n\n const outputPath = resolve(outputDir);\n\n if (existsSync(outputPath)) {\n rmSync(outputPath, { recursive: true, force: true });\n }\n\n log(`adorn-api: cleaned ${outputDir}`);\n}\n\nconst command = process.argv[2];\n\nif (command === \"build\") {\n buildCommand(process.argv.slice(3)).catch((err) => {\n console.error(err);\n process.exit(1);\n });\n} else if (command === \"clean\") {\n cleanCommand(process.argv.slice(3));\n} else {\n console.log(`\nadorn-api CLI\n\nCommands:\n build Generate OpenAPI and manifest from TypeScript source\n clean Remove generated artifacts\n\nOptions:\n -p <path> Path to tsconfig.json (default: ./tsconfig.json)\n --output <dir> Output directory (default: .adorn)\n --if-stale Only rebuild if artifacts are stale\n --validation-mode <mode> Validation mode: none, ajv-runtime, precompiled (default: ajv-runtime)\n\nExamples:\n adorn-api build -p ./tsconfig.json --output .adorn\n adorn-api build --if-stale\n adorn-api build --validation-mode precompiled\n adorn-api clean\n `);\n}\n","import ts from \"typescript\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\n\nexport interface ProgramContext {\n program: ts.Program;\n checker: ts.TypeChecker;\n sourceFiles: ts.SourceFile[];\n}\n\nexport function createProgramFromConfig(tsconfigPath: string): ProgramContext {\n const absolutePath = resolve(tsconfigPath);\n const configDir = dirname(absolutePath);\n\n const configFile = ts.readConfigFile(absolutePath, (path) => readFileSync(path, \"utf-8\"));\n if (configFile.error) {\n throw new Error(`Failed to read tsconfig: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, \"\\n\")}`);\n }\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, configDir);\n if (parsed.errors.length > 0) {\n const messages = parsed.errors.map(e => ts.flattenDiagnosticMessageText(e.messageText, \"\\n\"));\n throw new Error(`Failed to parse tsconfig:\\n${messages.join(\"\\n\")}`);\n }\n\n const program = ts.createProgram(parsed.fileNames, parsed.options);\n const checker = program.getTypeChecker();\n\n const sourceFiles = program.getSourceFiles().filter(sf =>\n !sf.isDeclarationFile &&\n !sf.fileName.includes(\"node_modules\")\n );\n\n return { program, checker, sourceFiles };\n}\n","import ts from \"typescript\";\nimport { defaultOperationId } from \"../../utils/operationId.js\";\n\nexport interface ScannedController {\n className: string;\n basePath: string;\n sourceFile: ts.SourceFile;\n classDeclaration: ts.ClassDeclaration;\n operations: ScannedOperation[];\n consumes?: string[];\n produces?: string[];\n}\n\nexport interface ScannedOperation {\n methodName: string;\n httpMethod: string;\n path: string;\n operationId: string;\n methodDeclaration: ts.MethodDeclaration;\n returnType: ts.Type;\n returnTypeNode?: ts.TypeNode;\n parameters: ScannedParameter[];\n pathParamIndices: number[];\n bodyParamIndex: number | null;\n queryParamIndices: number[];\n queryObjectParamIndex: number | null;\n headerObjectParamIndex: number | null;\n cookieObjectParamIndex: number | null;\n bodyContentType?: string;\n}\n\nexport interface ScannedParameter {\n name: string;\n index: number;\n type: ts.Type;\n isOptional: boolean;\n paramNode?: ts.ParameterDeclaration;\n}\n\nexport function scanControllers(\n sourceFiles: ts.SourceFile[],\n checker: ts.TypeChecker\n): ScannedController[] {\n const controllers: ScannedController[] = [];\n\n for (const sourceFile of sourceFiles) {\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n const controller = analyzeClass(node, sourceFile, checker);\n if (controller) {\n controllers.push(controller);\n }\n }\n });\n }\n\n return controllers;\n}\n\nfunction analyzeClass(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker\n): ScannedController | null {\n if (!node.name) return null;\n\n const controllerDecorator = findDecorator(node, \"Controller\");\n if (!controllerDecorator) return null;\n\n const basePath = extractDecoratorStringArg(controllerDecorator) ?? \"/\";\n const className = node.name.text;\n\n const consumes = extractClassConsumes(node, checker);\n const produces = extractClassProduces(node, checker);\n\n const operations: ScannedOperation[] = [];\n\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.name) {\n const operation = analyzeMethod(member, className, checker);\n if (operation) {\n operations.push(operation);\n }\n }\n }\n\n if (operations.length === 0) return null;\n\n return {\n className,\n basePath,\n sourceFile,\n classDeclaration: node,\n operations,\n consumes,\n produces,\n };\n}\n\nfunction extractClassConsumes(node: ts.ClassDeclaration, checker: ts.TypeChecker): string[] | undefined {\n const decorator = findDecorator(node, \"Consumes\");\n if (!decorator) return undefined;\n\n const callExpr = decorator.expression;\n if (!ts.isCallExpression(callExpr)) return undefined;\n const args = callExpr.arguments;\n if (args.length === 0) return undefined;\n\n const firstArg = args[0];\n if (ts.isStringLiteral(firstArg)) {\n return [firstArg.text];\n }\n if (ts.isArrayLiteralExpression(firstArg)) {\n return firstArg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n return undefined;\n}\n\nfunction extractClassProduces(node: ts.ClassDeclaration, checker: ts.TypeChecker): string[] | undefined {\n const decorator = findDecorator(node, \"Produces\");\n if (!decorator) return undefined;\n\n const callExpr = decorator.expression;\n if (!ts.isCallExpression(callExpr)) return undefined;\n const args = callExpr.arguments;\n if (args.length === 0) return undefined;\n\n const firstArg = args[0];\n if (ts.isStringLiteral(firstArg)) {\n return [firstArg.text];\n }\n if (ts.isArrayLiteralExpression(firstArg)) {\n return firstArg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n return undefined;\n}\n\nfunction analyzeMethod(\n node: ts.MethodDeclaration,\n className: string,\n checker: ts.TypeChecker\n): ScannedOperation | null {\n const methodName = ts.isIdentifier(node.name) ? node.name.text : null;\n if (!methodName) return null;\n\n const httpMethods = [\"Get\", \"Post\", \"Put\", \"Patch\", \"Delete\"];\n let httpMethod: string | null = null;\n let path = \"/\";\n\n for (const method of httpMethods) {\n const decorator = findDecorator(node, method);\n if (decorator) {\n httpMethod = method.toUpperCase();\n path = extractDecoratorStringArg(decorator) ?? \"/\";\n break;\n }\n }\n\n if (!httpMethod) return null;\n\n const signature = checker.getSignatureFromDeclaration(node);\n if (!signature) return null;\n\n let returnType = checker.getReturnTypeOfSignature(signature);\n returnType = unwrapPromise(returnType, checker);\n const returnTypeNode = unwrapPromiseTypeNode(node.type);\n\n const parameters: ScannedParameter[] = [];\n for (let i = 0; i < node.parameters.length; i++) {\n const param = node.parameters[i];\n const paramName = ts.isIdentifier(param.name) ? param.name.text : `arg${i}`;\n const paramType = checker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || !!param.initializer;\n\n parameters.push({\n name: paramName,\n index: i,\n type: paramType,\n isOptional,\n paramNode: param,\n });\n }\n\n const pathParamNames = extractPathParams(path);\n const pathParamIndices = matchPathParamsToIndices(pathParamNames, parameters);\n\n const { bodyParamIndex, queryParamIndices, queryObjectParamIndex, headerObjectParamIndex, cookieObjectParamIndex, bodyContentType } =\n classifyParameters(parameters, httpMethod, pathParamIndices, checker);\n\n return {\n methodName,\n httpMethod,\n path,\n operationId: defaultOperationId(className, methodName),\n methodDeclaration: node,\n returnType,\n returnTypeNode,\n parameters,\n pathParamIndices,\n bodyParamIndex,\n queryParamIndices,\n queryObjectParamIndex,\n headerObjectParamIndex,\n cookieObjectParamIndex,\n bodyContentType,\n };\n}\n\nfunction extractPathParams(path: string): string[] {\n const matches = path.match(/:([^/]+)/g);\n if (!matches) return [];\n return matches.map(m => m.slice(1));\n}\n\nfunction matchPathParamsToIndices(pathParamNames: string[], parameters: ScannedParameter[]): number[] {\n const indices: number[] = [];\n for (const name of pathParamNames) {\n const param = parameters.find(p => p.name === name);\n if (param) {\n indices.push(param.index);\n }\n }\n return indices;\n}\n\nfunction classifyParameters(\n parameters: ScannedParameter[],\n httpMethod: string,\n pathParamIndices: number[],\n checker: ts.TypeChecker\n): {\n bodyParamIndex: number | null;\n queryParamIndices: number[];\n queryObjectParamIndex: number | null;\n headerObjectParamIndex: number | null;\n cookieObjectParamIndex: number | null;\n bodyContentType: string | undefined;\n} {\n const usedIndices = new Set(pathParamIndices);\n const queryParamIndices: number[] = [];\n let bodyParamIndex: number | null = null;\n let queryObjectParamIndex: number | null = null;\n let headerObjectParamIndex: number | null = null;\n let cookieObjectParamIndex: number | null = null;\n\n const isBodyMethod = [\"POST\", \"PUT\", \"PATCH\"].includes(httpMethod);\n\n for (let i = 0; i < parameters.length; i++) {\n const param = parameters[i];\n if (usedIndices.has(i)) continue;\n\n const nonNullableType = checker.getNonNullableType(param.type);\n const typeStr = getTypeName(param.type) || getTypeName(nonNullableType);\n\n if (typeStr === \"Body\") {\n bodyParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Query\") {\n queryObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Headers\") {\n headerObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Cookies\") {\n cookieObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (isBodyMethod && bodyParamIndex === null) {\n bodyParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n const isObj = isObjectType(nonNullableType, checker);\n if (isObj && queryObjectParamIndex === null && !isBodyMethod) {\n queryObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n queryParamIndices.push(i);\n usedIndices.add(i);\n }\n\n return {\n bodyParamIndex,\n queryParamIndices,\n queryObjectParamIndex,\n headerObjectParamIndex,\n cookieObjectParamIndex,\n bodyContentType: undefined,\n };\n}\n\nfunction isObjectType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const objectFlags = (type.flags & ts.TypeFlags.Object) !== 0;\n const intersectionFlags = (type.flags & ts.TypeFlags.Intersection) !== 0;\n \n if (!objectFlags && !intersectionFlags) return false;\n\n const symbol = type.getSymbol();\n if (symbol?.getName() === \"__object\") return true;\n\n const properties = checker.getPropertiesOfType(type);\n if (properties.length > 0) return true;\n\n const callSigs = type.getCallSignatures?.();\n if (callSigs && callSigs.length > 0) return false;\n\n return true;\n}\n\nfunction getTypeName(type: ts.Type): string {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n if (aliasSymbol) return aliasSymbol.getName();\n const symbol = type.getSymbol();\n return symbol?.getName() ?? \"\";\n}\n\nfunction findDecorator(node: ts.HasDecorators, name: string): ts.Decorator | null {\n const decorators = ts.getDecorators(node);\n if (!decorators) return null;\n\n for (const decorator of decorators) {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n if (ts.isIdentifier(expr) && expr.text === name) {\n return decorator;\n }\n }\n }\n return null;\n}\n\nfunction extractDecoratorStringArg(decorator: ts.Decorator): string | null {\n if (ts.isCallExpression(decorator.expression)) {\n const arg = decorator.expression.arguments[0];\n if (arg && ts.isStringLiteral(arg)) {\n return arg.text;\n }\n }\n return null;\n}\n\nfunction unwrapPromise(type: ts.Type, checker: ts.TypeChecker): ts.Type {\n const symbol = type.getSymbol();\n if (symbol?.getName() === \"Promise\") {\n const typeArgs = (type as ts.TypeReference).typeArguments;\n if (typeArgs && typeArgs.length > 0) {\n return typeArgs[0];\n }\n }\n return type;\n}\n\nfunction unwrapPromiseTypeNode(typeNode?: ts.TypeNode): ts.TypeNode | undefined {\n if (!typeNode) return undefined;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName) && typeNode.typeName.text === \"Promise\") {\n return typeNode.typeArguments?.[0] ?? typeNode;\n }\n }\n\n return typeNode;\n}\n","export function defaultOperationId(controllerName: string, methodName: string): string {\n return `${controllerName}_${methodName}`;\n}\n","import ts from \"typescript\";\nimport type { ScannedController, ScannedOperation, ScannedParameter } from \"../analyze/scanControllers.js\";\nimport { typeToJsonSchema, createSchemaContext } from \"./typeToJsonSchema.js\";\nimport { extractPropertySchemaFragments, mergeFragments } from \"./extractAnnotations.js\";\nimport type { SchemaContext, JsonSchema } from \"./typeToJsonSchema.js\";\n\nexport interface OpenAPI31 {\n openapi: \"3.1.0\";\n info: {\n title: string;\n version: string;\n };\n components: {\n schemas: Record<string, JsonSchema>;\n };\n paths: Record<string, Record<string, any>>;\n}\n\nexport function generateOpenAPI(\n controllers: ScannedController[],\n checker: ts.TypeChecker,\n options: { title?: string; version?: string } = {}\n): OpenAPI31 {\n const components = new Map<string, JsonSchema>();\n const ctx: SchemaContext = {\n checker,\n components,\n typeStack: new Set(),\n typeNameStack: [],\n mode: \"response\",\n };\n\n const paths: Record<string, Record<string, any>> = {};\n\n for (const controller of controllers) {\n for (const operation of controller.operations) {\n const fullPath = convertToOpenApiPath(controller.basePath, operation.path);\n\n if (!paths[fullPath]) {\n paths[fullPath] = {};\n }\n\n const method = operation.httpMethod.toLowerCase();\n paths[fullPath][method] = buildOperation(operation, ctx, controller.consumes);\n }\n }\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: options.title ?? \"API\",\n version: options.version ?? \"1.0.0\",\n },\n components: {\n schemas: Object.fromEntries(components),\n },\n paths,\n };\n}\n\nfunction convertToOpenApiPath(basePath: string, path: string): string {\n const base = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n const converted = path.replace(/:([^/]+)/g, \"{$1}\");\n let fullPath = base + converted || \"/\";\n \n if (fullPath.endsWith(\"/\") && fullPath !== \"/\") {\n fullPath = fullPath.slice(0, -1);\n }\n \n return fullPath;\n}\n\nfunction buildOperation(operation: ScannedOperation, ctx: SchemaContext, controllerConsumes?: string[]): any {\n const op: any = {\n operationId: operation.operationId,\n responses: {},\n };\n\n const parameters: any[] = [];\n\n buildPathParameters(operation, ctx, parameters);\n buildQueryParameters(operation, ctx, parameters);\n buildHeaderParameters(operation, ctx, parameters);\n buildCookieParameters(operation, ctx, parameters);\n\n if (parameters.length > 0) {\n op.parameters = parameters;\n }\n\n const responseCtx = { ...ctx, mode: \"response\" as const };\n const responseSchema = typeToJsonSchema(operation.returnType, responseCtx, operation.returnTypeNode);\n\n const status = operation.httpMethod === \"POST\" ? 201 : 200;\n op.responses[status] = {\n description: status === 201 ? \"Created\" : \"OK\",\n content: {\n \"application/json\": {\n schema: responseSchema,\n },\n },\n };\n\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(operation.httpMethod) && operation.bodyParamIndex !== null) {\n const bodyParam = operation.parameters[operation.bodyParamIndex];\n if (bodyParam) {\n const requestCtx = { ...ctx, mode: \"request\" as const };\n let bodySchema = typeToJsonSchema(bodyParam.type, requestCtx);\n bodySchema = mergeBodySchemaAnnotations(bodyParam, requestCtx, bodySchema);\n\n const contentType = operation.bodyContentType ?? controllerConsumes?.[0] ?? \"application/json\";\n\n const requestBody: any = {\n required: !bodyParam.isOptional,\n content: {},\n };\n\n if (contentType === \"multipart/form-data\") {\n requestBody.content[\"multipart/form-data\"] = {\n schema: bodySchema,\n };\n } else {\n requestBody.content[contentType] = {\n schema: bodySchema,\n };\n }\n\n op.requestBody = requestBody;\n }\n }\n\n return op;\n}\n\nfunction mergeBodySchemaAnnotations(\n bodyParam: ScannedParameter,\n ctx: SchemaContext,\n schema: JsonSchema\n): JsonSchema {\n if (!schema.properties) return schema;\n\n const typeSymbol = bodyParam.type.getSymbol();\n if (!typeSymbol) return schema;\n\n const declarations = typeSymbol.getDeclarations();\n if (!declarations || declarations.length === 0) return schema;\n\n const classDecl = declarations[0];\n if (!ts.isClassDeclaration(classDecl)) return schema;\n\n const result = { ...schema };\n const props = { ...result.properties as Record<string, JsonSchema> };\n\n for (const member of classDecl.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue;\n\n const propName = ts.isIdentifier(member.name) ? member.name.text : null;\n if (!propName) continue;\n if (!props[propName]) continue;\n\n const frags = extractPropertySchemaFragments(ctx.checker, member);\n if (frags.length > 0) {\n props[propName] = mergeFragments(props[propName] as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n\n result.properties = props;\n return result;\n}\n\nfunction buildPathParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n for (const paramIndex of operation.pathParamIndices) {\n const param = operation.parameters[paramIndex];\n if (param) {\n let paramSchema = typeToJsonSchema(param.type, ctx);\n if (param.paramNode) {\n const frags = extractPropertySchemaFragments(ctx.checker, param.paramNode);\n if (frags.length > 0) {\n paramSchema = mergeFragments(paramSchema as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n \n const schema = paramSchema.$ref\n ? { $ref: paramSchema.$ref }\n : paramSchema;\n \n parameters.push({\n name: param.name,\n in: \"path\",\n required: !param.isOptional,\n schema,\n });\n }\n }\n}\n\nfunction isObjectLikeSchema(schema: JsonSchema, ctx: SchemaContext): boolean {\n const resolved = resolveSchemaRef(schema, ctx.components);\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isObjectLikeSchema(branch, ctx)) {\n return true;\n }\n }\n }\n \n if (resolved.type === \"array\" && resolved.items) {\n const itemsSchema = resolveSchemaRef(resolved.items, ctx.components);\n return isObjectLikeSchema(itemsSchema, ctx);\n }\n \n return false;\n}\n\nfunction resolveSchemaRef(schema: JsonSchema, components: Map<string, JsonSchema>): JsonSchema {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n const next = components.get(name);\n if (!next) return schema;\n\n return resolveSchemaRef(next, components);\n}\n\nfunction resolveAndCollectObjectProps(\n schema: JsonSchema,\n components: Map<string, JsonSchema>\n): { properties: Record<string, JsonSchema>; required: string[] } {\n const resolved = resolveSchemaRef(schema, components);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n \n const processSchema = (s: JsonSchema): void => {\n const current = resolveSchemaRef(s, components);\n \n if (current.properties) {\n for (const [key, val] of Object.entries(current.properties)) {\n if (!properties[key]) {\n properties[key] = val;\n }\n }\n }\n \n if (current.required) {\n for (const req of current.required) {\n if (!required.includes(req)) {\n required.push(req);\n }\n }\n }\n \n if (current.allOf) {\n for (const branch of current.allOf) {\n processSchema(branch);\n }\n }\n };\n \n processSchema(resolved);\n return { properties, required };\n}\n\nfunction buildQueryParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.queryObjectParamIndex !== null) {\n const queryParam = operation.parameters[operation.queryObjectParamIndex];\n if (!queryParam) return;\n \n const querySchema = typeToJsonSchema(queryParam.type, ctx);\n const { properties: queryObjProps, required: queryRequired } = \n resolveAndCollectObjectProps(querySchema, ctx.components);\n \n for (const [propName, propSchema] of Object.entries(queryObjProps)) {\n const isRequired = queryRequired.includes(propName) ?? false;\n \n const isObjectLike = isObjectLikeSchema(propSchema, ctx);\n const serialization = determineQuerySerialization(propSchema.type);\n \n if (isObjectLike) {\n parameters.push({\n name: propName,\n in: \"query\",\n required: isRequired,\n content: {\n \"application/json\": {\n schema: propSchema.$ref ? { $ref: propSchema.$ref } : propSchema,\n },\n },\n description: `URL-encoded JSON. Example: ${propName}=${encodeURIComponent(JSON.stringify({ example: \"value\" }))}`,\n });\n } else {\n const paramDef: any = {\n name: propName,\n in: \"query\",\n required: isRequired,\n schema: propSchema.$ref ? { $ref: propSchema.$ref } : propSchema,\n };\n \n if (propName === \"page\") {\n paramDef.schema = { type: \"integer\", default: 1, minimum: 1 };\n } else if (propName === \"pageSize\") {\n paramDef.schema = { type: \"integer\", default: 10, minimum: 1 };\n } else if (propName === \"totalItems\") {\n paramDef.schema = { type: \"integer\", minimum: 0 };\n } else if (propName === \"sort\") {\n paramDef.schema = {\n oneOf: [\n { type: \"string\" },\n { type: \"array\", items: { type: \"string\" } }\n ]\n };\n } else if (propName === \"q\") {\n paramDef.schema = { type: \"string\" };\n } else if (propName === \"hasComments\") {\n paramDef.schema = { type: \"boolean\" };\n }\n \n if (Object.keys(serialization).length > 0) {\n Object.assign(paramDef, serialization);\n }\n \n parameters.push(paramDef);\n }\n }\n }\n\n for (const paramIndex of operation.queryParamIndices) {\n const param = operation.parameters[paramIndex];\n if (param) {\n let paramSchema = typeToJsonSchema(param.type, ctx);\n if (param.paramNode) {\n const frags = extractPropertySchemaFragments(ctx.checker, param.paramNode);\n if (frags.length > 0) {\n paramSchema = mergeFragments(paramSchema as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n\n const isObjectLike = isObjectLikeSchema(paramSchema, ctx);\n \n if (isObjectLike) {\n parameters.push({\n name: param.name,\n in: \"query\",\n required: !param.isOptional,\n content: {\n \"application/json\": {\n schema: paramSchema.$ref ? { $ref: paramSchema.$ref } : paramSchema,\n },\n },\n });\n } else {\n const serialization = determineQuerySerialization(paramSchema.type);\n parameters.push({\n name: param.name,\n in: \"query\",\n required: !param.isOptional,\n schema: paramSchema.$ref ? { $ref: paramSchema.$ref } : paramSchema,\n ...(Object.keys(serialization).length > 0 ? serialization : {}),\n });\n }\n }\n }\n}\n\nfunction determineQuerySerialization(schemaType: string | string[] | undefined): { style?: string; explode?: boolean } {\n const typeArray = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n const isArray = typeArray.includes(\"array\");\n\n if (isArray) {\n return { style: \"form\", explode: true };\n }\n\n return {};\n}\n\nfunction buildHeaderParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.headerObjectParamIndex === null) return;\n\n const headerParam = operation.parameters[operation.headerObjectParamIndex];\n if (!headerParam) return;\n\n const headerSchema = typeToJsonSchema(headerParam.type, ctx);\n if (!headerSchema.properties) return;\n\n const headerObjProps = headerSchema.properties;\n for (const [propName, propSchema] of Object.entries(headerObjProps as Record<string, any>)) {\n const isRequired = headerSchema.required?.includes(propName) ?? false;\n parameters.push({\n name: propName,\n in: \"header\",\n required: isRequired,\n schema: propSchema,\n });\n }\n}\n\nfunction buildCookieParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.cookieObjectParamIndex === null) return;\n\n const cookieParam = operation.parameters[operation.cookieObjectParamIndex];\n if (!cookieParam) return;\n\n const cookieSchema = typeToJsonSchema(cookieParam.type, ctx);\n if (!cookieSchema.properties) return;\n\n const cookieObjProps = cookieSchema.properties;\n for (const [propName, propSchema] of Object.entries(cookieObjProps as Record<string, any>)) {\n const isRequired = cookieSchema.required?.includes(propName) ?? false;\n parameters.push({\n name: propName,\n in: \"cookie\",\n required: isRequired,\n schema: propSchema,\n style: \"form\",\n explode: true,\n });\n }\n}\n","import ts from \"typescript\";\n\nexport interface JsonSchema {\n type?: string | string[];\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n enum?: (string | number | boolean)[];\n $ref?: string;\n nullable?: boolean;\n description?: string;\n default?: unknown;\n examples?: unknown[];\n example?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n discriminator?: DiscriminatorObject;\n additionalProperties?: boolean | JsonSchema;\n unevaluatedProperties?: boolean | JsonSchema;\n format?: string;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minLength?: number;\n maxLength?: number;\n minItems?: number;\n maxItems?: number;\n minProperties?: number;\n maxProperties?: number;\n multipleOf?: number;\n const?: unknown;\n uniqueItems?: boolean;\n title?: string;\n readOnly?: boolean;\n \"x-metal-orm-entity\"?: string;\n \"x-metal-orm-mode\"?: string;\n \"x-metal-orm-rel\"?: Record<string, unknown>;\n \"x-ts-type\"?: string;\n}\n\nexport interface DiscriminatorObject {\n propertyName: string;\n mapping?: Record<string, string>;\n}\n\nexport interface SchemaContext {\n checker: ts.TypeChecker;\n components: Map<string, JsonSchema>;\n typeStack: Set<ts.Type>;\n typeNameStack: string[];\n mode?: \"request\" | \"response\";\n}\n\nexport function typeToJsonSchema(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n const { checker } = ctx;\n\n if (type.flags & ts.TypeFlags.Undefined) {\n return {};\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { type: \"null\" };\n }\n if (isDateType(type, checker)) {\n return { type: \"string\", format: \"date-time\" };\n }\n\n if (type.flags & ts.TypeFlags.String) {\n return { type: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return normalizeNumericType(type, checker, typeNode);\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { type: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.BigInt) {\n return {\n type: \"string\",\n format: \"int64\",\n pattern: \"^-?\\\\d+$\"\n };\n }\n\n if (type.flags & ts.TypeFlags.StringLiteral) {\n const value = (type as ts.StringLiteralType).value;\n return { type: \"string\", enum: [value] };\n }\n if (type.flags & ts.TypeFlags.NumberLiteral) {\n const value = (type as ts.NumberLiteralType).value;\n return { type: \"number\", enum: [value] };\n }\n if (type.flags & ts.TypeFlags.BooleanLiteral) {\n const intrinsic = (type as any).intrinsicName;\n return { type: \"boolean\", enum: [intrinsic === \"true\"] };\n }\n\n if (type.isUnion()) {\n return handleUnion(type, ctx, typeNode);\n }\n\n if (type.isIntersection()) {\n return handleIntersection(type, ctx, typeNode);\n }\n\n if (checker.isArrayType(type)) {\n const typeArgs = (type as ts.TypeReference).typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, ctx) : {};\n return {\n type: \"array\",\n items,\n uniqueItems: isSetType(type, checker) ? true : undefined,\n };\n }\n\n if (type.flags & ts.TypeFlags.Object) {\n return handleObjectType(type as ts.ObjectType, ctx, typeNode);\n }\n\n return {};\n}\n\nfunction isDateType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n const aliasSymbol = (type as any).aliasSymbol as ts.Symbol | undefined;\n if (aliasSymbol && (aliasSymbol.flags & ts.SymbolFlags.Alias)) {\n const aliased = checker.getAliasedSymbol(aliasSymbol);\n return aliased?.getName() === \"Date\";\n }\n\n if (symbol && (symbol.flags & ts.SymbolFlags.Alias)) {\n const aliased = checker.getAliasedSymbol(symbol);\n return aliased?.getName() === \"Date\";\n }\n\n return symbol?.getName() === \"Date\";\n}\n\nfunction isSetType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n if (!symbol) return false;\n const name = symbol.getName();\n if (name === \"Set\") return true;\n return false;\n}\n\nfunction getSchemaName(type: ts.Type, typeNode?: ts.TypeNode): string | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n const aliasName = aliasSymbol?.getName();\n if (aliasName && aliasName !== \"__type\") {\n return aliasName;\n }\n\n const symbol = type.getSymbol();\n const symbolName = symbol?.getName?.();\n if (symbolName && symbolName !== \"__type\") {\n return symbolName;\n }\n\n const nodeName = getExplicitTypeNameFromNode(typeNode);\n if (nodeName && nodeName !== \"__type\") {\n return nodeName;\n }\n\n return null;\n}\n\nfunction buildNamedSchema(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode: ts.TypeNode | undefined,\n build: () => JsonSchema\n): JsonSchema {\n const name = getSchemaName(type, typeNode);\n if (!name) {\n return build();\n }\n\n const { components, typeStack } = ctx;\n if (components.has(name) || typeStack.has(type)) {\n return { $ref: `#/components/schemas/${name}` };\n }\n\n typeStack.add(type);\n const schema = build();\n typeStack.delete(type);\n\n if (!components.has(name)) {\n components.set(name, schema);\n }\n\n return { $ref: `#/components/schemas/${name}` };\n}\n\nfunction handleUnion(\n type: ts.UnionType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n return buildNamedSchema(type, ctx, typeNode, () => {\n const types = type.types;\n const nullType = types.find(t => t.flags & ts.TypeFlags.Null);\n const otherTypes = types.filter(t => !(t.flags & ts.TypeFlags.Null) && !(t.flags & ts.TypeFlags.Undefined));\n\n const allStringLiterals = otherTypes.every(t => t.flags & ts.TypeFlags.StringLiteral);\n if (allStringLiterals && otherTypes.length > 0) {\n const enumValues = otherTypes.map(t => (t as ts.StringLiteralType).value);\n const schema: JsonSchema = { type: \"string\", enum: enumValues };\n if (nullType) {\n schema.type = [\"string\", \"null\"];\n }\n return schema;\n }\n\n if (otherTypes.length === 1 && nullType) {\n const innerSchema = typeToJsonSchema(otherTypes[0], ctx);\n if (typeof innerSchema.type === \"string\") {\n innerSchema.type = [innerSchema.type, \"null\"];\n }\n return innerSchema;\n }\n\n if (otherTypes.length > 1) {\n const branches = otherTypes.map(t => typeToJsonSchema(t, ctx));\n const hasNull = !!nullType;\n\n const result: JsonSchema = {};\n\n if (hasNull) {\n result.anyOf = [...branches, { type: \"null\" }];\n } else {\n result.anyOf = branches;\n }\n\n const discriminatorResult = detectDiscriminatedUnion(otherTypes, ctx, branches);\n if (discriminatorResult) {\n result.oneOf = branches;\n result.discriminator = discriminatorResult;\n }\n\n return result;\n }\n\n if (otherTypes.length === 1) {\n return typeToJsonSchema(otherTypes[0], ctx);\n }\n\n return {};\n });\n}\n\nfunction handleIntersection(\n type: ts.IntersectionType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n return buildNamedSchema(type, ctx, typeNode, () => {\n const types = type.types;\n const brandCollapsed = tryCollapseBrandedIntersection(types, ctx, typeNode);\n if (brandCollapsed) {\n return brandCollapsed;\n }\n\n const allOf: JsonSchema[] = [];\n for (const t of types) {\n allOf.push(typeToJsonSchema(t, ctx));\n }\n\n return { allOf };\n });\n}\n\nfunction tryCollapseBrandedIntersection(\n types: readonly ts.Type[],\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema | null {\n const { checker } = ctx;\n const parts = [...types];\n\n const prim = parts.find(isPrimitiveLike);\n if (!prim) return null;\n\n const rest = parts.filter(p => p !== prim);\n if (rest.every(r => isBrandObject(checker, r, ctx))) {\n return typeToJsonSchema(prim, ctx);\n }\n\n return null;\n}\n\nfunction isPrimitiveLike(t: ts.Type): boolean {\n return (t.flags & (ts.TypeFlags.String | ts.TypeFlags.Number | ts.TypeFlags.Boolean | ts.TypeFlags.BigInt)) !== 0\n || (t.flags & ts.TypeFlags.StringLiteral) !== 0\n || (t.flags & ts.TypeFlags.NumberLiteral) !== 0;\n}\n\nfunction isBrandObject(checker: ts.TypeChecker, t: ts.Type, ctx: SchemaContext): boolean {\n if (!(t.flags & ts.TypeFlags.Object)) return false;\n\n const props = t.getProperties();\n if (props.length === 0) return false;\n\n const allowed = new Set([\"__brand\", \"__type\", \"__tag\", \"brand\"]);\n for (const p of props) {\n if (!allowed.has(p.getName())) return false;\n }\n\n const callSigs = (t as ts.ObjectType).getCallSignatures?.();\n if (callSigs && callSigs.length > 0) return false;\n\n const constructSigs = (t as ts.ObjectType).getConstructSignatures?.();\n if (constructSigs && constructSigs.length > 0) return false;\n\n return true;\n}\n\nfunction detectDiscriminatedUnion(\n types: readonly ts.Type[],\n ctx: SchemaContext,\n branches: JsonSchema[]\n): DiscriminatorObject | null {\n if (types.length < 2) return null;\n\n const candidates = findCommonPropertyNames(ctx.checker, types);\n for (const propName of candidates) {\n const requiredInAll = types.every(t => isRequiredProperty(ctx.checker, t, propName));\n if (!requiredInAll) continue;\n\n const literalSets = types.map(t => getPropertyLiteralValues(ctx.checker, t, propName));\n if (literalSets.some(s => s === null)) continue;\n\n const allSets = literalSets as Array<Set<string>>;\n if (!areSetsDisjoint(allSets)) continue;\n\n const mapping: Record<string, string> = {};\n for (let i = 0; i < types.length; i++) {\n const branchName = getBranchSchemaName(types[i], ctx);\n for (const val of allSets[i]) {\n mapping[val] = `#/components/schemas/${branchName}`;\n }\n }\n\n return { propertyName: propName, mapping };\n }\n\n return null;\n}\n\nfunction findCommonPropertyNames(checker: ts.TypeChecker, types: readonly ts.Type[]): string[] {\n if (types.length === 0) return [];\n\n const firstProps = types[0].getProperties().map(s => s.getName());\n return firstProps.filter(name =>\n types.every(m => !!checker.getPropertyOfType(m, name))\n );\n}\n\nfunction isRequiredProperty(checker: ts.TypeChecker, type: ts.Type, propName: string): boolean {\n const sym = checker.getPropertyOfType(type, propName);\n if (!sym) return false;\n\n if (sym.flags & ts.SymbolFlags.Optional) return false;\n\n const propType = checker.getTypeOfSymbol(sym);\n if (propType.isUnion?.()) {\n const hasUndefined = propType.types.some(t => (t.flags & ts.TypeFlags.Undefined) !== 0);\n if (hasUndefined) return false;\n }\n\n return true;\n}\n\nfunction getPropertyLiteralValues(checker: ts.TypeChecker, type: ts.Type, propName: string): Set<string> | null {\n const sym = checker.getPropertyOfType(type, propName);\n if (!sym) return null;\n\n const propType = checker.getTypeOfSymbol(sym);\n\n if (propType.isStringLiteral?.()) {\n return new Set([(propType as ts.StringLiteralType).value]);\n }\n\n if (propType.isUnion?.()) {\n const values = new Set<string>();\n for (const m of propType.types) {\n if (!m.isStringLiteral?.()) return null;\n values.add((m as ts.StringLiteralType).value);\n }\n return values;\n }\n\n return null;\n}\n\nfunction areSetsDisjoint(sets: Array<Set<string>>): boolean {\n const seen = new Set<string>();\n for (const s of sets) {\n for (const v of s) {\n if (seen.has(v)) return false;\n seen.add(v);\n }\n }\n return true;\n}\n\nfunction getBranchSchemaName(type: ts.Type, ctx: SchemaContext): string {\n const symbol = type.getSymbol();\n if (symbol) {\n return symbol.getName();\n }\n\n const aliasSymbol = (type as any).aliasSymbol;\n if (aliasSymbol) {\n return aliasSymbol.getName();\n }\n\n return `Anonymous_${ctx.typeNameStack.length}`;\n}\n\nfunction handleObjectType(\n type: ts.ObjectType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n const { checker, components, typeStack, mode } = ctx;\n const symbol = type.getSymbol();\n const typeName = symbol?.getName?.() ?? getTypeNameFromNode(typeNode, ctx);\n\n if (isMetalOrmWrapperType(type, checker)) {\n return handleMetalOrmWrapper(type, ctx);\n }\n\n if (typeName && typeName !== \"__type\") {\n if (components.has(typeName)) {\n return { $ref: `#/components/schemas/${typeName}` };\n }\n\n if (typeStack.has(type)) {\n return { $ref: `#/components/schemas/${typeName}` };\n }\n\n typeStack.add(type);\n }\n\n const schema = buildObjectSchema(type, ctx, typeNode);\n\n if (typeName && typeName !== \"__type\") {\n typeStack.delete(type);\n \n const existing = components.get(typeName);\n if (!existing) {\n components.set(typeName, schema);\n }\n return { $ref: `#/components/schemas/${typeName}` };\n }\n\n typeStack.delete(type);\n return schema;\n}\n\nfunction getTypeId(type: ts.Type, typeName: string): string {\n const typeFlags = type.flags.toString();\n return `${typeName}_${typeFlags}`;\n}\n\nfunction getExplicitTypeNameFromNode(typeNode?: ts.TypeNode): string | null {\n if (!typeNode) return null;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName)) {\n return typeNode.typeName.text;\n }\n }\n\n if (ts.isTypeAliasDeclaration(typeNode.parent)) {\n if (ts.isIdentifier(typeNode.parent.name)) {\n return typeNode.parent.name.text;\n }\n }\n\n return null;\n}\n\nfunction shouldBeIntegerType(typeName: string | null): boolean {\n if (!typeName) return false;\n const lower = typeName.toLowerCase();\n return lower === \"id\" || lower.endsWith(\"id\") || lower === \"primarykey\" || lower === \"pk\";\n}\n\nfunction normalizeNumericType(type: ts.Type, checker: ts.TypeChecker, typeNode?: ts.TypeNode): JsonSchema {\n const typeName = getExplicitTypeNameFromNode(typeNode) ?? null;\n const symbol = getEffectiveSymbol(type, checker);\n const symbolName = symbol?.getName() ?? null;\n \n if (shouldBeIntegerType(typeName) || shouldBeIntegerType(symbolName)) {\n return { type: \"integer\" };\n }\n \n return { type: \"number\" };\n}\n\nfunction getTypeNameFromNode(typeNode: ts.TypeNode | undefined, ctx: SchemaContext): string {\n const explicitName = getExplicitTypeNameFromNode(typeNode);\n if (explicitName) return explicitName;\n\n return `Anonymous_${ctx.typeNameStack.length}`;\n}\n\nfunction buildObjectSchema(\n type: ts.ObjectType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n const { checker, mode } = ctx;\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const props = checker.getPropertiesOfType(type);\n for (const prop of props) {\n const propName = prop.getName();\n \n if (isIteratorOrSymbolProperty(propName)) {\n continue;\n }\n \n const propType = checker.getTypeOfSymbol(prop);\n if (isMethodLike(propType)) {\n continue;\n }\n\n const isOptional = !!(prop.flags & ts.SymbolFlags.Optional);\n const isRelation = isMetalOrmWrapperType(propType, checker);\n \n properties[propName] = typeToJsonSchema(propType, ctx);\n\n const shouldRequire = mode === \"response\"\n ? !isRelation && !isOptional\n : !isOptional;\n \n if (shouldRequire) {\n required.push(propName);\n }\n }\n\n const schema: JsonSchema = {\n type: \"object\",\n properties,\n };\n\n if (required.length > 0) {\n schema.required = required;\n }\n\n if (isRecordType(type, checker)) {\n const valueType = getRecordValueType(type, checker);\n if (valueType) {\n schema.additionalProperties = typeToJsonSchema(valueType, ctx);\n }\n }\n\n return schema;\n}\n\nfunction isRecordType(type: ts.ObjectType, checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n if (!symbol) return false;\n\n const name = symbol.getName();\n if (name === \"Record\") return true;\n\n return false;\n}\n\nfunction getRecordValueType(type: ts.ObjectType, checker: ts.TypeChecker): ts.Type | null {\n const symbol = type.getSymbol();\n if (!symbol) return null;\n\n const name = symbol.getName();\n if (name === \"Record\") {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n if (typeArgs && typeArgs.length >= 2) {\n return typeArgs[1];\n }\n }\n\n return null;\n}\n\nexport function createSchemaContext(checker: ts.TypeChecker, mode: \"request\" | \"response\" = \"response\"): SchemaContext {\n return {\n checker,\n components: new Map(),\n typeStack: new Set(),\n typeNameStack: [],\n mode,\n };\n}\n\nconst METAL_ORM_WRAPPER_NAMES = [\"HasManyCollection\", \"ManyToManyCollection\", \"BelongsToReference\", \"HasOneReference\"];\n\nfunction isMetalOrmWrapperType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const aliasSymbol = type.aliasSymbol || type.symbol;\n if (!aliasSymbol) return false;\n return METAL_ORM_WRAPPER_NAMES.includes(aliasSymbol.getName());\n}\n\nfunction getWrapperTypeName(type: ts.Type, checker: ts.TypeChecker): string | null {\n const symbol = getEffectiveSymbol(type, checker);\n if (!symbol) return null;\n const name = symbol.getName();\n return METAL_ORM_WRAPPER_NAMES.includes(name) ? name : null;\n}\n\nfunction getEffectiveSymbol(type: ts.Type, checker: ts.TypeChecker): ts.Symbol | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n if (aliasSymbol && (aliasSymbol.flags & ts.SymbolFlags.Alias)) {\n return checker.getAliasedSymbol(aliasSymbol);\n }\n return type.getSymbol() ?? null;\n}\n\nfunction isMethodLike(type: ts.Type): boolean {\n const callSigs = type.getCallSignatures?.();\n return !!(callSigs && callSigs.length > 0);\n}\n\nfunction isIteratorOrSymbolProperty(propName: string): boolean {\n return propName.startsWith(\"__@\") || propName.startsWith(\"[\") || propName === Symbol.iterator.toString();\n}\n\nfunction handleMetalOrmWrapper(type: ts.ObjectType, ctx: SchemaContext): JsonSchema {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const targetType = typeArgs?.[0] ?? null;\n \n const wrapperName = getWrapperTypeName(type, ctx.checker);\n if (!wrapperName) return {};\n \n const wrapperRel: Record<string, unknown> = { wrapper: wrapperName };\n \n if (wrapperName === \"HasManyCollection\" || wrapperName === \"ManyToManyCollection\") {\n const items = targetType ? typeToJsonSchema(targetType, ctx) : {};\n if (wrapperName === \"ManyToManyCollection\" && typeArgs?.[1]) {\n wrapperRel.pivot = typeArgs[1];\n }\n \n return {\n type: \"array\",\n items,\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n const targetSchema = targetType ? typeToJsonSchema(targetType, ctx) : {};\n return {\n ...targetSchema,\n \"x-metal-orm-rel\": wrapperRel,\n };\n}\n","import ts from \"typescript\";\n\nexport interface SchemaFragment {\n [key: string]: unknown;\n}\n\nexport function extractPropertySchemaFragments(\n checker: ts.TypeChecker,\n prop: ts.PropertyDeclaration | ts.ParameterDeclaration\n): SchemaFragment[] {\n if (!ts.canHaveDecorators(prop)) return [];\n\n const decs = ts.getDecorators(prop);\n if (!decs || decs.length === 0) return [];\n\n const frags: SchemaFragment[] = [];\n\n for (const d of decs) {\n const expr = d.expression;\n\n let callee: ts.Expression;\n let args: ts.NodeArray<ts.Expression>;\n\n if (ts.isCallExpression(expr)) {\n callee = expr.expression;\n args = expr.arguments;\n } else {\n callee = expr;\n args = ts.factory.createNodeArray([]);\n }\n\n const sym = checker.getSymbolAtLocation(callee);\n if (!sym) continue;\n\n const resolved = resolveImportedDecorator(checker, sym);\n if (!resolved || resolved.module !== \"adorn-api/schema\") continue;\n\n const name = resolved.name;\n\n if (name === \"Schema\") {\n const obj = args[0];\n if (obj && ts.isObjectLiteralExpression(obj)) {\n const frag = objectLiteralToJson(obj);\n if (frag) frags.push(frag);\n }\n continue;\n }\n\n if (name === \"Min\" && isNumberLiteral(args[0])) {\n frags.push({ minimum: Number(args[0].text) });\n } else if (name === \"Max\" && isNumberLiteral(args[0])) {\n frags.push({ maximum: Number(args[0].text) });\n } else if (name === \"ExclusiveMin\" && isNumberLiteral(args[0])) {\n frags.push({ exclusiveMinimum: Number(args[0].text) });\n } else if (name === \"ExclusiveMax\" && isNumberLiteral(args[0])) {\n frags.push({ exclusiveMaximum: Number(args[0].text) });\n } else if (name === \"MinLength\" && isNumberLiteral(args[0])) {\n frags.push({ minLength: Number(args[0].text) });\n } else if (name === \"MaxLength\" && isNumberLiteral(args[0])) {\n frags.push({ maxLength: Number(args[0].text) });\n } else if (name === \"Format\" && isStringLiteral(args[0])) {\n frags.push({ format: args[0].text });\n } else if (name === \"Pattern\") {\n const arg = args[0];\n if (arg && ts.isRegularExpressionLiteral(arg)) {\n frags.push({ pattern: extractRegexPattern(arg.text) });\n } else if (isStringLiteral(arg)) {\n frags.push({ pattern: arg.text });\n }\n } else if (name === \"MinItems\" && isNumberLiteral(args[0])) {\n frags.push({ minItems: Number(args[0].text) });\n } else if (name === \"MaxItems\" && isNumberLiteral(args[0])) {\n frags.push({ maxItems: Number(args[0].text) });\n } else if (name === \"MinProperties\" && isNumberLiteral(args[0])) {\n frags.push({ minProperties: Number(args[0].text) });\n } else if (name === \"MaxProperties\" && isNumberLiteral(args[0])) {\n frags.push({ maxProperties: Number(args[0].text) });\n } else if (name === \"MultipleOf\" && isNumberLiteral(args[0])) {\n frags.push({ multipleOf: Number(args[0].text) });\n } else if (name === \"Example\") {\n frags.push({ example: literalToJson(args[0]) });\n } else if (name === \"Examples\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ examples: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Description\" && isStringLiteral(args[0])) {\n frags.push({ description: args[0].text });\n } else if (name === \"Enum\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ enum: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Const\") {\n frags.push({ const: literalToJson(args[0]) });\n } else if (name === \"Default\") {\n frags.push({ default: literalToJson(args[0]) });\n } else if (name === \"AdditionalProperties\") {\n const arg = args[0];\n if (arg && (arg.kind === ts.SyntaxKind.FalseKeyword || arg.kind === ts.SyntaxKind.TrueKeyword)) {\n frags.push({ additionalProperties: arg.kind === ts.SyntaxKind.TrueKeyword });\n } else if (arg && ts.isObjectLiteralExpression(arg)) {\n const obj = objectLiteralToJson(arg);\n if (obj) frags.push({ additionalProperties: obj });\n }\n } else if (name === \"Closed\") {\n frags.push({ additionalProperties: false });\n } else if (name === \"ClosedUnevaluated\") {\n frags.push({ unevaluatedProperties: false });\n }\n }\n\n return frags;\n}\n\nfunction resolveImportedDecorator(\n checker: ts.TypeChecker,\n sym: ts.Symbol\n): { module: string; name: string } | null {\n const target = (sym.flags & ts.SymbolFlags.Alias) ? checker.getAliasedSymbol(sym) : sym;\n const name = target.getName();\n\n const decl = target.declarations?.[0];\n if (!decl) return null;\n\n const fileName = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n\n if (fileName.includes(\"/node_modules/adorn-api/\") || fileName.includes(\"/src/schema/\")) {\n return { module: \"adorn-api/schema\", name };\n }\n\n return null;\n}\n\nfunction isNumberLiteral(node: ts.Node | undefined): node is ts.NumericLiteral {\n return !!node && ts.isNumericLiteral(node);\n}\n\nfunction isStringLiteral(node: ts.Node | undefined): node is ts.StringLiteral {\n return !!node && ts.isStringLiteral(node);\n}\n\nfunction extractRegexPattern(text: string): string {\n const match = text.match(/^\\/(.+)\\/[gimsuy]*$/);\n return match ? match[1] : text;\n}\n\nfunction objectLiteralToJson(obj: ts.ObjectLiteralExpression): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const name = prop.name;\n let key: string;\n if (ts.isIdentifier(name)) {\n key = name.text;\n } else if (ts.isStringLiteral(name)) {\n key = name.text;\n } else {\n continue;\n }\n out[key] = literalToJson(prop.initializer);\n }\n return out;\n}\n\nfunction literalToJson(node: ts.Expression): unknown {\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isObjectLiteralExpression(node)) return objectLiteralToJson(node);\n if (ts.isArrayLiteralExpression(node)) return node.elements.map(e => literalToJson(e));\n return undefined;\n}\n\nexport function mergeFragments(base: Record<string, unknown>, ...frags: SchemaFragment[]): Record<string, unknown> {\n const result = { ...base };\n for (const frag of frags) {\n Object.assign(result, frag);\n }\n return result;\n}\n\nexport function extractJSDocDescription(checker: ts.TypeChecker, node: ts.Node): string | undefined {\n const sourceFile = node.getSourceFile();\n const docComments = ts.getLeadingCommentRanges(sourceFile.fileName, node.pos);\n if (!docComments || docComments.length === 0) return undefined;\n\n const sourceText = sourceFile.getText();\n let fullComment = \"\";\n\n for (const commentRange of docComments) {\n const comment = sourceText.substring(commentRange.pos, commentRange.end);\n const cleanComment = comment\n .replace(/^\\/\\*\\*/, \"\")\n .replace(/\\*\\/$/, \"\")\n .replace(/^\\s*\\*\\s?/gm, \"\")\n .trim();\n fullComment += cleanComment + \"\\n\";\n }\n\n return fullComment.trim() || undefined;\n}\n\nexport function extractJSDocTags(checker: ts.TypeChecker, node: ts.Node): Record<string, unknown> {\n const tags: Record<string, unknown> = {};\n\n const jsDocTags = ts.getJSDocTags(node);\n if (!jsDocTags) return tags;\n\n for (const tag of jsDocTags) {\n const tagName = tag.tagName.text;\n\n if (tagName === \"example\") {\n const exampleComment = getTagComment(tag);\n if (exampleComment) {\n const existing = (tags.examples as string[]) ?? [];\n tags.examples = [...existing, exampleComment];\n }\n } else if (tagName === \"default\") {\n const defaultComment = getTagComment(tag);\n if (defaultComment) {\n tags.default = parseDefaultValue(defaultComment);\n }\n } else if (tagName === \"description\") {\n const desc = getTagComment(tag);\n if (desc) {\n tags.description = desc;\n }\n } else if (tagName === \"deprecated\") {\n tags.deprecated = true;\n }\n }\n\n return tags;\n}\n\nfunction getTagComment(tag: ts.JSDocTag): string | undefined {\n const comment = tag.comment;\n if (typeof comment === \"string\") {\n return comment.trim();\n }\n if (comment && Array.isArray(comment) && comment.length > 0) {\n return comment.map(c => typeof c === \"string\" ? c : c.text).join(\" \").trim();\n }\n return undefined;\n}\n\nfunction parseDefaultValue(comment: string): unknown {\n const trimmed = comment.trim();\n\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n\n const num = Number(trimmed);\n if (!isNaN(num) && trimmed === num.toString()) return num;\n\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n\n return trimmed;\n}\n\nexport function extractClassSchemaFragments(\n checker: ts.TypeChecker,\n classDecl: ts.ClassDeclaration\n): SchemaFragment[] {\n const frags: SchemaFragment[] = [];\n\n if (!ts.canHaveDecorators(classDecl)) return [];\n\n const decs = ts.getDecorators(classDecl);\n if (!decs || decs.length === 0) return frags;\n\n for (const d of decs) {\n const expr = d.expression;\n\n let callee: ts.Expression;\n let args: ts.NodeArray<ts.Expression>;\n\n if (ts.isCallExpression(expr)) {\n callee = expr.expression;\n args = expr.arguments;\n } else {\n callee = expr;\n args = ts.factory.createNodeArray([]);\n }\n\n const sym = checker.getSymbolAtLocation(callee);\n if (!sym) continue;\n\n const resolved = resolveImportedDecorator(checker, sym);\n if (!resolved || resolved.module !== \"adorn-api/schema\") continue;\n\n const name = resolved.name;\n\n if (name === \"Schema\") {\n const obj = args[0];\n if (obj && ts.isObjectLiteralExpression(obj)) {\n const frag = objectLiteralToJson(obj);\n if (frag) frags.push(frag);\n }\n } else if (name === \"Description\" && isStringLiteral(args[0])) {\n frags.push({ description: args[0].text });\n } else if (name === \"Example\") {\n frags.push({ example: literalToJson(args[0]) });\n } else if (name === \"Examples\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ examples: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Closed\") {\n frags.push({ additionalProperties: false });\n } else if (name === \"ClosedUnevaluated\") {\n frags.push({ unevaluatedProperties: false });\n }\n }\n\n const jsDocDesc = extractJSDocDescription(checker, classDecl);\n if (jsDocDesc) {\n frags.push({ description: jsDocDesc });\n }\n\n const jsDocTags = extractJSDocTags(checker, classDecl);\n if (Object.keys(jsDocTags).length > 0) {\n frags.push(jsDocTags);\n }\n\n return frags;\n}\n","import type { ScannedController, ScannedOperation } from \"../analyze/scanControllers.js\";\nimport type { ManifestV1, ControllerEntry, OperationEntry, ArgsSpec, HttpMethod } from \"./format.js\";\nimport { typeToJsonSchema } from \"../schema/typeToJsonSchema.js\";\nimport type { SchemaContext, JsonSchema } from \"../schema/typeToJsonSchema.js\";\nimport ts from \"typescript\";\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\nexport function generateManifest(\n controllers: ScannedController[],\n checker: ts.TypeChecker,\n version: string,\n validationMode: ValidationMode = \"ajv-runtime\"\n): ManifestV1 {\n const components = new Map<string, any>();\n const ctx: SchemaContext = {\n checker,\n components,\n typeStack: new Set(),\n typeNameStack: [],\n mode: \"request\",\n };\n\n const controllerEntries: ControllerEntry[] = controllers.map(ctrl => ({\n controllerId: ctrl.className,\n basePath: ctrl.basePath,\n operations: ctrl.operations.map(op => buildOperationEntry(op, ctx)),\n }));\n\n const validationConfig: { mode: \"none\" | \"ajv-runtime\" | \"precompiled\"; precompiledModule: string | null } =\n validationMode === \"precompiled\"\n ? { mode: \"precompiled\", precompiledModule: null }\n : validationMode === \"none\"\n ? { mode: \"none\", precompiledModule: null }\n : { mode: \"ajv-runtime\", precompiledModule: null };\n\n return {\n manifestVersion: 1,\n generatedAt: new Date().toISOString(),\n generator: {\n name: \"adorn-api\",\n version,\n typescript: ts.version,\n },\n schemas: {\n kind: \"openapi-3.1\",\n file: \"./openapi.json\",\n componentsSchemasPointer: \"/components/schemas\",\n },\n validation: validationConfig,\n controllers: controllerEntries,\n };\n}\n\nfunction resolveSchemaRef(schema: JsonSchema, components: Map<string, JsonSchema>): JsonSchema {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n const next = components.get(name);\n if (!next) return schema;\n\n return resolveSchemaRef(next, components);\n}\n\nfunction resolveAndCollectObjectProps(\n schema: JsonSchema,\n components: Map<string, JsonSchema>\n): { properties: Record<string, JsonSchema>; required: string[] } {\n const resolved = resolveSchemaRef(schema, components);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n \n const processSchema = (s: JsonSchema): void => {\n const current = resolveSchemaRef(s, components);\n \n if (current.properties) {\n for (const [key, val] of Object.entries(current.properties)) {\n if (!properties[key]) {\n properties[key] = val;\n }\n }\n }\n \n if (current.required) {\n for (const req of current.required) {\n if (!required.includes(req)) {\n required.push(req);\n }\n }\n }\n \n if (current.allOf) {\n for (const branch of current.allOf) {\n processSchema(branch);\n }\n }\n };\n \n processSchema(resolved);\n return { properties, required };\n}\n\nfunction isObjectLikeSchema(schema: JsonSchema, components: Map<string, JsonSchema>): boolean {\n const resolved = resolveSchemaRef(schema, components);\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isObjectLikeSchema(branch, components)) {\n return true;\n }\n }\n }\n \n if (resolved.type === \"array\" && resolved.items) {\n const itemsSchema = resolveSchemaRef(resolved.items, components);\n return isObjectLikeSchema(itemsSchema, components);\n }\n \n return false;\n}\n\nfunction buildOperationEntry(op: ScannedOperation, ctx: SchemaContext): OperationEntry {\n const args: ArgsSpec = {\n body: null,\n path: [],\n query: [],\n headers: [],\n cookies: [],\n };\n\n buildPathArgs(op, ctx, args);\n buildQueryArgs(op, ctx, args);\n buildHeaderArgs(op, ctx, args);\n buildCookieArgs(op, ctx, args);\n\n if (op.bodyParamIndex !== null) {\n const bodyParam = op.parameters[op.bodyParamIndex];\n if (bodyParam) {\n const bodySchema = typeToJsonSchema(bodyParam.type, ctx);\n const schemaRef = bodySchema.$ref ?? \"#/components/schemas/InlineBody\";\n\n args.body = {\n index: bodyParam.index,\n required: !bodyParam.isOptional,\n contentType: op.bodyContentType ?? \"application/json\",\n schemaRef,\n };\n }\n }\n\n const responseSchema = typeToJsonSchema(op.returnType, ctx, op.returnTypeNode);\n const status = op.httpMethod === \"POST\" ? 201 : 200;\n\n let schemaRef = responseSchema.$ref;\n let isArray = false;\n\n if (!schemaRef && responseSchema.type === \"array\" && responseSchema.items?.$ref) {\n schemaRef = responseSchema.items.$ref;\n isArray = true;\n } else if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineResponse\";\n }\n\n return {\n operationId: op.operationId,\n http: {\n method: op.httpMethod as HttpMethod,\n path: op.path,\n },\n handler: {\n methodName: op.methodName,\n },\n args,\n responses: [\n {\n status,\n contentType: \"application/json\",\n schemaRef,\n isArray,\n },\n ],\n };\n}\n\nfunction buildPathArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n for (const paramIndex of op.pathParamIndices) {\n const param = op.parameters[paramIndex];\n if (param) {\n const paramSchema = typeToJsonSchema(param.type, ctx);\n\n args.path.push({\n name: param.name,\n index: param.index,\n required: !param.isOptional,\n schemaRef: paramSchema.$ref ?? \"#/components/schemas/InlinePathParam\",\n schemaType: paramSchema.type,\n });\n }\n }\n}\n\nfunction buildQueryArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.queryObjectParamIndex !== null) {\n const queryParam = op.parameters[op.queryObjectParamIndex];\n if (!queryParam) return;\n\n const querySchema = typeToJsonSchema(queryParam.type, ctx);\n const { properties: queryObjProps, required: queryRequired } = \n resolveAndCollectObjectProps(querySchema, ctx.components);\n \n for (const [propName, propSchema] of Object.entries(queryObjProps)) {\n const isRequired = queryRequired.includes(propName) ?? false;\n const isObjectLike = isObjectLikeSchema(propSchema, ctx.components);\n \n let schemaRef = (propSchema as any).$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineQueryParam\";\n }\n\n args.query.push({\n name: propName,\n index: queryParam.index,\n required: !isRequired,\n schemaRef,\n schemaType: (propSchema as any).type,\n content: isObjectLike ? \"application/json\" : undefined,\n });\n }\n }\n\n for (const paramIndex of op.queryParamIndices) {\n const param = op.parameters[paramIndex];\n if (param) {\n const paramSchema = typeToJsonSchema(param.type, ctx);\n const isObjectLike = isObjectLikeSchema(paramSchema, ctx.components);\n const schemaRef = (paramSchema as any).$ref ?? \"#/components/schemas/InlineQueryParam\";\n\n args.query.push({\n name: param.name,\n index: param.index,\n required: !param.isOptional,\n schemaRef,\n schemaType: (paramSchema as any).type,\n content: isObjectLike ? \"application/json\" : undefined,\n });\n }\n }\n}\n\nfunction buildHeaderArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.headerObjectParamIndex === null) return;\n\n const headerParam = op.parameters[op.headerObjectParamIndex];\n if (!headerParam) return;\n\n const headerSchema = typeToJsonSchema(headerParam.type, ctx);\n if (!headerSchema.properties) return;\n\n for (const [propName, propSchema] of Object.entries(headerSchema.properties as Record<string, any>)) {\n const isRequired = headerSchema.required?.includes(propName) ?? false;\n let schemaRef = propSchema.$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineHeaderParam\";\n }\n\n args.headers.push({\n name: propName,\n index: headerParam.index,\n required: !isRequired,\n schemaRef,\n schemaType: propSchema.type,\n });\n }\n}\n\nfunction buildCookieArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.cookieObjectParamIndex === null) return;\n\n const cookieParam = op.parameters[op.cookieObjectParamIndex];\n if (!cookieParam) return;\n\n const cookieSchema = typeToJsonSchema(cookieParam.type, ctx);\n if (!cookieSchema.properties) return;\n\n for (const [propName, propSchema] of Object.entries(cookieSchema.properties as Record<string, any>)) {\n const isRequired = cookieSchema.required?.includes(propName) ?? false;\n let schemaRef = propSchema.$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineCookieParam\";\n }\n\n args.cookies.push({\n name: propName,\n index: cookieParam.index,\n required: !isRequired,\n schemaRef,\n schemaType: propSchema.type,\n serialization: { style: \"form\", explode: true },\n });\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport type { AnySchema } from \"ajv\";\n\ninterface OpenApi {\n openapi: string;\n components?: {\n schemas?: Record<string, unknown>;\n };\n}\n\ninterface Manifest {\n manifestVersion: number;\n controllers: Array<{\n controllerId: string;\n basePath: string;\n operations: Array<{\n operationId: string;\n args: {\n body?: {\n schemaRef: string;\n contentType: string;\n } | null;\n response?: Array<{\n status: number;\n contentType: string;\n schemaRef?: string;\n }>;\n };\n responses: Array<{\n status: number;\n contentType: string;\n schemaRef: string;\n }>;\n }>;\n }>;\n}\n\nconst OAS_SCHEMA_ONLY = new Set([\"discriminator\", \"xml\", \"externalDocs\", \"example\"]);\n\nfunction sanitizeSchemaForAjv(schema: unknown): unknown {\n if (schema == null || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(sanitizeSchemaForAjv);\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema as Record<string, unknown>)) {\n if (OAS_SCHEMA_ONLY.has(k)) continue;\n if (k.startsWith(\"x-\")) continue;\n out[k] = sanitizeSchemaForAjv(v);\n }\n return out;\n}\n\nfunction rewriteComponentRefs(schema: unknown): unknown {\n if (schema == null || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(rewriteComponentRefs);\n\n if (typeof (schema as Record<string, unknown>).$ref === \"string\") {\n const ref = (schema as Record<string, unknown>).$ref as string;\n const m = ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n if (m) {\n return { ...schema, $ref: m[1] };\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema as Record<string, unknown>)) {\n out[k] = rewriteComponentRefs(v);\n }\n return out;\n}\n\nfunction safeId(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, \"_\").replace(/^[^A-Za-z_]/, \"_$&\");\n}\n\nfunction schemaNameFromRef(schemaRef: string): string {\n return schemaRef.replace(/^#\\/components\\/schemas\\//, \"\");\n}\n\nexport interface EmitPrecompiledValidatorsOptions {\n outDir: string;\n openapi: OpenApi;\n manifest: Manifest;\n strict?: \"off\" | \"log\" | \"error\";\n formatsMode?: \"fast\" | \"full\";\n}\n\nexport async function emitPrecompiledValidators(opts: EmitPrecompiledValidatorsOptions): Promise<{\n validatorsCjsPath: string;\n validatorsEsmPath: string;\n hash: string;\n}> {\n const outDir = opts.outDir;\n const cjsPath = path.join(outDir, \"validators.cjs\");\n const esmPath = path.join(outDir, \"validators.mjs\");\n const metaPath = path.join(outDir, \"validators.meta.json\");\n\n fs.mkdirSync(outDir, { recursive: true });\n\n const schemas: AnySchema[] = [];\n\n for (const [name, sch] of Object.entries(opts.openapi.components?.schemas ?? {})) {\n const clean = rewriteComponentRefs(sanitizeSchemaForAjv(sch));\n schemas.push({ ...(clean as object), $id: name } as AnySchema);\n }\n\n const opIndex: Record<string, { body?: string; response: Record<string, string> }> = {};\n\n for (const ctrl of opts.manifest.controllers ?? []) {\n for (const op of ctrl.operations ?? []) {\n const entry: { body?: string; response: Record<string, string> } = { response: {} };\n opIndex[op.operationId] = entry;\n\n if (op.args.body?.schemaRef) {\n const typeName = schemaNameFromRef(op.args.body.schemaRef);\n const id = safeId(`op_${op.operationId}_body`);\n schemas.push({ $id: id, $ref: typeName } as AnySchema);\n entry.body = id;\n }\n\n for (const r of op.responses ?? []) {\n if (!r.schemaRef) continue;\n const typeName = schemaNameFromRef(r.schemaRef);\n const key = `${r.status}|${r.contentType}`;\n const id = safeId(`op_${op.operationId}_res_${r.status}_${r.contentType}`);\n schemas.push({ $id: id, $ref: typeName } as AnySchema);\n entry.response[key] = id;\n }\n }\n }\n\n const strictOpt = opts.strict === \"off\" ? false : opts.strict === \"log\" ? \"log\" : true;\n\n const ajv = new Ajv.default({\n schemas,\n allErrors: true,\n strict: strictOpt,\n code: { source: true },\n });\n\n addFormats.default(ajv, { mode: opts.formatsMode ?? \"full\" });\n\n let cjs: string;\n const standaloneModule = require(\"ajv/dist/standalone\");\n if (typeof standaloneModule === \"function\") {\n cjs = standaloneModule(ajv);\n } else if (standaloneModule && typeof standaloneModule.default === \"function\") {\n cjs = standaloneModule.default(ajv);\n } else {\n throw new Error(\"Unable to find standalone code generator in ajv/dist/standalone\");\n }\n\n cjs += \"\\n\\n// --- adorn-api operation lookup (generated) ---\\n\";\n cjs += \"exports.validators = {\\n\";\n for (const [operationId, v] of Object.entries(opIndex)) {\n cjs += ` ${JSON.stringify(operationId)}: {\\n`;\n cjs += ` body: ${v.body ? `exports[${JSON.stringify(v.body)}]` : \"undefined\"},\\n`;\n cjs += ` response: {\\n`;\n for (const [key, id] of Object.entries(v.response)) {\n cjs += ` ${JSON.stringify(key)}: exports[${JSON.stringify(id)}],\\n`;\n }\n cjs += ` }\\n`;\n cjs += ` },\\n`;\n }\n cjs += \"};\\n\";\n\n fs.writeFileSync(cjsPath, cjs, \"utf8\");\n\n const esm = `// .adorn/validators.mjs (generated)\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst cjs = require(\"./validators.cjs\");\n\nexport const validators = cjs.validators;\n\nexport function validateBody(operationId, data) {\n const v = validators?.[operationId]?.body;\n if (!v) return { ok: true, errors: null };\n const ok = v(data);\n return { ok, errors: ok ? null : v.errors };\n}\n\nexport function validateResponse(operationId, status, contentType, data) {\n const key = String(status) + \"|\" + String(contentType);\n const v = validators?.[operationId]?.response?.[key];\n if (!v) return { ok: true, errors: null };\n const ok = v(data);\n return { ok, errors: ok ? null : v.errors };\n}\n`;\n fs.writeFileSync(esmPath, esm, \"utf8\");\n\n const hash = crypto.createHash(\"sha256\").update(cjs).digest(\"hex\");\n fs.writeFileSync(metaPath, JSON.stringify({ hash }, null, 2), \"utf8\");\n\n return { validatorsCjsPath: cjsPath, validatorsEsmPath: esmPath, hash };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport ts from \"typescript\";\nimport type { AdornCacheV1 } from \"./schema.js\";\n\nexport type StaleResult =\n | { stale: false; reason: \"up-to-date\" }\n | { stale: true; reason: string; detail?: string };\n\nfunction readJson<T>(p: string): T | null {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nfunction statMtimeMs(p: string): number | null {\n try {\n return fs.statSync(p).mtimeMs;\n } catch {\n return null;\n }\n}\n\nfunction ensureAbs(p: string): string {\n return path.isAbsolute(p) ? p : path.resolve(p);\n}\n\nexport function collectTsconfigChain(tsconfigPathAbs: string): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n function visit(pAbs: string) {\n if (seen.has(pAbs)) return;\n seen.add(pAbs);\n out.push(pAbs);\n\n const raw = readJson<any>(pAbs);\n const ext = raw?.extends;\n if (!ext) return;\n\n let resolved: string | null = null;\n\n if (ext.startsWith(\".\") || ext.startsWith(\"/\") || /^[A-Za-z]:\\\\/.test(ext)) {\n resolved = ensureAbs(path.resolve(path.dirname(pAbs), ext));\n if (!resolved.endsWith(\".json\")) resolved += \".json\";\n } else {\n try {\n const req = (module as any).createRequire?.(import.meta.url) ?? require;\n resolved = req.resolve(ext);\n } catch {\n try {\n const req = (module as any).createRequire?.(import.meta.url) ?? require;\n resolved = req.resolve(ext.endsWith(\".json\") ? ext : `${ext}.json`);\n } catch {\n resolved = null;\n }\n }\n }\n\n if (resolved) visit(resolved);\n }\n\n visit(tsconfigPathAbs);\n return out;\n}\n\nexport function findLockfile(startDir: string): { path: string; mtimeMs: number } | null {\n const names = [\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\"];\n let dir = startDir;\n\n for (let i = 0; i < 20; i++) {\n for (const n of names) {\n const p = path.join(dir, n);\n const mt = statMtimeMs(p);\n if (mt != null) return { path: p, mtimeMs: mt };\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\nexport async function isStale(params: {\n outDir: string;\n project: string;\n adornVersion: string;\n typescriptVersion: string;\n}): Promise<StaleResult> {\n const outDirAbs = ensureAbs(params.outDir);\n const tsconfigAbs = ensureAbs(params.project);\n\n const manifestPath = path.join(outDirAbs, \"manifest.json\");\n const cachePath = path.join(outDirAbs, \"cache.json\");\n\n if (!fs.existsSync(manifestPath)) return { stale: true, reason: \"missing-manifest\" };\n\n const cache = readJson<AdornCacheV1>(cachePath);\n if (!cache) return { stale: true, reason: \"missing-cache\" };\n\n if (cache.generator.version !== params.adornVersion) {\n return { stale: true, reason: \"generator-version-changed\", detail: `${cache.generator.version} -> ${params.adornVersion}` };\n }\n\n if (ensureAbs(cache.project.tsconfigPath) !== tsconfigAbs) {\n return { stale: true, reason: \"tsconfig-changed\", detail: \"different project path\" };\n }\n\n const chain = collectTsconfigChain(tsconfigAbs);\n for (const cfg of chain) {\n const mt = statMtimeMs(cfg);\n if (mt == null) return { stale: true, reason: \"config-missing\", detail: cfg };\n\n const cachedMt = cache.project.configFiles[cfg];\n if (cachedMt == null || Math.abs(cachedMt - mt) > 0.0001) {\n return { stale: true, reason: \"config-updated\", detail: cfg };\n }\n }\n\n if (cache.project.lockfile?.path) {\n const mt = statMtimeMs(cache.project.lockfile.path);\n if (mt == null) return { stale: true, reason: \"lockfile-missing\", detail: cache.project.lockfile.path };\n\n if (Math.abs(cache.project.lockfile.mtimeMs - mt) > 0.0001) {\n return { stale: true, reason: \"lockfile-updated\", detail: cache.project.lockfile.path };\n }\n }\n\n for (const [file, cachedMt] of Object.entries(cache.inputs)) {\n const mt = statMtimeMs(file);\n if (mt == null) return { stale: true, reason: \"input-missing\", detail: file };\n if (Math.abs(cachedMt - mt) > 0.0001) return { stale: true, reason: \"input-updated\", detail: file };\n }\n\n return { stale: false, reason: \"up-to-date\" };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport ts from \"typescript\";\nimport { collectTsconfigChain, findLockfile } from \"./isStale.js\";\nimport type { AdornCacheV1 } from \"./schema.js\";\n\nfunction statMtimeMs(p: string): number {\n return fs.statSync(p).mtimeMs;\n}\n\nfunction ensureDir(p: string) {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction isProjectSourceFile(f: string): boolean {\n if (f.includes(`${path.sep}node_modules${path.sep}`)) return false;\n if (f.includes(`${path.sep}typescript${path.sep}lib${path.sep}`)) return false;\n return /\\.(ts|tsx|mts|cts)$/.test(f);\n}\n\nexport function writeCache(params: {\n outDir: string;\n tsconfigAbs: string;\n program: ts.Program;\n adornVersion: string;\n}): void {\n const outDirAbs = path.isAbsolute(params.outDir) ? params.outDir : path.resolve(params.outDir);\n ensureDir(outDirAbs);\n\n const configFiles = collectTsconfigChain(params.tsconfigAbs);\n const configMtimes: Record<string, number> = {};\n for (const cfg of configFiles) configMtimes[cfg] = statMtimeMs(cfg);\n\n const lock = findLockfile(path.dirname(params.tsconfigAbs));\n\n const inputs: Record<string, number> = {};\n for (const sf of params.program.getSourceFiles()) {\n const f = sf.fileName;\n if (!isProjectSourceFile(f)) continue;\n try {\n inputs[f] = statMtimeMs(f);\n } catch {\n }\n }\n\n const cache: AdornCacheV1 = {\n cacheVersion: 1,\n generator: {\n name: \"adorn-api\",\n version: params.adornVersion,\n typescript: ts.version\n },\n project: {\n tsconfigPath: params.tsconfigAbs,\n configFiles: configMtimes,\n lockfile: lock ?? null\n },\n inputs\n };\n\n fs.writeFileSync(path.join(outDirAbs, \"cache.json\"), JSON.stringify(cache, null, 2), \"utf8\");\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","ts","path","import_typescript","ts","path","import_typescript","import_typescript","ts","ts","ts","import_typescript","ts","path","ts","import_typescript","ts","resolveSchemaRef","resolveAndCollectObjectProps","isObjectLikeSchema","schemaRef","import_node_fs","import_node_path","path","fs","Ajv","addFormats","crypto","import_node_fs","import_node_path","import_typescript","fs","path","import_node_fs","import_node_path","import_typescript","statMtimeMs","fs","path","ts","import_typescript","process","ts"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/compiler/runner/createProgram.ts","../src/compiler/analyze/scanControllers.ts","../src/utils/operationId.ts","../src/compiler/schema/openapi.ts","../src/compiler/schema/typeToJsonSchema.ts","../src/compiler/schema/primitives.ts","../src/compiler/schema/unionHandler.ts","../src/compiler/schema/intersectionHandler.ts","../src/compiler/schema/objectHandler.ts","../src/compiler/schema/extractAnnotations.ts","../src/compiler/schema/parameters.ts","../src/compiler/manifest/emit.ts","../src/compiler/validation/emitPrecompiledValidators.ts","../src/compiler/cache/isStale.ts","../src/compiler/cache/writeCache.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { writeFileSync, mkdirSync, rmSync, existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createProgramFromConfig } from \"./compiler/runner/createProgram.js\";\nimport { scanControllers } from \"./compiler/analyze/scanControllers.js\";\nimport { generateOpenAPI } from \"./compiler/schema/openapi.js\";\nimport { generateManifest } from \"./compiler/manifest/emit.js\";\nimport { emitPrecompiledValidators } from \"./compiler/validation/emitPrecompiledValidators.js\";\nimport { isStale } from \"./compiler/cache/isStale.js\";\nimport { writeCache } from \"./compiler/cache/writeCache.js\";\nimport ts from \"typescript\";\nimport process from \"node:process\";\n\nconst ADORN_VERSION = \"0.1.0\";\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\nfunction log(msg: string) {\n process.stdout.write(msg + \"\\n\");\n}\n\nfunction debug(...args: unknown[]) {\n if (process.env.ADORN_DEBUG) {\n console.error(\"[adorn-api]\", ...args);\n }\n}\n\nfunction sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj !== \"object\") return obj;\n if (Array.isArray(obj)) {\n return obj.map(item => sanitizeForJson(item));\n }\n \n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key.startsWith(\"__@\") || key.startsWith(\"[\")) continue;\n if (typeof value === \"function\") continue;\n if (value !== null && typeof value === \"object\") {\n const typeName = (value as any).constructor?.name;\n if (typeName && ![\"Object\", \"Array\", \"String\", \"Number\", \"Boolean\", \"Date\", \"RegExp\"].includes(typeName)) {\n continue;\n }\n }\n result[key] = sanitizeForJson(value);\n }\n return result;\n}\n\nasync function buildCommand(args: string[]) {\n const projectIndex = args.indexOf(\"-p\");\n const projectPath = projectIndex !== -1 ? args[projectIndex + 1] : \"./tsconfig.json\";\n const outputDir = args.includes(\"--output\")\n ? args[args.indexOf(\"--output\") + 1]\n : \".adorn\";\n const ifStale = args.includes(\"--if-stale\");\n \n const validationModeIndex = args.indexOf(\"--validation-mode\");\n const validationMode: ValidationMode = validationModeIndex !== -1 \n ? (args[validationModeIndex + 1] as ValidationMode) \n : \"ajv-runtime\";\n\n if (validationMode !== \"none\" && validationMode !== \"ajv-runtime\" && validationMode !== \"precompiled\") {\n console.error(`Invalid validation mode: ${validationMode}. Valid values: none, ajv-runtime, precompiled`);\n process.exit(1);\n }\n\n const outputPath = resolve(outputDir);\n\n if (ifStale) {\n const stale = await isStale({\n outDir: outputDir,\n project: projectPath,\n adornVersion: ADORN_VERSION,\n typescriptVersion: ts.version\n });\n\n if (!stale.stale) {\n log(\"adorn-api: artifacts up-to-date\");\n return;\n }\n\n log(`adorn-api: building artifacts (reason: ${stale.reason}${stale.detail ? `: ${stale.detail}` : \"\"})`);\n debug(\"Stale detail:\", stale.detail);\n } else {\n log(\"adorn-api: building artifacts (reason: forced-build)\");\n }\n\n const { program, checker, sourceFiles } = createProgramFromConfig(projectPath);\n const controllers = scanControllers(sourceFiles, checker);\n\n if (controllers.length === 0) {\n console.warn(\"No controllers found!\");\n process.exit(1);\n }\n\n log(`Found ${controllers.length} controller(s)`);\n\n const openapi = generateOpenAPI(controllers, checker, { title: \"API\", version: \"1.0.0\" });\n const manifest = generateManifest(controllers, checker, ADORN_VERSION, validationMode);\n\n mkdirSync(outputPath, { recursive: true });\n\n writeFileSync(resolve(outputPath, \"openapi.json\"), JSON.stringify(sanitizeForJson(openapi), null, 2));\n writeFileSync(resolve(outputPath, \"manifest.json\"), JSON.stringify(manifest, null, 2));\n\n if (validationMode === \"precompiled\") {\n log(\"Generating precompiled validators...\");\n \n const manifestObj = JSON.parse(readFileSync(resolve(outputPath, \"manifest.json\"), \"utf-8\"));\n \n await emitPrecompiledValidators({\n outDir: outputPath,\n openapi,\n manifest: manifestObj,\n strict: \"off\",\n formatsMode: \"full\"\n });\n\n manifestObj.validation = {\n mode: \"precompiled\",\n precompiledModule: \"./validators.mjs\"\n };\n \n writeFileSync(resolve(outputPath, \"manifest.json\"), JSON.stringify(manifestObj, null, 2));\n \n log(\" - validators.cjs\");\n log(\" - validators.mjs\");\n log(\" - validators.meta.json\");\n }\n\n writeCache({\n outDir: outputDir,\n tsconfigAbs: resolve(projectPath),\n program,\n adornVersion: ADORN_VERSION\n });\n\n log(`Written to ${outputPath}/`);\n log(\" - openapi.json\");\n log(\" - manifest.json\");\n log(\" - cache.json\");\n}\n\nfunction cleanCommand(args: string[]) {\n const outputDir = args.includes(\"--output\")\n ? args[args.indexOf(\"--output\") + 1]\n : \".adorn\";\n\n const outputPath = resolve(outputDir);\n\n if (existsSync(outputPath)) {\n rmSync(outputPath, { recursive: true, force: true });\n }\n\n log(`adorn-api: cleaned ${outputDir}`);\n}\n\nconst command = process.argv[2];\n\nif (command === \"build\") {\n buildCommand(process.argv.slice(3)).catch((err) => {\n console.error(err);\n process.exit(1);\n });\n} else if (command === \"clean\") {\n cleanCommand(process.argv.slice(3));\n} else {\n console.log(`\nadorn-api CLI\n\nCommands:\n build Generate OpenAPI and manifest from TypeScript source\n clean Remove generated artifacts\n\nOptions:\n -p <path> Path to tsconfig.json (default: ./tsconfig.json)\n --output <dir> Output directory (default: .adorn)\n --if-stale Only rebuild if artifacts are stale\n --validation-mode <mode> Validation mode: none, ajv-runtime, precompiled (default: ajv-runtime)\n\nExamples:\n adorn-api build -p ./tsconfig.json --output .adorn\n adorn-api build --if-stale\n adorn-api build --validation-mode precompiled\n adorn-api clean\n `);\n}\n","/**\n * TypeScript program creation module.\n * Sets up the TypeScript compiler API for source analysis.\n */\nimport ts from \"typescript\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\n\n/**\n * Context object containing the TypeScript program, type checker, and source files.\n * Used throughout the compiler for source analysis and type information.\n */\nexport interface ProgramContext {\n program: ts.Program;\n checker: ts.TypeChecker;\n sourceFiles: ts.SourceFile[];\n}\n\n/**\n * Creates a TypeScript program from a tsconfig.json file.\n * Parses the configuration and sets up the compiler host for source analysis.\n * \n * @param tsconfigPath - Path to the TypeScript configuration file\n * @returns ProgramContext containing the program, checker, and filtered source files\n * @throws Error if the config file cannot be read or parsed\n */\nexport function createProgramFromConfig(tsconfigPath: string): ProgramContext {\n const absolutePath = resolve(tsconfigPath);\n const configDir = dirname(absolutePath);\n\n const configFile = ts.readConfigFile(absolutePath, (path) => readFileSync(path, \"utf-8\"));\n if (configFile.error) {\n throw new Error(`Failed to read tsconfig: ${ts.flattenDiagnosticMessageText(configFile.error.messageText, \"\\n\")}`);\n }\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, configDir);\n if (parsed.errors.length > 0) {\n const messages = parsed.errors.map(e => ts.flattenDiagnosticMessageText(e.messageText, \"\\n\"));\n throw new Error(`Failed to parse tsconfig:\\n${messages.join(\"\\n\")}`);\n }\n\n const program = ts.createProgram(parsed.fileNames, parsed.options);\n const checker = program.getTypeChecker();\n\n const sourceFiles = program.getSourceFiles().filter(sf =>\n !sf.isDeclarationFile &&\n !sf.fileName.includes(\"node_modules\")\n );\n\n return { program, checker, sourceFiles };\n}\n","/**\n * Scans TypeScript source files for controller classes decorated with @Controller and extracts their operations.\n * This module provides the foundation for API compilation by identifying all HTTP endpoints defined in the codebase.\n */\nimport ts from \"typescript\";\nimport { defaultOperationId } from \"../../utils/operationId.js\";\n\n/**\n * Represents a scanned controller class with its metadata and operations.\n * Contains information about the controller class, base path, and all HTTP operations it defines.\n */\nexport interface ScannedController {\n /** The name of the controller class */\n className: string;\n /** The base path prefix for all operations in this controller */\n basePath: string;\n /** The TypeScript source file containing this controller */\n sourceFile: ts.SourceFile;\n /** The class declaration node from the TypeScript AST */\n classDeclaration: ts.ClassDeclaration;\n /** Array of scanned operations (endpoints) in this controller */\n operations: ScannedOperation[];\n /** Optional list of content types this controller consumes */\n consumes?: string[];\n /** Optional list of content types this controller produces */\n produces?: string[];\n}\n\n/**\n * Represents a scanned HTTP operation (endpoint) within a controller.\n * Contains all metadata needed to generate API documentation and client code.\n */\nexport interface ScannedOperation {\n /** The name of the method implementing this operation */\n methodName: string;\n /** The HTTP method (GET, POST, PUT, PATCH, DELETE) */\n httpMethod: string;\n /** The URL path for this operation, relative to controller base path */\n path: string;\n /** Unique identifier for this operation, used in OpenAPI specs and client generation */\n operationId: string;\n /** The method declaration node from the TypeScript AST */\n methodDeclaration: ts.MethodDeclaration;\n /** The TypeScript return type of this operation */\n returnType: ts.Type;\n /** Optional TypeScript type node for the return type */\n returnTypeNode?: ts.TypeNode;\n /** Array of scanned parameters for this operation */\n parameters: ScannedParameter[];\n /** Indices of parameters that are path parameters */\n pathParamIndices: number[];\n /** Index of the parameter that is the request body, or null if none */\n bodyParamIndex: number | null;\n /** Indices of parameters that are query parameters */\n queryParamIndices: number[];\n /** Index of the parameter that is a query object (all query params as properties), or null if none */\n queryObjectParamIndex: number | null;\n /** Index of the parameter that is a headers object, or null if none */\n headerObjectParamIndex: number | null;\n /** Index of the parameter that is a cookies object, or null if none */\n cookieObjectParamIndex: number | null;\n /** The content type of the request body, if applicable */\n bodyContentType?: string;\n}\n\n/**\n * Represents a scanned parameter of an operation.\n * Contains metadata about the parameter's name, type, and position.\n */\nexport interface ScannedParameter {\n /** The name of the parameter */\n name: string;\n /** The zero-based index of the parameter in the function signature */\n index: number;\n /** The TypeScript type of this parameter */\n type: ts.Type;\n /** Whether this parameter is optional */\n isOptional: boolean;\n /** Optional parameter declaration node from the TypeScript AST */\n paramNode?: ts.ParameterDeclaration;\n}\n\n/**\n * Scans an array of TypeScript source files for controller classes and extracts their operations.\n * Only classes decorated with @Controller are considered, and only methods with HTTP method decorators\n * (e.g., @Get, @Post) are treated as operations.\n * \n * @param sourceFiles - Array of TypeScript source files to scan\n * @param checker - TypeScript type checker for analyzing types\n * @returns Array of scanned controllers with their operations\n */\nexport function scanControllers(\n sourceFiles: ts.SourceFile[],\n checker: ts.TypeChecker\n): ScannedController[] {\n const controllers: ScannedController[] = [];\n\n for (const sourceFile of sourceFiles) {\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n const controller = analyzeClass(node, sourceFile, checker);\n if (controller) {\n controllers.push(controller);\n }\n }\n });\n }\n\n return controllers;\n}\n\n/**\n * Analyzes a TypeScript class declaration to determine if it's a controller and extracts its metadata.\n * \n * @param node - The class declaration node to analyze\n * @param sourceFile - The source file containing the class\n * @param checker - TypeScript type checker for analyzing types\n * @returns ScannedController if the class is a valid controller, null otherwise\n */\nfunction analyzeClass(\n node: ts.ClassDeclaration,\n sourceFile: ts.SourceFile,\n checker: ts.TypeChecker\n): ScannedController | null {\n if (!node.name) return null;\n\n const controllerDecorator = findDecorator(node, \"Controller\");\n if (!controllerDecorator) return null;\n\n const basePath = extractDecoratorStringArg(controllerDecorator) ?? \"/\";\n const className = node.name.text;\n\n const consumes = extractClassConsumes(node, checker);\n const produces = extractClassProduces(node, checker);\n\n const operations: ScannedOperation[] = [];\n\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.name) {\n const operation = analyzeMethod(member, className, checker);\n if (operation) {\n operations.push(operation);\n }\n }\n }\n\n if (operations.length === 0) return null;\n\n return {\n className,\n basePath,\n sourceFile,\n classDeclaration: node,\n operations,\n consumes,\n produces,\n };\n}\n\n/**\n * Extracts the @Consumes decorator content types from a controller class.\n * @internal\n */\nfunction extractClassConsumes(node: ts.ClassDeclaration, _checker: ts.TypeChecker): string[] | undefined {\n const decorator = findDecorator(node, \"Consumes\");\n if (!decorator) return undefined;\n\n const callExpr = decorator.expression;\n if (!ts.isCallExpression(callExpr)) return undefined;\n const args = callExpr.arguments;\n if (args.length === 0) return undefined;\n\n const firstArg = args[0];\n if (ts.isStringLiteral(firstArg)) {\n return [firstArg.text];\n }\n if (ts.isArrayLiteralExpression(firstArg)) {\n return firstArg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n return undefined;\n}\n\n/**\n * Extracts the @Produces decorator content types from a controller class.\n * @internal\n */\nfunction extractClassProduces(node: ts.ClassDeclaration, _checker: ts.TypeChecker): string[] | undefined {\n const decorator = findDecorator(node, \"Produces\");\n if (!decorator) return undefined;\n\n const callExpr = decorator.expression;\n if (!ts.isCallExpression(callExpr)) return undefined;\n const args = callExpr.arguments;\n if (args.length === 0) return undefined;\n\n const firstArg = args[0];\n if (ts.isStringLiteral(firstArg)) {\n return [firstArg.text];\n }\n if (ts.isArrayLiteralExpression(firstArg)) {\n return firstArg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n return undefined;\n}\n\n/**\n * Analyzes a method declaration to determine if it's an HTTP operation and extracts its metadata.\n * @internal\n */\nfunction analyzeMethod(\n node: ts.MethodDeclaration,\n className: string,\n checker: ts.TypeChecker\n): ScannedOperation | null {\n const methodName = ts.isIdentifier(node.name) ? node.name.text : null;\n if (!methodName) return null;\n\n const httpMethods = [\"Get\", \"Post\", \"Put\", \"Patch\", \"Delete\"];\n let httpMethod: string | null = null;\n let path = \"/\";\n\n for (const method of httpMethods) {\n const decorator = findDecorator(node, method);\n if (decorator) {\n httpMethod = method.toUpperCase();\n path = extractDecoratorStringArg(decorator) ?? \"/\";\n break;\n }\n }\n\n if (!httpMethod) return null;\n\n const signature = checker.getSignatureFromDeclaration(node);\n if (!signature) return null;\n\n let returnType = checker.getReturnTypeOfSignature(signature);\n returnType = unwrapPromise(returnType, checker);\n const returnTypeNode = unwrapPromiseTypeNode(node.type);\n\n const parameters: ScannedParameter[] = [];\n for (let i = 0; i < node.parameters.length; i++) {\n const param = node.parameters[i];\n const paramName = ts.isIdentifier(param.name) ? param.name.text : `arg${i}`;\n const paramType = checker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || !!param.initializer;\n\n parameters.push({\n name: paramName,\n index: i,\n type: paramType,\n isOptional,\n paramNode: param,\n });\n }\n\n const pathParamNames = extractPathParams(path);\n const pathParamIndices = matchPathParamsToIndices(pathParamNames, parameters);\n\n const { bodyParamIndex, queryParamIndices, queryObjectParamIndex, headerObjectParamIndex, cookieObjectParamIndex, bodyContentType } =\n classifyParameters(parameters, httpMethod, pathParamIndices, checker);\n\n return {\n methodName,\n httpMethod,\n path,\n operationId: defaultOperationId(className, methodName),\n methodDeclaration: node,\n returnType,\n returnTypeNode,\n parameters,\n pathParamIndices,\n bodyParamIndex,\n queryParamIndices,\n queryObjectParamIndex,\n headerObjectParamIndex,\n cookieObjectParamIndex,\n bodyContentType,\n };\n}\n\n/**\n * Extracts path parameter names from a URL path string.\n * Path parameters are denoted by colon prefixes (e.g., \":id\", \":userId\").\n * @internal\n */\nfunction extractPathParams(path: string): string[] {\n const matches = path.match(/:([^/]+)/g);\n if (!matches) return [];\n return matches.map(m => m.slice(1));\n}\n\n/**\n * Maps path parameter names to their indices in the parameters array.\n * @internal\n */\nfunction matchPathParamsToIndices(pathParamNames: string[], parameters: ScannedParameter[]): number[] {\n const indices: number[] = [];\n for (const name of pathParamNames) {\n const param = parameters.find(p => p.name === name);\n if (param) {\n indices.push(param.index);\n }\n }\n return indices;\n}\n\n/**\n * Classifies parameters into different categories (body, query, path, headers, cookies).\n * This determines how each parameter will be processed in the OpenAPI generation.\n * @internal\n */\nfunction classifyParameters(\n parameters: ScannedParameter[],\n httpMethod: string,\n pathParamIndices: number[],\n checker: ts.TypeChecker\n): {\n bodyParamIndex: number | null;\n queryParamIndices: number[];\n queryObjectParamIndex: number | null;\n headerObjectParamIndex: number | null;\n cookieObjectParamIndex: number | null;\n bodyContentType: string | undefined;\n} {\n const usedIndices = new Set(pathParamIndices);\n const queryParamIndices: number[] = [];\n let bodyParamIndex: number | null = null;\n let queryObjectParamIndex: number | null = null;\n let headerObjectParamIndex: number | null = null;\n let cookieObjectParamIndex: number | null = null;\n\n const isBodyMethod = [\"POST\", \"PUT\", \"PATCH\"].includes(httpMethod);\n\n for (let i = 0; i < parameters.length; i++) {\n const param = parameters[i];\n if (usedIndices.has(i)) continue;\n\n const nonNullableType = checker.getNonNullableType(param.type);\n const typeStr = getTypeName(param.type) || getTypeName(nonNullableType);\n\n if (typeStr === \"Body\") {\n bodyParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Query\") {\n queryObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Headers\") {\n headerObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (typeStr === \"Cookies\") {\n cookieObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n if (isBodyMethod && bodyParamIndex === null) {\n bodyParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n const isObj = isObjectType(nonNullableType, checker);\n if (isObj && queryObjectParamIndex === null && !isBodyMethod) {\n queryObjectParamIndex = i;\n usedIndices.add(i);\n continue;\n }\n\n queryParamIndices.push(i);\n usedIndices.add(i);\n }\n\n return {\n bodyParamIndex,\n queryParamIndices,\n queryObjectParamIndex,\n headerObjectParamIndex,\n cookieObjectParamIndex,\n bodyContentType: undefined,\n };\n}\n\n/**\n * Checks if a TypeScript type represents an object type.\n * @internal\n */\nfunction isObjectType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const objectFlags = (type.flags & ts.TypeFlags.Object) !== 0;\n const intersectionFlags = (type.flags & ts.TypeFlags.Intersection) !== 0;\n \n if (!objectFlags && !intersectionFlags) return false;\n\n const symbol = type.getSymbol();\n if (symbol?.getName() === \"__object\") return true;\n\n const properties = checker.getPropertiesOfType(type);\n if (properties.length > 0) return true;\n\n const callSigs = type.getCallSignatures?.();\n if (callSigs && callSigs.length > 0) return false;\n\n return true;\n}\n\n/**\n * Gets the type name from a TypeScript type, checking both alias and direct symbols.\n * @internal\n */\nfunction getTypeName(type: ts.Type): string {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n if (aliasSymbol) return aliasSymbol.getName();\n const symbol = type.getSymbol();\n return symbol?.getName() ?? \"\";\n}\n\n/**\n * Finds a decorator by name on a TypeScript node.\n * @internal\n */\nfunction findDecorator(node: ts.HasDecorators, name: string): ts.Decorator | null {\n const decorators = ts.getDecorators(node);\n if (!decorators) return null;\n\n for (const decorator of decorators) {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n if (ts.isIdentifier(expr) && expr.text === name) {\n return decorator;\n }\n }\n }\n return null;\n}\n\n/**\n * Extracts the first string argument from a decorator call expression.\n * @internal\n */\nfunction extractDecoratorStringArg(decorator: ts.Decorator): string | null {\n if (ts.isCallExpression(decorator.expression)) {\n const arg = decorator.expression.arguments[0];\n if (arg && ts.isStringLiteral(arg)) {\n return arg.text;\n }\n }\n return null;\n}\n\n/**\n * Unwraps a Promise type to get the inner type.\n * @internal\n */\nfunction unwrapPromise(type: ts.Type, _checker: ts.TypeChecker): ts.Type {\n const symbol = type.getSymbol();\n if (symbol?.getName() === \"Promise\") {\n const typeArgs = (type as ts.TypeReference).typeArguments;\n if (typeArgs && typeArgs.length > 0) {\n return typeArgs[0];\n }\n }\n return type;\n}\n\n/**\n * Unwraps a Promise type node to get the inner type node.\n * @internal\n */\nfunction unwrapPromiseTypeNode(typeNode?: ts.TypeNode): ts.TypeNode | undefined {\n if (!typeNode) return undefined;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName) && typeNode.typeName.text === \"Promise\") {\n return typeNode.typeArguments?.[0] ?? typeNode;\n }\n }\n\n return typeNode;\n}\n","export function defaultOperationId(controllerName: string, methodName: string): string {\n return `${controllerName}_${methodName}`;\n}\n","/**\n * OpenAPI specification generation module.\n * Converts scanned controllers to OpenAPI 3.1 format.\n */\nimport ts from \"typescript\";\nimport type { ScannedController, ScannedOperation, ScannedParameter } from \"../analyze/scanControllers.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\nimport { extractPropertySchemaFragments, mergeFragments } from \"./extractAnnotations.js\";\nimport type { SchemaContext, JsonSchema } from \"./types.js\";\nimport {\n buildPathParameters,\n buildQueryParameters,\n buildHeaderParameters,\n buildCookieParameters,\n} from \"./parameters.js\";\n\nconst METAL_ORM_WRAPPER_NAMES = [\"BelongsToReference\", \"HasOneReference\", \"HasManyCollection\", \"ManyToManyCollection\"];\n\n/**\n * OpenAPI 3.1 specification interface.\n */\nexport interface OpenAPI31 {\n openapi: \"3.1.0\";\n info: {\n title: string;\n version: string;\n };\n components: {\n schemas: Record<string, JsonSchema>;\n };\n paths: Record<string, Record<string, any>>;\n}\n\n/**\n * Generates an OpenAPI 3.1 specification from scanned controllers.\n * \n * @param controllers - Array of scanned controllers to include in the spec\n * @param checker - TypeScript type checker for type analysis\n * @param options - Optional title and version for the OpenAPI info object\n * @returns Complete OpenAPI 3.1 specification object\n */\nexport function generateOpenAPI(\n controllers: ScannedController[],\n checker: ts.TypeChecker,\n options: { title?: string; version?: string } = {}\n): OpenAPI31 {\n const components = new Map<string, JsonSchema>();\n const ctx: SchemaContext = {\n checker,\n components,\n typeStack: new Set(),\n typeNameStack: [],\n mode: \"response\",\n };\n\n const paths: Record<string, Record<string, any>> = {};\n\n for (const controller of controllers) {\n for (const operation of controller.operations) {\n const fullPath = convertToOpenApiPath(controller.basePath, operation.path);\n\n if (!paths[fullPath]) {\n paths[fullPath] = {};\n }\n\n const method = operation.httpMethod.toLowerCase();\n paths[fullPath][method] = buildOperation(operation, ctx, controller.consumes);\n }\n }\n\n const schemas = Object.fromEntries(components);\n cleanupMetalOrmWrappers(schemas, paths);\n\n return {\n openapi: \"3.1.0\",\n info: {\n title: options.title ?? \"API\",\n version: options.version ?? \"1.0.0\",\n },\n components: {\n schemas,\n },\n paths,\n };\n}\n\nfunction cleanupMetalOrmWrappers(schemas: Record<string, JsonSchema>, paths: Record<string, any>): void {\n const schemasToDelete = new Set<string>();\n \n for (const wrapperName of METAL_ORM_WRAPPER_NAMES) {\n if (schemas[wrapperName]) {\n schemasToDelete.add(wrapperName);\n }\n if (schemas[`${wrapperName}Api`]) {\n schemasToDelete.add(`${wrapperName}Api`);\n }\n }\n \n for (const schema of Object.values(schemas)) {\n cleanupSchemaRefs(schema, schemasToDelete);\n }\n \n for (const pathItem of Object.values(paths)) {\n cleanupPathItemRefs(pathItem, schemasToDelete);\n }\n \n for (const schemaName of schemasToDelete) {\n delete schemas[schemaName];\n }\n}\n\nfunction cleanupSchemaRefs(schema: any, schemasToDelete: Set<string>): void {\n if (typeof schema !== \"object\" || schema === null) {\n return;\n }\n \n if (schema.properties) {\n for (const propName of Object.keys(schema.properties)) {\n const propSchema = schema.properties[propName];\n if (propSchema.$ref && typeof propSchema.$ref === \"string\") {\n const refName = propSchema.$ref.replace(\"#/components/schemas/\", \"\");\n if (schemasToDelete.has(refName)) {\n delete schema.properties[propName];\n if (schema.required && Array.isArray(schema.required)) {\n schema.required = schema.required.filter((r: string) => r !== propName);\n }\n }\n } else {\n cleanupSchemaRefs(propSchema, schemasToDelete);\n }\n }\n }\n \n if (schema.items) {\n cleanupSchemaRefs(schema.items, schemasToDelete);\n }\n \n if (schema.allOf) {\n for (const item of schema.allOf) {\n cleanupSchemaRefs(item, schemasToDelete);\n }\n }\n}\n\nfunction cleanupPathItemRefs(pathItem: any, schemasToDelete: Set<string>): void {\n if (typeof pathItem !== \"object\" || pathItem === null) {\n return;\n }\n \n for (const method of Object.keys(pathItem)) {\n const operation: any = pathItem[method];\n if (typeof operation !== \"object\" || operation === null) continue;\n \n if (operation.requestBody) {\n cleanupRequestBodyRefs(operation.requestBody, schemasToDelete);\n }\n \n if (operation.responses) {\n const responses: any[] = Object.values(operation.responses);\n for (const response of responses) {\n if (response.content) {\n const contentTypes: any[] = Object.values(response.content);\n for (const contentType of contentTypes) {\n if (contentType.schema) {\n cleanupSchemaRefs(contentType.schema, schemasToDelete);\n }\n }\n }\n }\n }\n }\n}\n\nfunction cleanupRequestBodyRefs(requestBody: any, schemasToDelete: Set<string>): void {\n if (typeof requestBody !== \"object\" || requestBody === null) return;\n \n if (requestBody.content) {\n const contentTypes: any[] = Object.values(requestBody.content);\n for (const contentType of contentTypes) {\n if (contentType.schema) {\n cleanupSchemaRefs(contentType.schema, schemasToDelete);\n }\n }\n }\n \n if (requestBody.properties) {\n for (const propName of Object.keys(requestBody.properties)) {\n const propSchema = requestBody.properties[propName];\n if (propSchema.$ref && typeof propSchema.$ref === \"string\") {\n const refName = propSchema.$ref.replace(\"#/components/schemas/\", \"\");\n if (schemasToDelete.has(refName)) {\n delete requestBody.properties[propName];\n if (requestBody.required && Array.isArray(requestBody.required)) {\n requestBody.required = requestBody.required.filter((r: string) => r !== propName);\n }\n }\n } else {\n cleanupSchemaRefs(propSchema, schemasToDelete);\n }\n }\n }\n}\n\nfunction convertToOpenApiPath(basePath: string, path: string): string {\n const base = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n const converted = path.replace(/:([^/]+)/g, \"{$1}\");\n let fullPath = base + converted || \"/\";\n \n if (fullPath.endsWith(\"/\") && fullPath !== \"/\") {\n fullPath = fullPath.slice(0, -1);\n }\n \n return fullPath;\n}\n\nfunction buildOperation(operation: ScannedOperation, ctx: SchemaContext, controllerConsumes?: string[]): any {\n const op: any = {\n operationId: operation.operationId,\n responses: {},\n };\n\n const parameters: any[] = [];\n\n buildPathParameters(operation, ctx, parameters);\n buildQueryParameters(operation, ctx, parameters);\n buildHeaderParameters(operation, ctx, parameters);\n buildCookieParameters(operation, ctx, parameters);\n\n if (parameters.length > 0) {\n op.parameters = parameters;\n }\n\n const responseCtx = { ...ctx, mode: \"response\" as const };\n const responseSchema = typeToJsonSchema(operation.returnType, responseCtx, operation.returnTypeNode);\n\n const status = operation.httpMethod === \"POST\" ? 201 : 200;\n op.responses[status] = {\n description: status === 201 ? \"Created\" : \"OK\",\n content: {\n \"application/json\": {\n schema: responseSchema,\n },\n },\n };\n\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(operation.httpMethod) && operation.bodyParamIndex !== null) {\n const bodyParam = operation.parameters[operation.bodyParamIndex];\n if (bodyParam) {\n const requestCtx = { ...ctx, mode: \"request\" as const };\n let bodySchema = typeToJsonSchema(bodyParam.type, requestCtx);\n bodySchema = mergeBodySchemaAnnotations(bodyParam, requestCtx, bodySchema);\n\n const contentType = operation.bodyContentType ?? controllerConsumes?.[0] ?? \"application/json\";\n\n const requestBody: any = {\n required: !bodyParam.isOptional,\n content: {},\n };\n\n if (contentType === \"multipart/form-data\") {\n requestBody.content[\"multipart/form-data\"] = {\n schema: bodySchema,\n };\n } else {\n requestBody.content[contentType] = {\n schema: bodySchema,\n };\n }\n\n op.requestBody = requestBody;\n }\n }\n\n return op;\n}\n\nfunction mergeBodySchemaAnnotations(\n bodyParam: ScannedParameter,\n ctx: SchemaContext,\n schema: JsonSchema\n): JsonSchema {\n if (!schema.properties) return schema;\n\n const typeSymbol = bodyParam.type.getSymbol();\n if (!typeSymbol) return schema;\n\n const declarations = typeSymbol.getDeclarations();\n if (!declarations || declarations.length === 0) return schema;\n\n const classDecl = declarations[0];\n if (!ts.isClassDeclaration(classDecl)) return schema;\n\n const result = { ...schema };\n const props = { ...result.properties as Record<string, JsonSchema> };\n\n for (const member of classDecl.members) {\n if (!ts.isPropertyDeclaration(member) || !member.name) continue;\n\n const propName = ts.isIdentifier(member.name) ? member.name.text : null;\n if (!propName) continue;\n if (!props[propName]) continue;\n\n const frags = extractPropertySchemaFragments(ctx.checker, member);\n if (frags.length > 0) {\n props[propName] = mergeFragments(props[propName] as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n\n result.properties = props;\n return result;\n}\n","/**\n * Main type-to-JSON-Schema conversion module.\n * Routes different TypeScript types to appropriate handlers.\n */\nimport ts from \"typescript\";\nimport type { JsonSchema, SchemaContext } from \"./types.js\";\nimport { handlePrimitiveType } from \"./primitives.js\";\nimport { handleUnion } from \"./unionHandler.js\";\nimport { handleIntersection } from \"./intersectionHandler.js\";\nimport { handleObjectType, isMetalOrmWrapperType, handleMetalOrmWrapper } from \"./objectHandler.js\";\n\nexport type { JsonSchema, DiscriminatorObject, SchemaContext } from \"./types.js\";\n\n/**\n * Converts a TypeScript type to a JSON Schema object.\n * This is the main entry point for schema generation, routing to appropriate type handlers.\n * \n * @param type - The TypeScript type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated JSON Schema\n */\nexport function typeToJsonSchema(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n const primitiveResult = handlePrimitiveType(type, ctx, typeNode);\n if (primitiveResult) {\n return primitiveResult;\n }\n\n if (type.isUnion()) {\n return handleUnion(type, ctx, typeNode);\n }\n\n if (type.isIntersection()) {\n return handleIntersection(type, ctx, typeNode);\n }\n\n if (ctx.checker.isArrayType(type)) {\n const typeArgs = (type as ts.TypeReference).typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, ctx) : {};\n return {\n type: \"array\",\n items,\n uniqueItems: isSetType(type, ctx.checker) ? true : undefined,\n };\n }\n\n if (type.flags & ts.TypeFlags.Object) {\n const objectType = type as ts.ObjectType;\n if (isMetalOrmWrapperType(type, ctx.checker)) {\n return handleMetalOrmWrapper(objectType, ctx);\n }\n return handleObjectType(objectType, ctx, typeNode);\n }\n\n return {};\n}\n\n/**\n * Creates a new schema generation context with fresh component registry and type stack.\n * \n * @param checker - TypeScript type checker for type analysis\n * @param mode - Generation mode (\"request\" or \"response\"), defaults to \"response\"\n * @returns A new SchemaContext for schema generation\n */\nexport function createSchemaContext(checker: ts.TypeChecker, mode: \"request\" | \"response\" = \"response\"): SchemaContext {\n return {\n checker,\n components: new Map(),\n typeStack: new Set(),\n typeNameStack: [],\n mode,\n };\n}\n\nfunction isSetType(type: ts.Type, _checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n if (!symbol) return false;\n const name = symbol.getName();\n if (name === \"Set\") return true;\n return false;\n}\n","/**\n * Primitive type handling module.\n * Converts TypeScript primitive types to JSON Schema.\n */\nimport ts from \"typescript\";\nimport type { JsonSchema, SchemaContext } from \"./types.js\";\n\n/**\n * Handles TypeScript primitive types and converts them to JSON Schema.\n * Supports string, number, boolean, bigint, null, undefined, Date, and literal types.\n * \n * @param type - The primitive type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated JSON Schema, or null if not a recognized primitive\n */\nexport function handlePrimitiveType(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema | null {\n const { checker, propertyName } = ctx;\n\n if (type.flags & ts.TypeFlags.Undefined) {\n return {};\n }\n if (type.flags & ts.TypeFlags.Null) {\n return { type: \"null\" };\n }\n if (isDateType(type, checker)) {\n return { type: \"string\", format: \"date-time\" };\n }\n\n if (type.flags & ts.TypeFlags.String) {\n return { type: \"string\" };\n }\n if (type.flags & ts.TypeFlags.Number) {\n return normalizeNumericType(type, checker, typeNode, propertyName);\n }\n if (type.flags & ts.TypeFlags.Boolean) {\n return { type: \"boolean\" };\n }\n if (type.flags & ts.TypeFlags.BigInt) {\n return {\n type: \"string\",\n format: \"int64\",\n pattern: \"^-?\\\\d+$\"\n };\n }\n\n if (type.flags & ts.TypeFlags.StringLiteral) {\n const value = (type as ts.StringLiteralType).value;\n return { type: \"string\", enum: [value] };\n }\n if (type.flags & ts.TypeFlags.NumberLiteral) {\n const value = (type as ts.NumberLiteralType).value;\n return { type: \"number\", enum: [value] };\n }\n if (type.flags & ts.TypeFlags.BooleanLiteral) {\n const intrinsic = (type as any).intrinsicName;\n return { type: \"boolean\", enum: [intrinsic === \"true\"] };\n }\n\n return null;\n}\n\n/**\n * Checks if a TypeScript type represents a Date type.\n * Handles both direct Date references and aliased Date types.\n * \n * @param type - The type to check\n * @param checker - TypeScript type checker for symbol resolution\n * @returns True if the type represents Date\n */\nexport function isDateType(type: ts.Type, checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n const aliasSymbol = (type as any).aliasSymbol as ts.Symbol | undefined;\n if (aliasSymbol && (aliasSymbol.flags & ts.SymbolFlags.Alias)) {\n const aliased = checker.getAliasedSymbol(aliasSymbol);\n return aliased?.getName() === \"Date\";\n }\n\n if (symbol && (symbol.flags & ts.SymbolFlags.Alias)) {\n const aliased = checker.getAliasedSymbol(symbol);\n return aliased?.getName() === \"Date\";\n }\n\n return symbol?.getName() === \"Date\";\n}\n\n/**\n * Checks if a TypeScript type represents a Set type.\n * \n * @param type - The type to check\n * @param _checker - TypeScript type checker (unused)\n * @returns True if the type is a Set type\n */\nexport function isSetType(type: ts.Type, _checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n if (!symbol) return false;\n const name = symbol.getName();\n if (name === \"Set\") return true;\n return false;\n}\n\n/**\n * Normalizes numeric types to either integer or number based on naming conventions.\n * Types named like \"id\", \"page\", \"pageSize\", etc. are converted to integer schema.\n * \n * @param type - The numeric type to normalize\n * @param checker - TypeScript type checker for symbol resolution\n * @param typeNode - Optional type node for name extraction\n * @param propertyName - Optional property name for name-based inference\n * @returns The normalized numeric schema\n */\nexport function normalizeNumericType(type: ts.Type, checker: ts.TypeChecker, typeNode?: ts.TypeNode, propertyName?: string): JsonSchema {\n const typeName = getExplicitTypeNameFromNode(typeNode) ?? null;\n const symbol = getEffectiveSymbol(type, checker);\n const symbolName = symbol?.getName() ?? null;\n \n if (shouldBeIntegerType(typeName) || shouldBeIntegerType(symbolName) || shouldBeIntegerType(propertyName ?? null)) {\n return { type: \"integer\" };\n }\n \n return { type: \"number\" };\n}\n\n/**\n * Determines if a type should be represented as an integer based on its name.\n * Common patterns include \"id\", \"page\", \"pageSize\", \"limit\", etc.\n * \n * @param typeName - The type or property name to check\n * @returns True if the name suggests an integer type\n */\nexport function shouldBeIntegerType(typeName: string | null): boolean {\n if (!typeName) return false;\n const lower = typeName.toLowerCase();\n return lower === \"id\" || \n lower.endsWith(\"id\") || \n lower === \"primarykey\" || \n lower === \"pk\" ||\n lower === \"page\" ||\n lower === \"pagesize\" ||\n lower === \"totalitems\" ||\n lower === \"limit\" ||\n lower === \"offset\";\n}\n\n/**\n * Extracts the explicit type name from a type reference node or type alias declaration.\n * \n * @param typeNode - The type node to extract name from\n * @returns The extracted type name, or null if not found\n */\nexport function getExplicitTypeNameFromNode(typeNode?: ts.TypeNode): string | null {\n if (!typeNode) return null;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName)) {\n return typeNode.typeName.text;\n }\n }\n\n if (ts.isTypeAliasDeclaration(typeNode.parent)) {\n if (ts.isIdentifier(typeNode.parent.name)) {\n return typeNode.parent.name.text;\n }\n }\n\n return null;\n}\n\n/**\n * Gets the effective symbol for a type, resolving type aliases.\n * \n * @param type - The type to get symbol from\n * @param checker - TypeScript type checker for alias resolution\n * @returns The effective symbol, or null if not found\n */\nexport function getEffectiveSymbol(type: ts.Type, checker: ts.TypeChecker): ts.Symbol | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n if (aliasSymbol && (aliasSymbol.flags & ts.SymbolFlags.Alias)) {\n return checker.getAliasedSymbol(aliasSymbol);\n }\n return type.getSymbol() ?? null;\n}\n","/**\n * Union type handling module.\n * Converts TypeScript union types to JSON Schema anyOf/oneOf constructs.\n */\nimport ts from \"typescript\";\nimport type { JsonSchema, DiscriminatorObject, SchemaContext } from \"./types.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\n\n/**\n * Handles TypeScript union types and converts them to JSON Schema.\n * Creates anyOf schemas with optional discriminator for union members.\n * \n * @param type - The union type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated JSON Schema\n */\nexport function handleUnion(\n type: ts.UnionType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n return buildNamedSchema(type, ctx, typeNode, () => {\n const types = type.types;\n const nullType = types.find(t => t.flags & ts.TypeFlags.Null);\n const undefinedType = types.find(t => t.flags & ts.TypeFlags.Undefined);\n const otherTypes = types.filter(t => !(t.flags & ts.TypeFlags.Null) && !(t.flags & ts.TypeFlags.Undefined));\n\n const allStringLiterals = otherTypes.every(t => t.flags & ts.TypeFlags.StringLiteral);\n if (allStringLiterals && otherTypes.length > 0) {\n const enumValues = otherTypes.map(t => (t as ts.StringLiteralType).value);\n const schema: JsonSchema = { type: \"string\", enum: enumValues };\n if (nullType) {\n schema.type = [\"string\", \"null\"];\n }\n return schema;\n }\n\n const allBooleanLiterals = otherTypes.length > 0 && otherTypes.every(t => t.flags & ts.TypeFlags.BooleanLiteral);\n if (allBooleanLiterals) {\n const schema: JsonSchema = { type: \"boolean\" };\n if (nullType || undefinedType) {\n schema.type = [\"boolean\", \"null\"];\n }\n return schema;\n }\n\n if (otherTypes.length === 1 && nullType) {\n const innerSchema = typeToJsonSchema(otherTypes[0], ctx);\n if (typeof innerSchema.type === \"string\") {\n innerSchema.type = [innerSchema.type, \"null\"];\n }\n return innerSchema;\n }\n\n if (otherTypes.length > 1) {\n const branches = otherTypes.map(t => typeToJsonSchema(t, ctx));\n const hasNull = !!nullType;\n\n const result: JsonSchema = {};\n\n if (hasNull) {\n result.anyOf = [...branches, { type: \"null\" }];\n } else {\n result.anyOf = branches;\n }\n\n const discriminatorResult = detectDiscriminatedUnion(otherTypes, ctx, branches);\n if (discriminatorResult) {\n result.oneOf = branches;\n result.discriminator = discriminatorResult;\n }\n\n return result;\n }\n\n if (otherTypes.length === 1) {\n return typeToJsonSchema(otherTypes[0], ctx);\n }\n\n return {};\n });\n}\n\n/**\n * Detects if a union type forms a discriminated union.\n * A discriminated union has a common property with literal values that can be used for discrimination.\n * \n * @param types - The constituent types of the union\n * @param ctx - The schema generation context\n * @param branches - The generated schemas for each branch (unused in current impl)\n * @returns Discriminator object if discriminated union detected, null otherwise\n */\nexport function detectDiscriminatedUnion(\n types: readonly ts.Type[],\n ctx: SchemaContext,\n _branches: JsonSchema[]\n): DiscriminatorObject | null {\n if (types.length < 2) return null;\n\n const candidates = findCommonPropertyNames(ctx.checker, types);\n for (const propName of candidates) {\n const requiredInAll = types.every(t => isRequiredProperty(ctx.checker, t, propName));\n if (!requiredInAll) continue;\n\n const literalSets = types.map(t => getPropertyLiteralValues(ctx.checker, t, propName));\n if (literalSets.some(s => s === null)) continue;\n\n const allSets = literalSets as Array<Set<string>>;\n if (!areSetsDisjoint(allSets)) continue;\n\n const mapping: Record<string, string> = {};\n for (let i = 0; i < types.length; i++) {\n const branchName = getBranchSchemaName(types[i], ctx);\n for (const val of allSets[i]) {\n mapping[val] = `#/components/schemas/${branchName}`;\n }\n }\n\n return { propertyName: propName, mapping };\n }\n\n return null;\n}\n\n/**\n * Finds property names that are common across all types in a union.\n * \n * @param checker - TypeScript type checker for property lookup\n * @param types - The types to analyze\n * @returns Array of property names present in all types\n */\nexport function findCommonPropertyNames(checker: ts.TypeChecker, types: readonly ts.Type[]): string[] {\n if (types.length === 0) return [];\n\n const firstProps = types[0].getProperties().map(s => s.getName());\n return firstProps.filter(name =>\n types.every(m => !!checker.getPropertyOfType(m, name))\n );\n}\n\n/**\n * Checks if a property is required (non-optional) in a given type.\n * \n * @param checker - TypeScript type checker for symbol analysis\n * @param type - The type to check\n * @param propName - The property name to check\n * @returns True if the property is required\n */\nexport function isRequiredProperty(checker: ts.TypeChecker, type: ts.Type, propName: string): boolean {\n const sym = checker.getPropertyOfType(type, propName);\n if (!sym) return false;\n\n if (sym.flags & ts.SymbolFlags.Optional) return false;\n\n const propType = checker.getTypeOfSymbol(sym);\n if (propType.isUnion?.()) {\n const hasUndefined = propType.types.some(t => (t.flags & ts.TypeFlags.Undefined) !== 0);\n if (hasUndefined) return false;\n }\n\n return true;\n}\n\n/**\n * Gets the literal string values of a property across a type.\n * Used for detecting discriminated unions.\n * \n * @param checker - TypeScript type checker for property type analysis\n * @param type - The type to check\n * @param propName - The property name to get values for\n * @returns Set of literal values, or null if not a literal union\n */\nexport function getPropertyLiteralValues(checker: ts.TypeChecker, type: ts.Type, propName: string): Set<string> | null {\n const sym = checker.getPropertyOfType(type, propName);\n if (!sym) return null;\n\n const propType = checker.getTypeOfSymbol(sym);\n\n if (propType.isStringLiteral?.()) {\n return new Set([(propType as ts.StringLiteralType).value]);\n }\n\n if (propType.isUnion?.()) {\n const values = new Set<string>();\n for (const m of propType.types) {\n if (!m.isStringLiteral?.()) return null;\n values.add((m as ts.StringLiteralType).value);\n }\n return values;\n }\n\n return null;\n}\n\n/**\n * Checks if multiple sets are pairwise disjoint (have no common elements).\n * \n * @param sets - Array of sets to check for disjointness\n * @returns True if all sets are pairwise disjoint\n */\nexport function areSetsDisjoint(sets: Array<Set<string>>): boolean {\n const seen = new Set<string>();\n for (const s of sets) {\n for (const v of s) {\n if (seen.has(v)) return false;\n seen.add(v);\n }\n }\n return true;\n}\n\n/**\n * Gets the schema name for a union branch type.\n * Used for discriminator mapping.\n * \n * @param type - The type to get name for\n * @param ctx - The schema generation context\n * @returns The schema name, or generated anonymous name\n */\nexport function getBranchSchemaName(type: ts.Type, ctx: SchemaContext): string {\n const symbol = type.getSymbol();\n if (symbol) {\n return symbol.getName();\n }\n\n const aliasSymbol = (type as any).aliasSymbol;\n if (aliasSymbol) {\n return aliasSymbol.getName();\n }\n\n return `Anonymous_${ctx.typeNameStack.length}`;\n}\n\nfunction buildNamedSchema(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode: ts.TypeNode | undefined,\n build: () => JsonSchema\n): JsonSchema {\n const name = getSchemaName(type, typeNode);\n if (!name) {\n return build();\n }\n\n const { components, typeStack } = ctx;\n if (components.has(name) || typeStack.has(type)) {\n return { $ref: `#/components/schemas/${name}` };\n }\n\n typeStack.add(type);\n const schema = build();\n typeStack.delete(type);\n\n if (!components.has(name)) {\n components.set(name, schema);\n }\n\n return { $ref: `#/components/schemas/${name}` };\n}\n\nfunction getSchemaName(type: ts.Type, typeNode?: ts.TypeNode): string | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n const aliasName = aliasSymbol?.getName();\n if (aliasName && aliasName !== \"__type\") {\n return aliasName;\n }\n\n const symbol = type.getSymbol();\n const symbolName = symbol?.getName?.();\n if (symbolName && symbolName !== \"__type\") {\n return symbolName;\n }\n\n const nodeName = getExplicitTypeNameFromNode(typeNode);\n if (nodeName && nodeName !== \"__type\") {\n return nodeName;\n }\n\n return null;\n}\n\nfunction getExplicitTypeNameFromNode(typeNode?: ts.TypeNode): string | null {\n if (!typeNode) return null;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName)) {\n return typeNode.typeName.text;\n }\n }\n\n if (ts.isTypeAliasDeclaration(typeNode.parent)) {\n if (ts.isIdentifier(typeNode.parent.name)) {\n return typeNode.parent.name.text;\n }\n }\n\n return null;\n}\n","/**\n * Intersection type handling module.\n * Converts TypeScript intersection types to JSON Schema allOf constructs.\n */\nimport ts from \"typescript\";\nimport type { JsonSchema, SchemaContext } from \"./types.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\n\n/**\n * Handles TypeScript intersection types and converts them to JSON Schema.\n * Tries to collapse branded intersections and builds named schemas for complex intersections.\n * \n * @param type - The intersection type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated JSON Schema\n */\nexport function handleIntersection(\n type: ts.IntersectionType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n return buildNamedSchema(type, ctx, typeNode, () => {\n const types = type.types;\n const brandCollapsed = tryCollapseBrandedIntersection(types, ctx, typeNode);\n if (brandCollapsed) {\n return brandCollapsed;\n }\n\n const allOf: JsonSchema[] = [];\n for (const t of types) {\n const schema = typeToJsonSchema(t, ctx);\n if (Object.keys(schema).length > 0) {\n if (isEmptyObjectSchema(schema)) {\n continue;\n }\n allOf.push(schema);\n }\n }\n\n if (allOf.length === 0) {\n return {};\n }\n\n if (allOf.length === 1) {\n return allOf[0];\n }\n\n return { allOf };\n });\n}\n\n/**\n * Attempts to collapse a branded intersection type to a simpler schema.\n * A branded intersection is one that combines a primitive type with a brand object type.\n * \n * @param types - The constituent types of the intersection\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The simplified schema if collapse is possible, null otherwise\n */\nexport function tryCollapseBrandedIntersection(\n types: readonly ts.Type[],\n ctx: SchemaContext,\n _typeNode?: ts.TypeNode\n): JsonSchema | null {\n const { checker } = ctx;\n const parts = [...types];\n\n const prim = parts.find(isPrimitiveLike);\n if (!prim) return null;\n\n const rest = parts.filter(p => p !== prim);\n if (rest.every(r => isBrandObject(checker, r, ctx))) {\n return typeToJsonSchema(prim, ctx);\n }\n\n return null;\n}\n\n/**\n * Checks if a TypeScript type represents a primitive type (string, number, boolean, bigint, or their literals).\n * \n * @param t - The type to check\n * @returns True if the type is a primitive or primitive literal\n */\nexport function isPrimitiveLike(t: ts.Type): boolean {\n return (t.flags & (ts.TypeFlags.String | ts.TypeFlags.Number | ts.TypeFlags.Boolean | ts.TypeFlags.BigInt)) !== 0\n || (t.flags & ts.TypeFlags.StringLiteral) !== 0\n || (t.flags & ts.TypeFlags.NumberLiteral) !== 0;\n}\n\n/**\n * Checks if a TypeScript type represents a brand/billing object type.\n * Brand objects are simple objects with only brand-related properties like __brand or brand.\n * \n * @param checker - TypeScript type checker\n * @param t - The type to check\n * @param _ctx - The schema generation context (unused)\n * @returns True if the type appears to be a brand object\n */\nexport function isBrandObject(checker: ts.TypeChecker, t: ts.Type, _ctx: SchemaContext): boolean {\n if (!(t.flags & ts.TypeFlags.Object)) return false;\n\n const props = t.getProperties();\n if (props.length === 0) return false;\n\n const allowed = new Set([\"__brand\", \"__type\", \"__tag\", \"brand\"]);\n for (const p of props) {\n if (!allowed.has(p.getName())) return false;\n }\n\n const callSigs = (t as ts.ObjectType).getCallSignatures?.();\n if (callSigs && callSigs.length > 0) return false;\n\n const constructSigs = (t as ts.ObjectType).getConstructSignatures?.();\n if (constructSigs && constructSigs.length > 0) return false;\n\n return true;\n}\n\nfunction isEmptyObjectSchema(schema: JsonSchema): boolean {\n if (schema.type !== \"object\") {\n return false;\n }\n \n if (!schema.properties || Object.keys(schema.properties).length === 0) {\n if (!schema.additionalProperties) {\n return true;\n }\n }\n \n return false;\n}\n\nfunction buildNamedSchema(\n type: ts.Type,\n ctx: SchemaContext,\n typeNode: ts.TypeNode | undefined,\n build: () => JsonSchema\n): JsonSchema {\n const name = getSchemaName(type, typeNode);\n if (!name) {\n return build();\n }\n\n const { components, typeStack } = ctx;\n if (components.has(name) || typeStack.has(type)) {\n return { $ref: `#/components/schemas/${name}` };\n }\n\n typeStack.add(type);\n const schema = build();\n typeStack.delete(type);\n\n if (!components.has(name)) {\n components.set(name, schema);\n }\n\n return { $ref: `#/components/schemas/${name}` };\n}\n\nfunction getSchemaName(type: ts.Type, typeNode?: ts.TypeNode): string | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n const aliasName = aliasSymbol?.getName();\n if (aliasName && aliasName !== \"__type\") {\n return aliasName;\n }\n\n const symbol = type.getSymbol();\n const symbolName = symbol?.getName?.();\n if (symbolName && symbolName !== \"__type\") {\n return symbolName;\n }\n\n const nodeName = getExplicitTypeNameFromNode(typeNode);\n if (nodeName && nodeName !== \"__type\") {\n return nodeName;\n }\n\n return null;\n}\n\nfunction getExplicitTypeNameFromNode(typeNode?: ts.TypeNode): string | null {\n if (!typeNode) return null;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName)) {\n return typeNode.typeName.text;\n }\n }\n\n if (ts.isTypeAliasDeclaration(typeNode.parent)) {\n if (ts.isIdentifier(typeNode.parent.name)) {\n return typeNode.parent.name.text;\n }\n }\n\n return null;\n}\n","/**\n * Object type handling module.\n * Converts TypeScript object types and interfaces to JSON Schema.\n */\nimport ts from \"typescript\";\nimport type { JsonSchema, SchemaContext } from \"./types.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\n\n/**\n * Handles TypeScript object types and converts them to JSON Schema.\n * Manages named schemas, component registration, and cycle detection.\n * \n * @param type - The object type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated JSON Schema\n */\nexport function handleObjectType(\n type: ts.ObjectType,\n ctx: SchemaContext,\n typeNode?: ts.TypeNode\n): JsonSchema {\n const { checker, components, typeStack } = ctx;\n const symbol = type.getSymbol();\n const typeName = symbol?.getName?.() ?? getTypeNameFromNode(typeNode, ctx);\n\n if (isMetalOrmWrapperType(type, checker)) {\n return handleMetalOrmWrapper(type, ctx);\n }\n\n if (typeName && typeName !== \"__type\") {\n const isMetalOrmGeneric = METAL_ORM_WRAPPER_NAMES.some(name => \n typeName === name || typeName.endsWith(\"Api\")\n );\n \n if (isMetalOrmGeneric) {\n return {};\n }\n \n if (typeStack.has(type)) {\n return { $ref: `#/components/schemas/${typeName}` };\n }\n\n typeStack.add(type);\n }\n\n const schema = buildObjectSchema(type, ctx, typeNode);\n\n if (typeName && typeName !== \"__type\") {\n typeStack.delete(type);\n \n const existing = components.get(typeName);\n if (!existing) {\n components.set(typeName, schema);\n } else {\n const merged = mergeSchemasIfNeeded(existing, schema);\n if (merged !== existing) {\n components.set(typeName, merged);\n }\n }\n return { $ref: `#/components/schemas/${typeName}` };\n }\n\n typeStack.delete(type);\n return schema;\n}\n\n/**\n * Builds the actual object schema from a TypeScript object type.\n * Extracts properties, handles required fields, and processes Record types.\n * \n * @param type - The object type to convert\n * @param ctx - The schema generation context\n * @param typeNode - Optional type node for additional context\n * @returns The generated object schema\n */\nexport function buildObjectSchema(\n type: ts.ObjectType,\n ctx: SchemaContext,\n _typeNode?: ts.TypeNode\n): JsonSchema {\n const { checker, mode } = ctx;\n\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n const props = checker.getPropertiesOfType(type);\n for (const prop of props) {\n const propName = prop.getName();\n \n if (isIteratorOrSymbolProperty(propName)) {\n continue;\n }\n \n const propType = checker.getTypeOfSymbol(prop);\n if (isMethodLike(propType)) {\n continue;\n }\n\n const isOptional = !!(prop.flags & ts.SymbolFlags.Optional);\n const isRelation = isMetalOrmWrapperType(propType, checker);\n \n const propCtx = { ...ctx, propertyName: propName };\n properties[propName] = typeToJsonSchema(propType, propCtx);\n\n const shouldRequire = mode === \"response\"\n ? !isRelation && !isOptional\n : !isOptional;\n \n if (shouldRequire) {\n required.push(propName);\n }\n }\n\n const schema: JsonSchema = {\n type: \"object\",\n properties,\n };\n\n if (required.length > 0) {\n schema.required = required;\n }\n\n if (isRecordType(type, checker)) {\n const valueType = getRecordValueType(type, checker);\n if (valueType) {\n schema.additionalProperties = typeToJsonSchema(valueType, ctx);\n }\n }\n\n return schema;\n}\n\n/**\n * Checks if a TypeScript type represents a Record type.\n * \n * @param type - The type to check\n * @param _checker - TypeScript type checker (unused)\n * @returns True if the type is a Record type\n */\nexport function isRecordType(type: ts.ObjectType, _checker: ts.TypeChecker): boolean {\n const symbol = type.getSymbol();\n if (!symbol) return false;\n\n const name = symbol.getName();\n if (name === \"Record\") return true;\n\n return false;\n}\n\n/**\n * Extracts the value type from a Record type.\n * For Record<K, V>, returns V.\n * \n * @param type - The Record type to extract from\n * @param _checker - TypeScript type checker (unused)\n * @returns The value type, or null if not a Record or has no type arguments\n */\nexport function getRecordValueType(type: ts.ObjectType, _checker: ts.TypeChecker): ts.Type | null {\n const symbol = type.getSymbol();\n if (!symbol) return null;\n\n const name = symbol.getName();\n if (name === \"Record\") {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n if (typeArgs && typeArgs.length >= 2) {\n return typeArgs[1];\n }\n }\n\n return null;\n}\n\n/**\n * Checks if a type represents a Metal ORM wrapper type (e.g., HasManyCollection, BelongsToReference).\n * \n * @param type - The type to check\n * @param checker - TypeScript type checker for symbol resolution\n * @returns True if the type is a Metal ORM wrapper\n */\nexport function isMetalOrmWrapperType(type: ts.Type, checker: ts.TypeChecker): boolean {\n return !!findMetalOrmWrapper(type, checker);\n}\n\n/**\n * Checks if a TypeScript type represents a callable/method-like type.\n * \n * @param type - The type to check\n * @returns True if the type has call signatures (is callable)\n */\nexport function isMethodLike(type: ts.Type): boolean {\n const callSigs = type.getCallSignatures?.();\n return !!(callSigs && callSigs.length > 0);\n}\n\n/**\n * Checks if a property name represents an iterator or Symbol property that should be excluded.\n * \n * @param propName - The property name to check\n * @returns True if the property should be excluded from schema generation\n */\nexport function isIteratorOrSymbolProperty(propName: string): boolean {\n return propName.startsWith(\"__@\") || propName.startsWith(\"[\") || propName === Symbol.iterator.toString();\n}\n\n/**\n * Gets the type name from a type node or generates an anonymous name.\n * \n * @param typeNode - The type node to extract name from\n * @param _ctx - The schema generation context (unused)\n * @returns The type name or generated anonymous name\n */\nexport function getTypeNameFromNode(typeNode: ts.TypeNode | undefined, _ctx: SchemaContext): string {\n const explicitName = getExplicitTypeNameFromNode(typeNode);\n if (explicitName) return explicitName;\n\n return \"Anonymous_${ctx.typeNameStack.length}\";\n}\n\nfunction getExplicitTypeNameFromNode(typeNode?: ts.TypeNode): string | null {\n if (!typeNode) return null;\n\n if (ts.isTypeReferenceNode(typeNode)) {\n if (ts.isIdentifier(typeNode.typeName)) {\n return typeNode.typeName.text;\n }\n }\n\n if (ts.isTypeAliasDeclaration(typeNode.parent)) {\n if (ts.isIdentifier(typeNode.parent.name)) {\n return typeNode.parent.name.text;\n }\n }\n\n return null;\n}\n\nfunction mergeSchemasIfNeeded(existing: JsonSchema, newSchema: JsonSchema): JsonSchema {\n if (existing.type === \"array\" && newSchema.type === \"array\") {\n return mergeArraySchemas(existing, newSchema);\n }\n \n const result = { ...existing };\n \n for (const [key, newValue] of Object.entries(newSchema)) {\n if (key === \"properties\" && newValue) {\n result.properties = mergePropertiesIfNeeded(existing.properties || {}, newValue as Record<string, JsonSchema>);\n } else if (key === \"required\" && newValue) {\n result.required = mergeRequiredFields(existing.required || [], newValue as string[]);\n } else if (!deepEqual((existing as Record<string, unknown>)[key], newValue)) {\n (result as Record<string, unknown>)[key] = newValue;\n }\n }\n \n return result;\n}\n\nfunction mergePropertiesIfNeeded(existing: Record<string, JsonSchema>, newProps: Record<string, JsonSchema>): Record<string, JsonSchema> {\n const result = { ...existing };\n \n for (const [propName, newPropSchema] of Object.entries(newProps)) {\n const existingProp = existing[propName];\n \n if (!existingProp) {\n result[propName] = newPropSchema;\n } else if (deepEqual(existingProp, newPropSchema)) {\n continue;\n } else {\n result[propName] = mergePropertySchemas(existingProp, newPropSchema);\n }\n }\n \n return result;\n}\n\nfunction mergePropertySchemas(schema1: JsonSchema, schema2: JsonSchema): JsonSchema {\n if (deepEqual(schema1, schema2)) {\n return schema1;\n }\n \n if (schema1.type === \"array\" && schema2.type === \"array\") {\n return mergeArraySchemas(schema1, schema2);\n }\n \n const existingOneOf = schema1.oneOf || schema1.anyOf;\n const newOneOf = schema2.oneOf || schema2.anyOf;\n \n if (existingOneOf) {\n const mergedOneOf = [...existingOneOf];\n \n if (newOneOf) {\n for (const newItem of newOneOf) {\n if (!mergedOneOf.some(item => deepEqual(item, newItem))) {\n mergedOneOf.push(newItem);\n }\n }\n } else if (!mergedOneOf.some(item => deepEqual(item, schema2))) {\n mergedOneOf.push(schema2);\n }\n \n return { ...schema1, oneOf: mergedOneOf };\n }\n \n return {\n oneOf: [schema1, schema2]\n };\n}\n\nfunction mergeArraySchemas(schema1: JsonSchema, schema2: JsonSchema): JsonSchema {\n const result: JsonSchema = { type: \"array\" };\n \n if (schema1.uniqueItems || schema2.uniqueItems) {\n result.uniqueItems = true;\n }\n \n if (schema1.items && schema2.items) {\n result.items = mergePropertySchemas(schema1.items, schema2.items);\n } else if (schema1.items) {\n result.items = schema1.items;\n } else if (schema2.items) {\n result.items = schema2.items;\n }\n \n return result;\n}\n\nfunction mergeRequiredFields(existing: string[], newFields: string[]): string[] {\n const merged = new Set([...existing, ...newFields]);\n return Array.from(merged);\n}\n\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== typeof b) return false;\n \n if (typeof a === 'object') {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n \n if (aKeys.length !== bKeys.length) return false;\n \n for (const key of aKeys) {\n if (!bKeys.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n \n return true;\n }\n \n return false;\n}\n\nconst METAL_ORM_WRAPPER_NAMES = [\"HasManyCollection\", \"ManyToManyCollection\", \"BelongsToReference\", \"HasOneReference\"];\n\ninterface MetalOrmWrapperInfo {\n wrapperName: string;\n targetTypeArgs: ReadonlyArray<ts.Type>;\n isReadonlyArray: boolean;\n}\n\n/**\n * Finds and extracts information about a Metal ORM wrapper type within a type.\n * Handles both direct wrapper types and wrapper types within intersections.\n * \n * @param type - The type to analyze\n * @param checker - TypeScript type checker for symbol resolution\n * @returns Wrapper info if found, null otherwise\n */\nexport function findMetalOrmWrapper(\n type: ts.Type,\n checker: ts.TypeChecker\n): MetalOrmWrapperInfo | null {\n if (type.isIntersection()) {\n let wrapperInfo: MetalOrmWrapperInfo | null = null;\n let hasReadonlyArray = false;\n\n for (const constituent of (type as ts.IntersectionType).types) {\n const result = findWrapperInType(constituent, checker);\n if (result) {\n wrapperInfo = result;\n }\n if (!(constituent.flags & ts.TypeFlags.Object)) continue;\n const symbol = constituent.getSymbol();\n if (symbol?.getName() === \"ReadonlyArray\") {\n hasReadonlyArray = true;\n }\n }\n\n if (wrapperInfo) {\n return { ...wrapperInfo, isReadonlyArray: hasReadonlyArray };\n }\n return null;\n }\n\n return findWrapperInType(type, checker);\n}\n\nfunction findWrapperInType(type: ts.Type, checker: ts.TypeChecker): MetalOrmWrapperInfo | null {\n const aliasSymbol = (type as ts.TypeReference).aliasSymbol ?? (type as any).aliasSymbol;\n const symbol = type.getSymbol();\n const effectiveSymbol = (aliasSymbol && (aliasSymbol.flags & ts.SymbolFlags.Alias))\n ? checker.getAliasedSymbol(aliasSymbol)\n : symbol;\n\n if (!effectiveSymbol) return null;\n\n const name = effectiveSymbol.getName();\n if (!METAL_ORM_WRAPPER_NAMES.includes(name)) return null;\n\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments || [];\n\n return {\n wrapperName: name,\n targetTypeArgs: typeArgs,\n isReadonlyArray: false,\n };\n}\n\n/**\n * Gets the name of a Metal ORM wrapper type if applicable.\n * \n * @param type - The type to check\n * @param _checker - TypeScript type checker (unused)\n * @returns The wrapper type name if applicable, null otherwise\n */\nexport function getWrapperTypeName(type: ts.Type, _checker: ts.TypeChecker): string | null {\n const symbol = type.getSymbol();\n if (!symbol) return null;\n const name = symbol.getName();\n return METAL_ORM_WRAPPER_NAMES.includes(name) ? name : null;\n}\n\n/**\n * Handles Metal ORM wrapper types and converts them to appropriate JSON Schema.\n * Different wrapper types result in different schema structures.\n * \n * @param type - The wrapper object type to convert\n * @param ctx - The schema generation context\n * @returns The generated JSON Schema for the wrapper\n */\nexport function handleMetalOrmWrapper(type: ts.ObjectType, ctx: SchemaContext): JsonSchema {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const targetType = typeArgs?.[0] ?? null;\n \n const wrapperName = getWrapperTypeName(type, ctx.checker);\n if (!wrapperName) return {};\n \n const wrapperRel: Record<string, unknown> = { wrapper: wrapperName };\n \n if (!targetType) {\n return { \"x-metal-orm-rel\": wrapperRel };\n }\n \n if (wrapperName === \"HasManyCollection\" || wrapperName === \"ManyToManyCollection\") {\n if (ctx.typeStack.has(targetType)) {\n const items = {\n type: \"object\",\n properties: {\n id: { type: \"integer\" }\n },\n required: [\"id\"]\n };\n if (wrapperName === \"ManyToManyCollection\" && typeArgs?.[1]) {\n wrapperRel.pivot = typeArgs[1];\n }\n return {\n type: \"array\",\n items,\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n const items = targetType ? typeToJsonSchema(targetType, ctx) : {};\n if (wrapperName === \"ManyToManyCollection\" && typeArgs?.[1]) {\n wrapperRel.pivot = typeArgs[1];\n }\n \n return {\n type: \"array\",\n items,\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n if (wrapperName === \"BelongsToReference\" || wrapperName === \"HasOneReference\") {\n return handleBelongsToReference(targetType, ctx, wrapperRel);\n }\n \n const targetSchema = typeToJsonSchema(targetType, ctx);\n return {\n ...targetSchema,\n \"x-metal-orm-rel\": wrapperRel,\n };\n}\n\nfunction handleBelongsToReference(targetType: ts.Type, ctx: SchemaContext, wrapperRel: Record<string, unknown>): JsonSchema {\n const { components, typeStack } = ctx;\n \n const targetSymbol = targetType.getSymbol();\n const typeName = targetSymbol?.getName();\n \n if (!typeName) {\n return {\n type: \"object\",\n properties: {},\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n const refSchemaName = `${typeName}Ref`;\n \n if (components.has(refSchemaName)) {\n return { \n $ref: `#/components/schemas/${refSchemaName}`,\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n if (typeStack.has(targetType)) {\n const circularRefSchema = {\n type: \"object\",\n properties: {\n id: { type: \"integer\" }\n },\n required: [\"id\"]\n };\n components.set(refSchemaName, circularRefSchema);\n return {\n $ref: `#/components/schemas/${refSchemaName}`,\n \"x-metal-orm-rel\": wrapperRel,\n };\n }\n \n const refSchema = buildRefSchema(targetType, ctx);\n components.set(refSchemaName, refSchema);\n \n return {\n $ref: `#/components/schemas/${refSchemaName}`,\n \"x-metal-orm-rel\": wrapperRel,\n };\n}\n\nfunction buildRefSchema(type: ts.Type, ctx: SchemaContext): JsonSchema {\n const { checker } = ctx;\n \n if (!(type.flags & ts.TypeFlags.Object)) {\n return { type: \"object\", properties: {} };\n }\n \n const objectType = type as ts.ObjectType;\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n \n const props = checker.getPropertiesOfType(objectType);\n for (const prop of props) {\n const propName = prop.getName();\n \n if (isIteratorOrSymbolProperty(propName)) {\n continue;\n }\n \n const propType = checker.getTypeOfSymbol(prop);\n if (isMethodLike(propType)) {\n continue;\n }\n \n const isOptional = !!(prop.flags & ts.SymbolFlags.Optional);\n const isRelation = isMetalOrmWrapperType(propType, checker);\n \n if (isRelation) {\n continue;\n }\n \n const propCtx = { ...ctx, propertyName: propName };\n properties[propName] = typeToJsonSchema(propType, propCtx);\n \n if (!isOptional) {\n required.push(propName);\n }\n }\n \n const schema: JsonSchema = {\n type: \"object\",\n properties,\n };\n \n if (required.length > 0) {\n schema.required = required;\n }\n \n return schema;\n}\n","/**\n * Schema annotation extraction module.\n * Parses decorator-based schema annotations from TypeScript source code.\n */\nimport ts from \"typescript\";\n\n/**\n * Represents a fragment of JSON Schema that can be merged with other fragments.\n * Used for collecting schema annotations from decorators.\n */\nexport interface SchemaFragment {\n [key: string]: unknown;\n}\n\n/**\n * Extracts schema annotation fragments from a property or parameter declaration.\n * Looks for decorators like @Min, @Max, @Pattern, etc. and converts them to JSON Schema fragments.\n * \n * @param checker - TypeScript type checker for symbol resolution\n * @param prop - The property or parameter declaration to analyze\n * @returns Array of schema fragments from found decorators\n */\nexport function extractPropertySchemaFragments(\n checker: ts.TypeChecker,\n prop: ts.PropertyDeclaration | ts.ParameterDeclaration\n): SchemaFragment[] {\n if (!ts.canHaveDecorators(prop)) return [];\n\n const decs = ts.getDecorators(prop);\n if (!decs || decs.length === 0) return [];\n\n const frags: SchemaFragment[] = [];\n\n for (const d of decs) {\n const expr = d.expression;\n\n let callee: ts.Expression;\n let args: ts.NodeArray<ts.Expression>;\n\n if (ts.isCallExpression(expr)) {\n callee = expr.expression;\n args = expr.arguments;\n } else {\n callee = expr;\n args = ts.factory.createNodeArray([]);\n }\n\n const sym = checker.getSymbolAtLocation(callee);\n if (!sym) continue;\n\n const resolved = resolveImportedDecorator(checker, sym);\n if (!resolved || resolved.module !== \"adorn-api/schema\") continue;\n\n const name = resolved.name;\n\n if (name === \"Schema\") {\n const obj = args[0];\n if (obj && ts.isObjectLiteralExpression(obj)) {\n const frag = objectLiteralToJson(obj);\n if (frag) frags.push(frag);\n }\n continue;\n }\n\n if (name === \"Min\" && isNumberLiteral(args[0])) {\n frags.push({ minimum: Number(args[0].text) });\n } else if (name === \"Max\" && isNumberLiteral(args[0])) {\n frags.push({ maximum: Number(args[0].text) });\n } else if (name === \"ExclusiveMin\" && isNumberLiteral(args[0])) {\n frags.push({ exclusiveMinimum: Number(args[0].text) });\n } else if (name === \"ExclusiveMax\" && isNumberLiteral(args[0])) {\n frags.push({ exclusiveMaximum: Number(args[0].text) });\n } else if (name === \"MinLength\" && isNumberLiteral(args[0])) {\n frags.push({ minLength: Number(args[0].text) });\n } else if (name === \"MaxLength\" && isNumberLiteral(args[0])) {\n frags.push({ maxLength: Number(args[0].text) });\n } else if (name === \"Format\" && isStringLiteral(args[0])) {\n frags.push({ format: args[0].text });\n } else if (name === \"Pattern\") {\n const arg = args[0];\n if (arg && ts.isRegularExpressionLiteral(arg)) {\n frags.push({ pattern: extractRegexPattern(arg.text) });\n } else if (isStringLiteral(arg)) {\n frags.push({ pattern: arg.text });\n }\n } else if (name === \"MinItems\" && isNumberLiteral(args[0])) {\n frags.push({ minItems: Number(args[0].text) });\n } else if (name === \"MaxItems\" && isNumberLiteral(args[0])) {\n frags.push({ maxItems: Number(args[0].text) });\n } else if (name === \"MinProperties\" && isNumberLiteral(args[0])) {\n frags.push({ minProperties: Number(args[0].text) });\n } else if (name === \"MaxProperties\" && isNumberLiteral(args[0])) {\n frags.push({ maxProperties: Number(args[0].text) });\n } else if (name === \"MultipleOf\" && isNumberLiteral(args[0])) {\n frags.push({ multipleOf: Number(args[0].text) });\n } else if (name === \"Example\") {\n frags.push({ example: literalToJson(args[0]) });\n } else if (name === \"Examples\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ examples: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Description\" && isStringLiteral(args[0])) {\n frags.push({ description: args[0].text });\n } else if (name === \"Enum\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ enum: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Const\") {\n frags.push({ const: literalToJson(args[0]) });\n } else if (name === \"Default\") {\n frags.push({ default: literalToJson(args[0]) });\n } else if (name === \"AdditionalProperties\") {\n const arg = args[0];\n if (arg && (arg.kind === ts.SyntaxKind.FalseKeyword || arg.kind === ts.SyntaxKind.TrueKeyword)) {\n frags.push({ additionalProperties: arg.kind === ts.SyntaxKind.TrueKeyword });\n } else if (arg && ts.isObjectLiteralExpression(arg)) {\n const obj = objectLiteralToJson(arg);\n if (obj) frags.push({ additionalProperties: obj });\n }\n } else if (name === \"Closed\") {\n frags.push({ additionalProperties: false });\n } else if (name === \"ClosedUnevaluated\") {\n frags.push({ unevaluatedProperties: false });\n }\n }\n\n return frags;\n}\n\nfunction resolveImportedDecorator(\n checker: ts.TypeChecker,\n sym: ts.Symbol\n): { module: string; name: string } | null {\n const target = (sym.flags & ts.SymbolFlags.Alias) ? checker.getAliasedSymbol(sym) : sym;\n const name = target.getName();\n\n const decl = target.declarations?.[0];\n if (!decl) return null;\n\n const fileName = decl.getSourceFile().fileName.replace(/\\\\/g, \"/\");\n\n if (fileName.includes(\"/node_modules/adorn-api/\") || fileName.includes(\"/src/schema/\")) {\n return { module: \"adorn-api/schema\", name };\n }\n\n return null;\n}\n\nfunction isNumberLiteral(node: ts.Node | undefined): node is ts.NumericLiteral {\n return !!node && ts.isNumericLiteral(node);\n}\n\nfunction isStringLiteral(node: ts.Node | undefined): node is ts.StringLiteral {\n return !!node && ts.isStringLiteral(node);\n}\n\nfunction extractRegexPattern(text: string): string {\n const match = text.match(/^\\/(.+)\\/[gimsuy]*$/);\n return match ? match[1] : text;\n}\n\nfunction objectLiteralToJson(obj: ts.ObjectLiteralExpression): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n const name = prop.name;\n let key: string;\n if (ts.isIdentifier(name)) {\n key = name.text;\n } else if (ts.isStringLiteral(name)) {\n key = name.text;\n } else {\n continue;\n }\n out[key] = literalToJson(prop.initializer);\n }\n return out;\n}\n\nfunction literalToJson(node: ts.Expression): unknown {\n if (ts.isStringLiteral(node)) return node.text;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isObjectLiteralExpression(node)) return objectLiteralToJson(node);\n if (ts.isArrayLiteralExpression(node)) return node.elements.map(e => literalToJson(e));\n return undefined;\n}\n\n/**\n * Merges multiple schema fragments into a single schema object.\n * Later fragments override earlier ones for conflicting keys.\n * \n * @param base - The base schema object to merge into\n * @param frags - Variable number of schema fragments to merge\n * @returns The merged schema object\n */\nexport function mergeFragments(base: Record<string, unknown>, ...frags: SchemaFragment[]): Record<string, unknown> {\n const result = { ...base };\n for (const frag of frags) {\n Object.assign(result, frag);\n }\n return result;\n}\n\n/**\n * Extracts the description from JSDoc comments on a node.\n * \n * @param checker - TypeScript type checker\n * @param node - The AST node to extract description from\n * @returns The cleaned description text, or undefined if no description found\n */\nexport function extractJSDocDescription(checker: ts.TypeChecker, node: ts.Node): string | undefined {\n const sourceFile = node.getSourceFile();\n const docComments = ts.getLeadingCommentRanges(sourceFile.fileName, node.pos);\n if (!docComments || docComments.length === 0) return undefined;\n\n const sourceText = sourceFile.getText();\n let fullComment = \"\";\n\n for (const commentRange of docComments) {\n const comment = sourceText.substring(commentRange.pos, commentRange.end);\n const cleanComment = comment\n .replace(/^\\/\\*\\*/, \"\")\n .replace(/\\*\\/$/, \"\")\n .replace(/^\\s*\\*\\s?/gm, \"\")\n .trim();\n fullComment += cleanComment + \"\\n\";\n }\n\n return fullComment.trim() || undefined;\n}\n\n/**\n * Extracts JSDoc tags from a node and converts them to schema properties.\n * Supports @example, @default, @description, and @deprecated tags.\n * \n * @param checker - TypeScript type checker\n * @param node - The AST node to extract tags from\n * @returns Object mapping tag names to their extracted values\n */\nexport function extractJSDocTags(checker: ts.TypeChecker, node: ts.Node): Record<string, unknown> {\n const tags: Record<string, unknown> = {};\n\n const jsDocTags = ts.getJSDocTags(node);\n if (!jsDocTags) return tags;\n\n for (const tag of jsDocTags) {\n const tagName = tag.tagName.text;\n\n if (tagName === \"example\") {\n const exampleComment = getTagComment(tag);\n if (exampleComment) {\n const existing = (tags.examples as string[]) ?? [];\n tags.examples = [...existing, exampleComment];\n }\n } else if (tagName === \"default\") {\n const defaultComment = getTagComment(tag);\n if (defaultComment) {\n tags.default = parseDefaultValue(defaultComment);\n }\n } else if (tagName === \"description\") {\n const desc = getTagComment(tag);\n if (desc) {\n tags.description = desc;\n }\n } else if (tagName === \"deprecated\") {\n tags.deprecated = true;\n }\n }\n\n return tags;\n}\n\nfunction getTagComment(tag: ts.JSDocTag): string | undefined {\n const comment = tag.comment;\n if (typeof comment === \"string\") {\n return comment.trim();\n }\n if (comment && Array.isArray(comment) && comment.length > 0) {\n return comment.map(c => typeof c === \"string\" ? c : c.text).join(\" \").trim();\n }\n return undefined;\n}\n\nfunction parseDefaultValue(comment: string): unknown {\n const trimmed = comment.trim();\n\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n\n const num = Number(trimmed);\n if (!isNaN(num) && trimmed === num.toString()) return num;\n\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n\n return trimmed;\n}\n\n/**\n * Extracts schema annotation fragments from a class declaration.\n * Looks for class-level decorators and JSDoc comments.\n * \n * @param checker - TypeScript type checker for symbol resolution\n * @param classDecl - The class declaration to analyze\n * @returns Array of schema fragments from found annotations\n */\nexport function extractClassSchemaFragments(\n checker: ts.TypeChecker,\n classDecl: ts.ClassDeclaration\n): SchemaFragment[] {\n const frags: SchemaFragment[] = [];\n\n if (!ts.canHaveDecorators(classDecl)) return [];\n\n const decs = ts.getDecorators(classDecl);\n if (!decs || decs.length === 0) return frags;\n\n for (const d of decs) {\n const expr = d.expression;\n\n let callee: ts.Expression;\n let args: ts.NodeArray<ts.Expression>;\n\n if (ts.isCallExpression(expr)) {\n callee = expr.expression;\n args = expr.arguments;\n } else {\n callee = expr;\n args = ts.factory.createNodeArray([]);\n }\n\n const sym = checker.getSymbolAtLocation(callee);\n if (!sym) continue;\n\n const resolved = resolveImportedDecorator(checker, sym);\n if (!resolved || resolved.module !== \"adorn-api/schema\") continue;\n\n const name = resolved.name;\n\n if (name === \"Schema\") {\n const obj = args[0];\n if (obj && ts.isObjectLiteralExpression(obj)) {\n const frag = objectLiteralToJson(obj);\n if (frag) frags.push(frag);\n }\n } else if (name === \"Description\" && isStringLiteral(args[0])) {\n frags.push({ description: args[0].text });\n } else if (name === \"Example\") {\n frags.push({ example: literalToJson(args[0]) });\n } else if (name === \"Examples\" && ts.isArrayLiteralExpression(args[0])) {\n frags.push({ examples: args[0].elements.map(e => literalToJson(e)) });\n } else if (name === \"Closed\") {\n frags.push({ additionalProperties: false });\n } else if (name === \"ClosedUnevaluated\") {\n frags.push({ unevaluatedProperties: false });\n }\n }\n\n const jsDocDesc = extractJSDocDescription(checker, classDecl);\n if (jsDocDesc) {\n frags.push({ description: jsDocDesc });\n }\n\n const jsDocTags = extractJSDocTags(checker, classDecl);\n if (Object.keys(jsDocTags).length > 0) {\n frags.push(jsDocTags);\n }\n\n return frags;\n}\n","/**\n * Parameter specification building module.\n * Converts scanned parameters to OpenAPI parameter objects.\n */\nimport type { ScannedOperation } from \"../analyze/scanControllers.js\";\nimport type { SchemaContext, JsonSchema } from \"./types.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\nimport { extractPropertySchemaFragments, mergeFragments } from \"./extractAnnotations.js\";\n\n/**\n * Builds OpenAPI path parameter objects from scanned operation parameters.\n * Adds them to the provided parameters array.\n * \n * @param operation - The scanned operation containing path parameters\n * @param ctx - The schema generation context\n * @param parameters - Array to accumulate parameter objects\n */\nexport function buildPathParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n for (const paramIndex of operation.pathParamIndices) {\n const param = operation.parameters[paramIndex];\n if (param) {\n let paramSchema = typeToJsonSchema(param.type, ctx);\n if (param.paramNode) {\n const frags = extractPropertySchemaFragments(ctx.checker, param.paramNode);\n if (frags.length > 0) {\n paramSchema = mergeFragments(paramSchema as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n \n const schema = paramSchema.$ref\n ? { $ref: paramSchema.$ref }\n : paramSchema;\n \n const paramName = param.name.toLowerCase();\n const isIdParam = paramName === \"id\" || paramName.endsWith(\"id\");\n \n if (!schema.$ref && schema.type === \"number\" && isIdParam) {\n schema.type = \"integer\";\n if (!schema.minimum) {\n schema.minimum = 1;\n }\n }\n \n parameters.push({\n name: param.name,\n in: \"path\",\n required: !param.isOptional,\n schema,\n });\n }\n }\n}\n\n/**\n * Builds OpenAPI query parameter objects from scanned operation parameters.\n * Handles both individual query parameters and query objects.\n * \n * @param operation - The scanned operation containing query parameters\n * @param ctx - The schema generation context\n * @param parameters - Array to accumulate parameter objects\n */\nexport function buildQueryParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.queryObjectParamIndex !== null) {\n const queryParam = operation.parameters[operation.queryObjectParamIndex];\n if (!queryParam) return;\n \n const querySchema = typeToJsonSchema(queryParam.type, ctx);\n const { properties: queryObjProps, required: queryRequired } = \n resolveAndCollectObjectProps(querySchema, ctx.components);\n \n for (const [propName, propSchema] of Object.entries(queryObjProps)) {\n const isRequired = queryRequired.includes(propName);\n \n const isDeepObject = isDeepObjectSchema(propSchema, ctx);\n const isObjectLike = isObjectLikeSchema(propSchema, ctx);\n const serialization = determineQuerySerialization(propSchema.type);\n const exampleValue = generateExampleValue(propSchema, propName);\n \n if (isDeepObject) {\n parameters.push({\n name: propName,\n in: \"query\",\n required: isRequired,\n style: \"deepObject\",\n explode: true,\n schema: propSchema.$ref ? { $ref: propSchema.$ref } : propSchema,\n });\n } else if (isObjectLike) {\n const schemaRef = propSchema.$ref || \"#/components/schemas/InlineQueryParam\";\n parameters.push({\n name: propName,\n in: \"query\",\n required: isRequired,\n schema: { type: \"string\" },\n description: `JSON-encoded object. ${exampleValue}`,\n examples: {\n default: { value: parseExampleValue(exampleValue) }\n },\n \"x-adorn-jsonSchemaRef\": schemaRef,\n });\n } else {\n const paramDef: any = {\n name: propName,\n in: \"query\",\n required: isRequired,\n schema: propSchema.$ref ? { $ref: propSchema.$ref } : propSchema,\n };\n \n if (propName === \"page\") {\n paramDef.schema = { type: \"integer\", default: 1, minimum: 1 };\n } else if (propName === \"pageSize\") {\n paramDef.schema = { type: \"integer\", default: 10, minimum: 1 };\n } else if (propName === \"totalItems\") {\n paramDef.schema = { type: \"integer\", minimum: 0 };\n } else if (propName === \"sort\") {\n paramDef.schema = {\n oneOf: [\n { type: \"string\" },\n { type: \"array\", items: { type: \"string\" } }\n ]\n };\n } else if (propName === \"q\") {\n paramDef.schema = { type: \"string\" };\n } else if (propName === \"hasComments\") {\n paramDef.schema = { type: \"boolean\" };\n }\n \n if (Object.keys(serialization).length > 0) {\n Object.assign(paramDef, serialization);\n }\n \n parameters.push(paramDef);\n }\n }\n }\n\n for (const paramIndex of operation.queryParamIndices) {\n const param = operation.parameters[paramIndex];\n if (param) {\n let paramSchema = typeToJsonSchema(param.type, ctx);\n if (param.paramNode) {\n const frags = extractPropertySchemaFragments(ctx.checker, param.paramNode);\n if (frags.length > 0) {\n paramSchema = mergeFragments(paramSchema as Record<string, unknown>, ...frags) as JsonSchema;\n }\n }\n\n const isDeepObject = isDeepObjectSchema(paramSchema, ctx);\n const isObjectLike = isObjectLikeSchema(paramSchema, ctx);\n \n if (isDeepObject) {\n parameters.push({\n name: param.name,\n in: \"query\",\n required: !param.isOptional,\n style: \"deepObject\",\n explode: true,\n schema: paramSchema.$ref ? { $ref: paramSchema.$ref } : paramSchema,\n });\n } else if (isObjectLike) {\n const schemaRef = paramSchema.$ref || \"#/components/schemas/InlineQueryParam\";\n const exampleValue = generateExampleValue(paramSchema, param.name);\n parameters.push({\n name: param.name,\n in: \"query\",\n required: !param.isOptional,\n schema: { type: \"string\" },\n description: `JSON-encoded object. ${exampleValue}`,\n examples: {\n default: { value: parseExampleValue(exampleValue) }\n },\n \"x-adorn-jsonSchemaRef\": schemaRef,\n });\n } else {\n const serialization = determineQuerySerialization(paramSchema.type);\n parameters.push({\n name: param.name,\n in: \"query\",\n required: !param.isOptional,\n schema: paramSchema.$ref ? { $ref: paramSchema.$ref } : paramSchema,\n ...(Object.keys(serialization).length > 0 ? serialization : {}),\n });\n }\n }\n }\n}\n\n/**\n * Builds OpenAPI header parameter objects from scanned operation parameters.\n * Extracts individual header parameters from a headers object.\n * \n * @param operation - The scanned operation containing header parameters\n * @param ctx - The schema generation context\n * @param parameters - Array to accumulate parameter objects\n */\nexport function buildHeaderParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.headerObjectParamIndex === null) return;\n\n const headerParam = operation.parameters[operation.headerObjectParamIndex];\n if (!headerParam) return;\n\n const headerSchema = typeToJsonSchema(headerParam.type, ctx);\n if (!headerSchema.properties) return;\n\n const headerObjProps = headerSchema.properties;\n for (const [propName, propSchema] of Object.entries(headerObjProps as Record<string, any>)) {\n const isRequired = headerSchema.required?.includes(propName) ?? false;\n parameters.push({\n name: propName,\n in: \"header\",\n required: isRequired,\n schema: propSchema,\n });\n }\n}\n\n/**\n * Builds OpenAPI cookie parameter objects from scanned operation parameters.\n * Extracts individual cookie parameters from a cookies object.\n * \n * @param operation - The scanned operation containing cookie parameters\n * @param ctx - The schema generation context\n * @param parameters - Array to accumulate parameter objects\n */\nexport function buildCookieParameters(operation: ScannedOperation, ctx: SchemaContext, parameters: any[]): void {\n if (operation.cookieObjectParamIndex === null) return;\n\n const cookieParam = operation.parameters[operation.cookieObjectParamIndex];\n if (!cookieParam) return;\n\n const cookieSchema = typeToJsonSchema(cookieParam.type, ctx);\n if (!cookieSchema.properties) return;\n\n const cookieObjProps = cookieSchema.properties;\n for (const [propName, propSchema] of Object.entries(cookieObjProps as Record<string, any>)) {\n const isRequired = cookieSchema.required?.includes(propName) ?? false;\n parameters.push({\n name: propName,\n in: \"cookie\",\n required: isRequired,\n schema: propSchema,\n style: \"form\",\n explode: true,\n });\n }\n}\n\n/**\n * Determines OpenAPI serialization style/explode options based on schema type.\n * \n * @param schemaType - The schema type(s) to analyze\n * @returns Object containing style and explode options if applicable\n */\nexport function determineQuerySerialization(schemaType: string | string[] | undefined): { style?: string; explode?: boolean } {\n const typeArray = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n const isArray = typeArray.includes(\"array\");\n\n if (isArray) {\n return { style: \"form\", explode: true };\n }\n\n return {};\n}\n\n/**\n * Generates an example value description for a schema.\n * Creates a human-readable example showing the expected structure.\n * \n * @param schema - The JSON Schema to generate example for\n * @param propName - The property name for the example\n * @returns A description string with example value\n */\nexport function generateExampleValue(schema: JsonSchema, propName: string): string {\n const resolved = resolveSchemaRef(schema, new Map());\n \n if (resolved.type === \"object\" && resolved.properties) {\n const example: Record<string, unknown> = {};\n for (const [key, prop] of Object.entries(resolved.properties)) {\n const propResolved = resolveSchemaRef(prop, new Map());\n if (propResolved.type === \"string\") {\n example[key] = \"value\";\n } else if (propResolved.type === \"number\" || propResolved.type === \"integer\") {\n example[key] = 1;\n } else if (propResolved.type === \"boolean\") {\n example[key] = true;\n } else if (Array.isArray(propResolved.type) && propResolved.type.includes(\"null\")) {\n example[key] = null;\n } else if (propResolved.enum) {\n example[key] = propResolved.enum[0];\n } else {\n example[key] = \"value\";\n }\n }\n return `Example: ${propName}=${JSON.stringify(example)}`;\n }\n \n return `Example: ${propName}=${JSON.stringify({ key: \"value\" })}`;\n}\n\n/**\n * Parses an example value from a description string.\n * Extracts the JSON object from \"Example: propName={...}\" format.\n * \n * @param description - The description string to parse\n * @returns The extracted JSON string, or default if not found\n */\nexport function parseExampleValue(description: string): string {\n const match = description.match(/Example:\\s*\\w+=(\\{[^}]+\\})/);\n if (match) {\n return match[1];\n }\n return JSON.stringify({ key: \"value\" });\n}\n\nfunction isDeepObjectSchema(schema: JsonSchema, ctx: SchemaContext): boolean {\n const resolved = resolveSchemaRef(schema, ctx.components);\n \n if (resolved.type === \"array\") {\n return false;\n }\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isDeepObjectSchema(branch, ctx)) {\n return true;\n }\n }\n }\n \n return false;\n}\n\nfunction isObjectLikeSchema(schema: JsonSchema, ctx: SchemaContext): boolean {\n const resolved = resolveSchemaRef(schema, ctx.components);\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isObjectLikeSchema(branch, ctx)) {\n return true;\n }\n }\n }\n \n if (resolved.type === \"array\" && resolved.items) {\n const itemsSchema = resolveSchemaRef(resolved.items, ctx.components);\n return isObjectLikeSchema(itemsSchema, ctx);\n }\n \n return false;\n}\n\n/**\n * Recursively resolves $ref references in a JSON Schema.\n * \n * @param schema - The schema to resolve references in\n * @param components - Map of component schemas for reference resolution\n * @returns The resolved schema with all references followed\n */\nexport function resolveSchemaRef(schema: JsonSchema, components: Map<string, JsonSchema>): JsonSchema {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n const next = components.get(name);\n if (!next) return schema;\n\n return resolveSchemaRef(next, components);\n}\n\n/**\n * Resolves object schema references and collects all properties.\n * Handles allOf composition and $ref resolution.\n * \n * @param schema - The object schema to process\n * @param components - Map of component schemas for reference resolution\n * @returns Object containing all collected properties and required fields\n */\nexport function resolveAndCollectObjectProps(\n schema: JsonSchema,\n components: Map<string, JsonSchema>\n): { properties: Record<string, JsonSchema>; required: string[] } {\n const resolved = resolveSchemaRef(schema, components);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n \n const processSchema = (s: JsonSchema): void => {\n const current = resolveSchemaRef(s, components);\n \n if (current.properties) {\n for (const [key, val] of Object.entries(current.properties)) {\n if (!properties[key]) {\n properties[key] = val;\n }\n }\n }\n \n if (current.required) {\n for (const req of current.required) {\n if (!required.includes(req)) {\n required.push(req);\n }\n }\n }\n \n if (current.allOf) {\n for (const branch of current.allOf) {\n processSchema(branch);\n }\n }\n };\n \n processSchema(resolved);\n return { properties, required };\n}\n","/**\n * Manifest generation module.\n * Creates the manifest file describing the compiled API structure.\n */\nimport type { ScannedController, ScannedOperation } from \"../analyze/scanControllers.js\";\nimport type { ManifestV1, ControllerEntry, OperationEntry, ArgsSpec, HttpMethod } from \"./format.js\";\nimport { typeToJsonSchema } from \"../schema/typeToJsonSchema.js\";\nimport type { SchemaContext, JsonSchema } from \"../schema/typeToJsonSchema.js\";\nimport ts from \"typescript\";\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\n/**\n * Generates the manifest file content from scanned controllers.\n * The manifest describes the complete API structure including all controllers, operations, and their parameters.\n * \n * @param controllers - Array of scanned controllers to include in the manifest\n * @param checker - TypeScript type checker for analyzing types\n * @param version - Version of the adorn-api package\n * @param validationMode - Validation mode to specify in the manifest (default: \"ajv-runtime\")\n * @returns The generated manifest object\n */\nexport function generateManifest(\n controllers: ScannedController[],\n checker: ts.TypeChecker,\n version: string,\n validationMode: ValidationMode = \"ajv-runtime\"\n): ManifestV1 {\n const components = new Map<string, any>();\n const ctx: SchemaContext = {\n checker,\n components,\n typeStack: new Set(),\n typeNameStack: [],\n mode: \"request\",\n };\n\n const controllerEntries: ControllerEntry[] = controllers.map(ctrl => ({\n controllerId: ctrl.className,\n basePath: ctrl.basePath,\n operations: ctrl.operations.map(op => buildOperationEntry(op, ctx)),\n }));\n\n const validationConfig: { mode: \"none\" | \"ajv-runtime\" | \"precompiled\"; precompiledModule: string | null } =\n validationMode === \"precompiled\"\n ? { mode: \"precompiled\", precompiledModule: null }\n : validationMode === \"none\"\n ? { mode: \"none\", precompiledModule: null }\n : { mode: \"ajv-runtime\", precompiledModule: null };\n\n return {\n manifestVersion: 1,\n generatedAt: new Date().toISOString(),\n generator: {\n name: \"adorn-api\",\n version,\n typescript: ts.version,\n },\n schemas: {\n kind: \"openapi-3.1\",\n file: \"./openapi.json\",\n componentsSchemasPointer: \"/components/schemas\",\n },\n validation: validationConfig,\n controllers: controllerEntries,\n };\n}\n\n/**\n * Recursively resolves $ref references in JSON Schema objects.\n * @internal\n */\nfunction resolveSchemaRef(schema: JsonSchema, components: Map<string, JsonSchema>): JsonSchema {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n const next = components.get(name);\n if (!next) return schema;\n\n return resolveSchemaRef(next, components);\n}\n\n/**\n * Resolves and collects properties from an object schema, handling $ref and allOf.\n * @internal\n */\nfunction resolveAndCollectObjectProps(\n schema: JsonSchema,\n components: Map<string, JsonSchema>\n): { properties: Record<string, JsonSchema>; required: string[] } {\n const resolved = resolveSchemaRef(schema, components);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n \n const processSchema = (s: JsonSchema): void => {\n const current = resolveSchemaRef(s, components);\n \n if (current.properties) {\n for (const [key, val] of Object.entries(current.properties)) {\n if (!properties[key]) {\n properties[key] = val;\n }\n }\n }\n \n if (current.required) {\n for (const req of current.required) {\n if (!required.includes(req)) {\n required.push(req);\n }\n }\n }\n \n if (current.allOf) {\n for (const branch of current.allOf) {\n processSchema(branch);\n }\n }\n };\n \n processSchema(resolved);\n return { properties, required };\n}\n\n/**\n * Checks if a schema represents a deepObject style parameter (object but not array).\n * @internal\n */\nfunction isDeepObjectSchema(schema: JsonSchema, components: Map<string, JsonSchema>): boolean {\n const resolved = resolveSchemaRef(schema, components);\n \n if (resolved.type === \"array\") {\n return false;\n }\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isDeepObjectSchema(branch, components)) {\n return true;\n }\n }\n }\n \n return false;\n}\n\n/**\n * Checks if a schema represents an object-like structure.\n * @internal\n */\nfunction isObjectLikeSchema(schema: JsonSchema, components: Map<string, JsonSchema>): boolean {\n const resolved = resolveSchemaRef(schema, components);\n \n if (resolved.type === \"object\" || resolved.properties || resolved.additionalProperties) {\n return true;\n }\n \n if (resolved.allOf) {\n for (const branch of resolved.allOf) {\n if (isObjectLikeSchema(branch, components)) {\n return true;\n }\n }\n }\n \n if (resolved.type === \"array\" && resolved.items) {\n const itemsSchema = resolveSchemaRef(resolved.items, components);\n return isObjectLikeSchema(itemsSchema, components);\n }\n \n return false;\n}\n\n/**\n * Builds an OperationEntry from a ScannedOperation.\n * @internal\n */\nfunction buildOperationEntry(op: ScannedOperation, ctx: SchemaContext): OperationEntry {\n const args: ArgsSpec = {\n body: null,\n path: [],\n query: [],\n headers: [],\n cookies: [],\n };\n\n buildPathArgs(op, ctx, args);\n buildQueryArgs(op, ctx, args);\n buildHeaderArgs(op, ctx, args);\n buildCookieArgs(op, ctx, args);\n\n if (op.bodyParamIndex !== null) {\n const bodyParam = op.parameters[op.bodyParamIndex];\n if (bodyParam) {\n const bodySchema = typeToJsonSchema(bodyParam.type, ctx);\n const schemaRef = bodySchema.$ref ?? \"#/components/schemas/InlineBody\";\n\n args.body = {\n index: bodyParam.index,\n required: !bodyParam.isOptional,\n contentType: op.bodyContentType ?? \"application/json\",\n schemaRef,\n };\n }\n }\n\n const responseSchema = typeToJsonSchema(op.returnType, ctx, op.returnTypeNode);\n const status = op.httpMethod === \"POST\" ? 201 : 200;\n\n let schemaRef = responseSchema.$ref;\n let isArray = false;\n\n if (!schemaRef && responseSchema.type === \"array\" && responseSchema.items?.$ref) {\n schemaRef = responseSchema.items.$ref;\n isArray = true;\n } else if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineResponse\";\n }\n\n return {\n operationId: op.operationId,\n http: {\n method: op.httpMethod as HttpMethod,\n path: op.path,\n },\n handler: {\n methodName: op.methodName,\n },\n args,\n responses: [\n {\n status,\n contentType: \"application/json\",\n schemaRef,\n isArray,\n },\n ],\n };\n}\n\n/**\n * Builds path argument specifications from scanned operation parameters.\n * @internal\n */\nfunction buildPathArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n for (const paramIndex of op.pathParamIndices) {\n const param = op.parameters[paramIndex];\n if (param) {\n const paramSchema = typeToJsonSchema(param.type, ctx);\n\n args.path.push({\n name: param.name,\n index: param.index,\n required: !param.isOptional,\n schemaRef: paramSchema.$ref ?? \"#/components/schemas/InlinePathParam\",\n schemaType: paramSchema.type,\n });\n }\n }\n}\n\n/**\n * Builds query argument specifications from scanned operation parameters.\n * @internal\n */\nfunction buildQueryArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.queryObjectParamIndex !== null) {\n const queryParam = op.parameters[op.queryObjectParamIndex];\n if (!queryParam) return;\n\n const querySchema = typeToJsonSchema(queryParam.type, ctx);\n const { properties: queryObjProps, required: queryRequired } = \n resolveAndCollectObjectProps(querySchema, ctx.components);\n \n for (const [propName, propSchema] of Object.entries(queryObjProps)) {\n const isRequired = queryRequired.includes(propName) ?? false;\n const isDeepObject = isDeepObjectSchema(propSchema, ctx.components);\n const isObjectLike = isObjectLikeSchema(propSchema, ctx.components);\n \n let schemaRef = (propSchema as any).$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineQueryParam\";\n }\n\n args.query.push({\n name: propName,\n index: queryParam.index,\n required: isRequired,\n schemaRef,\n schemaType: (propSchema as any).type,\n serialization: isDeepObject ? { style: \"deepObject\", explode: true } : undefined,\n content: !isDeepObject && isObjectLike ? \"application/json\" : undefined,\n });\n }\n }\n\n for (const paramIndex of op.queryParamIndices) {\n const param = op.parameters[paramIndex];\n if (param) {\n const paramSchema = typeToJsonSchema(param.type, ctx);\n const isDeepObject = isDeepObjectSchema(paramSchema, ctx.components);\n const isObjectLike = isObjectLikeSchema(paramSchema, ctx.components);\n const schemaRef = (paramSchema as any).$ref ?? \"#/components/schemas/InlineQueryParam\";\n\n args.query.push({\n name: param.name,\n index: param.index,\n required: !param.isOptional,\n schemaRef,\n schemaType: (paramSchema as any).type,\n serialization: isDeepObject ? { style: \"deepObject\", explode: true } : undefined,\n content: !isDeepObject && isObjectLike ? \"application/json\" : undefined,\n });\n }\n }\n}\n\n/**\n * Builds header argument specifications from scanned operation parameters.\n * @internal\n */\nfunction buildHeaderArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.headerObjectParamIndex === null) return;\n\n const headerParam = op.parameters[op.headerObjectParamIndex];\n if (!headerParam) return;\n\n const headerSchema = typeToJsonSchema(headerParam.type, ctx);\n if (!headerSchema.properties) return;\n\n for (const [propName, propSchema] of Object.entries(headerSchema.properties as Record<string, any>)) {\n const isRequired = headerSchema.required?.includes(propName) ?? false;\n let schemaRef = propSchema.$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineHeaderParam\";\n }\n\n args.headers.push({\n name: propName,\n index: headerParam.index,\n required: isRequired,\n schemaRef,\n schemaType: propSchema.type,\n });\n }\n}\n\n/**\n * Builds cookie argument specifications from scanned operation parameters.\n * @internal\n */\nfunction buildCookieArgs(op: ScannedOperation, ctx: SchemaContext, args: ArgsSpec): void {\n if (op.cookieObjectParamIndex === null) return;\n\n const cookieParam = op.parameters[op.cookieObjectParamIndex];\n if (!cookieParam) return;\n\n const cookieSchema = typeToJsonSchema(cookieParam.type, ctx);\n if (!cookieSchema.properties) return;\n\n for (const [propName, propSchema] of Object.entries(cookieSchema.properties as Record<string, any>)) {\n const isRequired = cookieSchema.required?.includes(propName) ?? false;\n let schemaRef = propSchema.$ref;\n if (!schemaRef) {\n schemaRef = \"#/components/schemas/InlineCookieParam\";\n }\n\n args.cookies.push({\n name: propName,\n index: cookieParam.index,\n required: isRequired,\n schemaRef,\n schemaType: propSchema.type,\n serialization: { style: \"form\", explode: true },\n });\n }\n}\n","/**\n * Precompiled validator generation module.\n * Uses AJV to generate standalone validation code for improved performance.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\n\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport type { AnySchema } from \"ajv\";\n\n/**\n * OpenAPI specification interface for validator generation.\n */\ninterface OpenApi {\n openapi: string;\n components?: {\n schemas?: Record<string, unknown>;\n };\n}\n\n/**\n * Manifest interface for validator generation.\n */\ninterface Manifest {\n manifestVersion: number;\n controllers: Array<{\n controllerId: string;\n basePath: string;\n operations: Array<{\n operationId: string;\n args: {\n body?: {\n schemaRef: string;\n contentType: string;\n } | null;\n response?: Array<{\n status: number;\n contentType: string;\n schemaRef?: string;\n }>;\n };\n responses: Array<{\n status: number;\n contentType: string;\n schemaRef: string;\n }>;\n }>;\n }>;\n}\n\nconst OAS_SCHEMA_ONLY = new Set([\"discriminator\", \"xml\", \"externalDocs\", \"example\"]);\n\nfunction sanitizeSchemaForAjv(schema: unknown): unknown {\n if (schema === null || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(sanitizeSchemaForAjv);\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema as Record<string, unknown>)) {\n if (OAS_SCHEMA_ONLY.has(k)) continue;\n if (k.startsWith(\"x-\")) continue;\n out[k] = sanitizeSchemaForAjv(v);\n }\n return out;\n}\n\nfunction rewriteComponentRefs(schema: unknown): unknown {\n if (schema === null || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(rewriteComponentRefs);\n\n if (typeof (schema as Record<string, unknown>).$ref === \"string\") {\n const ref = (schema as Record<string, unknown>).$ref as string;\n const m = ref.match(/^#\\/components\\/schemas\\/(.+)$/);\n if (m) {\n return { ...schema, $ref: m[1] };\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema as Record<string, unknown>)) {\n out[k] = rewriteComponentRefs(v);\n }\n return out;\n}\n\nfunction safeId(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, \"_\").replace(/^[^A-Za-z_]/, \"_$&\");\n}\n\nfunction schemaNameFromRef(schemaRef: string): string {\n return schemaRef.replace(/^#\\/components\\/schemas\\//, \"\");\n}\n\n/**\n * Options for emitting precompiled validators.\n */\nexport interface EmitPrecompiledValidatorsOptions {\n outDir: string;\n openapi: OpenApi;\n manifest: Manifest;\n strict?: \"off\" | \"log\" | \"error\";\n formatsMode?: \"fast\" | \"full\";\n}\n\n/**\n * Emits precompiled validators for the API.\n * Generates standalone validation code using AJV for optimal performance.\n * \n * @param opts - Options including output directory, OpenAPI spec, manifest, and validation settings\n * @returns Promise resolving to paths of generated validator files and a content hash\n */\nexport async function emitPrecompiledValidators(opts: EmitPrecompiledValidatorsOptions): Promise<{\n validatorsCjsPath: string;\n validatorsEsmPath: string;\n hash: string;\n}> {\n const outDir = opts.outDir;\n const cjsPath = path.join(outDir, \"validators.cjs\");\n const esmPath = path.join(outDir, \"validators.mjs\");\n const metaPath = path.join(outDir, \"validators.meta.json\");\n\n fs.mkdirSync(outDir, { recursive: true });\n\n const schemas: AnySchema[] = [];\n\n for (const [name, sch] of Object.entries(opts.openapi.components?.schemas ?? {})) {\n const clean = rewriteComponentRefs(sanitizeSchemaForAjv(sch));\n schemas.push({ ...(clean as object), $id: name } as AnySchema);\n }\n\n const opIndex: Record<string, { body?: string; response: Record<string, string> }> = {};\n\n for (const ctrl of opts.manifest.controllers ?? []) {\n for (const op of ctrl.operations ?? []) {\n const entry: { body?: string; response: Record<string, string> } = { response: {} };\n opIndex[op.operationId] = entry;\n\n if (op.args.body?.schemaRef) {\n const typeName = schemaNameFromRef(op.args.body.schemaRef);\n const id = safeId(`op_${op.operationId}_body`);\n schemas.push({ $id: id, $ref: typeName } as AnySchema);\n entry.body = id;\n }\n\n for (const r of op.responses ?? []) {\n if (!r.schemaRef) continue;\n const typeName = schemaNameFromRef(r.schemaRef);\n const key = `${r.status}|${r.contentType}`;\n const id = safeId(`op_${op.operationId}_res_${r.status}_${r.contentType}`);\n schemas.push({ $id: id, $ref: typeName } as AnySchema);\n entry.response[key] = id;\n }\n }\n }\n\n const strictOpt = opts.strict === \"off\" ? false : opts.strict === \"log\" ? \"log\" : true;\n\n const ajv = new Ajv.default({\n schemas,\n allErrors: true,\n strict: strictOpt,\n code: { source: true },\n });\n\n addFormats.default(ajv, { mode: opts.formatsMode ?? \"full\" });\n\n let cjs: string;\n const standaloneModule = require(\"ajv/dist/standalone\");\n if (typeof standaloneModule === \"function\") {\n cjs = standaloneModule(ajv);\n } else if (standaloneModule && typeof standaloneModule.default === \"function\") {\n cjs = standaloneModule.default(ajv);\n } else {\n throw new Error(\"Unable to find standalone code generator in ajv/dist/standalone\");\n }\n\n cjs += \"\\n\\n// --- adorn-api operation lookup (generated) ---\\n\";\n cjs += \"exports.validators = {\\n\";\n for (const [operationId, v] of Object.entries(opIndex)) {\n cjs += ` ${JSON.stringify(operationId)}: {\\n`;\n cjs += ` body: ${v.body ? `exports[${JSON.stringify(v.body)}]` : \"undefined\"},\\n`;\n cjs += \" response: {\\n\";\n for (const [key, id] of Object.entries(v.response)) {\n cjs += ` ${JSON.stringify(key)}: exports[${JSON.stringify(id)}],\\n`;\n }\n cjs += \" }\\n\";\n cjs += \" },\\n\";\n }\n cjs += \"};\\n\";\n\n fs.writeFileSync(cjsPath, cjs, \"utf8\");\n\n const esm = `// .adorn/validators.mjs (generated)\nimport { createRequire } from \"node:module\";\nconst require = createRequire(import.meta.url);\nconst cjs = require(\"./validators.cjs\");\n\nexport const validators = cjs.validators;\n\nexport function validateBody(operationId, data) {\n const v = validators?.[operationId]?.body;\n if (!v) return { ok: true, errors: null };\n const ok = v(data);\n return { ok, errors: ok ? null : v.errors };\n}\n\nexport function validateResponse(operationId, status, contentType, data) {\n const key = String(status) + \"|\" + String(contentType);\n const v = validators?.[operationId]?.response?.[key];\n if (!v) return { ok: true, errors: null };\n const ok = v(data);\n return { ok, errors: ok ? null : v.errors };\n}\n`;\n fs.writeFileSync(esmPath, esm, \"utf8\");\n\n const hash = crypto.createHash(\"sha256\").update(cjs).digest(\"hex\");\n fs.writeFileSync(metaPath, JSON.stringify({ hash }, null, 2), \"utf8\");\n\n return { validatorsCjsPath: cjsPath, validatorsEsmPath: esmPath, hash };\n}\n","/**\n * Cache invalidation and staleness detection module.\n * Determines whether the compiled artifacts need to be regenerated based on file changes.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { AdornCacheV1 } from \"./schema.js\";\n\n/**\n * Result of a cache staleness check.\n * - stale: false means cache is valid and artifacts can be used as-is\n * - stale: true means cache is invalid and artifacts need to be regenerated\n */\nexport type StaleResult =\n | { stale: false; reason: \"up-to-date\" }\n | { stale: true; reason: string; detail?: string };\n\nfunction readJson<T>(p: string): T | null {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nfunction statMtimeMs(p: string): number | null {\n try {\n return fs.statSync(p).mtimeMs;\n } catch {\n return null;\n }\n}\n\nfunction ensureAbs(p: string): string {\n return path.isAbsolute(p) ? p : path.resolve(p);\n}\n\n/**\n * Collects all TypeScript config files in the inheritance chain.\n * Follows the \"extends\" property recursively to build a complete list of config files.\n * \n * @param tsconfigPathAbs - Absolute path to the root tsconfig.json\n * @returns Array of absolute paths to all config files in the chain, in order from root to leaf\n */\nexport function collectTsconfigChain(tsconfigPathAbs: string): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n\n function visit(pAbs: string) {\n if (seen.has(pAbs)) return;\n seen.add(pAbs);\n out.push(pAbs);\n\n const raw = readJson<any>(pAbs);\n const ext = raw?.extends;\n if (!ext) return;\n\n let resolved: string | null = null;\n\n if (ext.startsWith(\".\") || ext.startsWith(\"/\") || /^[A-Za-z]:\\\\/.test(ext)) {\n resolved = ensureAbs(path.resolve(path.dirname(pAbs), ext));\n if (!resolved.endsWith(\".json\")) resolved += \".json\";\n } else {\n try {\n const req = (module as any).createRequire?.(import.meta.url) ?? require;\n resolved = req.resolve(ext);\n } catch {\n try {\n const req = (module as any).createRequire?.(import.meta.url) ?? require;\n resolved = req.resolve(ext.endsWith(\".json\") ? ext : `${ext}.json`);\n } catch {\n resolved = null;\n }\n }\n }\n\n if (resolved) visit(resolved);\n }\n\n visit(tsconfigPathAbs);\n return out;\n}\n\n/**\n * Searches for a package lockfile (pnpm-lock.yaml, package-lock.json, or yarn.lock)\n * starting from the given directory and moving up the directory tree.\n * \n * @param startDir - The directory to start searching from\n * @returns Object with path and modification time of the found lockfile, or null if not found\n */\nexport function findLockfile(startDir: string): { path: string; mtimeMs: number } | null {\n const names = [\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\"];\n let dir = startDir;\n\n for (let i = 0; i < 20; i++) {\n for (const n of names) {\n const p = path.join(dir, n);\n const mt = statMtimeMs(p);\n if (mt !== null) return { path: p, mtimeMs: mt };\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Determines whether the compiled artifacts are stale and need to be regenerated.\n * Checks the manifest, cache file, TypeScript config files, lockfile, and input files.\n * \n * @param params - Object containing outDir, project path, adorn version, and TypeScript version\n * @returns Promise resolving to a StaleResult indicating whether regeneration is needed\n */\nexport async function isStale(params: {\n outDir: string;\n project: string;\n adornVersion: string;\n typescriptVersion: string;\n}): Promise<StaleResult> {\n const outDirAbs = ensureAbs(params.outDir);\n const tsconfigAbs = ensureAbs(params.project);\n\n const manifestPath = path.join(outDirAbs, \"manifest.json\");\n const cachePath = path.join(outDirAbs, \"cache.json\");\n\n if (!fs.existsSync(manifestPath)) return { stale: true, reason: \"missing-manifest\" };\n\n const cache = readJson<AdornCacheV1>(cachePath);\n if (!cache) return { stale: true, reason: \"missing-cache\" };\n\n if (cache.generator.version !== params.adornVersion) {\n return { stale: true, reason: \"generator-version-changed\", detail: `${cache.generator.version} -> ${params.adornVersion}` };\n }\n\n if (ensureAbs(cache.project.tsconfigPath) !== tsconfigAbs) {\n return { stale: true, reason: \"tsconfig-changed\", detail: \"different project path\" };\n }\n\n const chain = collectTsconfigChain(tsconfigAbs);\n for (const cfg of chain) {\n const mt = statMtimeMs(cfg);\n if (mt === null) return { stale: true, reason: \"config-missing\", detail: cfg };\n\n const cachedMt = cache.project.configFiles[cfg];\n if (cachedMt === null || Math.abs(cachedMt - mt) > 0.0001) {\n return { stale: true, reason: \"config-updated\", detail: cfg };\n }\n }\n\n if (cache.project.lockfile?.path) {\n const mt = statMtimeMs(cache.project.lockfile.path);\n if (mt === null) return { stale: true, reason: \"lockfile-missing\", detail: cache.project.lockfile.path };\n\n if (Math.abs(cache.project.lockfile.mtimeMs - mt) > 0.0001) {\n return { stale: true, reason: \"lockfile-updated\", detail: cache.project.lockfile.path };\n }\n }\n\n for (const [file, cachedMt] of Object.entries(cache.inputs)) {\n const mt = statMtimeMs(file);\n if (mt === null) return { stale: true, reason: \"input-missing\", detail: file };\n if (Math.abs(cachedMt - mt) > 0.0001) return { stale: true, reason: \"input-updated\", detail: file };\n }\n\n return { stale: false, reason: \"up-to-date\" };\n}\n","/**\n * Cache writing module.\n * Persists cache information to disk for future staleness checks.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport ts from \"typescript\";\nimport { collectTsconfigChain, findLockfile } from \"./isStale.js\";\nimport type { AdornCacheV1 } from \"./schema.js\";\n\nfunction statMtimeMs(p: string): number {\n return fs.statSync(p).mtimeMs;\n}\n\nfunction ensureDir(p: string) {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction isProjectSourceFile(f: string): boolean {\n if (f.includes(`${path.sep}node_modules${path.sep}`)) return false;\n if (f.includes(`${path.sep}typescript${path.sep}lib${path.sep}`)) return false;\n return /\\.(ts|tsx|mts|cts)$/.test(f);\n}\n\n/**\n * Writes cache information to the output directory.\n * Captures the current state of the compilation environment for future staleness checks.\n * \n * @param params - Object containing output directory, tsconfig path, TypeScript program, and adorn version\n */\nexport function writeCache(params: {\n outDir: string;\n tsconfigAbs: string;\n program: ts.Program;\n adornVersion: string;\n}): void {\n const outDirAbs = path.isAbsolute(params.outDir) ? params.outDir : path.resolve(params.outDir);\n ensureDir(outDirAbs);\n\n const configFiles = collectTsconfigChain(params.tsconfigAbs);\n const configMtimes: Record<string, number> = {};\n for (const cfg of configFiles) configMtimes[cfg] = statMtimeMs(cfg);\n\n const lock = findLockfile(path.dirname(params.tsconfigAbs));\n\n const inputs: Record<string, number> = {};\n for (const sf of params.program.getSourceFiles()) {\n const f = sf.fileName;\n if (!isProjectSourceFile(f)) continue;\n try {\n inputs[f] = statMtimeMs(f);\n } catch {\n // Ignore files that don't exist\n }\n }\n\n const cache: AdornCacheV1 = {\n cacheVersion: 1,\n generator: {\n name: \"adorn-api\",\n version: params.adornVersion,\n typescript: ts.version\n },\n project: {\n tsconfigPath: params.tsconfigAbs,\n configFiles: configMtimes,\n lockfile: lock ?? null\n },\n inputs\n };\n\n fs.writeFileSync(path.join(outDirAbs, \"cache.json\"), JSON.stringify(cache, null, 2), \"utf8\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,kBAA2E;AAC3E,IAAAC,oBAAwB;;;ACExB,wBAAe;AACf,qBAA6B;AAC7B,uBAAiC;AAoB1B,SAAS,wBAAwB,cAAsC;AAC5E,QAAM,mBAAe,0BAAQ,YAAY;AACzC,QAAM,gBAAY,0BAAQ,YAAY;AAEtC,QAAM,aAAa,kBAAAC,QAAG,eAAe,cAAc,CAACC,cAAS,6BAAaA,OAAM,OAAO,CAAC;AACxF,MAAI,WAAW,OAAO;AACpB,UAAM,IAAI,MAAM,4BAA4B,kBAAAD,QAAG,6BAA6B,WAAW,MAAM,aAAa,IAAI,CAAC,EAAE;AAAA,EACnH;AAEA,QAAM,SAAS,kBAAAA,QAAG,2BAA2B,WAAW,QAAQ,kBAAAA,QAAG,KAAK,SAAS;AACjF,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,WAAW,OAAO,OAAO,IAAI,OAAK,kBAAAA,QAAG,6BAA6B,EAAE,aAAa,IAAI,CAAC;AAC5F,UAAM,IAAI,MAAM;AAAA,EAA8B,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,EACrE;AAEA,QAAM,UAAU,kBAAAA,QAAG,cAAc,OAAO,WAAW,OAAO,OAAO;AACjE,QAAM,UAAU,QAAQ,eAAe;AAEvC,QAAM,cAAc,QAAQ,eAAe,EAAE;AAAA,IAAO,QAClD,CAAC,GAAG,qBACJ,CAAC,GAAG,SAAS,SAAS,cAAc;AAAA,EACtC;AAEA,SAAO,EAAE,SAAS,SAAS,YAAY;AACzC;;;AC9CA,IAAAE,qBAAe;;;ACJR,SAAS,mBAAmB,gBAAwB,YAA4B;AACrF,SAAO,GAAG,cAAc,IAAI,UAAU;AACxC;;;ADyFO,SAAS,gBACd,aACA,SACqB;AACrB,QAAM,cAAmC,CAAC;AAE1C,aAAW,cAAc,aAAa;AACpC,uBAAAC,QAAG,aAAa,YAAY,CAAC,SAAS;AACpC,UAAI,mBAAAA,QAAG,mBAAmB,IAAI,KAAK,KAAK,MAAM;AAC5C,cAAM,aAAa,aAAa,MAAM,YAAY,OAAO;AACzD,YAAI,YAAY;AACd,sBAAY,KAAK,UAAU;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAUA,SAAS,aACP,MACA,YACA,SAC0B;AAC1B,MAAI,CAAC,KAAK,KAAM,QAAO;AAEvB,QAAM,sBAAsB,cAAc,MAAM,YAAY;AAC5D,MAAI,CAAC,oBAAqB,QAAO;AAEjC,QAAM,WAAW,0BAA0B,mBAAmB,KAAK;AACnE,QAAM,YAAY,KAAK,KAAK;AAE5B,QAAM,WAAW,qBAAqB,MAAM,OAAO;AACnD,QAAM,WAAW,qBAAqB,MAAM,OAAO;AAEnD,QAAM,aAAiC,CAAC;AAExC,aAAW,UAAU,KAAK,SAAS;AACjC,QAAI,mBAAAA,QAAG,oBAAoB,MAAM,KAAK,OAAO,MAAM;AACjD,YAAM,YAAY,cAAc,QAAQ,WAAW,OAAO;AAC1D,UAAI,WAAW;AACb,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMA,SAAS,qBAAqB,MAA2B,UAAgD;AACvG,QAAM,YAAY,cAAc,MAAM,UAAU;AAChD,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,WAAW,UAAU;AAC3B,MAAI,CAAC,mBAAAA,QAAG,iBAAiB,QAAQ,EAAG,QAAO;AAC3C,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,WAAW,KAAK,CAAC;AACvB,MAAI,mBAAAA,QAAG,gBAAgB,QAAQ,GAAG;AAChC,WAAO,CAAC,SAAS,IAAI;AAAA,EACvB;AACA,MAAI,mBAAAA,QAAG,yBAAyB,QAAQ,GAAG;AACzC,WAAO,SAAS,SACb,OAAO,mBAAAA,QAAG,eAAe,EACzB,IAAI,OAAK,EAAE,IAAI;AAAA,EACpB;AACA,SAAO;AACT;AAMA,SAAS,qBAAqB,MAA2B,UAAgD;AACvG,QAAM,YAAY,cAAc,MAAM,UAAU;AAChD,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,WAAW,UAAU;AAC3B,MAAI,CAAC,mBAAAA,QAAG,iBAAiB,QAAQ,EAAG,QAAO;AAC3C,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,WAAW,KAAK,CAAC;AACvB,MAAI,mBAAAA,QAAG,gBAAgB,QAAQ,GAAG;AAChC,WAAO,CAAC,SAAS,IAAI;AAAA,EACvB;AACA,MAAI,mBAAAA,QAAG,yBAAyB,QAAQ,GAAG;AACzC,WAAO,SAAS,SACb,OAAO,mBAAAA,QAAG,eAAe,EACzB,IAAI,OAAK,EAAE,IAAI;AAAA,EACpB;AACA,SAAO;AACT;AAMA,SAAS,cACP,MACA,WACA,SACyB;AACzB,QAAM,aAAa,mBAAAA,QAAG,aAAa,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AACjE,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,cAAc,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ;AAC5D,MAAI,aAA4B;AAChC,MAAIC,QAAO;AAEX,aAAW,UAAU,aAAa;AAChC,UAAM,YAAY,cAAc,MAAM,MAAM;AAC5C,QAAI,WAAW;AACb,mBAAa,OAAO,YAAY;AAChC,MAAAA,QAAO,0BAA0B,SAAS,KAAK;AAC/C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,YAAY,QAAQ,4BAA4B,IAAI;AAC1D,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI,aAAa,QAAQ,yBAAyB,SAAS;AAC3D,eAAa,cAAc,YAAY,OAAO;AAC9C,QAAM,iBAAiB,sBAAsB,KAAK,IAAI;AAEtD,QAAM,aAAiC,CAAC;AACxC,WAAS,IAAI,GAAG,IAAI,KAAK,WAAW,QAAQ,KAAK;AAC/C,UAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,UAAM,YAAY,mBAAAD,QAAG,aAAa,MAAM,IAAI,IAAI,MAAM,KAAK,OAAO,MAAM,CAAC;AACzE,UAAM,YAAY,QAAQ,kBAAkB,KAAK;AACjD,UAAM,aAAa,CAAC,CAAC,MAAM,iBAAiB,CAAC,CAAC,MAAM;AAEpD,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,kBAAkBC,KAAI;AAC7C,QAAM,mBAAmB,yBAAyB,gBAAgB,UAAU;AAE5E,QAAM,EAAE,gBAAgB,mBAAmB,uBAAuB,wBAAwB,wBAAwB,gBAAgB,IAChI,mBAAmB,YAAY,YAAY,kBAAkB,OAAO;AAEtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAAA;AAAA,IACA,aAAa,mBAAmB,WAAW,UAAU;AAAA,IACrD,mBAAmB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,kBAAkBA,OAAwB;AACjD,QAAM,UAAUA,MAAK,MAAM,WAAW;AACtC,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QAAQ,IAAI,OAAK,EAAE,MAAM,CAAC,CAAC;AACpC;AAMA,SAAS,yBAAyB,gBAA0B,YAA0C;AACpG,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,gBAAgB;AACjC,UAAM,QAAQ,WAAW,KAAK,OAAK,EAAE,SAAS,IAAI;AAClD,QAAI,OAAO;AACT,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,mBACP,YACA,YACA,kBACA,SAQA;AACA,QAAM,cAAc,IAAI,IAAI,gBAAgB;AAC5C,QAAM,oBAA8B,CAAC;AACrC,MAAI,iBAAgC;AACpC,MAAI,wBAAuC;AAC3C,MAAI,yBAAwC;AAC5C,MAAI,yBAAwC;AAE5C,QAAM,eAAe,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU;AAEjE,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,QAAQ,WAAW,CAAC;AAC1B,QAAI,YAAY,IAAI,CAAC,EAAG;AAExB,UAAM,kBAAkB,QAAQ,mBAAmB,MAAM,IAAI;AAC7D,UAAM,UAAU,YAAY,MAAM,IAAI,KAAK,YAAY,eAAe;AAEtE,QAAI,YAAY,QAAQ;AACtB,uBAAiB;AACjB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,QAAI,YAAY,SAAS;AACvB,8BAAwB;AACxB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,QAAI,YAAY,WAAW;AACzB,+BAAyB;AACzB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,QAAI,YAAY,WAAW;AACzB,+BAAyB;AACzB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,QAAI,gBAAgB,mBAAmB,MAAM;AAC3C,uBAAiB;AACjB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ,aAAa,iBAAiB,OAAO;AACnD,QAAI,SAAS,0BAA0B,QAAQ,CAAC,cAAc;AAC5D,8BAAwB;AACxB,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAEA,sBAAkB,KAAK,CAAC;AACxB,gBAAY,IAAI,CAAC;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,EACnB;AACF;AAMA,SAAS,aAAa,MAAe,SAAkC;AACrE,QAAM,eAAe,KAAK,QAAQ,mBAAAD,QAAG,UAAU,YAAY;AAC3D,QAAM,qBAAqB,KAAK,QAAQ,mBAAAA,QAAG,UAAU,kBAAkB;AAEvE,MAAI,CAAC,eAAe,CAAC,kBAAmB,QAAO;AAE/C,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ,QAAQ,MAAM,WAAY,QAAO;AAE7C,QAAM,aAAa,QAAQ,oBAAoB,IAAI;AACnD,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,QAAM,WAAW,KAAK,oBAAoB;AAC1C,MAAI,YAAY,SAAS,SAAS,EAAG,QAAO;AAE5C,SAAO;AACT;AAMA,SAAS,YAAY,MAAuB;AAC1C,QAAM,cAAe,KAA0B,eAAgB,KAAa;AAC5E,MAAI,YAAa,QAAO,YAAY,QAAQ;AAC5C,QAAM,SAAS,KAAK,UAAU;AAC9B,SAAO,QAAQ,QAAQ,KAAK;AAC9B;AAMA,SAAS,cAAc,MAAwB,MAAmC;AAChF,QAAM,aAAa,mBAAAA,QAAG,cAAc,IAAI;AACxC,MAAI,CAAC,WAAY,QAAO;AAExB,aAAW,aAAa,YAAY;AAClC,QAAI,mBAAAA,QAAG,iBAAiB,UAAU,UAAU,GAAG;AAC7C,YAAM,OAAO,UAAU,WAAW;AAClC,UAAI,mBAAAA,QAAG,aAAa,IAAI,KAAK,KAAK,SAAS,MAAM;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,0BAA0B,WAAwC;AACzE,MAAI,mBAAAA,QAAG,iBAAiB,UAAU,UAAU,GAAG;AAC7C,UAAM,MAAM,UAAU,WAAW,UAAU,CAAC;AAC5C,QAAI,OAAO,mBAAAA,QAAG,gBAAgB,GAAG,GAAG;AAClC,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,cAAc,MAAe,UAAmC;AACvE,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ,QAAQ,MAAM,WAAW;AACnC,UAAM,WAAY,KAA0B;AAC5C,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO,SAAS,CAAC;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAMA,SAAS,sBAAsB,UAAiD;AAC9E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,mBAAAA,QAAG,oBAAoB,QAAQ,GAAG;AACpC,QAAI,mBAAAA,QAAG,aAAa,SAAS,QAAQ,KAAK,SAAS,SAAS,SAAS,WAAW;AAC9E,aAAO,SAAS,gBAAgB,CAAC,KAAK;AAAA,IACxC;AAAA,EACF;AAEA,SAAO;AACT;;;AEteA,IAAAE,qBAAe;;;ACAf,IAAAC,qBAAe;;;ACAf,IAAAC,qBAAe;AAYR,SAAS,oBACd,MACA,KACA,UACmB;AACnB,QAAM,EAAE,SAAS,aAAa,IAAI;AAElC,MAAI,KAAK,QAAQ,mBAAAC,QAAG,UAAU,WAAW;AACvC,WAAO,CAAC;AAAA,EACV;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,MAAM;AAClC,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,MAAI,WAAW,MAAM,OAAO,GAAG;AAC7B,WAAO,EAAE,MAAM,UAAU,QAAQ,YAAY;AAAA,EAC/C;AAEA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,QAAQ;AACpC,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,QAAQ;AACpC,WAAO,qBAAqB,MAAM,SAAS,UAAU,YAAY;AAAA,EACnE;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,SAAS;AACrC,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,QAAQ;AACpC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,eAAe;AAC3C,UAAM,QAAS,KAA8B;AAC7C,WAAO,EAAE,MAAM,UAAU,MAAM,CAAC,KAAK,EAAE;AAAA,EACzC;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,eAAe;AAC3C,UAAM,QAAS,KAA8B;AAC7C,WAAO,EAAE,MAAM,UAAU,MAAM,CAAC,KAAK,EAAE;AAAA,EACzC;AACA,MAAI,KAAK,QAAQ,mBAAAA,QAAG,UAAU,gBAAgB;AAC5C,UAAM,YAAa,KAAa;AAChC,WAAO,EAAE,MAAM,WAAW,MAAM,CAAC,cAAc,MAAM,EAAE;AAAA,EACzD;AAEA,SAAO;AACT;AAUO,SAAS,WAAW,MAAe,SAAkC;AAC1E,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,cAAe,KAAa;AAClC,MAAI,eAAgB,YAAY,QAAQ,mBAAAA,QAAG,YAAY,OAAQ;AAC7D,UAAM,UAAU,QAAQ,iBAAiB,WAAW;AACpD,WAAO,SAAS,QAAQ,MAAM;AAAA,EAChC;AAEA,MAAI,UAAW,OAAO,QAAQ,mBAAAA,QAAG,YAAY,OAAQ;AACnD,UAAM,UAAU,QAAQ,iBAAiB,MAAM;AAC/C,WAAO,SAAS,QAAQ,MAAM;AAAA,EAChC;AAEA,SAAO,QAAQ,QAAQ,MAAM;AAC/B;AA2BO,SAAS,qBAAqB,MAAe,SAAyB,UAAwB,cAAmC;AACtI,QAAM,WAAW,4BAA4B,QAAQ,KAAK;AAC1D,QAAM,SAAS,mBAAmB,MAAM,OAAO;AAC/C,QAAM,aAAa,QAAQ,QAAQ,KAAK;AAExC,MAAI,oBAAoB,QAAQ,KAAK,oBAAoB,UAAU,KAAK,oBAAoB,gBAAgB,IAAI,GAAG;AACjH,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,SAAO,EAAE,MAAM,SAAS;AAC1B;AASO,SAAS,oBAAoB,UAAkC;AACpE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,QAAQ,SAAS,YAAY;AACnC,SAAO,UAAU,QACV,MAAM,SAAS,IAAI,KACnB,UAAU,gBACV,UAAU,QACV,UAAU,UACV,UAAU,cACV,UAAU,gBACV,UAAU,WACV,UAAU;AACnB;AAQO,SAAS,4BAA4B,UAAuC;AACjF,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,mBAAAC,QAAG,oBAAoB,QAAQ,GAAG;AACpC,QAAI,mBAAAA,QAAG,aAAa,SAAS,QAAQ,GAAG;AACtC,aAAO,SAAS,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,mBAAAA,QAAG,uBAAuB,SAAS,MAAM,GAAG;AAC9C,QAAI,mBAAAA,QAAG,aAAa,SAAS,OAAO,IAAI,GAAG;AACzC,aAAO,SAAS,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,mBAAmB,MAAe,SAA2C;AAC3F,QAAM,cAAe,KAA0B,eAAgB,KAAa;AAC5E,MAAI,eAAgB,YAAY,QAAQ,mBAAAA,QAAG,YAAY,OAAQ;AAC7D,WAAO,QAAQ,iBAAiB,WAAW;AAAA,EAC7C;AACA,SAAO,KAAK,UAAU,KAAK;AAC7B;;;ACrLA,IAAAC,qBAAe;AAaR,SAAS,YACd,MACA,KACA,UACY;AACZ,SAAO,iBAAiB,MAAM,KAAK,UAAU,MAAM;AACjD,UAAM,QAAQ,KAAK;AACnB,UAAM,WAAW,MAAM,KAAK,OAAK,EAAE,QAAQ,mBAAAC,QAAG,UAAU,IAAI;AAC5D,UAAM,gBAAgB,MAAM,KAAK,OAAK,EAAE,QAAQ,mBAAAA,QAAG,UAAU,SAAS;AACtE,UAAM,aAAa,MAAM,OAAO,OAAK,EAAE,EAAE,QAAQ,mBAAAA,QAAG,UAAU,SAAS,EAAE,EAAE,QAAQ,mBAAAA,QAAG,UAAU,UAAU;AAE1G,UAAM,oBAAoB,WAAW,MAAM,OAAK,EAAE,QAAQ,mBAAAA,QAAG,UAAU,aAAa;AACpF,QAAI,qBAAqB,WAAW,SAAS,GAAG;AAC9C,YAAM,aAAa,WAAW,IAAI,OAAM,EAA2B,KAAK;AACxE,YAAM,SAAqB,EAAE,MAAM,UAAU,MAAM,WAAW;AAC9D,UAAI,UAAU;AACZ,eAAO,OAAO,CAAC,UAAU,MAAM;AAAA,MACjC;AACA,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,WAAW,SAAS,KAAK,WAAW,MAAM,OAAK,EAAE,QAAQ,mBAAAA,QAAG,UAAU,cAAc;AAC/G,QAAI,oBAAoB;AACtB,YAAM,SAAqB,EAAE,MAAM,UAAU;AAC7C,UAAI,YAAY,eAAe;AAC7B,eAAO,OAAO,CAAC,WAAW,MAAM;AAAA,MAClC;AACA,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,WAAW,KAAK,UAAU;AACvC,YAAM,cAAc,iBAAiB,WAAW,CAAC,GAAG,GAAG;AACvD,UAAI,OAAO,YAAY,SAAS,UAAU;AACxC,oBAAY,OAAO,CAAC,YAAY,MAAM,MAAM;AAAA,MAC9C;AACA,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,YAAM,WAAW,WAAW,IAAI,OAAK,iBAAiB,GAAG,GAAG,CAAC;AAC7D,YAAM,UAAU,CAAC,CAAC;AAElB,YAAM,SAAqB,CAAC;AAE5B,UAAI,SAAS;AACX,eAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,MAAM,OAAO,CAAC;AAAA,MAC/C,OAAO;AACL,eAAO,QAAQ;AAAA,MACjB;AAEA,YAAM,sBAAsB,yBAAyB,YAAY,KAAK,QAAQ;AAC9E,UAAI,qBAAqB;AACvB,eAAO,QAAQ;AACf,eAAO,gBAAgB;AAAA,MACzB;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,aAAO,iBAAiB,WAAW,CAAC,GAAG,GAAG;AAAA,IAC5C;AAEA,WAAO,CAAC;AAAA,EACV,CAAC;AACH;AAWO,SAAS,yBACd,OACA,KACA,WAC4B;AAC5B,MAAI,MAAM,SAAS,EAAG,QAAO;AAE7B,QAAM,aAAa,wBAAwB,IAAI,SAAS,KAAK;AAC7D,aAAW,YAAY,YAAY;AACjC,UAAM,gBAAgB,MAAM,MAAM,OAAK,mBAAmB,IAAI,SAAS,GAAG,QAAQ,CAAC;AACnF,QAAI,CAAC,cAAe;AAEpB,UAAM,cAAc,MAAM,IAAI,OAAK,yBAAyB,IAAI,SAAS,GAAG,QAAQ,CAAC;AACrF,QAAI,YAAY,KAAK,OAAK,MAAM,IAAI,EAAG;AAEvC,UAAM,UAAU;AAChB,QAAI,CAAC,gBAAgB,OAAO,EAAG;AAE/B,UAAM,UAAkC,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,aAAa,oBAAoB,MAAM,CAAC,GAAG,GAAG;AACpD,iBAAW,OAAO,QAAQ,CAAC,GAAG;AAC5B,gBAAQ,GAAG,IAAI,wBAAwB,UAAU;AAAA,MACnD;AAAA,IACF;AAEA,WAAO,EAAE,cAAc,UAAU,QAAQ;AAAA,EAC3C;AAEA,SAAO;AACT;AASO,SAAS,wBAAwB,SAAyB,OAAqC;AACpG,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAEhC,QAAM,aAAa,MAAM,CAAC,EAAE,cAAc,EAAE,IAAI,OAAK,EAAE,QAAQ,CAAC;AAChE,SAAO,WAAW;AAAA,IAAO,UACvB,MAAM,MAAM,OAAK,CAAC,CAAC,QAAQ,kBAAkB,GAAG,IAAI,CAAC;AAAA,EACvD;AACF;AAUO,SAAS,mBAAmB,SAAyB,MAAe,UAA2B;AACpG,QAAM,MAAM,QAAQ,kBAAkB,MAAM,QAAQ;AACpD,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,IAAI,QAAQ,mBAAAA,QAAG,YAAY,SAAU,QAAO;AAEhD,QAAM,WAAW,QAAQ,gBAAgB,GAAG;AAC5C,MAAI,SAAS,UAAU,GAAG;AACxB,UAAM,eAAe,SAAS,MAAM,KAAK,QAAM,EAAE,QAAQ,mBAAAA,QAAG,UAAU,eAAe,CAAC;AACtF,QAAI,aAAc,QAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAWO,SAAS,yBAAyB,SAAyB,MAAe,UAAsC;AACrH,QAAM,MAAM,QAAQ,kBAAkB,MAAM,QAAQ;AACpD,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,WAAW,QAAQ,gBAAgB,GAAG;AAE5C,MAAI,SAAS,kBAAkB,GAAG;AAChC,WAAO,oBAAI,IAAI,CAAE,SAAkC,KAAK,CAAC;AAAA,EAC3D;AAEA,MAAI,SAAS,UAAU,GAAG;AACxB,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,KAAK,SAAS,OAAO;AAC9B,UAAI,CAAC,EAAE,kBAAkB,EAAG,QAAO;AACnC,aAAO,IAAK,EAA2B,KAAK;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQO,SAAS,gBAAgB,MAAmC;AACjE,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,KAAK,MAAM;AACpB,eAAW,KAAK,GAAG;AACjB,UAAI,KAAK,IAAI,CAAC,EAAG,QAAO;AACxB,WAAK,IAAI,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAUO,SAAS,oBAAoB,MAAe,KAA4B;AAC7E,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,QAAQ;AACV,WAAO,OAAO,QAAQ;AAAA,EACxB;AAEA,QAAM,cAAe,KAAa;AAClC,MAAI,aAAa;AACf,WAAO,YAAY,QAAQ;AAAA,EAC7B;AAEA,SAAO,aAAa,IAAI,cAAc,MAAM;AAC9C;AAEA,SAAS,iBACP,MACA,KACA,UACA,OACY;AACZ,QAAM,OAAO,cAAc,MAAM,QAAQ;AACzC,MAAI,CAAC,MAAM;AACT,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,EAAE,YAAY,UAAU,IAAI;AAClC,MAAI,WAAW,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,GAAG;AAC/C,WAAO,EAAE,MAAM,wBAAwB,IAAI,GAAG;AAAA,EAChD;AAEA,YAAU,IAAI,IAAI;AAClB,QAAM,SAAS,MAAM;AACrB,YAAU,OAAO,IAAI;AAErB,MAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AACzB,eAAW,IAAI,MAAM,MAAM;AAAA,EAC7B;AAEA,SAAO,EAAE,MAAM,wBAAwB,IAAI,GAAG;AAChD;AAEA,SAAS,cAAc,MAAe,UAAuC;AAC3E,QAAM,cAAe,KAA0B,eAAgB,KAAa;AAC5E,QAAM,YAAY,aAAa,QAAQ;AACvC,MAAI,aAAa,cAAc,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,aAAa,QAAQ,UAAU;AACrC,MAAI,cAAc,eAAe,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,WAAWC,6BAA4B,QAAQ;AACrD,MAAI,YAAY,aAAa,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASA,6BAA4B,UAAuC;AAC1E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,mBAAAD,QAAG,oBAAoB,QAAQ,GAAG;AACpC,QAAI,mBAAAA,QAAG,aAAa,SAAS,QAAQ,GAAG;AACtC,aAAO,SAAS,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,mBAAAA,QAAG,uBAAuB,SAAS,MAAM,GAAG;AAC9C,QAAI,mBAAAA,QAAG,aAAa,SAAS,OAAO,IAAI,GAAG;AACzC,aAAO,SAAS,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;;;ACtSA,IAAAE,qBAAe;AAaR,SAAS,mBACd,MACA,KACA,UACY;AACZ,SAAOC,kBAAiB,MAAM,KAAK,UAAU,MAAM;AACjD,UAAM,QAAQ,KAAK;AACnB,UAAM,iBAAiB,+BAA+B,OAAO,KAAK,QAAQ;AAC1E,QAAI,gBAAgB;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,QAAsB,CAAC;AAC7B,eAAW,KAAK,OAAO;AACrB,YAAM,SAAS,iBAAiB,GAAG,GAAG;AACtC,UAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,YAAI,oBAAoB,MAAM,GAAG;AAC/B;AAAA,QACF;AACA,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,MAAM,CAAC;AAAA,IAChB;AAEA,WAAO,EAAE,MAAM;AAAA,EACjB,CAAC;AACH;AAWO,SAAS,+BACd,OACA,KACA,WACmB;AACnB,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,QAAQ,CAAC,GAAG,KAAK;AAEvB,QAAM,OAAO,MAAM,KAAK,eAAe;AACvC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,OAAO,MAAM,OAAO,OAAK,MAAM,IAAI;AACzC,MAAI,KAAK,MAAM,OAAK,cAAc,SAAS,GAAG,GAAG,CAAC,GAAG;AACnD,WAAO,iBAAiB,MAAM,GAAG;AAAA,EACnC;AAEA,SAAO;AACT;AAQO,SAAS,gBAAgB,GAAqB;AACnD,UAAQ,EAAE,SAAS,mBAAAC,QAAG,UAAU,SAAS,mBAAAA,QAAG,UAAU,SAAS,mBAAAA,QAAG,UAAU,UAAU,mBAAAA,QAAG,UAAU,aAAa,MAC1G,EAAE,QAAQ,mBAAAA,QAAG,UAAU,mBAAmB,MAC1C,EAAE,QAAQ,mBAAAA,QAAG,UAAU,mBAAmB;AAClD;AAWO,SAAS,cAAc,SAAyB,GAAY,MAA8B;AAC/F,MAAI,EAAE,EAAE,QAAQ,mBAAAA,QAAG,UAAU,QAAS,QAAO;AAE7C,QAAM,QAAQ,EAAE,cAAc;AAC9B,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,UAAU,oBAAI,IAAI,CAAC,WAAW,UAAU,SAAS,OAAO,CAAC;AAC/D,aAAW,KAAK,OAAO;AACrB,QAAI,CAAC,QAAQ,IAAI,EAAE,QAAQ,CAAC,EAAG,QAAO;AAAA,EACxC;AAEA,QAAM,WAAY,EAAoB,oBAAoB;AAC1D,MAAI,YAAY,SAAS,SAAS,EAAG,QAAO;AAE5C,QAAM,gBAAiB,EAAoB,yBAAyB;AACpE,MAAI,iBAAiB,cAAc,SAAS,EAAG,QAAO;AAEtD,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA6B;AACxD,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AACrE,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASD,kBACP,MACA,KACA,UACA,OACY;AACZ,QAAM,OAAOE,eAAc,MAAM,QAAQ;AACzC,MAAI,CAAC,MAAM;AACT,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,EAAE,YAAY,UAAU,IAAI;AAClC,MAAI,WAAW,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,GAAG;AAC/C,WAAO,EAAE,MAAM,wBAAwB,IAAI,GAAG;AAAA,EAChD;AAEA,YAAU,IAAI,IAAI;AAClB,QAAM,SAAS,MAAM;AACrB,YAAU,OAAO,IAAI;AAErB,MAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AACzB,eAAW,IAAI,MAAM,MAAM;AAAA,EAC7B;AAEA,SAAO,EAAE,MAAM,wBAAwB,IAAI,GAAG;AAChD;AAEA,SAASA,eAAc,MAAe,UAAuC;AAC3E,QAAM,cAAe,KAA0B,eAAgB,KAAa;AAC5E,QAAM,YAAY,aAAa,QAAQ;AACvC,MAAI,aAAa,cAAc,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,aAAa,QAAQ,UAAU;AACrC,MAAI,cAAc,eAAe,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,WAAWC,6BAA4B,QAAQ;AACrD,MAAI,YAAY,aAAa,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASA,6BAA4B,UAAuC;AAC1E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,mBAAAF,QAAG,oBAAoB,QAAQ,GAAG;AACpC,QAAI,mBAAAA,QAAG,aAAa,SAAS,QAAQ,GAAG;AACtC,aAAO,SAAS,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,mBAAAA,QAAG,uBAAuB,SAAS,MAAM,GAAG;AAC9C,QAAI,mBAAAA,QAAG,aAAa,SAAS,OAAO,IAAI,GAAG;AACzC,aAAO,SAAS,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;;;ACnMA,IAAAG,qBAAe;AAaR,SAAS,iBACd,MACA,KACA,UACY;AACZ,QAAM,EAAE,SAAS,YAAY,UAAU,IAAI;AAC3C,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,WAAW,QAAQ,UAAU,KAAK,oBAAoB,UAAU,GAAG;AAEzE,MAAI,sBAAsB,MAAM,OAAO,GAAG;AACxC,WAAO,sBAAsB,MAAM,GAAG;AAAA,EACxC;AAEA,MAAI,YAAY,aAAa,UAAU;AACrC,UAAM,oBAAoB,wBAAwB;AAAA,MAAK,UACrD,aAAa,QAAQ,SAAS,SAAS,KAAK;AAAA,IAC9C;AAEA,QAAI,mBAAmB;AACrB,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,UAAU,IAAI,IAAI,GAAG;AACvB,aAAO,EAAE,MAAM,wBAAwB,QAAQ,GAAG;AAAA,IACpD;AAEA,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,QAAM,SAAS,kBAAkB,MAAM,KAAK,QAAQ;AAEpD,MAAI,YAAY,aAAa,UAAU;AACrC,cAAU,OAAO,IAAI;AAErB,UAAM,WAAW,WAAW,IAAI,QAAQ;AACxC,QAAI,CAAC,UAAU;AACb,iBAAW,IAAI,UAAU,MAAM;AAAA,IACjC,OAAO;AACL,YAAM,SAAS,qBAAqB,UAAU,MAAM;AACpD,UAAI,WAAW,UAAU;AACvB,mBAAW,IAAI,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AACA,WAAO,EAAE,MAAM,wBAAwB,QAAQ,GAAG;AAAA,EACpD;AAEA,YAAU,OAAO,IAAI;AACrB,SAAO;AACT;AAWO,SAAS,kBACd,MACA,KACA,WACY;AACZ,QAAM,EAAE,SAAS,KAAK,IAAI;AAE1B,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,QAAM,QAAQ,QAAQ,oBAAoB,IAAI;AAC9C,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,QAAQ;AAE9B,QAAI,2BAA2B,QAAQ,GAAG;AACxC;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,gBAAgB,IAAI;AAC7C,QAAI,aAAa,QAAQ,GAAG;AAC1B;AAAA,IACF;AAEA,UAAM,aAAa,CAAC,EAAE,KAAK,QAAQ,mBAAAC,QAAG,YAAY;AAClD,UAAM,aAAa,sBAAsB,UAAU,OAAO;AAE1D,UAAM,UAAU,EAAE,GAAG,KAAK,cAAc,SAAS;AACjD,eAAW,QAAQ,IAAI,iBAAiB,UAAU,OAAO;AAEzD,UAAM,gBAAgB,SAAS,aAC3B,CAAC,cAAc,CAAC,aAChB,CAAC;AAEL,QAAI,eAAe;AACjB,eAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,aAAa,MAAM,OAAO,GAAG;AAC/B,UAAM,YAAY,mBAAmB,MAAM,OAAO;AAClD,QAAI,WAAW;AACb,aAAO,uBAAuB,iBAAiB,WAAW,GAAG;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,aAAa,MAAqB,UAAmC;AACnF,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,SAAS,SAAU,QAAO;AAE9B,SAAO;AACT;AAUO,SAAS,mBAAmB,MAAqB,UAA0C;AAChG,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,SAAS,UAAU;AACrB,UAAM,UAAU;AAChB,UAAM,WAAW,QAAQ;AACzB,QAAI,YAAY,SAAS,UAAU,GAAG;AACpC,aAAO,SAAS,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,sBAAsB,MAAe,SAAkC;AACrF,SAAO,CAAC,CAAC,oBAAoB,MAAM,OAAO;AAC5C;AAQO,SAAS,aAAa,MAAwB;AACnD,QAAM,WAAW,KAAK,oBAAoB;AAC1C,SAAO,CAAC,EAAE,YAAY,SAAS,SAAS;AAC1C;AAQO,SAAS,2BAA2B,UAA2B;AACpE,SAAO,SAAS,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG,KAAK,aAAa,OAAO,SAAS,SAAS;AACzG;AASO,SAAS,oBAAoB,UAAmC,MAA6B;AAClG,QAAM,eAAeC,6BAA4B,QAAQ;AACzD,MAAI,aAAc,QAAO;AAEzB,SAAO;AACT;AAEA,SAASA,6BAA4B,UAAuC;AAC1E,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,mBAAAD,QAAG,oBAAoB,QAAQ,GAAG;AACpC,QAAI,mBAAAA,QAAG,aAAa,SAAS,QAAQ,GAAG;AACtC,aAAO,SAAS,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,mBAAAA,QAAG,uBAAuB,SAAS,MAAM,GAAG;AAC9C,QAAI,mBAAAA,QAAG,aAAa,SAAS,OAAO,IAAI,GAAG;AACzC,aAAO,SAAS,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAsB,WAAmC;AACrF,MAAI,SAAS,SAAS,WAAW,UAAU,SAAS,SAAS;AAC3D,WAAO,kBAAkB,UAAU,SAAS;AAAA,EAC9C;AAEA,QAAM,SAAS,EAAE,GAAG,SAAS;AAE7B,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,SAAS,GAAG;AACvD,QAAI,QAAQ,gBAAgB,UAAU;AACpC,aAAO,aAAa,wBAAwB,SAAS,cAAc,CAAC,GAAG,QAAsC;AAAA,IAC/G,WAAW,QAAQ,cAAc,UAAU;AACzC,aAAO,WAAW,oBAAoB,SAAS,YAAY,CAAC,GAAG,QAAoB;AAAA,IACrF,WAAW,CAAC,UAAW,SAAqC,GAAG,GAAG,QAAQ,GAAG;AAC3E,MAAC,OAAmC,GAAG,IAAI;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,UAAsC,UAAkE;AACvI,QAAM,SAAS,EAAE,GAAG,SAAS;AAE7B,aAAW,CAAC,UAAU,aAAa,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAChE,UAAM,eAAe,SAAS,QAAQ;AAEtC,QAAI,CAAC,cAAc;AACjB,aAAO,QAAQ,IAAI;AAAA,IACrB,WAAW,UAAU,cAAc,aAAa,GAAG;AACjD;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,IAAI,qBAAqB,cAAc,aAAa;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAqB,SAAiC;AAClF,MAAI,UAAU,SAAS,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,WAAW,QAAQ,SAAS,SAAS;AACxD,WAAO,kBAAkB,SAAS,OAAO;AAAA,EAC3C;AAEA,QAAM,gBAAgB,QAAQ,SAAS,QAAQ;AAC/C,QAAM,WAAW,QAAQ,SAAS,QAAQ;AAE1C,MAAI,eAAe;AACjB,UAAM,cAAc,CAAC,GAAG,aAAa;AAErC,QAAI,UAAU;AACZ,iBAAW,WAAW,UAAU;AAC9B,YAAI,CAAC,YAAY,KAAK,UAAQ,UAAU,MAAM,OAAO,CAAC,GAAG;AACvD,sBAAY,KAAK,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,WAAW,CAAC,YAAY,KAAK,UAAQ,UAAU,MAAM,OAAO,CAAC,GAAG;AAC9D,kBAAY,KAAK,OAAO;AAAA,IAC1B;AAEA,WAAO,EAAE,GAAG,SAAS,OAAO,YAAY;AAAA,EAC1C;AAEA,SAAO;AAAA,IACL,OAAO,CAAC,SAAS,OAAO;AAAA,EAC1B;AACF;AAEA,SAAS,kBAAkB,SAAqB,SAAiC;AAC/E,QAAM,SAAqB,EAAE,MAAM,QAAQ;AAE3C,MAAI,QAAQ,eAAe,QAAQ,aAAa;AAC9C,WAAO,cAAc;AAAA,EACvB;AAEA,MAAI,QAAQ,SAAS,QAAQ,OAAO;AAClC,WAAO,QAAQ,qBAAqB,QAAQ,OAAO,QAAQ,KAAK;AAAA,EAClE,WAAW,QAAQ,OAAO;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB,WAAW,QAAQ,OAAO;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAoB,WAA+B;AAC9E,QAAM,SAAS,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC;AAClD,SAAO,MAAM,KAAK,MAAM;AAC1B;AAEA,SAAS,UAAU,GAAQ,GAAiB;AAC1C,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,MAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAElC,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,UAAM,QAAQ,OAAO,KAAK,CAAC;AAE3B,QAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,eAAW,OAAO,OAAO;AACvB,UAAI,CAAC,MAAM,SAAS,GAAG,EAAG,QAAO;AACjC,UAAI,CAAC,UAAU,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,EAAG,QAAO;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,0BAA0B,CAAC,qBAAqB,wBAAwB,sBAAsB,iBAAiB;AAgB9G,SAAS,oBACd,MACA,SAC4B;AAC5B,MAAI,KAAK,eAAe,GAAG;AACzB,QAAI,cAA0C;AAC9C,QAAI,mBAAmB;AAEvB,eAAW,eAAgB,KAA6B,OAAO;AAC7D,YAAM,SAAS,kBAAkB,aAAa,OAAO;AACrD,UAAI,QAAQ;AACV,sBAAc;AAAA,MAChB;AACA,UAAI,EAAE,YAAY,QAAQ,mBAAAA,QAAG,UAAU,QAAS;AAChD,YAAM,SAAS,YAAY,UAAU;AACrC,UAAI,QAAQ,QAAQ,MAAM,iBAAiB;AACzC,2BAAmB;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,aAAa;AACf,aAAO,EAAE,GAAG,aAAa,iBAAiB,iBAAiB;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,MAAM,OAAO;AACxC;AAEA,SAAS,kBAAkB,MAAe,SAAqD;AAC7F,QAAM,cAAe,KAA0B,eAAgB,KAAa;AAC5E,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,kBAAmB,eAAgB,YAAY,QAAQ,mBAAAA,QAAG,YAAY,QACxE,QAAQ,iBAAiB,WAAW,IACpC;AAEJ,MAAI,CAAC,gBAAiB,QAAO;AAE7B,QAAM,OAAO,gBAAgB,QAAQ;AACrC,MAAI,CAAC,wBAAwB,SAAS,IAAI,EAAG,QAAO;AAEpD,QAAM,UAAU;AAChB,QAAM,WAAW,QAAQ,iBAAiB,CAAC;AAE3C,SAAO;AAAA,IACL,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB;AACF;AASO,SAAS,mBAAmB,MAAe,UAAyC;AACzF,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,OAAO,QAAQ;AAC5B,SAAO,wBAAwB,SAAS,IAAI,IAAI,OAAO;AACzD;AAUO,SAAS,sBAAsB,MAAqB,KAAgC;AACzF,QAAM,UAAU;AAChB,QAAM,WAAW,QAAQ;AACzB,QAAM,aAAa,WAAW,CAAC,KAAK;AAEpC,QAAM,cAAc,mBAAmB,MAAM,IAAI,OAAO;AACxD,MAAI,CAAC,YAAa,QAAO,CAAC;AAE1B,QAAM,aAAsC,EAAE,SAAS,YAAY;AAEnE,MAAI,CAAC,YAAY;AACf,WAAO,EAAE,mBAAmB,WAAW;AAAA,EACzC;AAEA,MAAI,gBAAgB,uBAAuB,gBAAgB,wBAAwB;AACjF,QAAI,IAAI,UAAU,IAAI,UAAU,GAAG;AACjC,YAAME,SAAQ;AAAA,QACZ,MAAM;AAAA,QACN,YAAY;AAAA,UACV,IAAI,EAAE,MAAM,UAAU;AAAA,QACxB;AAAA,QACA,UAAU,CAAC,IAAI;AAAA,MACjB;AACA,UAAI,gBAAgB,0BAA0B,WAAW,CAAC,GAAG;AAC3D,mBAAW,QAAQ,SAAS,CAAC;AAAA,MAC/B;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAAA;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,QAAQ,aAAa,iBAAiB,YAAY,GAAG,IAAI,CAAC;AAChE,QAAI,gBAAgB,0BAA0B,WAAW,CAAC,GAAG;AAC3D,iBAAW,QAAQ,SAAS,CAAC;AAAA,IAC/B;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,gBAAgB,wBAAwB,gBAAgB,mBAAmB;AAC7E,WAAO,yBAAyB,YAAY,KAAK,UAAU;AAAA,EAC7D;AAEA,QAAM,eAAe,iBAAiB,YAAY,GAAG;AACrD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,yBAAyB,YAAqB,KAAoB,YAAiD;AAC1H,QAAM,EAAE,YAAY,UAAU,IAAI;AAElC,QAAM,eAAe,WAAW,UAAU;AAC1C,QAAM,WAAW,cAAc,QAAQ;AAEvC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,MACb,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,gBAAgB,GAAG,QAAQ;AAEjC,MAAI,WAAW,IAAI,aAAa,GAAG;AACjC,WAAO;AAAA,MACL,MAAM,wBAAwB,aAAa;AAAA,MAC3C,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,UAAU,IAAI,UAAU,GAAG;AAC7B,UAAM,oBAAoB;AAAA,MACxB,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AACA,eAAW,IAAI,eAAe,iBAAiB;AAC/C,WAAO;AAAA,MACL,MAAM,wBAAwB,aAAa;AAAA,MAC3C,mBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,YAAY,GAAG;AAChD,aAAW,IAAI,eAAe,SAAS;AAEvC,SAAO;AAAA,IACL,MAAM,wBAAwB,aAAa;AAAA,IAC3C,mBAAmB;AAAA,EACrB;AACF;AAEA,SAAS,eAAe,MAAe,KAAgC;AACrE,QAAM,EAAE,QAAQ,IAAI;AAEpB,MAAI,EAAE,KAAK,QAAQ,mBAAAF,QAAG,UAAU,SAAS;AACvC,WAAO,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,EAC1C;AAEA,QAAM,aAAa;AACnB,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,QAAM,QAAQ,QAAQ,oBAAoB,UAAU;AACpD,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,QAAQ;AAE9B,QAAI,2BAA2B,QAAQ,GAAG;AACxC;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,gBAAgB,IAAI;AAC7C,QAAI,aAAa,QAAQ,GAAG;AAC1B;AAAA,IACF;AAEA,UAAM,aAAa,CAAC,EAAE,KAAK,QAAQ,mBAAAA,QAAG,YAAY;AAClD,UAAM,aAAa,sBAAsB,UAAU,OAAO;AAE1D,QAAI,YAAY;AACd;AAAA,IACF;AAEA,UAAM,UAAU,EAAE,GAAG,KAAK,cAAc,SAAS;AACjD,eAAW,QAAQ,IAAI,iBAAiB,UAAU,OAAO;AAEzD,QAAI,CAAC,YAAY;AACf,eAAS,KAAK,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB,MAAM;AAAA,IACN;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AACT;;;AJ7jBO,SAAS,iBACd,MACA,KACA,UACY;AACZ,QAAM,kBAAkB,oBAAoB,MAAM,KAAK,QAAQ;AAC/D,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,QAAQ,GAAG;AAClB,WAAO,YAAY,MAAM,KAAK,QAAQ;AAAA,EACxC;AAEA,MAAI,KAAK,eAAe,GAAG;AACzB,WAAO,mBAAmB,MAAM,KAAK,QAAQ;AAAA,EAC/C;AAEA,MAAI,IAAI,QAAQ,YAAY,IAAI,GAAG;AACjC,UAAM,WAAY,KAA0B;AAC5C,UAAM,WAAW,WAAW,CAAC;AAC7B,UAAM,QAAQ,WAAW,iBAAiB,UAAU,GAAG,IAAI,CAAC;AAC5D,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,aAAa,UAAU,MAAM,IAAI,OAAO,IAAI,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,mBAAAG,QAAG,UAAU,QAAQ;AACpC,UAAM,aAAa;AACnB,QAAI,sBAAsB,MAAM,IAAI,OAAO,GAAG;AAC5C,aAAO,sBAAsB,YAAY,GAAG;AAAA,IAC9C;AACA,WAAO,iBAAiB,YAAY,KAAK,QAAQ;AAAA,EACnD;AAEA,SAAO,CAAC;AACV;AAmBA,SAAS,UAAU,MAAe,UAAmC;AACnE,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,OAAO,OAAO,QAAQ;AAC5B,MAAI,SAAS,MAAO,QAAO;AAC3B,SAAO;AACT;;;AKjFA,IAAAC,qBAAe;AAkBR,SAAS,+BACd,SACA,MACkB;AAClB,MAAI,CAAC,mBAAAC,QAAG,kBAAkB,IAAI,EAAG,QAAO,CAAC;AAEzC,QAAM,OAAO,mBAAAA,QAAG,cAAc,IAAI;AAClC,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AAExC,QAAM,QAA0B,CAAC;AAEjC,aAAW,KAAK,MAAM;AACpB,UAAM,OAAO,EAAE;AAEf,QAAI;AACJ,QAAI;AAEJ,QAAI,mBAAAA,QAAG,iBAAiB,IAAI,GAAG;AAC7B,eAAS,KAAK;AACd,aAAO,KAAK;AAAA,IACd,OAAO;AACL,eAAS;AACT,aAAO,mBAAAA,QAAG,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IACtC;AAEA,UAAM,MAAM,QAAQ,oBAAoB,MAAM;AAC9C,QAAI,CAAC,IAAK;AAEV,UAAM,WAAW,yBAAyB,SAAS,GAAG;AACtD,QAAI,CAAC,YAAY,SAAS,WAAW,mBAAoB;AAEzD,UAAM,OAAO,SAAS;AAEtB,QAAI,SAAS,UAAU;AACrB,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,OAAO,mBAAAA,QAAG,0BAA0B,GAAG,GAAG;AAC5C,cAAM,OAAO,oBAAoB,GAAG;AACpC,YAAI,KAAM,OAAM,KAAK,IAAI;AAAA,MAC3B;AACA;AAAA,IACF;AAEA,QAAI,SAAS,SAAS,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC9C,YAAM,KAAK,EAAE,SAAS,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAC9C,WAAW,SAAS,SAAS,gBAAgB,KAAK,CAAC,CAAC,GAAG;AACrD,YAAM,KAAK,EAAE,SAAS,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAC9C,WAAW,SAAS,kBAAkB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC9D,YAAM,KAAK,EAAE,kBAAkB,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IACvD,WAAW,SAAS,kBAAkB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC9D,YAAM,KAAK,EAAE,kBAAkB,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IACvD,WAAW,SAAS,eAAe,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC3D,YAAM,KAAK,EAAE,WAAW,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAChD,WAAW,SAAS,eAAe,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC3D,YAAM,KAAK,EAAE,WAAW,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAChD,WAAW,SAAS,YAAY,gBAAgB,KAAK,CAAC,CAAC,GAAG;AACxD,YAAM,KAAK,EAAE,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IACrC,WAAW,SAAS,WAAW;AAC7B,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,OAAO,mBAAAA,QAAG,2BAA2B,GAAG,GAAG;AAC7C,cAAM,KAAK,EAAE,SAAS,oBAAoB,IAAI,IAAI,EAAE,CAAC;AAAA,MACvD,WAAW,gBAAgB,GAAG,GAAG;AAC/B,cAAM,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;AAAA,MAClC;AAAA,IACF,WAAW,SAAS,cAAc,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC1D,YAAM,KAAK,EAAE,UAAU,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAC/C,WAAW,SAAS,cAAc,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC1D,YAAM,KAAK,EAAE,UAAU,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IAC/C,WAAW,SAAS,mBAAmB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC/D,YAAM,KAAK,EAAE,eAAe,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IACpD,WAAW,SAAS,mBAAmB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC/D,YAAM,KAAK,EAAE,eAAe,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IACpD,WAAW,SAAS,gBAAgB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC5D,YAAM,KAAK,EAAE,YAAY,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;AAAA,IACjD,WAAW,SAAS,WAAW;AAC7B,YAAM,KAAK,EAAE,SAAS,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,IAChD,WAAW,SAAS,cAAc,mBAAAA,QAAG,yBAAyB,KAAK,CAAC,CAAC,GAAG;AACtE,YAAM,KAAK,EAAE,UAAU,KAAK,CAAC,EAAE,SAAS,IAAI,OAAK,cAAc,CAAC,CAAC,EAAE,CAAC;AAAA,IACtE,WAAW,SAAS,iBAAiB,gBAAgB,KAAK,CAAC,CAAC,GAAG;AAC7D,YAAM,KAAK,EAAE,aAAa,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,IAC1C,WAAW,SAAS,UAAU,mBAAAA,QAAG,yBAAyB,KAAK,CAAC,CAAC,GAAG;AAClE,YAAM,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE,SAAS,IAAI,OAAK,cAAc,CAAC,CAAC,EAAE,CAAC;AAAA,IAClE,WAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,EAAE,OAAO,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,IAC9C,WAAW,SAAS,WAAW;AAC7B,YAAM,KAAK,EAAE,SAAS,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;AAAA,IAChD,WAAW,SAAS,wBAAwB;AAC1C,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,QAAQ,IAAI,SAAS,mBAAAA,QAAG,WAAW,gBAAgB,IAAI,SAAS,mBAAAA,QAAG,WAAW,cAAc;AAC9F,cAAM,KAAK,EAAE,sBAAsB,IAAI,SAAS,mBAAAA,QAAG,WAAW,YAAY,CAAC;AAAA,MAC7E,WAAW,OAAO,mBAAAA,QAAG,0BAA0B,GAAG,GAAG;AACnD,cAAM,MAAM,oBAAoB,GAAG;AACnC,YAAI,IAAK,OAAM,KAAK,EAAE,sBAAsB,IAAI,CAAC;AAAA,MACnD;AAAA,IACF,WAAW,SAAS,UAAU;AAC5B,YAAM,KAAK,EAAE,sBAAsB,MAAM,CAAC;AAAA,IAC5C,WAAW,SAAS,qBAAqB;AACvC,YAAM,KAAK,EAAE,uBAAuB,MAAM,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,KACyC;AACzC,QAAM,SAAU,IAAI,QAAQ,mBAAAA,QAAG,YAAY,QAAS,QAAQ,iBAAiB,GAAG,IAAI;AACpF,QAAM,OAAO,OAAO,QAAQ;AAE5B,QAAM,OAAO,OAAO,eAAe,CAAC;AACpC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,WAAW,KAAK,cAAc,EAAE,SAAS,QAAQ,OAAO,GAAG;AAEjE,MAAI,SAAS,SAAS,0BAA0B,KAAK,SAAS,SAAS,cAAc,GAAG;AACtF,WAAO,EAAE,QAAQ,oBAAoB,KAAK;AAAA,EAC5C;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAsD;AAC7E,SAAO,CAAC,CAAC,QAAQ,mBAAAA,QAAG,iBAAiB,IAAI;AAC3C;AAEA,SAAS,gBAAgB,MAAqD;AAC5E,SAAO,CAAC,CAAC,QAAQ,mBAAAA,QAAG,gBAAgB,IAAI;AAC1C;AAEA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,QAAQ,KAAK,MAAM,qBAAqB;AAC9C,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AAEA,SAAS,oBAAoB,KAA0D;AACrF,QAAM,MAA+B,CAAC;AACtC,aAAW,QAAQ,IAAI,YAAY;AACjC,QAAI,CAAC,mBAAAA,QAAG,qBAAqB,IAAI,EAAG;AACpC,UAAM,OAAO,KAAK;AAClB,QAAI;AACJ,QAAI,mBAAAA,QAAG,aAAa,IAAI,GAAG;AACzB,YAAM,KAAK;AAAA,IACb,WAAW,mBAAAA,QAAG,gBAAgB,IAAI,GAAG;AACnC,YAAM,KAAK;AAAA,IACb,OAAO;AACL;AAAA,IACF;AACA,QAAI,GAAG,IAAI,cAAc,KAAK,WAAW;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAA8B;AACnD,MAAI,mBAAAA,QAAG,gBAAgB,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAI,mBAAAA,QAAG,iBAAiB,IAAI,EAAG,QAAO,OAAO,KAAK,IAAI;AACtD,MAAI,KAAK,SAAS,mBAAAA,QAAG,WAAW,YAAa,QAAO;AACpD,MAAI,KAAK,SAAS,mBAAAA,QAAG,WAAW,aAAc,QAAO;AACrD,MAAI,KAAK,SAAS,mBAAAA,QAAG,WAAW,YAAa,QAAO;AACpD,MAAI,mBAAAA,QAAG,0BAA0B,IAAI,EAAG,QAAO,oBAAoB,IAAI;AACvE,MAAI,mBAAAA,QAAG,yBAAyB,IAAI,EAAG,QAAO,KAAK,SAAS,IAAI,OAAK,cAAc,CAAC,CAAC;AACrF,SAAO;AACT;AAUO,SAAS,eAAe,SAAkC,OAAkD;AACjH,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,aAAW,QAAQ,OAAO;AACxB,WAAO,OAAO,QAAQ,IAAI;AAAA,EAC5B;AACA,SAAO;AACT;;;ACvLO,SAAS,oBAAoB,WAA6B,KAAoB,YAAyB;AAC5G,aAAW,cAAc,UAAU,kBAAkB;AACnD,UAAM,QAAQ,UAAU,WAAW,UAAU;AAC7C,QAAI,OAAO;AACT,UAAI,cAAc,iBAAiB,MAAM,MAAM,GAAG;AAClD,UAAI,MAAM,WAAW;AACnB,cAAM,QAAQ,+BAA+B,IAAI,SAAS,MAAM,SAAS;AACzE,YAAI,MAAM,SAAS,GAAG;AACpB,wBAAc,eAAe,aAAwC,GAAG,KAAK;AAAA,QAC/E;AAAA,MACF;AAEA,YAAM,SAAS,YAAY,OACvB,EAAE,MAAM,YAAY,KAAK,IACzB;AAEJ,YAAM,YAAY,MAAM,KAAK,YAAY;AACzC,YAAM,YAAY,cAAc,QAAQ,UAAU,SAAS,IAAI;AAE/D,UAAI,CAAC,OAAO,QAAQ,OAAO,SAAS,YAAY,WAAW;AACzD,eAAO,OAAO;AACd,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAEA,iBAAW,KAAK;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,IAAI;AAAA,QACJ,UAAU,CAAC,MAAM;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAUO,SAAS,qBAAqB,WAA6B,KAAoB,YAAyB;AAC7G,MAAI,UAAU,0BAA0B,MAAM;AAC5C,UAAM,aAAa,UAAU,WAAW,UAAU,qBAAqB;AACvE,QAAI,CAAC,WAAY;AAEjB,UAAM,cAAc,iBAAiB,WAAW,MAAM,GAAG;AACzD,UAAM,EAAE,YAAY,eAAe,UAAU,cAAc,IACzD,6BAA6B,aAAa,IAAI,UAAU;AAE1D,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,aAAa,GAAG;AAClE,YAAM,aAAa,cAAc,SAAS,QAAQ;AAElD,YAAM,eAAe,mBAAmB,YAAY,GAAG;AACvD,YAAM,eAAe,mBAAmB,YAAY,GAAG;AACvD,YAAM,gBAAgB,4BAA4B,WAAW,IAAI;AACjE,YAAM,eAAe,qBAAqB,YAAY,QAAQ;AAE9D,UAAI,cAAc;AAChB,mBAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ,WAAW,OAAO,EAAE,MAAM,WAAW,KAAK,IAAI;AAAA,QACxD,CAAC;AAAA,MACH,WAAW,cAAc;AACvB,cAAM,YAAY,WAAW,QAAQ;AACrC,mBAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,aAAa,wBAAwB,YAAY;AAAA,UACjD,UAAU;AAAA,YACR,SAAS,EAAE,OAAO,kBAAkB,YAAY,EAAE;AAAA,UACpD;AAAA,UACA,yBAAyB;AAAA,QAC3B,CAAC;AAAA,MACH,OAAO;AACL,cAAM,WAAgB;AAAA,UACpB,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,QAAQ,WAAW,OAAO,EAAE,MAAM,WAAW,KAAK,IAAI;AAAA,QACxD;AAEA,YAAI,aAAa,QAAQ;AACvB,mBAAS,SAAS,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,EAAE;AAAA,QAC9D,WAAW,aAAa,YAAY;AAClC,mBAAS,SAAS,EAAE,MAAM,WAAW,SAAS,IAAI,SAAS,EAAE;AAAA,QAC/D,WAAW,aAAa,cAAc;AACpC,mBAAS,SAAS,EAAE,MAAM,WAAW,SAAS,EAAE;AAAA,QAClD,WAAW,aAAa,QAAQ;AAC9B,mBAAS,SAAS;AAAA,YAChB,OAAO;AAAA,cACL,EAAE,MAAM,SAAS;AAAA,cACjB,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,YAC7C;AAAA,UACF;AAAA,QACF,WAAW,aAAa,KAAK;AAC3B,mBAAS,SAAS,EAAE,MAAM,SAAS;AAAA,QACrC,WAAW,aAAa,eAAe;AACrC,mBAAS,SAAS,EAAE,MAAM,UAAU;AAAA,QACtC;AAEA,YAAI,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AACzC,iBAAO,OAAO,UAAU,aAAa;AAAA,QACvC;AAEA,mBAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,aAAW,cAAc,UAAU,mBAAmB;AACpD,UAAM,QAAQ,UAAU,WAAW,UAAU;AAC7C,QAAI,OAAO;AACT,UAAI,cAAc,iBAAiB,MAAM,MAAM,GAAG;AAClD,UAAI,MAAM,WAAW;AACnB,cAAM,QAAQ,+BAA+B,IAAI,SAAS,MAAM,SAAS;AACzE,YAAI,MAAM,SAAS,GAAG;AACpB,wBAAc,eAAe,aAAwC,GAAG,KAAK;AAAA,QAC/E;AAAA,MACF;AAEA,YAAM,eAAe,mBAAmB,aAAa,GAAG;AACxD,YAAM,eAAe,mBAAmB,aAAa,GAAG;AAExD,UAAI,cAAc;AAChB,mBAAW,KAAK;AAAA,UACd,MAAM,MAAM;AAAA,UACZ,IAAI;AAAA,UACJ,UAAU,CAAC,MAAM;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ,YAAY,OAAO,EAAE,MAAM,YAAY,KAAK,IAAI;AAAA,QAC1D,CAAC;AAAA,MACH,WAAW,cAAc;AACvB,cAAM,YAAY,YAAY,QAAQ;AACtC,cAAM,eAAe,qBAAqB,aAAa,MAAM,IAAI;AACjE,mBAAW,KAAK;AAAA,UACd,MAAM,MAAM;AAAA,UACZ,IAAI;AAAA,UACJ,UAAU,CAAC,MAAM;AAAA,UACjB,QAAQ,EAAE,MAAM,SAAS;AAAA,UACzB,aAAa,wBAAwB,YAAY;AAAA,UACjD,UAAU;AAAA,YACR,SAAS,EAAE,OAAO,kBAAkB,YAAY,EAAE;AAAA,UACpD;AAAA,UACA,yBAAyB;AAAA,QAC3B,CAAC;AAAA,MACH,OAAO;AACL,cAAM,gBAAgB,4BAA4B,YAAY,IAAI;AAClE,mBAAW,KAAK;AAAA,UACd,MAAM,MAAM;AAAA,UACZ,IAAI;AAAA,UACJ,UAAU,CAAC,MAAM;AAAA,UACjB,QAAQ,YAAY,OAAO,EAAE,MAAM,YAAY,KAAK,IAAI;AAAA,UACxD,GAAI,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,gBAAgB,CAAC;AAAA,QAC/D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAUO,SAAS,sBAAsB,WAA6B,KAAoB,YAAyB;AAC9G,MAAI,UAAU,2BAA2B,KAAM;AAE/C,QAAM,cAAc,UAAU,WAAW,UAAU,sBAAsB;AACzE,MAAI,CAAC,YAAa;AAElB,QAAM,eAAe,iBAAiB,YAAY,MAAM,GAAG;AAC3D,MAAI,CAAC,aAAa,WAAY;AAE9B,QAAM,iBAAiB,aAAa;AACpC,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,cAAqC,GAAG;AAC1F,UAAM,aAAa,aAAa,UAAU,SAAS,QAAQ,KAAK;AAChE,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAUO,SAAS,sBAAsB,WAA6B,KAAoB,YAAyB;AAC9G,MAAI,UAAU,2BAA2B,KAAM;AAE/C,QAAM,cAAc,UAAU,WAAW,UAAU,sBAAsB;AACzE,MAAI,CAAC,YAAa;AAElB,QAAM,eAAe,iBAAiB,YAAY,MAAM,GAAG;AAC3D,MAAI,CAAC,aAAa,WAAY;AAE9B,QAAM,iBAAiB,aAAa;AACpC,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,cAAqC,GAAG;AAC1F,UAAM,aAAa,aAAa,UAAU,SAAS,QAAQ,KAAK;AAChE,eAAW,KAAK;AAAA,MACd,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAQO,SAAS,4BAA4B,YAAkF;AAC5H,QAAM,YAAY,MAAM,QAAQ,UAAU,IAAI,aAAa,aAAa,CAAC,UAAU,IAAI,CAAC;AACxF,QAAM,UAAU,UAAU,SAAS,OAAO;AAE1C,MAAI,SAAS;AACX,WAAO,EAAE,OAAO,QAAQ,SAAS,KAAK;AAAA,EACxC;AAEA,SAAO,CAAC;AACV;AAUO,SAAS,qBAAqB,QAAoB,UAA0B;AACjF,QAAM,WAAW,iBAAiB,QAAQ,oBAAI,IAAI,CAAC;AAEnD,MAAI,SAAS,SAAS,YAAY,SAAS,YAAY;AACrD,UAAM,UAAmC,CAAC;AAC1C,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AAC7D,YAAM,eAAe,iBAAiB,MAAM,oBAAI,IAAI,CAAC;AACrD,UAAI,aAAa,SAAS,UAAU;AAClC,gBAAQ,GAAG,IAAI;AAAA,MACjB,WAAW,aAAa,SAAS,YAAY,aAAa,SAAS,WAAW;AAC5E,gBAAQ,GAAG,IAAI;AAAA,MACjB,WAAW,aAAa,SAAS,WAAW;AAC1C,gBAAQ,GAAG,IAAI;AAAA,MACjB,WAAW,MAAM,QAAQ,aAAa,IAAI,KAAK,aAAa,KAAK,SAAS,MAAM,GAAG;AACjF,gBAAQ,GAAG,IAAI;AAAA,MACjB,WAAW,aAAa,MAAM;AAC5B,gBAAQ,GAAG,IAAI,aAAa,KAAK,CAAC;AAAA,MACpC,OAAO;AACL,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAAA,IACF;AACA,WAAO,YAAY,QAAQ,IAAI,KAAK,UAAU,OAAO,CAAC;AAAA,EACxD;AAEA,SAAO,YAAY,QAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,QAAQ,CAAC,CAAC;AACjE;AASO,SAAS,kBAAkB,aAA6B;AAC7D,QAAM,QAAQ,YAAY,MAAM,4BAA4B;AAC5D,MAAI,OAAO;AACT,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO,KAAK,UAAU,EAAE,KAAK,QAAQ,CAAC;AACxC;AAEA,SAAS,mBAAmB,QAAoB,KAA6B;AAC3E,QAAM,WAAW,iBAAiB,QAAQ,IAAI,UAAU;AAExD,MAAI,SAAS,SAAS,SAAS;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,YAAY,SAAS,cAAc,SAAS,sBAAsB;AACtF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO;AAClB,eAAW,UAAU,SAAS,OAAO;AACnC,UAAI,mBAAmB,QAAQ,GAAG,GAAG;AACnC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAoB,KAA6B;AAC3E,QAAM,WAAW,iBAAiB,QAAQ,IAAI,UAAU;AAExD,MAAI,SAAS,SAAS,YAAY,SAAS,cAAc,SAAS,sBAAsB;AACtF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO;AAClB,eAAW,UAAU,SAAS,OAAO;AACnC,UAAI,mBAAmB,QAAQ,GAAG,GAAG;AACnC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,WAAW,SAAS,OAAO;AAC/C,UAAM,cAAc,iBAAiB,SAAS,OAAO,IAAI,UAAU;AACnE,WAAO,mBAAmB,aAAa,GAAG;AAAA,EAC5C;AAEA,SAAO;AACT;AASO,SAAS,iBAAiB,QAAoB,YAAiD;AACpG,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,WAAW,uBAAuB,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,IAAI,QAAQ,yBAAyB,EAAE;AACpD,QAAM,OAAO,WAAW,IAAI,IAAI;AAChC,MAAI,CAAC,KAAM,QAAO;AAElB,SAAO,iBAAiB,MAAM,UAAU;AAC1C;AAUO,SAAS,6BACd,QACA,YACgE;AAChE,QAAM,WAAW,iBAAiB,QAAQ,UAAU;AACpD,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,QAAM,gBAAgB,CAAC,MAAwB;AAC7C,UAAM,UAAU,iBAAiB,GAAG,UAAU;AAE9C,QAAI,QAAQ,YAAY;AACtB,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AAC3D,YAAI,CAAC,WAAW,GAAG,GAAG;AACpB,qBAAW,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,UAAU;AACpB,iBAAW,OAAO,QAAQ,UAAU;AAClC,YAAI,CAAC,SAAS,SAAS,GAAG,GAAG;AAC3B,mBAAS,KAAK,GAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AACjB,iBAAW,UAAU,QAAQ,OAAO;AAClC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,QAAQ;AACtB,SAAO,EAAE,YAAY,SAAS;AAChC;;;APvZA,IAAMC,2BAA0B,CAAC,sBAAsB,mBAAmB,qBAAqB,sBAAsB;AAyB9G,SAAS,gBACd,aACA,SACA,UAAgD,CAAC,GACtC;AACX,QAAM,aAAa,oBAAI,IAAwB;AAC/C,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,IAAI;AAAA,IACnB,eAAe,CAAC;AAAA,IAChB,MAAM;AAAA,EACR;AAEA,QAAM,QAA6C,CAAC;AAEpD,aAAW,cAAc,aAAa;AACpC,eAAW,aAAa,WAAW,YAAY;AAC7C,YAAM,WAAW,qBAAqB,WAAW,UAAU,UAAU,IAAI;AAEzE,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,cAAM,QAAQ,IAAI,CAAC;AAAA,MACrB;AAEA,YAAM,SAAS,UAAU,WAAW,YAAY;AAChD,YAAM,QAAQ,EAAE,MAAM,IAAI,eAAe,WAAW,KAAK,WAAW,QAAQ;AAAA,IAC9E;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,YAAY,UAAU;AAC7C,0BAAwB,SAAS,KAAK;AAEtC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,OAAO,QAAQ,SAAS;AAAA,MACxB,SAAS,QAAQ,WAAW;AAAA,IAC9B;AAAA,IACA,YAAY;AAAA,MACV;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,SAAqC,OAAkC;AACtG,QAAM,kBAAkB,oBAAI,IAAY;AAExC,aAAW,eAAeA,0BAAyB;AACjD,QAAI,QAAQ,WAAW,GAAG;AACxB,sBAAgB,IAAI,WAAW;AAAA,IACjC;AACA,QAAI,QAAQ,GAAG,WAAW,KAAK,GAAG;AAChC,sBAAgB,IAAI,GAAG,WAAW,KAAK;AAAA,IACzC;AAAA,EACF;AAEA,aAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,sBAAkB,QAAQ,eAAe;AAAA,EAC3C;AAEA,aAAW,YAAY,OAAO,OAAO,KAAK,GAAG;AAC3C,wBAAoB,UAAU,eAAe;AAAA,EAC/C;AAEA,aAAW,cAAc,iBAAiB;AACxC,WAAO,QAAQ,UAAU;AAAA,EAC3B;AACF;AAEA,SAAS,kBAAkB,QAAa,iBAAoC;AAC1E,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD;AAAA,EACF;AAEA,MAAI,OAAO,YAAY;AACrB,eAAW,YAAY,OAAO,KAAK,OAAO,UAAU,GAAG;AACrD,YAAM,aAAa,OAAO,WAAW,QAAQ;AAC7C,UAAI,WAAW,QAAQ,OAAO,WAAW,SAAS,UAAU;AAC1D,cAAM,UAAU,WAAW,KAAK,QAAQ,yBAAyB,EAAE;AACnE,YAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,iBAAO,OAAO,WAAW,QAAQ;AACjC,cAAI,OAAO,YAAY,MAAM,QAAQ,OAAO,QAAQ,GAAG;AACrD,mBAAO,WAAW,OAAO,SAAS,OAAO,CAAC,MAAc,MAAM,QAAQ;AAAA,UACxE;AAAA,QACF;AAAA,MACF,OAAO;AACL,0BAAkB,YAAY,eAAe;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,OAAO;AAChB,sBAAkB,OAAO,OAAO,eAAe;AAAA,EACjD;AAEA,MAAI,OAAO,OAAO;AAChB,eAAW,QAAQ,OAAO,OAAO;AAC/B,wBAAkB,MAAM,eAAe;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAe,iBAAoC;AAC9E,MAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD;AAAA,EACF;AAEA,aAAW,UAAU,OAAO,KAAK,QAAQ,GAAG;AAC1C,UAAM,YAAiB,SAAS,MAAM;AACtC,QAAI,OAAO,cAAc,YAAY,cAAc,KAAM;AAEzD,QAAI,UAAU,aAAa;AACzB,6BAAuB,UAAU,aAAa,eAAe;AAAA,IAC/D;AAEA,QAAI,UAAU,WAAW;AACvB,YAAM,YAAmB,OAAO,OAAO,UAAU,SAAS;AAC1D,iBAAW,YAAY,WAAW;AAChC,YAAI,SAAS,SAAS;AACpB,gBAAM,eAAsB,OAAO,OAAO,SAAS,OAAO;AAC1D,qBAAW,eAAe,cAAc;AACtC,gBAAI,YAAY,QAAQ;AACtB,gCAAkB,YAAY,QAAQ,eAAe;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,aAAkB,iBAAoC;AACpF,MAAI,OAAO,gBAAgB,YAAY,gBAAgB,KAAM;AAE7D,MAAI,YAAY,SAAS;AACvB,UAAM,eAAsB,OAAO,OAAO,YAAY,OAAO;AAC7D,eAAW,eAAe,cAAc;AACtC,UAAI,YAAY,QAAQ;AACtB,0BAAkB,YAAY,QAAQ,eAAe;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,YAAY;AAC1B,eAAW,YAAY,OAAO,KAAK,YAAY,UAAU,GAAG;AAC1D,YAAM,aAAa,YAAY,WAAW,QAAQ;AAClD,UAAI,WAAW,QAAQ,OAAO,WAAW,SAAS,UAAU;AAC1D,cAAM,UAAU,WAAW,KAAK,QAAQ,yBAAyB,EAAE;AACnE,YAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,iBAAO,YAAY,WAAW,QAAQ;AACtC,cAAI,YAAY,YAAY,MAAM,QAAQ,YAAY,QAAQ,GAAG;AAC/D,wBAAY,WAAW,YAAY,SAAS,OAAO,CAAC,MAAc,MAAM,QAAQ;AAAA,UAClF;AAAA,QACF;AAAA,MACF,OAAO;AACL,0BAAkB,YAAY,eAAe;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,UAAkBC,OAAsB;AACpE,QAAM,OAAO,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI;AAC9D,QAAM,YAAYA,MAAK,QAAQ,aAAa,MAAM;AAClD,MAAI,WAAW,OAAO,aAAa;AAEnC,MAAI,SAAS,SAAS,GAAG,KAAK,aAAa,KAAK;AAC9C,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,WAA6B,KAAoB,oBAAoC;AAC3G,QAAM,KAAU;AAAA,IACd,aAAa,UAAU;AAAA,IACvB,WAAW,CAAC;AAAA,EACd;AAEA,QAAM,aAAoB,CAAC;AAE3B,sBAAoB,WAAW,KAAK,UAAU;AAC9C,uBAAqB,WAAW,KAAK,UAAU;AAC/C,wBAAsB,WAAW,KAAK,UAAU;AAChD,wBAAsB,WAAW,KAAK,UAAU;AAEhD,MAAI,WAAW,SAAS,GAAG;AACzB,OAAG,aAAa;AAAA,EAClB;AAEA,QAAM,cAAc,EAAE,GAAG,KAAK,MAAM,WAAoB;AACxD,QAAM,iBAAiB,iBAAiB,UAAU,YAAY,aAAa,UAAU,cAAc;AAEnG,QAAM,SAAS,UAAU,eAAe,SAAS,MAAM;AACvD,KAAG,UAAU,MAAM,IAAI;AAAA,IACrB,aAAa,WAAW,MAAM,YAAY;AAAA,IAC1C,SAAS;AAAA,MACP,oBAAoB;AAAA,QAClB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO,OAAO,EAAE,SAAS,UAAU,UAAU,KAAK,UAAU,mBAAmB,MAAM;AAChG,UAAM,YAAY,UAAU,WAAW,UAAU,cAAc;AAC/D,QAAI,WAAW;AACb,YAAM,aAAa,EAAE,GAAG,KAAK,MAAM,UAAmB;AACtD,UAAI,aAAa,iBAAiB,UAAU,MAAM,UAAU;AAC5D,mBAAa,2BAA2B,WAAW,YAAY,UAAU;AAEzE,YAAM,cAAc,UAAU,mBAAmB,qBAAqB,CAAC,KAAK;AAE5E,YAAM,cAAmB;AAAA,QACvB,UAAU,CAAC,UAAU;AAAA,QACrB,SAAS,CAAC;AAAA,MACZ;AAEA,UAAI,gBAAgB,uBAAuB;AACzC,oBAAY,QAAQ,qBAAqB,IAAI;AAAA,UAC3C,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,oBAAY,QAAQ,WAAW,IAAI;AAAA,UACjC,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,SAAG,cAAc;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,2BACP,WACA,KACA,QACY;AACZ,MAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,QAAM,aAAa,UAAU,KAAK,UAAU;AAC5C,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,eAAe,WAAW,gBAAgB;AAChD,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO;AAEvD,QAAM,YAAY,aAAa,CAAC;AAChC,MAAI,CAAC,mBAAAC,QAAG,mBAAmB,SAAS,EAAG,QAAO;AAE9C,QAAM,SAAS,EAAE,GAAG,OAAO;AAC3B,QAAM,QAAQ,EAAE,GAAG,OAAO,WAAyC;AAEnE,aAAW,UAAU,UAAU,SAAS;AACtC,QAAI,CAAC,mBAAAA,QAAG,sBAAsB,MAAM,KAAK,CAAC,OAAO,KAAM;AAEvD,UAAM,WAAW,mBAAAA,QAAG,aAAa,OAAO,IAAI,IAAI,OAAO,KAAK,OAAO;AACnE,QAAI,CAAC,SAAU;AACf,QAAI,CAAC,MAAM,QAAQ,EAAG;AAEtB,UAAM,QAAQ,+BAA+B,IAAI,SAAS,MAAM;AAChE,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,QAAQ,IAAI,eAAe,MAAM,QAAQ,GAA8B,GAAG,KAAK;AAAA,IACvF;AAAA,EACF;AAEA,SAAO,aAAa;AACpB,SAAO;AACT;;;AQ9SA,IAAAC,sBAAe;AAcR,SAAS,iBACd,aACA,SACA,SACA,iBAAiC,eACrB;AACZ,QAAM,aAAa,oBAAI,IAAiB;AACxC,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,IAAI;AAAA,IACnB,eAAe,CAAC;AAAA,IAChB,MAAM;AAAA,EACR;AAEA,QAAM,oBAAuC,YAAY,IAAI,WAAS;AAAA,IACpE,cAAc,KAAK;AAAA,IACnB,UAAU,KAAK;AAAA,IACf,YAAY,KAAK,WAAW,IAAI,QAAM,oBAAoB,IAAI,GAAG,CAAC;AAAA,EACpE,EAAE;AAEF,QAAM,mBACJ,mBAAmB,gBACf,EAAE,MAAM,eAAe,mBAAmB,KAAK,IAC/C,mBAAmB,SACjB,EAAE,MAAM,QAAQ,mBAAmB,KAAK,IACxC,EAAE,MAAM,eAAe,mBAAmB,KAAK;AAEvD,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,YAAY,oBAAAC,QAAG;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,0BAA0B;AAAA,IAC5B;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AACF;AAMA,SAASC,kBAAiB,QAAoB,YAAiD;AAC7F,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,WAAW,uBAAuB,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,IAAI,QAAQ,yBAAyB,EAAE;AACpD,QAAM,OAAO,WAAW,IAAI,IAAI;AAChC,MAAI,CAAC,KAAM,QAAO;AAElB,SAAOA,kBAAiB,MAAM,UAAU;AAC1C;AAMA,SAASC,8BACP,QACA,YACgE;AAChE,QAAM,WAAWD,kBAAiB,QAAQ,UAAU;AACpD,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,QAAM,gBAAgB,CAAC,MAAwB;AAC7C,UAAM,UAAUA,kBAAiB,GAAG,UAAU;AAE9C,QAAI,QAAQ,YAAY;AACtB,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,UAAU,GAAG;AAC3D,YAAI,CAAC,WAAW,GAAG,GAAG;AACpB,qBAAW,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,UAAU;AACpB,iBAAW,OAAO,QAAQ,UAAU;AAClC,YAAI,CAAC,SAAS,SAAS,GAAG,GAAG;AAC3B,mBAAS,KAAK,GAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AACjB,iBAAW,UAAU,QAAQ,OAAO;AAClC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,QAAQ;AACtB,SAAO,EAAE,YAAY,SAAS;AAChC;AAMA,SAASE,oBAAmB,QAAoB,YAA8C;AAC5F,QAAM,WAAWF,kBAAiB,QAAQ,UAAU;AAEpD,MAAI,SAAS,SAAS,SAAS;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,YAAY,SAAS,cAAc,SAAS,sBAAsB;AACtF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO;AAClB,eAAW,UAAU,SAAS,OAAO;AACnC,UAAIE,oBAAmB,QAAQ,UAAU,GAAG;AAC1C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAASC,oBAAmB,QAAoB,YAA8C;AAC5F,QAAM,WAAWH,kBAAiB,QAAQ,UAAU;AAEpD,MAAI,SAAS,SAAS,YAAY,SAAS,cAAc,SAAS,sBAAsB;AACtF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,OAAO;AAClB,eAAW,UAAU,SAAS,OAAO;AACnC,UAAIG,oBAAmB,QAAQ,UAAU,GAAG;AAC1C,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,WAAW,SAAS,OAAO;AAC/C,UAAM,cAAcH,kBAAiB,SAAS,OAAO,UAAU;AAC/D,WAAOG,oBAAmB,aAAa,UAAU;AAAA,EACnD;AAEA,SAAO;AACT;AAMA,SAAS,oBAAoB,IAAsB,KAAoC;AACrF,QAAM,OAAiB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM,CAAC;AAAA,IACP,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,SAAS,CAAC;AAAA,EACZ;AAEA,gBAAc,IAAI,KAAK,IAAI;AAC3B,iBAAe,IAAI,KAAK,IAAI;AAC5B,kBAAgB,IAAI,KAAK,IAAI;AAC7B,kBAAgB,IAAI,KAAK,IAAI;AAE7B,MAAI,GAAG,mBAAmB,MAAM;AAC9B,UAAM,YAAY,GAAG,WAAW,GAAG,cAAc;AACjD,QAAI,WAAW;AACb,YAAM,aAAa,iBAAiB,UAAU,MAAM,GAAG;AACvD,YAAMC,aAAY,WAAW,QAAQ;AAErC,WAAK,OAAO;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,UAAU,CAAC,UAAU;AAAA,QACrB,aAAa,GAAG,mBAAmB;AAAA,QACnC,WAAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,iBAAiB,GAAG,YAAY,KAAK,GAAG,cAAc;AAC7E,QAAM,SAAS,GAAG,eAAe,SAAS,MAAM;AAEhD,MAAI,YAAY,eAAe;AAC/B,MAAI,UAAU;AAEd,MAAI,CAAC,aAAa,eAAe,SAAS,WAAW,eAAe,OAAO,MAAM;AAC/E,gBAAY,eAAe,MAAM;AACjC,cAAU;AAAA,EACZ,WAAW,CAAC,WAAW;AACrB,gBAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL,aAAa,GAAG;AAAA,IAChB,MAAM;AAAA,MACJ,QAAQ,GAAG;AAAA,MACX,MAAM,GAAG;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,YAAY,GAAG;AAAA,IACjB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,cAAc,IAAsB,KAAoB,MAAsB;AACrF,aAAW,cAAc,GAAG,kBAAkB;AAC5C,UAAM,QAAQ,GAAG,WAAW,UAAU;AACtC,QAAI,OAAO;AACT,YAAM,cAAc,iBAAiB,MAAM,MAAM,GAAG;AAEpD,WAAK,KAAK,KAAK;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,UAAU,CAAC,MAAM;AAAA,QACjB,WAAW,YAAY,QAAQ;AAAA,QAC/B,YAAY,YAAY;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAMA,SAAS,eAAe,IAAsB,KAAoB,MAAsB;AACtF,MAAI,GAAG,0BAA0B,MAAM;AACrC,UAAM,aAAa,GAAG,WAAW,GAAG,qBAAqB;AACzD,QAAI,CAAC,WAAY;AAEjB,UAAM,cAAc,iBAAiB,WAAW,MAAM,GAAG;AACzD,UAAM,EAAE,YAAY,eAAe,UAAU,cAAc,IACzDH,8BAA6B,aAAa,IAAI,UAAU;AAE1D,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,aAAa,GAAG;AAClE,YAAM,aAAa,cAAc,SAAS,QAAQ,KAAK;AACvD,YAAM,eAAeC,oBAAmB,YAAY,IAAI,UAAU;AAClE,YAAM,eAAeC,oBAAmB,YAAY,IAAI,UAAU;AAElE,UAAI,YAAa,WAAmB;AACpC,UAAI,CAAC,WAAW;AACd,oBAAY;AAAA,MACd;AAEA,WAAK,MAAM,KAAK;AAAA,QACd,MAAM;AAAA,QACN,OAAO,WAAW;AAAA,QAClB,UAAU;AAAA,QACV;AAAA,QACA,YAAa,WAAmB;AAAA,QAChC,eAAe,eAAe,EAAE,OAAO,cAAc,SAAS,KAAK,IAAI;AAAA,QACvE,SAAS,CAAC,gBAAgB,eAAe,qBAAqB;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,cAAc,GAAG,mBAAmB;AAC7C,UAAM,QAAQ,GAAG,WAAW,UAAU;AACtC,QAAI,OAAO;AACT,YAAM,cAAc,iBAAiB,MAAM,MAAM,GAAG;AACpD,YAAM,eAAeD,oBAAmB,aAAa,IAAI,UAAU;AACnE,YAAM,eAAeC,oBAAmB,aAAa,IAAI,UAAU;AACnE,YAAM,YAAa,YAAoB,QAAQ;AAE/C,WAAK,MAAM,KAAK;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,UAAU,CAAC,MAAM;AAAA,QACjB;AAAA,QACA,YAAa,YAAoB;AAAA,QACjC,eAAe,eAAe,EAAE,OAAO,cAAc,SAAS,KAAK,IAAI;AAAA,QACvE,SAAS,CAAC,gBAAgB,eAAe,qBAAqB;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAMA,SAAS,gBAAgB,IAAsB,KAAoB,MAAsB;AACvF,MAAI,GAAG,2BAA2B,KAAM;AAExC,QAAM,cAAc,GAAG,WAAW,GAAG,sBAAsB;AAC3D,MAAI,CAAC,YAAa;AAElB,QAAM,eAAe,iBAAiB,YAAY,MAAM,GAAG;AAC3D,MAAI,CAAC,aAAa,WAAY;AAE9B,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,aAAa,UAAiC,GAAG;AACnG,UAAM,aAAa,aAAa,UAAU,SAAS,QAAQ,KAAK;AAChE,QAAI,YAAY,WAAW;AAC3B,QAAI,CAAC,WAAW;AACd,kBAAY;AAAA,IACd;AAEA,SAAK,QAAQ,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,OAAO,YAAY;AAAA,MACnB,UAAU;AAAA,MACV;AAAA,MACA,YAAY,WAAW;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAMA,SAAS,gBAAgB,IAAsB,KAAoB,MAAsB;AACvF,MAAI,GAAG,2BAA2B,KAAM;AAExC,QAAM,cAAc,GAAG,WAAW,GAAG,sBAAsB;AAC3D,MAAI,CAAC,YAAa;AAElB,QAAM,eAAe,iBAAiB,YAAY,MAAM,GAAG;AAC3D,MAAI,CAAC,aAAa,WAAY;AAE9B,aAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,aAAa,UAAiC,GAAG;AACnG,UAAM,aAAa,aAAa,UAAU,SAAS,QAAQ,KAAK;AAChE,QAAI,YAAY,WAAW;AAC3B,QAAI,CAAC,WAAW;AACd,kBAAY;AAAA,IACd;AAEA,SAAK,QAAQ,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,OAAO,YAAY;AAAA,MACnB,UAAU;AAAA,MACV;AAAA,MACA,YAAY,WAAW;AAAA,MACvB,eAAe,EAAE,OAAO,QAAQ,SAAS,KAAK;AAAA,IAChD,CAAC;AAAA,EACH;AACF;;;AC3XA,IAAAE,kBAAe;AACf,IAAAC,oBAAiB;AACjB,yBAAmB;AAEnB,iBAAgB;AAChB,yBAAuB;AA2CvB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,iBAAiB,OAAO,gBAAgB,SAAS,CAAC;AAEnF,SAAS,qBAAqB,QAA0B;AACtD,MAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAC1D,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,OAAO,IAAI,oBAAoB;AAEjE,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAiC,GAAG;AACtE,QAAI,gBAAgB,IAAI,CAAC,EAAG;AAC5B,QAAI,EAAE,WAAW,IAAI,EAAG;AACxB,QAAI,CAAC,IAAI,qBAAqB,CAAC;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAA0B;AACtD,MAAI,WAAW,QAAQ,OAAO,WAAW,SAAU,QAAO;AAC1D,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO,OAAO,IAAI,oBAAoB;AAEjE,MAAI,OAAQ,OAAmC,SAAS,UAAU;AAChE,UAAM,MAAO,OAAmC;AAChD,UAAM,IAAI,IAAI,MAAM,gCAAgC;AACpD,QAAI,GAAG;AACL,aAAO,EAAE,GAAG,QAAQ,MAAM,EAAE,CAAC,EAAE;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAiC,GAAG;AACtE,QAAI,CAAC,IAAI,qBAAqB,CAAC;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,OAAO,GAAmB;AACjC,SAAO,EAAE,QAAQ,kBAAkB,GAAG,EAAE,QAAQ,eAAe,KAAK;AACtE;AAEA,SAAS,kBAAkB,WAA2B;AACpD,SAAO,UAAU,QAAQ,6BAA6B,EAAE;AAC1D;AAoBA,eAAsB,0BAA0B,MAI7C;AACD,QAAM,SAAS,KAAK;AACpB,QAAM,UAAU,kBAAAC,QAAK,KAAK,QAAQ,gBAAgB;AAClD,QAAM,UAAU,kBAAAA,QAAK,KAAK,QAAQ,gBAAgB;AAClD,QAAM,WAAW,kBAAAA,QAAK,KAAK,QAAQ,sBAAsB;AAEzD,kBAAAC,QAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAExC,QAAM,UAAuB,CAAC;AAE9B,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,QAAQ,YAAY,WAAW,CAAC,CAAC,GAAG;AAChF,UAAM,QAAQ,qBAAqB,qBAAqB,GAAG,CAAC;AAC5D,YAAQ,KAAK,EAAE,GAAI,OAAkB,KAAK,KAAK,CAAc;AAAA,EAC/D;AAEA,QAAM,UAA+E,CAAC;AAEtF,aAAW,QAAQ,KAAK,SAAS,eAAe,CAAC,GAAG;AAClD,eAAW,MAAM,KAAK,cAAc,CAAC,GAAG;AACtC,YAAM,QAA6D,EAAE,UAAU,CAAC,EAAE;AAClF,cAAQ,GAAG,WAAW,IAAI;AAE1B,UAAI,GAAG,KAAK,MAAM,WAAW;AAC3B,cAAM,WAAW,kBAAkB,GAAG,KAAK,KAAK,SAAS;AACzD,cAAM,KAAK,OAAO,MAAM,GAAG,WAAW,OAAO;AAC7C,gBAAQ,KAAK,EAAE,KAAK,IAAI,MAAM,SAAS,CAAc;AACrD,cAAM,OAAO;AAAA,MACf;AAEA,iBAAW,KAAK,GAAG,aAAa,CAAC,GAAG;AAClC,YAAI,CAAC,EAAE,UAAW;AAClB,cAAM,WAAW,kBAAkB,EAAE,SAAS;AAC9C,cAAM,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,WAAW;AACxC,cAAM,KAAK,OAAO,MAAM,GAAG,WAAW,QAAQ,EAAE,MAAM,IAAI,EAAE,WAAW,EAAE;AACzE,gBAAQ,KAAK,EAAE,KAAK,IAAI,MAAM,SAAS,CAAc;AACrD,cAAM,SAAS,GAAG,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,WAAW,QAAQ,QAAQ,KAAK,WAAW,QAAQ,QAAQ;AAElF,QAAM,MAAM,IAAI,WAAAC,QAAI,QAAQ;AAAA,IAC1B;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM,EAAE,QAAQ,KAAK;AAAA,EACvB,CAAC;AAED,qBAAAC,QAAW,QAAQ,KAAK,EAAE,MAAM,KAAK,eAAe,OAAO,CAAC;AAE5D,MAAI;AACJ,QAAM,mBAAmB,QAAQ,qBAAqB;AACtD,MAAI,OAAO,qBAAqB,YAAY;AAC1C,UAAM,iBAAiB,GAAG;AAAA,EAC5B,WAAW,oBAAoB,OAAO,iBAAiB,YAAY,YAAY;AAC7E,UAAM,iBAAiB,QAAQ,GAAG;AAAA,EACpC,OAAO;AACL,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAEA,SAAO;AACP,SAAO;AACP,aAAW,CAAC,aAAa,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AACtD,WAAO,KAAK,KAAK,UAAU,WAAW,CAAC;AAAA;AACvC,WAAO,aAAa,EAAE,OAAO,WAAW,KAAK,UAAU,EAAE,IAAI,CAAC,MAAM,WAAW;AAAA;AAC/E,WAAO;AACP,eAAW,CAAC,KAAK,EAAE,KAAK,OAAO,QAAQ,EAAE,QAAQ,GAAG;AAClD,aAAO,SAAS,KAAK,UAAU,GAAG,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;AAAA;AAAA,IACpE;AACA,WAAO;AACP,WAAO;AAAA,EACT;AACA,SAAO;AAEP,kBAAAF,QAAG,cAAc,SAAS,KAAK,MAAM;AAErC,QAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBZ,kBAAAA,QAAG,cAAc,SAAS,KAAK,MAAM;AAErC,QAAM,OAAO,mBAAAG,QAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AACjE,kBAAAH,QAAG,cAAc,UAAU,KAAK,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM;AAEpE,SAAO,EAAE,mBAAmB,SAAS,mBAAmB,SAAS,KAAK;AACxE;;;ACzNA,IAAAI,kBAAe;AACf,IAAAC,oBAAiB;AALjB;AAiBA,SAAS,SAAY,GAAqB;AACxC,MAAI;AACF,WAAO,KAAK,MAAM,gBAAAC,QAAG,aAAa,GAAG,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,GAA0B;AAC7C,MAAI;AACF,WAAO,gBAAAA,QAAG,SAAS,CAAC,EAAE;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,kBAAAC,QAAK,WAAW,CAAC,IAAI,IAAI,kBAAAA,QAAK,QAAQ,CAAC;AAChD;AASO,SAAS,qBAAqB,iBAAmC;AACtE,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAY;AAE7B,WAAS,MAAM,MAAc;AAC3B,QAAI,KAAK,IAAI,IAAI,EAAG;AACpB,SAAK,IAAI,IAAI;AACb,QAAI,KAAK,IAAI;AAEb,UAAM,MAAM,SAAc,IAAI;AAC9B,UAAM,MAAM,KAAK;AACjB,QAAI,CAAC,IAAK;AAEV,QAAI,WAA0B;AAE9B,QAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,GAAG,KAAK,eAAe,KAAK,GAAG,GAAG;AAC1E,iBAAW,UAAU,kBAAAA,QAAK,QAAQ,kBAAAA,QAAK,QAAQ,IAAI,GAAG,GAAG,CAAC;AAC1D,UAAI,CAAC,SAAS,SAAS,OAAO,EAAG,aAAY;AAAA,IAC/C,OAAO;AACL,UAAI;AACF,cAAM,MAAO,OAAe,gBAAgB,YAAY,GAAG,KAAK;AAChE,mBAAW,IAAI,QAAQ,GAAG;AAAA,MAC5B,QAAQ;AACN,YAAI;AACF,gBAAM,MAAO,OAAe,gBAAgB,YAAY,GAAG,KAAK;AAChE,qBAAW,IAAI,QAAQ,IAAI,SAAS,OAAO,IAAI,MAAM,GAAG,GAAG,OAAO;AAAA,QACpE,QAAQ;AACN,qBAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAU,OAAM,QAAQ;AAAA,EAC9B;AAEA,QAAM,eAAe;AACrB,SAAO;AACT;AASO,SAAS,aAAa,UAA4D;AACvF,QAAM,QAAQ,CAAC,kBAAkB,qBAAqB,WAAW;AACjE,MAAI,MAAM;AAEV,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,eAAW,KAAK,OAAO;AACrB,YAAM,IAAI,kBAAAA,QAAK,KAAK,KAAK,CAAC;AAC1B,YAAM,KAAK,YAAY,CAAC;AACxB,UAAI,OAAO,KAAM,QAAO,EAAE,MAAM,GAAG,SAAS,GAAG;AAAA,IACjD;AACA,UAAM,SAAS,kBAAAA,QAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AASA,eAAsB,QAAQ,QAKL;AACvB,QAAM,YAAY,UAAU,OAAO,MAAM;AACzC,QAAM,cAAc,UAAU,OAAO,OAAO;AAE5C,QAAM,eAAe,kBAAAA,QAAK,KAAK,WAAW,eAAe;AACzD,QAAM,YAAY,kBAAAA,QAAK,KAAK,WAAW,YAAY;AAEnD,MAAI,CAAC,gBAAAD,QAAG,WAAW,YAAY,EAAG,QAAO,EAAE,OAAO,MAAM,QAAQ,mBAAmB;AAEnF,QAAM,QAAQ,SAAuB,SAAS;AAC9C,MAAI,CAAC,MAAO,QAAO,EAAE,OAAO,MAAM,QAAQ,gBAAgB;AAE1D,MAAI,MAAM,UAAU,YAAY,OAAO,cAAc;AACnD,WAAO,EAAE,OAAO,MAAM,QAAQ,6BAA6B,QAAQ,GAAG,MAAM,UAAU,OAAO,OAAO,OAAO,YAAY,GAAG;AAAA,EAC5H;AAEA,MAAI,UAAU,MAAM,QAAQ,YAAY,MAAM,aAAa;AACzD,WAAO,EAAE,OAAO,MAAM,QAAQ,oBAAoB,QAAQ,yBAAyB;AAAA,EACrF;AAEA,QAAM,QAAQ,qBAAqB,WAAW;AAC9C,aAAW,OAAO,OAAO;AACvB,UAAM,KAAK,YAAY,GAAG;AAC1B,QAAI,OAAO,KAAM,QAAO,EAAE,OAAO,MAAM,QAAQ,kBAAkB,QAAQ,IAAI;AAE7E,UAAM,WAAW,MAAM,QAAQ,YAAY,GAAG;AAC9C,QAAI,aAAa,QAAQ,KAAK,IAAI,WAAW,EAAE,IAAI,MAAQ;AACzD,aAAO,EAAE,OAAO,MAAM,QAAQ,kBAAkB,QAAQ,IAAI;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,UAAU,MAAM;AAChC,UAAM,KAAK,YAAY,MAAM,QAAQ,SAAS,IAAI;AAClD,QAAI,OAAO,KAAM,QAAO,EAAE,OAAO,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAEvG,QAAI,KAAK,IAAI,MAAM,QAAQ,SAAS,UAAU,EAAE,IAAI,MAAQ;AAC1D,aAAO,EAAE,OAAO,MAAM,QAAQ,oBAAoB,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAAA,IACxF;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AAC3D,UAAM,KAAK,YAAY,IAAI;AAC3B,QAAI,OAAO,KAAM,QAAO,EAAE,OAAO,MAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAC7E,QAAI,KAAK,IAAI,WAAW,EAAE,IAAI,KAAQ,QAAO,EAAE,OAAO,MAAM,QAAQ,iBAAiB,QAAQ,KAAK;AAAA,EACpG;AAEA,SAAO,EAAE,OAAO,OAAO,QAAQ,aAAa;AAC9C;;;AClKA,IAAAE,kBAAe;AACf,IAAAC,oBAAiB;AACjB,IAAAC,sBAAe;AAIf,SAASC,aAAY,GAAmB;AACtC,SAAO,gBAAAC,QAAG,SAAS,CAAC,EAAE;AACxB;AAEA,SAAS,UAAU,GAAW;AAC5B,kBAAAA,QAAG,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrC;AAEA,SAAS,oBAAoB,GAAoB;AAC/C,MAAI,EAAE,SAAS,GAAG,kBAAAC,QAAK,GAAG,eAAe,kBAAAA,QAAK,GAAG,EAAE,EAAG,QAAO;AAC7D,MAAI,EAAE,SAAS,GAAG,kBAAAA,QAAK,GAAG,aAAa,kBAAAA,QAAK,GAAG,MAAM,kBAAAA,QAAK,GAAG,EAAE,EAAG,QAAO;AACzE,SAAO,sBAAsB,KAAK,CAAC;AACrC;AAQO,SAAS,WAAW,QAKlB;AACP,QAAM,YAAY,kBAAAA,QAAK,WAAW,OAAO,MAAM,IAAI,OAAO,SAAS,kBAAAA,QAAK,QAAQ,OAAO,MAAM;AAC7F,YAAU,SAAS;AAEnB,QAAM,cAAc,qBAAqB,OAAO,WAAW;AAC3D,QAAM,eAAuC,CAAC;AAC9C,aAAW,OAAO,YAAa,cAAa,GAAG,IAAIF,aAAY,GAAG;AAElE,QAAM,OAAO,aAAa,kBAAAE,QAAK,QAAQ,OAAO,WAAW,CAAC;AAE1D,QAAM,SAAiC,CAAC;AACxC,aAAW,MAAM,OAAO,QAAQ,eAAe,GAAG;AAChD,UAAM,IAAI,GAAG;AACb,QAAI,CAAC,oBAAoB,CAAC,EAAG;AAC7B,QAAI;AACF,aAAO,CAAC,IAAIF,aAAY,CAAC;AAAA,IAC3B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,QAAsB;AAAA,IAC1B,cAAc;AAAA,IACd,WAAW;AAAA,MACT,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,YAAY,oBAAAG,QAAG;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,MACP,cAAc,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,UAAU,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AAEA,kBAAAF,QAAG,cAAc,kBAAAC,QAAK,KAAK,WAAW,YAAY,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,MAAM;AAC7F;;;Af9DA,IAAAE,sBAAe;AACf,0BAAoB;AAEpB,IAAM,gBAAgB;AAItB,SAAS,IAAI,KAAa;AACxB,sBAAAC,QAAQ,OAAO,MAAM,MAAM,IAAI;AACjC;AAEA,SAAS,SAAS,MAAiB;AACjC,MAAI,oBAAAA,QAAQ,IAAI,aAAa;AAC3B,YAAQ,MAAM,eAAe,GAAG,IAAI;AAAA,EACtC;AACF;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,MAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,UAAQ,gBAAgB,IAAI,CAAC;AAAA,EAC9C;AAEA,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,QAAI,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,GAAG,EAAG;AAClD,QAAI,OAAO,UAAU,WAAY;AACjC,QAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,YAAM,WAAY,MAAc,aAAa;AAC7C,UAAI,YAAY,CAAC,CAAC,UAAU,SAAS,UAAU,UAAU,WAAW,QAAQ,QAAQ,EAAE,SAAS,QAAQ,GAAG;AACxG;AAAA,MACF;AAAA,IACF;AACA,WAAO,GAAG,IAAI,gBAAgB,KAAK;AAAA,EACrC;AACA,SAAO;AACT;AAEA,eAAe,aAAa,MAAgB;AAC1C,QAAM,eAAe,KAAK,QAAQ,IAAI;AACtC,QAAM,cAAc,iBAAiB,KAAK,KAAK,eAAe,CAAC,IAAI;AACnE,QAAM,YAAY,KAAK,SAAS,UAAU,IACtC,KAAK,KAAK,QAAQ,UAAU,IAAI,CAAC,IACjC;AACJ,QAAM,UAAU,KAAK,SAAS,YAAY;AAE1C,QAAM,sBAAsB,KAAK,QAAQ,mBAAmB;AAC5D,QAAM,iBAAiC,wBAAwB,KAC1D,KAAK,sBAAsB,CAAC,IAC7B;AAEJ,MAAI,mBAAmB,UAAU,mBAAmB,iBAAiB,mBAAmB,eAAe;AACrG,YAAQ,MAAM,4BAA4B,cAAc,gDAAgD;AACxG,wBAAAA,QAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBAAa,2BAAQ,SAAS;AAEpC,MAAI,SAAS;AACX,UAAM,QAAQ,MAAM,QAAQ;AAAA,MAC1B,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,mBAAmB,oBAAAC,QAAG;AAAA,IACxB,CAAC;AAED,QAAI,CAAC,MAAM,OAAO;AAChB,UAAI,iCAAiC;AACrC;AAAA,IACF;AAEA,QAAI,0CAA0C,MAAM,MAAM,GAAG,MAAM,SAAS,KAAK,MAAM,MAAM,KAAK,EAAE,GAAG;AACvG,UAAM,iBAAiB,MAAM,MAAM;AAAA,EACrC,OAAO;AACL,QAAI,sDAAsD;AAAA,EAC5D;AAEA,QAAM,EAAE,SAAS,SAAS,YAAY,IAAI,wBAAwB,WAAW;AAC7E,QAAM,cAAc,gBAAgB,aAAa,OAAO;AAExD,MAAI,YAAY,WAAW,GAAG;AAC5B,YAAQ,KAAK,uBAAuB;AACpC,wBAAAD,QAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,SAAS,YAAY,MAAM,gBAAgB;AAE/C,QAAM,UAAU,gBAAgB,aAAa,SAAS,EAAE,OAAO,OAAO,SAAS,QAAQ,CAAC;AACxF,QAAM,WAAW,iBAAiB,aAAa,SAAS,eAAe,cAAc;AAErF,iCAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,yCAAc,2BAAQ,YAAY,cAAc,GAAG,KAAK,UAAU,gBAAgB,OAAO,GAAG,MAAM,CAAC,CAAC;AACpG,yCAAc,2BAAQ,YAAY,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAErF,MAAI,mBAAmB,eAAe;AACpC,QAAI,sCAAsC;AAE1C,UAAM,cAAc,KAAK,UAAM,kCAAa,2BAAQ,YAAY,eAAe,GAAG,OAAO,CAAC;AAE1F,UAAM,0BAA0B;AAAA,MAC9B,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,aAAa;AAAA,IACf,CAAC;AAED,gBAAY,aAAa;AAAA,MACvB,MAAM;AAAA,MACN,mBAAmB;AAAA,IACrB;AAEA,2CAAc,2BAAQ,YAAY,eAAe,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AAExF,QAAI,oBAAoB;AACxB,QAAI,oBAAoB;AACxB,QAAI,0BAA0B;AAAA,EAChC;AAEA,aAAW;AAAA,IACT,QAAQ;AAAA,IACR,iBAAa,2BAAQ,WAAW;AAAA,IAChC;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,MAAI,cAAc,UAAU,GAAG;AAC/B,MAAI,kBAAkB;AACtB,MAAI,mBAAmB;AACvB,MAAI,gBAAgB;AACtB;AAEA,SAAS,aAAa,MAAgB;AACpC,QAAM,YAAY,KAAK,SAAS,UAAU,IACtC,KAAK,KAAK,QAAQ,UAAU,IAAI,CAAC,IACjC;AAEJ,QAAM,iBAAa,2BAAQ,SAAS;AAEpC,UAAI,4BAAW,UAAU,GAAG;AAC1B,gCAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD;AAEA,MAAI,sBAAsB,SAAS,EAAE;AACvC;AAEA,IAAM,UAAU,oBAAAA,QAAQ,KAAK,CAAC;AAE9B,IAAI,YAAY,SAAS;AACvB,eAAa,oBAAAA,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACjD,YAAQ,MAAM,GAAG;AACjB,wBAAAA,QAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,WAAW,YAAY,SAAS;AAC9B,eAAa,oBAAAA,QAAQ,KAAK,MAAM,CAAC,CAAC;AACpC,OAAO;AACL,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkBX;AACH;","names":["import_node_fs","import_node_path","ts","path","import_typescript","ts","path","import_typescript","import_typescript","import_typescript","ts","ts","import_typescript","ts","getExplicitTypeNameFromNode","import_typescript","buildNamedSchema","ts","getSchemaName","getExplicitTypeNameFromNode","import_typescript","ts","getExplicitTypeNameFromNode","items","ts","import_typescript","ts","METAL_ORM_WRAPPER_NAMES","path","ts","import_typescript","ts","resolveSchemaRef","resolveAndCollectObjectProps","isDeepObjectSchema","isObjectLikeSchema","schemaRef","import_node_fs","import_node_path","path","fs","Ajv","addFormats","crypto","import_node_fs","import_node_path","fs","path","import_node_fs","import_node_path","import_typescript","statMtimeMs","fs","path","ts","import_typescript","process","ts"]}