adorn-api 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +537 -25
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +537 -25
- package/dist/cli.js.map +1 -1
- package/dist/compiler/schema/objectHandler.d.ts +40 -0
- package/dist/compiler/schema/objectHandler.d.ts.map +1 -1
- package/dist/compiler/schema/openapi.d.ts.map +1 -1
- package/dist/compiler/schema/queryBuilderAnalyzer.d.ts +43 -0
- package/dist/compiler/schema/queryBuilderAnalyzer.d.ts.map +1 -0
- package/dist/compiler/schema/queryBuilderSchemaBuilder.d.ts +13 -0
- package/dist/compiler/schema/queryBuilderSchemaBuilder.d.ts.map +1 -0
- package/dist/compiler/schema/types.d.ts +1 -0
- package/dist/compiler/schema/types.d.ts.map +1 -1
- package/dist/metal/applyListQuery.d.ts +1 -1
- package/dist/metal/applyListQuery.d.ts.map +1 -1
- package/dist/metal/index.cjs.map +1 -1
- package/dist/metal/index.js.map +1 -1
- package/package.json +2 -2
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/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","../src/cli/progress.ts","../src/compiler/schema/partitioner.ts","../src/compiler/schema/splitOpenapi.ts","../src/compiler/graph/types.ts","../src/compiler/graph/builder.ts","../src/compiler/graph/schemaGraph.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { writeFileSync, mkdirSync, rmSync, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 { ProgressTracker, Spinner } from \"./cli/progress.js\";\nimport { partitionSchemas, type PartitionStrategy } from \"./compiler/schema/partitioner.js\";\nimport { generateModularOpenAPI } from \"./compiler/schema/splitOpenapi.js\";\nimport { createGraph, addNode, addEdge, type Graph, type AnyNode } from \"./compiler/graph/types.js\";\nimport { buildGraph } from \"./compiler/graph/builder.js\";\nimport { SchemaGraph } from \"./compiler/graph/schemaGraph.js\";\nimport ts from \"typescript\";\nimport process from \"node:process\";\n\nconst ADORN_VERSION = (() => {\n const tryReadPackageJson = (filePath: string): string | null => {\n try {\n const pkg = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return pkg.version ?? null;\n } catch {\n return null;\n }\n };\n\n // List of potential package.json locations to try\n const potentialPaths: string[] = [];\n \n // Try ESM context first\n try {\n const importMetaUrl = import.meta?.url;\n if (importMetaUrl && typeof importMetaUrl === \"string\" && importMetaUrl.length > 0) {\n const cliDir = dirname(fileURLToPath(importMetaUrl));\n potentialPaths.push(\n resolve(cliDir, \"..\", \"package.json\"),\n resolve(cliDir, \"package.json\")\n );\n }\n } catch {\n // Ignore errors from import.meta access\n }\n \n // Add common paths for all contexts\n const cwd = process.cwd();\n potentialPaths.push(\n resolve(cwd, \"package.json\"),\n resolve(cwd, \"node_modules\", \"adorn-api\", \"package.json\"),\n resolve(cwd, \"..\", \"package.json\"),\n resolve(cwd, \"..\", \"..\", \"package.json\")\n );\n \n // Try each potential path\n for (const pkgPath of potentialPaths) {\n const version = tryReadPackageJson(pkgPath);\n if (version) {\n return version;\n }\n }\n\n // Fallback: Return 0.0.0 if all methods fail\n return \"0.0.0\";\n})();\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\ninterface BuildOptions {\n projectPath: string;\n outputDir: string;\n ifStale: boolean;\n validationMode: ValidationMode;\n verbose: boolean;\n quiet: boolean;\n noSplit: boolean;\n splitStrategy: PartitionStrategy | undefined;\n splitThreshold: number;\n}\n\nfunction log(msg: string, options?: { indent?: boolean }) {\n if (options?.indent) {\n process.stdout.write(\" \" + msg + \"\\n\");\n } else {\n process.stdout.write(msg + \"\\n\");\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getFileSize(path: string): number | undefined {\n try {\n return statSync(path).size;\n } catch {\n return undefined;\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\n/**\n * Build a minimal graph from controllers for schema partitioning\n */\nfunction buildControllerGraph(controllers: any[]): Graph {\n const graph = createGraph(ts.version);\n const nodeMap = new Map<string, AnyNode>();\n \n // Create controller nodes\n for (const ctrl of controllers) {\n const nodeId = `Controller:${ctrl.className}`;\n const node: AnyNode = {\n id: nodeId,\n kind: 'Controller',\n metadata: {\n name: ctrl.className,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n controller: {\n basePath: ctrl.basePath,\n },\n };\n addNode(graph, node);\n nodeMap.set(nodeId, node);\n }\n \n // Create operation nodes\n let opIndex = 0;\n for (const ctrl of controllers) {\n for (const op of ctrl.operations) {\n const nodeId = `Operation:${op.operationId}`;\n const node: AnyNode = {\n id: nodeId,\n kind: 'Operation',\n metadata: {\n name: op.operationId,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n operation: {\n httpMethod: op.httpMethod,\n path: op.path,\n operationId: op.operationId,\n returnType: op.returnType || '',\n },\n };\n addNode(graph, node);\n nodeMap.set(nodeId, node);\n \n // Connect controller to operation\n const ctrlNode = nodeMap.get(`Controller:${ctrl.className}`);\n if (ctrlNode) {\n addEdge(graph, ctrlNode.id, node.id, 'contains');\n }\n \n opIndex++;\n }\n }\n \n // Create type definition nodes for return types\n for (const ctrl of controllers) {\n for (const op of ctrl.operations) {\n if (op.returnType && !nodeMap.has(op.returnType)) {\n const node: AnyNode = {\n id: op.returnType,\n kind: 'TypeDefinition',\n metadata: {\n name: op.returnType,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n typeDef: {\n isGeneric: false,\n properties: new Map(),\n },\n };\n addNode(graph, node);\n nodeMap.set(op.returnType, node);\n \n // Connect operation to return type\n const opNodeId = `Operation:${op.operationId}`;\n const opNode = nodeMap.get(opNodeId);\n if (opNode) {\n addEdge(graph, opNode.id, node.id, 'uses');\n }\n }\n }\n }\n \n return graph;\n}\n\nasync function buildCommand(args: string[]) {\n const progress = new ProgressTracker({ verbose: args.includes(\"--verbose\"), quiet: args.includes(\"--quiet\") });\n\n // Parse arguments\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 const verbose = args.includes(\"--verbose\");\n const quiet = args.includes(\"--quiet\");\n const noSplit = args.includes(\"--no-split\");\n \n // Parse split strategy override\n const splitStrategyIndex = args.indexOf(\"--split-strategy\");\n const splitStrategy = splitStrategyIndex !== -1 \n ? args[splitStrategyIndex + 1] as PartitionStrategy \n : undefined;\n \n // Parse split threshold\n const splitThresholdIndex = args.indexOf(\"--split-threshold\");\n const splitThreshold = splitThresholdIndex !== -1 \n ? parseInt(args[splitThresholdIndex + 1], 10) \n : 50;\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 (!quiet) {\n log(`adorn-api v${ADORN_VERSION} - Building API artifacts`);\n log(\"\");\n }\n\n // Phase 1: Check staleness\n if (ifStale) {\n progress.startPhase(\"staleness-check\", \"Checking for stale artifacts\");\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 progress.completePhase(\"staleness-check\");\n if (!quiet) {\n log(\"adorn-api: artifacts up-to-date\");\n }\n return;\n }\n\n progress.completePhase(\"staleness-check\", `Artifacts stale (${stale.reason})`);\n if (verbose) {\n progress.verboseLog(`Stale reason: ${stale.detail || stale.reason}`);\n }\n } else {\n progress.startPhase(\"configuration\", \"Initializing build\");\n progress.completePhase(\"configuration\", \"Build forced (--if-stale not used)\");\n }\n\n // Phase 2: Create TypeScript program\n progress.startPhase(\"program\", \"Loading TypeScript configuration\");\n if (verbose) {\n progress.verboseLog(`Loading ${projectPath}`);\n }\n \n const { program, checker, sourceFiles } = createProgramFromConfig(projectPath);\n const projectSourceFiles = sourceFiles.filter(sf => !sf.fileName.includes(\"node_modules\"));\n progress.completePhase(\"program\");\n \n if (verbose) {\n progress.verboseLog(`Found ${projectSourceFiles.length} source files`);\n }\n\n // Phase 3: Scan controllers\n progress.startPhase(\"scan\", \"Scanning for controllers\");\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 const totalOperations = controllers.reduce((sum, ctrl) => sum + ctrl.operations.length, 0);\n progress.completePhase(\"scan\", `Found ${controllers.length} controller(s) with ${totalOperations} operation(s)`);\n \n if (verbose) {\n for (const ctrl of controllers) {\n progress.verboseLog(`Controller: ${ctrl.className} (${ctrl.basePath}) - ${ctrl.operations.length} operations`);\n }\n }\n\n // Phase 4: Generate OpenAPI\n progress.startPhase(\"openapi\", \"Generating OpenAPI schema\");\n \n const openapiSpinner = new Spinner(\"Processing schemas\");\n if (!quiet) openapiSpinner.start();\n \n const openapi = generateOpenAPI(controllers, checker, { \n title: \"API\", \n version: \"1.0.0\",\n onProgress: (message, current, total) => {\n if (!quiet) {\n openapiSpinner.setStatus(`${message} (${current}/${total})`);\n }\n }\n });\n \n // Update spinner with final progress info\n if (!quiet) {\n openapiSpinner.setStatus(`Processed ${controllers.length} controllers, ${totalOperations} operations`);\n }\n \n if (!quiet) openapiSpinner.stop();\n \n const schemaCount = Object.keys(openapi.components?.schemas || {}).length;\n \n // Auto-split logic (default enabled, --no-split to disable)\n let splitEnabled = false;\n \n if (!noSplit && schemaCount >= splitThreshold) {\n progress.verboseLog(`Schema count (${schemaCount}) >= threshold (${splitThreshold}), analyzing for auto-split...`);\n \n // Build minimal graph for partitioning\n const graph = buildControllerGraph(controllers);\n const schemaGraph = new SchemaGraph(graph);\n \n // Convert schemas to Map format\n const schemasMap = new Map(Object.entries(openapi.components?.schemas || {}));\n \n // Run smart partitioning\n const strategy = splitStrategy || 'auto';\n const partitioning = partitionSchemas(schemasMap, graph, schemaGraph, {\n strategy,\n threshold: splitThreshold,\n verbose,\n });\n \n splitEnabled = partitioning.shouldSplit;\n \n if (splitEnabled) {\n progress.verboseLog(`Partitioning result: ${partitioning.strategy} strategy`);\n progress.verboseLog(`Recommendation: ${partitioning.recommendation}`);\n \n if (!quiet) {\n log(` Auto-split enabled: ${partitioning.strategy} strategy`);\n }\n \n // Generate modular OpenAPI with progress tracking\n const splitSpinner = new Spinner(\"Writing split schema files\");\n if (!quiet) splitSpinner.start();\n \n generateModularOpenAPI(openapi, partitioning, {\n outputDir: outputPath,\n schemasDir: \"schemas\",\n createIndexFile: true,\n prettyPrint: true,\n onProgress: (step, index, total) => {\n if (!quiet) {\n progress.logSub(`${step} (${index}/${total})`);\n }\n }\n });\n \n if (!quiet) splitSpinner.stop();\n \n if (!quiet) {\n log(` Schema groups: ${partitioning.groups.length}`);\n }\n } else {\n if (!quiet) {\n log(` Auto-split not needed: ${partitioning.recommendation}`);\n }\n }\n } else if (noSplit) {\n if (!quiet) {\n log(` Splitting disabled (--no-split)`);\n }\n } else {\n if (!quiet) {\n log(` Schema count (${schemaCount}) below threshold (${splitThreshold}), single file mode`);\n }\n }\n \n progress.completePhase(\"openapi\", `Generated ${schemaCount} schema(s)${splitEnabled ? ' (split into groups)' : ''}`);\n\n // Phase 5: Generate manifest\n progress.startPhase(\"manifest\", \"Generating manifest\");\n const manifest = generateManifest(controllers, checker, ADORN_VERSION, validationMode);\n progress.completePhase(\"manifest\");\n\n // Phase 6: Write artifacts\n progress.startPhase(\"write\", \"Writing artifacts\");\n mkdirSync(outputPath, { recursive: true });\n \n const openapiPath = resolve(outputPath, \"openapi.json\");\n const manifestPath = resolve(outputPath, \"manifest.json\");\n \n // Write openapi.json (if not already written by split)\n if (!splitEnabled) {\n writeFileSync(openapiPath, JSON.stringify(sanitizeForJson(openapi), null, 2));\n }\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n \n const artifacts: Array<{ name: string; size?: number }> = [\n { name: \"openapi.json\", size: getFileSize(openapiPath) },\n { name: \"manifest.json\", size: getFileSize(manifestPath) },\n ];\n \n // Add schema files to artifacts list\n if (splitEnabled) {\n const schemasDir = resolve(outputPath, \"schemas\");\n if (existsSync(schemasDir)) {\n const fs = await import(\"node:fs\");\n const files = fs.readdirSync(schemasDir);\n for (const file of files) {\n const filePath = resolve(schemasDir, file);\n artifacts.push({ name: `schemas/${file}`, size: getFileSize(filePath) });\n }\n }\n }\n \n if (verbose) {\n for (const artifact of artifacts) {\n progress.verboseLog(`Written: ${artifact.name} (${formatBytes(artifact.size || 0)})`);\n }\n }\n\n // Phase 7: Precompiled validators (if enabled)\n if (validationMode === \"precompiled\") {\n progress.startPhase(\"validators\", \"Generating precompiled validators\");\n \n const manifestObj = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n \n const spinner = new Spinner(\"Generating validators...\");\n if (!quiet) spinner.start();\n \n await emitPrecompiledValidators({\n outDir: outputPath,\n openapi,\n manifest: manifestObj,\n strict: \"off\",\n formatsMode: \"full\"\n });\n \n if (!quiet) spinner.stop();\n \n manifestObj.validation = {\n mode: \"precompiled\",\n precompiledModule: \"./validators.mjs\"\n };\n \n writeFileSync(manifestPath, JSON.stringify(manifestObj, null, 2));\n \n const validatorsCjsPath = resolve(outputPath, \"validators.cjs\");\n const validatorsMjsPath = resolve(outputPath, \"validators.mjs\");\n const validatorsMetaPath = resolve(outputPath, \"validators.meta.json\");\n \n artifacts.push(\n { name: \"validators.cjs\", size: getFileSize(validatorsCjsPath) },\n { name: \"validators.mjs\", size: getFileSize(validatorsMjsPath) },\n { name: \"validators.meta.json\", size: getFileSize(validatorsMetaPath) }\n );\n \n progress.completePhase(\"validators\");\n \n if (verbose) {\n progress.verboseLog(\"Precompiled validators generated successfully\");\n }\n }\n\n // Phase 8: Write cache\n progress.startPhase(\"cache\", \"Writing cache\");\n \n writeCache({\n outDir: outputDir,\n tsconfigAbs: resolve(projectPath),\n program,\n adornVersion: ADORN_VERSION\n });\n \n const cachePath = resolve(outputPath, \"cache.json\");\n artifacts.push({ name: \"cache.json\", size: getFileSize(cachePath) });\n \n progress.completePhase(\"cache\");\n \n if (verbose) {\n progress.verboseLog(`Written: cache.json (${formatBytes(getFileSize(cachePath) || 0)})`);\n }\n\n // Print summary\n const stats = {\n controllers: controllers.length,\n operations: totalOperations,\n schemas: schemaCount,\n sourceFiles: projectSourceFiles.length,\n artifactsWritten: artifacts.map(a => a.name),\n splitEnabled,\n };\n \n progress.printSummary(stats);\n progress.printArtifacts(artifacts);\n}\n\nfunction cleanCommand(args: string[]) {\n const quiet = args.includes(\"--quiet\");\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 if (!quiet) {\n log(`adorn-api: cleaned ${outputDir}`);\n }\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 v${ADORN_VERSION}\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 --no-split Disable automatic schema splitting (default: auto-split enabled)\n --split-strategy <mode> Override splitting strategy: controller, dependency, size, auto (default: auto)\n --split-threshold <num> Schema count threshold for auto-split (default: 50)\n --verbose Show detailed progress information\n --quiet Suppress non-essential output\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 build --verbose\n adorn-api build --no-split # Force single file mode\n adorn-api build --split-strategy controller # Force controller-based splitting\n adorn-api build --split-threshold 100 # Increase threshold to 100\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 * Progress callback for OpenAPI generation\n */\nexport interface OpenAPIProgressCallback {\n (message: string, current: number, total: number): void;\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 * @param onProgress - Optional callback to report progress during generation\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; onProgress?: OpenAPIProgressCallback } = {}\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 const { onProgress } = options;\n\n for (let i = 0; i < controllers.length; i++) {\n const controller = controllers[i];\n if (onProgress) {\n onProgress(`Processing controller ${controller.className}`, i + 1, controllers.length);\n }\n \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 \n if (onProgress) {\n onProgress(\"Generating and cleaning schemas\", controllers.length, controllers.length);\n }\n \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 = ctx.checker.typeToString(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 = ctx.checker.typeToString(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","/**\r\n * Progress tracking utilities for the adorn-api CLI.\r\n * Provides structured progress output, timing, and build summaries.\r\n */\r\n\r\nimport process from \"node:process\";\r\n\r\n/**\r\n * Phase definition for progress tracking.\r\n */\r\nexport interface ProgressPhase {\r\n name: string;\r\n startTime: number;\r\n endTime?: number;\r\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Statistics collected during the build.\r\n */\r\nexport interface BuildStatistics {\r\n controllers: number;\r\n operations: number;\r\n schemas: number;\r\n sourceFiles: number;\r\n artifactsWritten: string[];\r\n}\r\n\r\n/**\r\n * Progress tracker for build operations.\r\n */\r\nexport class ProgressTracker {\r\n private phases: Map<string, ProgressPhase> = new Map();\r\n private startTime: number;\r\n private verbose: boolean = false;\r\n private quiet: boolean = false;\r\n private indentLevel: number = 0;\r\n\r\n constructor(options: { verbose?: boolean; quiet?: boolean } = {}) {\r\n this.verbose = options.verbose ?? false;\r\n this.quiet = options.quiet ?? false;\r\n this.startTime = performance.now();\r\n }\r\n\r\n /**\r\n * Start a new phase.\r\n */\r\n startPhase(name: string, message?: string): void {\r\n this.phases.set(name, {\r\n name,\r\n startTime: performance.now(),\r\n status: \"running\",\r\n message,\r\n });\r\n if (!this.quiet) {\r\n this.log(`● ${message || name}`);\r\n }\r\n }\r\n\r\n /**\n * Complete a phase successfully.\n */\n completePhase(name: string, message?: string): void {\n const phase = this.phases.get(name);\n if (phase) {\n phase.endTime = performance.now();\n phase.status = \"completed\";\n phase.message = message;\n }\n if (!this.quiet) {\n const elapsed = phase ? this.formatElapsed(phase.startTime, phase.endTime) : \"\";\n const status = this.verbose \n ? `✓ ${message || name} ${elapsed}`\n : `✓ ${message || name} ${elapsed}`;\n this.log(status);\n }\n }\n\r\n /**\r\n * Mark a phase as failed.\r\n */\r\n failPhase(name: string, message?: string): void {\r\n const phase = this.phases.get(name);\r\n if (phase) {\r\n phase.endTime = performance.now();\r\n phase.status = \"failed\";\r\n phase.message = message;\r\n }\r\n if (!this.quiet) {\r\n this.log(`✗ ${message || name}`);\r\n }\r\n }\r\n\r\n /**\r\n * Log a verbose message.\r\n */\r\n verboseLog(message: string): void {\r\n if (this.verbose && !this.quiet) {\r\n const elapsed = this.formatElapsed(this.startTime);\r\n this.log(`[${elapsed}] ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Log a regular message.\r\n */\r\n log(message: string): void {\r\n const indent = \" \".repeat(this.indentLevel);\r\n process.stdout.write(indent + message + \"\\n\");\r\n }\r\n\r\n /**\r\n * Log a sub-message (indented).\r\n */\r\n logSub(message: string): void {\r\n this.indentLevel++;\r\n this.log(message);\r\n this.indentLevel--;\r\n }\r\n\r\n /**\r\n * Get the total elapsed time in milliseconds.\r\n */\r\n getTotalElapsed(): number {\r\n return performance.now() - this.startTime;\r\n }\r\n\r\n /**\r\n * Format elapsed time as a human-readable string.\r\n */\r\n formatElapsed(startTime?: number, endTime?: number): string {\r\n const elapsed = (endTime ?? performance.now()) - (startTime ?? this.startTime);\r\n if (elapsed < 1) {\r\n return `${(elapsed * 1000).toFixed(0)}ms`;\r\n } else if (elapsed < 1000) {\r\n return `${elapsed.toFixed(0)}ms`;\r\n } else {\r\n return `${(elapsed / 1000).toFixed(2)}s`;\r\n }\r\n }\r\n\r\n /**\r\n * Get all completed phases with their timings.\r\n */\r\n getPhases(): ProgressPhase[] {\r\n return Array.from(this.phases.values());\r\n }\r\n\r\n /**\n * Print a build summary.\n */\n printSummary(stats: BuildStatistics): void {\n if (this.quiet) return;\n\n this.log(\"\");\n this.log(\"Build Summary:\");\n this.log(` Controllers: ${stats.controllers}`);\n this.log(` Operations: ${stats.operations}`);\n this.log(` Schemas: ${stats.schemas}`);\n this.log(` Source files: ${stats.sourceFiles}`);\n this.log(` Output dir: ${stats.artifactsWritten[0]?.split(\"/\").slice(0, -1).join(\"/\") || \".adorn\"}`);\n\n this.log(\"\");\n this.log(\"Timings:\");\n for (const phase of this.phases.values()) {\n if (phase.status === \"completed\" && phase.endTime) {\n const elapsed = phase.endTime - phase.startTime;\n const timeStr = elapsed < 1 \n ? `${(elapsed * 1000).toFixed(0)}ms`\n : elapsed < 1000 \n ? `${elapsed.toFixed(0)}ms`\n : `${(elapsed / 1000).toFixed(2)}s`;\n this.log(` ${phase.name.padEnd(20)} ${timeStr}`);\n }\n }\n this.log(` ${\"─\".repeat(21)}`);\n this.log(` Total time: ${this.formatElapsed()}`);\n this.log(\"\");\n }\n\r\n /**\r\n * Print artifact list.\r\n */\r\n printArtifacts(artifacts: Array<{ name: string; size?: number }>): void {\r\n if (this.quiet) return;\r\n \r\n this.log(\"Written artifacts:\");\r\n for (const artifact of artifacts) {\r\n const sizeStr = artifact.size \r\n ? ` (${artifact.size >= 1024 ? `${(artifact.size / 1024).toFixed(1)} KB` : `${artifact.size} B`})`\r\n : \"\";\r\n this.log(` ├── ${artifact.name}${sizeStr}`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Simple spinner for long-running operations.\r\n */\r\nexport class Spinner {\r\n private frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⢰\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\r\n private interval?: NodeJS.Timeout;\r\n private message: string;\r\n private current: number = 0;\r\n private total: number = 0;\r\n private customStatus?: string;\r\n\r\n constructor(message: string = \"\") {\r\n this.message = message;\r\n }\r\n\r\n /**\n * Start the spinner.\n */\n start(): void {\n let frameIndex = 0;\n this.interval = setInterval(() => {\n const frame = this.frames[frameIndex];\n let output: string;\n if (this.customStatus) {\n output = `\\r${frame} ${this.customStatus}`;\n } else if (this.total > 0) {\n output = `\\r${frame} ${this.message} (${this.current}/${this.total})`;\n } else {\n output = `\\r${frame} ${this.message}`;\n }\n process.stdout.write(output);\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n frameIndex = (frameIndex + 1) % this.frames.length;\n }, 80);\n }\n\r\n /**\r\n * Set progress counters.\r\n */\r\n setProgress(current: number, total: number): void {\r\n this.current = current;\r\n this.total = total;\r\n }\r\n\r\n /**\n * Set a custom status message (overrides counters).\n */\n setStatus(status: string): void {\n this.customStatus = status;\n // Write immediately to ensure update is visible\n const frame = this.frames[this.current];\n process.stdout.write(`\\r${frame} ${status}`);\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n }\n\r\n /**\r\n * Clear the custom status message.\r\n */\r\n clearStatus(): void {\r\n this.customStatus = undefined;\r\n }\r\n\r\n /**\n * Stop the spinner with a completion message.\n */\n stop(completedMessage?: string): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n // Clear the line\n process.stdout.write(\"\\r\" + \" \".repeat(60) + \"\\r\");\n if (completedMessage) {\n process.stdout.write(completedMessage + \"\\n\");\n }\n // Also flush to ensure output is visible\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n }\n\r\n /**\r\n * Stop the spinner with a failure message.\r\n */\r\n fail(failedMessage?: string): void {\r\n this.stop();\r\n if (failedMessage) {\r\n process.stdout.write(`✗ ${failedMessage}\\n`);\r\n }\r\n }\r\n}\r\n","/**\r\n * Smart OpenAPI Schema Partitioner\r\n * Automatically partitions schemas into optimal groups based on heuristics\r\n */\r\nimport type { Graph, NodeId } from \"../graph/types.js\";\r\nimport type { SchemaGraph } from \"../graph/schemaGraph.js\";\r\nimport type { JsonSchema } from \"./types.js\";\r\n\r\n/**\r\n * Partitioning strategy options\r\n */\r\nexport type PartitionStrategy = \r\n | 'auto' // Smart auto-detection (default)\r\n | 'none' // Single file\r\n | 'controller' // Group by controller domain\r\n | 'dependency' // Group by dependency graph\r\n | 'size'; // Group by size threshold\r\n\r\n/**\r\n * Schema complexity metrics\r\n */\r\nexport interface SchemaComplexity {\r\n propertyCount: number;\r\n nestedDepth: number;\r\n refCount: number;\r\n hasUnion: boolean;\r\n hasIntersection: boolean;\r\n hasEnum: boolean;\r\n jsonSize: number;\r\n}\r\n\r\n/**\r\n * A group of schemas for partitioning\r\n */\r\nexport interface SchemaGroup {\r\n name: string;\r\n schemas: Map<string, JsonSchema>;\r\n complexity: number;\r\n dependencies: string[];\r\n}\r\n\r\n/**\r\n * Partitioning result with metadata\r\n */\r\nexport interface PartitioningResult {\r\n shouldSplit: boolean;\r\n strategy: PartitionStrategy;\r\n groups: SchemaGroup[];\r\n recommendation: string;\r\n metrics: {\r\n totalSchemas: number;\r\n averageComplexity: number;\r\n avgDependencyDensity: number;\r\n controllerGroups: number;\r\n };\r\n}\r\n\r\n/**\r\n * Configuration for partitioning\r\n */\r\nexport interface PartitionerConfig {\r\n strategy?: PartitionStrategy;\r\n threshold?: number; // Min schemas to trigger split (default: 50)\r\n maxGroupSize?: number; // Max schemas per group (default: 50)\r\n complexityThreshold?: number; // High complexity threshold\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Default partitioner configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<PartitionerConfig> = {\r\n strategy: 'auto',\r\n threshold: 50,\r\n maxGroupSize: 50,\r\n complexityThreshold: 10,\r\n verbose: false,\r\n};\r\n\r\n/**\r\n * Calculate complexity metrics for a schema\r\n */\r\nexport function calculateSchemaComplexity(schema: JsonSchema): SchemaComplexity {\r\n let propertyCount = 0;\r\n let nestedDepth = 0;\r\n let refCount = 0;\r\n let hasUnion = false;\r\n let hasIntersection = false;\r\n let hasEnum = false;\r\n \r\n const jsonSize = JSON.stringify(schema).length;\r\n \r\n const analyze = (s: JsonSchema, depth: number): void => {\r\n if (!s || typeof s !== 'object') return;\r\n \r\n nestedDepth = Math.max(nestedDepth, depth);\r\n \r\n if (s.type === 'object' && s.properties) {\r\n propertyCount += Object.keys(s.properties).length;\r\n for (const prop of Object.values(s.properties)) {\r\n analyze(prop as JsonSchema, depth + 1);\r\n }\r\n }\r\n \r\n if (s.$ref) refCount++;\r\n \r\n if (s.anyOf || s.oneOf) hasUnion = true;\r\n if (s.allOf) hasIntersection = true;\r\n if (s.enum) hasEnum = true;\r\n \r\n if (s.items) {\r\n analyze(s.items as JsonSchema, depth + 1);\r\n }\r\n };\r\n \r\n analyze(schema, 0);\r\n \r\n // Calculate complexity score\r\n const complexity = \r\n propertyCount * 1 +\r\n nestedDepth * 2 +\r\n refCount * 0.5 +\r\n (hasUnion ? 5 : 0) +\r\n (hasIntersection ? 5 : 0) +\r\n (hasEnum ? 1 : 0);\r\n \r\n return {\r\n propertyCount,\r\n nestedDepth,\r\n refCount,\r\n hasUnion,\r\n hasIntersection,\r\n hasEnum,\r\n jsonSize,\r\n };\r\n}\r\n\r\n/**\r\n * Count external $ref references in a schema\r\n */\r\nfunction countExternalRefs(\r\n schema: JsonSchema,\r\n allSchemas: Map<string, JsonSchema>\r\n): number {\r\n let count = 0;\r\n \r\n const analyze = (s: JsonSchema): void => {\r\n if (!s || typeof s !== 'object') return;\r\n \r\n if (s.$ref && typeof s.$ref === 'string') {\r\n const refName = s.$ref.replace('#/components/schemas/', '');\r\n if (refName && allSchemas.has(refName)) {\r\n count++;\r\n }\r\n }\r\n \r\n if (s.properties) {\r\n for (const prop of Object.values(s.properties)) {\r\n analyze(prop as JsonSchema);\r\n }\r\n }\r\n \r\n if (s.items) analyze(s.items as JsonSchema);\r\n if (s.anyOf) s.anyOf.forEach(analyze);\r\n if (s.oneOf) s.oneOf.forEach(analyze);\r\n if (s.allOf) s.allOf.forEach(analyze);\r\n };\r\n \r\n analyze(schema);\r\n return count;\r\n}\r\n\r\n/**\r\n * Analyze dependency density across all schemas\r\n */\r\nfunction analyzeDependencyDensity(\r\n schemas: Map<string, JsonSchema>\r\n): { avgDeps: number; maxDeps: number } {\r\n let totalDeps = 0;\r\n let maxDeps = 0;\r\n \r\n for (const schema of schemas.values()) {\r\n const deps = countExternalRefs(schema, schemas);\r\n totalDeps += deps;\r\n maxDeps = Math.max(maxDeps, deps);\r\n }\r\n \r\n return {\r\n avgDeps: schemas.size > 0 ? totalDeps / schemas.size : 0,\r\n maxDeps,\r\n };\r\n}\r\n\r\n/**\r\n * Partition schemas by controller domain\r\n */\r\nfunction partitionByController(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n const sharedSchemas: Map<string, JsonSchema> = new Map();\r\n \r\n // Default group for schemas not owned by any controller\r\n groups.set('_shared', sharedSchemas);\r\n \r\n // Analyze schema ownership by tracking usage in operations\r\n const schemaUsage: Map<string, Set<string>> = new Map();\r\n \r\n for (const [nodeId, node] of graph.nodes.entries()) {\r\n if (node.kind === 'Operation') {\r\n const opNode = node as any;\r\n const returnType = opNode.operation?.returnType;\r\n \r\n if (returnType && schemas.has(returnType)) {\r\n if (!schemaUsage.has(returnType)) {\r\n schemaUsage.set(returnType, new Set());\r\n }\r\n schemaUsage.get(returnType)!.add(node.metadata.name);\r\n }\r\n }\r\n }\r\n \r\n // Group schemas by primary controller usage\r\n for (const [schemaName, schema] of schemas.entries()) {\r\n const usage = schemaUsage.get(schemaName);\r\n \r\n if (!usage || usage.size === 0) {\r\n // No usage info, put in shared\r\n sharedSchemas.set(schemaName, schema);\r\n } else if (usage.size === 1) {\r\n // Used by exactly one controller, group by that controller\r\n const controllerName = Array.from(usage)[0].split(':')[0] || 'default';\r\n const groupName = controllerName.toLowerCase();\r\n \r\n if (!groups.has(groupName)) {\r\n groups.set(groupName, new Map());\r\n }\r\n groups.get(groupName)!.set(schemaName, schema);\r\n } else {\r\n // Used by multiple controllers, put in shared\r\n sharedSchemas.set(schemaName, schema);\r\n }\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n \r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Partition schemas by dependency graph\r\n */\r\nfunction partitionByDependency(\r\n schemas: Map<string, JsonSchema>,\r\n schemaGraph: SchemaGraph,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n \r\n // Find strongly connected components (circular dependencies)\r\n const sccs = schemaGraph.findStronglyConnectedComponents();\r\n \r\n // Group SCCs together, then add dependent nodes\r\n const processed = new Set<string>();\r\n \r\n for (const scc of sccs) {\r\n if (scc.length === 1 && processed.has(scc[0])) continue;\r\n \r\n const groupSchemas: Map<string, JsonSchema> = new Map();\r\n const groupName = `dependent-${groups.size + 1}`;\r\n \r\n for (const nodeId of scc) {\r\n const node = schemaGraph.getGraph().nodes.get(nodeId);\r\n if (node && node.kind === 'TypeDefinition') {\r\n const schemaName = node.metadata.name;\r\n if (schemas.has(schemaName)) {\r\n groupSchemas.set(schemaName, schemas.get(schemaName)!);\r\n processed.add(nodeId);\r\n }\r\n }\r\n }\r\n \r\n if (groupSchemas.size > 0) {\r\n groups.set(groupName, groupSchemas);\r\n }\r\n }\r\n \r\n // Handle remaining unprocessed schemas\r\n for (const [nodeId, node] of schemaGraph.getGraph().nodes.entries()) {\r\n if (processed.has(nodeId)) continue;\r\n if (node.kind !== 'TypeDefinition') continue;\r\n \r\n const schemaName = node.metadata.name;\r\n if (!schemas.has(schemaName)) continue;\r\n \r\n const groupSchemas: Map<string, JsonSchema> = new Map();\r\n groupSchemas.set(schemaName, schemas.get(schemaName)!);\r\n \r\n groups.set(`standalone-${groups.size + 1}`, groupSchemas);\r\n processed.add(nodeId);\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Partition schemas by size threshold\r\n */\r\nfunction partitionBySize(\r\n schemas: Map<string, JsonSchema>,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const sortedSchemas = Array.from(schemas.entries()).sort((a, b) => {\r\n const complexityA = calculateSchemaComplexity(a[1]).propertyCount;\r\n const complexityB = calculateSchemaComplexity(b[1]).propertyCount;\r\n return complexityB - complexityA; // Sort by complexity descending\r\n });\r\n \r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n let currentGroup: Map<string, JsonSchema> = new Map();\r\n let currentCount = 0;\r\n let groupIndex = 1;\r\n \r\n for (const [schemaName, schema] of sortedSchemas) {\r\n if (currentCount >= config.maxGroupSize) {\r\n groups.set(`group-${groupIndex}`, currentGroup);\r\n currentGroup = new Map();\r\n currentCount = 0;\r\n groupIndex++;\r\n }\r\n \r\n currentGroup.set(schemaName, schema);\r\n currentCount++;\r\n }\r\n \r\n // Add remaining schemas\r\n if (currentCount > 0) {\r\n groups.set(`group-${groupIndex}`, currentGroup);\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Determine best strategy using smart heuristics\r\n */\r\nfunction determineBestStrategy(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph,\r\n config: Required<PartitionerConfig>\r\n): PartitionStrategy {\r\n const schemaCount = schemas.size;\r\n const { avgDeps } = analyzeDependencyDensity(schemas);\r\n \r\n // Count controller groups\r\n let controllerGroups = 0;\r\n for (const node of graph.nodes.values()) {\r\n if (node.kind === 'Controller') {\r\n controllerGroups++;\r\n }\r\n }\r\n \r\n // Heuristic decision tree\r\n if (schemaCount < config.threshold) {\r\n return 'none';\r\n }\r\n \r\n if (avgDeps > 3) {\r\n // High inter-dependency → dependency-based\r\n return 'dependency';\r\n }\r\n \r\n if (controllerGroups > 1 && avgDeps < 2) {\r\n // Clear controller ownership with low coupling → controller-based\r\n return 'controller';\r\n }\r\n \r\n // Default to size-based\r\n return 'size';\r\n}\r\n\r\n/**\r\n * Main partitioning function with smart auto-detection\r\n */\r\nexport function partitionSchemas(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph,\r\n config: PartitionerConfig = {}\r\n): PartitioningResult {\r\n const finalConfig = { ...DEFAULT_CONFIG, ...config };\r\n const schemaCount = schemas.size;\r\n \r\n // Calculate metrics\r\n let totalComplexity = 0;\r\n let totalSchemas = 0;\r\n const { avgDeps } = analyzeDependencyDensity(schemas);\r\n \r\n let controllerGroups = 0;\r\n for (const node of graph.nodes.values()) {\r\n if (node.kind === 'Controller') {\r\n controllerGroups++;\r\n }\r\n }\r\n \r\n for (const schema of schemas.values()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n totalSchemas++;\r\n }\r\n \r\n const avgComplexity = totalSchemas > 0 ? totalComplexity / totalSchemas : 0;\r\n \r\n // Determine strategy\r\n let strategy = finalConfig.strategy;\r\n let recommendation = '';\r\n \r\n if (strategy === 'auto') {\r\n strategy = determineBestStrategy(schemas, graph, schemaGraph, finalConfig);\r\n \r\n // Generate recommendation message\r\n if (schemaCount < finalConfig.threshold) {\r\n recommendation = `Schema count (${schemaCount}) below threshold (${finalConfig.threshold}), single file optimal`;\r\n } else if (strategy === 'dependency') {\r\n recommendation = `High dependency density (${avgDeps.toFixed(2)} avg refs/schema), using dependency-based partitioning`;\r\n } else if (strategy === 'controller') {\r\n recommendation = `Found ${controllerGroups} controller groups with low coupling, using controller-based partitioning`;\r\n } else {\r\n recommendation = `Using size-based partitioning with max ${finalConfig.maxGroupSize} schemas per group`;\r\n }\r\n }\r\n \r\n // Perform partitioning based on strategy\r\n let groups: SchemaGroup[] = [];\r\n \r\n if (strategy === 'none') {\r\n groups = [{\r\n name: 'all',\r\n schemas: new Map(schemas),\r\n complexity: totalComplexity,\r\n dependencies: [],\r\n }];\r\n recommendation = recommendation || 'Single file mode (--no-split)';\r\n } else if (strategy === 'controller') {\r\n groups = partitionByController(schemas, graph, finalConfig);\r\n } else if (strategy === 'dependency') {\r\n groups = partitionByDependency(schemas, schemaGraph, finalConfig);\r\n } else {\r\n groups = partitionBySize(schemas, finalConfig);\r\n }\r\n \r\n // Determine if we should actually split\r\n const shouldSplit = strategy !== 'none' && schemaCount >= finalConfig.threshold;\r\n \r\n return {\r\n shouldSplit,\r\n strategy,\r\n groups,\r\n recommendation,\r\n metrics: {\r\n totalSchemas: schemaCount,\r\n averageComplexity: avgComplexity,\r\n avgDependencyDensity: avgDeps,\r\n controllerGroups,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Export partitioner class for advanced use cases\r\n */\r\nexport class SchemaPartitioner {\r\n private config: Required<PartitionerConfig>;\r\n \r\n constructor(config: PartitionerConfig = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n \r\n /**\r\n * Partition schemas with the configured strategy\r\n */\r\n partition(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph\r\n ): PartitioningResult {\r\n return partitionSchemas(schemas, graph, schemaGraph, this.config);\r\n }\r\n \r\n /**\r\n * Set the partitioning strategy\r\n */\r\n setStrategy(strategy: PartitionStrategy): void {\r\n this.config.strategy = strategy;\r\n }\r\n \r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Readonly<Required<PartitionerConfig>> {\r\n return this.config;\r\n }\r\n}\r\n","/**\r\n * Modular OpenAPI Generator\r\n * Generates split OpenAPI files with $ref pointers to external schema files\r\n */\r\nimport { writeFileSync, mkdirSync, existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve, dirname } from \"node:path\";\r\nimport type { JsonSchema } from \"./types.js\";\r\nimport type { OpenAPI31 } from \"./openapi.js\";\r\nimport type { PartitioningResult, SchemaGroup } from \"./partitioner.js\";\r\n\r\n/**\n * Progress callback for modular OpenAPI generation\n */\nexport interface ModularProgressCallback {\n (step: string, index: number, total: number): void;\n}\n\n/**\n * Configuration for modular OpenAPI generation\n */\nexport interface SplitOpenAPIConfig {\n outputDir: string;\n schemasDir?: string; // Relative to outputDir (default: \"schemas\")\n createIndexFile?: boolean; // Create index.json with all refs (default: true)\n prettyPrint?: boolean; // Pretty print JSON (default: true)\n onProgress?: ModularProgressCallback; // Progress callback\n}\n\r\n/**\r\n * Result of modular OpenAPI generation\r\n */\r\nexport interface SplitOpenAPIResult {\r\n mainSpec: string; // Path to main openapi.json\r\n schemaFiles: string[]; // Paths to generated schema files\r\n indexFile?: string; // Path to index file (if created)\r\n totalSize: number; // Total bytes written\r\n splitEnabled: boolean; // Whether splitting was applied\r\n}\r\n\r\n/**\r\n * Sanitize schema name for use in filename\r\n */\r\nfunction sanitizeFilename(name: string): string {\r\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\r\n}\r\n\r\n/**\r\n * Generate a schema file name from group name\r\n */\r\nfunction getSchemaFilename(group: SchemaGroup): string {\r\n const name = sanitizeFilename(group.name);\r\n return `schemas/${name}.json`;\r\n}\r\n\r\n/**\r\n * Collect all schemas from groups into a single map\r\n */\r\nfunction collectAllSchemas(groups: SchemaGroup[]): Map<string, { schema: JsonSchema; group: string }> {\r\n const result = new Map<string, { schema: JsonSchema; group: string }>();\r\n \r\n for (const group of groups) {\r\n for (const [schemaName, schema] of group.schemas.entries()) {\r\n result.set(schemaName, { schema, group: group.name });\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Convert $ref from inline to external reference\r\n */\r\nfunction convertToExternalRef(\r\n schema: JsonSchema,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): JsonSchema {\r\n if (!schema || typeof schema !== 'object') return schema;\r\n \r\n const result: Record<string, unknown> = { ...schema };\r\n \r\n // Convert $ref to external reference\r\n if (schema.$ref && typeof schema.$ref === 'string') {\r\n const refName = schema.$ref.replace('#/components/schemas/', '');\r\n if (refName && schemaMap.has(refName)) {\r\n const target = schemaMap.get(refName)!;\r\n const filename = sanitizeFilename(target.group);\r\n result.$ref = `schemas/${filename}.json#/components/schemas/${refName}`;\r\n }\r\n }\r\n \r\n // Recursively process nested schemas\r\n const nestedProps = ['properties', 'items', 'additionalProperties'];\r\n for (const prop of nestedProps) {\r\n if (prop in result) {\r\n const value = result[prop];\r\n if (Array.isArray(value)) {\r\n result[prop] = value.map(item => \r\n typeof item === 'object' ? convertToExternalRef(item as JsonSchema, schemaMap) : item\r\n );\r\n } else if (typeof value === 'object' && value !== null) {\r\n result[prop] = convertToExternalRef(value as JsonSchema, schemaMap);\r\n }\r\n }\r\n }\r\n \r\n // Process schema arrays (anyOf, oneOf, allOf)\r\n const arrayProps = ['anyOf', 'oneOf', 'allOf'];\r\n for (const prop of arrayProps) {\r\n if (prop in result && Array.isArray(result[prop])) {\r\n result[prop] = (result[prop] as unknown[]).map(item =>\r\n typeof item === 'object' ? convertToExternalRef(item as JsonSchema, schemaMap) : item\r\n );\r\n }\r\n }\r\n \r\n return result as JsonSchema;\r\n}\r\n\r\n/**\r\n * Generate individual schema file content\r\n */\r\nfunction generateSchemaFileContent(\r\n group: SchemaGroup,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): Record<string, JsonSchema> {\r\n const content: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName, schema] of group.schemas.entries()) {\r\n content[schemaName] = convertToExternalRef(schema, schemaMap);\r\n }\r\n \r\n return content;\r\n}\r\n\r\n/**\r\n * Generate schema index file with all $ref mappings\r\n */\r\nfunction generateSchemaIndex(\r\n groups: SchemaGroup[],\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): Record<string, Record<string, { $ref: string }>> {\r\n const index: Record<string, Record<string, { $ref: string }>> = {\r\n schemas: {},\r\n };\r\n \r\n for (const [schemaName, { group }] of schemaMap.entries()) {\r\n const filename = sanitizeFilename(group);\r\n index.schemas![schemaName] = {\r\n $ref: `schemas/${filename}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n return index;\r\n}\r\n\r\n/**\n * Generate modular OpenAPI specification with split schema files\n */\nexport function generateModularOpenAPI(\n openapi: OpenAPI31,\n partitioning: PartitioningResult,\n config: SplitOpenAPIConfig\n): SplitOpenAPIResult {\n const {\n outputDir,\n schemasDir = \"schemas\",\n createIndexFile = true,\n prettyPrint = true,\n onProgress,\n } = config;\n \n const indent = prettyPrint ? 2 : 0;\n let totalSize = 0;\n const schemaFiles: string[] = [];\n \n // Ensure output directory exists\n mkdirSync(outputDir, { recursive: true });\n \n // If not splitting, just write the main file\n if (!partitioning.shouldSplit || partitioning.groups.length === 1) {\n if (onProgress) {\n onProgress(\"Writing single OpenAPI file\", 1, 1);\n }\n const mainPath = resolve(outputDir, \"openapi.json\");\n writeFileSync(mainPath, JSON.stringify(openapi, null, indent));\n totalSize = Buffer.byteLength(JSON.stringify(openapi));\n \n return {\n mainSpec: mainPath,\n schemaFiles: [],\n totalSize,\n splitEnabled: false,\n };\n }\n \n // Create schemas directory\n const schemasPath = resolve(outputDir, schemasDir);\n mkdirSync(schemasPath, { recursive: true });\n \n if (onProgress) {\n onProgress(\"Creating schemas directory\", 0, partitioning.groups.length + 2);\n }\n \n // Collect all schemas with their groups\n const schemaMap = collectAllSchemas(partitioning.groups);\n \n // Generate individual schema files\n const schemaToFile: Map<string, string> = new Map();\n \n for (let i = 0; i < partitioning.groups.length; i++) {\n const group = partitioning.groups[i];\n if (onProgress) {\n onProgress(`Writing schema group ${group.name} (${group.schemas.size} schemas)`, i + 1, partitioning.groups.length + 2);\n }\n const filename = getSchemaFilename(group);\r\n const filePath = resolve(outputDir, filename);\r\n \r\n const content = generateSchemaFileContent(group, schemaMap);\r\n writeFileSync(filePath, JSON.stringify(content, null, indent));\r\n \r\n for (const schemaName of group.schemas.keys()) {\r\n schemaToFile.set(schemaName, filename);\r\n }\r\n \r\n schemaFiles.push(filePath);\r\n totalSize += Buffer.byteLength(JSON.stringify(content));\r\n }\r\n \r\n // Generate index file if requested\n let indexFile: string | undefined;\n if (createIndexFile) {\n if (onProgress) {\n onProgress(\"Generating index file\", partitioning.groups.length + 1, partitioning.groups.length + 2);\n }\n const indexPath = resolve(outputDir, \"schemas/index.json\");\n const indexContent = generateSchemaIndex(partitioning.groups, schemaMap);\n writeFileSync(indexPath, JSON.stringify(indexContent, null, indent));\n totalSize += Buffer.byteLength(JSON.stringify(indexContent));\n indexFile = indexPath;\n }\n \n // Generate main openapi.json with $ref pointers\n if (onProgress) {\n onProgress(\"Generating main OpenAPI spec\", partitioning.groups.length + 2, partitioning.groups.length + 2);\n }\n const mainSpec = generateMainSpec(openapi, schemaMap, schemaToFile);\n const mainPath = resolve(outputDir, \"openapi.json\");\n writeFileSync(mainPath, JSON.stringify(mainSpec, null, indent));\n totalSize += Buffer.byteLength(JSON.stringify(mainSpec));\n \r\n return {\r\n mainSpec: mainPath,\r\n schemaFiles,\r\n indexFile,\r\n totalSize,\r\n splitEnabled: true,\r\n };\r\n}\r\n\r\n/**\r\n * Extended OpenAPI type with x-* properties for split mode\r\n */\r\ninterface ExtendedOpenAPI31 extends OpenAPI31 {\r\n 'x-original-schemas'?: number;\r\n 'x-split-enabled'?: boolean;\r\n 'x-schema-files'?: string[];\r\n}\r\n\r\n/**\r\n * Generate main OpenAPI spec with external $ref pointers\r\n */\r\nfunction generateMainSpec(\r\n original: OpenAPI31,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>,\r\n schemaToFile: Map<string, string>\r\n): ExtendedOpenAPI31 {\r\n // Build components.schemas with $ref pointers\r\n const schemas: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName, { group }] of schemaMap.entries()) {\r\n const filename = sanitizeFilename(group);\r\n schemas[schemaName] = {\r\n $ref: `schemas/${filename}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n // Create new OpenAPI spec with split schemas\r\n return {\r\n ...original,\r\n components: {\r\n ...original.components,\r\n schemas,\r\n },\r\n 'x-original-schemas': Object.keys(schemaMap).length,\r\n 'x-split-enabled': true,\r\n 'x-schema-files': Array.from(new Set(schemaToFile.values())),\r\n };\r\n}\r\n\r\n/**\r\n * Generate a lightweight OpenAPI spec that references external files\r\n * This is useful for Swagger UI lazy loading\r\n */\r\nexport function generateLazyOpenAPI(\r\n openapi: OpenAPI31,\r\n partitioning: PartitioningResult\r\n): OpenAPI31 {\r\n if (!partitioning.shouldSplit || partitioning.groups.length === 1) {\r\n return openapi;\r\n }\r\n \r\n const schemaMap = collectAllSchemas(partitioning.groups);\r\n \r\n // Only include minimal info in main spec\r\n const minimalSchemas: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName] of schemaMap.entries()) {\r\n minimalSchemas[schemaName] = {\r\n $ref: `schemas/${schemaName.toLowerCase()}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n return {\r\n ...openapi,\r\n components: {\r\n ...openapi.components,\r\n schemas: minimalSchemas,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Get the file path for a schema group\r\n */\r\nexport function getSchemaFilePath(\r\n groupName: string,\r\n outputDir: string,\r\n schemasDir: string = \"schemas\"\r\n): string {\r\n const filename = sanitizeFilename(groupName);\r\n return resolve(outputDir, schemasDir, `${filename}.json`);\r\n}\r\n\r\n/**\r\n * Check if a schema exists in a specific file\r\n */\r\nexport function schemaExistsInFile(\r\n schemaName: string,\r\n outputDir: string,\r\n groupName: string\r\n): boolean {\r\n const filePath = getSchemaFilePath(groupName, outputDir);\r\n \r\n if (!existsSync(filePath)) {\r\n return false;\r\n }\r\n \r\n try {\r\n const content = JSON.parse(readFileSync(filePath, 'utf-8'));\r\n return schemaName in content;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","/**\n * Graph-Based Intermediate Representation (GBIR) type definitions.\n * Provides the core data structures for the graph-based compiler architecture.\n */\n\n/**\n * Unique identifier for a node in the graph\n */\nexport type NodeId = string;\n\n/**\n * All possible node kinds in the compiler graph\n */\nexport type NodeKind =\n | 'TypeDefinition'\n | 'Controller'\n | 'Operation'\n | 'Parameter'\n | 'SchemaComponent'\n | 'Validator'\n | 'Interface'\n | 'Enum'\n | 'Union'\n | 'Intersection';\n\n/**\n * Relationship types between graph nodes\n */\nexport type EdgeRelation =\n | 'uses' // Type usage relationship\n | 'extends' // Inheritance/extension\n | 'implements' // Interface implementation\n | 'validates' // Schema validation\n | 'references' // Cross-reference\n | 'dependsOn' // Dependency\n | 'generates' // Output generation\n | 'annotates' // Decorator/annotation\n | 'contains'; // Containment (parent-child)\n\n/**\n * Edge in the graph with metadata\n */\nexport interface GraphEdge {\n targetId: NodeId;\n relation: EdgeRelation;\n properties?: Record<string, unknown>;\n weight?: number;\n}\n\n/**\n * Source location for debugging and error reporting\n */\nexport interface SourceLocation {\n filePath: string;\n line: number;\n column: number;\n}\n\n/**\n * Node metadata shared across all node types\n */\nexport interface NodeMetadata {\n name: string;\n sourceLocation: SourceLocation;\n tags?: Set<string>;\n annotations?: Map<string, unknown>;\n}\n\n/**\n * Base interface for all graph nodes\n */\nexport interface GraphNode {\n id: NodeId;\n kind: NodeKind;\n metadata: NodeMetadata;\n edges: GraphEdge[];\n}\n\n/**\n * Type definition node (class, interface, type alias)\n */\nexport interface TypeDefinitionNode extends GraphNode {\n kind: 'TypeDefinition';\n typeDef: {\n isGeneric: boolean;\n typeParameters?: string[];\n properties?: Map<string, NodeId>;\n };\n}\n\n/**\n * Controller node representing a controller class\n */\nexport interface ControllerNode extends GraphNode {\n kind: 'Controller';\n controller: {\n basePath: string;\n consumes?: string[];\n produces?: string[];\n };\n}\n\n/**\n * Operation node representing an HTTP endpoint\n */\nexport interface OperationNode extends GraphNode {\n kind: 'Operation';\n operation: {\n httpMethod: string;\n path: string;\n operationId: string;\n returnType: NodeId;\n };\n}\n\n/**\n * Parameter node for operation parameters\n */\nexport interface ParameterNode extends GraphNode {\n kind: 'Parameter';\n parameter: {\n index: number;\n location: 'path' | 'query' | 'body' | 'header' | 'cookie';\n type: NodeId;\n isOptional: boolean;\n };\n}\n\n/**\n * Schema component node (for OpenAPI/JSON Schema components)\n */\nexport interface SchemaComponentNode extends GraphNode {\n kind: 'SchemaComponent';\n schema: {\n schemaType: 'object' | 'array' | 'primitive' | 'enum' | 'union' | 'intersection';\n definition: unknown; // JsonSchema\n isExternal: boolean;\n };\n}\n\n/**\n * Validator node for runtime validation\n */\nexport interface ValidatorNode extends GraphNode {\n kind: 'Validator';\n validator: {\n schemaRef: NodeId;\n mode: 'ajv-runtime' | 'precompiled';\n };\n}\n\n/**\n * Interface definition node\n */\nexport interface InterfaceNode extends GraphNode {\n kind: 'Interface';\n interfaceDef: {\n methods?: Map<string, NodeId>;\n };\n}\n\n/**\n * Enum definition node\n */\nexport interface EnumNode extends GraphNode {\n kind: 'Enum';\n enumDef: {\n values: string[];\n };\n}\n\n/**\n * Union type node\n */\nexport interface UnionNode extends GraphNode {\n kind: 'Union';\n union: {\n types: NodeId[];\n };\n}\n\n/**\n * Intersection type node\n */\nexport interface IntersectionNode extends GraphNode {\n kind: 'Intersection';\n intersection: {\n types: NodeId[];\n };\n}\n\n/**\n * Union type for all possible graph nodes\n */\nexport type AnyNode =\n | TypeDefinitionNode\n | ControllerNode\n | OperationNode\n | ParameterNode\n | SchemaComponentNode\n | ValidatorNode\n | InterfaceNode\n | EnumNode\n | UnionNode\n | IntersectionNode;\n\n/**\n * The main graph structure containing nodes and relationships\n */\nexport interface Graph {\n nodes: Map<NodeId, AnyNode>;\n roots: Set<NodeId>;\n version: string;\n metadata: {\n createdAt: string;\n generatedBy: string;\n tsVersion?: string;\n };\n}\n\n/**\n * Create a new empty graph\n */\nexport function createGraph(tsVersion?: string): Graph {\n return {\n nodes: new Map(),\n roots: new Set(),\n version: '1.0.0',\n metadata: {\n createdAt: new Date().toISOString(),\n generatedBy: 'adorn-api-gems',\n tsVersion,\n },\n };\n}\n\n/**\n * Generate a unique node ID\n */\nexport function generateNodeId(kind: NodeKind, name: string): NodeId {\n return `${kind}:${name}:${Date.now()}:${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Add a node to the graph\n */\nexport function addNode(graph: Graph, node: AnyNode): void {\n graph.nodes.set(node.id, node);\n}\n\n/**\n * Remove a node from the graph\n */\nexport function removeNode(graph: Graph, nodeId: NodeId): void {\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n graph.nodes.delete(nodeId);\n graph.roots.delete(nodeId);\n\n for (const [id, otherNode] of graph.nodes.entries()) {\n otherNode.edges = otherNode.edges.filter(edge => edge.targetId !== nodeId);\n }\n}\n\n/**\n * Add an edge between two nodes\n */\nexport function addEdge(\n graph: Graph,\n sourceId: NodeId,\n targetId: NodeId,\n relation: EdgeRelation,\n properties?: Record<string, unknown>\n): void {\n const sourceNode = graph.nodes.get(sourceId);\n if (!sourceNode) {\n throw new Error(`Source node ${sourceId} not found`);\n }\n\n const targetExists = graph.nodes.has(targetId);\n if (!targetExists) {\n throw new Error(`Target node ${targetId} not found`);\n }\n\n sourceNode.edges.push({\n targetId,\n relation,\n properties,\n });\n}\n\n/**\n * Get all nodes of a specific kind\n */\nexport function getNodesByKind<T extends AnyNode>(\n graph: Graph,\n kind: T['kind']\n): T[] {\n return Array.from(graph.nodes.values())\n .filter(node => node.kind === kind) as T[];\n}\n\n/**\n * Get all edges of a specific relation type\n */\nexport function getEdgesByRelation(\n graph: Graph,\n relation: EdgeRelation\n): { sourceId: NodeId; edge: GraphEdge }[] {\n const edges: { sourceId: NodeId; edge: GraphEdge }[] = [];\n\n for (const [id, node] of graph.nodes.entries()) {\n for (const edge of node.edges) {\n if (edge.relation === relation) {\n edges.push({ sourceId: id, edge });\n }\n }\n }\n\n return edges;\n}\n","/**\n * Graph builder that converts CST/AST to graph-based IR.\n * Creates typed nodes and establishes relationships between them.\n */\nimport ts from \"typescript\";\nimport type { \n Graph, \n AnyNode, \n ControllerNode, \n OperationNode, \n ParameterNode, \n TypeDefinitionNode,\n NodeKind \n} from \"./types.js\";\nimport {\n createGraph,\n generateNodeId,\n addNode,\n addEdge,\n getNodesByKind\n} from \"./types.js\";\n\n/**\n * Builder context for constructing the graph\n */\nexport interface GraphBuilderContext {\n graph: Graph;\n checker: ts.TypeChecker;\n sourceFiles: ts.SourceFile[];\n nodeMap: Map<ts.Node, string>; // Maps AST nodes to graph node IDs\n}\n\n/**\n * Create a new graph builder context\n */\nexport function createGraphBuilderContext(\n checker: ts.TypeChecker,\n sourceFiles: ts.SourceFile[],\n tsVersion?: string\n): GraphBuilderContext {\n return {\n graph: createGraph(tsVersion),\n checker,\n sourceFiles,\n nodeMap: new Map(),\n };\n}\n\n/**\n * Build the graph from source files\n */\nexport function buildGraph(context: GraphBuilderContext): Graph {\n for (const sourceFile of context.sourceFiles) {\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n if (isControllerClass(node)) {\n buildControllerNode(node, context);\n } else {\n buildTypeDefinitionNode(node, context);\n }\n } else if (ts.isInterfaceDeclaration(node) && node.name) {\n buildInterfaceNode(node, context);\n } else if (ts.isTypeAliasDeclaration(node) && node.name) {\n buildTypeAliasNode(node, context);\n } else if (ts.isEnumDeclaration(node) && node.name) {\n buildEnumNode(node, context);\n }\n });\n }\n\n return context.graph;\n}\n\n/**\n * Check if a class is decorated with @Controller\n */\nfunction isControllerClass(node: ts.ClassDeclaration): boolean {\n const decorators = ts.getDecorators(node);\n if (!decorators) return false;\n\n return decorators.some(decorator => {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n return ts.isIdentifier(expr) && expr.text === \"Controller\";\n }\n return false;\n });\n}\n\n/**\n * Build a controller node from a class declaration\n */\nfunction buildControllerNode(\n node: ts.ClassDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const controllerId = generateNodeId('Controller', node.name.text);\n\n const controllerNode: ControllerNode = {\n id: controllerId,\n kind: 'Controller',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['controller']),\n },\n edges: [],\n controller: {\n basePath: extractControllerPath(node) || '/',\n consumes: extractClassConsumes(node),\n produces: extractClassProduces(node),\n },\n };\n\n addNode(context.graph, controllerNode);\n context.nodeMap.set(node, controllerId);\n context.graph.roots.add(controllerId);\n\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.name) {\n const operationId = buildOperationNode(member, controllerId, context);\n if (operationId) {\n addEdge(context.graph, controllerId, operationId, 'contains');\n }\n }\n }\n}\n\n/**\n * Build an operation node from a method declaration\n */\nfunction buildOperationNode(\n node: ts.MethodDeclaration,\n controllerId: string,\n context: GraphBuilderContext\n): string | 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 const decorators = ts.getDecorators(node);\n if (decorators) {\n for (const decorator of decorators) {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n if (ts.isIdentifier(expr) && httpMethods.includes(expr.text)) {\n httpMethod = expr.text.toUpperCase();\n path = extractDecoratorStringArg(decorator) || '/';\n break;\n }\n }\n }\n }\n\n if (!httpMethod) return null;\n\n const signature = context.checker.getSignatureFromDeclaration(node);\n if (!signature) return null;\n\n const operationId = generateNodeId('Operation', methodName);\n\n const operationNode: OperationNode = {\n id: operationId,\n kind: 'Operation',\n metadata: {\n name: methodName,\n sourceLocation: getLocation(node, context),\n tags: new Set(['operation']),\n },\n edges: [],\n operation: {\n httpMethod,\n path,\n operationId: `${methodName}_${httpMethod.toLowerCase()}`,\n returnType: '', // Will be filled in type resolution\n },\n };\n\n addNode(context.graph, operationNode);\n context.nodeMap.set(node, operationId);\n\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 : `param${i}`;\n const paramId = buildParameterNode(param, i, paramName, context);\n \n if (paramId) {\n addEdge(context.graph, operationId, paramId, 'contains');\n }\n }\n\n return operationId;\n}\n\n/**\n * Build a parameter node from a parameter declaration\n */\nfunction buildParameterNode(\n node: ts.ParameterDeclaration,\n index: number,\n name: string,\n context: GraphBuilderContext\n): string | null {\n const paramId = generateNodeId('Parameter', name);\n \n const paramNode: ParameterNode = {\n id: paramId,\n kind: 'Parameter',\n metadata: {\n name,\n sourceLocation: getLocation(node, context),\n },\n edges: [],\n parameter: {\n index,\n location: 'path',\n type: '', // Will be filled in type resolution\n isOptional: !!node.questionToken || !!node.initializer,\n },\n };\n\n addNode(context.graph, paramNode);\n context.nodeMap.set(node, paramId);\n\n // Add edge to type definition (will be resolved later)\n const typeId = generateNodeId('TypeDefinition', 'unknown');\n addEdge(context.graph, paramId, typeId, 'uses');\n\n return paramId;\n}\n\n/**\n * Build a type definition node from a class declaration\n */\nfunction buildTypeDefinitionNode(\n node: ts.ClassDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'class']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n typeParameters: node.typeParameters?.map(tp => \n ts.isIdentifier(tp.name) ? tp.name.text : 'T'\n ),\n properties: new Map(),\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build an interface node\n */\nfunction buildInterfaceNode(\n node: ts.InterfaceDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('Interface', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'interface']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n typeParameters: node.typeParameters?.map(tp => \n ts.isIdentifier(tp.name) ? tp.name.text : 'T'\n ),\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build a type alias node\n */\nfunction buildTypeAliasNode(\n node: ts.TypeAliasDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'alias']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build an enum node\n */\nfunction buildEnumNode(\n node: ts.EnumDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'enum']),\n },\n edges: [],\n typeDef: {\n isGeneric: false,\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Get source location from a node\n */\nfunction getLocation(\n node: ts.Node,\n context: GraphBuilderContext\n): { filePath: string; line: number; column: number } {\n const sourceFile = node.getSourceFile();\n const pos = node.getStart();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n \n return {\n filePath: sourceFile.fileName,\n line: line + 1,\n column: character + 1,\n };\n}\n\n/**\n * Extract controller base path from decorator\n */\nfunction extractControllerPath(node: ts.ClassDeclaration): string | 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 === \"Controller\") {\n return extractDecoratorStringArg(decorator);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract string argument from decorator\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 * Extract @Consumes decorator content types\n */\nfunction extractClassConsumes(node: ts.ClassDeclaration): string[] | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\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 === \"Consumes\") {\n const arg = decorator.expression.arguments[0];\n if (ts.isStringLiteral(arg)) {\n return [arg.text];\n }\n if (ts.isArrayLiteralExpression(arg)) {\n return arg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract @Produces decorator content types\n */\nfunction extractClassProduces(node: ts.ClassDeclaration): string[] | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\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 === \"Produces\") {\n const arg = decorator.expression.arguments[0];\n if (ts.isStringLiteral(arg)) {\n return [arg.text];\n }\n if (ts.isArrayLiteralExpression(arg)) {\n return arg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n }\n }\n }\n\n return undefined;\n}\n","/**\n * Schema graph operations for advanced schema management.\n * Provides graph algorithms for schema optimization and analysis.\n */\nimport type { Graph, NodeId, EdgeRelation } from \"./types.js\";\nimport { addEdge, getEdgesByRelation } from \"./types.js\";\n\n/**\n * Schema-specific graph with advanced operations\n */\nexport class SchemaGraph {\n private graph: Graph;\n private adjacency: Map<NodeId, Set<NodeId>> = new Map();\n private reverseAdjacency: Map<NodeId, Set<NodeId>> = new Map();\n\n constructor(graph: Graph) {\n this.graph = graph;\n this.buildAdjacencyLists();\n }\n\n /**\n * Build adjacency lists for faster traversal\n */\n private buildAdjacencyLists(): void {\n for (const [id, node] of this.graph.nodes.entries()) {\n this.adjacency.set(id, new Set());\n this.reverseAdjacency.set(id, new Set());\n }\n\n for (const [sourceId, node] of this.graph.nodes.entries()) {\n for (const edge of node.edges) {\n this.adjacency.get(sourceId)?.add(edge.targetId);\n this.reverseAdjacency.get(edge.targetId)?.add(sourceId);\n }\n }\n }\n\n /**\n * Find all nodes that use a given type\n */\n findTypeUsages(typeId: NodeId): NodeId[] {\n const usages: NodeId[] = [];\n const usesEdges = getEdgesByRelation(this.graph, 'uses');\n\n for (const { sourceId, edge } of usesEdges) {\n if (edge.targetId === typeId) {\n usages.push(sourceId);\n }\n }\n\n return usages;\n }\n\n /**\n * Detect cycles in the dependency graph\n */\n detectCycles(): CycleReport {\n const visited = new Set<NodeId>();\n const recursionStack = new Set<NodeId>();\n const cycles: NodeId[][] = [];\n\n for (const nodeId of this.graph.nodes.keys()) {\n if (!visited.has(nodeId)) {\n this.detectCyclesDFS(nodeId, visited, recursionStack, [], cycles);\n }\n }\n\n return {\n hasCycles: cycles.length > 0,\n cycles,\n cycleCount: cycles.length,\n };\n }\n\n /**\n * Depth-first search for cycle detection\n */\n private detectCyclesDFS(\n nodeId: NodeId,\n visited: Set<NodeId>,\n recursionStack: Set<NodeId>,\n path: NodeId[],\n cycles: NodeId[][]\n ): void {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n path.push(nodeId);\n\n const neighbors = this.adjacency.get(nodeId) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n this.detectCyclesDFS(neighbor, visited, recursionStack, path, cycles);\n } else if (recursionStack.has(neighbor)) {\n // Found a cycle\n const cycleStart = path.indexOf(neighbor);\n cycles.push([...path.slice(cycleStart), neighbor]);\n }\n }\n\n recursionStack.delete(nodeId);\n path.pop();\n }\n\n /**\n * Find strongly connected components using Tarjan's algorithm\n */\n findStronglyConnectedComponents(): NodeId[][] {\n let index = 0;\n const stack: NodeId[] = [];\n const indices = new Map<NodeId, number>();\n const lowlinks = new Map<NodeId, number>();\n const onStack = new Set<NodeId>();\n const sccs: NodeId[][] = [];\n\n const strongConnect = (v: NodeId): void => {\n indices.set(v, index);\n lowlinks.set(v, index);\n index++;\n stack.push(v);\n onStack.add(v);\n\n const neighbors = this.adjacency.get(v) || new Set();\n for (const w of neighbors) {\n if (!indices.has(w)) {\n strongConnect(w);\n lowlinks.set(v, Math.min(lowlinks.get(v)!, lowlinks.get(w)!));\n } else if (onStack.has(w)) {\n lowlinks.set(v, Math.min(lowlinks.get(v)!, indices.get(w)!));\n }\n }\n\n if (lowlinks.get(v) === indices.get(v)) {\n const scc: NodeId[] = [];\n let w: NodeId | undefined;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n scc.push(w);\n } while (w !== v);\n sccs.push(scc);\n }\n };\n\n for (const nodeId of this.graph.nodes.keys()) {\n if (!indices.has(nodeId)) {\n strongConnect(nodeId);\n }\n }\n\n return sccs;\n }\n\n /**\n * Topological sort of the graph\n */\n topologicalSort(): NodeId[] {\n const inDegree = new Map<NodeId, number>();\n \n for (const nodeId of this.graph.nodes.keys()) {\n inDegree.set(nodeId, 0);\n }\n\n for (const [sourceId, node] of this.graph.nodes.entries()) {\n for (const edge of node.edges) {\n inDegree.set(\n edge.targetId,\n (inDegree.get(edge.targetId) || 0) + 1\n );\n }\n }\n\n const queue: NodeId[] = [];\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId);\n }\n }\n\n const sorted: NodeId[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n inDegree.set(neighbor, inDegree.get(neighbor)! - 1);\n if (inDegree.get(neighbor) === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n return sorted;\n }\n\n /**\n * Find nodes reachable from a given start node\n */\n findReachable(startNodeId: NodeId): Set<NodeId> {\n const reachable = new Set<NodeId>();\n const visited = new Set<NodeId>();\n const queue: NodeId[] = [startNodeId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current)) continue;\n \n visited.add(current);\n reachable.add(current);\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n queue.push(neighbor);\n }\n }\n }\n\n return reachable;\n }\n\n /**\n * Find shortest path between two nodes (BFS)\n */\n findShortestPath(fromId: NodeId, toId: NodeId): NodeId[] | null {\n const visited = new Set<NodeId>();\n const previous = new Map<NodeId, NodeId>();\n const queue: NodeId[] = [fromId];\n visited.add(fromId);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n if (current === toId) {\n return this.reconstructPath(previous, toId);\n }\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n previous.set(neighbor, current);\n queue.push(neighbor);\n }\n }\n }\n\n return null;\n }\n\n /**\n * Reconstruct path from previous map\n */\n private reconstructPath(\n previous: Map<NodeId, NodeId>,\n toId: NodeId\n ): NodeId[] {\n const path: NodeId[] = [toId];\n let current: NodeId | undefined = toId;\n\n while (current !== undefined) {\n current = previous.get(current);\n if (current !== undefined) {\n path.unshift(current);\n }\n }\n\n return path;\n }\n\n /**\n * Get nodes grouped by their depth from roots\n */\n getDepthGroups(): Map<number, NodeId[]> {\n const depths = new Map<NodeId, number>();\n const groups = new Map<number, NodeId[]>();\n\n // Calculate depths using BFS from all roots\n for (const rootId of this.graph.roots) {\n const queue: NodeId[] = [rootId];\n depths.set(rootId, 0);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentDepth = depths.get(current)!;\n\n for (const neighbor of (this.adjacency.get(current) || new Set())) {\n const newDepth = currentDepth + 1;\n if (\n !depths.has(neighbor) || \n depths.get(neighbor)! > newDepth\n ) {\n depths.set(neighbor, newDepth);\n queue.push(neighbor);\n }\n }\n }\n }\n\n // Group nodes by depth\n for (const [nodeId, depth] of depths.entries()) {\n if (!groups.has(depth)) {\n groups.set(depth, []);\n }\n groups.get(depth)!.push(nodeId);\n }\n\n return groups;\n }\n\n /**\n * Get the underlying graph\n */\n getGraph(): Graph {\n return this.graph;\n }\n}\n\n/**\n * Cycle detection report\n */\nexport interface CycleReport {\n hasCycles: boolean;\n cycles: NodeId[][];\n cycleCount: number;\n}\n"],"mappings":"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","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","process","import_node_fs","import_node_path","mainPath","import_typescript","path","import_typescript","import_node_process","import_meta","process","path","ts","process","fs"]}
|
|
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/schema/queryBuilderAnalyzer.ts","../src/compiler/schema/queryBuilderSchemaBuilder.ts","../src/compiler/manifest/emit.ts","../src/compiler/validation/emitPrecompiledValidators.ts","../src/compiler/cache/isStale.ts","../src/compiler/cache/writeCache.ts","../src/cli/progress.ts","../src/compiler/schema/partitioner.ts","../src/compiler/schema/splitOpenapi.ts","../src/compiler/graph/types.ts","../src/compiler/graph/builder.ts","../src/compiler/graph/schemaGraph.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { writeFileSync, mkdirSync, rmSync, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\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 { ProgressTracker, Spinner } from \"./cli/progress.js\";\nimport { partitionSchemas, type PartitionStrategy } from \"./compiler/schema/partitioner.js\";\nimport { generateModularOpenAPI } from \"./compiler/schema/splitOpenapi.js\";\nimport { createGraph, addNode, addEdge, type Graph, type AnyNode } from \"./compiler/graph/types.js\";\nimport { buildGraph } from \"./compiler/graph/builder.js\";\nimport { SchemaGraph } from \"./compiler/graph/schemaGraph.js\";\nimport ts from \"typescript\";\nimport process from \"node:process\";\n\nconst ADORN_VERSION = (() => {\n const tryReadPackageJson = (filePath: string): string | null => {\n try {\n const pkg = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return pkg.version ?? null;\n } catch {\n return null;\n }\n };\n\n // List of potential package.json locations to try\n const potentialPaths: string[] = [];\n \n // Try ESM context first\n try {\n const importMetaUrl = import.meta?.url;\n if (importMetaUrl && typeof importMetaUrl === \"string\" && importMetaUrl.length > 0) {\n const cliDir = dirname(fileURLToPath(importMetaUrl));\n potentialPaths.push(\n resolve(cliDir, \"..\", \"package.json\"),\n resolve(cliDir, \"package.json\")\n );\n }\n } catch {\n // Ignore errors from import.meta access\n }\n \n // Add common paths for all contexts\n const cwd = process.cwd();\n potentialPaths.push(\n resolve(cwd, \"package.json\"),\n resolve(cwd, \"node_modules\", \"adorn-api\", \"package.json\"),\n resolve(cwd, \"..\", \"package.json\"),\n resolve(cwd, \"..\", \"..\", \"package.json\")\n );\n \n // Try each potential path\n for (const pkgPath of potentialPaths) {\n const version = tryReadPackageJson(pkgPath);\n if (version) {\n return version;\n }\n }\n\n // Fallback: Return 0.0.0 if all methods fail\n return \"0.0.0\";\n})();\n\ntype ValidationMode = \"none\" | \"ajv-runtime\" | \"precompiled\";\n\ninterface BuildOptions {\n projectPath: string;\n outputDir: string;\n ifStale: boolean;\n validationMode: ValidationMode;\n verbose: boolean;\n quiet: boolean;\n split: boolean;\n splitStrategy: PartitionStrategy | undefined;\n splitThreshold: number;\n}\n\nfunction log(msg: string, options?: { indent?: boolean }) {\n if (options?.indent) {\n process.stdout.write(\" \" + msg + \"\\n\");\n } else {\n process.stdout.write(msg + \"\\n\");\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getFileSize(path: string): number | undefined {\n try {\n return statSync(path).size;\n } catch {\n return undefined;\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\n/**\n * Build a minimal graph from controllers for schema partitioning\n */\nfunction buildControllerGraph(controllers: any[]): Graph {\n const graph = createGraph(ts.version);\n const nodeMap = new Map<string, AnyNode>();\n \n // Create controller nodes\n for (const ctrl of controllers) {\n const nodeId = `Controller:${ctrl.className}`;\n const node: AnyNode = {\n id: nodeId,\n kind: 'Controller',\n metadata: {\n name: ctrl.className,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n controller: {\n basePath: ctrl.basePath,\n },\n };\n addNode(graph, node);\n nodeMap.set(nodeId, node);\n }\n \n // Create operation nodes\n let opIndex = 0;\n for (const ctrl of controllers) {\n for (const op of ctrl.operations) {\n const nodeId = `Operation:${op.operationId}`;\n const node: AnyNode = {\n id: nodeId,\n kind: 'Operation',\n metadata: {\n name: op.operationId,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n operation: {\n httpMethod: op.httpMethod,\n path: op.path,\n operationId: op.operationId,\n returnType: op.returnType || '',\n },\n };\n addNode(graph, node);\n nodeMap.set(nodeId, node);\n \n // Connect controller to operation\n const ctrlNode = nodeMap.get(`Controller:${ctrl.className}`);\n if (ctrlNode) {\n addEdge(graph, ctrlNode.id, node.id, 'contains');\n }\n \n opIndex++;\n }\n }\n \n // Create type definition nodes for return types\n for (const ctrl of controllers) {\n for (const op of ctrl.operations) {\n if (op.returnType && !nodeMap.has(op.returnType)) {\n const node: AnyNode = {\n id: op.returnType,\n kind: 'TypeDefinition',\n metadata: {\n name: op.returnType,\n sourceLocation: { filePath: '', line: 0, column: 0 },\n tags: new Set(),\n annotations: new Map(),\n },\n edges: [],\n typeDef: {\n isGeneric: false,\n properties: new Map(),\n },\n };\n addNode(graph, node);\n nodeMap.set(op.returnType, node);\n \n // Connect operation to return type\n const opNodeId = `Operation:${op.operationId}`;\n const opNode = nodeMap.get(opNodeId);\n if (opNode) {\n addEdge(graph, opNode.id, node.id, 'uses');\n }\n }\n }\n }\n \n return graph;\n}\n\nasync function buildCommand(args: string[]) {\n const progress = new ProgressTracker({ verbose: args.includes(\"--verbose\"), quiet: args.includes(\"--quiet\") });\n\n // Parse arguments\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 const verbose = args.includes(\"--verbose\");\n const quiet = args.includes(\"--quiet\");\n const split = args.includes(\"--split\");\n \n // Parse split strategy override\n const splitStrategyIndex = args.indexOf(\"--split-strategy\");\n const splitStrategy = splitStrategyIndex !== -1 \n ? args[splitStrategyIndex + 1] as PartitionStrategy \n : undefined;\n \n // Parse split threshold\n const splitThresholdIndex = args.indexOf(\"--split-threshold\");\n const splitThreshold = splitThresholdIndex !== -1 \n ? parseInt(args[splitThresholdIndex + 1], 10) \n : 50;\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 (!quiet) {\n log(`adorn-api v${ADORN_VERSION} - Building API artifacts`);\n log(\"\");\n }\n\n // Phase 1: Check staleness\n if (ifStale) {\n progress.startPhase(\"staleness-check\", \"Checking for stale artifacts\");\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 progress.completePhase(\"staleness-check\");\n if (!quiet) {\n log(\"adorn-api: artifacts up-to-date\");\n }\n return;\n }\n\n progress.completePhase(\"staleness-check\", `Artifacts stale (${stale.reason})`);\n if (verbose) {\n progress.verboseLog(`Stale reason: ${stale.detail || stale.reason}`);\n }\n } else {\n progress.startPhase(\"configuration\", \"Initializing build\");\n progress.completePhase(\"configuration\", \"Build forced (--if-stale not used)\");\n }\n\n // Phase 2: Create TypeScript program\n progress.startPhase(\"program\", \"Loading TypeScript configuration\");\n if (verbose) {\n progress.verboseLog(`Loading ${projectPath}`);\n }\n \n const { program, checker, sourceFiles } = createProgramFromConfig(projectPath);\n const projectSourceFiles = sourceFiles.filter(sf => !sf.fileName.includes(\"node_modules\"));\n progress.completePhase(\"program\");\n \n if (verbose) {\n progress.verboseLog(`Found ${projectSourceFiles.length} source files`);\n }\n\n // Phase 3: Scan controllers\n progress.startPhase(\"scan\", \"Scanning for controllers\");\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 const totalOperations = controllers.reduce((sum, ctrl) => sum + ctrl.operations.length, 0);\n progress.completePhase(\"scan\", `Found ${controllers.length} controller(s) with ${totalOperations} operation(s)`);\n \n if (verbose) {\n for (const ctrl of controllers) {\n progress.verboseLog(`Controller: ${ctrl.className} (${ctrl.basePath}) - ${ctrl.operations.length} operations`);\n }\n }\n\n // Phase 4: Generate OpenAPI\n progress.startPhase(\"openapi\", \"Generating OpenAPI schema\");\n \n const openapiSpinner = new Spinner(\"Processing schemas\");\n if (!quiet) openapiSpinner.start();\n \n const openapi = generateOpenAPI(controllers, checker, { \n title: \"API\", \n version: \"1.0.0\",\n onProgress: (message, current, total) => {\n if (!quiet) {\n openapiSpinner.setStatus(`${message} (${current}/${total})`);\n }\n }\n });\n \n // Update spinner with final progress info\n if (!quiet) {\n openapiSpinner.setStatus(`Processed ${controllers.length} controllers, ${totalOperations} operations`);\n }\n \n if (!quiet) openapiSpinner.stop();\n \n const schemaCount = Object.keys(openapi.components?.schemas || {}).length;\n \n // Auto-split logic (default disabled, --split to enable)\n let splitEnabled = false;\n \n if (split && schemaCount >= splitThreshold) {\n progress.verboseLog(`Schema count (${schemaCount}) >= threshold (${splitThreshold}), analyzing for auto-split...`);\n \n // Build minimal graph for partitioning\n const graph = buildControllerGraph(controllers);\n const schemaGraph = new SchemaGraph(graph);\n \n // Convert schemas to Map format\n const schemasMap = new Map(Object.entries(openapi.components?.schemas || {}));\n \n // Run smart partitioning\n const strategy = splitStrategy || 'auto';\n const partitioning = partitionSchemas(schemasMap, graph, schemaGraph, {\n strategy,\n threshold: splitThreshold,\n verbose,\n });\n \n splitEnabled = partitioning.shouldSplit;\n \n if (splitEnabled) {\n progress.verboseLog(`Partitioning result: ${partitioning.strategy} strategy`);\n progress.verboseLog(`Recommendation: ${partitioning.recommendation}`);\n \n if (!quiet) {\n log(` Auto-split enabled: ${partitioning.strategy} strategy`);\n }\n \n // Generate modular OpenAPI with progress tracking\n const splitSpinner = new Spinner(\"Writing split schema files\");\n if (!quiet) splitSpinner.start();\n \n generateModularOpenAPI(openapi, partitioning, {\n outputDir: outputPath,\n schemasDir: \"schemas\",\n createIndexFile: true,\n prettyPrint: true,\n onProgress: (step, index, total) => {\n if (!quiet) {\n progress.logSub(`${step} (${index}/${total})`);\n }\n }\n });\n \n if (!quiet) splitSpinner.stop();\n \n if (!quiet) {\n log(` Schema groups: ${partitioning.groups.length}`);\n }\n } else {\n if (!quiet) {\n log(` Auto-split not needed: ${partitioning.recommendation}`);\n }\n }\n } else if (!split) {\n if (!quiet) {\n log(` Splitting disabled (--split not specified)`);\n }\n } else {\n if (!quiet) {\n log(` Schema count (${schemaCount}) below threshold (${splitThreshold}), single file mode`);\n }\n }\n \n progress.completePhase(\"openapi\", `Generated ${schemaCount} schema(s)${splitEnabled ? ' (split into groups)' : ''}`);\n\n // Phase 5: Generate manifest\n progress.startPhase(\"manifest\", \"Generating manifest\");\n const manifest = generateManifest(controllers, checker, ADORN_VERSION, validationMode);\n progress.completePhase(\"manifest\");\n\n // Phase 6: Write artifacts\n progress.startPhase(\"write\", \"Writing artifacts\");\n mkdirSync(outputPath, { recursive: true });\n \n const openapiPath = resolve(outputPath, \"openapi.json\");\n const manifestPath = resolve(outputPath, \"manifest.json\");\n \n // Write openapi.json (if not already written by split)\n if (!splitEnabled) {\n writeFileSync(openapiPath, JSON.stringify(sanitizeForJson(openapi), null, 2));\n }\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));\n \n const artifacts: Array<{ name: string; size?: number }> = [\n { name: \"openapi.json\", size: getFileSize(openapiPath) },\n { name: \"manifest.json\", size: getFileSize(manifestPath) },\n ];\n \n // Add schema files to artifacts list\n if (splitEnabled) {\n const schemasDir = resolve(outputPath, \"schemas\");\n if (existsSync(schemasDir)) {\n const fs = await import(\"node:fs\");\n const files = fs.readdirSync(schemasDir);\n for (const file of files) {\n const filePath = resolve(schemasDir, file);\n artifacts.push({ name: `schemas/${file}`, size: getFileSize(filePath) });\n }\n }\n }\n \n if (verbose) {\n for (const artifact of artifacts) {\n progress.verboseLog(`Written: ${artifact.name} (${formatBytes(artifact.size || 0)})`);\n }\n }\n\n // Phase 7: Precompiled validators (if enabled)\n if (validationMode === \"precompiled\") {\n progress.startPhase(\"validators\", \"Generating precompiled validators\");\n \n const manifestObj = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n \n const spinner = new Spinner(\"Generating validators...\");\n if (!quiet) spinner.start();\n \n await emitPrecompiledValidators({\n outDir: outputPath,\n openapi,\n manifest: manifestObj,\n strict: \"off\",\n formatsMode: \"full\"\n });\n \n if (!quiet) spinner.stop();\n \n manifestObj.validation = {\n mode: \"precompiled\",\n precompiledModule: \"./validators.mjs\"\n };\n \n writeFileSync(manifestPath, JSON.stringify(manifestObj, null, 2));\n \n const validatorsCjsPath = resolve(outputPath, \"validators.cjs\");\n const validatorsMjsPath = resolve(outputPath, \"validators.mjs\");\n const validatorsMetaPath = resolve(outputPath, \"validators.meta.json\");\n \n artifacts.push(\n { name: \"validators.cjs\", size: getFileSize(validatorsCjsPath) },\n { name: \"validators.mjs\", size: getFileSize(validatorsMjsPath) },\n { name: \"validators.meta.json\", size: getFileSize(validatorsMetaPath) }\n );\n \n progress.completePhase(\"validators\");\n \n if (verbose) {\n progress.verboseLog(\"Precompiled validators generated successfully\");\n }\n }\n\n // Phase 8: Write cache\n progress.startPhase(\"cache\", \"Writing cache\");\n \n writeCache({\n outDir: outputDir,\n tsconfigAbs: resolve(projectPath),\n program,\n adornVersion: ADORN_VERSION\n });\n \n const cachePath = resolve(outputPath, \"cache.json\");\n artifacts.push({ name: \"cache.json\", size: getFileSize(cachePath) });\n \n progress.completePhase(\"cache\");\n \n if (verbose) {\n progress.verboseLog(`Written: cache.json (${formatBytes(getFileSize(cachePath) || 0)})`);\n }\n\n // Print summary\n const stats = {\n controllers: controllers.length,\n operations: totalOperations,\n schemas: schemaCount,\n sourceFiles: projectSourceFiles.length,\n artifactsWritten: artifacts.map(a => a.name),\n splitEnabled,\n };\n \n progress.printSummary(stats);\n progress.printArtifacts(artifacts);\n}\n\nfunction cleanCommand(args: string[]) {\n const quiet = args.includes(\"--quiet\");\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 if (!quiet) {\n log(`adorn-api: cleaned ${outputDir}`);\n }\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 v${ADORN_VERSION}\n\nCommands:\n build Generate OpenAPI and manifest from TypeScript source\n clean Remove generated artifacts\n\n Options:\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 --split Enable automatic schema splitting (default: disabled)\n --split-strategy <mode> Override splitting strategy: controller, dependency, size, auto (default: auto)\n --split-threshold <num> Schema count threshold for auto-split (default: 50)\n --verbose Show detailed progress information\n --quiet Suppress non-essential output\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 build --verbose\n adorn-api build --split # Enable split mode\n adorn-api build --split-strategy controller # Force controller-based splitting\n adorn-api build --split-threshold 100 # Increase threshold to 100\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\";\nimport { analyzeQueryBuilderForSchema, type QueryBuilderSchema } from \"./queryBuilderAnalyzer.js\";\nimport { buildSchemaFromQueryBuilder, wrapInPaginatedResult } from \"./queryBuilderSchemaBuilder.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 * Progress callback for OpenAPI generation\n */\nexport interface OpenAPIProgressCallback {\n (message: string, current: number, total: number): void;\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 * @param onProgress - Optional callback to report progress during generation\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; onProgress?: OpenAPIProgressCallback } = {}\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 const { onProgress } = options;\n\n for (let i = 0; i < controllers.length; i++) {\n const controller = controllers[i];\n if (onProgress) {\n onProgress(`Processing controller ${controller.className}`, i + 1, controllers.length);\n }\n \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 \n if (onProgress) {\n onProgress(\"Generating and cleaning schemas\", controllers.length, controllers.length);\n }\n \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 tryInferQueryBuilderSchema(\n operation: ScannedOperation,\n checker: ts.TypeChecker\n): QueryBuilderSchema | null {\n return analyzeQueryBuilderForSchema(operation.methodDeclaration, checker) ?? null;\n}\n\nfunction getEntityTypeFromReturnType(\n operation: ScannedOperation,\n checker: ts.TypeChecker\n): ts.Type | null {\n const returnType = operation.returnType;\n \n const unwrapPromise = (type: ts.Type): 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 const innerType = unwrapPromise(returnType);\n \n const symbol = innerType.getSymbol();\n if (symbol?.getName() === \"PaginatedResult\") {\n const typeArgs = (innerType as ts.TypeReference).typeArguments;\n if (typeArgs && typeArgs.length > 0) {\n return typeArgs[0];\n }\n }\n \n return null;\n}\n\nfunction filterSchemaByQueryBuilder(\n querySchema: QueryBuilderSchema,\n operation: ScannedOperation,\n ctx: SchemaContext\n): JsonSchema {\n const entityType = getEntityTypeFromReturnType(operation, ctx.checker);\n \n if (!entityType) {\n return {};\n }\n\n const entitySchema = typeToJsonSchema(entityType, ctx);\n \n let baseSchema = entitySchema;\n if (entitySchema.$ref && entitySchema.$ref.startsWith('#/components/schemas/')) {\n const schemaName = entitySchema.$ref.replace('#/components/schemas/', '');\n const componentSchema = ctx.components.get(schemaName);\n if (componentSchema) {\n baseSchema = componentSchema;\n }\n }\n \n if (!baseSchema.properties || Object.keys(baseSchema.properties).length === 0) {\n return {};\n }\n\n const filteredSchema = buildFilteredSchema(querySchema, baseSchema);\n \n if (querySchema.isPaged) {\n return wrapInPaginatedResult(filteredSchema);\n }\n\n return filteredSchema;\n}\n\nfunction buildFilteredSchema(\n querySchema: QueryBuilderSchema,\n entitySchema: JsonSchema\n): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const field of querySchema.selectedFields) {\n if (entitySchema.properties?.[field]) {\n properties[field] = entitySchema.properties[field];\n if (entitySchema.required && entitySchema.required.includes(field)) {\n required.push(field);\n }\n }\n }\n\n for (const [relationName, includeSpec] of Object.entries(querySchema.includes)) {\n if (entitySchema.properties?.[relationName]) {\n properties[relationName] = {\n type: \"object\",\n properties: {\n id: { type: \"integer\" }\n },\n required: [\"id\"]\n };\n if (entitySchema.required && entitySchema.required.includes(relationName)) {\n required.push(relationName);\n }\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\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 \n let responseSchema: JsonSchema;\n \n const querySchema = tryInferQueryBuilderSchema(operation, ctx.checker);\n if (querySchema) {\n const entityType = getEntityTypeFromReturnType(operation, ctx.checker);\n if (entityType) {\n responseSchema = filterSchemaByQueryBuilder(querySchema, operation, responseCtx);\n } else {\n responseSchema = typeToJsonSchema(operation.returnType, responseCtx, operation.returnTypeNode);\n }\n } else {\n responseSchema = typeToJsonSchema(operation.returnType, responseCtx, operation.returnTypeNode);\n }\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 * Checks if a type is a type parameter (generic type variable like T, U, etc.)\n * \n * @param type - The type to check\n * @returns True if the type is a type parameter\n */\nexport function isTypeParameter(type: ts.Type): boolean {\n return !!(type.flags & ts.TypeFlags.TypeParameter);\n}\n\n/**\n * Gets the name of a type parameter if the type is one\n * \n * @param type - The type to check\n * @returns The type parameter name, or null if not a type parameter\n */\nexport function getTypeParameterName(type: ts.Type): string | null {\n if (type.flags & ts.TypeFlags.TypeParameter) {\n const typeParam = type as ts.TypeParameter;\n return typeParam.symbol?.getName() ?? null;\n }\n return null;\n}\n\n/**\n * Extracts type arguments from a generic type reference\n * \n * @param type - The type to extract from\n * @returns Array of type arguments, or undefined if not a generic type\n */\nexport function getTypeArguments(type: ts.Type): ts.Type[] | undefined {\n const typeRef = type as ts.TypeReference;\n const args = typeRef.typeArguments;\n if (!args) return undefined;\n return Array.from(args);\n}\n\n/**\n * Creates a type parameter substitution map from a generic type\n * For interface Foo<T, U>, creates Map(\"T\" -> arg1, \"U\" -> arg2)\n * \n * @param type - The generic type\n * @param typeNode - Optional type node for extracting type parameter names\n * @param checker - TypeScript type checker\n * @returns Map of type parameter names to actual types\n */\nexport function createTypeParameterSubstitutions(\n type: ts.Type,\n typeNode: ts.TypeNode | undefined,\n checker: ts.TypeChecker\n): Map<string, ts.Type> | undefined {\n const typeArgs = getTypeArguments(type);\n if (!typeArgs || typeArgs.length === 0) {\n return undefined;\n }\n\n if (!typeNode || !ts.isTypeReferenceNode(typeNode)) {\n return undefined;\n }\n\n const typeParams = typeNode.typeArguments;\n if (!typeParams || typeParams.length !== typeArgs.length) {\n return undefined;\n }\n\n const substitutions = new Map<string, ts.Type>();\n for (let i = 0; i < typeParams.length; i++) {\n const typeParamNode = typeParams[i];\n const typeArg = typeArgs[i];\n\n if (ts.isIdentifier(typeParamNode)) {\n substitutions.set(typeParamNode.text, typeArg);\n }\n }\n\n return substitutions.size > 0 ? substitutions : undefined;\n}\n\n/**\n * Resolves a type parameter to its actual type if a substitution is available\n * \n * @param type - The type to resolve\n * @param substitutions - Map of type parameter names to actual types\n * @param _checker - TypeScript type checker (unused, for future extensions)\n * @returns The resolved type if the type is a type parameter with a substitution, otherwise null\n */\nexport function resolveTypeParameter(\n type: ts.Type,\n substitutions: Map<string, ts.Type> | undefined,\n _checker: ts.TypeChecker\n): ts.Type | null {\n if (!substitutions) return null;\n \n const paramName = getTypeParameterName(type);\n if (!paramName) return null;\n \n const resolved = substitutions.get(paramName);\n return resolved ?? null;\n}\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 typeParamSubstitutions = createTypeParameterSubstitutions(type, typeNode, checker);\n const buildCtx: SchemaContext = typeParamSubstitutions\n ? { ...ctx, typeParameterSubstitutions: typeParamSubstitutions }\n : ctx;\n\n const schema = buildObjectSchema(type, buildCtx, 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, typeParameterSubstitutions } = 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 let propType = checker.getTypeOfSymbol(prop);\n if (isMethodLike(propType)) {\n continue;\n }\n\n const resolvedType = resolveTypeParameter(propType, typeParameterSubstitutions, checker);\n if (resolvedType) {\n propType = resolvedType;\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 const resolvedValueType = resolveTypeParameter(valueType, typeParameterSubstitutions, checker);\n schema.additionalProperties = typeToJsonSchema(resolvedValueType ?? 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 = ctx.checker.typeToString(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 = ctx.checker.typeToString(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 * Query Builder Schema Analyzer\n * Parses method bodies to detect selectFromEntity patterns and extract schema information\n * Supports variable reassignment patterns (e.g., let qb = selectFromEntity(); qb = qb.select())\n *\n * Improvements made:\n * - Fixed variable tracking to support reassignments like \"let qb = selectFromEntity(Entity); qb = qb.select(...)\"\n * - Enhanced `extractChainedOperation` to detect both direct calls and method chains\n * - Added proper handling for selectFromEntity/selectFrom patterns in variable initialization\n * - Fixed PaginatedResult schema filtering to properly filter items array instead of wrapper\n */\n\nimport ts from \"typescript\";\n\n/**\n * Represents a schema extracted from a query builder chain\n */\nexport interface QueryBuilderSchema {\n /** Entity class name (e.g., \"BlogPost\") */\n entityName: string;\n /** Fields selected via .select() calls */\n selectedFields: string[];\n /** Relations included via .include() calls */\n includes: Record<string, QueryBuilderSchema | boolean>;\n /** Whether query ends with .executePaged() instead of .execute() */\n isPaged: boolean;\n}\n\n/**\n * Analysis options for query builder detection\n */\nexport interface QueryBuilderAnalyzerOptions {\n /** Maximum depth to traverse for nested includes */\n maxDepth?: number;\n}\n\n/**\n * Analyzes a method declaration to detect query builder patterns and extract schema\n * Supports variable reassignment patterns (e.g., let qb = selectFromEntity(); qb = qb.select())\n *\n * @param methodDeclaration - The method declaration to analyze\n * @param checker - TypeScript type checker\n * @param options - Analyzer options\n * @returns Query builder schema if pattern detected, null otherwise\n */\nexport function analyzeQueryBuilderForSchema(\n methodDeclaration: ts.MethodDeclaration,\n checker: ts.TypeChecker,\n options: QueryBuilderAnalyzerOptions = {}\n): QueryBuilderSchema | null {\n const body = methodDeclaration.body;\n if (!body) {\n return null;\n }\n\n // Try to analyze with variable tracking (supports reassignments)\n const trackedSchema = analyzeWithVariableTracking(body, checker, options);\n if (trackedSchema) {\n return trackedSchema;\n }\n\n // Fall back to direct call chain analysis (no variable tracking)\n const returnStatement = findReturnStatement(body);\n if (!returnStatement) {\n return null;\n }\n\n const callChain = analyzeReturnExpression(returnStatement.expression);\n if (!callChain) {\n return null;\n }\n\n // Parse chain to extract schema information\n return parseQueryBuilderChain(callChain, checker, options);\n}\n\n/**\n * Analyzes method body with variable tracking to support reassignments\n * Handles patterns like: let qb = selectFromEntity(Entity); qb = qb.select(...);\n */\nfunction analyzeWithVariableTracking(\n body: ts.Block,\n checker: ts.TypeChecker,\n options: QueryBuilderAnalyzerOptions\n): QueryBuilderSchema | null {\n let queryBuilderVar: string | null = null;\n let entityName: string | null = null;\n const selectedFields = new Set<string>();\n const includes: Record<string, QueryBuilderSchema | boolean> = {};\n let isPaged = false;\n let hasReturn = false;\n\n for (const statement of body.statements) {\n // Handle return statements first\n if (ts.isReturnStatement(statement)) {\n hasReturn = true;\n const returnExpr = statement.expression;\n\n // Check if return is a method call on our tracked variable\n if (returnExpr && ts.isCallExpression(returnExpr)) {\n const callExpr = returnExpr;\n\n // Handle qb.executePaged() or qb.execute()\n if (ts.isIdentifier(callExpr.expression) && queryBuilderVar) {\n const varName = callExpr.expression.text;\n\n if (varName === queryBuilderVar) {\n const methodName = callExpr.expression.text;\n\n // Track executePaged to distinguish from execute\n if (methodName === \"executePaged\") {\n isPaged = true;\n }\n }\n }\n\n // Handle chained calls like qb.select(...).executePaged()\n if (ts.isPropertyAccessExpression(callExpr.expression) && queryBuilderVar) {\n const propAccess = callExpr.expression;\n\n if (ts.isIdentifier(propAccess.expression) && propAccess.expression.text === queryBuilderVar) {\n const methodName = propAccess.name.text;\n\n if (methodName === \"executePaged\") {\n isPaged = true;\n }\n }\n }\n }\n\n continue;\n }\n\n // Handle expression statements (assignments, etc.)\n if (!ts.isExpressionStatement(statement)) {\n // Try to handle variable declarations\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name)) continue;\n \n const varName = declaration.name.text;\n const initializer = declaration.initializer;\n \n if (!initializer || !ts.isCallExpression(initializer)) continue;\n \n const opInfo = extractChainedOperation(initializer);\n \n if (opInfo && (opInfo.operation === \"selectFromEntity\" || opInfo.operation === \"selectFrom\")) {\n queryBuilderVar = varName;\n if (opInfo.entityName) {\n entityName = opInfo.entityName;\n }\n }\n }\n }\n continue;\n }\n\n const expr = statement.expression;\n\n // Check if this is a variable assignment (let qb = ... or qb = ...)\n if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.EqualsToken) {\n if (!ts.isIdentifier(expr.left)) {\n continue;\n }\n\n const varName = expr.left.text;\n const rightSide = expr.right;\n\n // Check if right side is a query builder call (initialization or method call)\n if (ts.isCallExpression(rightSide)) {\n const opInfo = extractChainedOperation(rightSide);\n\n if (opInfo) {\n // Handle query builder initialization (selectFromEntity or selectFrom)\n if (opInfo.operation === \"selectFromEntity\" || opInfo.operation === \"selectFrom\") {\n // Track the variable that holds the query builder\n queryBuilderVar = varName;\n\n // Extract entity name\n if (opInfo.entityName) {\n entityName = opInfo.entityName;\n }\n }\n\n // Handle chained method calls on our tracked variable\n // e.g., qb = qb.select(\"field1\", \"field2\")\n if ((opInfo.operation === \"select\" || opInfo.operation === \"include\") && queryBuilderVar === varName) {\n if (opInfo.operation === \"select\") {\n for (const field of opInfo.fields || []) {\n selectedFields.add(field);\n }\n } else if (opInfo.operation === \"include\" && opInfo.includeArg) {\n const parsedIncludes = parseIncludeObjectLiteral(opInfo.includeArg);\n if (parsedIncludes) {\n for (const [relName, relSchema] of Object.entries(parsedIncludes)) {\n includes[relName] = relSchema;\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Must have found a return statement and a valid query builder pattern\n if (!hasReturn || !queryBuilderVar || !entityName) {\n return null;\n }\n\n return {\n entityName,\n selectedFields: Array.from(selectedFields),\n includes,\n isPaged\n };\n}\n\n/**\n * Checks if an expression is a query builder operation on a variable\n */\nfunction isQueryBuilderOperation(\n expr: ts.Expression,\n varName: string\n): boolean {\n const opInfo = extractQueryBuilderOperation(expr, varName);\n return opInfo.type !== \"unknown\";\n}\n\n/**\n * Extracts information from a query builder operation\n */\ninterface QueryBuilderOperation {\n type: \"selectFromEntity\" | \"selectFrom\" | \"select\" | \"include\" | \"executePaged\" | \"unknown\";\n entityName: string | null;\n fields: string[] | null;\n includes: Record<string, QueryBuilderSchema | boolean> | null;\n}\n\n/**\n * Information about a chained operation (e.g., qb.select() or qb.include())\n */\ninterface ChainedOperation {\n operation: \"select\" | \"include\" | \"selectFromEntity\" | \"selectFrom\";\n fields: string[] | null;\n includeArg: ts.Expression | null;\n entityName: string | null;\n}\n\n/**\n * Extracts information from a chained method call on a variable\n * e.g., qb.select(\"field1\", \"field2\") or qb.include({...}) or qb.selectFromEntity(Entity)\n */\nfunction extractChainedOperation(callExpr: ts.CallExpression): ChainedOperation | null {\n // Check for direct call to selectFromEntity or selectFrom\n // This handles patterns like: qb = selectFromEntity(Entity)\n if (ts.isIdentifier(callExpr.expression)) {\n const methodName = callExpr.expression.text;\n\n if (methodName === \"selectFromEntity\" || methodName === \"selectFrom\") {\n const entityArg = callExpr.arguments[0];\n let entityName: string | null = null;\n\n if (ts.isIdentifier(entityArg)) {\n entityName = entityArg.text;\n } else if (ts.isPropertyAccessExpression(entityArg)) {\n entityName = entityArg.name.text;\n }\n\n return {\n operation: methodName === \"selectFromEntity\" ? \"selectFromEntity\" : \"selectFrom\",\n fields: null,\n includeArg: null,\n entityName\n };\n }\n }\n\n // Check for property access (method calls on variables)\n if (!ts.isPropertyAccessExpression(callExpr.expression)) {\n return null;\n }\n\n const propAccess = callExpr.expression;\n const methodName = propAccess.name.text;\n\n if (methodName === \"select\") {\n const fields: string[] = [];\n for (const arg of callExpr.arguments) {\n if (ts.isStringLiteral(arg)) {\n fields.push(arg.text);\n }\n }\n return {\n operation: \"select\",\n fields,\n includeArg: null,\n entityName: null\n };\n }\n\n if (methodName === \"include\") {\n return {\n operation: \"include\",\n fields: null,\n includeArg: callExpr.arguments[0] || null,\n entityName: null\n };\n }\n\n return null;\n}\n\nfunction extractQueryBuilderOperation(\n expr: ts.Expression,\n varName: string\n): QueryBuilderOperation {\n // Check for selectFromEntity(Entity) or selectFrom(Entity)\n if (ts.isCallExpression(expr) && ts.isIdentifier(expr.expression)) {\n const methodName = expr.expression.text;\n \n if (methodName === \"selectFromEntity\" || methodName === \"selectFrom\") {\n const entityArg = expr.arguments[0];\n let entityName: string | null = null;\n \n if (ts.isIdentifier(entityArg)) {\n entityName = entityArg.text;\n } else if (ts.isPropertyAccessExpression(entityArg)) {\n entityName = entityArg.name.text;\n }\n \n return {\n type: methodName,\n entityName,\n fields: null,\n includes: null\n };\n }\n }\n\n // Check for variable.select(\"field1\", \"field2\")\n if (ts.isCallExpression(expr)) {\n const callExpr = expr;\n \n if (ts.isPropertyAccessExpression(callExpr.expression)) {\n const methodName = callExpr.expression.name.text;\n \n if (methodName === \"select\") {\n const fields: string[] = [];\n \n for (const arg of callExpr.arguments) {\n if (ts.isStringLiteral(arg)) {\n fields.push(arg.text);\n }\n }\n \n return {\n type: \"select\",\n entityName: null,\n fields,\n includes: null\n };\n }\n \n if (methodName === \"include\") {\n const includes = parseIncludeObjectLiteral(callExpr.arguments[0]);\n \n return {\n type: \"include\",\n entityName: null,\n fields: null,\n includes\n };\n }\n \n if (methodName === \"executePaged\") {\n return {\n type: \"executePaged\",\n entityName: null,\n fields: null,\n includes: null\n };\n }\n }\n }\n\n return {\n type: \"unknown\",\n entityName: null,\n fields: null,\n includes: null\n };\n}\n\n/**\n * Parses an include object literal\n */\nfunction parseIncludeObjectLiteral(\n arg: ts.Expression\n): Record<string, QueryBuilderSchema | boolean> | null {\n if (!ts.isObjectLiteralExpression(arg)) {\n return null;\n }\n\n const includes: Record<string, QueryBuilderSchema | boolean> = {};\n\n for (const prop of arg.properties) {\n if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {\n continue;\n }\n\n const relationName = prop.name.text;\n const value = prop.initializer;\n\n if (value.kind === ts.SyntaxKind.TrueKeyword) {\n includes[relationName] = true;\n } else if (ts.isObjectLiteralExpression(value)) {\n const nestedSchema = parseNestedInclude(value, 0);\n if (nestedSchema) {\n includes[relationName] = nestedSchema;\n }\n }\n }\n\n return includes;\n}\n\n/**\n * Parses a nested include with field selection\n */\nfunction parseNestedInclude(\n obj: ts.ObjectLiteralExpression,\n depth: number\n): QueryBuilderSchema | null {\n const selectedFields: string[] = [];\n const includes: Record<string, QueryBuilderSchema | boolean> = {};\n\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {\n continue;\n }\n\n const propName = prop.name.text;\n const value = prop.initializer;\n\n if (propName === \"select\" && ts.isArrayLiteralExpression(value)) {\n for (const element of value.elements) {\n if (ts.isStringLiteral(element)) {\n selectedFields.push(element.text);\n }\n }\n } else if (propName === \"include\" && ts.isObjectLiteralExpression(value)) {\n const nestedIncludes = parseIncludeObjectLiteral(value);\n if (nestedIncludes) {\n for (const [relName, relSchema] of Object.entries(nestedIncludes)) {\n includes[relName] = relSchema;\n }\n }\n }\n }\n\n return {\n entityName: \"\",\n selectedFields,\n includes,\n isPaged: false\n };\n}\n\n/**\n * Extracts method name from an expression\n */\nfunction getMethodName(expression: ts.Expression): string | null {\n if (ts.isIdentifier(expression)) {\n return expression.text;\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n return expression.name.text;\n }\n\n return null;\n}\n\n/**\n * Finds the single return statement in a method body\n */\nfunction findReturnStatement(body: ts.Block): ts.ReturnStatement | null {\n let returnStatement: ts.ReturnStatement | null = null;\n \n for (const statement of body.statements) {\n if (ts.isReturnStatement(statement)) {\n if (returnStatement !== null) {\n // Multiple return statements - too complex\n return null;\n }\n returnStatement = statement;\n }\n }\n \n return returnStatement;\n}\n\n/**\n * Analyzes a return expression to extract query builder call chain\n */\ninterface CallChainNode {\n expression: ts.Expression;\n methodName: string | null;\n arguments: ts.NodeArray<ts.Expression>;\n parent: CallChainNode | null;\n}\n\nfunction analyzeReturnExpression(expression: ts.Expression | undefined): CallChainNode | null {\n if (!expression) {\n return null;\n }\n\n // Check if it's a call expression (simple case)\n if (ts.isCallExpression(expression)) {\n return buildCallChain(expression, null);\n }\n\n return null;\n}\n\n/**\n * Builds a call chain from a call expression\n */\nfunction buildCallChain(\n node: ts.Expression,\n parent: CallChainNode | null\n): CallChainNode | null {\n if (ts.isCallExpression(node)) {\n const callNode: CallChainNode = {\n expression: node.expression,\n methodName: getMethodName(node.expression),\n arguments: node.arguments,\n parent\n };\n\n // Check if we have a property access chain (e.g., selectFromEntity(Entity).select(...))\n if (ts.isPropertyAccessExpression(node.expression)) {\n return buildCallChain(node.expression.expression, callNode);\n }\n\n return callNode;\n }\n\n return parent;\n}\n\n/**\n * Parses a query builder call chain to extract schema information\n */\nfunction parseQueryBuilderChain(\n chain: CallChainNode | null,\n checker: ts.TypeChecker,\n options: QueryBuilderAnalyzerOptions\n): QueryBuilderSchema | null {\n if (!chain) {\n return null;\n }\n\n // Find the root (selectFromEntity or selectFrom call)\n const rootNode = findSelectFromEntityCall(chain);\n if (!rootNode) {\n return null;\n }\n\n // Extract entity name from selectFromEntity call\n const entityName = extractEntityName(rootNode, checker);\n if (!entityName) {\n return null;\n }\n\n // Traverse chain to find .select() and .include() calls\n const selectedFields = new Set<string>();\n const includes: Record<string, QueryBuilderSchema | boolean> = {};\n let isPaged = false;\n\n let currentNode: CallChainNode | null = chain;\n while (currentNode) {\n const methodName = currentNode.methodName;\n\n if (methodName === \"select\") {\n // Extract field names from .select() arguments\n for (const arg of currentNode.arguments) {\n if (ts.isStringLiteral(arg)) {\n selectedFields.add(arg.text);\n }\n }\n } else if (methodName === \"include\") {\n // Extract include specifications from .include() arguments\n parseIncludeArgument(currentNode.arguments[0], includes, checker, options, 0);\n } else if (methodName === \"executePaged\") {\n isPaged = true;\n }\n\n currentNode = currentNode.parent;\n }\n\n return {\n entityName,\n selectedFields: Array.from(selectedFields),\n includes,\n isPaged\n };\n}\n\n/**\n * Finds selectFromEntity call in a chain (the root)\n */\nfunction findSelectFromEntityCall(chain: CallChainNode | null): CallChainNode | null {\n let currentNode: CallChainNode | null = chain;\n let lastNode: CallChainNode | null = null;\n\n while (currentNode) {\n if (currentNode.methodName === \"selectFromEntity\" || \n currentNode.methodName === \"selectFrom\") {\n return currentNode;\n }\n lastNode = currentNode;\n currentNode = currentNode.parent;\n }\n\n return lastNode;\n}\n\n/**\n * Extracts entity name from selectFromEntity(Entity) call\n */\nfunction extractEntityName(\n callNode: CallChainNode,\n checker: ts.TypeChecker\n): string | null {\n if (callNode.arguments.length === 0) {\n return null;\n }\n\n const entityArg = callNode.arguments[0];\n\n // Handle identifier (direct entity class reference)\n if (ts.isIdentifier(entityArg)) {\n return entityArg.text;\n }\n\n // Handle property access (e.g., Entities.BlogPost)\n if (ts.isPropertyAccessExpression(entityArg)) {\n return entityArg.name.text;\n }\n\n return null;\n}\n\n/**\n * Parses argument to .include() to extract relation specifications\n */\nfunction parseIncludeArgument(\n arg: ts.Expression | undefined,\n includes: Record<string, QueryBuilderSchema | boolean>,\n checker: ts.TypeChecker,\n options: QueryBuilderAnalyzerOptions,\n depth: number\n): void {\n if (!arg) {\n return;\n }\n\n // Handle object literal: { author: true, category: { select: [...] } }\n if (ts.isObjectLiteralExpression(arg)) {\n for (const prop of arg.properties) {\n if (!ts.isPropertyAssignment(prop) || !ts.isIdentifier(prop.name)) {\n continue;\n }\n\n const relationName = prop.name.text;\n const value = prop.initializer;\n\n if (value.kind === ts.SyntaxKind.TrueKeyword) {\n // Simple include: { author: true }\n includes[relationName] = true;\n } else if (ts.isObjectLiteralExpression(value)) {\n // Nested include with options: { category: { select: [...] } }\n const maxDepth = options.maxDepth ?? 5;\n if (depth < maxDepth) {\n const nestedSchema = parseNestedInclude(value, depth + 1);\n if (nestedSchema) {\n includes[relationName] = nestedSchema;\n }\n }\n }\n }\n }\n}","/**\n * Schema Builder from Query Builder Analysis\n * Converts QueryBuilderSchema into minimal OpenAPI 3.1 schemas\n */\n\nimport type { JsonSchema, SchemaContext } from \"./types.js\";\nimport { schemaFromEntity } from \"../../metal/schemaFromEntity.js\";\nimport { typeToJsonSchema } from \"./typeToJsonSchema.js\";\nimport type { QueryBuilderSchema } from \"./queryBuilderAnalyzer.js\";\nimport ts from \"typescript\";\n\nexport function buildSchemaFromQueryBuilder(\n querySchema: QueryBuilderSchema,\n entityType: ts.ObjectType,\n ctx: SchemaContext\n): JsonSchema | null {\n const baseSchema = schemaFromEntity(entityType as unknown as Function, {\n mode: \"read\",\n includeRelations: \"none\"\n });\n\n if (baseSchema && baseSchema.properties && Object.keys(baseSchema.properties).length > 0) {\n return buildFilteredSchemaFromBase(querySchema, baseSchema);\n }\n\n const entitySchema = typeToJsonSchema(entityType as ts.Type, ctx);\n \n if (entitySchema.properties && Object.keys(entitySchema.properties).length > 0) {\n return buildFilteredSchemaFromBase(querySchema, entitySchema);\n }\n\n return {};\n}\n\nfunction buildFilteredSchemaFromBase(\n querySchema: QueryBuilderSchema,\n baseSchema: JsonSchema\n): JsonSchema {\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n\n for (const field of querySchema.selectedFields) {\n if (baseSchema.properties?.[field]) {\n properties[field] = baseSchema.properties[field];\n\n if (baseSchema.required && baseSchema.required.includes(field)) {\n required.push(field);\n }\n }\n }\n\n for (const [relationName, includeSpec] of Object.entries(querySchema.includes)) {\n const relationSchema = handleRelationInclude(\n relationName,\n includeSpec,\n baseSchema,\n {} as SchemaContext\n );\n\n if (relationSchema) {\n properties[relationName] = relationSchema;\n\n if (baseSchema.required && baseSchema.required.includes(relationName)) {\n required.push(relationName);\n }\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/**\n * Handles a relation include specification\n */\nfunction handleRelationInclude(\n relationName: string,\n includeSpec: QueryBuilderSchema | boolean,\n _baseSchema: JsonSchema,\n _ctx: SchemaContext\n): JsonSchema | null {\n if (typeof includeSpec === \"boolean\") {\n return {\n type: \"object\",\n properties: {\n id: { type: \"integer\" }\n },\n required: [\"id\"]\n };\n } else {\n return {\n type: \"object\",\n properties: {\n id: { type: \"integer\" }\n },\n required: [\"id\"]\n };\n }\n}\n\n/**\n * Wraps a schema in PaginatedResult if needed\n */\nexport function wrapInPaginatedResult(schema: JsonSchema): JsonSchema {\n return {\n type: \"object\",\n properties: {\n items: {\n type: \"array\",\n items: schema\n },\n page: { type: \"integer\" },\n pageSize: { type: \"integer\" },\n totalItems: { type: \"integer\" }\n },\n required: [\"items\", \"page\", \"pageSize\", \"totalItems\"]\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","/**\r\n * Progress tracking utilities for the adorn-api CLI.\r\n * Provides structured progress output, timing, and build summaries.\r\n */\r\n\r\nimport process from \"node:process\";\r\n\r\n/**\r\n * Phase definition for progress tracking.\r\n */\r\nexport interface ProgressPhase {\r\n name: string;\r\n startTime: number;\r\n endTime?: number;\r\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Statistics collected during the build.\r\n */\r\nexport interface BuildStatistics {\r\n controllers: number;\r\n operations: number;\r\n schemas: number;\r\n sourceFiles: number;\r\n artifactsWritten: string[];\r\n}\r\n\r\n/**\r\n * Progress tracker for build operations.\r\n */\r\nexport class ProgressTracker {\r\n private phases: Map<string, ProgressPhase> = new Map();\r\n private startTime: number;\r\n private verbose: boolean = false;\r\n private quiet: boolean = false;\r\n private indentLevel: number = 0;\r\n\r\n constructor(options: { verbose?: boolean; quiet?: boolean } = {}) {\r\n this.verbose = options.verbose ?? false;\r\n this.quiet = options.quiet ?? false;\r\n this.startTime = performance.now();\r\n }\r\n\r\n /**\r\n * Start a new phase.\r\n */\r\n startPhase(name: string, message?: string): void {\r\n this.phases.set(name, {\r\n name,\r\n startTime: performance.now(),\r\n status: \"running\",\r\n message,\r\n });\r\n if (!this.quiet) {\r\n this.log(`● ${message || name}`);\r\n }\r\n }\r\n\r\n /**\n * Complete a phase successfully.\n */\n completePhase(name: string, message?: string): void {\n const phase = this.phases.get(name);\n if (phase) {\n phase.endTime = performance.now();\n phase.status = \"completed\";\n phase.message = message;\n }\n if (!this.quiet) {\n const elapsed = phase ? this.formatElapsed(phase.startTime, phase.endTime) : \"\";\n const status = this.verbose \n ? `✓ ${message || name} ${elapsed}`\n : `✓ ${message || name} ${elapsed}`;\n this.log(status);\n }\n }\n\r\n /**\r\n * Mark a phase as failed.\r\n */\r\n failPhase(name: string, message?: string): void {\r\n const phase = this.phases.get(name);\r\n if (phase) {\r\n phase.endTime = performance.now();\r\n phase.status = \"failed\";\r\n phase.message = message;\r\n }\r\n if (!this.quiet) {\r\n this.log(`✗ ${message || name}`);\r\n }\r\n }\r\n\r\n /**\r\n * Log a verbose message.\r\n */\r\n verboseLog(message: string): void {\r\n if (this.verbose && !this.quiet) {\r\n const elapsed = this.formatElapsed(this.startTime);\r\n this.log(`[${elapsed}] ${message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Log a regular message.\r\n */\r\n log(message: string): void {\r\n const indent = \" \".repeat(this.indentLevel);\r\n process.stdout.write(indent + message + \"\\n\");\r\n }\r\n\r\n /**\r\n * Log a sub-message (indented).\r\n */\r\n logSub(message: string): void {\r\n this.indentLevel++;\r\n this.log(message);\r\n this.indentLevel--;\r\n }\r\n\r\n /**\r\n * Get the total elapsed time in milliseconds.\r\n */\r\n getTotalElapsed(): number {\r\n return performance.now() - this.startTime;\r\n }\r\n\r\n /**\r\n * Format elapsed time as a human-readable string.\r\n */\r\n formatElapsed(startTime?: number, endTime?: number): string {\r\n const elapsed = (endTime ?? performance.now()) - (startTime ?? this.startTime);\r\n if (elapsed < 1) {\r\n return `${(elapsed * 1000).toFixed(0)}ms`;\r\n } else if (elapsed < 1000) {\r\n return `${elapsed.toFixed(0)}ms`;\r\n } else {\r\n return `${(elapsed / 1000).toFixed(2)}s`;\r\n }\r\n }\r\n\r\n /**\r\n * Get all completed phases with their timings.\r\n */\r\n getPhases(): ProgressPhase[] {\r\n return Array.from(this.phases.values());\r\n }\r\n\r\n /**\n * Print a build summary.\n */\n printSummary(stats: BuildStatistics): void {\n if (this.quiet) return;\n\n this.log(\"\");\n this.log(\"Build Summary:\");\n this.log(` Controllers: ${stats.controllers}`);\n this.log(` Operations: ${stats.operations}`);\n this.log(` Schemas: ${stats.schemas}`);\n this.log(` Source files: ${stats.sourceFiles}`);\n this.log(` Output dir: ${stats.artifactsWritten[0]?.split(\"/\").slice(0, -1).join(\"/\") || \".adorn\"}`);\n\n this.log(\"\");\n this.log(\"Timings:\");\n for (const phase of this.phases.values()) {\n if (phase.status === \"completed\" && phase.endTime) {\n const elapsed = phase.endTime - phase.startTime;\n const timeStr = elapsed < 1 \n ? `${(elapsed * 1000).toFixed(0)}ms`\n : elapsed < 1000 \n ? `${elapsed.toFixed(0)}ms`\n : `${(elapsed / 1000).toFixed(2)}s`;\n this.log(` ${phase.name.padEnd(20)} ${timeStr}`);\n }\n }\n this.log(` ${\"─\".repeat(21)}`);\n this.log(` Total time: ${this.formatElapsed()}`);\n this.log(\"\");\n }\n\r\n /**\r\n * Print artifact list.\r\n */\r\n printArtifacts(artifacts: Array<{ name: string; size?: number }>): void {\r\n if (this.quiet) return;\r\n \r\n this.log(\"Written artifacts:\");\r\n for (const artifact of artifacts) {\r\n const sizeStr = artifact.size \r\n ? ` (${artifact.size >= 1024 ? `${(artifact.size / 1024).toFixed(1)} KB` : `${artifact.size} B`})`\r\n : \"\";\r\n this.log(` ├── ${artifact.name}${sizeStr}`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Simple spinner for long-running operations.\r\n */\r\nexport class Spinner {\r\n private frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⢰\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\r\n private interval?: NodeJS.Timeout;\r\n private message: string;\r\n private current: number = 0;\r\n private total: number = 0;\r\n private customStatus?: string;\r\n\r\n constructor(message: string = \"\") {\r\n this.message = message;\r\n }\r\n\r\n /**\n * Start the spinner.\n */\n start(): void {\n let frameIndex = 0;\n this.interval = setInterval(() => {\n const frame = this.frames[frameIndex];\n let output: string;\n if (this.customStatus) {\n output = `\\r${frame} ${this.customStatus}`;\n } else if (this.total > 0) {\n output = `\\r${frame} ${this.message} (${this.current}/${this.total})`;\n } else {\n output = `\\r${frame} ${this.message}`;\n }\n process.stdout.write(output);\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n frameIndex = (frameIndex + 1) % this.frames.length;\n }, 80);\n }\n\r\n /**\r\n * Set progress counters.\r\n */\r\n setProgress(current: number, total: number): void {\r\n this.current = current;\r\n this.total = total;\r\n }\r\n\r\n /**\n * Set a custom status message (overrides counters).\n */\n setStatus(status: string): void {\n this.customStatus = status;\n // Write immediately to ensure update is visible\n const frame = this.frames[this.current];\n process.stdout.write(`\\r${frame} ${status}`);\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n }\n\r\n /**\r\n * Clear the custom status message.\r\n */\r\n clearStatus(): void {\r\n this.customStatus = undefined;\r\n }\r\n\r\n /**\n * Stop the spinner with a completion message.\n */\n stop(completedMessage?: string): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n // Clear the line\n process.stdout.write(\"\\r\" + \" \".repeat(60) + \"\\r\");\n if (completedMessage) {\n process.stdout.write(completedMessage + \"\\n\");\n }\n // Also flush to ensure output is visible\n if (process.stdout.writable) {\n process.stdout.write(\"\");\n }\n }\n\r\n /**\r\n * Stop the spinner with a failure message.\r\n */\r\n fail(failedMessage?: string): void {\r\n this.stop();\r\n if (failedMessage) {\r\n process.stdout.write(`✗ ${failedMessage}\\n`);\r\n }\r\n }\r\n}\r\n","/**\r\n * Smart OpenAPI Schema Partitioner\r\n * Automatically partitions schemas into optimal groups based on heuristics\r\n */\r\nimport type { Graph, NodeId } from \"../graph/types.js\";\r\nimport type { SchemaGraph } from \"../graph/schemaGraph.js\";\r\nimport type { JsonSchema } from \"./types.js\";\r\n\r\n/**\r\n * Partitioning strategy options\r\n */\r\nexport type PartitionStrategy = \r\n | 'auto' // Smart auto-detection (default)\r\n | 'none' // Single file\r\n | 'controller' // Group by controller domain\r\n | 'dependency' // Group by dependency graph\r\n | 'size'; // Group by size threshold\r\n\r\n/**\r\n * Schema complexity metrics\r\n */\r\nexport interface SchemaComplexity {\r\n propertyCount: number;\r\n nestedDepth: number;\r\n refCount: number;\r\n hasUnion: boolean;\r\n hasIntersection: boolean;\r\n hasEnum: boolean;\r\n jsonSize: number;\r\n}\r\n\r\n/**\r\n * A group of schemas for partitioning\r\n */\r\nexport interface SchemaGroup {\r\n name: string;\r\n schemas: Map<string, JsonSchema>;\r\n complexity: number;\r\n dependencies: string[];\r\n}\r\n\r\n/**\r\n * Partitioning result with metadata\r\n */\r\nexport interface PartitioningResult {\r\n shouldSplit: boolean;\r\n strategy: PartitionStrategy;\r\n groups: SchemaGroup[];\r\n recommendation: string;\r\n metrics: {\r\n totalSchemas: number;\r\n averageComplexity: number;\r\n avgDependencyDensity: number;\r\n controllerGroups: number;\r\n };\r\n}\r\n\r\n/**\r\n * Configuration for partitioning\r\n */\r\nexport interface PartitionerConfig {\r\n strategy?: PartitionStrategy;\r\n threshold?: number; // Min schemas to trigger split (default: 50)\r\n maxGroupSize?: number; // Max schemas per group (default: 50)\r\n complexityThreshold?: number; // High complexity threshold\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Default partitioner configuration\r\n */\r\nconst DEFAULT_CONFIG: Required<PartitionerConfig> = {\r\n strategy: 'auto',\r\n threshold: 50,\r\n maxGroupSize: 50,\r\n complexityThreshold: 10,\r\n verbose: false,\r\n};\r\n\r\n/**\r\n * Calculate complexity metrics for a schema\r\n */\r\nexport function calculateSchemaComplexity(schema: JsonSchema): SchemaComplexity {\r\n let propertyCount = 0;\r\n let nestedDepth = 0;\r\n let refCount = 0;\r\n let hasUnion = false;\r\n let hasIntersection = false;\r\n let hasEnum = false;\r\n \r\n const jsonSize = JSON.stringify(schema).length;\r\n \r\n const analyze = (s: JsonSchema, depth: number): void => {\r\n if (!s || typeof s !== 'object') return;\r\n \r\n nestedDepth = Math.max(nestedDepth, depth);\r\n \r\n if (s.type === 'object' && s.properties) {\r\n propertyCount += Object.keys(s.properties).length;\r\n for (const prop of Object.values(s.properties)) {\r\n analyze(prop as JsonSchema, depth + 1);\r\n }\r\n }\r\n \r\n if (s.$ref) refCount++;\r\n \r\n if (s.anyOf || s.oneOf) hasUnion = true;\r\n if (s.allOf) hasIntersection = true;\r\n if (s.enum) hasEnum = true;\r\n \r\n if (s.items) {\r\n analyze(s.items as JsonSchema, depth + 1);\r\n }\r\n };\r\n \r\n analyze(schema, 0);\r\n \r\n // Calculate complexity score\r\n const complexity = \r\n propertyCount * 1 +\r\n nestedDepth * 2 +\r\n refCount * 0.5 +\r\n (hasUnion ? 5 : 0) +\r\n (hasIntersection ? 5 : 0) +\r\n (hasEnum ? 1 : 0);\r\n \r\n return {\r\n propertyCount,\r\n nestedDepth,\r\n refCount,\r\n hasUnion,\r\n hasIntersection,\r\n hasEnum,\r\n jsonSize,\r\n };\r\n}\r\n\r\n/**\r\n * Count external $ref references in a schema\r\n */\r\nfunction countExternalRefs(\r\n schema: JsonSchema,\r\n allSchemas: Map<string, JsonSchema>\r\n): number {\r\n let count = 0;\r\n \r\n const analyze = (s: JsonSchema): void => {\r\n if (!s || typeof s !== 'object') return;\r\n \r\n if (s.$ref && typeof s.$ref === 'string') {\r\n const refName = s.$ref.replace('#/components/schemas/', '');\r\n if (refName && allSchemas.has(refName)) {\r\n count++;\r\n }\r\n }\r\n \r\n if (s.properties) {\r\n for (const prop of Object.values(s.properties)) {\r\n analyze(prop as JsonSchema);\r\n }\r\n }\r\n \r\n if (s.items) analyze(s.items as JsonSchema);\r\n if (s.anyOf) s.anyOf.forEach(analyze);\r\n if (s.oneOf) s.oneOf.forEach(analyze);\r\n if (s.allOf) s.allOf.forEach(analyze);\r\n };\r\n \r\n analyze(schema);\r\n return count;\r\n}\r\n\r\n/**\r\n * Analyze dependency density across all schemas\r\n */\r\nfunction analyzeDependencyDensity(\r\n schemas: Map<string, JsonSchema>\r\n): { avgDeps: number; maxDeps: number } {\r\n let totalDeps = 0;\r\n let maxDeps = 0;\r\n \r\n for (const schema of schemas.values()) {\r\n const deps = countExternalRefs(schema, schemas);\r\n totalDeps += deps;\r\n maxDeps = Math.max(maxDeps, deps);\r\n }\r\n \r\n return {\r\n avgDeps: schemas.size > 0 ? totalDeps / schemas.size : 0,\r\n maxDeps,\r\n };\r\n}\r\n\r\n/**\r\n * Partition schemas by controller domain\r\n */\r\nfunction partitionByController(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n const sharedSchemas: Map<string, JsonSchema> = new Map();\r\n \r\n // Default group for schemas not owned by any controller\r\n groups.set('_shared', sharedSchemas);\r\n \r\n // Analyze schema ownership by tracking usage in operations\r\n const schemaUsage: Map<string, Set<string>> = new Map();\r\n \r\n for (const [nodeId, node] of graph.nodes.entries()) {\r\n if (node.kind === 'Operation') {\r\n const opNode = node as any;\r\n const returnType = opNode.operation?.returnType;\r\n \r\n if (returnType && schemas.has(returnType)) {\r\n if (!schemaUsage.has(returnType)) {\r\n schemaUsage.set(returnType, new Set());\r\n }\r\n schemaUsage.get(returnType)!.add(node.metadata.name);\r\n }\r\n }\r\n }\r\n \r\n // Group schemas by primary controller usage\r\n for (const [schemaName, schema] of schemas.entries()) {\r\n const usage = schemaUsage.get(schemaName);\r\n \r\n if (!usage || usage.size === 0) {\r\n // No usage info, put in shared\r\n sharedSchemas.set(schemaName, schema);\r\n } else if (usage.size === 1) {\r\n // Used by exactly one controller, group by that controller\r\n const controllerName = Array.from(usage)[0].split(':')[0] || 'default';\r\n const groupName = controllerName.toLowerCase();\r\n \r\n if (!groups.has(groupName)) {\r\n groups.set(groupName, new Map());\r\n }\r\n groups.get(groupName)!.set(schemaName, schema);\r\n } else {\r\n // Used by multiple controllers, put in shared\r\n sharedSchemas.set(schemaName, schema);\r\n }\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n \r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Partition schemas by dependency graph\r\n */\r\nfunction partitionByDependency(\r\n schemas: Map<string, JsonSchema>,\r\n schemaGraph: SchemaGraph,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n \r\n // Find strongly connected components (circular dependencies)\r\n const sccs = schemaGraph.findStronglyConnectedComponents();\r\n \r\n // Group SCCs together, then add dependent nodes\r\n const processed = new Set<string>();\r\n \r\n for (const scc of sccs) {\r\n if (scc.length === 1 && processed.has(scc[0])) continue;\r\n \r\n const groupSchemas: Map<string, JsonSchema> = new Map();\r\n const groupName = `dependent-${groups.size + 1}`;\r\n \r\n for (const nodeId of scc) {\r\n const node = schemaGraph.getGraph().nodes.get(nodeId);\r\n if (node && node.kind === 'TypeDefinition') {\r\n const schemaName = node.metadata.name;\r\n if (schemas.has(schemaName)) {\r\n groupSchemas.set(schemaName, schemas.get(schemaName)!);\r\n processed.add(nodeId);\r\n }\r\n }\r\n }\r\n \r\n if (groupSchemas.size > 0) {\r\n groups.set(groupName, groupSchemas);\r\n }\r\n }\r\n \r\n // Handle remaining unprocessed schemas\r\n for (const [nodeId, node] of schemaGraph.getGraph().nodes.entries()) {\r\n if (processed.has(nodeId)) continue;\r\n if (node.kind !== 'TypeDefinition') continue;\r\n \r\n const schemaName = node.metadata.name;\r\n if (!schemas.has(schemaName)) continue;\r\n \r\n const groupSchemas: Map<string, JsonSchema> = new Map();\r\n groupSchemas.set(schemaName, schemas.get(schemaName)!);\r\n \r\n groups.set(`standalone-${groups.size + 1}`, groupSchemas);\r\n processed.add(nodeId);\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Partition schemas by size threshold\r\n */\r\nfunction partitionBySize(\r\n schemas: Map<string, JsonSchema>,\r\n config: Required<PartitionerConfig>\r\n): SchemaGroup[] {\r\n const sortedSchemas = Array.from(schemas.entries()).sort((a, b) => {\r\n const complexityA = calculateSchemaComplexity(a[1]).propertyCount;\r\n const complexityB = calculateSchemaComplexity(b[1]).propertyCount;\r\n return complexityB - complexityA; // Sort by complexity descending\r\n });\r\n \r\n const groups: Map<string, Map<string, JsonSchema>> = new Map();\r\n let currentGroup: Map<string, JsonSchema> = new Map();\r\n let currentCount = 0;\r\n let groupIndex = 1;\r\n \r\n for (const [schemaName, schema] of sortedSchemas) {\r\n if (currentCount >= config.maxGroupSize) {\r\n groups.set(`group-${groupIndex}`, currentGroup);\r\n currentGroup = new Map();\r\n currentCount = 0;\r\n groupIndex++;\r\n }\r\n \r\n currentGroup.set(schemaName, schema);\r\n currentCount++;\r\n }\r\n \r\n // Add remaining schemas\r\n if (currentCount > 0) {\r\n groups.set(`group-${groupIndex}`, currentGroup);\r\n }\r\n \r\n // Convert to SchemaGroup array\r\n return Array.from(groups.entries()).map(([name, schemaMap]) => {\r\n let totalComplexity = 0;\r\n const dependencies: string[] = [];\r\n \r\n for (const [schemaName, schema] of schemaMap.entries()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n const deps = countExternalRefs(schema, schemas);\r\n for (let i = 0; i < deps; i++) {\r\n dependencies.push(schemaName);\r\n }\r\n }\r\n \r\n return {\r\n name,\r\n schemas: schemaMap,\r\n complexity: totalComplexity,\r\n dependencies,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Determine best strategy using smart heuristics\r\n */\r\nfunction determineBestStrategy(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph,\r\n config: Required<PartitionerConfig>\r\n): PartitionStrategy {\r\n const schemaCount = schemas.size;\r\n const { avgDeps } = analyzeDependencyDensity(schemas);\r\n \r\n // Count controller groups\r\n let controllerGroups = 0;\r\n for (const node of graph.nodes.values()) {\r\n if (node.kind === 'Controller') {\r\n controllerGroups++;\r\n }\r\n }\r\n \r\n // Heuristic decision tree\r\n if (schemaCount < config.threshold) {\r\n return 'none';\r\n }\r\n \r\n if (avgDeps > 3) {\r\n // High inter-dependency → dependency-based\r\n return 'dependency';\r\n }\r\n \r\n if (controllerGroups > 1 && avgDeps < 2) {\r\n // Clear controller ownership with low coupling → controller-based\r\n return 'controller';\r\n }\r\n \r\n // Default to size-based\r\n return 'size';\r\n}\r\n\r\n/**\r\n * Main partitioning function with smart auto-detection\r\n */\r\nexport function partitionSchemas(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph,\r\n config: PartitionerConfig = {}\r\n): PartitioningResult {\r\n const finalConfig = { ...DEFAULT_CONFIG, ...config };\r\n const schemaCount = schemas.size;\r\n \r\n // Calculate metrics\r\n let totalComplexity = 0;\r\n let totalSchemas = 0;\r\n const { avgDeps } = analyzeDependencyDensity(schemas);\r\n \r\n let controllerGroups = 0;\r\n for (const node of graph.nodes.values()) {\r\n if (node.kind === 'Controller') {\r\n controllerGroups++;\r\n }\r\n }\r\n \r\n for (const schema of schemas.values()) {\r\n totalComplexity += calculateSchemaComplexity(schema).propertyCount;\r\n totalSchemas++;\r\n }\r\n \r\n const avgComplexity = totalSchemas > 0 ? totalComplexity / totalSchemas : 0;\r\n \r\n // Determine strategy\r\n let strategy = finalConfig.strategy;\r\n let recommendation = '';\r\n \r\n if (strategy === 'auto') {\r\n strategy = determineBestStrategy(schemas, graph, schemaGraph, finalConfig);\r\n \r\n // Generate recommendation message\r\n if (schemaCount < finalConfig.threshold) {\r\n recommendation = `Schema count (${schemaCount}) below threshold (${finalConfig.threshold}), single file optimal`;\r\n } else if (strategy === 'dependency') {\r\n recommendation = `High dependency density (${avgDeps.toFixed(2)} avg refs/schema), using dependency-based partitioning`;\r\n } else if (strategy === 'controller') {\r\n recommendation = `Found ${controllerGroups} controller groups with low coupling, using controller-based partitioning`;\r\n } else {\r\n recommendation = `Using size-based partitioning with max ${finalConfig.maxGroupSize} schemas per group`;\r\n }\r\n }\r\n \r\n // Perform partitioning based on strategy\r\n let groups: SchemaGroup[] = [];\r\n \r\n if (strategy === 'none') {\r\n groups = [{\r\n name: 'all',\r\n schemas: new Map(schemas),\r\n complexity: totalComplexity,\r\n dependencies: [],\r\n }];\r\n recommendation = recommendation || 'Single file mode (--split not specified)';\r\n } else if (strategy === 'controller') {\r\n groups = partitionByController(schemas, graph, finalConfig);\r\n } else if (strategy === 'dependency') {\r\n groups = partitionByDependency(schemas, schemaGraph, finalConfig);\r\n } else {\r\n groups = partitionBySize(schemas, finalConfig);\r\n }\r\n \r\n // Determine if we should actually split\r\n const shouldSplit = strategy !== 'none' && schemaCount >= finalConfig.threshold;\r\n \r\n return {\r\n shouldSplit,\r\n strategy,\r\n groups,\r\n recommendation,\r\n metrics: {\r\n totalSchemas: schemaCount,\r\n averageComplexity: avgComplexity,\r\n avgDependencyDensity: avgDeps,\r\n controllerGroups,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Export partitioner class for advanced use cases\r\n */\r\nexport class SchemaPartitioner {\r\n private config: Required<PartitionerConfig>;\r\n \r\n constructor(config: PartitionerConfig = {}) {\r\n this.config = { ...DEFAULT_CONFIG, ...config };\r\n }\r\n \r\n /**\r\n * Partition schemas with the configured strategy\r\n */\r\n partition(\r\n schemas: Map<string, JsonSchema>,\r\n graph: Graph,\r\n schemaGraph: SchemaGraph\r\n ): PartitioningResult {\r\n return partitionSchemas(schemas, graph, schemaGraph, this.config);\r\n }\r\n \r\n /**\r\n * Set the partitioning strategy\r\n */\r\n setStrategy(strategy: PartitionStrategy): void {\r\n this.config.strategy = strategy;\r\n }\r\n \r\n /**\r\n * Get current configuration\r\n */\r\n getConfig(): Readonly<Required<PartitionerConfig>> {\r\n return this.config;\r\n }\r\n}\r\n","/**\r\n * Modular OpenAPI Generator\r\n * Generates split OpenAPI files with $ref pointers to external schema files\r\n */\r\nimport { writeFileSync, mkdirSync, existsSync, readFileSync } from \"node:fs\";\r\nimport { resolve, dirname } from \"node:path\";\r\nimport type { JsonSchema } from \"./types.js\";\r\nimport type { OpenAPI31 } from \"./openapi.js\";\r\nimport type { PartitioningResult, SchemaGroup } from \"./partitioner.js\";\r\n\r\n/**\n * Progress callback for modular OpenAPI generation\n */\nexport interface ModularProgressCallback {\n (step: string, index: number, total: number): void;\n}\n\n/**\n * Configuration for modular OpenAPI generation\n */\nexport interface SplitOpenAPIConfig {\n outputDir: string;\n schemasDir?: string; // Relative to outputDir (default: \"schemas\")\n createIndexFile?: boolean; // Create index.json with all refs (default: true)\n prettyPrint?: boolean; // Pretty print JSON (default: true)\n onProgress?: ModularProgressCallback; // Progress callback\n}\n\r\n/**\r\n * Result of modular OpenAPI generation\r\n */\r\nexport interface SplitOpenAPIResult {\r\n mainSpec: string; // Path to main openapi.json\r\n schemaFiles: string[]; // Paths to generated schema files\r\n indexFile?: string; // Path to index file (if created)\r\n totalSize: number; // Total bytes written\r\n splitEnabled: boolean; // Whether splitting was applied\r\n}\r\n\r\n/**\r\n * Sanitize schema name for use in filename\r\n */\r\nfunction sanitizeFilename(name: string): string {\r\n return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\r\n}\r\n\r\n/**\r\n * Generate a schema file name from group name\r\n */\r\nfunction getSchemaFilename(group: SchemaGroup): string {\r\n const name = sanitizeFilename(group.name);\r\n return `schemas/${name}.json`;\r\n}\r\n\r\n/**\r\n * Collect all schemas from groups into a single map\r\n */\r\nfunction collectAllSchemas(groups: SchemaGroup[]): Map<string, { schema: JsonSchema; group: string }> {\r\n const result = new Map<string, { schema: JsonSchema; group: string }>();\r\n \r\n for (const group of groups) {\r\n for (const [schemaName, schema] of group.schemas.entries()) {\r\n result.set(schemaName, { schema, group: group.name });\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Convert $ref from inline to external reference\r\n */\r\nfunction convertToExternalRef(\r\n schema: JsonSchema,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): JsonSchema {\r\n if (!schema || typeof schema !== 'object') return schema;\r\n \r\n const result: Record<string, unknown> = { ...schema };\r\n \r\n // Convert $ref to external reference\r\n if (schema.$ref && typeof schema.$ref === 'string') {\r\n const refName = schema.$ref.replace('#/components/schemas/', '');\r\n if (refName && schemaMap.has(refName)) {\r\n const target = schemaMap.get(refName)!;\r\n const filename = sanitizeFilename(target.group);\r\n result.$ref = `schemas/${filename}.json#/components/schemas/${refName}`;\r\n }\r\n }\r\n \r\n // Recursively process nested schemas\r\n const nestedProps = ['properties', 'items', 'additionalProperties'];\r\n for (const prop of nestedProps) {\r\n if (prop in result) {\r\n const value = result[prop];\r\n if (Array.isArray(value)) {\r\n result[prop] = value.map(item => \r\n typeof item === 'object' ? convertToExternalRef(item as JsonSchema, schemaMap) : item\r\n );\r\n } else if (typeof value === 'object' && value !== null) {\r\n result[prop] = convertToExternalRef(value as JsonSchema, schemaMap);\r\n }\r\n }\r\n }\r\n \r\n // Process schema arrays (anyOf, oneOf, allOf)\r\n const arrayProps = ['anyOf', 'oneOf', 'allOf'];\r\n for (const prop of arrayProps) {\r\n if (prop in result && Array.isArray(result[prop])) {\r\n result[prop] = (result[prop] as unknown[]).map(item =>\r\n typeof item === 'object' ? convertToExternalRef(item as JsonSchema, schemaMap) : item\r\n );\r\n }\r\n }\r\n \r\n return result as JsonSchema;\r\n}\r\n\r\n/**\r\n * Generate individual schema file content\r\n */\r\nfunction generateSchemaFileContent(\r\n group: SchemaGroup,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): Record<string, JsonSchema> {\r\n const content: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName, schema] of group.schemas.entries()) {\r\n content[schemaName] = convertToExternalRef(schema, schemaMap);\r\n }\r\n \r\n return content;\r\n}\r\n\r\n/**\r\n * Generate schema index file with all $ref mappings\r\n */\r\nfunction generateSchemaIndex(\r\n groups: SchemaGroup[],\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>\r\n): Record<string, Record<string, { $ref: string }>> {\r\n const index: Record<string, Record<string, { $ref: string }>> = {\r\n schemas: {},\r\n };\r\n \r\n for (const [schemaName, { group }] of schemaMap.entries()) {\r\n const filename = sanitizeFilename(group);\r\n index.schemas![schemaName] = {\r\n $ref: `schemas/${filename}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n return index;\r\n}\r\n\r\n/**\n * Generate modular OpenAPI specification with split schema files\n */\nexport function generateModularOpenAPI(\n openapi: OpenAPI31,\n partitioning: PartitioningResult,\n config: SplitOpenAPIConfig\n): SplitOpenAPIResult {\n const {\n outputDir,\n schemasDir = \"schemas\",\n createIndexFile = true,\n prettyPrint = true,\n onProgress,\n } = config;\n \n const indent = prettyPrint ? 2 : 0;\n let totalSize = 0;\n const schemaFiles: string[] = [];\n \n // Ensure output directory exists\n mkdirSync(outputDir, { recursive: true });\n \n // If not splitting, just write the main file\n if (!partitioning.shouldSplit || partitioning.groups.length === 1) {\n if (onProgress) {\n onProgress(\"Writing single OpenAPI file\", 1, 1);\n }\n const mainPath = resolve(outputDir, \"openapi.json\");\n writeFileSync(mainPath, JSON.stringify(openapi, null, indent));\n totalSize = Buffer.byteLength(JSON.stringify(openapi));\n \n return {\n mainSpec: mainPath,\n schemaFiles: [],\n totalSize,\n splitEnabled: false,\n };\n }\n \n // Create schemas directory\n const schemasPath = resolve(outputDir, schemasDir);\n mkdirSync(schemasPath, { recursive: true });\n \n if (onProgress) {\n onProgress(\"Creating schemas directory\", 0, partitioning.groups.length + 2);\n }\n \n // Collect all schemas with their groups\n const schemaMap = collectAllSchemas(partitioning.groups);\n \n // Generate individual schema files\n const schemaToFile: Map<string, string> = new Map();\n \n for (let i = 0; i < partitioning.groups.length; i++) {\n const group = partitioning.groups[i];\n if (onProgress) {\n onProgress(`Writing schema group ${group.name} (${group.schemas.size} schemas)`, i + 1, partitioning.groups.length + 2);\n }\n const filename = getSchemaFilename(group);\r\n const filePath = resolve(outputDir, filename);\r\n \r\n const content = generateSchemaFileContent(group, schemaMap);\r\n writeFileSync(filePath, JSON.stringify(content, null, indent));\r\n \r\n for (const schemaName of group.schemas.keys()) {\r\n schemaToFile.set(schemaName, filename);\r\n }\r\n \r\n schemaFiles.push(filePath);\r\n totalSize += Buffer.byteLength(JSON.stringify(content));\r\n }\r\n \r\n // Generate index file if requested\n let indexFile: string | undefined;\n if (createIndexFile) {\n if (onProgress) {\n onProgress(\"Generating index file\", partitioning.groups.length + 1, partitioning.groups.length + 2);\n }\n const indexPath = resolve(outputDir, \"schemas/index.json\");\n const indexContent = generateSchemaIndex(partitioning.groups, schemaMap);\n writeFileSync(indexPath, JSON.stringify(indexContent, null, indent));\n totalSize += Buffer.byteLength(JSON.stringify(indexContent));\n indexFile = indexPath;\n }\n \n // Generate main openapi.json with $ref pointers\n if (onProgress) {\n onProgress(\"Generating main OpenAPI spec\", partitioning.groups.length + 2, partitioning.groups.length + 2);\n }\n const mainSpec = generateMainSpec(openapi, schemaMap, schemaToFile);\n const mainPath = resolve(outputDir, \"openapi.json\");\n writeFileSync(mainPath, JSON.stringify(mainSpec, null, indent));\n totalSize += Buffer.byteLength(JSON.stringify(mainSpec));\n \r\n return {\r\n mainSpec: mainPath,\r\n schemaFiles,\r\n indexFile,\r\n totalSize,\r\n splitEnabled: true,\r\n };\r\n}\r\n\r\n/**\r\n * Extended OpenAPI type with x-* properties for split mode\r\n */\r\ninterface ExtendedOpenAPI31 extends OpenAPI31 {\r\n 'x-original-schemas'?: number;\r\n 'x-split-enabled'?: boolean;\r\n 'x-schema-files'?: string[];\r\n}\r\n\r\n/**\r\n * Generate main OpenAPI spec with external $ref pointers\r\n */\r\nfunction generateMainSpec(\r\n original: OpenAPI31,\r\n schemaMap: Map<string, { schema: JsonSchema; group: string }>,\r\n schemaToFile: Map<string, string>\r\n): ExtendedOpenAPI31 {\r\n // Build components.schemas with $ref pointers\r\n const schemas: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName, { group }] of schemaMap.entries()) {\r\n const filename = sanitizeFilename(group);\r\n schemas[schemaName] = {\r\n $ref: `schemas/${filename}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n // Create new OpenAPI spec with split schemas\r\n return {\r\n ...original,\r\n components: {\r\n ...original.components,\r\n schemas,\r\n },\r\n 'x-original-schemas': Object.keys(schemaMap).length,\r\n 'x-split-enabled': true,\r\n 'x-schema-files': Array.from(new Set(schemaToFile.values())),\r\n };\r\n}\r\n\r\n/**\r\n * Generate a lightweight OpenAPI spec that references external files\r\n * This is useful for Swagger UI lazy loading\r\n */\r\nexport function generateLazyOpenAPI(\r\n openapi: OpenAPI31,\r\n partitioning: PartitioningResult\r\n): OpenAPI31 {\r\n if (!partitioning.shouldSplit || partitioning.groups.length === 1) {\r\n return openapi;\r\n }\r\n \r\n const schemaMap = collectAllSchemas(partitioning.groups);\r\n \r\n // Only include minimal info in main spec\r\n const minimalSchemas: Record<string, JsonSchema> = {};\r\n \r\n for (const [schemaName] of schemaMap.entries()) {\r\n minimalSchemas[schemaName] = {\r\n $ref: `schemas/${schemaName.toLowerCase()}.json#/components/schemas/${schemaName}`,\r\n };\r\n }\r\n \r\n return {\r\n ...openapi,\r\n components: {\r\n ...openapi.components,\r\n schemas: minimalSchemas,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Get the file path for a schema group\r\n */\r\nexport function getSchemaFilePath(\r\n groupName: string,\r\n outputDir: string,\r\n schemasDir: string = \"schemas\"\r\n): string {\r\n const filename = sanitizeFilename(groupName);\r\n return resolve(outputDir, schemasDir, `${filename}.json`);\r\n}\r\n\r\n/**\r\n * Check if a schema exists in a specific file\r\n */\r\nexport function schemaExistsInFile(\r\n schemaName: string,\r\n outputDir: string,\r\n groupName: string\r\n): boolean {\r\n const filePath = getSchemaFilePath(groupName, outputDir);\r\n \r\n if (!existsSync(filePath)) {\r\n return false;\r\n }\r\n \r\n try {\r\n const content = JSON.parse(readFileSync(filePath, 'utf-8'));\r\n return schemaName in content;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","/**\n * Graph-Based Intermediate Representation (GBIR) type definitions.\n * Provides the core data structures for the graph-based compiler architecture.\n */\n\n/**\n * Unique identifier for a node in the graph\n */\nexport type NodeId = string;\n\n/**\n * All possible node kinds in the compiler graph\n */\nexport type NodeKind =\n | 'TypeDefinition'\n | 'Controller'\n | 'Operation'\n | 'Parameter'\n | 'SchemaComponent'\n | 'Validator'\n | 'Interface'\n | 'Enum'\n | 'Union'\n | 'Intersection';\n\n/**\n * Relationship types between graph nodes\n */\nexport type EdgeRelation =\n | 'uses' // Type usage relationship\n | 'extends' // Inheritance/extension\n | 'implements' // Interface implementation\n | 'validates' // Schema validation\n | 'references' // Cross-reference\n | 'dependsOn' // Dependency\n | 'generates' // Output generation\n | 'annotates' // Decorator/annotation\n | 'contains'; // Containment (parent-child)\n\n/**\n * Edge in the graph with metadata\n */\nexport interface GraphEdge {\n targetId: NodeId;\n relation: EdgeRelation;\n properties?: Record<string, unknown>;\n weight?: number;\n}\n\n/**\n * Source location for debugging and error reporting\n */\nexport interface SourceLocation {\n filePath: string;\n line: number;\n column: number;\n}\n\n/**\n * Node metadata shared across all node types\n */\nexport interface NodeMetadata {\n name: string;\n sourceLocation: SourceLocation;\n tags?: Set<string>;\n annotations?: Map<string, unknown>;\n}\n\n/**\n * Base interface for all graph nodes\n */\nexport interface GraphNode {\n id: NodeId;\n kind: NodeKind;\n metadata: NodeMetadata;\n edges: GraphEdge[];\n}\n\n/**\n * Type definition node (class, interface, type alias)\n */\nexport interface TypeDefinitionNode extends GraphNode {\n kind: 'TypeDefinition';\n typeDef: {\n isGeneric: boolean;\n typeParameters?: string[];\n properties?: Map<string, NodeId>;\n };\n}\n\n/**\n * Controller node representing a controller class\n */\nexport interface ControllerNode extends GraphNode {\n kind: 'Controller';\n controller: {\n basePath: string;\n consumes?: string[];\n produces?: string[];\n };\n}\n\n/**\n * Operation node representing an HTTP endpoint\n */\nexport interface OperationNode extends GraphNode {\n kind: 'Operation';\n operation: {\n httpMethod: string;\n path: string;\n operationId: string;\n returnType: NodeId;\n };\n}\n\n/**\n * Parameter node for operation parameters\n */\nexport interface ParameterNode extends GraphNode {\n kind: 'Parameter';\n parameter: {\n index: number;\n location: 'path' | 'query' | 'body' | 'header' | 'cookie';\n type: NodeId;\n isOptional: boolean;\n };\n}\n\n/**\n * Schema component node (for OpenAPI/JSON Schema components)\n */\nexport interface SchemaComponentNode extends GraphNode {\n kind: 'SchemaComponent';\n schema: {\n schemaType: 'object' | 'array' | 'primitive' | 'enum' | 'union' | 'intersection';\n definition: unknown; // JsonSchema\n isExternal: boolean;\n };\n}\n\n/**\n * Validator node for runtime validation\n */\nexport interface ValidatorNode extends GraphNode {\n kind: 'Validator';\n validator: {\n schemaRef: NodeId;\n mode: 'ajv-runtime' | 'precompiled';\n };\n}\n\n/**\n * Interface definition node\n */\nexport interface InterfaceNode extends GraphNode {\n kind: 'Interface';\n interfaceDef: {\n methods?: Map<string, NodeId>;\n };\n}\n\n/**\n * Enum definition node\n */\nexport interface EnumNode extends GraphNode {\n kind: 'Enum';\n enumDef: {\n values: string[];\n };\n}\n\n/**\n * Union type node\n */\nexport interface UnionNode extends GraphNode {\n kind: 'Union';\n union: {\n types: NodeId[];\n };\n}\n\n/**\n * Intersection type node\n */\nexport interface IntersectionNode extends GraphNode {\n kind: 'Intersection';\n intersection: {\n types: NodeId[];\n };\n}\n\n/**\n * Union type for all possible graph nodes\n */\nexport type AnyNode =\n | TypeDefinitionNode\n | ControllerNode\n | OperationNode\n | ParameterNode\n | SchemaComponentNode\n | ValidatorNode\n | InterfaceNode\n | EnumNode\n | UnionNode\n | IntersectionNode;\n\n/**\n * The main graph structure containing nodes and relationships\n */\nexport interface Graph {\n nodes: Map<NodeId, AnyNode>;\n roots: Set<NodeId>;\n version: string;\n metadata: {\n createdAt: string;\n generatedBy: string;\n tsVersion?: string;\n };\n}\n\n/**\n * Create a new empty graph\n */\nexport function createGraph(tsVersion?: string): Graph {\n return {\n nodes: new Map(),\n roots: new Set(),\n version: '1.0.0',\n metadata: {\n createdAt: new Date().toISOString(),\n generatedBy: 'adorn-api-gems',\n tsVersion,\n },\n };\n}\n\n/**\n * Generate a unique node ID\n */\nexport function generateNodeId(kind: NodeKind, name: string): NodeId {\n return `${kind}:${name}:${Date.now()}:${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Add a node to the graph\n */\nexport function addNode(graph: Graph, node: AnyNode): void {\n graph.nodes.set(node.id, node);\n}\n\n/**\n * Remove a node from the graph\n */\nexport function removeNode(graph: Graph, nodeId: NodeId): void {\n const node = graph.nodes.get(nodeId);\n if (!node) return;\n\n graph.nodes.delete(nodeId);\n graph.roots.delete(nodeId);\n\n for (const [id, otherNode] of graph.nodes.entries()) {\n otherNode.edges = otherNode.edges.filter(edge => edge.targetId !== nodeId);\n }\n}\n\n/**\n * Add an edge between two nodes\n */\nexport function addEdge(\n graph: Graph,\n sourceId: NodeId,\n targetId: NodeId,\n relation: EdgeRelation,\n properties?: Record<string, unknown>\n): void {\n const sourceNode = graph.nodes.get(sourceId);\n if (!sourceNode) {\n throw new Error(`Source node ${sourceId} not found`);\n }\n\n const targetExists = graph.nodes.has(targetId);\n if (!targetExists) {\n throw new Error(`Target node ${targetId} not found`);\n }\n\n sourceNode.edges.push({\n targetId,\n relation,\n properties,\n });\n}\n\n/**\n * Get all nodes of a specific kind\n */\nexport function getNodesByKind<T extends AnyNode>(\n graph: Graph,\n kind: T['kind']\n): T[] {\n return Array.from(graph.nodes.values())\n .filter(node => node.kind === kind) as T[];\n}\n\n/**\n * Get all edges of a specific relation type\n */\nexport function getEdgesByRelation(\n graph: Graph,\n relation: EdgeRelation\n): { sourceId: NodeId; edge: GraphEdge }[] {\n const edges: { sourceId: NodeId; edge: GraphEdge }[] = [];\n\n for (const [id, node] of graph.nodes.entries()) {\n for (const edge of node.edges) {\n if (edge.relation === relation) {\n edges.push({ sourceId: id, edge });\n }\n }\n }\n\n return edges;\n}\n","/**\n * Graph builder that converts CST/AST to graph-based IR.\n * Creates typed nodes and establishes relationships between them.\n */\nimport ts from \"typescript\";\nimport type { \n Graph, \n AnyNode, \n ControllerNode, \n OperationNode, \n ParameterNode, \n TypeDefinitionNode,\n NodeKind \n} from \"./types.js\";\nimport {\n createGraph,\n generateNodeId,\n addNode,\n addEdge,\n getNodesByKind\n} from \"./types.js\";\n\n/**\n * Builder context for constructing the graph\n */\nexport interface GraphBuilderContext {\n graph: Graph;\n checker: ts.TypeChecker;\n sourceFiles: ts.SourceFile[];\n nodeMap: Map<ts.Node, string>; // Maps AST nodes to graph node IDs\n}\n\n/**\n * Create a new graph builder context\n */\nexport function createGraphBuilderContext(\n checker: ts.TypeChecker,\n sourceFiles: ts.SourceFile[],\n tsVersion?: string\n): GraphBuilderContext {\n return {\n graph: createGraph(tsVersion),\n checker,\n sourceFiles,\n nodeMap: new Map(),\n };\n}\n\n/**\n * Build the graph from source files\n */\nexport function buildGraph(context: GraphBuilderContext): Graph {\n for (const sourceFile of context.sourceFiles) {\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isClassDeclaration(node) && node.name) {\n if (isControllerClass(node)) {\n buildControllerNode(node, context);\n } else {\n buildTypeDefinitionNode(node, context);\n }\n } else if (ts.isInterfaceDeclaration(node) && node.name) {\n buildInterfaceNode(node, context);\n } else if (ts.isTypeAliasDeclaration(node) && node.name) {\n buildTypeAliasNode(node, context);\n } else if (ts.isEnumDeclaration(node) && node.name) {\n buildEnumNode(node, context);\n }\n });\n }\n\n return context.graph;\n}\n\n/**\n * Check if a class is decorated with @Controller\n */\nfunction isControllerClass(node: ts.ClassDeclaration): boolean {\n const decorators = ts.getDecorators(node);\n if (!decorators) return false;\n\n return decorators.some(decorator => {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n return ts.isIdentifier(expr) && expr.text === \"Controller\";\n }\n return false;\n });\n}\n\n/**\n * Build a controller node from a class declaration\n */\nfunction buildControllerNode(\n node: ts.ClassDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const controllerId = generateNodeId('Controller', node.name.text);\n\n const controllerNode: ControllerNode = {\n id: controllerId,\n kind: 'Controller',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['controller']),\n },\n edges: [],\n controller: {\n basePath: extractControllerPath(node) || '/',\n consumes: extractClassConsumes(node),\n produces: extractClassProduces(node),\n },\n };\n\n addNode(context.graph, controllerNode);\n context.nodeMap.set(node, controllerId);\n context.graph.roots.add(controllerId);\n\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member) && member.name) {\n const operationId = buildOperationNode(member, controllerId, context);\n if (operationId) {\n addEdge(context.graph, controllerId, operationId, 'contains');\n }\n }\n }\n}\n\n/**\n * Build an operation node from a method declaration\n */\nfunction buildOperationNode(\n node: ts.MethodDeclaration,\n controllerId: string,\n context: GraphBuilderContext\n): string | 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 const decorators = ts.getDecorators(node);\n if (decorators) {\n for (const decorator of decorators) {\n if (ts.isCallExpression(decorator.expression)) {\n const expr = decorator.expression.expression;\n if (ts.isIdentifier(expr) && httpMethods.includes(expr.text)) {\n httpMethod = expr.text.toUpperCase();\n path = extractDecoratorStringArg(decorator) || '/';\n break;\n }\n }\n }\n }\n\n if (!httpMethod) return null;\n\n const signature = context.checker.getSignatureFromDeclaration(node);\n if (!signature) return null;\n\n const operationId = generateNodeId('Operation', methodName);\n\n const operationNode: OperationNode = {\n id: operationId,\n kind: 'Operation',\n metadata: {\n name: methodName,\n sourceLocation: getLocation(node, context),\n tags: new Set(['operation']),\n },\n edges: [],\n operation: {\n httpMethod,\n path,\n operationId: `${methodName}_${httpMethod.toLowerCase()}`,\n returnType: '', // Will be filled in type resolution\n },\n };\n\n addNode(context.graph, operationNode);\n context.nodeMap.set(node, operationId);\n\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 : `param${i}`;\n const paramId = buildParameterNode(param, i, paramName, context);\n \n if (paramId) {\n addEdge(context.graph, operationId, paramId, 'contains');\n }\n }\n\n return operationId;\n}\n\n/**\n * Build a parameter node from a parameter declaration\n */\nfunction buildParameterNode(\n node: ts.ParameterDeclaration,\n index: number,\n name: string,\n context: GraphBuilderContext\n): string | null {\n const paramId = generateNodeId('Parameter', name);\n \n const paramNode: ParameterNode = {\n id: paramId,\n kind: 'Parameter',\n metadata: {\n name,\n sourceLocation: getLocation(node, context),\n },\n edges: [],\n parameter: {\n index,\n location: 'path',\n type: '', // Will be filled in type resolution\n isOptional: !!node.questionToken || !!node.initializer,\n },\n };\n\n addNode(context.graph, paramNode);\n context.nodeMap.set(node, paramId);\n\n // Add edge to type definition (will be resolved later)\n const typeId = generateNodeId('TypeDefinition', 'unknown');\n addEdge(context.graph, paramId, typeId, 'uses');\n\n return paramId;\n}\n\n/**\n * Build a type definition node from a class declaration\n */\nfunction buildTypeDefinitionNode(\n node: ts.ClassDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'class']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n typeParameters: node.typeParameters?.map(tp => \n ts.isIdentifier(tp.name) ? tp.name.text : 'T'\n ),\n properties: new Map(),\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build an interface node\n */\nfunction buildInterfaceNode(\n node: ts.InterfaceDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('Interface', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'interface']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n typeParameters: node.typeParameters?.map(tp => \n ts.isIdentifier(tp.name) ? tp.name.text : 'T'\n ),\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build a type alias node\n */\nfunction buildTypeAliasNode(\n node: ts.TypeAliasDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'alias']),\n },\n edges: [],\n typeDef: {\n isGeneric: node.typeParameters !== undefined && node.typeParameters.length > 0,\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Build an enum node\n */\nfunction buildEnumNode(\n node: ts.EnumDeclaration,\n context: GraphBuilderContext\n): void {\n if (!node.name) return;\n\n const typeId = generateNodeId('TypeDefinition', node.name.text);\n\n const typeNode: TypeDefinitionNode = {\n id: typeId,\n kind: 'TypeDefinition',\n metadata: {\n name: node.name.text,\n sourceLocation: getLocation(node, context),\n tags: new Set(['type', 'enum']),\n },\n edges: [],\n typeDef: {\n isGeneric: false,\n },\n };\n\n addNode(context.graph, typeNode);\n context.nodeMap.set(node, typeId);\n}\n\n/**\n * Get source location from a node\n */\nfunction getLocation(\n node: ts.Node,\n context: GraphBuilderContext\n): { filePath: string; line: number; column: number } {\n const sourceFile = node.getSourceFile();\n const pos = node.getStart();\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n \n return {\n filePath: sourceFile.fileName,\n line: line + 1,\n column: character + 1,\n };\n}\n\n/**\n * Extract controller base path from decorator\n */\nfunction extractControllerPath(node: ts.ClassDeclaration): string | 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 === \"Controller\") {\n return extractDecoratorStringArg(decorator);\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract string argument from decorator\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 * Extract @Consumes decorator content types\n */\nfunction extractClassConsumes(node: ts.ClassDeclaration): string[] | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\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 === \"Consumes\") {\n const arg = decorator.expression.arguments[0];\n if (ts.isStringLiteral(arg)) {\n return [arg.text];\n }\n if (ts.isArrayLiteralExpression(arg)) {\n return arg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract @Produces decorator content types\n */\nfunction extractClassProduces(node: ts.ClassDeclaration): string[] | undefined {\n const decorators = ts.getDecorators(node);\n if (!decorators) return undefined;\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 === \"Produces\") {\n const arg = decorator.expression.arguments[0];\n if (ts.isStringLiteral(arg)) {\n return [arg.text];\n }\n if (ts.isArrayLiteralExpression(arg)) {\n return arg.elements\n .filter(ts.isStringLiteral)\n .map(e => e.text);\n }\n }\n }\n }\n\n return undefined;\n}\n","/**\n * Schema graph operations for advanced schema management.\n * Provides graph algorithms for schema optimization and analysis.\n */\nimport type { Graph, NodeId, EdgeRelation } from \"./types.js\";\nimport { addEdge, getEdgesByRelation } from \"./types.js\";\n\n/**\n * Schema-specific graph with advanced operations\n */\nexport class SchemaGraph {\n private graph: Graph;\n private adjacency: Map<NodeId, Set<NodeId>> = new Map();\n private reverseAdjacency: Map<NodeId, Set<NodeId>> = new Map();\n\n constructor(graph: Graph) {\n this.graph = graph;\n this.buildAdjacencyLists();\n }\n\n /**\n * Build adjacency lists for faster traversal\n */\n private buildAdjacencyLists(): void {\n for (const [id, node] of this.graph.nodes.entries()) {\n this.adjacency.set(id, new Set());\n this.reverseAdjacency.set(id, new Set());\n }\n\n for (const [sourceId, node] of this.graph.nodes.entries()) {\n for (const edge of node.edges) {\n this.adjacency.get(sourceId)?.add(edge.targetId);\n this.reverseAdjacency.get(edge.targetId)?.add(sourceId);\n }\n }\n }\n\n /**\n * Find all nodes that use a given type\n */\n findTypeUsages(typeId: NodeId): NodeId[] {\n const usages: NodeId[] = [];\n const usesEdges = getEdgesByRelation(this.graph, 'uses');\n\n for (const { sourceId, edge } of usesEdges) {\n if (edge.targetId === typeId) {\n usages.push(sourceId);\n }\n }\n\n return usages;\n }\n\n /**\n * Detect cycles in the dependency graph\n */\n detectCycles(): CycleReport {\n const visited = new Set<NodeId>();\n const recursionStack = new Set<NodeId>();\n const cycles: NodeId[][] = [];\n\n for (const nodeId of this.graph.nodes.keys()) {\n if (!visited.has(nodeId)) {\n this.detectCyclesDFS(nodeId, visited, recursionStack, [], cycles);\n }\n }\n\n return {\n hasCycles: cycles.length > 0,\n cycles,\n cycleCount: cycles.length,\n };\n }\n\n /**\n * Depth-first search for cycle detection\n */\n private detectCyclesDFS(\n nodeId: NodeId,\n visited: Set<NodeId>,\n recursionStack: Set<NodeId>,\n path: NodeId[],\n cycles: NodeId[][]\n ): void {\n visited.add(nodeId);\n recursionStack.add(nodeId);\n path.push(nodeId);\n\n const neighbors = this.adjacency.get(nodeId) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n this.detectCyclesDFS(neighbor, visited, recursionStack, path, cycles);\n } else if (recursionStack.has(neighbor)) {\n // Found a cycle\n const cycleStart = path.indexOf(neighbor);\n cycles.push([...path.slice(cycleStart), neighbor]);\n }\n }\n\n recursionStack.delete(nodeId);\n path.pop();\n }\n\n /**\n * Find strongly connected components using Tarjan's algorithm\n */\n findStronglyConnectedComponents(): NodeId[][] {\n let index = 0;\n const stack: NodeId[] = [];\n const indices = new Map<NodeId, number>();\n const lowlinks = new Map<NodeId, number>();\n const onStack = new Set<NodeId>();\n const sccs: NodeId[][] = [];\n\n const strongConnect = (v: NodeId): void => {\n indices.set(v, index);\n lowlinks.set(v, index);\n index++;\n stack.push(v);\n onStack.add(v);\n\n const neighbors = this.adjacency.get(v) || new Set();\n for (const w of neighbors) {\n if (!indices.has(w)) {\n strongConnect(w);\n lowlinks.set(v, Math.min(lowlinks.get(v)!, lowlinks.get(w)!));\n } else if (onStack.has(w)) {\n lowlinks.set(v, Math.min(lowlinks.get(v)!, indices.get(w)!));\n }\n }\n\n if (lowlinks.get(v) === indices.get(v)) {\n const scc: NodeId[] = [];\n let w: NodeId | undefined;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n scc.push(w);\n } while (w !== v);\n sccs.push(scc);\n }\n };\n\n for (const nodeId of this.graph.nodes.keys()) {\n if (!indices.has(nodeId)) {\n strongConnect(nodeId);\n }\n }\n\n return sccs;\n }\n\n /**\n * Topological sort of the graph\n */\n topologicalSort(): NodeId[] {\n const inDegree = new Map<NodeId, number>();\n \n for (const nodeId of this.graph.nodes.keys()) {\n inDegree.set(nodeId, 0);\n }\n\n for (const [sourceId, node] of this.graph.nodes.entries()) {\n for (const edge of node.edges) {\n inDegree.set(\n edge.targetId,\n (inDegree.get(edge.targetId) || 0) + 1\n );\n }\n }\n\n const queue: NodeId[] = [];\n for (const [nodeId, degree] of inDegree.entries()) {\n if (degree === 0) {\n queue.push(nodeId);\n }\n }\n\n const sorted: NodeId[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n inDegree.set(neighbor, inDegree.get(neighbor)! - 1);\n if (inDegree.get(neighbor) === 0) {\n queue.push(neighbor);\n }\n }\n }\n\n return sorted;\n }\n\n /**\n * Find nodes reachable from a given start node\n */\n findReachable(startNodeId: NodeId): Set<NodeId> {\n const reachable = new Set<NodeId>();\n const visited = new Set<NodeId>();\n const queue: NodeId[] = [startNodeId];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n if (visited.has(current)) continue;\n \n visited.add(current);\n reachable.add(current);\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n queue.push(neighbor);\n }\n }\n }\n\n return reachable;\n }\n\n /**\n * Find shortest path between two nodes (BFS)\n */\n findShortestPath(fromId: NodeId, toId: NodeId): NodeId[] | null {\n const visited = new Set<NodeId>();\n const previous = new Map<NodeId, NodeId>();\n const queue: NodeId[] = [fromId];\n visited.add(fromId);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n if (current === toId) {\n return this.reconstructPath(previous, toId);\n }\n\n const neighbors = this.adjacency.get(current) || new Set();\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n previous.set(neighbor, current);\n queue.push(neighbor);\n }\n }\n }\n\n return null;\n }\n\n /**\n * Reconstruct path from previous map\n */\n private reconstructPath(\n previous: Map<NodeId, NodeId>,\n toId: NodeId\n ): NodeId[] {\n const path: NodeId[] = [toId];\n let current: NodeId | undefined = toId;\n\n while (current !== undefined) {\n current = previous.get(current);\n if (current !== undefined) {\n path.unshift(current);\n }\n }\n\n return path;\n }\n\n /**\n * Get nodes grouped by their depth from roots\n */\n getDepthGroups(): Map<number, NodeId[]> {\n const depths = new Map<NodeId, number>();\n const groups = new Map<number, NodeId[]>();\n\n // Calculate depths using BFS from all roots\n for (const rootId of this.graph.roots) {\n const queue: NodeId[] = [rootId];\n depths.set(rootId, 0);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentDepth = depths.get(current)!;\n\n for (const neighbor of (this.adjacency.get(current) || new Set())) {\n const newDepth = currentDepth + 1;\n if (\n !depths.has(neighbor) || \n depths.get(neighbor)! > newDepth\n ) {\n depths.set(neighbor, newDepth);\n queue.push(neighbor);\n }\n }\n }\n }\n\n // Group nodes by depth\n for (const [nodeId, depth] of depths.entries()) {\n if (!groups.has(depth)) {\n groups.set(depth, []);\n }\n groups.get(depth)!.push(nodeId);\n }\n\n return groups;\n }\n\n /**\n * Get the underlying graph\n */\n getGraph(): Graph {\n return this.graph;\n }\n}\n\n/**\n * Cycle detection report\n */\nexport interface CycleReport {\n hasCycles: boolean;\n cycles: NodeId[][];\n cycleCount: number;\n}\n"],"mappings":"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","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","import_typescript","ts","ts","methodName","ts","import_typescript","METAL_ORM_WRAPPER_NAMES","path","unwrapPromise","symbol","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","process","import_node_fs","import_node_path","mainPath","import_typescript","path","import_typescript","import_node_process","import_meta","process","path","ts","process","fs"]}
|