@kozojs/core 0.2.4 → 0.2.6

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/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/app.ts","../src/client-generator.ts","../src/optimizations/serializer.ts","../src/optimizations/validator.ts","../src/compiler.ts","../src/index.ts"],"sourcesContent":["import { Hono } from 'hono';\r\nimport { serve } from '@hono/node-server';\r\nimport type { KozoConfig, Services, RouteSchema, KozoHandler } from './types.js';\r\nimport { zodToJsonSchema } from 'zod-to-json-schema';\r\nimport fastJson from 'fast-json-stringify';\r\nimport Ajv from 'ajv';\r\nimport addFormats from 'ajv-formats';\r\nimport { generateTypedClient, type ClientGeneratorOptions, type RouteInfo } from './client-generator.js';\r\nimport { compileRouteHandler, SchemaCompiler } from './compiler.js';\r\n\r\n// Shared Ajv instance for validation\r\nconst ajv = new Ajv({\r\n removeAdditional: 'all',\r\n useDefaults: true,\r\n coerceTypes: true,\r\n});\r\naddFormats(ajv);\r\n\r\nconst JSON_HEADERS = { 'Content-Type': 'application/json' };\r\nconst RESPONSE_INIT_200 = { status: 200, headers: JSON_HEADERS };\r\nconst RESPONSE_INIT_400 = { status: 400, headers: JSON_HEADERS };\r\nconst VALIDATION_FAILED_BODY = '{\"error\":\"Validation failed\"}';\r\nconst INVALID_QUERY_BODY = '{\"error\":\"Invalid query\"}';\r\n\r\nfunction isZodSchema(schema: any): boolean {\r\n return typeof schema === 'object' && schema !== null && 'safeParse' in schema;\r\n}\r\n\r\n// Bun-specific optimizations\r\nconst isBun = typeof Bun !== 'undefined';\r\n\r\nif (isBun) {\r\n try {\r\n // @ts-ignore\r\n if (typeof Bun !== 'undefined' && (Bun as any).json) {\r\n // @ts-ignore\r\n (globalThis as any).JSON = {\r\n parse: (Bun as any).json.parse,\r\n stringify: (Bun as any).json.stringify\r\n };\r\n }\r\n } catch (e) {\r\n // Ignore if failed to patch\r\n }\r\n}\r\n\r\n// Runtime detection\r\nconst RUNTIME = isBun ? 'bun' : 'node';\r\n\r\ninterface CompiledRoute {\r\n validateBody?: (data: any) => boolean;\r\n validateQuery?: (data: any) => boolean;\r\n validateParams?: (data: any) => boolean;\r\n serialize?: (data: any) => string;\r\n}\r\n\r\n// Plugin Architecture\r\nexport interface Plugin {\r\n name: string;\r\n version?: string;\r\n install: (app: Kozo) => void | Promise<void>;\r\n}\r\n\r\n// Deprecated: Use generateClient() method instead\r\nfunction generateClientCode(routes: Array<{ method: string; path: string; schema: RouteSchema }>, baseUrl: string = ''): string {\r\n const routeInfos: RouteInfo[] = routes.map(r => ({\r\n method: r.method,\r\n path: r.path,\r\n schema: r.schema\r\n }));\r\n \r\n return generateTypedClient(routeInfos, { \r\n baseUrl,\r\n includeValidation: false // Legacy mode without validation\r\n });\r\n}\r\n\r\n/**\r\n * Kozo - High-performance TypeScript framework with Zod schemas\r\n */\r\nexport class Kozo {\r\n private app: Hono;\r\n private services: Services;\r\n private routes: Array<{ method: string; path: string; schema: RouteSchema }> = [];\r\n\r\n constructor(config: KozoConfig = {}) {\r\n this.app = new Hono();\r\n this.services = config.services || {};\r\n }\r\n\r\n // Plugin system\r\n use(plugin: Plugin): this {\r\n plugin.install(this);\r\n return this;\r\n }\r\n\r\n // Code generation with overloads\r\n generateClient(baseUrl?: string): string;\r\n generateClient(options?: ClientGeneratorOptions): string;\r\n generateClient(baseUrlOrOptions?: string | ClientGeneratorOptions): string {\r\n const options: ClientGeneratorOptions = typeof baseUrlOrOptions === 'string'\r\n ? { baseUrl: baseUrlOrOptions, includeValidation: false }\r\n : baseUrlOrOptions || {};\r\n \r\n const routeInfos: RouteInfo[] = this.routes.map(r => ({\r\n method: r.method,\r\n path: r.path,\r\n schema: r.schema\r\n }));\r\n \r\n return generateTypedClient(routeInfos, options);\r\n }\r\n\r\n get<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S>) {\r\n this.register('get', path, schema, handler);\r\n }\r\n\r\n post<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S>) {\r\n this.register('post', path, schema, handler);\r\n }\r\n\r\n put<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S>) {\r\n this.register('put', path, schema, handler);\r\n }\r\n\r\n patch<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S>) {\r\n this.register('patch', path, schema, handler);\r\n }\r\n\r\n delete<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S>) {\r\n this.register('delete', path, schema, handler);\r\n }\r\n\r\n private register(method: string, path: string, schema: RouteSchema, handler: KozoHandler<any>) {\r\n // Track route for client SDK generation\r\n this.routes.push({ method, path, schema });\r\n \r\n // 1. Compile schemas (Zod -> Ajv validators + fast-json-stringify serializer)\r\n const compiled = SchemaCompiler.compile(schema);\r\n \r\n // 2. Generate the optimized handler function (THE KEY!)\r\n const optimizedHandler = compileRouteHandler(\r\n handler,\r\n schema,\r\n this.services,\r\n compiled\r\n );\r\n \r\n // 3. Register the compiled handler with Hono\r\n (this.app as any)[method](path, optimizedHandler);\r\n }\r\n\r\n async listen(port?: number): Promise<void> {\r\n const finalPort = port || 3000;\r\n\r\n serve({\r\n fetch: this.app.fetch,\r\n port: finalPort\r\n });\r\n\r\n console.log(`🚀 Kozo server listening on http://localhost:${finalPort}`);\r\n }\r\n\r\n getApp(): Hono {\r\n return this.app;\r\n }\r\n\r\n get fetch() {\r\n return this.app.fetch;\r\n }\r\n}\r\n\r\n// AI Schema Generation utility\r\nfunction inferType(value: any): string {\r\n if (value === null || value === undefined) return 'any';\r\n if (typeof value === 'string') return 'string';\r\n if (typeof value === 'number') {\r\n return Number.isInteger(value) ? 'number' : 'number';\r\n }\r\n if (typeof value === 'boolean') return 'boolean';\r\n if (Array.isArray(value)) {\r\n if (value.length === 0) return 'array';\r\n const itemTypes = value.map(inferType);\r\n const uniqueTypes = [...new Set(itemTypes)];\r\n return `array<${uniqueTypes.length === 1 ? uniqueTypes[0] : 'any'}>`;\r\n }\r\n if (typeof value === 'object') {\r\n return 'object';\r\n }\r\n return 'any';\r\n}\r\n\r\nfunction generateZodSchema(examples: any[]): string {\r\n if (examples.length === 0) return 'z.any()';\r\n\r\n const first = examples[0];\r\n const type = inferType(first);\r\n\r\n switch (type) {\r\n case 'string':\r\n const hasEmail = examples.some(e => typeof e === 'string' && e.includes('@'));\r\n const hasUUID = examples.some(e => typeof e === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e));\r\n if (hasEmail) return 'z.string().email()';\r\n if (hasUUID) return 'z.string().uuid()';\r\n return 'z.string()';\r\n\r\n case 'number':\r\n return 'z.number()';\r\n\r\n case 'boolean':\r\n return 'z.boolean()';\r\n\r\n case 'array':\r\n const itemType = inferType(first[0]);\r\n switch (itemType) {\r\n case 'string': return 'z.array(z.string())';\r\n case 'number': return 'z.number().array()';\r\n case 'boolean': return 'z.boolean().array()';\r\n default: return 'z.array(z.any())';\r\n }\r\n\r\n case 'object':\r\n const props: string[] = [];\r\n for (const example of examples) {\r\n if (typeof example === 'object' && example !== null) {\r\n Object.keys(example).forEach(key => {\r\n if (!props.includes(key)) {\r\n const values = examples.map(e => e?.[key]).filter(v => v !== undefined);\r\n const propType = inferType(values[0]);\r\n switch (propType) {\r\n case 'string':\r\n const hasEmail = values.some(v => typeof v === 'string' && v.includes('@'));\r\n const hasUUID = values.some(v => typeof v === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v));\r\n if (hasEmail) props.push(`${key}: z.string().email()`);\r\n else if (hasUUID) props.push(`${key}: z.string().uuid()`);\r\n else props.push(`${key}: z.string()`);\r\n break;\r\n case 'number': props.push(`${key}: z.number()`); break;\r\n case 'boolean': props.push(`${key}: z.boolean()`); break;\r\n case 'array': props.push(`${key}: z.array(z.any())`); break;\r\n default: props.push(`${key}: z.any()`); break;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n return `z.object({\\n ${props.join(',\\n ')}\\n})`;\r\n\r\n default:\r\n return 'z.any()';\r\n }\r\n}\r\n\r\nexport function generateSchema(examples: any[]) {\r\n const schemaCode = generateZodSchema(examples);\r\n return schemaCode;\r\n}\r\n\r\nexport function createKozo(config?: KozoConfig): Kozo {\r\n return new Kozo(config);\r\n}","import type { RouteSchema } from './types.js';\r\n\r\n/**\r\n * Client Generator Options\r\n */\r\nexport interface ClientGeneratorOptions {\r\n /** Include Zod schemas for client-side validation (default: true) */\r\n includeValidation?: boolean;\r\n \r\n /** Base URL for the API (default: '') */\r\n baseUrl?: string;\r\n \r\n /** Enable runtime validation by default (default: false) */\r\n validateByDefault?: boolean;\r\n \r\n /** Custom headers to include in all requests */\r\n defaultHeaders?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Route information for client generation\r\n */\r\nexport interface RouteInfo {\r\n method: string;\r\n path: string;\r\n schema: RouteSchema;\r\n /** Optional: store the Zod schema instance for type extraction */\r\n zodSchemas?: {\r\n body?: any;\r\n query?: any;\r\n params?: any;\r\n response?: any;\r\n };\r\n}\r\n\r\n/**\r\n * Generate a safe method name from a route path\r\n */\r\nfunction generateMethodName(method: string, path: string): string {\r\n // Remove leading/trailing slashes\r\n const cleanPath = path.replace(/^\\/+|\\/+$/g, '');\r\n \r\n // Replace path params with their names\r\n const withParams = cleanPath.replace(/:(\\w+)/g, 'By$1');\r\n \r\n // Replace slashes and special chars with underscores\r\n const safeName = withParams\r\n .replace(/[\\/\\-\\.]/g, '_')\r\n .replace(/[^\\w]/g, '');\r\n \r\n // Prepend method name if not GET\r\n if (method.toLowerCase() !== 'get') {\r\n return method.toLowerCase() + safeName.charAt(0).toUpperCase() + safeName.slice(1);\r\n }\r\n \r\n return safeName || 'index';\r\n}\r\n\r\n/**\r\n * Extract path parameters from a route path\r\n */\r\nfunction extractPathParams(path: string): string[] {\r\n const matches = path.match(/:(\\w+)/g);\r\n return matches ? matches.map(m => m.slice(1)) : [];\r\n}\r\n\r\n/**\r\n * Generate typed client code from routes\r\n */\r\nexport function generateTypedClient(\r\n routes: RouteInfo[],\r\n options: ClientGeneratorOptions = {}\r\n): string {\r\n const {\r\n includeValidation = true,\r\n baseUrl = '',\r\n validateByDefault = false,\r\n defaultHeaders = {}\r\n } = options;\r\n\r\n const imports: string[] = [];\r\n const typeDefinitions: string[] = [];\r\n const schemaExports: string[] = [];\r\n const methodImplementations: string[] = [];\r\n \r\n // Add base imports\r\n if (includeValidation) {\r\n imports.push(`import { z } from 'zod';`);\r\n }\r\n\r\n // Header\r\n let code = `// Auto-generated Kozo Client\\n`;\r\n code += `// Generated at ${new Date().toISOString()}\\n`;\r\n code += `// DO NOT EDIT - Changes will be overwritten\\n\\n`;\r\n\r\n // Track schema variable names for type inference\r\n const schemaVars = new Map<string, string>();\r\n\r\n // Process each route\r\n for (const route of routes) {\r\n const methodName = generateMethodName(route.method, route.path);\r\n const pathParams = extractPathParams(route.path);\r\n \r\n // Generate type definitions using z.infer\r\n let paramsType = 'void';\r\n let bodyType = 'void';\r\n let queryType = 'void';\r\n let responseType = 'unknown';\r\n \r\n if (pathParams.length > 0) {\r\n paramsType = `{ ${pathParams.map(p => `${p}: string`).join('; ')} }`;\r\n }\r\n \r\n if (route.zodSchemas?.body || route.schema.body) {\r\n const schemaVarName = `${capitalize(methodName)}BodySchema`;\r\n schemaVars.set(`${methodName}_body`, schemaVarName);\r\n bodyType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n // Store schema as serialized string that will be evaluated\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n if (route.zodSchemas?.query || route.schema.query) {\r\n const schemaVarName = `${capitalize(methodName)}QuerySchema`;\r\n schemaVars.set(`${methodName}_query`, schemaVarName);\r\n queryType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n if (route.zodSchemas?.response || route.schema.response) {\r\n const schemaVarName = `${capitalize(methodName)}ResponseSchema`;\r\n schemaVars.set(`${methodName}_response`, schemaVarName);\r\n responseType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n // Generate type aliases\r\n if (bodyType !== 'void' && !bodyType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Body = ${bodyType};`);\r\n }\r\n if (queryType !== 'void' && !queryType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Query = ${queryType};`);\r\n }\r\n if (!responseType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Response = ${responseType};`);\r\n }\r\n \r\n // Generate method signature\r\n const args: string[] = [];\r\n if (paramsType !== 'void') args.push(`params: ${paramsType}`);\r\n if (bodyType !== 'void') args.push(`body: ${bodyType}`);\r\n if (queryType !== 'void') args.push(`query?: ${queryType}`);\r\n \r\n const argsStr = args.join(', ');\r\n const returnType = `Promise<${responseType}>`;\r\n \r\n // Generate method implementation\r\n let methodBody = ` async ${methodName}(${argsStr}): ${returnType} {\\n`;\r\n \r\n // Validation\r\n if (includeValidation && bodyType !== 'void') {\r\n const schemaVar = schemaVars.get(`${methodName}_body`);\r\n if (schemaVar) {\r\n methodBody += ` if (this.validateRequests && ${schemaVar}) {\\n`;\r\n methodBody += ` ${schemaVar}.parse(body);\\n`;\r\n methodBody += ` }\\n`;\r\n }\r\n }\r\n \r\n // URL construction\r\n let urlExpression = `\\`\\${this.baseUrl}${route.path}\\``;\r\n if (pathParams.length > 0) {\r\n // Replace :param with ${params.param}\r\n const pathWithParams = route.path.replace(/:(\\w+)/g, '${params.$1}');\r\n urlExpression = `\\`\\${this.baseUrl}${pathWithParams}\\``;\r\n }\r\n \r\n methodBody += ` let url = ${urlExpression};\\n`;\r\n \r\n // Query string\r\n if (queryType !== 'void') {\r\n methodBody += ` if (query) {\\n`;\r\n methodBody += ` const queryString = new URLSearchParams(query as any).toString();\\n`;\r\n methodBody += ` url += \\`?\\${queryString}\\`;\\n`;\r\n methodBody += ` }\\n`;\r\n }\r\n \r\n // Fetch options\r\n methodBody += ` const options: RequestInit = {\\n`;\r\n methodBody += ` method: '${route.method.toUpperCase()}',\\n`;\r\n methodBody += ` headers: { ...this.defaultHeaders, 'Content-Type': 'application/json' },\\n`;\r\n if (bodyType !== 'void') {\r\n methodBody += ` body: JSON.stringify(body),\\n`;\r\n }\r\n methodBody += ` };\\n`;\r\n \r\n // Execute request\r\n methodBody += ` const response = await fetch(url, options);\\n`;\r\n methodBody += ` if (!response.ok) {\\n`;\r\n methodBody += ` throw new Error(\\`HTTP \\${response.status}: \\${response.statusText}\\`);\\n`;\r\n methodBody += ` }\\n`;\r\n methodBody += ` return response.json();\\n`;\r\n methodBody += ` }\\n`;\r\n \r\n methodImplementations.push(methodBody);\r\n }\r\n\r\n // Build final code\r\n if (imports.length > 0) {\r\n code += imports.join('\\n') + '\\n\\n';\r\n }\r\n\r\n if (typeDefinitions.length > 0) {\r\n code += '// Type Definitions\\n';\r\n code += typeDefinitions.join('\\n') + '\\n\\n';\r\n }\r\n\r\n if (includeValidation && schemaExports.length > 0) {\r\n code += '// Zod Schemas\\n';\r\n code += schemaExports.join('\\n') + '\\n\\n';\r\n }\r\n\r\n // Client class\r\n code += `export interface KozoClientOptions {\\n`;\r\n code += ` baseUrl?: string;\\n`;\r\n code += ` validateRequests?: boolean;\\n`;\r\n code += ` defaultHeaders?: Record<string, string>;\\n`;\r\n code += `}\\n\\n`;\r\n\r\n code += `export class KozoClient {\\n`;\r\n code += ` private baseUrl: string;\\n`;\r\n code += ` private validateRequests: boolean;\\n`;\r\n code += ` private defaultHeaders: Record<string, string>;\\n\\n`;\r\n \r\n code += ` constructor(options: KozoClientOptions = {}) {\\n`;\r\n code += ` this.baseUrl = options.baseUrl || '${baseUrl}';\\n`;\r\n code += ` this.validateRequests = options.validateRequests ?? ${validateByDefault};\\n`;\r\n code += ` this.defaultHeaders = options.defaultHeaders || ${JSON.stringify(defaultHeaders)};\\n`;\r\n code += ` }\\n\\n`;\r\n \r\n // Add all methods\r\n code += methodImplementations.join('\\n');\r\n \r\n code += `}\\n\\n`;\r\n code += `export default KozoClient;\\n`;\r\n\r\n return code;\r\n}\r\n\r\n/**\r\n * Capitalize first letter\r\n */\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n","import fastJson from 'fast-json-stringify';\r\nimport { zodToJsonSchema } from 'zod-to-json-schema';\r\nimport type { ZodSchema } from 'zod';\r\nimport type { TSchema } from '@sinclair/typebox';\r\n\r\nexport type SchemaType = ZodSchema<any> | TSchema;\r\n\r\ntype StringifyFn = (data: unknown) => string;\r\n\r\nfunction isZodSchema(schema: any): schema is ZodSchema {\r\n return typeof schema === 'object' && schema !== null && 'safeParse' in schema;\r\n}\r\n\r\nexport class ResponseSerializer {\r\n private serializers = new Map<string, StringifyFn>();\r\n private fallback: StringifyFn = JSON.stringify;\r\n \r\n compile(routeId: string, schema: SchemaType | object): void {\r\n try {\r\n let jsonSchema: any;\r\n const isZod = isZodSchema(schema);\r\n \r\n if (isZod) {\r\n jsonSchema = zodToJsonSchema(schema, { $refStrategy: 'none', target: 'jsonSchema7' });\r\n \r\n // 🔍 DIAGNOSTIC: Log schema quality for performance analysis\r\n if (process.env.KOZO_DEBUG_SCHEMA === 'true') {\r\n console.log(`\\n[DIAGNOSTIC] Schema for ${routeId}:`);\r\n console.log(JSON.stringify(jsonSchema, null, 2));\r\n \r\n // Check for performance-killing patterns\r\n const schemaStr = JSON.stringify(jsonSchema);\r\n const hasAnyOf = schemaStr.includes('anyOf');\r\n const hasOneOf = schemaStr.includes('oneOf');\r\n const hasAllOf = schemaStr.includes('allOf');\r\n \r\n if (hasAnyOf || hasOneOf || hasAllOf) {\r\n console.warn(`⚠️ Complex schema detected for ${routeId}:`, { hasAnyOf, hasOneOf, hasAllOf });\r\n console.warn(' This may reduce fast-json-stringify performance');\r\n }\r\n }\r\n } else {\r\n // Assume TypeBox or raw JSON Schema\r\n jsonSchema = schema;\r\n }\r\n\r\n const stringify = fastJson(jsonSchema);\r\n this.serializers.set(routeId, stringify);\r\n } catch (err) {\r\n console.error(`Failed to compile serializer for ${routeId}`, err);\r\n // Fallback to JSON.stringify if schema can't be converted or compiled\r\n this.serializers.set(routeId, this.fallback);\r\n }\r\n }\r\n\r\n // Deprecated: for backward compatibility\r\n compileFromZod(routeId: string, zodSchema: ZodSchema): void {\r\n this.compile(routeId, zodSchema);\r\n }\r\n \r\n // Deprecated: for backward compatibility\r\n compileFromJsonSchema(routeId: string, schema: object): void {\r\n this.compile(routeId, schema);\r\n }\r\n \r\n serialize(routeId: string, data: unknown): string {\r\n const serializer = this.serializers.get(routeId);\r\n return serializer ? serializer(data) : this.fallback(data);\r\n }\r\n \r\n has(routeId: string): boolean {\r\n return this.serializers.has(routeId);\r\n }\r\n \r\n getSerializer(routeId: string): StringifyFn | undefined {\r\n return this.serializers.get(routeId);\r\n }\r\n}\r\n\r\n// Pre-compiled common response schemas\r\nexport const commonSchemas = {\r\n health: {\r\n type: 'object',\r\n properties: {\r\n status: { type: 'string' },\r\n timestamp: { type: 'number' }\r\n }\r\n },\r\n error: {\r\n type: 'object',\r\n properties: {\r\n error: { type: 'string' },\r\n status: { type: 'number' }\r\n }\r\n },\r\n success: {\r\n type: 'object',\r\n properties: {\r\n success: { type: 'boolean' },\r\n data: {}\r\n }\r\n }\r\n};\r\n\r\n// Singleton instance\r\nexport const globalSerializer = new ResponseSerializer();\r\n\r\n// Pre-compile common schemas\r\nglobalSerializer.compile('__health', commonSchemas.health);\r\nglobalSerializer.compile('__error', commonSchemas.error);\r\n\r\n","import Ajv from 'ajv';\r\nimport addFormats from 'ajv-formats';\r\nimport { zodToJsonSchema } from 'zod-to-json-schema';\r\nimport type { ZodSchema } from 'zod';\r\nimport type { TSchema } from '@sinclair/typebox';\r\n\r\nexport type SchemaType = ZodSchema<any> | TSchema;\r\n\r\ntype ValidateFn = (data: unknown) => { valid: boolean; data?: unknown; errors?: string[] };\r\n\r\nfunction isZodSchema(schema: any): schema is ZodSchema {\r\n return typeof schema === 'object' && schema !== null && 'safeParse' in schema;\r\n}\r\n\r\nexport class HybridValidator {\r\n private ajv: Ajv;\r\n private validators = new Map<string, ValidateFn>();\r\n \r\n constructor() {\r\n this.ajv = new Ajv({ \r\n allErrors: false, // Stop at first error (faster)\r\n coerceTypes: true, // Auto-coerce strings to numbers etc\r\n removeAdditional: true // Strip unknown properties\r\n });\r\n addFormats(this.ajv);\r\n }\r\n \r\n compile(routeId: string, schema: SchemaType): void {\r\n try {\r\n let jsonSchema: any;\r\n \r\n if (isZodSchema(schema)) {\r\n // Convert Zod to JSON Schema\r\n jsonSchema = zodToJsonSchema(schema, { $refStrategy: 'none', target: 'jsonSchema7' });\r\n } else {\r\n // Assume TypeBox or raw JSON Schema\r\n jsonSchema = schema;\r\n }\r\n\r\n const validate = this.ajv.compile(jsonSchema);\r\n \r\n // Create fast validator function\r\n this.validators.set(routeId, (data: unknown) => {\r\n const valid = validate(data);\r\n if (valid) {\r\n return { valid: true, data };\r\n }\r\n return {\r\n valid: false,\r\n errors: validate.errors?.map(e => `${e.instancePath} ${e.message}`) || ['Validation failed']\r\n };\r\n });\r\n } catch (err) {\r\n // Fallback to Zod safeParse if it's a Zod schema and Ajv failed\r\n if (isZodSchema(schema)) {\r\n this.validators.set(routeId, (data: unknown) => {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { valid: true, data: result.data };\r\n }\r\n return {\r\n valid: false,\r\n errors: result.error.issues.map(i => `${i.path.join('.')} ${i.message}`)\r\n };\r\n });\r\n } else {\r\n // For TypeBox/JSON Schema, if Ajv fails, we can't really validate effectively without Ajv.\r\n // We log error and create a fail-open or fail-closed validator?\r\n // Better to throw or log. For now, fail-closed.\r\n console.error(`Failed to compile validator for ${routeId}`, err);\r\n this.validators.set(routeId, () => ({ valid: false, errors: ['Internal Server Error: Validator compilation failed'] }));\r\n }\r\n }\r\n }\r\n\r\n // Deprecated: kept for backward compatibility if needed, but redirects to compile\r\n compileFromZod(routeId: string, zodSchema: ZodSchema): void {\r\n this.compile(routeId, zodSchema);\r\n }\r\n \r\n validate(routeId: string, data: unknown): { valid: boolean; data?: unknown; errors?: string[] } {\r\n const validator = this.validators.get(routeId);\r\n if (!validator) {\r\n return { valid: true, data }; // No validator = pass through\r\n }\r\n return validator(data);\r\n }\r\n \r\n // For production: throws on invalid (faster than returning errors)\r\n validateOrThrow(routeId: string, data: unknown): unknown {\r\n const result = this.validate(routeId, data);\r\n if (!result.valid) {\r\n const error: any = new Error('Validation failed');\r\n error.errors = result.errors;\r\n throw error;\r\n }\r\n return result.data;\r\n }\r\n \r\n has(routeId: string): boolean {\r\n return this.validators.has(routeId);\r\n }\r\n}\r\n\r\n// Singleton instance\r\nexport const globalValidator = new HybridValidator();\r\n","import type { Context } from 'hono';\r\nimport type { RouteModule, Services, RouteSchema, SchemaType } from './types.js';\r\nimport type { RouteAnalysis } from './analyzer.js';\r\nimport { z } from 'zod';\r\nimport { ResponseSerializer } from './optimizations/serializer.js';\r\nimport { HybridValidator } from './optimizations/validator.js';\r\nimport { zodToJsonSchema } from 'zod-to-json-schema';\r\nimport Ajv from 'ajv';\r\nimport addFormats from 'ajv-formats';\r\nimport fastJson from 'fast-json-stringify';\r\n\r\ntype ValidatorFn = (data: unknown) => unknown;\r\ntype SerializeFn = (data: unknown) => string;\r\ntype CompiledHandler = (c: Context) => Promise<Response>;\r\ntype UserHandler = (c: any) => any;\r\n\r\n// Istanza Ajv riutilizzata per risparmiare memoria\r\n// removeAdditional: 'all' -> Fondamentale per la sicurezza e velocità (scarta dati extra)\r\nconst ajv = new Ajv({\r\n removeAdditional: 'all',\r\n useDefaults: true,\r\n coerceTypes: true,\r\n});\r\n\r\n// Abilita formati aggiuntivi (email, uuid, date, etc.)\r\naddFormats(ajv);\r\n\r\nexport type CompiledRoute = {\r\n validateBody?: (data: any) => boolean;\r\n validateQuery?: (data: any) => boolean;\r\n validateParams?: (data: any) => boolean;\r\n serialize?: (data: any) => string;\r\n errors?: any; // Per salvare gli errori di compilazione Ajv\r\n};\r\n\r\nfunction isZodSchema(schema: any): schema is z.ZodType {\r\n return typeof schema === 'object' && schema !== null && 'safeParse' in schema;\r\n}\r\n\r\nexport class SchemaCompiler {\r\n static compile(schema: RouteSchema): CompiledRoute {\r\n const compiled: CompiledRoute = {};\r\n\r\n // 1. Compilazione BODY (Zod -> JSON Schema -> Ajv Function)\r\n if (schema.body) {\r\n const jsonSchema = isZodSchema(schema.body)\r\n ? zodToJsonSchema(schema.body, { target: 'jsonSchema7' })\r\n : schema.body;\r\n compiled.validateBody = ajv.compile(jsonSchema);\r\n }\r\n\r\n // 2. Compilazione QUERY\r\n if (schema.query) {\r\n const jsonSchema = isZodSchema(schema.query)\r\n ? zodToJsonSchema(schema.query, { target: 'jsonSchema7' })\r\n : schema.query;\r\n compiled.validateQuery = ajv.compile(jsonSchema);\r\n }\r\n\r\n // 3. Compilazione PARAMS\r\n if (schema.params) {\r\n const jsonSchema = isZodSchema(schema.params)\r\n ? zodToJsonSchema(schema.params, { target: 'jsonSchema7' })\r\n : schema.params;\r\n compiled.validateParams = ajv.compile(jsonSchema);\r\n }\r\n\r\n // 4. Compilazione SERIALIZER (Zod -> JSON Schema -> fast-json-stringify)\r\n // Handle both single schema and status code mapping\r\n if (schema.response) {\r\n if (typeof schema.response === 'object' && !isZodSchema(schema.response)) {\r\n // Check if it's a TypeBox schema (which is an object) or a Record<number, Schema>\r\n // Better check: iterate keys.\r\n const keys = Object.keys(schema.response);\r\n const isStatusMap = keys.length > 0 && keys.every(k => !isNaN(Number(k)));\r\n \r\n if (isStatusMap) {\r\n // Status code mapping: { 200: schema, 404: schema }\r\n const responseSchemas = schema.response as Record<number, any>;\r\n if (responseSchemas[200]) {\r\n const jsonSchema = isZodSchema(responseSchemas[200])\r\n ? zodToJsonSchema(responseSchemas[200], { target: 'jsonSchema7' })\r\n : responseSchemas[200];\r\n // Fastify-style: pass schema directly for maximum performance\r\n compiled.serialize = fastJson(jsonSchema as any);\r\n }\r\n } else {\r\n // Single TypeBox/JSON Schema\r\n compiled.serialize = fastJson(schema.response as any);\r\n }\r\n } else {\r\n // Single schema (Zod)\r\n const responseSchema = schema.response as z.ZodType<any>;\r\n const jsonSchema = zodToJsonSchema(responseSchema, { target: 'jsonSchema7' });\r\n compiled.serialize = fastJson(jsonSchema as any);\r\n }\r\n }\r\n\r\n return compiled;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// LA CHIAVE DI VOLTA: Route Handler Compiler\r\n// ============================================================================\r\n// Questa funzione viene eseguita UNA SOLA VOLTA all'avvio per ogni rotta.\r\n// Costruisce una \"Super Funzione\" monomorfica ottimizzata per V8.\r\n//\r\n// VANTAGGI:\r\n// 1. ZERO BRANCHING: Niente if a runtime. La logica è decisa all'avvio.\r\n// 2. MONOMORPHIC: V8 può inlinare tutto perché la funzione non cambia mai forma.\r\n// 3. CLOSURE CAPTURE: Validatori e serializzatori sono nella closure, non cercati dinamicamente.\r\n// 4. PREDICTABLE: La CPU può fare branch prediction perfetta (non ci sono branch!).\r\n// ============================================================================\r\n\r\nconst RESPONSE_INIT_200 = { status: 200, headers: { 'Content-Type': 'application/json' } };\r\nconst RESPONSE_INIT_400 = { status: 400, headers: { 'Content-Type': 'application/json' } };\r\nconst RESPONSE_INIT_500 = { status: 500, headers: { 'Content-Type': 'application/json' } };\r\nconst ERROR_INVALID = '{\"error\":\"Validation failed\"}';\r\nconst ERROR_INTERNAL = '{\"error\":\"Internal server error\"}';\r\n\r\nexport function compileRouteHandler(\r\n userHandler: UserHandler,\r\n schema: RouteSchema,\r\n services: any,\r\n compiled: CompiledRoute\r\n): (c: Context) => any {\r\n // Pre-capture tutto nella closure (accesso istantaneo, zero indirection)\r\n const bodyValidator = compiled.validateBody;\r\n const queryValidator = compiled.validateQuery;\r\n const paramsValidator = compiled.validateParams;\r\n const serializer = compiled.serialize;\r\n \r\n // Determiniamo TUTTO all'avvio (zero decisioni a runtime)\r\n const needsBody = !!bodyValidator;\r\n const needsQuery = !!queryValidator;\r\n const needsParams = !!paramsValidator;\r\n const needsSerialize = !!serializer;\r\n \r\n // ========================================================================\r\n // SCENARIO 1: ULTRA FAST PATH (Nessuna validazione)\r\n // GET senza query/params, o route senza schema\r\n // ========================================================================\r\n if (!needsBody && !needsQuery && !needsParams) {\r\n if (needsSerialize) {\r\n // Con serializzatore fast-json-stringify\r\n return (c: Context) => {\r\n (c as any).services = services;\r\n const result = userHandler(c);\r\n if (result instanceof Promise) {\r\n return result.then(res => {\r\n if (res instanceof Response) return res;\r\n return new Response(serializer!(res), RESPONSE_INIT_200);\r\n });\r\n }\r\n if (result instanceof Response) return result;\r\n return new Response(serializer!(result), RESPONSE_INIT_200);\r\n };\r\n } else {\r\n // Con JSON.stringify standard\r\n return (c: Context) => {\r\n (c as any).services = services;\r\n const result = userHandler(c);\r\n if (result instanceof Promise) {\r\n return result.then(res => {\r\n if (res instanceof Response) return res;\r\n return new Response(JSON.stringify(res), RESPONSE_INIT_200);\r\n });\r\n }\r\n if (result instanceof Response) return result;\r\n return new Response(JSON.stringify(result), RESPONSE_INIT_200);\r\n };\r\n }\r\n }\r\n \r\n // ========================================================================\r\n // SCENARIO 2: QUERY/PARAMS ONLY (Tipico GET con parametri)\r\n // ========================================================================\r\n if (!needsBody) {\r\n if (needsSerialize) {\r\n return (c: Context) => {\r\n const ctx = c as any;\r\n ctx.services = services;\r\n \r\n if (needsParams) {\r\n const params = c.req.param();\r\n if (!paramsValidator!(params)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.params = params;\r\n }\r\n \r\n if (needsQuery) {\r\n const query = c.req.query();\r\n if (!queryValidator!(query)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.query = query;\r\n }\r\n \r\n const result = userHandler(c);\r\n if (result instanceof Promise) {\r\n return result.then(res => {\r\n if (res instanceof Response) return res;\r\n return new Response(serializer!(res), RESPONSE_INIT_200);\r\n });\r\n }\r\n if (result instanceof Response) return result;\r\n return new Response(serializer!(result), RESPONSE_INIT_200);\r\n };\r\n } else {\r\n return (c: Context) => {\r\n const ctx = c as any;\r\n ctx.services = services;\r\n \r\n if (needsParams) {\r\n const params = c.req.param();\r\n if (!paramsValidator!(params)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.params = params;\r\n }\r\n \r\n if (needsQuery) {\r\n const query = c.req.query();\r\n if (!queryValidator!(query)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.query = query;\r\n }\r\n \r\n const result = userHandler(c);\r\n if (result instanceof Promise) {\r\n return result.then(res => {\r\n if (res instanceof Response) return res;\r\n return new Response(JSON.stringify(res), RESPONSE_INIT_200);\r\n });\r\n }\r\n if (result instanceof Response) return result;\r\n return new Response(JSON.stringify(result), RESPONSE_INIT_200);\r\n };\r\n }\r\n }\r\n \r\n // ========================================================================\r\n // SCENARIO 3: FULL PATH (POST/PUT/PATCH con body)\r\n // ========================================================================\r\n if (needsSerialize) {\r\n return async (c: Context) => {\r\n try {\r\n const ctx = c as any;\r\n ctx.services = services;\r\n \r\n if (needsParams) {\r\n const params = c.req.param();\r\n if (!paramsValidator!(params)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.params = params;\r\n }\r\n \r\n if (needsQuery) {\r\n const query = c.req.query();\r\n if (!queryValidator!(query)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.query = query;\r\n }\r\n \r\n if (needsBody) {\r\n const rawBody = await c.req.json().catch(() => ({}));\r\n if (!bodyValidator!(rawBody)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.body = rawBody;\r\n }\r\n \r\n const result = await userHandler(c);\r\n if (result instanceof Response) return result;\r\n return new Response(serializer!(result), RESPONSE_INIT_200);\r\n } catch (err) {\r\n console.error('[Kozo] Handler error:', err);\r\n return new Response(ERROR_INTERNAL, RESPONSE_INIT_500);\r\n }\r\n };\r\n } else {\r\n return async (c: Context) => {\r\n try {\r\n const ctx = c as any;\r\n ctx.services = services;\r\n \r\n if (needsParams) {\r\n const params = c.req.param();\r\n if (!paramsValidator!(params)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.params = params;\r\n }\r\n \r\n if (needsQuery) {\r\n const query = c.req.query();\r\n if (!queryValidator!(query)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.query = query;\r\n }\r\n \r\n if (needsBody) {\r\n const rawBody = await c.req.json().catch(() => ({}));\r\n if (!bodyValidator!(rawBody)) {\r\n return new Response(ERROR_INVALID, RESPONSE_INIT_400);\r\n }\r\n ctx.body = rawBody;\r\n }\r\n \r\n const result = await userHandler(c);\r\n if (result instanceof Response) return result;\r\n return new Response(JSON.stringify(result), RESPONSE_INIT_200);\r\n } catch (err) {\r\n console.error('[Kozo] Handler error:', err);\r\n return new Response(ERROR_INTERNAL, RESPONSE_INIT_500);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport class RouteCompiler {\r\n private services: Services;\r\n private isProd: boolean;\r\n private serializer: ResponseSerializer;\r\n private validator: HybridValidator;\r\n \r\n constructor(services: Services) {\r\n this.services = services;\r\n this.isProd = process.env.NODE_ENV === 'production';\r\n this.serializer = new ResponseSerializer();\r\n this.validator = new HybridValidator();\r\n }\r\n \r\n compile(module: RouteModule, analysis: RouteAnalysis, routeId: string): CompiledHandler {\r\n // Pre-compile response serializer if response schema exists\r\n // For file-based routing, response is always Record<number, Schema> or Schema\r\n const responseSchema = module.schema?.response;\r\n if (responseSchema) {\r\n if (typeof responseSchema === 'object' && !isZodSchema(responseSchema)) {\r\n const keys = Object.keys(responseSchema);\r\n const isStatusMap = keys.length > 0 && keys.every(k => !isNaN(Number(k)));\r\n \r\n if (isStatusMap) {\r\n const responseRecord = responseSchema as Record<number, any>;\r\n if (responseRecord[200]) {\r\n this.serializer.compile(routeId, responseRecord[200]);\r\n }\r\n } else {\r\n // Single TypeBox schema\r\n this.serializer.compile(routeId, responseSchema);\r\n }\r\n } else if (isZodSchema(responseSchema)) {\r\n // Single Zod schema\r\n this.serializer.compile(routeId, responseSchema);\r\n }\r\n }\r\n \r\n // Pre-compile validators with Ajv\r\n if (module.schema?.body) {\r\n this.validator.compile(`${routeId}:body`, module.schema.body);\r\n }\r\n if (module.schema?.query) {\r\n this.validator.compile(`${routeId}:query`, module.schema.query);\r\n }\r\n if (module.schema?.params) {\r\n this.validator.compile(`${routeId}:params`, module.schema.params);\r\n }\r\n \r\n switch (analysis.complexity) {\r\n case 'fast':\r\n return this.compileFastPath(module, routeId);\r\n case 'medium':\r\n return this.compileMediumPath(module, analysis, routeId);\r\n case 'full':\r\n return this.compileFullPath(module, analysis, routeId);\r\n }\r\n }\r\n \r\n // FAST PATH: Zero overhead - GET without validation\r\n private compileFastPath(module: RouteModule, routeId: string): CompiledHandler {\r\n const handler = module.default;\r\n const services = this.services;\r\n const serialize = this.serializer.getSerializer(routeId);\r\n \r\n if (serialize) {\r\n // Use fast-json-stringify\r\n return async (c: Context) => {\r\n const result = await handler({ services } as any);\r\n if (result == null) return c.body(null, 204);\r\n return c.text(serialize(result), 200, { 'Content-Type': 'application/json' });\r\n };\r\n }\r\n \r\n return async (c: Context) => {\r\n const result = await handler({ services } as any);\r\n return result == null ? c.body(null, 204) : c.json(result);\r\n };\r\n }\r\n \r\n // MEDIUM PATH: Params or query only\r\n private compileMediumPath(module: RouteModule, analysis: RouteAnalysis, routeId: string): CompiledHandler {\r\n const handler = module.default;\r\n const services = this.services;\r\n const serialize = this.serializer.getSerializer(routeId);\r\n \r\n // Use Ajv validators (pre-compiled)\r\n const validateQuery = analysis.hasQuery ? (data: unknown) => this.validator.validateOrThrow(`${routeId}:query`, data) : null;\r\n const validateParams = analysis.hasParams ? (data: unknown) => this.validator.validateOrThrow(`${routeId}:params`, data) : null;\r\n \r\n // Helper for response\r\n const respond = serialize \r\n ? (c: Context, result: unknown) => result == null ? c.body(null, 204) : c.text(serialize(result), 200, { 'Content-Type': 'application/json' })\r\n : (c: Context, result: unknown) => result == null ? c.body(null, 204) : c.json(result);\r\n \r\n if (analysis.hasParams && !analysis.hasQuery) {\r\n return async (c: Context) => {\r\n const params = validateParams ? validateParams(c.req.param()) : c.req.param();\r\n const result = await handler({ params, services } as any);\r\n return respond(c, result);\r\n };\r\n }\r\n \r\n if (analysis.hasQuery && !analysis.hasParams) {\r\n return async (c: Context) => {\r\n const query = validateQuery ? validateQuery(c.req.query()) : c.req.query();\r\n const result = await handler({ query, services } as any);\r\n return respond(c, result);\r\n };\r\n }\r\n \r\n // Both params and query\r\n return async (c: Context) => {\r\n const params = validateParams ? validateParams(c.req.param()) : c.req.param();\r\n const query = validateQuery ? validateQuery(c.req.query()) : c.req.query();\r\n const result = await handler({ params, query, services } as any);\r\n return respond(c, result);\r\n };\r\n }\r\n \r\n // FULL PATH: Body, middleware, auth\r\n private compileFullPath(module: RouteModule, analysis: RouteAnalysis, routeId: string): CompiledHandler {\r\n const handler = module.default;\r\n const services = this.services;\r\n const middlewares = module.middleware || [];\r\n const serialize = this.serializer.getSerializer(routeId);\r\n \r\n // Use Ajv validators (5x faster than Zod)\r\n const validateBody = analysis.hasBody ? (data: unknown) => this.validator.validateOrThrow(`${routeId}:body`, data) : null;\r\n const validateQuery = analysis.hasQuery ? (data: unknown) => this.validator.validateOrThrow(`${routeId}:query`, data) : null;\r\n const validateParams = analysis.hasParams ? (data: unknown) => this.validator.validateOrThrow(`${routeId}:params`, data) : null;\r\n \r\n const hasMiddleware = middlewares.length > 0;\r\n \r\n return async (c: Context) => {\r\n // Build context\r\n const ctx: any = { services };\r\n \r\n if (analysis.hasParams) {\r\n ctx.params = validateParams ? validateParams(c.req.param()) : c.req.param();\r\n }\r\n \r\n if (analysis.hasQuery) {\r\n ctx.query = validateQuery ? validateQuery(c.req.query()) : c.req.query();\r\n }\r\n \r\n if (analysis.hasBody && analysis.hasBodyMethod) {\r\n const rawBody = await c.req.json().catch(() => ({}));\r\n ctx.body = validateBody ? validateBody(rawBody) : rawBody;\r\n }\r\n \r\n if (analysis.hasAuth) {\r\n ctx.user = c.get('user');\r\n }\r\n \r\n // Execute middleware\r\n if (hasMiddleware) {\r\n for (let i = 0; i < middlewares.length; i++) {\r\n await middlewares[i](ctx);\r\n }\r\n }\r\n \r\n const result = await handler(ctx);\r\n if (result == null) return c.body(null, 204);\r\n return serialize \r\n ? c.text(serialize(result), 200, { 'Content-Type': 'application/json' })\r\n : c.json(result);\r\n };\r\n }\r\n \r\n private createValidator(schema: z.ZodType): ValidatorFn {\r\n if (this.isProd) {\r\n // Production: fast parse, throws on error\r\n return (data: unknown) => schema.parse(data);\r\n }\r\n // Development: detailed errors\r\n return (data: unknown) => {\r\n const result = schema.safeParse(data);\r\n if (!result.success) {\r\n const error: any = new Error('Validation failed');\r\n error.issues = result.error.issues;\r\n throw error;\r\n }\r\n return result.data;\r\n };\r\n }\r\n}\r\n","// ============================================\r\n// KOZO V2 - High-Performance Framework\r\n// ============================================\r\n\r\n// Main exports\r\nexport { Kozo, createKozo } from './app.js';\r\nexport type { KozoConfig } from './types.js';\r\n\r\n// Types\r\nexport type {\r\n Services,\r\n RouteSchema,\r\n KozoContext,\r\n KozoHandler\r\n} from './types.js';\r\n\r\n// Client SDK Generation\r\nexport { generateTypedClient } from './client-generator.js';\r\nexport type { \r\n ClientGeneratorOptions, \r\n RouteInfo \r\n} from './client-generator.js';\r\n\r\n// Advanced: Route Compilation (La Chiave di Volta)\r\nexport { SchemaCompiler, compileRouteHandler } from './compiler.js';\r\nexport type { CompiledRoute } from './compiler.js';\r\n\r\n// Re-export Zod for convenience\r\nexport { z } from 'zod';\r\n"],"mappings":"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","names":["Ajv","addFormats","zodToJsonSchema","isZodSchema","zodToJsonSchema","Ajv","addFormats","fastJson","isZodSchema","ajv","Ajv","addFormats"]}
1
+ {"version":3,"sources":["../src/app.ts","../src/client-generator.ts","../src/uws-transport.ts","../src/errors.ts","../src/compiler.ts","../src/fast-response.ts","../src/shutdown.ts","../src/router.ts","../src/utils/file-to-path.ts","../src/wasm-router.ts","../src/native-context.ts","../src/index.ts","../src/openapi.ts","../src/middleware/logger.ts","../src/middleware/cors.ts","../src/middleware/rate-limit.ts","../src/middleware/error-handler.ts","../src/middleware/fileSystemRouting.ts"],"sourcesContent":["// Use hono/quick for guaranteed RegExpRouter (fastest for benchmarks)\n// SmartRouter sometimes falls back to TrieRouter on complex patterns\nimport { Hono } from 'hono/quick';\nimport { serve } from '@hono/node-server';\nimport { createServer } from 'node:http';\nimport type { Server, IncomingMessage, ServerResponse } from 'node:http';\nimport type { KozoConfig, Services, RouteSchema, KozoHandler } from './types.js';\nimport { generateTypedClient, type ClientGeneratorOptions, type RouteInfo } from './client-generator.js';\nimport { compileRouteHandler, compileNativeHandler, compileUwsNativeHandler, SchemaCompiler, type NativeRouteHandler } from './compiler.js';\nimport type { UwsNativeHandler } from './uws-transport.js';\nimport { KozoError, internalErrorResponse } from './errors.js';\nimport { ShutdownManager, type ShutdownOptions } from './shutdown.js';\nimport { scanRoutes } from './router.js';\nimport { WasmRadixRouter } from './wasm-router.js';\nimport { fastWrite404 } from './fast-response.js';\nimport { tryLoadUws, createUwsServer, type UwsRouteEntry } from './uws-transport.js';\n\n// Plugin Architecture\nexport interface Plugin {\n name: string;\n version?: string;\n install: (app: Kozo) => void | Promise<void>;\n}\n\n// Internal native router entry\ninterface NativeRouteEntry {\n method: string;\n path: string;\n staticPath?: string;\n regex?: RegExp;\n paramNames?: string[];\n handler: NativeRouteHandler;\n}\n\n/**\n * Kozo - High-performance TypeScript framework with Zod schemas\n *\n * @typeParam TServices - Shape of the services object injected into every handler.\n * Pass it once at construction: `createKozo<{ db: Database }>({ services: { db } })`\n * and all handler contexts will have `ctx.services.db` fully typed.\n */\nexport class Kozo<TServices extends Services = Services> {\n private app: Hono;\n private services: TServices;\n private routes: Array<{ method: string; path: string; schema: RouteSchema }> = [];\n private nativeRoutes: NativeRouteEntry[] = [];\n private shutdownManager = new ShutdownManager();\n private wasmRouter = new WasmRadixRouter();\n /** Maps each NativeRouteHandler to its zero-shim uWS counterpart */\n private uwsHandlerMap = new Map<NativeRouteHandler, UwsNativeHandler>();\n private _routesDir?: string;\n\n constructor(config: KozoConfig<TServices> = {}) {\n this.app = new Hono();\n this.services = (config.services ?? {}) as TServices;\n this._routesDir = config.routesDir;\n\n // Global Error Handler (RFC 7807 Problem Details)\n this.app.onError((err, c) => {\n // 1. Known Kozo errors (NotFoundError, ForbiddenError, etc.)\n if (err instanceof KozoError) {\n return err.toResponse(c.req.path);\n }\n\n // 2. Unknown errors (bugs in user code)\n console.error('[Kozo] Unhandled error:', err);\n return internalErrorResponse(err as Error, c.req.path);\n });\n }\n\n // Plugin system\n use(plugin: Plugin): this {\n plugin.install(this);\n return this;\n }\n\n /**\n * Load routes from the file system using the configured routesDir.\n * Each route file is dynamically imported, its schema compiled, and handler registered.\n * This is a no-op if routesDir is not configured.\n */\n async loadRoutes(routesDir?: string): Promise<this> {\n const dir = routesDir ?? this._routesDir;\n if (!dir) return this;\n\n const routes = await scanRoutes({ routesDir: dir, verbose: false });\n for (const route of routes) {\n const { path, method, module } = route;\n const schema: RouteSchema = module.schema ?? {};\n const compiled = SchemaCompiler.compile(schema);\n const userHandler = module.default;\n const optimizedHandler = compileRouteHandler(\n (ctx: any) => userHandler(ctx),\n schema,\n this.services,\n compiled,\n );\n this.routes.push({ method, path, schema });\n (this.app as any)[method](path, optimizedHandler);\n }\n\n return this;\n }\n\n // Code generation with overloads\n generateClient(baseUrl?: string): string;\n generateClient(options?: ClientGeneratorOptions): string;\n generateClient(baseUrlOrOptions?: string | ClientGeneratorOptions): string {\n const options: ClientGeneratorOptions =\n typeof baseUrlOrOptions === 'string'\n ? { baseUrl: baseUrlOrOptions, includeValidation: false }\n : baseUrlOrOptions || {};\n\n const routeInfos: RouteInfo[] = this.routes.map(r => ({\n method: r.method,\n path: r.path,\n schema: r.schema,\n }));\n\n return generateTypedClient(routeInfos, options);\n }\n\n get<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S, TServices>): this {\n return this.register('get', path, schema, handler);\n }\n\n post<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S, TServices>): this {\n return this.register('post', path, schema, handler);\n }\n\n put<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S, TServices>): this {\n return this.register('put', path, schema, handler);\n }\n\n patch<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S, TServices>): this {\n return this.register('patch', path, schema, handler);\n }\n\n delete<S extends RouteSchema>(path: string, schema: S, handler: KozoHandler<S, TServices>): this {\n return this.register('delete', path, schema, handler);\n }\n\n private register(method: string, path: string, schema: RouteSchema, handler: KozoHandler<any, any>): this {\n this.routes.push({ method, path, schema });\n\n // 1. Compile schemas (Zod -> Ajv validators + fast-json-stringify serializer)\n const compiled = SchemaCompiler.compile(schema);\n\n // 2. Generate the optimized Hono handler\n const optimizedHandler = compileRouteHandler(\n handler,\n schema,\n this.services,\n compiled,\n );\n\n // 3. Register the compiled handler with Hono\n (this.app as any)[method](path, optimizedHandler);\n\n // 4. Generate and store a native Node.js handler (used by nativeListen)\n const nativeHandler = compileNativeHandler(handler, schema, this.services, compiled);\n // 4b. Compile the zero-shim uWS native handler (used when uWS transport is active)\n const uwsHandler = compileUwsNativeHandler(handler, schema, this.services, compiled);\n this.uwsHandlerMap.set(nativeHandler, uwsHandler);\n const paramNames: string[] = [];\n const regexStr = path.replace(/:([^/]+)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n if (paramNames.length === 0) {\n this.nativeRoutes.push({ method: method.toUpperCase(), path, staticPath: path, handler: nativeHandler });\n } else {\n this.nativeRoutes.push({\n method: method.toUpperCase(),\n path,\n regex: new RegExp(`^${regexStr}$`),\n paramNames,\n handler: nativeHandler,\n });\n }\n\n return this;\n }\n\n /**\n * Start a raw Node.js HTTP server (no @hono/node-server adapter).\n * Writes directly to ServerResponse — eliminates Web API Request/Response\n * allocation and adapter overhead for maximum throughput.\n *\n * When the Zig WASM radix trie is available (`src/wasm/radix.wasm`),\n * ALL route matching (static + dynamic) runs through the zero-copy\n * trie — one call into WASM per request.\n *\n * When the .wasm file is absent (Edge deploy, CI without Zig, etc.)\n * routing falls back transparently to the JS Map + RegExp approach.\n *\n * Returns { port, server } so the caller can close the server when done.\n */\n async nativeListen(port: number = 3000): Promise<{ port: number; server: Server }> {\n // ── Try to initialise the WASM radix router ─────────────────────────\n const wasmOk = await this.wasmRouter.init();\n\n if (wasmOk) {\n // Register every known route in the Zig trie\n for (const entry of this.nativeRoutes) {\n const path = entry.staticPath ?? entry.regex?.source\n .replace(/^\\^/, '')\n .replace(/\\$$/, '')\n .replace(/\\(\\[\\\\^\\/\\]\\+\\)/g, () => `:${entry.paramNames?.shift() ?? 'p'}`)\n ?? '/';\n this.wasmRouter.addRoute(entry.method, entry.staticPath ?? path, entry.handler);\n }\n console.log('⚡ WASM radix router active (zero-copy Zig trie)');\n } else {\n console.log('ℹ️ WASM radix router unavailable — using JS fallback');\n }\n\n // ── Build JS fallback structures (used when WASM is absent) ─────────\n const staticMap = new Map<string, NativeRouteHandler>();\n const dynamicRoutes: Array<{\n method: string;\n regex: RegExp;\n paramNames: string[];\n handler: NativeRouteHandler;\n }> = [];\n\n for (const entry of this.nativeRoutes) {\n if (entry.staticPath !== undefined) {\n staticMap.set(`${entry.method}:${entry.staticPath}`, entry.handler);\n } else {\n dynamicRoutes.push({\n method: entry.method,\n regex: entry.regex!,\n paramNames: entry.paramNames!,\n handler: entry.handler,\n });\n }\n }\n\n // ── Shared route matcher (used by both uWS and node:http) ──────────\n const wasm = wasmOk ? this.wasmRouter : null;\n const emptyParams = Object.freeze({}) as Record<string, string>;\n\n const matchRoute = (method: string, path: string) => {\n if (wasm) {\n const r = wasm.match(method, path);\n if (r) return { handler: r.handler, params: r.params };\n return null;\n }\n const staticHandler = staticMap.get(`${method}:${path}`);\n if (staticHandler) return { handler: staticHandler, params: emptyParams };\n for (const route of dynamicRoutes) {\n if (route.method !== method) continue;\n const m = route.regex.exec(path);\n if (!m) continue;\n const params: Record<string, string> = {};\n for (let i = 0; i < route.paramNames.length; i++) {\n params[route.paramNames[i]] = m[i + 1];\n }\n return { handler: route.handler, params };\n }\n return null;\n };\n\n // ── Try uWebSockets.js transport ────────────────────────────────────\n // uWS replaces node:http entirely: C++ HTTP parser + epoll/kqueue.\n // Compiled handlers are called directly via UwsNativeHandler — zero shims,\n // zero allocations, one cork() syscall per response.\n const uwsBindings = await tryLoadUws();\n if (uwsBindings) {\n console.log('🚀 uWebSockets.js transport active (native per-route C++ matching)');\n // Build routes array — each route is registered directly with uWS C++ router\n const uwsMap = this.uwsHandlerMap;\n const uwsRoutes: UwsRouteEntry[] = [];\n for (const entry of this.nativeRoutes) {\n const uwsH = uwsMap.get(entry.handler);\n if (!uwsH) continue;\n uwsRoutes.push({\n method: entry.method,\n path: entry.path,\n paramNames: entry.paramNames ?? [],\n handler: uwsH,\n });\n }\n return createUwsServer({\n uws: uwsBindings,\n routes: uwsRoutes,\n port,\n }) as Promise<{ port: number; server: Server }>;\n }\n\n // ── Fallback: node:http dispatch ────────────────────────────────────\n const dispatch = (req: IncomingMessage, res: ServerResponse) => {\n const method = req.method!;\n const rawUrl = req.url!;\n const qIdx = rawUrl.indexOf('?');\n const path = qIdx === -1 ? rawUrl : rawUrl.slice(0, qIdx);\n\n // ── WASM fast path (single trie call for ALL routes) ────────────\n if (wasm) {\n const result = wasm.match(method, path);\n if (result) {\n result.handler(req, res, result.params);\n return;\n }\n fastWrite404(res);\n return;\n }\n\n // ── JS fallback: O(1) static + linear dynamic ──────────────────\n const staticHandler = staticMap.get(`${method}:${path}`);\n if (staticHandler) {\n staticHandler(req, res, emptyParams);\n return;\n }\n\n for (const route of dynamicRoutes) {\n if (route.method !== method) continue;\n const match = route.regex.exec(path);\n if (!match) continue;\n const params: Record<string, string> = {};\n for (let i = 0; i < route.paramNames.length; i++) {\n params[route.paramNames[i]] = match[i + 1];\n }\n route.handler(req, res, params);\n return;\n }\n\n fastWrite404(res);\n };\n\n return new Promise((resolve) => {\n const server = createServer(dispatch);\n server.listen(port, () => {\n const addr = server.address() as { port: number };\n resolve({ port: addr.port, server });\n });\n });\n }\n\n async listen(port?: number): Promise<void> {\n const finalPort = port ?? 3000;\n const manager = this.shutdownManager;\n\n // Wrap fetch to reject incoming requests during shutdown and track in-flight count\n const shutdownFetch = async (req: Request, ...args: any[]) => {\n if (manager.isShuttingDown()) {\n return new Response(\n JSON.stringify({\n type: 'about:blank',\n title: 'Service Unavailable',\n status: 503,\n detail: 'Server is shutting down, please retry later',\n }),\n {\n status: 503,\n headers: { 'Content-Type': 'application/problem+json' },\n },\n );\n }\n const untrack = manager.trackRequest();\n try {\n return await (this.app.fetch as any)(req, ...args);\n } finally {\n untrack();\n }\n };\n\n const server = serve({\n fetch: shutdownFetch,\n port: finalPort,\n }) as unknown as Server;\n\n manager.setServer(server);\n console.log(`🚀 Kozo server listening on http://localhost:${finalPort}`);\n }\n\n /**\n * Graceful shutdown — drains in-flight requests before closing.\n * Use getShutdownManager().setDatabase(db, provider) to register DB cleanup.\n */\n async shutdown(options?: ShutdownOptions): Promise<void> {\n return this.shutdownManager.shutdown(options);\n }\n\n getShutdownManager(): ShutdownManager {\n return this.shutdownManager;\n }\n\n getApp(): Hono {\n return this.app;\n }\n\n get fetch() {\n return this.app.fetch;\n }\n}\n\n// ============================================\n// AI Schema Generation utility\n// ============================================\n\nfunction inferType(value: any): string {\n if (value === null || value === undefined) return 'any';\n if (typeof value === 'string') return 'string';\n if (typeof value === 'number') return 'number';\n if (typeof value === 'boolean') return 'boolean';\n if (Array.isArray(value)) {\n if (value.length === 0) return 'array';\n const itemTypes = [...new Set(value.map(inferType))];\n return `array<${itemTypes.length === 1 ? itemTypes[0] : 'any'}>`;\n }\n if (typeof value === 'object') return 'object';\n return 'any';\n}\n\nfunction generateZodSchema(examples: any[]): string {\n if (examples.length === 0) return 'z.any()';\n\n const first = examples[0];\n const type = inferType(first);\n\n switch (type) {\n case 'string': {\n const hasEmail = examples.some(e => typeof e === 'string' && e.includes('@'));\n const hasUUID = examples.some(\n e => typeof e === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e),\n );\n if (hasEmail) return 'z.string().email()';\n if (hasUUID) return 'z.string().uuid()';\n return 'z.string()';\n }\n case 'number':\n return 'z.number()';\n case 'boolean':\n return 'z.boolean()';\n case 'array': {\n const itemType = inferType(first[0]);\n switch (itemType) {\n case 'string': return 'z.array(z.string())';\n case 'number': return 'z.array(z.number())';\n case 'boolean': return 'z.array(z.boolean())';\n default: return 'z.array(z.any())';\n }\n }\n case 'object': {\n const props: string[] = [];\n for (const example of examples) {\n if (typeof example === 'object' && example !== null) {\n for (const key of Object.keys(example)) {\n if (props.some(p => p.startsWith(`${key}:`))) continue;\n const values = examples.map(e => e?.[key]).filter(v => v !== undefined);\n const propType = inferType(values[0]);\n switch (propType) {\n case 'string': {\n const hasEmail = values.some(v => typeof v === 'string' && v.includes('@'));\n const hasUUID = values.some(\n v => typeof v === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v),\n );\n if (hasEmail) props.push(`${key}: z.string().email()`);\n else if (hasUUID) props.push(`${key}: z.string().uuid()`);\n else props.push(`${key}: z.string()`);\n break;\n }\n case 'number': props.push(`${key}: z.number()`); break;\n case 'boolean': props.push(`${key}: z.boolean()`); break;\n case 'array': props.push(`${key}: z.array(z.any())`); break;\n default: props.push(`${key}: z.any()`); break;\n }\n }\n }\n }\n return `z.object({\\n ${props.join(',\\n ')}\\n})`;\n }\n default:\n return 'z.any()';\n }\n}\n\nexport function generateSchema(examples: any[]) {\n return generateZodSchema(examples);\n}\n\nexport function createKozo<TServices extends Services = Services>(\n config?: KozoConfig<TServices>,\n): Kozo<TServices> {\n return new Kozo<TServices>(config);\n}\n","import type { RouteSchema } from './types.js';\r\n\r\n/**\r\n * Client Generator Options\r\n */\r\nexport interface ClientGeneratorOptions {\r\n /** Include Zod schemas for client-side validation (default: true) */\r\n includeValidation?: boolean;\r\n \r\n /** Base URL for the API (default: '') */\r\n baseUrl?: string;\r\n \r\n /** Enable runtime validation by default (default: false) */\r\n validateByDefault?: boolean;\r\n \r\n /** Custom headers to include in all requests */\r\n defaultHeaders?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Route information for client generation\r\n */\r\nexport interface RouteInfo {\r\n method: string;\r\n path: string;\r\n schema: RouteSchema;\r\n /** Optional: store the Zod schema instance for type extraction */\r\n zodSchemas?: {\r\n body?: any;\r\n query?: any;\r\n params?: any;\r\n response?: any;\r\n };\r\n}\r\n\r\n/**\r\n * Generate a safe method name from a route path\r\n */\r\nfunction generateMethodName(method: string, path: string): string {\r\n // Remove leading/trailing slashes\r\n const cleanPath = path.replace(/^\\/+|\\/+$/g, '');\r\n \r\n // Replace path params with their names\r\n const withParams = cleanPath.replace(/:(\\w+)/g, 'By$1');\r\n \r\n // Replace slashes and special chars with underscores\r\n const safeName = withParams\r\n .replace(/[\\/\\-\\.]/g, '_')\r\n .replace(/[^\\w]/g, '');\r\n \r\n // Prepend method name if not GET\r\n if (method.toLowerCase() !== 'get') {\r\n return method.toLowerCase() + safeName.charAt(0).toUpperCase() + safeName.slice(1);\r\n }\r\n \r\n return safeName || 'index';\r\n}\r\n\r\n/**\r\n * Extract path parameters from a route path\r\n */\r\nfunction extractPathParams(path: string): string[] {\r\n const matches = path.match(/:(\\w+)/g);\r\n return matches ? matches.map(m => m.slice(1)) : [];\r\n}\r\n\r\n/**\r\n * Generate typed client code from routes\r\n */\r\nexport function generateTypedClient(\r\n routes: RouteInfo[],\r\n options: ClientGeneratorOptions = {}\r\n): string {\r\n const {\r\n includeValidation = true,\r\n baseUrl = '',\r\n validateByDefault = false,\r\n defaultHeaders = {}\r\n } = options;\r\n\r\n const imports: string[] = [];\r\n const typeDefinitions: string[] = [];\r\n const schemaExports: string[] = [];\r\n const methodImplementations: string[] = [];\r\n \r\n // Add base imports\r\n if (includeValidation) {\r\n imports.push(`import { z } from 'zod';`);\r\n }\r\n\r\n // Header\r\n let code = `// Auto-generated Kozo Client\\n`;\r\n code += `// Generated at ${new Date().toISOString()}\\n`;\r\n code += `// DO NOT EDIT - Changes will be overwritten\\n\\n`;\r\n\r\n // Track schema variable names for type inference\r\n const schemaVars = new Map<string, string>();\r\n\r\n // Process each route\r\n for (const route of routes) {\r\n const methodName = generateMethodName(route.method, route.path);\r\n const pathParams = extractPathParams(route.path);\r\n \r\n // Generate type definitions using z.infer\r\n let paramsType = 'void';\r\n let bodyType = 'void';\r\n let queryType = 'void';\r\n let responseType = 'unknown';\r\n \r\n if (pathParams.length > 0) {\r\n paramsType = `{ ${pathParams.map(p => `${p}: string`).join('; ')} }`;\r\n }\r\n \r\n if (route.zodSchemas?.body || route.schema.body) {\r\n const schemaVarName = `${capitalize(methodName)}BodySchema`;\r\n schemaVars.set(`${methodName}_body`, schemaVarName);\r\n bodyType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n // Store schema as serialized string that will be evaluated\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n if (route.zodSchemas?.query || route.schema.query) {\r\n const schemaVarName = `${capitalize(methodName)}QuerySchema`;\r\n schemaVars.set(`${methodName}_query`, schemaVarName);\r\n queryType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n if (route.zodSchemas?.response || route.schema.response) {\r\n const schemaVarName = `${capitalize(methodName)}ResponseSchema`;\r\n schemaVars.set(`${methodName}_response`, schemaVarName);\r\n responseType = `z.infer<typeof ${schemaVarName}>`;\r\n \r\n if (includeValidation) {\r\n schemaExports.push(`// @ts-ignore - Schema defined at runtime\\nexport const ${schemaVarName}: any = null;`);\r\n }\r\n }\r\n \r\n // Generate type aliases\r\n if (bodyType !== 'void' && !bodyType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Body = ${bodyType};`);\r\n }\r\n if (queryType !== 'void' && !queryType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Query = ${queryType};`);\r\n }\r\n if (!responseType.includes('z.infer')) {\r\n typeDefinitions.push(`export type ${capitalize(methodName)}Response = ${responseType};`);\r\n }\r\n \r\n // Generate method signature\r\n const args: string[] = [];\r\n if (paramsType !== 'void') args.push(`params: ${paramsType}`);\r\n if (bodyType !== 'void') args.push(`body: ${bodyType}`);\r\n if (queryType !== 'void') args.push(`query?: ${queryType}`);\r\n \r\n const argsStr = args.join(', ');\r\n const returnType = `Promise<${responseType}>`;\r\n \r\n // Generate method implementation\r\n let methodBody = ` async ${methodName}(${argsStr}): ${returnType} {\\n`;\r\n \r\n // Validation\r\n if (includeValidation && bodyType !== 'void') {\r\n const schemaVar = schemaVars.get(`${methodName}_body`);\r\n if (schemaVar) {\r\n methodBody += ` if (this.validateRequests && ${schemaVar}) {\\n`;\r\n methodBody += ` ${schemaVar}.parse(body);\\n`;\r\n methodBody += ` }\\n`;\r\n }\r\n }\r\n \r\n // URL construction\r\n let urlExpression = `\\`\\${this.baseUrl}${route.path}\\``;\r\n if (pathParams.length > 0) {\r\n // Replace :param with ${params.param}\r\n const pathWithParams = route.path.replace(/:(\\w+)/g, '${params.$1}');\r\n urlExpression = `\\`\\${this.baseUrl}${pathWithParams}\\``;\r\n }\r\n \r\n methodBody += ` let url = ${urlExpression};\\n`;\r\n \r\n // Query string\r\n if (queryType !== 'void') {\r\n methodBody += ` if (query) {\\n`;\r\n methodBody += ` const queryString = new URLSearchParams(query as any).toString();\\n`;\r\n methodBody += ` url += \\`?\\${queryString}\\`;\\n`;\r\n methodBody += ` }\\n`;\r\n }\r\n \r\n // Fetch options\r\n methodBody += ` const options: RequestInit = {\\n`;\r\n methodBody += ` method: '${route.method.toUpperCase()}',\\n`;\r\n methodBody += ` headers: { ...this.defaultHeaders, 'Content-Type': 'application/json' },\\n`;\r\n if (bodyType !== 'void') {\r\n methodBody += ` body: JSON.stringify(body),\\n`;\r\n }\r\n methodBody += ` };\\n`;\r\n \r\n // Execute request\r\n methodBody += ` const response = await fetch(url, options);\\n`;\r\n methodBody += ` if (!response.ok) {\\n`;\r\n methodBody += ` throw new Error(\\`HTTP \\${response.status}: \\${response.statusText}\\`);\\n`;\r\n methodBody += ` }\\n`;\r\n methodBody += ` return response.json();\\n`;\r\n methodBody += ` }\\n`;\r\n \r\n methodImplementations.push(methodBody);\r\n }\r\n\r\n // Build final code\r\n if (imports.length > 0) {\r\n code += imports.join('\\n') + '\\n\\n';\r\n }\r\n\r\n if (typeDefinitions.length > 0) {\r\n code += '// Type Definitions\\n';\r\n code += typeDefinitions.join('\\n') + '\\n\\n';\r\n }\r\n\r\n if (includeValidation && schemaExports.length > 0) {\r\n code += '// Zod Schemas\\n';\r\n code += schemaExports.join('\\n') + '\\n\\n';\r\n }\r\n\r\n // Client class\r\n code += `export interface KozoClientOptions {\\n`;\r\n code += ` baseUrl?: string;\\n`;\r\n code += ` validateRequests?: boolean;\\n`;\r\n code += ` defaultHeaders?: Record<string, string>;\\n`;\r\n code += `}\\n\\n`;\r\n\r\n code += `export class KozoClient {\\n`;\r\n code += ` private baseUrl: string;\\n`;\r\n code += ` private validateRequests: boolean;\\n`;\r\n code += ` private defaultHeaders: Record<string, string>;\\n\\n`;\r\n \r\n code += ` constructor(options: KozoClientOptions = {}) {\\n`;\r\n code += ` this.baseUrl = options.baseUrl || '${baseUrl}';\\n`;\r\n code += ` this.validateRequests = options.validateRequests ?? ${validateByDefault};\\n`;\r\n code += ` this.defaultHeaders = options.defaultHeaders || ${JSON.stringify(defaultHeaders)};\\n`;\r\n code += ` }\\n\\n`;\r\n \r\n // Add all methods\r\n code += methodImplementations.join('\\n');\r\n \r\n code += `}\\n\\n`;\r\n code += `export default KozoClient;\\n`;\r\n\r\n return code;\r\n}\r\n\r\n/**\r\n * Capitalize first letter\r\n */\r\nfunction capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n","// ============================================================================\r\n// Kozo uWS Transport — uWebSockets.js adapter for nativeListen\r\n// ============================================================================\r\n//\r\n// Architecture:\r\n//\r\n// Each route is registered directly with uWS's C++ radix trie router\r\n// (app.get, app.post, …) — zero JS routing overhead per request.\r\n//\r\n// Compiled handlers (UwsNativeHandler) are called with pre-extracted\r\n// parameters from uWS C++ — no WASM trie, no JS dispatch, no shims.\r\n//\r\n// uWS C++ trie match → JS callback → UwsNativeHandler(uwsRes, url, body, params)\r\n//\r\n// Performance gains:\r\n// 1. No IncomingMessage / ServerResponse object allocation\r\n// 2. cork() batches all header + body writes into one kernel send()\r\n// 3. C++ radix trie routes — zero JS routing per request\r\n// 4. HTTP parser in C++ — zero JS allocation per header field\r\n// 5. Zero-shim handlers write directly via cork()\r\n//\r\n// Usage:\r\n// const uws = await tryLoadUws();\r\n// if (uws) { /* use createUwsServer() */ }\r\n// else { /* fall back to node:http */ }\r\n// ============================================================================\r\n\r\nimport type { IncomingMessage, ServerResponse } from 'node:http';\r\nimport { createServer as netCreateServer } from 'node:net';\r\nimport { KozoError } from './errors.js';\r\n\r\n// ── Minimal uWS type surface ─────────────────────────────────────────────────\r\n\r\nexport interface UwsBindings {\r\n App(): UwsApp;\r\n us_listen_socket_close(token: unknown): void;\r\n}\r\n\r\nexport interface UwsApp {\r\n get(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n post(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n put(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n patch(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n del(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n options(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n head(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n any(pattern: string, handler: (res: UwsHttpRes, req: UwsHttpReq) => void): UwsApp;\r\n listen(port: number, cb: (listenSocket: unknown) => void): void;\r\n}\r\n\r\nexport interface UwsHttpRes {\r\n cork(fn: () => void): void;\r\n writeStatus(status: string): UwsHttpRes;\r\n writeHeader(key: string, value: string): UwsHttpRes;\r\n end(body?: string): UwsHttpRes;\r\n onData(cb: (chunk: ArrayBuffer, isLast: boolean) => void): UwsHttpRes;\r\n onAborted(cb: () => void): UwsHttpRes;\r\n}\r\n\r\nexport interface UwsHttpReq {\r\n getMethod(): string;\r\n getUrl(): string;\r\n getQuery(): string;\r\n getParameter(index: number): string;\r\n}\r\n\r\n// ── Status text cache ─────────────────────────────────────────────────────────\r\n\r\nconst STATUS_TEXT: Record<number, string> = {\r\n 200: '200 OK', 201: '201 Created', 204: '204 No Content',\r\n 301: '301 Moved Permanently', 302: '302 Found',\r\n 400: '400 Bad Request', 401: '401 Unauthorized', 403: '403 Forbidden',\r\n 404: '404 Not Found', 405: '405 Method Not Allowed',\r\n 422: '422 Unprocessable Entity', 429: '429 Too Many Requests',\r\n 500: '500 Internal Server Error', 503: '503 Service Unavailable',\r\n};\r\n\r\n// ── Pre-built 404 body ────────────────────────────────────────────────────────\r\n\r\nconst BODY_404 = JSON.stringify({\r\n type: 'https://kozo.dev/errors/not-found',\r\n title: 'Resource Not Found',\r\n status: 404,\r\n});\r\n\r\n// ── HTTP methods that never carry a request body ──────────────────────────────\r\n\r\nconst NO_BODY_METHODS = new Set(['GET', 'HEAD', 'DELETE', 'OPTIONS', 'TRACE']);\r\n\r\n// ── Content-Type constants ────────────────────────────────────────────────────\r\n\r\nconst CT_JSON = 'application/json';\r\nconst CT_PROBLEM = 'application/problem+json';\r\n\r\n// ── Pre-built 500 body ────────────────────────────────────────────────────────\r\n\r\nconst BODY_500 = JSON.stringify({\r\n type: 'https://kozo.dev/errors/internal-error',\r\n title: 'Internal Server Error',\r\n status: 500,\r\n});\r\n\r\n// ============================================================================\r\n// uWS-native fast response functions\r\n//\r\n// These are zero-shim equivalents of fast-response.ts helpers.\r\n// They write directly via cork() — no shimReq/shimRes allocation,\r\n// no writeHead capture, no header loop indirection.\r\n// ============================================================================\r\n\r\n/** Write a 200 JSON response directly to uWS. */\r\nexport function uwsFastWriteJson(uwsRes: UwsHttpRes, body: string): void {\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus('200 OK');\r\n uwsRes.writeHeader('Content-Type', CT_JSON);\r\n uwsRes.end(body);\r\n });\r\n}\r\n\r\n/** Write a JSON response with a custom HTTP status code. */\r\nexport function uwsFastWriteJsonStatus(uwsRes: UwsHttpRes, body: string, status: number): void {\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus(STATUS_TEXT[status] ?? `${status}`);\r\n uwsRes.writeHeader('Content-Type', CT_JSON);\r\n uwsRes.end(body);\r\n });\r\n}\r\n\r\n/** Write a 400 Validation Failed response. */\r\nexport function uwsFastWrite400(field: string, errors: any, uwsRes: UwsHttpRes): void {\r\n const body = JSON.stringify({\r\n type: 'https://kozo.dev/errors/validation-failed',\r\n title: 'Validation Failed',\r\n status: 400,\r\n errors: (errors ?? []).map((e: any) => ({\r\n field: e.instancePath?.replace(/^\\//, '').replace(/\\//g, '.') || e.params?.missingProperty || 'unknown',\r\n message: e.message || 'Invalid value',\r\n code: e.keyword || 'invalid',\r\n })),\r\n });\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus('400 Bad Request');\r\n uwsRes.writeHeader('Content-Type', CT_PROBLEM);\r\n uwsRes.end(body);\r\n });\r\n}\r\n\r\n/** Write a 500 Internal Server Error response. */\r\nexport function uwsFastWrite500(uwsRes: UwsHttpRes): void {\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus('500 Internal Server Error');\r\n uwsRes.writeHeader('Content-Type', CT_PROBLEM);\r\n uwsRes.end(BODY_500);\r\n });\r\n}\r\n\r\n/** Write a KozoError or fall back to 500. */\r\nexport function uwsFastWriteError(err: unknown, uwsRes: UwsHttpRes): void {\r\n if (err instanceof KozoError) {\r\n const body = JSON.stringify({\r\n type: `https://kozo.dev/errors/${err.code}`,\r\n title: err.message,\r\n status: err.statusCode,\r\n });\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus(STATUS_TEXT[err.statusCode] ?? `${err.statusCode}`);\r\n uwsRes.writeHeader('Content-Type', CT_PROBLEM);\r\n uwsRes.end(body);\r\n });\r\n } else {\r\n uwsFastWrite500(uwsRes);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Public API\r\n// ============================================================================\r\n\r\n/**\r\n * Try to load uWebSockets.js via CJS require (it ships as a native .node file).\r\n * Returns null if the module is not installed or fails to load.\r\n */\r\nexport async function tryLoadUws(): Promise<UwsBindings | null> {\r\n try {\r\n const { createRequire } = await import('node:module');\r\n const req = createRequire(import.meta.url);\r\n return req('uWebSockets.js') as UwsBindings;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Write a pre-built 404 response directly to a uWS response.\r\n */\r\nexport function uwsWrite404(uwsRes: UwsHttpRes): void {\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus('404 Not Found');\r\n uwsRes.writeHeader('Content-Type', 'application/problem+json');\r\n uwsRes.end(BODY_404);\r\n });\r\n}\r\n\r\n// ============================================================================\r\n// Shim factories\r\n// ============================================================================\r\n\r\n/**\r\n * Lightweight fake ServerResponse.\r\n *\r\n * Our compiled handlers call:\r\n * res.writeHead(status, [key, val, key, val, …])\r\n * res.end(body)\r\n *\r\n * We capture the status + flat header array and flush everything via a single\r\n * uWS cork() call — zero extra syscalls.\r\n */\r\nexport function makeShimRes(uwsRes: UwsHttpRes): ServerResponse {\r\n let _status = 200;\r\n let _headers: string[] = [];\r\n\r\n return {\r\n writeHead(status: number, headers: string[]) {\r\n _status = status;\r\n _headers = headers;\r\n },\r\n end(body: string = '') {\r\n uwsRes.cork(() => {\r\n uwsRes.writeStatus(STATUS_TEXT[_status] ?? String(_status));\r\n for (let i = 0; i + 1 < _headers.length; i += 2) {\r\n // Skip Content-Length — uWS auto-computes it from the body passed to end().\r\n // Writing it manually would cause a \"Duplicate Content-Length\" parse error.\r\n if (_headers[i] === 'Content-Length') continue;\r\n uwsRes.writeHeader(_headers[i], _headers[i + 1]);\r\n }\r\n uwsRes.end(body);\r\n });\r\n },\r\n } as unknown as ServerResponse;\r\n}\r\n\r\n/**\r\n * Lightweight fake IncomingMessage for no-body routes (GET, DELETE, …).\r\n *\r\n * The compiled S1/S2 handlers only access req.method and req.url — nothing\r\n * else. We allocate a plain object with just those two fields.\r\n */\r\nexport function makeShimReqNoBody(method: string, url: string): IncomingMessage {\r\n return { method, url } as unknown as IncomingMessage;\r\n}\r\n\r\n/**\r\n * Lightweight fake IncomingMessage for body routes (POST, PUT, PATCH).\r\n *\r\n * readNativeBody() in compiler.ts does:\r\n * req.on('data', chunk => …)\r\n * req.on('end', () => …)\r\n * req.on('error', e => …)\r\n *\r\n * We pre-buffer the body from uWS's onData, then replay it as a Node stream\r\n * using queueMicrotask so the Promise in readNativeBody resolves correctly.\r\n */\r\nexport function makeShimReqWithBody(method: string, url: string, rawBody: string): IncomingMessage {\r\n const dataListeners: Array<(chunk: Buffer) => void> = [];\r\n const endListeners: Array<() => void> = [];\r\n let scheduled = false;\r\n\r\n function scheduleEmit() {\r\n if (scheduled) return;\r\n scheduled = true;\r\n queueMicrotask(() => {\r\n const buf = rawBody ? Buffer.from(rawBody, 'utf8') : null;\r\n if (buf) for (const l of dataListeners) l(buf);\r\n for (const l of endListeners) l();\r\n });\r\n }\r\n\r\n return {\r\n method,\r\n url,\r\n on(event: string, listener: Function) {\r\n if (event === 'data') { dataListeners.push(listener as any); scheduleEmit(); }\r\n else if (event === 'end') { endListeners.push(listener as any); scheduleEmit(); }\r\n // 'error' listeners intentionally ignored — uWS aborts are handled separately\r\n return this;\r\n },\r\n } as unknown as IncomingMessage;\r\n}\r\n\r\n// ============================================================================\r\n// Core uWS dispatch factory\r\n// ============================================================================\r\n\r\n/**\r\n * Zero-shim uWS native handler signature.\r\n *\r\n * Parameters are passed directly from the uWS dispatcher:\r\n * uwsRes — uWS response (write via cork/writeStatus/writeHeader/end)\r\n * url — full URL including query string e.g. '/api/users?page=1'\r\n * rawBody — pre-buffered request body string (empty string for no-body routes)\r\n * params — path parameters extracted by the router e.g. { id: '42' }\r\n */\r\nexport type UwsNativeHandler = (\r\n uwsRes: UwsHttpRes,\r\n url: string,\r\n rawBody: string,\r\n params: Record<string, string>,\r\n) => void | Promise<void>;\r\n\r\nexport interface UwsRouteEntry {\r\n method: string; // uppercase: 'GET', 'POST', etc.\r\n path: string; // original pattern: '/api/users/:id'\r\n paramNames: string[]; // extracted param names: ['id'] or []\r\n handler: UwsNativeHandler;\r\n}\r\n\r\nexport interface UwsDispatchOptions {\r\n uws: UwsBindings;\r\n /** Routes to register directly with uWS C++ router. */\r\n routes: UwsRouteEntry[];\r\n port: number;\r\n}\r\n\r\n/**\r\n * Find an available TCP port (for port=0 ephemeral binding with uWS).\\\r\n * We ask node:net for a free port, then release it before handing it to uWS.\r\n * Slight race condition is acceptable — this is startup-only.\r\n */\r\nfunction getFreePort(): Promise<number> {\r\n return new Promise((resolve, reject) => {\r\n const srv = netCreateServer();\r\n srv.listen(0, '0.0.0.0', () => {\r\n const port = (srv.address() as { port: number }).port;\r\n srv.close((err) => err ? reject(err) : resolve(port));\r\n });\r\n });\r\n}\r\n\r\n// ── uWS method name map (HTTP verb → uWS app method) ─────────────────────────\r\n\r\nconst UWS_METHOD: Record<string, string> = {\r\n GET: 'get', POST: 'post', PUT: 'put', PATCH: 'patch',\r\n DELETE: 'del', OPTIONS: 'options', HEAD: 'head',\r\n};\r\n\r\n/**\r\n * Create a uWS HTTP server with native per-route C++ matching.\r\n *\r\n * Each route is registered directly with uWS (app.get, app.post, …) so the\r\n * C++ radix trie handles all URL matching — zero JS routing overhead.\r\n * A catch-all `any('/*')` returns 404 for unmatched paths.\r\n *\r\n * Returns { port, server } matching the nativeListen contract.\r\n */\r\nexport async function createUwsServer(opts: UwsDispatchOptions): Promise<{ port: number; server: { close(): void } }> {\r\n const { uws, routes } = opts;\r\n // uWS does not support ephemeral port 0 — find a free port via node:net first\r\n const port = opts.port === 0 ? await getFreePort() : opts.port;\r\n const emptyParams = Object.freeze({}) as Record<string, string>;\r\n\r\n return new Promise((resolve, reject) => {\r\n const uwsApp = uws.App();\r\n\r\n // ── Register each route directly with uWS C++ router ────────────────\r\n for (const route of routes) {\r\n const fn = UWS_METHOD[route.method];\r\n if (!fn) continue;\r\n\r\n const h = route.handler;\r\n const names = route.paramNames;\r\n const hasParams = names.length > 0;\r\n const noBody = NO_BODY_METHODS.has(route.method);\r\n\r\n if (noBody && !hasParams) {\r\n // ── Fastest path: static GET/HEAD/DELETE/OPTIONS, no params ──────\r\n (uwsApp as any)[fn](route.path, (uwsRes: UwsHttpRes, uwsReq: UwsHttpReq) => {\r\n const query = uwsReq.getQuery();\r\n h(uwsRes, query ? `${uwsReq.getUrl()}?${query}` : uwsReq.getUrl(), '', emptyParams);\r\n });\r\n\r\n } else if (noBody && hasParams) {\r\n // ── GET/HEAD/DELETE with path params ─────────────────────────────\r\n (uwsApp as any)[fn](route.path, (uwsRes: UwsHttpRes, uwsReq: UwsHttpReq) => {\r\n const rawPath = uwsReq.getUrl();\r\n const query = uwsReq.getQuery();\r\n const params: Record<string, string> = {};\r\n for (let i = 0; i < names.length; i++) params[names[i]] = uwsReq.getParameter(i);\r\n h(uwsRes, query ? `${rawPath}?${query}` : rawPath, '', params);\r\n });\r\n\r\n } else if (!hasParams) {\r\n // ── POST/PUT/PATCH without path params ──────────────────────────\r\n (uwsApp as any)[fn](route.path, (uwsRes: UwsHttpRes, uwsReq: UwsHttpReq) => {\r\n const rawPath = uwsReq.getUrl();\r\n const query = uwsReq.getQuery();\r\n const url = query ? `${rawPath}?${query}` : rawPath;\r\n let aborted = false;\r\n let bodyStr = '';\r\n uwsRes.onAborted(() => { aborted = true; });\r\n uwsRes.onData((chunk, isLast) => {\r\n if (aborted) return;\r\n if (chunk.byteLength > 0) bodyStr += Buffer.from(chunk).toString('utf8');\r\n if (isLast) h(uwsRes, url, bodyStr, emptyParams);\r\n });\r\n });\r\n\r\n } else {\r\n // ── POST/PUT/PATCH with path params ─────────────────────────────\r\n (uwsApp as any)[fn](route.path, (uwsRes: UwsHttpRes, uwsReq: UwsHttpReq) => {\r\n const rawPath = uwsReq.getUrl();\r\n const query = uwsReq.getQuery();\r\n const url = query ? `${rawPath}?${query}` : rawPath;\r\n const params: Record<string, string> = {};\r\n for (let i = 0; i < names.length; i++) params[names[i]] = uwsReq.getParameter(i);\r\n let aborted = false;\r\n let bodyStr = '';\r\n uwsRes.onAborted(() => { aborted = true; });\r\n uwsRes.onData((chunk, isLast) => {\r\n if (aborted) return;\r\n if (chunk.byteLength > 0) bodyStr += Buffer.from(chunk).toString('utf8');\r\n if (isLast) h(uwsRes, url, bodyStr, params);\r\n });\r\n });\r\n }\r\n }\r\n\r\n // ── Catch-all 404 for unmatched routes ──────────────────────────────\r\n uwsApp.any('/*', (uwsRes) => { uwsWrite404(uwsRes); });\r\n\r\n let listenToken: unknown = null;\r\n\r\n uwsApp.listen(port, (token) => {\r\n if (!token) {\r\n reject(new Error(`[Kozo] uWS failed to listen on port ${port}`));\r\n return;\r\n }\r\n listenToken = token;\r\n\r\n resolve({\r\n port,\r\n server: {\r\n close() {\r\n if (listenToken) uws.us_listen_socket_close(listenToken);\r\n },\r\n },\r\n });\r\n });\r\n });\r\n}\r\n","/**\n * Kozo Error System - RFC 7807 Problem Details\n *\n * Standardized error format for all validation and runtime errors.\n * Pre-serialized templates + frozen ResponseInit objects eliminate\n * per-request allocations on the hot path.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc7807\n */\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport interface ValidationError {\n field: string;\n message: string;\n code: string;\n value?: unknown;\n}\n\nexport interface ProblemDetails {\n type: string;\n title: string;\n status: number;\n detail?: string;\n instance?: string;\n errors?: ValidationError[];\n}\n\n// ============================================================================\n// Pre-compiled Error Responses (Zero allocation at runtime)\n// ============================================================================\n\nconst CONTENT_TYPE_PROBLEM = 'application/problem+json';\n\nexport const ERROR_RESPONSES = {\n VALIDATION_FAILED: {\n type: 'https://kozo.dev/errors/validation-failed',\n title: 'Validation Failed',\n status: 400,\n },\n INVALID_BODY: {\n type: 'https://kozo.dev/errors/invalid-body',\n title: 'Invalid Request Body',\n status: 400,\n },\n INVALID_QUERY: {\n type: 'https://kozo.dev/errors/invalid-query',\n title: 'Invalid Query Parameters',\n status: 400,\n },\n INVALID_PARAMS: {\n type: 'https://kozo.dev/errors/invalid-params',\n title: 'Invalid Path Parameters',\n status: 400,\n },\n INTERNAL_ERROR: {\n type: 'https://kozo.dev/errors/internal-error',\n title: 'Internal Server Error',\n status: 500,\n },\n NOT_FOUND: {\n type: 'https://kozo.dev/errors/not-found',\n title: 'Resource Not Found',\n status: 404,\n },\n UNAUTHORIZED: {\n type: 'https://kozo.dev/errors/unauthorized',\n title: 'Unauthorized',\n status: 401,\n },\n FORBIDDEN: {\n type: 'https://kozo.dev/errors/forbidden',\n title: 'Forbidden',\n status: 403,\n },\n} as const;\n\n// ============================================================================\n// Pre-frozen ResponseInit objects — V8 can constant-fold header reads\n// ============================================================================\n\nconst HDR_PROBLEM = { 'Content-Type': CONTENT_TYPE_PROBLEM };\n\nconst INIT_400 = Object.freeze({ status: 400, headers: HDR_PROBLEM }) as ResponseInit;\nconst INIT_401 = Object.freeze({ status: 401, headers: HDR_PROBLEM }) as ResponseInit;\nconst INIT_403 = Object.freeze({ status: 403, headers: HDR_PROBLEM }) as ResponseInit;\nconst INIT_404 = Object.freeze({ status: 404, headers: HDR_PROBLEM }) as ResponseInit;\nconst INIT_500 = Object.freeze({ status: 500, headers: HDR_PROBLEM }) as ResponseInit;\n\n// ============================================================================\n// Error Formatters\n// ============================================================================\n\n/**\n * Convert Ajv validation errors to standardized format\n */\nexport function formatAjvErrors(errors: any[] | null | undefined): ValidationError[] {\n if (!errors || errors.length === 0) return [];\n\n return errors.map(err => ({\n field: err.instancePath?.replace(/^\\//, '').replace(/\\//g, '.') || err.params?.missingProperty || 'unknown',\n message: err.message || 'Invalid value',\n code: err.keyword || 'invalid',\n value: err.data,\n }));\n}\n\n/**\n * Convert Zod validation errors to standardized format\n */\nexport function formatZodErrors(errors: any): ValidationError[] {\n if (!errors?.issues) return [];\n\n return errors.issues.map((issue: any) => ({\n field: issue.path?.join('.') || 'unknown',\n message: issue.message || 'Invalid value',\n code: issue.code || 'invalid',\n value: issue.input,\n }));\n}\n\n// ============================================================================\n// Response Builders\n//\n// Hot-path functions (validationErrorResponse, internalErrorResponse) avoid\n// any per-call object creation beyond the unavoidable JSON.stringify of the\n// dynamic payload.\n// ============================================================================\n\n/**\n * Build a 400 Validation Failed response.\n * Called on every invalid request — kept as lean as possible.\n */\nexport function validationErrorResponse(\n field: string,\n ajvErrors: any[] | null | undefined,\n instance?: string,\n): Response {\n const body: ProblemDetails = {\n type: ERROR_RESPONSES.VALIDATION_FAILED.type,\n title: ERROR_RESPONSES.VALIDATION_FAILED.title,\n status: 400,\n errors: formatAjvErrors(ajvErrors),\n };\n if (instance) body.instance = instance;\n return new Response(JSON.stringify(body), INIT_400);\n}\n\n/**\n * Build a 500 Internal Server Error response.\n */\nexport function internalErrorResponse(err: Error, instance?: string): Response {\n const body: ProblemDetails = {\n type: ERROR_RESPONSES.INTERNAL_ERROR.type,\n title: ERROR_RESPONSES.INTERNAL_ERROR.title,\n status: 500,\n detail: err?.message,\n };\n if (instance) body.instance = instance;\n return new Response(JSON.stringify(body), INIT_500);\n}\n\n/**\n * Build a 404 Not Found response.\n * Pre-serialized for the common case (no instance).\n */\n\n// Pre-serialized static bodies — zero allocation for the common case\nconst BODY_404_STATIC = JSON.stringify({\n type: ERROR_RESPONSES.NOT_FOUND.type,\n title: ERROR_RESPONSES.NOT_FOUND.title,\n status: 404,\n});\n\nexport function notFoundResponse(instance?: string): Response {\n if (!instance) return new Response(BODY_404_STATIC, INIT_404);\n const body: ProblemDetails = {\n type: ERROR_RESPONSES.NOT_FOUND.type,\n title: ERROR_RESPONSES.NOT_FOUND.title,\n status: 404,\n instance,\n };\n return new Response(JSON.stringify(body), INIT_404);\n}\n\n/**\n * Build a 401 Unauthorized response.\n */\n\nconst BODY_401_STATIC = JSON.stringify({\n type: ERROR_RESPONSES.UNAUTHORIZED.type,\n title: ERROR_RESPONSES.UNAUTHORIZED.title,\n status: 401,\n});\n\nexport function unauthorizedResponse(instance?: string): Response {\n if (!instance) return new Response(BODY_401_STATIC, INIT_401);\n const body: ProblemDetails = {\n type: ERROR_RESPONSES.UNAUTHORIZED.type,\n title: ERROR_RESPONSES.UNAUTHORIZED.title,\n status: 401,\n instance,\n };\n return new Response(JSON.stringify(body), INIT_401);\n}\n\n/**\n * Build a 403 Forbidden response.\n */\n\nconst BODY_403_STATIC = JSON.stringify({\n type: ERROR_RESPONSES.FORBIDDEN.type,\n title: ERROR_RESPONSES.FORBIDDEN.title,\n status: 403,\n});\n\nexport function forbiddenResponse(instance?: string): Response {\n if (!instance) return new Response(BODY_403_STATIC, INIT_403);\n const body: ProblemDetails = {\n type: ERROR_RESPONSES.FORBIDDEN.type,\n title: ERROR_RESPONSES.FORBIDDEN.title,\n status: 403,\n instance,\n };\n return new Response(JSON.stringify(body), INIT_403);\n}\n\n/**\n * Build a 500 Internal Server Error response (static, no detail).\n */\nconst BODY_500_STATIC = JSON.stringify({\n type: ERROR_RESPONSES.INTERNAL_ERROR.type,\n title: ERROR_RESPONSES.INTERNAL_ERROR.title,\n status: 500,\n});\n\nexport function internalErrorResponseStatic(): Response {\n return new Response(BODY_500_STATIC, INIT_500);\n}\n\n// ============================================================================\n// KozoError — Base Error Class\n// ============================================================================\n\nexport class KozoError extends Error {\n readonly statusCode: number;\n readonly code: string;\n\n constructor(message: string, statusCode: number, code: string) {\n super(message);\n this.name = 'KozoError';\n this.statusCode = statusCode;\n this.code = code;\n }\n\n toResponse(instance?: string): Response {\n const body: ProblemDetails = {\n type: `https://kozo.dev/errors/${this.code}`,\n title: this.message,\n status: this.statusCode,\n };\n if (instance) body.instance = instance;\n const init = _initForStatus(this.statusCode);\n return new Response(JSON.stringify(body), init);\n }\n}\n\n// Inline status → init lookup (avoids switch overhead for common codes)\nfunction _initForStatus(status: number): ResponseInit {\n if (status === 400) return INIT_400;\n if (status === 401) return INIT_401;\n if (status === 403) return INIT_403;\n if (status === 404) return INIT_404;\n if (status === 500) return INIT_500;\n return Object.freeze({ status, headers: HDR_PROBLEM }) as ResponseInit;\n}\n\n// ============================================================================\n// Concrete Error Classes\n// ============================================================================\n\nexport class ValidationFailedError extends KozoError {\n readonly errors: ValidationError[];\n\n constructor(message: string, errors: ValidationError[] = []) {\n super(message, 400, 'validation-failed');\n this.name = 'ValidationFailedError';\n this.errors = errors;\n }\n\n override toResponse(instance?: string): Response {\n const body: ProblemDetails = {\n type: 'https://kozo.dev/errors/validation-failed',\n title: this.message,\n status: 400,\n errors: this.errors,\n };\n if (instance) body.instance = instance;\n return new Response(JSON.stringify(body), INIT_400);\n }\n}\n\nexport class NotFoundError extends KozoError {\n constructor(message = 'Resource Not Found') {\n super(message, 404, 'not-found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class UnauthorizedError extends KozoError {\n constructor(message = 'Unauthorized') {\n super(message, 401, 'unauthorized');\n this.name = 'UnauthorizedError';\n }\n}\n\nexport class ForbiddenError extends KozoError {\n constructor(message = 'Forbidden') {\n super(message, 403, 'forbidden');\n this.name = 'ForbiddenError';\n }\n}\n\n// ============================================================================\n// Middleware-friendly Http* aliases (avoid collision with KozoError hierarchy)\n// ============================================================================\n\nexport class HttpError extends KozoError {}\nexport class HttpBadRequestError extends KozoError {\n constructor(message = 'Bad Request') { super(message, 400, 'bad-request'); }\n}\nexport class HttpUnauthorizedError extends UnauthorizedError {}\nexport class HttpForbiddenError extends ForbiddenError {}\nexport class HttpNotFoundError extends NotFoundError {}\nexport class HttpInternalError extends KozoError {\n constructor(message = 'Internal Server Error') { super(message, 500, 'internal-error'); }\n}\n","import type { Context } from 'hono';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Services, RouteSchema } from './types.js';\nimport type { UwsHttpRes, UwsNativeHandler } from './uws-transport.js';\nimport { uwsFastWriteJson, uwsFastWrite400, uwsFastWriteError } from './uws-transport.js';\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport Ajv, { type ValidateFunction } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport fastJson from 'fast-json-stringify';\nimport {\n validationErrorResponse,\n internalErrorResponse,\n internalErrorResponseStatic,\n KozoError,\n} from './errors.js';\nimport {\n fastWriteJson,\n fastWriteError,\n fastWrite400,\n fastWrite500,\n} from './fast-response.js';\n\ntype CompiledHandler = (c: Context) => Promise<Response> | Response;\ntype UserHandler = (c: any) => any;\n\nexport type NativeRouteHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n) => void;\n\n// ============================================================================\n// Shared Ajv instance — single instance across the whole framework\n// removeAdditional: 'all' → strips unknown fields (security + perf)\n// ============================================================================\nconst ajv = new Ajv({\n removeAdditional: 'all',\n useDefaults: true,\n coerceTypes: true,\n});\naddFormats(ajv);\n\nexport type CompiledRoute = {\n validateBody?: ValidateFunction;\n validateQuery?: ValidateFunction;\n validateParams?: ValidateFunction;\n serialize?: (data: any) => string;\n errors?: any;\n};\n\nfunction isZodSchema(schema: any): schema is z.ZodType {\n return typeof schema === 'object' && schema !== null && 'safeParse' in schema;\n}\n\n// Shared zod conversion options — $refStrategy:'none' prevents $ref generation\n// that would cause Ajv \"can't resolve reference\" errors\nconst ZOD_OPTS = { $refStrategy: 'none', target: 'jsonSchema7' } as const;\n\n// ============================================================================\n// Pre-allocated response init objects — frozen so V8 can constant-fold reads\n// ============================================================================\nconst HDR_JSON = { 'Content-Type': 'application/json' };\nconst RESPONSE_INIT_200 = Object.freeze({ status: 200, headers: HDR_JSON }) as ResponseInit;\n\n// Single reusable factory — avoids inline object literal allocation at call sites\nfunction jsonResponse200(body: string): Response {\n return new Response(body, RESPONSE_INIT_200);\n}\n\n// ============================================================================\n// Pre-built empty-body handler — captured once, never re-allocated\n// ============================================================================\nconst EMPTY_BODY: Record<string, never> = Object.freeze({}) as Record<string, never>;\nconst EMPTY_BODY_HANDLER = () => EMPTY_BODY;\n\n// ============================================================================\n// Fast serializer — skips JSON.stringify for plain strings\n// ============================================================================\nfunction toJsonBody(result: any): string {\n if (typeof result === 'string') return result;\n return JSON.stringify(result);\n}\n\nexport class SchemaCompiler {\n static compile(schema: RouteSchema): CompiledRoute {\n const compiled: CompiledRoute = {};\n\n // 1. Body (Zod → JSON Schema → Ajv validator)\n if (schema.body) {\n const jsonSchema = isZodSchema(schema.body)\n ? zodToJsonSchema(schema.body, ZOD_OPTS)\n : schema.body;\n compiled.validateBody = ajv.compile(jsonSchema);\n }\n\n // 2. Query\n if (schema.query) {\n const jsonSchema = isZodSchema(schema.query)\n ? zodToJsonSchema(schema.query, ZOD_OPTS)\n : schema.query;\n compiled.validateQuery = ajv.compile(jsonSchema);\n }\n\n // 3. Params\n if (schema.params) {\n const jsonSchema = isZodSchema(schema.params)\n ? zodToJsonSchema(schema.params, ZOD_OPTS)\n : schema.params;\n compiled.validateParams = ajv.compile(jsonSchema);\n }\n\n // 4. Serializer (Zod → JSON Schema → fast-json-stringify)\n if (schema.response) {\n if (typeof schema.response === 'object' && !isZodSchema(schema.response)) {\n const keys = Object.keys(schema.response);\n const isStatusMap = keys.length > 0 && keys.every(k => !isNaN(Number(k)));\n\n if (isStatusMap) {\n // Status code mapping: { 200: schema, 404: schema }\n const responseSchemas = schema.response as Record<number, any>;\n if (responseSchemas[200]) {\n const jsonSchema = isZodSchema(responseSchemas[200])\n ? zodToJsonSchema(responseSchemas[200], ZOD_OPTS)\n : responseSchemas[200];\n compiled.serialize = fastJson(jsonSchema as any);\n }\n } else {\n // Single TypeBox / raw JSON Schema\n compiled.serialize = fastJson(schema.response as any);\n }\n } else {\n // Single Zod schema\n const responseSchema = schema.response as z.ZodType<any>;\n const jsonSchema = zodToJsonSchema(responseSchema, ZOD_OPTS);\n compiled.serialize = fastJson(jsonSchema as any);\n }\n }\n\n return compiled;\n }\n}\n\n// ============================================================================\n// LA CHIAVE DI VOLTA: Route Handler Compiler\n//\n// Executed ONCE at startup per route.\n// Builds a monomorphic closure that captures all validators/serializers.\n// Zero runtime branching — scenario selected at compile time.\n//\n// Scenario matrix (selected once at route registration):\n//\n// S1 bare no validation, no services\n// S1s services no validation, with services\n// S2a query query only, ±services\n// S2b params params only, ±services\n// S2c query+params both, ±services\n// S3 full+ser body + serializer, ±services\n// S4 full noser body, no serializer, ±services\n//\n// Each scenario further splits on hasServices → 2 monomorphic closures.\n// V8 JIT-compiles each independently with fixed hidden class and inline budget.\n//\n// Hot path micro-opts applied to every scenario:\n// • c.req.path extracted once before try (single getter call)\n// • toJsonBody() skips JSON.stringify for plain string returns\n// • internalErrorResponseStatic() used in bare paths (no err.message needed)\n// ============================================================================\nexport function compileRouteHandler(\n handler: UserHandler,\n schema: RouteSchema,\n services: Services,\n compiled: CompiledRoute,\n): CompiledHandler {\n const { validateBody, validateQuery, validateParams, serialize } = compiled;\n\n // Compile-time flags — captured in closure, never re-evaluated\n const hasServices = services != null && Object.keys(services).length > 0;\n const hasQuery = !!validateQuery;\n const hasParams = !!validateParams;\n const hasBody = !!validateBody;\n const hasSer = !!serialize;\n // handler.length === 0 → handler declares no params, skip { c } allocation entirely.\n // Safe: zero-arg handlers cannot reference context regardless.\n const handlerIgnoresArgs = handler.length === 0;\n\n // ─── SCENARIO 1: Zero validation, no services ──────────────────────────────\n // Sync-capable: no async/await — eliminates one microtask for sync handlers.\n // Promise-detect fallback covers async user handlers transparently.\n // Compile-time hasSer split: uses fast-json-stringify when schema is present,\n // avoids runtime ternary on every request.\n if (!hasBody && !hasQuery && !hasParams && !hasServices) {\n if (hasSer) {\n const ser = serialize!;\n return function scenario1_bare_ser(c: Context) {\n try {\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario1_bare(c: Context) {\n try {\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n\n // ─── SCENARIO 1b: Zero validation, WITH services ───────────────────────────\n if (!hasBody && !hasQuery && !hasParams && hasServices) {\n if (hasSer) {\n const ser = serialize!;\n return function scenario1_services_ser(c: Context) {\n try {\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario1_services(c: Context) {\n try {\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n\n // ─── SCENARIO 2a: Query only (no params, no body) ──────────────────────────\n // Sync-capable: validation is sync, handler call uses promise-detect.\n // Lazy path (c.req.path) accessed only on error branch.\n // Compile-time hasSer split: eliminates runtime ternary on every request.\n if (hasQuery && !hasParams && !hasBody) {\n const vq = validateQuery!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function scenario2a_query_ser(c: Context) {\n try {\n const query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2a_query_svc_ser(c: Context) {\n try {\n const query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n if (!hasServices) {\n return function scenario2a_query(c: Context) {\n try {\n const query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2a_query_svc(c: Context) {\n try {\n const query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n\n // ─── SCENARIO 2b: Params only (no query, no body) ──────────────────────────\n if (hasParams && !hasQuery && !hasBody) {\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function scenario2b_params_ser(c: Context) {\n try {\n const params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, params });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2b_params_svc_ser(c: Context) {\n try {\n const params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, params, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n if (!hasServices) {\n return function scenario2b_params(c: Context) {\n try {\n const params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, params });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2b_params_svc(c: Context) {\n try {\n const params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, params, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n\n // ─── SCENARIO 2c: Query + Params (no body) ─────────────────────────────────\n if (hasQuery && hasParams && !hasBody) {\n const vq = validateQuery!;\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function scenario2c_qp_ser(c: Context) {\n try {\n const query = c.req.query();\n const params = c.req.param() as Record<string, string>;\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, params });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2c_qp_svc_ser(c: Context) {\n try {\n const query = c.req.query();\n const params = c.req.param() as Record<string, string>;\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, params, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(ser(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n if (!hasServices) {\n return function scenario2c_qp(c: Context) {\n try {\n const query = c.req.query();\n const params = c.req.param() as Record<string, string>;\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, params });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n return function scenario2c_qp_svc(c: Context) {\n try {\n const query = c.req.query();\n const params = c.req.param() as Record<string, string>;\n if (!vq(query)) return validationErrorResponse('query', vq.errors, c.req.path);\n if (!vp(params)) return validationErrorResponse('params', vp.errors, c.req.path);\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ c, query, params, services });\n if (result instanceof Response) return result;\n if (result != null && typeof (result as any).then === 'function') {\n return (result as Promise<any>).then(\n (r: any) => r instanceof Response ? r : jsonResponse200(toJsonBody(r)),\n (err: unknown) => err instanceof KozoError\n ? err.toResponse(c.req.path)\n : internalErrorResponse(err as Error, c.req.path),\n );\n }\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(c.req.path);\n return internalErrorResponse(err as Error, c.req.path);\n }\n };\n }\n\n // ─── SCENARIO 3: Full path WITH serializer ─────────────────────────────────\n if (hasBody && hasSer) {\n const vb = validateBody!;\n const ser = serialize!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return async function scenario3_full_ser(c: Context): Promise<Response> {\n const path = c.req.path;\n try {\n const body = await c.req.json().catch(EMPTY_BODY_HANDLER);\n if (!vb(body)) return validationErrorResponse('body', vb.errors, path);\n let query: Record<string, string> | undefined;\n let params: Record<string, string> | undefined;\n if (vq) {\n query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, path);\n }\n if (vp) {\n params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, path);\n }\n const result = await handler({ c, body, query, params });\n if (result instanceof Response) return result;\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(path);\n return internalErrorResponse(err as Error, path);\n }\n };\n }\n return async function scenario3_full_ser_svc(c: Context): Promise<Response> {\n const path = c.req.path;\n try {\n const body = await c.req.json().catch(EMPTY_BODY_HANDLER);\n if (!vb(body)) return validationErrorResponse('body', vb.errors, path);\n let query: Record<string, string> | undefined;\n let params: Record<string, string> | undefined;\n if (vq) {\n query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, path);\n }\n if (vp) {\n params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, path);\n }\n const result = await handler({ c, body, query, params, services });\n if (result instanceof Response) return result;\n return jsonResponse200(ser(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(path);\n return internalErrorResponse(err as Error, path);\n }\n };\n }\n\n // ─── SCENARIO 4: Full path WITHOUT serializer ──────────────────────────────\n if (hasBody && !hasSer) {\n const vb = validateBody!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return async function scenario4_full_noser(c: Context): Promise<Response> {\n const path = c.req.path;\n try {\n const body = await c.req.json().catch(EMPTY_BODY_HANDLER);\n if (!vb(body)) return validationErrorResponse('body', vb.errors, path);\n let query: Record<string, string> | undefined;\n let params: Record<string, string> | undefined;\n if (vq) {\n query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, path);\n }\n if (vp) {\n params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, path);\n }\n const result = await handler({ c, body, query, params });\n if (result instanceof Response) return result;\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(path);\n return internalErrorResponse(err as Error, path);\n }\n };\n }\n return async function scenario4_full_noser_svc(c: Context): Promise<Response> {\n const path = c.req.path;\n try {\n const body = await c.req.json().catch(EMPTY_BODY_HANDLER);\n if (!vb(body)) return validationErrorResponse('body', vb.errors, path);\n let query: Record<string, string> | undefined;\n let params: Record<string, string> | undefined;\n if (vq) {\n query = c.req.query();\n if (!vq(query)) return validationErrorResponse('query', vq.errors, path);\n }\n if (vp) {\n params = c.req.param() as Record<string, string>;\n if (!vp(params)) return validationErrorResponse('params', vp.errors, path);\n }\n const result = await handler({ c, body, query, params, services });\n if (result instanceof Response) return result;\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(path);\n return internalErrorResponse(err as Error, path);\n }\n };\n }\n\n // ─── SCENARIO 5: Fallback (should never be reached in practice) ────────────\n return async function scenario5_fallback(c: Context): Promise<Response> {\n const path = c.req.path;\n try {\n const result = await handler({ c, services: hasServices ? services : undefined });\n if (result instanceof Response) return result;\n return jsonResponse200(toJsonBody(result));\n } catch (err) {\n if (err instanceof KozoError) return err.toResponse(path);\n return internalErrorResponse(err as Error, path);\n }\n };\n}\n\n// ============================================================================\n// NATIVE NODE.JS HANDLER COMPILER\n//\n// Produces (req, res, params) => void handlers that write directly to the\n// Node.js ServerResponse socket — no Web API Request/Response allocation,\n// no @hono/node-server adapter overhead.\n//\n// Used by Kozo.nativeListen() for maximum throughput.\n// ============================================================================\n\n// ============================================================================\n// Native response helpers — delegated to fast-response.ts\n//\n// Key performance wins over the old inline helpers:\n// • Cork/uncork: entire HTTP response sent as a single TCP frame\n// • ASCII body length: body.length instead of Buffer.byteLength()\n// • Content-Length cache: pre-stringified values for sizes 0–9999\n// ============================================================================\n// fastWriteJson → fastWriteJson (imported from fast-response.ts)\n// fastWriteError → fastWriteError (imported from fast-response.ts)\n// fastWrite400 → fastWrite400 (imported from fast-response.ts)\n\nfunction parseNativeQuery(url: string): Record<string, string> {\n const qIdx = url.indexOf('?');\n if (qIdx === -1) return {};\n const sp = new URLSearchParams(url.slice(qIdx + 1));\n const result: Record<string, string> = {};\n sp.forEach((v, k) => { result[k] = v; });\n return result;\n}\n\nfunction readNativeBody(req: IncomingMessage): Promise<any> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n try {\n const str = Buffer.concat(chunks).toString('utf8');\n resolve(str ? JSON.parse(str) : {});\n } catch {\n resolve({});\n }\n });\n req.on('error', reject);\n });\n}\n\nexport function compileNativeHandler(\n handler: UserHandler,\n schema: RouteSchema,\n services: Services,\n compiled: CompiledRoute,\n): NativeRouteHandler {\n const { validateBody, validateQuery, validateParams, serialize } = compiled;\n\n const hasServices = services != null && Object.keys(services).length > 0;\n const hasQuery = !!validateQuery;\n const hasParams = !!validateParams;\n const hasBody = !!validateBody;\n const hasSer = !!serialize;\n const handlerIgnoresArgs = handler.length === 0;\n\n // ─── S1: no validation, no services ─────────────────────────────────────\n // Hot path: handlerIgnoresArgs=true + hasSer=true is the benchmark scenario.\n // Fully inline — no branching, no allocation beyond the serialized string.\n if (!hasBody && !hasQuery && !hasParams && !hasServices) {\n if (hasSer) {\n const ser = serialize!;\n if (handlerIgnoresArgs) {\n return function native_s1_bare_ser_noargs(req, res, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s1_bare_ser(req, res, _p) {\n try {\n const result = handler({ req });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n if (handlerIgnoresArgs) {\n return function native_s1_bare_noargs(req, res, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s1_bare(req, res, _p) {\n try {\n const result = handler({ req });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S1b: no validation, WITH services ───────────────────────────────────\n if (!hasBody && !hasQuery && !hasParams && hasServices) {\n if (hasSer) {\n const ser = serialize!;\n if (handlerIgnoresArgs) {\n return function native_s1_svc_ser_noargs(req, res, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s1_svc_ser(req, res, _p) {\n try {\n const result = handler({ req, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n if (handlerIgnoresArgs) {\n return function native_s1_svc_noargs(req, res, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s1_svc(req, res, _p) {\n try {\n const result = handler({ req, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S2a: query only (no params, no body) ────────────────────────────────\n if (hasQuery && !hasParams && !hasBody) {\n const vq = validateQuery!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function native_s2a_q_ser(req, res, _p) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2a_q_svc_ser(req, res, _p) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n if (!hasServices) {\n return function native_s2a_q(req, res, _p) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2a_q_svc(req, res, _p) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S2b: params only (no query, no body) ────────────────────────────────\n if (hasParams && !hasQuery && !hasBody) {\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function native_s2b_p_ser(req, res, params) {\n try {\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2b_p_svc_ser(req, res, params) {\n try {\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n if (!hasServices) {\n return function native_s2b_p(req, res, params) {\n try {\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2b_p_svc(req, res, params) {\n try {\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S2c: query + params (no body) ───────────────────────────────────────\n if (hasQuery && hasParams && !hasBody) {\n const vq = validateQuery!;\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function native_s2c_qp_ser(req, res, params) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2c_qp_svc_ser(req, res, params) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, ser(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n if (!hasServices) {\n return function native_s2c_qp(req, res, params) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return function native_s2c_qp_svc(req, res, params) {\n try {\n const query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n if (!vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => fastWriteJson(res, toJsonBody(r)),\n (err: unknown) => fastWriteError(err, res),\n );\n return;\n }\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S3: body + serializer (async body read) ─────────────────────────────\n if (hasBody && hasSer) {\n const vb = validateBody!;\n const ser = serialize!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return async function native_s3_body_ser(req, res, params) {\n try {\n const body = await readNativeBody(req);\n if (!vb(body)) { fastWrite400('body', vb.errors, res); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n }\n if (vp && !vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = await handler({ req, body, query, params });\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return async function native_s3_body_ser_svc(req, res, params) {\n try {\n const body = await readNativeBody(req);\n if (!vb(body)) { fastWrite400('body', vb.errors, res); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n }\n if (vp && !vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = await handler({ req, body, query, params, services });\n fastWriteJson(res, ser(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── S4: body, no serializer ─────────────────────────────────────────────\n if (hasBody && !hasSer) {\n const vb = validateBody!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return async function native_s4_body_noser(req, res, params) {\n try {\n const body = await readNativeBody(req);\n if (!vb(body)) { fastWrite400('body', vb.errors, res); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n }\n if (vp && !vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = await handler({ req, body, query, params });\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n return async function native_s4_body_noser_svc(req, res, params) {\n try {\n const body = await readNativeBody(req);\n if (!vb(body)) { fastWrite400('body', vb.errors, res); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(req.url ?? '/');\n if (!vq(query)) { fastWrite400('query', vq.errors, res); return; }\n }\n if (vp && !vp(params)) { fastWrite400('params', vp.errors, res); return; }\n const result = await handler({ req, body, query, params, services });\n fastWriteJson(res, toJsonBody(result));\n } catch (err) { fastWriteError(err, res); }\n };\n }\n\n // ─── Fallback ─────────────────────────────────────────────────────────────\n return function native_fallback(req, res, _p) {\n fastWriteError(new Error('Route scenario not implemented'), res);\n };\n}\n\n// ============================================================================\n// compileUwsNativeHandler — zero-shim uWS-native handler compiler\n//\n// Mirrors compileNativeHandler but generates UwsNativeHandler instead of\n// NativeRouteHandler. Key differences:\n// 1. Handler signature: (uwsRes, url, rawBody, params) — no shimReq/shimRes\n// 2. Body parsing: synchronous from pre-buffered rawBody (no await/queueMicrotask)\n// 3. Response writing: uwsFastWriteJson / uwsFastWrite400 / uwsFastWriteError\n// call uwsRes.cork() directly — one syscall per response, zero indirection\n// ============================================================================\nexport function compileUwsNativeHandler(\n handler: UserHandler,\n schema: RouteSchema,\n services: Services,\n compiled: CompiledRoute,\n): UwsNativeHandler {\n const { validateBody, validateQuery, validateParams, serialize } = compiled;\n\n const hasServices = services != null && Object.keys(services).length > 0;\n const hasQuery = !!validateQuery;\n const hasParams = !!validateParams;\n const hasBody = !!validateBody;\n const hasSer = !!serialize;\n const handlerIgnoresArgs = handler.length === 0;\n\n // ─── S1: no validation, no services ──────────────────────────────────────\n if (!hasBody && !hasQuery && !hasParams && !hasServices) {\n if (hasSer) {\n const ser = serialize!;\n if (handlerIgnoresArgs) {\n return function uws_s1_bare_ser_noargs(uwsRes, _url, _raw, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s1_bare_ser(uwsRes, url, _raw, _p) {\n try {\n const result = handler({ req: { url } });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n if (handlerIgnoresArgs) {\n return function uws_s1_bare_noargs(uwsRes, _url, _raw, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s1_bare(uwsRes, url, _raw, _p) {\n try {\n const result = handler({ req: { url } });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S1b: no validation, WITH services ───────────────────────────────────\n if (!hasBody && !hasQuery && !hasParams && hasServices) {\n if (hasSer) {\n const ser = serialize!;\n if (handlerIgnoresArgs) {\n return function uws_s1b_svc_ser_noargs(uwsRes, _url, _raw, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s1b_svc_ser(uwsRes, url, _raw, _p) {\n try {\n const result = handler({ req: { url }, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n if (handlerIgnoresArgs) {\n return function uws_s1b_svc_noargs(uwsRes, _url, _raw, _p) {\n try {\n const result = (handler as any)();\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s1b_svc(uwsRes, url, _raw, _p) {\n try {\n const result = handler({ req: { url }, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S2a: query only ─────────────────────────────────────────────────────\n if (hasQuery && !hasParams && !hasBody) {\n const vq = validateQuery!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function uws_s2a_q_ser(uwsRes, url, _raw, _p) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2a_q_svc_ser(uwsRes, url, _raw, _p) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n if (!hasServices) {\n return function uws_s2a_q(uwsRes, url, _raw, _p) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2a_q_svc(uwsRes, url, _raw, _p) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S2b: params only ────────────────────────────────────────────────────\n if (hasParams && !hasQuery && !hasBody) {\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function uws_s2b_p_ser(uwsRes, url, _raw, params) {\n try {\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2b_p_svc_ser(uwsRes, url, _raw, params) {\n try {\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n if (!hasServices) {\n return function uws_s2b_p(uwsRes, url, _raw, params) {\n try {\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2b_p_svc(uwsRes, url, _raw, params) {\n try {\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S2c: query + params ─────────────────────────────────────────────────\n if (hasQuery && hasParams && !hasBody) {\n const vq = validateQuery!;\n const vp = validateParams!;\n if (hasSer) {\n const ser = serialize!;\n if (!hasServices) {\n return function uws_s2c_qp_ser(uwsRes, url, _raw, params) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2c_qp_svc_ser(uwsRes, url, _raw, params) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n if (!hasServices) {\n return function uws_s2c_qp(uwsRes, url, _raw, params) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s2c_qp_svc(uwsRes, url, _raw, params) {\n try {\n const query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n if (!vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handlerIgnoresArgs ? (handler as any)() : handler({ req: { url }, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S3: body + serializer — sync body parse (rawBody pre-buffered by uWS) ──\n if (hasBody && hasSer) {\n const vb = validateBody!;\n const ser = serialize!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return function uws_s3_body_ser(uwsRes, url, rawBody, params) {\n try {\n let body: any;\n try { body = rawBody ? JSON.parse(rawBody) : {}; } catch { body = {}; }\n if (!vb(body)) { uwsFastWrite400('body', vb.errors, uwsRes); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n }\n if (vp && !vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handler({ req: { url }, body, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result as any));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s3_body_ser_svc(uwsRes, url, rawBody, params) {\n try {\n let body: any;\n try { body = rawBody ? JSON.parse(rawBody) : {}; } catch { body = {}; }\n if (!vb(body)) { uwsFastWrite400('body', vb.errors, uwsRes); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n }\n if (vp && !vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handler({ req: { url }, body, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, ser(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, ser(result as any));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── S4: body, no serializer ─────────────────────────────────────────────\n if (hasBody && !hasSer) {\n const vb = validateBody!;\n const vq = validateQuery;\n const vp = validateParams;\n if (!hasServices) {\n return function uws_s4_body_noser(uwsRes, url, rawBody, params) {\n try {\n let body: any;\n try { body = rawBody ? JSON.parse(rawBody) : {}; } catch { body = {}; }\n if (!vb(body)) { uwsFastWrite400('body', vb.errors, uwsRes); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n }\n if (vp && !vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handler({ req: { url }, body, query, params });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n return function uws_s4_body_noser_svc(uwsRes, url, rawBody, params) {\n try {\n let body: any;\n try { body = rawBody ? JSON.parse(rawBody) : {}; } catch { body = {}; }\n if (!vb(body)) { uwsFastWrite400('body', vb.errors, uwsRes); return; }\n let query: Record<string, string> | undefined;\n if (vq) {\n query = parseNativeQuery(url);\n if (!vq(query)) { uwsFastWrite400('query', vq.errors, uwsRes); return; }\n }\n if (vp && !vp(params)) { uwsFastWrite400('params', vp.errors, uwsRes); return; }\n const result = handler({ req: { url }, body, query, params, services });\n if (result != null && typeof (result as any).then === 'function') {\n (result as Promise<any>).then(\n (r: any) => uwsFastWriteJson(uwsRes, toJsonBody(r)),\n (err: unknown) => uwsFastWriteError(err, uwsRes),\n );\n return;\n }\n uwsFastWriteJson(uwsRes, toJsonBody(result));\n } catch (err) { uwsFastWriteError(err, uwsRes); }\n };\n }\n\n // ─── Fallback ─────────────────────────────────────────────────────────────\n return function uws_fallback(uwsRes, _url, _raw, _p) {\n uwsFastWriteError(new Error('Route scenario not implemented'), uwsRes);\n };\n}\n","// ============================================================================\n// Kozo Fast Response — Optimized HTTP response writing for nativeListen\n// ============================================================================\n//\n// Key optimisations over vanilla Node.js ServerResponse:\n//\n// 1. ASCII body length → JSON output is always ASCII-safe (fast-json-\n// stringify escapes non-ASCII to \\uXXXX). body.length === byte length,\n// so we skip the expensive Buffer.byteLength() call (~60–100 ns saved).\n//\n// 2. Content-Length cache → pre-computed String(n) for sizes 0–9999\n// avoids per-request String() conversion (~12 ns saved).\n//\n// 3. Pre-built error buffers → 404 / 500 responses are constant strings,\n// written once at import time. Zero allocation on error paths.\n//\n// These utilities are used internally by the native handler compiler\n// (compiler.ts) and the nativeListen dispatch function (app.ts).\n// They are NOT part of the public developer API.\n// ============================================================================\n\nimport type { ServerResponse } from 'node:http';\nimport { KozoError } from './errors.js';\n\n// ── Content-Length string cache ─────────────────────────────────────────\n// Pre-allocate stringified numbers for sizes 0–9999 (covers 99%+ of\n// JSON API responses). Avoids `String(n)` allocation on every request.\nconst CL_CACHE: string[] = /* @__PURE__ */ (() => {\n const arr = new Array<string>(10_000);\n for (let i = 0; i < 10_000; i++) arr[i] = String(i);\n return arr;\n})();\n\n/** Fast number → string for Content-Length. Cached for values < 10 000. */\nexport function fastCL(n: number): string {\n return n < 10_000 ? CL_CACHE[n] : String(n);\n}\n\n// ── Content-Type constants ──────────────────────────────────────────────\nconst CT_JSON = 'application/json';\nconst CT_PROBLEM = 'application/problem+json';\nconst CT_TEXT = 'text/plain';\nconst CT_HTML = 'text/html; charset=utf-8';\n\n// ── Pre-built error response buffers ────────────────────────────────────\nconst BODY_404 = JSON.stringify({\n type: 'https://kozo.dev/errors/not-found',\n title: 'Resource Not Found',\n status: 404,\n});\nconst LEN_404 = fastCL(BODY_404.length);\n\nconst BODY_500 = JSON.stringify({\n type: 'https://kozo.dev/errors/internal-error',\n title: 'Internal Server Error',\n status: 500,\n});\nconst LEN_500 = fastCL(BODY_500.length);\n\n// ════════════════════════════════════════════════════════════════════════\n// Public helpers — used by compiler.ts native handler scenarios\n// ════════════════════════════════════════════════════════════════════════\n\n/**\n * Write a 200 JSON response.\n *\n * IMPORTANT: `body` MUST be ASCII-safe (i.e. produced by JSON.stringify\n * or fast-json-stringify). We use `body.length` instead of\n * `Buffer.byteLength(body)` — valid because JSON serializers escape\n * non-ASCII to `\\uXXXX`, keeping the output 7-bit clean.\n */\nexport function fastWriteJson(res: ServerResponse, body: string): void {\n res.writeHead(200, [\n 'Content-Type', CT_JSON,\n 'Content-Length', fastCL(body.length),\n ]);\n res.end(body);\n}\n\n/**\n * Write a plain text response.\n */\nexport function fastWriteText(res: ServerResponse, body: string, status: number = 200): void {\n const len = Buffer.byteLength(body); // text may contain UTF-8\n res.writeHead(status, [\n 'Content-Type', CT_TEXT,\n 'Content-Length', fastCL(len),\n ]);\n res.end(body);\n}\n\n/**\n * Write an HTML response (SSR page rendering).\n */\nexport function fastWriteHtml(res: ServerResponse, body: string, status: number = 200): void {\n const len = Buffer.byteLength(body); // HTML may contain UTF-8\n res.writeHead(status, [\n 'Content-Type', CT_HTML,\n 'Content-Length', fastCL(len),\n ]);\n res.end(body);\n}\n\n/**\n * Write a JSON response with a custom status code.\n */\nexport function fastWriteJsonStatus(res: ServerResponse, body: string, status: number): void {\n res.writeHead(status, [\n 'Content-Type', CT_JSON,\n 'Content-Length', fastCL(body.length),\n ]);\n res.end(body);\n}\n\n/**\n * Write a pre-built 404 Not Found response (zero allocation).\n */\nexport function fastWrite404(res: ServerResponse): void {\n res.writeHead(404, [\n 'Content-Type', CT_PROBLEM,\n 'Content-Length', LEN_404,\n ]);\n res.end(BODY_404);\n}\n\n/**\n * Write a pre-built 500 Internal Server Error response (zero allocation).\n */\nexport function fastWrite500(res: ServerResponse): void {\n res.writeHead(500, [\n 'Content-Type', CT_PROBLEM,\n 'Content-Length', LEN_500,\n ]);\n res.end(BODY_500);\n}\n\n/**\n * Write a 400 validation error response.\n * Allocates only the error body string.\n */\nexport function fastWrite400(field: string, errors: any, res: ServerResponse): void {\n const body = JSON.stringify({\n type: 'https://kozo.dev/errors/validation-failed',\n title: 'Validation Failed',\n status: 400,\n errors: (errors ?? []).map((e: any) => ({\n field: e.instancePath?.replace(/^\\//, '').replace(/\\//g, '.') || e.params?.missingProperty || 'unknown',\n message: e.message || 'Invalid value',\n code: e.keyword || 'invalid',\n })),\n });\n res.writeHead(400, [\n 'Content-Type', CT_PROBLEM,\n 'Content-Length', fastCL(body.length),\n ]);\n res.end(body);\n}\n\n/**\n * Write a KozoError as an RFC 7807 problem+json response.\n * Falls back to 500 for unknown errors.\n */\nexport function fastWriteError(err: unknown, res: ServerResponse): void {\n if (err instanceof KozoError) {\n const body = JSON.stringify({\n type: `https://kozo.dev/errors/${err.code}`,\n title: err.message,\n status: err.statusCode,\n });\n res.writeHead(err.statusCode, [\n 'Content-Type', CT_PROBLEM,\n 'Content-Length', fastCL(body.length),\n ]);\n res.end(body);\n } else {\n fastWrite500(res);\n }\n}\n","// ============================================\n// GRACEFUL SHUTDOWN INFRASTRUCTURE\n// ============================================\n\nimport type { Server } from 'node:http';\n\n// Local type definitions to avoid cross-package dependency\ntype DatabaseProvider = 'postgresql' | 'mysql' | 'sqlite';\ntype DatabaseInstance = Record<string, unknown>;\n\n/**\n * Shutdown configuration options\n */\nexport interface ShutdownOptions {\n /** Maximum time to wait for in-flight requests to complete (default: 30000ms) */\n timeoutMs?: number;\n /** Callback fired when shutdown starts */\n onShutdownStart?: (inflightCount: number) => void;\n /** Callback fired when all requests complete before timeout */\n onShutdownComplete?: () => void;\n /** Callback fired when shutdown times out */\n onShutdownTimeout?: (remainingInflight: number) => void;\n /** Database instance to close (optional) */\n database?: DatabaseInstance;\n /** Database provider type (required if database is provided) */\n databaseProvider?: DatabaseProvider;\n}\n\n/**\n * Internal state for tracking in-flight requests\n */\nexport interface InflightTracker {\n count: number;\n requests: Set<Promise<unknown>>;\n}\n\n/**\n * Create an in-flight request tracker\n */\nexport function createInflightTracker(): InflightTracker {\n return {\n count: 0,\n requests: new Set(),\n };\n}\n\n/**\n * Track a request - call at the start of each request\n */\nexport function trackRequest(tracker: InflightTracker): () => void {\n tracker.count++;\n let resolvePromise: () => void;\n const promise = new Promise<void>((resolve) => {\n resolvePromise = resolve;\n });\n tracker.requests.add(promise);\n \n // Return untrack function to call when request completes\n return () => {\n tracker.count--;\n tracker.requests.delete(promise);\n resolvePromise();\n };\n}\n\n/**\n * Shutdown state machine\n */\nexport type ShutdownState = 'running' | 'shutting-down' | 'shutdown';\n\n/**\n * Graceful shutdown manager\n */\nexport class ShutdownManager {\n private state: ShutdownState = 'running';\n private abortController: AbortController | null = null;\n private server: Server | null = null;\n private tracker: InflightTracker;\n private database: DatabaseInstance | null = null;\n private databaseProvider: DatabaseProvider | null = null;\n\n constructor() {\n this.tracker = createInflightTracker();\n }\n\n /**\n * Get current shutdown state\n */\n getState(): ShutdownState {\n return this.state;\n }\n\n /**\n * Check if server is shutting down\n */\n isShuttingDown(): boolean {\n return this.state !== 'running';\n }\n\n /**\n * Get current in-flight request count\n */\n getInflightCount(): number {\n return this.tracker.count;\n }\n\n /**\n * Set the server instance for shutdown\n */\n setServer(server: Server): void {\n this.server = server;\n }\n\n /**\n * Set database for cleanup\n */\n setDatabase(db: DatabaseInstance, provider: DatabaseProvider): void {\n this.database = db;\n this.databaseProvider = provider;\n }\n\n /**\n * Get the AbortController signal for request cancellation\n */\n getAbortSignal(): AbortSignal | undefined {\n return this.abortController?.signal;\n }\n\n /**\n * Create a request tracker middleware\n * Returns an untrack function to call when request completes\n */\n trackRequest(): () => void {\n return trackRequest(this.tracker);\n }\n\n /**\n * Initiate graceful shutdown\n */\n async shutdown(options: ShutdownOptions = {}): Promise<void> {\n const {\n timeoutMs = 30000,\n onShutdownStart,\n onShutdownComplete,\n onShutdownTimeout,\n } = options;\n\n // Handle already-shutdown state\n if (this.state === 'shutdown') {\n console.warn('[Kozo] Shutdown already completed');\n return;\n }\n\n // Handle in-progress shutdown\n if (this.state === 'shutting-down') {\n console.warn('[Kozo] Shutdown already in progress');\n return;\n }\n\n this.state = 'shutting-down';\n\n // Create AbortController to signal all handlers\n this.abortController = new AbortController();\n this.abortController.abort();\n\n const inflightCount = this.tracker.count;\n onShutdownStart?.(inflightCount);\n\n if (inflightCount > 0) {\n console.log(`[Kozo] Graceful shutdown: waiting for ${inflightCount} in-flight requests`);\n }\n\n // Stop accepting new connections\n if (this.server) {\n this.server.close(() => {\n console.log('[Kozo] HTTP server closed');\n });\n }\n\n // Wait for in-flight requests with timeout\n const drainPromise = this.drainRequests();\n const timeoutPromise = new Promise<void>((resolve) => {\n setTimeout(() => {\n onShutdownTimeout?.(this.tracker.count);\n resolve();\n }, timeoutMs);\n });\n\n await Promise.race([drainPromise, timeoutPromise]);\n\n // Close database connections\n await this.closeDatabase();\n\n this.state = 'shutdown';\n onShutdownComplete?.();\n console.log('[Kozo] Graceful shutdown complete');\n }\n\n /**\n * Wait for all in-flight requests to complete\n */\n private async drainRequests(): Promise<void> {\n if (this.tracker.requests.size === 0) {\n return;\n }\n await Promise.all([...this.tracker.requests]);\n }\n\n /**\n * Close database connections based on provider\n */\n private async closeDatabase(): Promise<void> {\n if (!this.database || !this.databaseProvider) {\n return;\n }\n\n try {\n switch (this.databaseProvider) {\n case 'postgresql': {\n // postgres.js client has end() method\n const client = (this.database as any).$client;\n if (client && typeof client.end === 'function') {\n await client.end();\n console.log('[Kozo] PostgreSQL connection closed');\n }\n break;\n }\n case 'mysql': {\n // mysql2 connection has end() method\n const client = (this.database as any).$client;\n if (client && typeof client.end === 'function') {\n await client.end();\n console.log('[Kozo] MySQL connection closed');\n }\n break;\n }\n case 'sqlite': {\n // better-sqlite3 has close() method (synchronous)\n const client = (this.database as any).$client;\n if (client && typeof client.close === 'function') {\n client.close();\n console.log('[Kozo] SQLite connection closed');\n }\n break;\n }\n }\n } catch (err) {\n console.error('[Kozo] Error closing database connection:', err);\n }\n }\n}\n\n/**\n * Create a shutdown manager instance\n */\nexport function createShutdownManager(): ShutdownManager {\n return new ShutdownManager();\n}\n","import { glob } from 'glob';\r\nimport { join, relative } from 'node:path';\r\nimport { pathToFileURL } from 'node:url';\r\nimport type { RouteDefinition, RouteModule, HttpMethod } from './types.js';\r\nimport { fileToPath, isRouteFile } from './utils/file-to-path.js';\r\n\r\nexport interface ScanOptions {\r\n routesDir: string;\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Scan routes directory and return route definitions\r\n */\r\nexport async function scanRoutes(options: ScanOptions): Promise<RouteDefinition[]> {\r\n const { routesDir, verbose = true } = options;\r\n const routes: RouteDefinition[] = [];\r\n\r\n if (verbose) {\r\n console.log(`\\n🔍 Scanning routes in: ${routesDir}\\n`);\r\n }\r\n\r\n // Find all .ts and .js files\r\n const pattern = '**/*.{ts,js}';\r\n const files = await glob(pattern, { \r\n cwd: routesDir,\r\n nodir: true,\r\n ignore: ['**/_*.ts', '**/_*.js', '**/*.test.ts', '**/*.spec.ts']\r\n });\r\n\r\n for (const file of files) {\r\n if (!isRouteFile(file)) continue;\r\n\r\n const parsed = fileToPath(file);\r\n if (!parsed) continue;\r\n\r\n const fullPath = join(routesDir, file);\r\n \r\n try {\r\n // Dynamic import\r\n const fileUrl = pathToFileURL(fullPath).href;\r\n const module = await import(fileUrl) as RouteModule;\r\n\r\n // Validate module has default export\r\n if (typeof module.default !== 'function') {\r\n console.warn(`⚠️ Skipping ${file}: no default export function`);\r\n continue;\r\n }\r\n\r\n routes.push({\r\n path: parsed.path,\r\n method: parsed.method,\r\n filePath: fullPath,\r\n module\r\n });\r\n\r\n if (verbose) {\r\n const methodLabel = parsed.method.toUpperCase().padEnd(6);\r\n console.log(` ${methodLabel} ${parsed.path}`);\r\n }\r\n } catch (err) {\r\n console.error(`❌ Failed to load route: ${file}`);\r\n console.error(err);\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.log(`\\n✅ Loaded ${routes.length} routes\\n`);\r\n }\r\n\r\n // Sort routes: static paths before dynamic, longer paths first\r\n routes.sort((a, b) => {\r\n const aScore = routeScore(a.path);\r\n const bScore = routeScore(b.path);\r\n return bScore - aScore;\r\n });\r\n\r\n return routes;\r\n}\r\n\r\n/**\r\n * Score a route for sorting (higher = more priority)\r\n * Static paths get higher scores than dynamic ones\r\n */\r\nfunction routeScore(path: string): number {\r\n const segments = path.split('/').filter(Boolean);\r\n let score = segments.length * 10;\r\n\r\n for (const segment of segments) {\r\n if (segment === '*') {\r\n score -= 100; // Catch-all has lowest priority\r\n } else if (segment.startsWith(':')) {\r\n score -= 5; // Dynamic params have lower priority\r\n } else {\r\n score += 1; // Static segments increase priority\r\n }\r\n }\r\n\r\n return score;\r\n}\r\n\r\nexport { fileToPath, isRouteFile };\r\n","import { parse } from 'node:path';\r\n\r\n// HTTP methods that can be used as filenames\r\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\r\ntype HttpMethod = (typeof HTTP_METHODS)[number];\r\n\r\nexport interface ParsedRoute {\r\n path: string;\r\n method: HttpMethod;\r\n}\r\n\r\n/**\r\n * Convert file path to URL path and HTTP method\r\n * \r\n * Examples:\r\n * users/index.ts → GET /users\r\n * users/get.ts → GET /users\r\n * users/post.ts → POST /users\r\n * users/[id].ts → GET /users/:id\r\n * users/[id]/get.ts → GET /users/:id\r\n * users/[id]/patch.ts → PATCH /users/:id\r\n * users/[id?].ts → GET /users/:id? (optional param)\r\n * posts/[...slug].ts → GET /posts/* (catch-all)\r\n * health.ts → GET /health\r\n * [id?]/posts/[postId?].ts → GET /:id?/posts/:postId?\r\n */\r\nexport function fileToPath(filePath: string): ParsedRoute | null {\r\n // Normalize path separators\r\n const normalized = filePath.replace(/\\\\/g, '/');\r\n const parsed = parse(normalized);\r\n \r\n // Get filename without extension\r\n const filename = parsed.name.toLowerCase();\r\n \r\n // Determine HTTP method\r\n let method: HttpMethod = 'get';\r\n let includeName = true;\r\n \r\n if (HTTP_METHODS.includes(filename as HttpMethod)) {\r\n method = filename as HttpMethod;\r\n includeName = false;\r\n } else if (filename === 'index') {\r\n includeName = false;\r\n }\r\n \r\n // Build path from directory + optional filename\r\n let segments = parsed.dir ? parsed.dir.split('/').filter(Boolean) : [];\r\n \r\n if (includeName) {\r\n segments.push(parsed.name);\r\n }\r\n \r\n // Convert path segments\r\n const urlSegments = segments.map(segment => {\r\n // Catch-all: [...slug] → *\r\n if (segment.startsWith('[...') && segment.endsWith(']')) {\r\n return '*';\r\n }\r\n // Optional dynamic param: [id?] → :id?\r\n if (segment.startsWith('[') && segment.endsWith('?]')) {\r\n return ':' + segment.slice(1, -2) + '?';\r\n }\r\n // Dynamic param: [id] → :id\r\n if (segment.startsWith('[') && segment.endsWith(']')) {\r\n return ':' + segment.slice(1, -1);\r\n }\r\n return segment;\r\n });\r\n \r\n // Build final path\r\n let path = '/' + urlSegments.join('/');\r\n \r\n // Clean up\r\n path = path.replace(/\\/+/g, '/');\r\n if (path.length > 1 && path.endsWith('/')) {\r\n path = path.slice(0, -1);\r\n }\r\n \r\n return { path, method };\r\n}\r\n\r\n/**\r\n * Check if a file should be treated as a route\r\n */\r\nexport function isRouteFile(filename: string): boolean {\r\n // Skip files/directories where any segment starts with _\r\n const segments = filename.replace(/\\\\/g, '/').split('/');\r\n if (segments.some(s => s.startsWith('_'))) return false;\r\n \r\n // Skip test files\r\n if (filename.includes('.test.') || filename.includes('.spec.')) return false;\r\n \r\n // Must be .ts or .js\r\n return filename.endsWith('.ts') || filename.endsWith('.js');\r\n}\r\n","// ============================================================================\r\n// Kozo WASM Radix Router v2 — TypeScript Bindings\r\n// ============================================================================\r\n//\r\n// Zero-copy bridge between Node.js and the Zig-compiled radix trie.\r\n// Designed exclusively for `nativeListen` mode. When the .wasm file is\r\n// absent (Edge deploy, Cloudflare Workers, etc.) the caller falls back\r\n// to RegExpRouter / linear scan — see app.ts for the orchestration.\r\n//\r\n// v2 optimisations over v1:\r\n// • Handler array (plain []) instead of Map → ~30% faster lookup\r\n// • Method integer from charCode fast-path → no Map lookup per-request\r\n// • Pre-allocated reusable params object → less GC pressure\r\n// • SSR wildcard `*` catch-all support → captures remaining path\r\n//\r\n// Hot-path flow (per request):\r\n// 1. JS writes ASCII path bytes into WASM url_buf (~15-30 ns)\r\n// 2. JS calls match_url() (WASM trie)\r\n// 3. WASM returns route_id + writes param offsets (~50-120 ns)\r\n// 4. JS reads param offsets and slices the original (~20-40 ns)\r\n// string — no Buffer / TextDecoder allocation.\r\n//\r\n// Target: bridge overhead < 150 ns · trie lookup < 120 ns\r\n// ============================================================================\r\n\r\nimport { readFile } from 'node:fs/promises';\r\nimport { fileURLToPath } from 'node:url';\r\nimport { dirname, join } from 'node:path';\r\nimport type { IncomingMessage, ServerResponse } from 'node:http';\r\n\r\nexport type NativeRouteHandler = (\r\n req: IncomingMessage,\r\n res: ServerResponse,\r\n params: Record<string, string>,\r\n) => void;\r\n\r\n// ── Method encoding (must match radix.zig roots[] indices) ──────────────\r\n// v2: fast inline function avoids Map overhead on every request\r\nconst METHOD_INDEX: Record<string, number> = {\r\n GET: 0,\r\n POST: 1,\r\n PUT: 2,\r\n PATCH: 3,\r\n DELETE: 4,\r\n OPTIONS: 5,\r\n HEAD: 6,\r\n};\r\n\r\n/**\r\n * Ultra-fast method → index. Exploits the fact that HTTP method strings\r\n * have unique first + fourth characters. Falls back to object lookup\r\n * for uncommon methods. ~2ns vs ~15ns for Map.get().\r\n *\r\n * Exported for use in app.ts inline dispatch (avoids computing twice).\r\n */\r\nexport function methodToIndex(m: string): number {\r\n switch (m.length) {\r\n case 3:\r\n // GET=0, PUT=2\r\n return m.charCodeAt(0) === 71 /* G */ ? 0 : 2;\r\n case 4:\r\n // POST=1, HEAD=6\r\n return m.charCodeAt(0) === 80 /* P */ ? 1 : 6;\r\n case 5:\r\n // PATCH=3\r\n return 3;\r\n case 6:\r\n // DELETE=4\r\n return 4;\r\n case 7:\r\n // OPTIONS=5\r\n return 5;\r\n default:\r\n return METHOD_INDEX[m] ?? -1;\r\n }\r\n}\r\n\r\n// ── WASM module shape ───────────────────────────────────────────────────\r\ninterface RadixExports {\r\n memory: WebAssembly.Memory;\r\n init: () => void;\r\n insert_route: (method: number, patLen: number, routeId: number) => void;\r\n match_url: (method: number, urlLen: number) => number;\r\n get_param_count: () => number;\r\n get_url_buf_ptr: () => number;\r\n get_param_buf_ptr: () => number;\r\n get_pattern_buf_ptr: () => number;\r\n}\r\n\r\n// ── Match result ────────────────────────────────────────────────────────\r\nexport interface WasmMatchResult {\r\n handler: NativeRouteHandler;\r\n params: Record<string, string>;\r\n}\r\n\r\n// ════════════════════════════════════════════════════════════════════════\r\n// WasmRadixRouter\r\n// ════════════════════════════════════════════════════════════════════════\r\n\r\nexport class WasmRadixRouter {\r\n private exports: RadixExports | null = null;\r\n private urlView: Uint8Array | null = null;\r\n private paramView: DataView | null = null;\r\n private patternView: Uint8Array | null = null;\r\n\r\n // v2: plain arrays indexed by route_id — O(1) with no hash overhead\r\n private handlers: NativeRouteHandler[] = [];\r\n private paramNames: string[][] = [];\r\n /** monotonic route counter */\r\n private nextRouteId = 0;\r\n /** whether the WASM module loaded successfully */\r\n private ready = false;\r\n\r\n // v3: pre-allocated match result — reused across calls to avoid allocation.\r\n // Safe because dispatch() reads result synchronously and never stores it.\r\n private readonly _emptyParams: Record<string, string> = Object.freeze({}) as Record<string, string>;\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Attempt to load and instantiate the WASM module.\r\n * Returns `true` on success, `false` if the .wasm file is missing or\r\n * instantiation fails (caller should fall back to JS routing).\r\n */\r\n async init(): Promise<boolean> {\r\n try {\r\n // Resolve path relative to this source file\r\n const thisDir = dirname(fileURLToPath(import.meta.url));\r\n const wasmPath = join(thisDir, 'wasm', 'radix.wasm');\r\n\r\n const wasmBytes = await readFile(wasmPath);\r\n const { instance } = await WebAssembly.instantiate(wasmBytes);\r\n\r\n this.exports = instance.exports as unknown as RadixExports;\r\n\r\n // Obtain fixed buffer views (offsets never change after init)\r\n const mem = this.exports.memory;\r\n const urlPtr = this.exports.get_url_buf_ptr();\r\n const paramPtr = this.exports.get_param_buf_ptr();\r\n const patPtr = this.exports.get_pattern_buf_ptr();\r\n\r\n this.urlView = new Uint8Array(mem.buffer, urlPtr, 4096);\r\n this.paramView = new DataView(mem.buffer, paramPtr, 32); // 8 params × 4 bytes\r\n this.patternView = new Uint8Array(mem.buffer, patPtr, 2048);\r\n\r\n // Cold-start: reset internal tree state\r\n this.exports.init();\r\n this.ready = true;\r\n return true;\r\n } catch {\r\n // .wasm not found or instantiation failure — caller uses JS fallback\r\n this.ready = false;\r\n return false;\r\n }\r\n }\r\n\r\n /** Is the WASM module loaded and operational? */\r\n get isReady(): boolean {\r\n return this.ready;\r\n }\r\n\r\n // ── Route registration (called at startup, not hot-path) ──────────────\r\n\r\n /**\r\n * Register a route in the WASM radix trie.\r\n *\r\n * @param method HTTP method (GET, POST, …)\r\n * @param path Express-style pattern, e.g. `/api/users/:id` or `/blog/*`\r\n * @param handler Compiled native handler (same type used by nativeListen)\r\n * @returns The assigned route ID\r\n */\r\n addRoute(method: string, path: string, handler: NativeRouteHandler): number {\r\n if (!this.ready) throw new Error('WasmRadixRouter not initialized');\r\n\r\n const routeId = this.nextRouteId++;\r\n const methodIdx = METHOD_INDEX[method.toUpperCase()];\r\n if (methodIdx === undefined) throw new Error(`Unsupported method: ${method}`);\r\n\r\n // Extract param names from the pattern (order matters)\r\n // v2: also handle wildcard `*` as a param named '*'\r\n const names: string[] = [];\r\n const segments = path.split('/');\r\n for (const seg of segments) {\r\n if (seg.startsWith(':')) names.push(seg.slice(1));\r\n else if (seg === '*') names.push('*');\r\n }\r\n\r\n // v2: store in plain arrays for O(1) indexed access\r\n this.paramNames[routeId] = names;\r\n this.handlers[routeId] = handler;\r\n\r\n // Write pattern bytes to WASM shared memory\r\n const patLen = this.writeAscii(this.patternView!, path);\r\n\r\n // Insert into the Zig trie\r\n this.exports!.insert_route(methodIdx, patLen, routeId);\r\n\r\n return routeId;\r\n }\r\n\r\n // ── Hot-path matching ─────────────────────────────────────────────────\r\n\r\n /**\r\n * Match a request path against the radix trie.\r\n *\r\n * ZERO-COPY: the path string is written byte-by-byte into WASM memory\r\n * without allocating a Buffer or Uint8Array. Param values are read\r\n * back as slices of the **original JS string** (the offsets produced by\r\n * WASM coincide with JS character indices for ASCII paths).\r\n *\r\n * v3: Returns a pre-allocated result object that is reused across calls.\r\n * For static routes (paramCount === 0), the params object is a frozen\r\n * singleton — ZERO allocations per request on the hot path.\r\n *\r\n * @returns `null` on miss; otherwise the handler + extracted params.\r\n */\r\n match(method: string, path: string): WasmMatchResult | null {\r\n // v2: fast inline method-to-index, no Map lookup\r\n const methodIdx = methodToIndex(method);\r\n if (methodIdx === -1) return null;\r\n\r\n // ① Write URL bytes into WASM linear memory\r\n const urlView = this.urlView!;\r\n const len = path.length;\r\n for (let i = 0; i < len; i++) {\r\n urlView[i] = path.charCodeAt(i);\r\n }\r\n\r\n // ② Call WASM trie lookup\r\n const routeId: number = this.exports!.match_url(methodIdx, len);\r\n if (routeId === -1) return null;\r\n\r\n // v2: array index (vastly faster than Map.get)\r\n const handler = this.handlers[routeId];\r\n if (!handler) return null;\r\n\r\n // v3: reuse frozen empty params for static routes (zero allocation)\r\n const paramCount = this.exports!.get_param_count();\r\n\r\n if (paramCount === 0) {\r\n // Static routes: only the wrapper object is allocated (emptyParams is singleton)\r\n return { handler, params: this._emptyParams };\r\n }\r\n\r\n // Dynamic routes: allocate params object (unavoidable for unique keys)\r\n const names = this.paramNames[routeId];\r\n const params: Record<string, string> = {};\r\n const pv = this.paramView!;\r\n\r\n for (let i = 0; i < paramCount && i < names.length; i++) {\r\n const byteOff = i * 4;\r\n const offset = pv.getUint16(byteOff, true); // LE\r\n const plen = pv.getUint16(byteOff + 2, true); // LE\r\n params[names[i]] = path.slice(offset, offset + plen);\r\n }\r\n\r\n return { handler, params };\r\n }\r\n\r\n // ── Exposed internals for inline dispatch in app.ts ────────────────────\r\n\r\n /**\r\n * Expose raw WASM buffers + handler arrays for zero-overhead inline\r\n * dispatch in app.ts. Avoids the match() → WasmMatchResult wrapper\r\n * allocation on dynamic routes (~30-50 ns saved per request).\r\n *\r\n * SAFETY: single-threaded — no concurrent access.\r\n */\r\n getInternals() {\r\n return {\r\n urlView: this.urlView!,\r\n exports: this.exports!,\r\n handlers: this.handlers,\r\n paramNames: this.paramNames,\r\n paramView: this.paramView!,\r\n emptyParams: this._emptyParams,\r\n };\r\n }\r\n\r\n // ── Internals ─────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Fast ASCII write — avoids TextEncoder allocation overhead (~50 ns).\r\n * URL paths are always ASCII, so charCodeAt() is byte-identical.\r\n */\r\n private writeAscii(view: Uint8Array, str: string): number {\r\n const len = str.length;\r\n for (let i = 0; i < len; i++) {\r\n view[i] = str.charCodeAt(i);\r\n }\r\n return len;\r\n }\r\n}\r\n","// ============================================================================\n// Kozo NativeContext — Runtime implementation of NativeKozoContext\n// ============================================================================\n//\n// This module provides the `buildNativeContext()` factory that creates the\n// typed context object passed to `NativeKozoHandler` functions.\n//\n// The context wraps Node.js IncomingMessage / ServerResponse and adds:\n// • Lazy query/headers parsing (only on first access)\n// • Type-safe params, body, query from schema\n// • Response helpers: json(), text(), html(), redirect(), header()\n// • Cork/uncork socket batching via fast-response.ts utilities\n//\n// V8 Hidden Class: all properties are declared upfront in the object literal,\n// even if initially undefined. This prevents shape transitions that would\n// deoptimize property access.\n// ============================================================================\n\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Services, RouteSchema, NativeKozoContext } from './types.js';\nimport { fastWriteJson, fastWriteText, fastWriteHtml, fastWriteJsonStatus, fastCL } from './fast-response.js';\n\n/**\n * Build a NativeKozoContext for a native route handler.\n *\n * Called by the native handler compiler (`compiler.ts`) when the route\n * is registered via `nativeRoute()`. Not intended for direct use.\n *\n * @internal\n */\nexport function buildNativeContext<S extends RouteSchema, TSvc extends Services>(\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n body: any,\n services: TSvc,\n serialize?: (data: any) => string,\n): NativeKozoContext<S, TSvc> {\n // Lazy-parsed query cache\n let _query: Record<string, string> | undefined;\n // Extra headers set via ctx.header()\n let _extraHeaders: [string, string][] | undefined;\n\n const ctx: NativeKozoContext<S, TSvc> = {\n req,\n res,\n params: params as any,\n body: body as any,\n services,\n\n get query(): any {\n if (_query === undefined) {\n const url = req.url ?? '/';\n const qIdx = url.indexOf('?');\n if (qIdx === -1) {\n _query = {};\n } else {\n const sp = new URLSearchParams(url.slice(qIdx + 1));\n _query = {};\n sp.forEach((v, k) => { _query![k] = v; });\n }\n }\n return _query;\n },\n\n json(data: any, status?: number): void {\n const jsonBody = serialize ? serialize(data) : JSON.stringify(data);\n if (_extraHeaders) {\n const hdrs: string[] = ['Content-Type', 'application/json', 'Content-Length', fastCL(jsonBody.length)];\n for (const [k, v] of _extraHeaders) hdrs.push(k, v);\n res.writeHead(status ?? 200, hdrs);\n res.end(jsonBody);\n } else if (status !== undefined && status !== 200) {\n fastWriteJsonStatus(res, jsonBody, status);\n } else {\n fastWriteJson(res, jsonBody);\n }\n },\n\n text(data: string, status?: number): void {\n fastWriteText(res, data, status ?? 200);\n },\n\n html(data: string, status?: number): void {\n fastWriteHtml(res, data, status ?? 200);\n },\n\n header(name: string, value: string) {\n if (!_extraHeaders) _extraHeaders = [];\n _extraHeaders.push([name, value]);\n return ctx;\n },\n\n redirect(url: string, status?: number): void {\n const code = status ?? 302;\n res.writeHead(code, ['Location', url, 'Content-Length', '0']);\n res.end();\n },\n };\n\n return ctx;\n}\n","// ============================================\n// KOZO V2 - High-Performance Framework\n// ============================================\n\n// Main exports\nexport { Kozo, createKozo } from './app.js';\nexport type { KozoConfig } from './types.js';\n\n// Types\nexport type {\n Services,\n RouteSchema,\n KozoContext,\n KozoHandler,\n KozoEnv,\n NativeKozoContext,\n NativeKozoHandler,\n InferSchema,\n InferResponse,\n} from './types.js';\n\n// Client SDK Generation\nexport { generateTypedClient } from './client-generator.js';\nexport type {\n ClientGeneratorOptions,\n RouteInfo\n} from './client-generator.js';\n\n// Advanced: Route Compilation (La Chiave di Volta)\nexport { SchemaCompiler, compileRouteHandler } from './compiler.js';\nexport type { CompiledRoute } from './compiler.js';\n\n// Native context builder (for power-user native handlers)\nexport { buildNativeContext } from './native-context.js';\n\n// Fast response utilities (for custom native middleware / handlers)\nexport {\n fastWriteJson,\n fastWriteText,\n fastWriteHtml,\n fastWriteJsonStatus,\n fastWrite404,\n fastWrite500,\n fastWrite400,\n fastWriteError,\n fastCL,\n} from './fast-response.js';\n\n// Error System (RFC 7807 Problem Details)\nexport {\n KozoError,\n ValidationFailedError,\n NotFoundError,\n UnauthorizedError,\n ForbiddenError,\n validationErrorResponse,\n internalErrorResponse,\n notFoundResponse,\n unauthorizedResponse,\n forbiddenResponse,\n formatAjvErrors,\n formatZodErrors,\n ERROR_RESPONSES,\n} from './errors.js';\nexport type {\n ValidationError,\n ProblemDetails,\n} from './errors.js';\n\n// Re-export Zod for convenience\nexport { z } from 'zod';\n\n// Graceful Shutdown\nexport {\n ShutdownManager,\n createShutdownManager,\n createInflightTracker,\n trackRequest,\n} from './shutdown.js';\nexport type { ShutdownOptions, ShutdownState, InflightTracker } from './shutdown.js';\n\n// OpenAPI Generation\nexport {\n OpenAPIGenerator,\n createOpenAPIGenerator,\n generateSwaggerHtml,\n} from './openapi.js';\nexport type {\n OpenAPIConfig,\n OpenAPIInfo,\n OpenAPISpec,\n} from './openapi.js';\n\n// Middleware\nexport * from './middleware/index.js';\n","import type { RouteDefinition, RouteSchema, RouteMeta, HttpMethod } from './types.js';\r\nimport type { z } from 'zod';\r\n\r\n// ============================================\r\n// OPENAPI TYPES\r\n// ============================================\r\n\r\nexport interface OpenAPIInfo {\r\n title: string;\r\n version: string;\r\n description?: string;\r\n contact?: {\r\n name?: string;\r\n url?: string;\r\n email?: string;\r\n };\r\n license?: {\r\n name: string;\r\n url?: string;\r\n };\r\n}\r\n\r\nexport interface OpenAPIConfig {\r\n info: OpenAPIInfo;\r\n servers?: Array<{ url: string; description?: string }>;\r\n tags?: Array<{ name: string; description?: string }>;\r\n security?: Array<Record<string, string[]>>;\r\n}\r\n\r\nexport interface OpenAPISpec {\r\n openapi: '3.1.0';\r\n info: OpenAPIInfo;\r\n servers?: Array<{ url: string; description?: string }>;\r\n tags?: Array<{ name: string; description?: string }>;\r\n paths: Record<string, PathItem>;\r\n components: {\r\n schemas: Record<string, SchemaObject>;\r\n securitySchemes?: Record<string, SecurityScheme>;\r\n };\r\n security?: Array<Record<string, string[]>>;\r\n}\r\n\r\ninterface PathItem {\r\n [method: string]: OperationObject;\r\n}\r\n\r\ninterface OperationObject {\r\n operationId?: string;\r\n summary?: string;\r\n description?: string;\r\n tags?: string[];\r\n parameters?: ParameterObject[];\r\n requestBody?: RequestBodyObject;\r\n responses: Record<string, ResponseObject>;\r\n security?: Array<Record<string, string[]>>;\r\n}\r\n\r\ninterface ParameterObject {\r\n name: string;\r\n in: 'query' | 'path' | 'header' | 'cookie';\r\n required?: boolean;\r\n schema: SchemaObject;\r\n description?: string;\r\n}\r\n\r\ninterface RequestBodyObject {\r\n required?: boolean;\r\n content: {\r\n 'application/json': {\r\n schema: SchemaObject;\r\n };\r\n };\r\n}\r\n\r\ninterface ResponseObject {\r\n description: string;\r\n content?: {\r\n 'application/json': {\r\n schema: SchemaObject;\r\n };\r\n };\r\n}\r\n\r\ninterface SchemaObject {\r\n type?: string;\r\n format?: string;\r\n properties?: Record<string, SchemaObject>;\r\n items?: SchemaObject;\r\n required?: string[];\r\n enum?: unknown[];\r\n minimum?: number;\r\n maximum?: number;\r\n minLength?: number;\r\n maxLength?: number;\r\n pattern?: string;\r\n description?: string;\r\n default?: unknown;\r\n nullable?: boolean;\r\n oneOf?: SchemaObject[];\r\n anyOf?: SchemaObject[];\r\n allOf?: SchemaObject[];\r\n additionalProperties?: SchemaObject | boolean;\r\n $ref?: string;\r\n}\r\n\r\ninterface SecurityScheme {\r\n type: 'apiKey' | 'http' | 'oauth2' | 'openIdConnect';\r\n scheme?: string;\r\n bearerFormat?: string;\r\n name?: string;\r\n in?: 'query' | 'header' | 'cookie';\r\n}\r\n\r\n// ============================================\r\n// ZOD TO JSON SCHEMA CONVERTER\r\n// ============================================\r\n\r\nfunction zodToJsonSchema(zodSchema: z.ZodType): SchemaObject {\r\n const schema = zodSchema as any;\r\n const def = schema._def;\r\n\r\n if (!def) {\r\n return { type: 'object' };\r\n }\r\n\r\n const typeName = def.typeName;\r\n\r\n switch (typeName) {\r\n case 'ZodString': {\r\n const result: SchemaObject = { type: 'string' };\r\n for (const check of def.checks || []) {\r\n if (check.kind === 'min') result.minLength = check.value;\r\n if (check.kind === 'max') result.maxLength = check.value;\r\n if (check.kind === 'email') result.format = 'email';\r\n if (check.kind === 'url') result.format = 'uri';\r\n if (check.kind === 'uuid') result.format = 'uuid';\r\n if (check.kind === 'regex') result.pattern = check.regex.source;\r\n }\r\n return result;\r\n }\r\n\r\n case 'ZodNumber': {\r\n const result: SchemaObject = { type: 'number' };\r\n for (const check of def.checks || []) {\r\n if (check.kind === 'min') result.minimum = check.value;\r\n if (check.kind === 'max') result.maximum = check.value;\r\n if (check.kind === 'int') result.type = 'integer';\r\n }\r\n return result;\r\n }\r\n\r\n case 'ZodBoolean':\r\n return { type: 'boolean' };\r\n\r\n case 'ZodNull':\r\n return { type: 'null' };\r\n\r\n case 'ZodArray':\r\n return {\r\n type: 'array',\r\n items: zodToJsonSchema(def.type)\r\n };\r\n\r\n case 'ZodObject': {\r\n const properties: Record<string, SchemaObject> = {};\r\n const required: string[] = [];\r\n\r\n const shape = def.shape?.() || def.shape;\r\n if (shape) {\r\n for (const [key, value] of Object.entries(shape)) {\r\n properties[key] = zodToJsonSchema(value as z.ZodType);\r\n \r\n // Check if field is required\r\n const fieldDef = (value as any)._def;\r\n if (fieldDef?.typeName !== 'ZodOptional' && fieldDef?.typeName !== 'ZodDefault') {\r\n required.push(key);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 ? { required } : {})\r\n };\r\n }\r\n\r\n case 'ZodEnum':\r\n return {\r\n type: 'string',\r\n enum: def.values\r\n };\r\n\r\n case 'ZodNativeEnum':\r\n return {\r\n type: 'string',\r\n enum: Object.values(def.values)\r\n };\r\n\r\n case 'ZodLiteral':\r\n return {\r\n type: typeof def.value,\r\n enum: [def.value]\r\n };\r\n\r\n case 'ZodUnion':\r\n return {\r\n oneOf: def.options.map((opt: z.ZodType) => zodToJsonSchema(opt))\r\n };\r\n\r\n case 'ZodOptional':\r\n return {\r\n ...zodToJsonSchema(def.innerType),\r\n nullable: true\r\n };\r\n\r\n case 'ZodNullable':\r\n return {\r\n ...zodToJsonSchema(def.innerType),\r\n nullable: true\r\n };\r\n\r\n case 'ZodDefault':\r\n return {\r\n ...zodToJsonSchema(def.innerType),\r\n default: def.defaultValue()\r\n };\r\n\r\n case 'ZodRecord':\r\n return {\r\n type: 'object',\r\n additionalProperties: zodToJsonSchema(def.valueType)\r\n };\r\n\r\n case 'ZodDate':\r\n return { type: 'string', format: 'date-time' };\r\n\r\n case 'ZodAny':\r\n case 'ZodUnknown':\r\n return {};\r\n\r\n default:\r\n return { type: 'object' };\r\n }\r\n}\r\n\r\n// ============================================\r\n// OPENAPI GENERATOR\r\n// ============================================\r\n\r\nexport class OpenAPIGenerator {\r\n private config: OpenAPIConfig;\r\n private schemas: Map<string, SchemaObject> = new Map();\r\n private schemaCounter = 0;\r\n\r\n constructor(config: OpenAPIConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Generate OpenAPI spec from routes\r\n */\r\n generate(routes: RouteDefinition[]): OpenAPISpec {\r\n const paths: Record<string, PathItem> = {};\r\n\r\n for (const route of routes) {\r\n const openApiPath = this.honoPathToOpenApi(route.path);\r\n \r\n if (!paths[openApiPath]) {\r\n paths[openApiPath] = {};\r\n }\r\n\r\n paths[openApiPath][route.method] = this.routeToOperation(route);\r\n }\r\n\r\n return {\r\n openapi: '3.1.0',\r\n info: this.config.info,\r\n servers: this.config.servers,\r\n tags: this.config.tags,\r\n paths,\r\n components: {\r\n schemas: Object.fromEntries(this.schemas),\r\n securitySchemes: {\r\n bearerAuth: {\r\n type: 'http',\r\n scheme: 'bearer',\r\n bearerFormat: 'JWT'\r\n }\r\n }\r\n },\r\n security: this.config.security\r\n };\r\n }\r\n\r\n /**\r\n * Convert Hono path params to OpenAPI format\r\n * :id -> {id}\r\n */\r\n private honoPathToOpenApi(path: string): string {\r\n return path.replace(/:([^/]+)/g, '{$1}');\r\n }\r\n\r\n /**\r\n * Convert route to OpenAPI operation\r\n */\r\n private routeToOperation(route: RouteDefinition): OperationObject {\r\n const { path, method, module } = route;\r\n const { schema, meta } = module;\r\n\r\n const operation: OperationObject = {\r\n operationId: this.generateOperationId(path, method),\r\n summary: meta?.summary || `${method.toUpperCase()} ${path}`,\r\n description: meta?.description,\r\n tags: meta?.tags || [this.extractTag(path)],\r\n parameters: [],\r\n responses: {\r\n '200': {\r\n description: 'Successful response',\r\n content: {\r\n 'application/json': {\r\n schema: { type: 'object' }\r\n }\r\n }\r\n },\r\n '400': {\r\n description: 'Validation error'\r\n },\r\n '500': {\r\n description: 'Internal server error'\r\n }\r\n }\r\n };\r\n\r\n // Add path parameters\r\n const pathParams = path.match(/:([^/]+)/g);\r\n if (pathParams) {\r\n for (const param of pathParams) {\r\n const paramName = param.slice(1); // Remove :\r\n operation.parameters!.push({\r\n name: paramName,\r\n in: 'path',\r\n required: true,\r\n schema: { type: 'string' }\r\n });\r\n }\r\n }\r\n\r\n // Add query parameters from schema\r\n if (schema?.query) {\r\n const querySchema = zodToJsonSchema(schema.query as z.ZodType);\r\n if (querySchema.properties) {\r\n for (const [name, propSchema] of Object.entries(querySchema.properties)) {\r\n operation.parameters!.push({\r\n name,\r\n in: 'query',\r\n required: querySchema.required?.includes(name) || false,\r\n schema: propSchema as SchemaObject\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Add params schema override\r\n if (schema?.params) {\r\n const paramsSchema = zodToJsonSchema(schema.params as z.ZodType);\r\n if (paramsSchema.properties) {\r\n for (const [name, propSchema] of Object.entries(paramsSchema.properties)) {\r\n // Find and update existing param\r\n const existingIdx = operation.parameters!.findIndex(\r\n p => p.name === name && p.in === 'path'\r\n );\r\n if (existingIdx >= 0) {\r\n operation.parameters![existingIdx].schema = propSchema as SchemaObject;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Add request body for POST/PUT/PATCH\r\n if (['post', 'put', 'patch'].includes(method) && schema?.body) {\r\n operation.requestBody = {\r\n required: true,\r\n content: {\r\n 'application/json': {\r\n schema: zodToJsonSchema(schema.body as z.ZodType)\r\n }\r\n }\r\n };\r\n }\r\n\r\n // Add response schemas\r\n if (schema?.response) {\r\n for (const [status, responseSchema] of Object.entries(schema.response)) {\r\n operation.responses[status] = {\r\n description: this.getStatusDescription(parseInt(status)),\r\n content: {\r\n 'application/json': {\r\n schema: zodToJsonSchema(responseSchema as z.ZodType)\r\n }\r\n }\r\n };\r\n }\r\n }\r\n\r\n // Add auth requirement\r\n if (meta?.auth) {\r\n operation.security = [{ bearerAuth: [] }];\r\n }\r\n\r\n return operation;\r\n }\r\n\r\n /**\r\n * Generate operation ID from path and method\r\n */\r\n private generateOperationId(path: string, method: HttpMethod): string {\r\n const parts = path\r\n .split('/')\r\n .filter(Boolean)\r\n .map(part => {\r\n if (part.startsWith(':')) {\r\n return 'By' + this.capitalize(part.slice(1));\r\n }\r\n return this.capitalize(part);\r\n });\r\n\r\n return method + parts.join('');\r\n }\r\n\r\n /**\r\n * Extract tag from path (first segment)\r\n */\r\n private extractTag(path: string): string {\r\n const firstSegment = path.split('/').filter(Boolean)[0];\r\n return firstSegment ? this.capitalize(firstSegment) : 'Default';\r\n }\r\n\r\n /**\r\n * Get HTTP status description\r\n */\r\n private getStatusDescription(status: number): string {\r\n const descriptions: Record<number, string> = {\r\n 200: 'OK',\r\n 201: 'Created',\r\n 204: 'No Content',\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n return descriptions[status] || 'Response';\r\n }\r\n\r\n private capitalize(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n}\r\n\r\n// ============================================\r\n// SWAGGER UI HTML\r\n// ============================================\r\n\r\nexport function generateSwaggerHtml(specUrl: string, title: string = 'API Documentation'): string {\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"utf-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n <title>${title}</title>\r\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css\" />\r\n <style>\r\n body { margin: 0; padding: 0; }\r\n .swagger-ui .topbar { display: none; }\r\n </style>\r\n</head>\r\n<body>\r\n <div id=\"swagger-ui\"></div>\r\n <script src=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js\" crossorigin></script>\r\n <script>\r\n window.onload = () => {\r\n window.ui = SwaggerUIBundle({\r\n url: '${specUrl}',\r\n dom_id: '#swagger-ui',\r\n deepLinking: true,\r\n presets: [\r\n SwaggerUIBundle.presets.apis,\r\n SwaggerUIBundle.SwaggerUIStandalonePreset\r\n ],\r\n layout: \"BaseLayout\",\r\n persistAuthorization: true\r\n });\r\n };\r\n </script>\r\n</body>\r\n</html>`;\r\n}\r\n\r\n// ============================================\r\n// FACTORY FUNCTION\r\n// ============================================\r\n\r\nexport function createOpenAPIGenerator(config: OpenAPIConfig): OpenAPIGenerator {\r\n return new OpenAPIGenerator(config);\r\n}\r\n","import type { Context, Next } from 'hono';\r\n\r\nexport interface LoggerOptions {\r\n prefix?: string;\r\n colorize?: boolean;\r\n}\r\n\r\n/**\r\n * Request logger middleware\r\n */\r\nexport function logger(options: LoggerOptions = {}) {\r\n const { prefix = '🌐', colorize = true } = options;\r\n\r\n return async (c: Context, next: Next) => {\r\n const start = Date.now();\r\n const method = c.req.method;\r\n const path = new URL(c.req.url).pathname;\r\n\r\n await next();\r\n\r\n const duration = Date.now() - start;\r\n const status = c.res.status;\r\n\r\n const statusColor = status >= 500 ? '🔴' : status >= 400 ? '🟡' : '🟢';\r\n const log = `${prefix} ${method.padEnd(6)} ${path} ${statusColor} ${status} ${duration}ms`;\r\n \r\n console.log(log);\r\n };\r\n}\r\n","import { cors as honoCors } from 'hono/cors';\r\n\r\nexport interface CorsOptions {\r\n origin?: string | string[] | ((origin: string) => string | undefined | null);\r\n allowMethods?: string[];\r\n allowHeaders?: string[];\r\n exposeHeaders?: string[];\r\n maxAge?: number;\r\n credentials?: boolean;\r\n}\r\n\r\n/**\r\n * CORS middleware wrapper\r\n */\r\nexport function cors(options: CorsOptions = {}) {\r\n return honoCors({\r\n origin: options.origin || '*',\r\n allowMethods: options.allowMethods || ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],\r\n allowHeaders: options.allowHeaders || ['Content-Type', 'Authorization'],\r\n exposeHeaders: options.exposeHeaders || [],\r\n maxAge: options.maxAge || 86400,\r\n credentials: options.credentials || false\r\n });\r\n}\r\n","import type { Context, Next } from 'hono';\n\nexport interface RateLimitOptions {\n max: number;\n window: number; // in seconds\n keyGenerator?: (c: Context) => string;\n message?: string;\n}\n\n// In-memory store (use Redis in production)\nconst store = new Map<string, { count: number; resetAt: number }>();\n\n/**\n * Simple rate limiting middleware\n * For production, replace in-memory store with Redis\n */\nexport function rateLimit(options: RateLimitOptions) {\n const {\n max = 100,\n window = 60,\n keyGenerator = (c: Context) =>\n c.req.header('x-forwarded-for') ?? c.req.header('x-real-ip') ?? 'anonymous',\n message = 'Too many requests',\n } = options;\n\n return async (c: Context, next: Next) => {\n const key = keyGenerator(c);\n const now = Date.now();\n const windowMs = window * 1000;\n\n let record = store.get(key);\n\n if (!record || now > record.resetAt) {\n record = { count: 0, resetAt: now + windowMs };\n }\n\n record.count++;\n store.set(key, record);\n\n // Set rate limit headers\n c.header('X-RateLimit-Limit', String(max));\n c.header('X-RateLimit-Remaining', String(Math.max(0, max - record.count)));\n c.header('X-RateLimit-Reset', String(Math.ceil(record.resetAt / 1000)));\n\n if (record.count > max) {\n return c.json({ error: message }, 429);\n }\n\n await next();\n };\n}\n\n/**\n * Clear rate limit store (for testing)\n */\nexport function clearRateLimitStore() {\n store.clear();\n}\n","import type { Context, Next } from 'hono';\r\n\r\nexport class HttpError extends Error {\r\n constructor(\r\n public statusCode: number,\r\n message: string,\r\n public details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'HttpError';\r\n }\r\n}\r\n\r\nexport class BadRequestError extends HttpError {\r\n constructor(message = 'Bad Request', details?: unknown) {\r\n super(400, message, details);\r\n }\r\n}\r\n\r\nexport class UnauthorizedError extends HttpError {\r\n constructor(message = 'Unauthorized') {\r\n super(401, message);\r\n }\r\n}\r\n\r\nexport class ForbiddenError extends HttpError {\r\n constructor(message = 'Forbidden') {\r\n super(403, message);\r\n }\r\n}\r\n\r\nexport class NotFoundError extends HttpError {\r\n constructor(message = 'Not Found') {\r\n super(404, message);\r\n }\r\n}\r\n\r\nexport class ConflictError extends HttpError {\r\n constructor(message = 'Conflict', details?: unknown) {\r\n super(409, message, details);\r\n }\r\n}\r\n\r\nexport class InternalServerError extends HttpError {\r\n constructor(message = 'Internal Server Error') {\r\n super(500, message);\r\n }\r\n}\r\n\r\n/**\r\n * Global error handler middleware\r\n */\r\nexport function errorHandler() {\r\n return async (c: Context, next: Next) => {\r\n try {\r\n await next();\r\n } catch (err) {\r\n if (err instanceof HttpError) {\r\n return c.json({\r\n error: err.message,\r\n status: err.statusCode,\r\n ...(err.details ? { details: err.details } : {})\r\n }, err.statusCode as any);\r\n }\r\n\r\n // Unknown error\r\n console.error('Unhandled error:', err);\r\n return c.json({\r\n error: 'Internal Server Error',\r\n status: 500\r\n }, 500);\r\n }\r\n };\r\n}\r\n","import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { Hono } from 'hono';\n\n// ============================================\n// MANIFEST TYPES\n// ============================================\n\nexport type ManifestHttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';\n\n/**\n * A single route entry as written to routes-manifest.json\n */\nexport interface ManifestRoute {\n /** URL path, e.g. /users/:id */\n path: string;\n /** HTTP method (lowercase) */\n method: ManifestHttpMethod;\n /** Absolute or project-relative path to the handler file */\n handler: string;\n /** Named URL params extracted from the path, e.g. ['id'] */\n params: string[];\n /** Whether the handler module exports a body schema */\n hasBodySchema: boolean;\n /** Whether the handler module exports a query schema */\n hasQuerySchema: boolean;\n}\n\n/**\n * The shape of routes-manifest.json\n */\nexport interface RoutesManifest {\n version: number;\n generatedAt: string;\n routes: ManifestRoute[];\n}\n\n// ============================================\n// OPTIONS\n// ============================================\n\nexport interface FileSystemRoutingOptions {\n /**\n * Path to the routes-manifest.json file.\n * Defaults to `./routes-manifest.json` relative to cwd.\n */\n manifestPath?: string;\n\n /**\n * If true, log registered routes to stdout.\n * @default false\n */\n verbose?: boolean;\n\n /**\n * Called when the manifest is missing or unreadable.\n * Defaults to a silent no-op (backward-compatible behaviour).\n */\n onMissingManifest?: (reason: Error) => void;\n\n /**\n * Custom log function used when `verbose` is true.\n * Defaults to `console.log`.\n */\n logger?: (...args: unknown[]) => void;\n}\n\n// ============================================\n// INTERNAL HELPERS\n// ============================================\n\n/**\n * Read and parse routes-manifest.json.\n * Returns null when the file does not exist or is malformed.\n */\nasync function readManifest(\n manifestPath: string,\n onMissing: (err: Error) => void,\n): Promise<RoutesManifest | null> {\n try {\n const raw = await readFile(manifestPath, 'utf-8');\n return JSON.parse(raw) as RoutesManifest;\n } catch (err) {\n onMissing(err instanceof Error ? err : new Error(String(err)));\n return null;\n }\n}\n\n/**\n * Dynamically import a route handler module and return its default export.\n * Accepts both absolute paths and file:// URLs.\n */\nasync function importHandler(handlerPath: string): Promise<((...args: any[]) => any) | null> {\n try {\n const url = handlerPath.startsWith('file://')\n ? handlerPath\n : pathToFileURL(handlerPath).href;\n const mod = await import(url);\n if (typeof mod.default !== 'function') {\n console.warn(\n `[kozo:fsr] Skipping ${handlerPath}: no default export function`,\n );\n return null;\n }\n return mod.default as (...args: any[]) => any;\n } catch (err) {\n console.warn(\n `[kozo:fsr] Failed to import handler ${handlerPath}:`,\n (err as Error).message,\n );\n return null;\n }\n}\n\n// ============================================\n// MIDDLEWARE FACTORY\n// ============================================\n\n/**\n * Register all routes declared in `routes-manifest.json` onto a Hono app.\n *\n * This function is **not** a Hono middleware in the classical sense — it is an\n * *async initializer* that must be awaited before the server starts accepting\n * requests. Calling it early (before user-defined routes) guarantees that\n * manifest routes take precedence.\n *\n * @example\n * ```ts\n * import { Hono } from 'hono';\n * import { applyFileSystemRouting } from '@kozojs/core/middleware';\n *\n * const app = new Hono();\n * await applyFileSystemRouting(app, { manifestPath: './routes-manifest.json' });\n *\n * // User-defined routes registered AFTER are appended normally\n * app.get('/health', c => c.json({ ok: true }));\n * ```\n */\nexport async function applyFileSystemRouting(\n app: Hono<any>,\n options: FileSystemRoutingOptions = {},\n): Promise<void> {\n const {\n manifestPath = resolve(process.cwd(), 'routes-manifest.json'),\n verbose = false,\n onMissingManifest = () => {\n // Silent by default — backward-compatible\n },\n logger = console.log,\n } = options;\n\n const manifest = await readManifest(manifestPath, onMissingManifest);\n\n // Gracefully skip when no manifest exists\n if (!manifest) return;\n\n const log = logger;\n\n if (verbose) {\n log(\n `\\n📋 [kozo:fsr] Loading ${manifest.routes.length} route(s) from manifest\\n`,\n );\n }\n\n for (const route of manifest.routes) {\n const handler = await importHandler(route.handler);\n if (!handler) continue;\n\n // Register on the Hono app using the correct HTTP method\n (app as any)[route.method](route.path, handler);\n\n if (verbose) {\n log(\n ` ${route.method.toUpperCase().padEnd(6)} ${route.path} → ${route.handler}`,\n );\n }\n }\n\n if (verbose) {\n log('');\n }\n}\n\n// ============================================\n// CONVENIENCE: createFileSystemRouting\n// ============================================\n\n/**\n * Alternative factory that returns an async function you can call with a Hono\n * app. Useful when you want to pre-configure options and apply them later.\n *\n * @example\n * ```ts\n * const fsr = createFileSystemRouting({ verbose: true });\n * await fsr(app);\n * ```\n */\nexport function createFileSystemRouting(options: FileSystemRoutingOptions = {}) {\n return (app: Hono<any>) => applyFileSystemRouting(app, options);\n}\n"],"mappings":"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","names":["resolve","CT_JSON","CT_PROBLEM","BODY_404","BODY_500","resolve","resolve","join","resolve","zodToJsonSchema","UnauthorizedError","ForbiddenError","NotFoundError","readFile","pathToFileURL","logger"]}