@kozojs/core 0.2.2

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.
@@ -0,0 +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"]}
@@ -0,0 +1,79 @@
1
+ import * as hono from 'hono';
2
+ import { Context, Next } from 'hono';
3
+
4
+ interface LoggerOptions {
5
+ prefix?: string;
6
+ colorize?: boolean;
7
+ }
8
+ /**
9
+ * Request logger middleware
10
+ */
11
+ declare function logger(options?: LoggerOptions): (c: Context, next: Next) => Promise<void>;
12
+
13
+ interface CorsOptions {
14
+ origin?: string | string[] | ((origin: string) => string | undefined | null);
15
+ allowMethods?: string[];
16
+ allowHeaders?: string[];
17
+ exposeHeaders?: string[];
18
+ maxAge?: number;
19
+ credentials?: boolean;
20
+ }
21
+ /**
22
+ * CORS middleware wrapper
23
+ */
24
+ declare function cors(options?: CorsOptions): hono.MiddlewareHandler;
25
+
26
+ interface RateLimitOptions {
27
+ max: number;
28
+ window: number;
29
+ keyGenerator?: (c: Context) => string;
30
+ message?: string;
31
+ }
32
+ /**
33
+ * Simple rate limiting middleware
34
+ * For production, replace in-memory store with Redis
35
+ */
36
+ declare function rateLimit(options: RateLimitOptions): (c: Context, next: Next) => Promise<(Response & hono.TypedResponse<{
37
+ error: string;
38
+ }, 429, "json">) | undefined>;
39
+ /**
40
+ * Clear rate limit store (for testing)
41
+ */
42
+ declare function clearRateLimitStore(): void;
43
+
44
+ declare class HttpError extends Error {
45
+ statusCode: number;
46
+ details?: unknown | undefined;
47
+ constructor(statusCode: number, message: string, details?: unknown | undefined);
48
+ }
49
+ declare class BadRequestError extends HttpError {
50
+ constructor(message?: string, details?: unknown);
51
+ }
52
+ declare class UnauthorizedError extends HttpError {
53
+ constructor(message?: string);
54
+ }
55
+ declare class ForbiddenError extends HttpError {
56
+ constructor(message?: string);
57
+ }
58
+ declare class NotFoundError extends HttpError {
59
+ constructor(message?: string);
60
+ }
61
+ declare class ConflictError extends HttpError {
62
+ constructor(message?: string, details?: unknown);
63
+ }
64
+ declare class InternalServerError extends HttpError {
65
+ constructor(message?: string);
66
+ }
67
+ /**
68
+ * Global error handler middleware
69
+ */
70
+ declare function errorHandler(): (c: Context, next: Next) => Promise<(Response & hono.TypedResponse<{
71
+ details?: undefined;
72
+ error: string;
73
+ status: number;
74
+ }, any, "json">) | (Response & hono.TypedResponse<{
75
+ error: string;
76
+ status: number;
77
+ }, 500, "json">) | undefined>;
78
+
79
+ export { BadRequestError, ConflictError, type CorsOptions, ForbiddenError, HttpError, InternalServerError, type LoggerOptions, NotFoundError, type RateLimitOptions, UnauthorizedError, clearRateLimitStore, cors, errorHandler, logger, rateLimit };
@@ -0,0 +1,135 @@
1
+ // src/middleware/logger.ts
2
+ function logger(options = {}) {
3
+ const { prefix = "\u{1F310}", colorize = true } = options;
4
+ return async (c, next) => {
5
+ const start = Date.now();
6
+ const method = c.req.method;
7
+ const path = new URL(c.req.url).pathname;
8
+ await next();
9
+ const duration = Date.now() - start;
10
+ const status = c.res.status;
11
+ const statusColor = status >= 500 ? "\u{1F534}" : status >= 400 ? "\u{1F7E1}" : "\u{1F7E2}";
12
+ const log = `${prefix} ${method.padEnd(6)} ${path} ${statusColor} ${status} ${duration}ms`;
13
+ console.log(log);
14
+ };
15
+ }
16
+
17
+ // src/middleware/cors.ts
18
+ import { cors as honoCors } from "hono/cors";
19
+ function cors(options = {}) {
20
+ return honoCors({
21
+ origin: options.origin || "*",
22
+ allowMethods: options.allowMethods || ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
23
+ allowHeaders: options.allowHeaders || ["Content-Type", "Authorization"],
24
+ exposeHeaders: options.exposeHeaders || [],
25
+ maxAge: options.maxAge || 86400,
26
+ credentials: options.credentials || false
27
+ });
28
+ }
29
+
30
+ // src/middleware/rate-limit.ts
31
+ var store = /* @__PURE__ */ new Map();
32
+ function rateLimit(options) {
33
+ const {
34
+ max = 100,
35
+ window = 60,
36
+ keyGenerator = (c) => c.req.header("x-forwarded-for") || "anonymous",
37
+ message = "Too many requests"
38
+ } = options;
39
+ return async (c, next) => {
40
+ const key = keyGenerator(c);
41
+ const now = Date.now();
42
+ const windowMs = window * 1e3;
43
+ let record = store.get(key);
44
+ if (!record || now > record.resetAt) {
45
+ record = { count: 0, resetAt: now + windowMs };
46
+ }
47
+ record.count++;
48
+ store.set(key, record);
49
+ c.header("X-RateLimit-Limit", String(max));
50
+ c.header("X-RateLimit-Remaining", String(Math.max(0, max - record.count)));
51
+ c.header("X-RateLimit-Reset", String(Math.ceil(record.resetAt / 1e3)));
52
+ if (record.count > max) {
53
+ return c.json({ error: message }, 429);
54
+ }
55
+ await next();
56
+ };
57
+ }
58
+ function clearRateLimitStore() {
59
+ store.clear();
60
+ }
61
+
62
+ // src/middleware/error-handler.ts
63
+ var HttpError = class extends Error {
64
+ constructor(statusCode, message, details) {
65
+ super(message);
66
+ this.statusCode = statusCode;
67
+ this.details = details;
68
+ this.name = "HttpError";
69
+ }
70
+ };
71
+ var BadRequestError = class extends HttpError {
72
+ constructor(message = "Bad Request", details) {
73
+ super(400, message, details);
74
+ }
75
+ };
76
+ var UnauthorizedError = class extends HttpError {
77
+ constructor(message = "Unauthorized") {
78
+ super(401, message);
79
+ }
80
+ };
81
+ var ForbiddenError = class extends HttpError {
82
+ constructor(message = "Forbidden") {
83
+ super(403, message);
84
+ }
85
+ };
86
+ var NotFoundError = class extends HttpError {
87
+ constructor(message = "Not Found") {
88
+ super(404, message);
89
+ }
90
+ };
91
+ var ConflictError = class extends HttpError {
92
+ constructor(message = "Conflict", details) {
93
+ super(409, message, details);
94
+ }
95
+ };
96
+ var InternalServerError = class extends HttpError {
97
+ constructor(message = "Internal Server Error") {
98
+ super(500, message);
99
+ }
100
+ };
101
+ function errorHandler() {
102
+ return async (c, next) => {
103
+ try {
104
+ await next();
105
+ } catch (err) {
106
+ if (err instanceof HttpError) {
107
+ return c.json({
108
+ error: err.message,
109
+ status: err.statusCode,
110
+ ...err.details ? { details: err.details } : {}
111
+ }, err.statusCode);
112
+ }
113
+ console.error("Unhandled error:", err);
114
+ return c.json({
115
+ error: "Internal Server Error",
116
+ status: 500
117
+ }, 500);
118
+ }
119
+ };
120
+ }
121
+ export {
122
+ BadRequestError,
123
+ ConflictError,
124
+ ForbiddenError,
125
+ HttpError,
126
+ InternalServerError,
127
+ NotFoundError,
128
+ UnauthorizedError,
129
+ clearRateLimitStore,
130
+ cors,
131
+ errorHandler,
132
+ logger,
133
+ rateLimit
134
+ };
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/middleware/logger.ts","../../src/middleware/cors.ts","../../src/middleware/rate-limit.ts","../../src/middleware/error-handler.ts"],"sourcesContent":["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';\r\n\r\nexport interface RateLimitOptions {\r\n max: number;\r\n window: number; // in seconds\r\n keyGenerator?: (c: Context) => string;\r\n message?: string;\r\n}\r\n\r\n// In-memory store (use Redis in production)\r\nconst store = new Map<string, { count: number; resetAt: number }>();\r\n\r\n/**\r\n * Simple rate limiting middleware\r\n * For production, replace in-memory store with Redis\r\n */\r\nexport function rateLimit(options: RateLimitOptions) {\r\n const { \r\n max = 100, \r\n window = 60,\r\n keyGenerator = (c) => c.req.header('x-forwarded-for') || 'anonymous',\r\n message = 'Too many requests'\r\n } = options;\r\n\r\n return async (c: Context, next: Next) => {\r\n const key = keyGenerator(c);\r\n const now = Date.now();\r\n const windowMs = window * 1000;\r\n\r\n let record = store.get(key);\r\n\r\n if (!record || now > record.resetAt) {\r\n record = { count: 0, resetAt: now + windowMs };\r\n }\r\n\r\n record.count++;\r\n store.set(key, record);\r\n\r\n // Set rate limit headers\r\n c.header('X-RateLimit-Limit', String(max));\r\n c.header('X-RateLimit-Remaining', String(Math.max(0, max - record.count)));\r\n c.header('X-RateLimit-Reset', String(Math.ceil(record.resetAt / 1000)));\r\n\r\n if (record.count > max) {\r\n return c.json({ error: message }, 429);\r\n }\r\n\r\n await next();\r\n };\r\n}\r\n\r\n/**\r\n * Clear rate limit store (for testing)\r\n */\r\nexport function clearRateLimitStore() {\r\n store.clear();\r\n}\r\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"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@kozojs/core",
3
+ "version": "0.2.2",
4
+ "description": "High-performance TypeScript framework with type-safe client generation",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "types": "./lib/index.d.ts",
8
+ "license": "MIT",
9
+ "author": "Kozo Team",
10
+ "homepage": "https://kozo.dev",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/kozojs/kozo"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/kozojs/kozo/issues"
17
+ },
18
+ "keywords": [
19
+ "kozo",
20
+ "framework",
21
+ "backend",
22
+ "typescript",
23
+ "hono",
24
+ "edge",
25
+ "cloudflare",
26
+ "workers",
27
+ "api",
28
+ "rest",
29
+ "fast",
30
+ "zod",
31
+ "type-safe",
32
+ "client-sdk",
33
+ "codegen",
34
+ "validation"
35
+ ],
36
+ "files": [
37
+ "lib",
38
+ "README.md"
39
+ ],
40
+ "exports": {
41
+ ".": {
42
+ "types": "./lib/index.d.ts",
43
+ "import": "./lib/index.js",
44
+ "require": "./lib/index.js"
45
+ },
46
+ "./middleware": {
47
+ "types": "./lib/middleware/index.d.ts",
48
+ "import": "./lib/middleware/index.js",
49
+ "require": "./lib/middleware/index.js"
50
+ }
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "dev": "tsup --watch",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest"
57
+ },
58
+ "dependencies": {
59
+ "@hono/node-server": "^1.13.0",
60
+ "@sinclair/typebox": "^0.34.47",
61
+ "ajv": "^8.17.0",
62
+ "ajv-formats": "^3.0.0",
63
+ "fast-json-stringify": "^6.0.0",
64
+ "glob": "^11.0.0",
65
+ "hono": "^4.6.0",
66
+ "zod": "^3.23.0",
67
+ "zod-to-json-schema": "^3.23.0"
68
+ },
69
+ "devDependencies": {
70
+ "@types/bun": "^1.3.5",
71
+ "@types/node": "^22.0.0",
72
+ "tsup": "^8.3.0",
73
+ "typescript": "^5.6.0",
74
+ "vitest": "^2.1.0"
75
+ }
76
+ }