@fresho/router 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-B1IFBS_w.mjs","names":["errors: Record<string, string[]>","resultArray: unknown[]","success","coerced","errorMsg","result: Record<string, unknown>","allErrors: Record<string, string[]>","properties: Record<string, unknown>","required: string[]","paramNames: string[]","propertyToSegment","compiled: CompiledRoute[]","path: Record<string, string>","context: MiddlewareContext","query: unknown","body: unknown","collectedRoutes: CollectedRoute[]","paths: Record<string, Record<string, object>>","operation: Record<string, unknown>","route"],"sources":["../src/schema.ts","../src/types.ts","../src/handler.ts","../src/core.ts","../src/docs.ts"],"sourcesContent":["/**\n * @fileoverview Schema types and validation utilities.\n *\n * Provides shorthand schema definitions for validating query parameters and request bodies.\n * No external dependencies - uses simple string-based type definitions.\n *\n * Supported types:\n * - Primitives: `'string'`, `'number'`, `'boolean'`\n * - Optional: `'string?'`, `'number?'`, `'boolean?'`\n * - Arrays: `'string[]'`, `'number[]'`, `'boolean[]'`\n * - Optional arrays: `'string[]?'`, `'number[]?'`, `'boolean[]?'`\n * - Nested objects: `{ field: { nested: 'string' } }`\n *\n * @example\n * ```typescript\n * // In route definitions\n * const api = router({\n * users: router({\n * post: route({\n * query: { page: 'number?', limit: 'number?' },\n * body: {\n * name: 'string',\n * age: 'number',\n * tags: 'string[]?',\n * address: { city: 'string', zip: 'string?' },\n * },\n * handler: async (c) => {\n * c.query.page; // number | undefined\n * c.body.name; // string\n * c.body.address.city // string\n * },\n * }),\n * }),\n * });\n * ```\n */\n\n/** Primitive type strings. */\nexport type PrimitiveType = 'string' | 'number' | 'boolean' | 'unknown';\n\n/** Optional primitive type strings. */\nexport type OptionalPrimitiveType = 'string?' | 'number?' | 'boolean?' | 'unknown?';\n\n/** Array type strings. */\nexport type ArrayType = 'string[]' | 'number[]' | 'boolean[]' | 'unknown[]';\n\n/** Optional array type strings. */\nexport type OptionalArrayType = 'string[]?' | 'number[]?' | 'boolean[]?' | 'unknown[]?';\n\n/** All supported type strings. */\nexport type SchemaType = PrimitiveType | OptionalPrimitiveType | ArrayType | OptionalArrayType;\n\n/** Schema definition using shorthand syntax. Supports nested objects. */\nexport interface SchemaDefinition {\n [key: string]: SchemaType | SchemaDefinition;\n}\n\n/** Maps primitive type strings to TypeScript types. */\nexport type SchemaTypeMap = {\n string: string;\n 'string?': string | undefined;\n number: number;\n 'number?': number | undefined;\n boolean: boolean;\n 'boolean?': boolean | undefined;\n unknown: unknown;\n 'unknown?': unknown | undefined;\n 'string[]': string[];\n 'string[]?': string[] | undefined;\n 'number[]': number[];\n 'number[]?': number[] | undefined;\n 'boolean[]': boolean[];\n 'boolean[]?': boolean[] | undefined;\n 'unknown[]': unknown[];\n 'unknown[]?': unknown[] | undefined;\n};\n\n/** Checks if a schema field type is optional (ends with ?). */\ntype IsOptionalField<T> = T extends `${string}?` ? true : false;\n\n/** Infers TypeScript type from a schema field (type string or nested object). */\nexport type InferSchemaField<T> = T extends SchemaType\n ? SchemaTypeMap[T]\n : T extends SchemaDefinition\n ? InferSchema<T>\n : never;\n\n/** Gets keys of required fields (non-optional types). */\ntype RequiredKeys<T extends SchemaDefinition> = {\n [K in keyof T]: IsOptionalField<T[K]> extends true ? never : K;\n}[keyof T];\n\n/** Gets keys of optional fields (types ending with ?). */\ntype OptionalKeys<T extends SchemaDefinition> = {\n [K in keyof T]: IsOptionalField<T[K]> extends true ? K : never;\n}[keyof T];\n\n/**\n * Infers TypeScript type from schema definition.\n *\n * Required fields become required properties, optional fields (ending with ?)\n * become optional properties with `| undefined`.\n */\nexport type InferSchema<T extends SchemaDefinition> = {\n [K in RequiredKeys<T>]: InferSchemaField<T[K]>;\n} & {\n [K in OptionalKeys<T>]?: InferSchemaField<T[K]>;\n};\n\n/** Error object returned when validation fails. */\nexport interface ValidationError {\n flatten: () => { fieldErrors: Record<string, string[]> };\n}\n\n/** Validation result matching Zod's safeParse API for compatibility. */\nexport type ValidationResult<T> =\n | { success: true; data: T; error?: undefined }\n | { success: false; data?: undefined; error: ValidationError };\n\n/** Compiled schema with validate method. */\nexport interface CompiledSchema<T> {\n safeParse: (data: object) => ValidationResult<T>;\n}\n\n/** Valid base types for primitives and arrays. */\nconst PRIMITIVE_TYPES = ['string', 'number', 'boolean', 'unknown'];\n\n/** Checks if a schema field is a nested object (not a type string). */\nfunction isNestedSchema(field: SchemaType | SchemaDefinition): field is SchemaDefinition {\n return typeof field === 'object' && field !== null;\n}\n\n/**\n * Validates and coerces a single primitive value.\n * Returns [success, result, errorMessage].\n */\nfunction validatePrimitive(value: unknown, baseType: string): [boolean, unknown, string | null] {\n switch (baseType) {\n case 'string':\n return [true, String(value), null];\n\n case 'number': {\n const num = Number(value);\n if (Number.isNaN(num)) {\n return [false, undefined, 'Expected number'];\n }\n return [true, num, null];\n }\n\n case 'boolean': {\n if (value === 'true' || value === '1' || value === true) {\n return [true, true, null];\n } else if (value === 'false' || value === '0' || value === false) {\n return [true, false, null];\n }\n return [false, undefined, 'Expected boolean (true/false)'];\n }\n\n case 'unknown':\n // Pass through any value without validation.\n return [true, value, null];\n\n default:\n return [false, undefined, `Unknown type: ${baseType}`];\n }\n}\n\n/**\n * Validates a schema field value (primitive, array, or nested object).\n * Returns [success, result, errors].\n */\nfunction validateField(\n key: string,\n field: SchemaType | SchemaDefinition,\n value: unknown,\n parentPath: string = '',\n): [boolean, unknown, Record<string, string[]>] {\n const fieldPath = parentPath ? `${parentPath}.${key}` : key;\n const errors: Record<string, string[]> = {};\n\n // Handle nested object schemas.\n if (isNestedSchema(field)) {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n errors[fieldPath] = ['Expected object'];\n return [false, undefined, errors];\n }\n // Recursively validate nested schema.\n const nestedResult = validateSchema(field, value as Record<string, unknown>, fieldPath);\n return [nestedResult.success, nestedResult.data, nestedResult.errors];\n }\n\n // It's a type string.\n const typeStr = field as string;\n const isOptional = typeStr.endsWith('?');\n const isArray = typeStr.includes('[]');\n\n // Strip optional marker for base type extraction.\n let baseType = isOptional ? typeStr.slice(0, -1) : typeStr;\n\n // Strip array marker.\n if (isArray) {\n baseType = baseType.replace('[]', '');\n }\n\n // Handle missing/empty values.\n if (value === undefined || value === '') {\n if (!isOptional) {\n errors[fieldPath] = ['Required'];\n return [false, undefined, errors];\n }\n return [true, undefined, {}];\n }\n\n // Handle array types.\n if (isArray) {\n if (!Array.isArray(value)) {\n errors[fieldPath] = ['Expected array'];\n return [false, undefined, errors];\n }\n\n const resultArray: unknown[] = [];\n for (let i = 0; i < value.length; i++) {\n const [success, coerced, errorMsg] = validatePrimitive(value[i], baseType);\n if (!success) {\n errors[`${fieldPath}[${i}]`] = [errorMsg!];\n return [false, undefined, errors];\n }\n resultArray.push(coerced);\n }\n return [true, resultArray, {}];\n }\n\n // Handle primitive types.\n const [success, coerced, errorMsg] = validatePrimitive(value, baseType);\n if (!success) {\n errors[fieldPath] = [errorMsg!];\n return [false, undefined, errors];\n }\n return [true, coerced, {}];\n}\n\n/**\n * Validates a full schema against data.\n * Returns { success, data, errors }.\n */\nfunction validateSchema(\n schema: SchemaDefinition,\n data: Record<string, unknown>,\n parentPath: string = '',\n): { success: boolean; data: Record<string, unknown>; errors: Record<string, string[]> } {\n const result: Record<string, unknown> = {};\n const allErrors: Record<string, string[]> = {};\n\n for (const [key, field] of Object.entries(schema)) {\n const value = data[key];\n const [success, coerced, fieldErrors] = validateField(key, field, value, parentPath);\n\n if (!success) {\n Object.assign(allErrors, fieldErrors);\n } else if (coerced !== undefined) {\n result[key] = coerced;\n }\n }\n\n return {\n success: Object.keys(allErrors).length === 0,\n data: result,\n errors: allErrors,\n };\n}\n\n/** Validates schema definition at compile time. */\nfunction validateSchemaDefinition(schema: SchemaDefinition, path: string = ''): void {\n for (const [key, field] of Object.entries(schema)) {\n const fieldPath = path ? `${path}.${key}` : key;\n\n if (isNestedSchema(field)) {\n validateSchemaDefinition(field, fieldPath);\n } else {\n const typeStr = field as string;\n const isOptional = typeStr.endsWith('?');\n let baseType = isOptional ? typeStr.slice(0, -1) : typeStr;\n baseType = baseType.replace('[]', '');\n\n if (!PRIMITIVE_TYPES.includes(baseType)) {\n throw new Error(`Unknown type '${typeStr}' at '${fieldPath}'`);\n }\n }\n }\n}\n\n/**\n * Compiles a schema definition into a validator.\n *\n * Used internally by the router to validate query parameters and request bodies.\n * Provides a Zod-compatible `safeParse` API for consistency.\n *\n * @param schema - The schema definition object\n * @returns A compiled schema with `safeParse` method\n *\n * @example\n * ```typescript\n * const userSchema = compileSchema({\n * name: 'string',\n * age: 'number',\n * email: 'string?',\n * });\n *\n * const result = userSchema.safeParse({ name: 'Alice', age: 30 });\n * if (result.success) {\n * console.log(result.data.name); // 'Alice'\n * } else {\n * console.log(result.error.flatten().fieldErrors);\n * }\n * ```\n */\nexport function compileSchema<T extends SchemaDefinition>(\n schema: T,\n): CompiledSchema<InferSchema<T>> {\n // Validate schema structure at compile time.\n validateSchemaDefinition(schema);\n\n return {\n safeParse(data: object): ValidationResult<InferSchema<T>> {\n const {\n success,\n data: result,\n errors,\n } = validateSchema(schema, data as Record<string, unknown>);\n\n if (!success) {\n return {\n success: false,\n error: { flatten: () => ({ fieldErrors: errors }) },\n };\n }\n\n return { success: true, data: result as InferSchema<T> };\n },\n };\n}\n\n/** JSON Schema object produced by {@link toJsonSchema}. */\nexport interface JsonSchemaObject {\n type: 'object';\n properties: Record<string, unknown>;\n /** Omitted when empty, as OpenAPI 3.0 requires. */\n required?: string[];\n}\n\n/**\n * Converts a schema definition to JSON Schema, recursing into nested objects.\n *\n * @param descriptions - Field descriptions keyed by name, dotted for nested fields\n * @param prefix - Dotted path of `schema` within the root, for nested lookups\n */\nexport function toJsonSchema(\n schema: SchemaDefinition,\n descriptions: Record<string, string> = {},\n prefix = '',\n): JsonSchemaObject {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, field] of Object.entries(schema)) {\n const description = descriptions[`${prefix}${key}`];\n const described = description === undefined ? {} : { description };\n if (isNestedSchema(field)) {\n const nested = toJsonSchema(field, descriptions, `${prefix}${key}.`);\n properties[key] = { ...nested, ...described };\n required.push(key);\n continue;\n }\n const optional = field.endsWith('?');\n const base = optional ? field.slice(0, -1) : field;\n const primitive = base.replace('[]', '');\n const item = primitive === 'unknown' ? {} : { type: primitive };\n properties[key] = base.endsWith('[]')\n ? { type: 'array', items: item, ...described }\n : { ...item, ...described };\n if (!optional) required.push(key);\n }\n return { type: 'object', properties, ...(required.length > 0 && { required }) };\n}\n","/**\n * @fileoverview Core type definitions for the routing library.\n *\n * **Path Convention:**\n * - Property names = URL path segments\n * - `$param` prefix = dynamic segment (`:param`)\n * - `get`, `post`, `put`, `patch`, `delete` = HTTP method handlers\n *\n * **Structure:**\n * - `router({ ... })` - groups paths, can have middleware\n * - `route({ query?, body?, handler })` - single method with schemas\n * - Bare functions as shorthand for handlers without schemas\n */\n\nimport type { Middleware } from './middleware.js';\nimport type { InferSchema, SchemaDefinition } from './schema.js';\n\n/** Standard HTTP methods. */\nexport type Method = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head';\n\n/** HTTP method property names. */\nexport const HTTP_METHODS = new Set<string>([\n 'get',\n 'post',\n 'put',\n 'patch',\n 'delete',\n 'options',\n 'head',\n]);\n\n/** Symbol to mark an object as a route definition. */\nexport const ROUTE_MARKER = Symbol.for('@fresho/router:route');\n\n/** Symbol to mark an object as a router. */\nexport const ROUTER_MARKER = Symbol.for('@fresho/router:router');\n\n/**\n * Brand symbol for Router type identification across module boundaries.\n * This enables TypeScript to recognize Router types even when generic\n * type information is lost during cross-package imports.\n */\ndeclare const ROUTER_BRAND: unique symbol;\n\n/** Brand type for Router identification in conditional types. */\nexport type RouterBrand = { readonly [ROUTER_BRAND]: true };\n\n/**\n * Extracts the parameter name from a `$param` property name.\n */\nexport type ExtractParamFromProperty<T extends string> = T extends `$${infer Param}`\n ? Param\n : never;\n\n/**\n * Checks if a property name is a dynamic parameter (starts with $).\n */\nexport type IsParamProperty<T extends string> = T extends `$${string}` ? true : false;\n\n/**\n * Collects path params from a property path array.\n */\nexport type CollectPathParams<Path extends string[]> = Path extends [\n infer Head extends string,\n ...infer Rest extends string[],\n]\n ? (Head extends `$${infer Param}` ? { [K in Param]: string } : {}) & CollectPathParams<Rest>\n : {};\n\n/** Execution context for background tasks (Cloudflare Workers compatible). */\nexport interface ExecutionContext {\n waitUntil(promise: Promise<unknown>): void;\n passThroughOnException(): void;\n}\n\n/**\n * Unified context object passed to handlers.\n */\nexport type Context<\n Q = unknown,\n B = unknown,\n P extends Record<string, string> = Record<string, string>,\n Ctx = {},\n> = {\n /** The original Request. */\n request: Request;\n /** URL path parameters from `$param` segments. */\n path: P;\n /** Query string parameters. */\n query: Q;\n /** Request body. */\n body: B;\n /** Execution context for background tasks. */\n executionCtx?: ExecutionContext;\n /** Environment bindings. */\n env: Ctx extends { env: infer E } ? E : unknown;\n} & Omit<Ctx, 'env'>;\n\n/**\n * Typed response wrapper that carries the response body type.\n */\nexport type TypedResponse<T> = Response & { __responseType?: T };\n\n/**\n * Handler function type.\n */\nexport type TypedHandler<\n Q = unknown,\n B = unknown,\n P extends Record<string, string> = Record<string, string>,\n R = unknown,\n Ctx = {},\n> = (\n context: Context<Q, B, P, Ctx>,\n) => R | Response | TypedResponse<R> | Promise<R | Response | TypedResponse<R>>;\n\n/** MCP tool behavior hints; defaults come from the HTTP method. */\nexport interface ToolAnnotations {\n /** Human-readable tool title. */\n title?: string;\n /** The tool does not modify its environment. */\n readOnlyHint?: boolean;\n /** The tool may perform destructive updates. */\n destructiveHint?: boolean;\n /** Repeating the call with the same arguments has no additional effect. */\n idempotentHint?: boolean;\n /** The tool interacts with external entities. */\n openWorldHint?: boolean;\n}\n\n/**\n * Route definition - a single HTTP method handler with optional schemas.\n *\n * Use `route()` when you need query or body validation schemas.\n * For simple handlers without schemas, use bare functions in the router.\n *\n * @example\n * ```typescript\n * // With schemas\n * get: route({\n * query: { limit: 'number?' },\n * handler: async (c) => ({ items: [], limit: c.query.limit }),\n * })\n *\n * // Without schemas (bare function shorthand)\n * get: async (c) => ({ items: [] })\n * ```\n */\nexport interface RouteDefinition<\n Q extends SchemaDefinition = {},\n B extends SchemaDefinition = {},\n R = unknown,\n P extends Record<string, string> = Record<string, string>,\n Ctx = {},\n> {\n /** Query parameter schema for validation. */\n query?: Q;\n /** Request body schema for validation. */\n body?: B;\n /** Optional description for documentation. */\n description?: string;\n /** Operation name, used as the OpenAPI `operationId` and the MCP tool name. */\n operationId?: string;\n /** Field descriptions for docs and MCP, keyed by name (`address.city` for nested fields). */\n descriptions?: Record<string, string>;\n /** MCP tool settings. */\n mcp?: { annotations?: ToolAnnotations };\n /** The request handler function. */\n handler: TypedHandler<InferSchema<Q>, InferSchema<B>, P, R, Ctx>;\n}\n\n/** A bare handler function (shorthand for route without schemas). */\nexport type BareHandler = (\n context: Context<unknown, unknown, Record<string, string>, unknown>,\n) => unknown;\n\n/** Checks if a value is a function. */\nexport function isFunction(value: unknown): value is BareHandler {\n return typeof value === 'function';\n}\n\n/** Checks if entry is a Route (marked with ROUTE_MARKER). */\nexport function isRoute(entry: unknown): entry is RouteDefinition {\n return typeof entry === 'object' && entry !== null && ROUTE_MARKER in entry;\n}\n\n/** Checks if entry is a Router (marked with ROUTER_MARKER). */\nexport function isRouter(entry: unknown): entry is Router<RouterRoutes> {\n return typeof entry === 'object' && entry !== null && ROUTER_MARKER in entry;\n}\n\n/**\n * A method handler - either a route with schemas or a bare function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type MethodEntry = RouteDefinition<any, any, any, any, any> | BareHandler;\n\n/**\n * Router routes record.\n *\n * Can contain:\n * - `get`, `post`, `put`, `patch`, `delete` - method handlers (route or function)\n * - Other property names - nested routers (path segments)\n * - `$param` properties - dynamic path segments\n */\nexport type RouterRoutes = {\n get?: MethodEntry;\n post?: MethodEntry;\n put?: MethodEntry;\n patch?: MethodEntry;\n delete?: MethodEntry;\n options?: MethodEntry;\n head?: MethodEntry;\n} & {\n [key: string]: MethodEntry | Router<RouterRoutes>;\n};\n\n/** Handler function signature for the standalone router. */\nexport type FetchHandler = (\n request: Request,\n env?: unknown,\n ctx?: ExecutionContext,\n) => Response | Promise<Response>;\n\n/**\n * Router - groups paths and can have middleware.\n *\n * @example\n * ```typescript\n * const api = router({\n * // Method handlers for this path\n * get: async (c) => [...],\n * post: route({ body: { name: 'string' }, handler: async (c) => c.body }),\n *\n * // Nested path segments\n * users: router({\n * get: async (c) => [...],\n * $id: router({\n * get: async (c) => ({ id: c.path.id }),\n * }),\n * }),\n * });\n * ```\n */\nexport interface Router<T extends RouterRoutes> extends RouterBrand {\n /** Route definitions and nested routers. */\n readonly routes: T;\n /** Middleware applied to all routes in this router. */\n readonly middleware?: Middleware[];\n /**\n * Creates a fetch handler for use with Cloudflare Workers, Deno, Bun, etc.\n */\n handler(): FetchHandler;\n}\n","/**\n * @fileoverview HTTP request handler for @fresho/router.\n *\n * Builds paths from property names:\n * - Regular properties = path segments\n * - `$param` properties = dynamic segments (`:param`)\n * - `get`, `post`, etc. = method handlers\n */\n\nimport type { Middleware, MiddlewareContext } from './middleware.js';\nimport { runMiddleware } from './middleware.js';\nimport type { CompiledSchema } from './schema.js';\nimport { compileSchema } from './schema.js';\nimport type {\n ExecutionContext,\n FetchHandler,\n RouteDefinition,\n Router,\n RouterRoutes,\n} from './types.js';\nimport { HTTP_METHODS, isFunction, isRoute, isRouter } from './types.js';\n\n/** Compiled route with pattern matcher and handler. */\ninterface CompiledRoute {\n method: string;\n pattern: RegExp;\n paramNames: string[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n handler: (context: any) => unknown;\n middleware: Middleware[];\n querySchema?: CompiledSchema<unknown>;\n bodySchema?: CompiledSchema<unknown>;\n}\n\n/**\n * Escapes special regex characters in a string.\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Converts a path with :param segments to a regex pattern.\n */\nfunction pathToRegex(path: string): { pattern: RegExp; paramNames: string[] } {\n const paramNames: string[] = [];\n const parts = path.split(/:(\\w+)/g);\n let regexStr = '';\n\n for (let i = 0; i < parts.length; i++) {\n if (i % 2 === 0) {\n regexStr += escapeRegex(parts[i]);\n } else {\n paramNames.push(parts[i]);\n regexStr += '([^/]+)';\n }\n }\n\n return {\n pattern: new RegExp(`^${regexStr}$`),\n paramNames,\n };\n}\n\n/**\n * Converts a property name to a path segment.\n * - `$param` becomes `:param`\n * - Other names become literal segments\n */\nfunction propertyToSegment(prop: string): string {\n if (prop.startsWith('$')) {\n return `:${prop.slice(1)}`;\n }\n return prop;\n}\n\n/** Collects and compiles all routes from a router tree. */\nfunction compileRoutes(\n routerDef: Router<RouterRoutes>,\n parentPath = '',\n parentMiddleware: Middleware[] = [],\n): CompiledRoute[] {\n const currentMiddleware = [...parentMiddleware, ...(routerDef.middleware || [])];\n const compiled: CompiledRoute[] = [];\n\n for (const [prop, entry] of Object.entries(routerDef.routes)) {\n // Check if entry is a nested router first (takes precedence over method name check).\n // This allows path segments named 'get', 'post', etc. when they contain routers.\n if (isRouter(entry)) {\n // Nested router - recurse with updated path.\n const segment = propertyToSegment(prop);\n const newPath = parentPath ? `${parentPath}/${segment}` : `/${segment}`;\n compiled.push(...compileRoutes(entry, newPath, currentMiddleware));\n } else if (HTTP_METHODS.has(prop)) {\n // Method handler (get, post, etc.) - only when entry is a route or function.\n const method = prop.toUpperCase();\n const path = parentPath || '/';\n const { pattern, paramNames } = pathToRegex(path);\n\n if (isFunction(entry)) {\n // Bare function handler.\n compiled.push({\n method,\n pattern,\n paramNames,\n handler: entry,\n middleware: currentMiddleware,\n });\n } else if (isRoute(entry)) {\n // Route with schemas.\n const routeDef = entry as RouteDefinition;\n compiled.push({\n method,\n pattern,\n paramNames,\n handler: routeDef.handler,\n middleware: currentMiddleware,\n querySchema: routeDef.query ? compileSchema(routeDef.query) : undefined,\n bodySchema: routeDef.body ? compileSchema(routeDef.body) : undefined,\n });\n }\n }\n }\n\n return compiled;\n}\n\n/**\n * Strips the body from a response for HEAD requests.\n */\nfunction stripBodyForHead(response: Response, isHead: boolean): Response {\n if (!isHead) return response;\n return new Response(null, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\n/**\n * Creates a fetch handler from a router definition.\n *\n * @example\n * ```typescript\n * const api = router({\n * health: router({\n * get: async () => ({ status: 'ok' }),\n * }),\n * users: router({\n * get: async () => [...],\n * $id: router({\n * get: async (c) => ({ id: c.path.id }),\n * }),\n * }),\n * });\n *\n * export default { fetch: api.handler() };\n * ```\n */\nexport function createHandler<T extends RouterRoutes>(routerDef: Router<T>): FetchHandler {\n const compiledRoutes = compileRoutes(routerDef);\n\n return async (request: Request, env?: unknown, ctx?: ExecutionContext): Promise<Response> => {\n const url = new URL(request.url);\n const method = request.method.toUpperCase();\n const isHead = method === 'HEAD';\n\n // Find matching route.\n for (const compiled of compiledRoutes) {\n const methodMatches =\n compiled.method === method ||\n method === 'OPTIONS' ||\n (method === 'HEAD' && compiled.method === 'GET');\n if (!methodMatches) continue;\n\n const match = compiled.pattern.exec(url.pathname);\n if (!match) continue;\n\n // Extract path parameters.\n const path: Record<string, string> = {};\n for (let i = 0; i < compiled.paramNames.length; i++) {\n path[compiled.paramNames[i]] = decodeURIComponent(match[i + 1]);\n }\n\n // Create middleware context.\n const context: MiddlewareContext = {\n request,\n path,\n query: {},\n body: {},\n env,\n executionCtx: ctx,\n };\n\n // Run middleware and handler.\n if (\n compiled.middleware.length > 0 ||\n compiled.handler ||\n compiled.querySchema ||\n compiled.bodySchema\n ) {\n const response = await runMiddleware(compiled.middleware, context, async () => {\n const routeId = `${compiled.method} ${url.pathname}`;\n\n // Validate query params.\n let query: unknown = {};\n if (compiled.querySchema) {\n const raw = Object.fromEntries(url.searchParams);\n const result = compiled.querySchema.safeParse(raw);\n if (!result.success) {\n return Response.json(\n {\n error: 'Invalid query parameters',\n route: routeId,\n details: result.error.flatten(),\n },\n { status: 400 },\n );\n }\n query = result.data;\n }\n\n // Validate body.\n let body: unknown = {};\n if (compiled.bodySchema && ['POST', 'PUT', 'PATCH'].includes(method)) {\n const raw = await request.json().catch(() => ({}));\n const result = compiled.bodySchema.safeParse(raw);\n if (!result.success) {\n return Response.json(\n { error: 'Invalid request body', route: routeId, details: result.error.flatten() },\n { status: 400 },\n );\n }\n body = result.data;\n }\n\n context.query = query;\n context.body = body;\n\n if (compiled.handler) {\n // Build handler context with middleware extensions.\n const handlerContext = {\n request,\n path,\n query,\n body,\n env,\n executionCtx: ctx,\n };\n\n // Copy middleware extensions.\n for (const key of Object.keys(context)) {\n if (!['request', 'path', 'query', 'body', 'env', 'executionCtx'].includes(key)) {\n (handlerContext as Record<string, unknown>)[key] = (\n context as Record<string, unknown>\n )[key];\n }\n }\n\n const result = await compiled.handler(handlerContext);\n if (result instanceof Response) {\n return result;\n }\n return Response.json(result);\n }\n\n return Response.json({});\n });\n return stripBodyForHead(response, isHead);\n }\n\n return stripBodyForHead(Response.json({}), isHead);\n }\n\n return Response.json({ error: 'Not Found' }, { status: 404 });\n };\n}\n","/**\n * @fileoverview Core route and router creation functions.\n *\n * ## Path Convention\n * - Property names = URL path segments\n * - `$param` prefix = dynamic segment (`:param`)\n * - `get`, `post`, `put`, `patch`, `delete` = HTTP method handlers\n *\n * ## Typing Best Practices\n *\n * **Schemas** (`query`/`body`) provide runtime validation AND type inference.\n * Use them for any input that needs validation:\n * ```typescript\n * get: route({\n * query: { limit: 'number?' },\n * handler: async (c) => c.query.limit, // limit: number | undefined\n * })\n * ```\n *\n * **Context** (`route.ctx<T>()`) provides types only (no validation).\n * Use it for path params, env bindings, and middleware-injected values:\n * ```typescript\n * interface MyContext {\n * path: { id: string };\n * env: { DB: Database };\n * user: { name: string }; // from auth middleware\n * }\n * get: route.ctx<MyContext>()({\n * handler: async (c) => ({ id: c.path.id, user: c.user.name }),\n * })\n * ```\n *\n * **Important:** Don't add explicit type annotations to handler parameters.\n * Let types flow from schemas and context:\n * ```typescript\n * // GOOD: types inferred from schema\n * handler: async (c) => c.query.limit\n *\n * // BAD: redundant type annotation\n * handler: async (c: { query: { limit?: number } }) => c.query.limit\n * ```\n */\n\nimport { createHandler } from './handler.js';\nimport type { Middleware } from './middleware.js';\nimport type { SchemaDefinition } from './schema.js';\nimport type { RouteDefinition, Router, RouterRoutes } from './types.js';\nimport { ROUTE_MARKER, ROUTER_MARKER } from './types.js';\n\n/**\n * Creates a route with query/body validation schemas.\n *\n * Use `route()` when you need request validation. For simple handlers\n * without validation, you can use bare functions directly in the router.\n *\n * @example\n * ```typescript\n * // Route with query validation\n * get: route({\n * query: { limit: 'number?', offset: 'number?' },\n * handler: async (c) => {\n * const items = await db.list(c.query.limit, c.query.offset);\n * return { items };\n * },\n * })\n *\n * // Route with body validation\n * post: route({\n * body: { name: 'string', email: 'string' },\n * handler: async (c) => {\n * const user = await db.create(c.body);\n * return user;\n * },\n * })\n *\n * // Simple handler without validation (bare function)\n * get: async () => ({ status: 'ok' })\n * ```\n */\nexport function route<\n const Q extends SchemaDefinition = {},\n const B extends SchemaDefinition = {},\n R = unknown,\n>(definition: RouteDefinition<Q, B, R, {}, {}>): RouteDefinition<Q, B, R, {}, {}> {\n return { ...definition, [ROUTE_MARKER]: true } as RouteDefinition<Q, B, R, {}, {}>;\n}\n\n/** Return type of route.ctx<T>() - callable and chainable. */\ninterface CtxBuilder<Ctx> {\n <const Q extends SchemaDefinition = {}, const B extends SchemaDefinition = {}, R = unknown>(\n definition: RouteDefinition<Q, B, R, {}, Ctx>,\n ): RouteDefinition<Q, B, R, {}, Ctx>;\n\n ctx<AdditionalCtx>(): CtxBuilder<Ctx & AdditionalCtx>;\n}\n\n/** Creates a chainable context builder. */\nfunction createCtxBuilder<Ctx>(): CtxBuilder<Ctx> {\n const builder = <\n const Q extends SchemaDefinition = {},\n const B extends SchemaDefinition = {},\n R = unknown,\n >(\n definition: RouteDefinition<Q, B, R, {}, Ctx>,\n ): RouteDefinition<Q, B, R, {}, Ctx> =>\n ({ ...definition, [ROUTE_MARKER]: true }) as RouteDefinition<Q, B, R, {}, Ctx>;\n\n builder.ctx = <AdditionalCtx>() => createCtxBuilder<Ctx & AdditionalCtx>();\n\n return builder as CtxBuilder<Ctx>;\n}\n\n/**\n * Creates a route with typed context for values not covered by schemas.\n *\n * Use `route.ctx<T>()` to type:\n * - **Path params**: `{ path: { id: string } }` for `$id` segments\n * - **Env bindings**: `{ env: { DB: Database } }` for runtime environment\n * - **Middleware values**: `{ user: User }` for auth middleware, etc.\n *\n * Context provides types only, not runtime validation. For validated inputs,\n * use `query` and `body` schemas instead.\n *\n * @example\n * ```typescript\n * interface AppContext {\n * path: { id: string };\n * env: { DB: D1Database };\n * user: { id: string }; // injected by auth middleware\n * }\n *\n * $id: router({\n * get: route.ctx<AppContext>()({\n * query: { include: 'string?' }, // schema for validation\n * handler: async (c) => {\n * // c.path.id, c.env.DB, c.user.id - from context\n * // c.query.include - from schema\n * return c.env.DB.get(c.path.id);\n * },\n * }),\n * })\n * ```\n */\nroute.ctx = <Ctx>(): CtxBuilder<Ctx> => createCtxBuilder<Ctx>();\n\n/**\n * Creates a router that groups paths and applies middleware.\n *\n * @example\n * ```typescript\n * const api = router({\n * health: router({\n * get: async () => ({ status: 'ok' }),\n * }),\n *\n * users: router({\n * // GET /users - list users\n * get: route({\n * query: { limit: 'number?' },\n * handler: async (c) => db.users.list(c.query.limit),\n * }),\n *\n * // POST /users - create user\n * post: route({\n * body: { name: 'string', email: 'string' },\n * handler: async (c) => db.users.create(c.body),\n * }),\n *\n * // /users/:id\n * $id: router({\n * get: async (c) => db.users.get(c.path.id),\n * delete: async (c) => db.users.delete(c.path.id),\n * }),\n * }),\n * });\n *\n * export default { fetch: api.handler() };\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function router<T extends RouterRoutes, M extends Middleware<any>[]>(\n routes: T,\n ...middleware: M\n): Router<T> {\n // Cast needed because RouterBrand uses a type-only symbol declaration.\n const self = {\n routes,\n middleware: middleware.length > 0 ? middleware : undefined,\n handler() {\n return createHandler(self);\n },\n } as unknown as Router<T>;\n // Add marker for runtime type checking.\n (self as unknown as Record<symbol, boolean>)[ROUTER_MARKER] = true;\n return self;\n}\n","/**\n * @fileoverview OpenAPI documentation generation.\n *\n * Generates OpenAPI 3.0 documentation from router definitions.\n *\n * **Path Convention:**\n * - Property names = URL path segments\n * - `$param` prefix = dynamic segment (`{param}` in OpenAPI)\n * - `get`, `post`, `put`, `patch`, `delete` = HTTP method handlers\n */\n\nimport { type SchemaDefinition, toJsonSchema } from './schema.js';\nimport type { RouteDefinition, Router, RouterRoutes } from './types.js';\nimport { HTTP_METHODS, isFunction, isRoute, isRouter } from './types.js';\n\n/** Collected route info for documentation. */\nexport interface CollectedRoute {\n path: string;\n method: string;\n route: RouteDefinition | null;\n}\n\n/** Converts property name to path segment, handling $param convention. */\nfunction propertyToSegment(prop: string): string {\n if (prop.startsWith('$')) {\n return `{${prop.slice(1)}}`;\n }\n return prop;\n}\n\n/** Collects all routes from a router tree, with `{param}` path segments. */\nexport function collectRoutes(routerDef: Router<RouterRoutes>, parentPath = ''): CollectedRoute[] {\n const collectedRoutes: CollectedRoute[] = [];\n\n for (const [prop, entry] of Object.entries(routerDef.routes)) {\n // Check if this is a method handler.\n if (HTTP_METHODS.has(prop)) {\n const path = parentPath || '/';\n if (isFunction(entry)) {\n collectedRoutes.push({ path, method: prop, route: null });\n } else if (isRoute(entry)) {\n collectedRoutes.push({ path, method: prop, route: entry });\n }\n } else if (isRouter(entry)) {\n // Nested router - recurse with updated path.\n const segment = propertyToSegment(prop);\n const newPath = parentPath ? `${parentPath}/${segment}` : `/${segment}`;\n collectedRoutes.push(...collectRoutes(entry, newPath));\n }\n }\n\n return collectedRoutes;\n}\n\n/** Generates OpenAPI documentation from a router. */\nexport function generateDocs(config: {\n title: string;\n version: string;\n description?: string;\n router: Router<RouterRoutes>;\n}): object {\n const paths: Record<string, Record<string, object>> = {};\n const allRoutes = collectRoutes(config.router);\n\n for (const { path, method, route } of allRoutes) {\n if (!paths[path]) {\n paths[path] = {};\n }\n\n const operation: Record<string, unknown> = {\n operationId: route?.operationId,\n description: route?.description,\n responses: {\n 200: { description: 'Successful response' },\n 400: { description: 'Validation error' },\n },\n };\n\n // Add query parameters (only primitive types supported in query strings).\n if (route?.query) {\n const querySchema = route.query as SchemaDefinition;\n operation.parameters = Object.entries(querySchema)\n .filter(([, type]) => typeof type === 'string')\n .map(([name, type]) => ({\n name,\n in: 'query',\n required: !(type as string).endsWith('?'),\n description: route.descriptions?.[name],\n schema: { type: (type as string).replace('?', '').replace('[]', '') },\n }));\n }\n\n // Add request body.\n if (route?.body && ['post', 'put', 'patch'].includes(method)) {\n operation.requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: toJsonSchema(route.body as SchemaDefinition, route.descriptions),\n },\n },\n };\n }\n\n paths[path][method] = operation;\n }\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.title,\n version: config.version,\n description: config.description,\n },\n paths,\n };\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as SchemaDefinition, D as compileSchema, E as ValidationResult, S as InferSchema, T as SchemaTypeMap, _ as TypedResponse, a as runMiddleware, b as isRouter, c as ExecutionContext, d as MethodEntry, f as RouteDefinition, g as TypedHandler, h as RouterRoutes, l as FetchHandler, m as RouterBrand, n as MiddlewareContext, o as CollectPathParams, p as Router, r as MiddlewareNext, s as Context, t as Middleware, u as Method, v as isFunction, w as SchemaType, x as CompiledSchema, y as isRoute } from "./middleware-Bxq0LHLS.mjs";
1
+ import { C as InferSchema, D as ValidationResult, E as SchemaTypeMap, O as compileSchema, S as CompiledSchema, T as SchemaType, _ as TypedHandler, a as runMiddleware, b as isRoute, c as ExecutionContext, d as MethodEntry, f as RouteDefinition, g as ToolAnnotations, h as RouterRoutes, l as FetchHandler, m as RouterBrand, n as MiddlewareContext, o as CollectPathParams, p as Router, r as MiddlewareNext, s as Context, t as Middleware, u as Method, v as TypedResponse, w as SchemaDefinition, x as isRouter, y as isFunction } from "./middleware-zRMBpTLe.mjs";
2
2
 
3
3
  //#region src/core.d.ts
4
4
 
@@ -75,7 +75,7 @@ interface CtxBuilder<Ctx> {
75
75
  * export default { fetch: api.handler() };
76
76
  * ```
77
77
  */
78
- declare function router<T extends RouterRoutes, M$1 extends Middleware<any>[]>(routes: T, ...middleware: M$1): Router<T>;
78
+ declare function router<T extends RouterRoutes, M extends Middleware<any>[]>(routes: T, ...middleware: M): Router<T>;
79
79
  //#endregion
80
80
  //#region src/docs.d.ts
81
81
  /** Generates OpenAPI documentation from a router. */
@@ -92,7 +92,7 @@ type LowercaseMethods = 'get' | 'post' | 'put' | 'patch' | 'delete';
92
92
  /** Map lowercase method to $-prefixed version. */
93
93
  type PrefixedMethod<T extends LowercaseMethods> = T extends 'get' ? '$get' : T extends 'post' ? '$post' : T extends 'put' ? '$put' : T extends 'patch' ? '$patch' : T extends 'delete' ? '$delete' : never;
94
94
  /** Extract return type from a handler. */
95
- type ExtractReturn<T> = T extends ((...args: unknown[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
95
+ type ExtractReturn<T> = T extends ((...args: never[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
96
96
  /** Detects if a type is `any`. */
97
97
  type IsAny<T> = 0 extends 1 & T ? true : false;
98
98
  /** Checks if a schema type should require a property. */
@@ -102,7 +102,7 @@ type SafeInferSchema<T> = IsAny<T> extends true ? {} : keyof T extends never ? {
102
102
  /** Check if router tree contains any $param properties. */
103
103
  type HasParams<Path extends string[]> = Path extends [infer Head, ...infer Rest extends string[]] ? Head extends `$${string}` ? true : HasParams<Rest> : false;
104
104
  /** Extract the MethodEntry part from a union type. */
105
- type ExtractMethod<T> = Extract<T, RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown)>;
105
+ type ExtractMethod<T> = T extends RouteDefinition<infer _Q, infer _B, infer _R, infer _P, infer _Ctx> ? T : T extends ((...args: never[]) => unknown) ? T : never;
106
106
  /** Remove string/number index signatures from a type. */
107
107
  type RemoveIndex<T> = { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K] };
108
108
  /** Header value that can be static or dynamic. */
@@ -116,8 +116,8 @@ interface BaseRequestOptions {
116
116
  /** Full request options including client-specific extras. */
117
117
  type RequestOptions<Extra> = BaseRequestOptions & Extra;
118
118
  /** Build options type based on whether path params are needed. */
119
- type BuildOptions<HasPathParams extends boolean, Q$1, B$1, Extra> = HasPathParams extends true ? {
120
- path: Record<string, string>;
119
+ type BuildOptions<Path extends string[], Q$1, B$1, Extra> = HasParams<Path> extends true ? {
120
+ path: CollectPathParams<Path>;
121
121
  } & (RequiresProperty<Q$1> extends true ? {
122
122
  query?: Q$1;
123
123
  } : {}) & (RequiresProperty<B$1> extends true ? {
@@ -128,14 +128,14 @@ type BuildOptions<HasPathParams extends boolean, Q$1, B$1, Extra> = HasPathParam
128
128
  body: B$1;
129
129
  } : {}) & Extra;
130
130
  /** Client type for a method entry (route or bare function). */
131
- type MethodClient<T, Extra, HasPathParams extends boolean = false> = T extends RouteDefinition<infer Q, infer B, infer R, any, any> ? (options?: BuildOptions<HasPathParams, SafeInferSchema<Q>, SafeInferSchema<B>, Extra>) => Promise<R> : T extends ((...args: unknown[]) => unknown) ? (options?: BuildOptions<HasPathParams, {}, {}, Extra>) => Promise<ExtractReturn<T>> : never;
131
+ type MethodClient<T, Extra, Path extends string[] = []> = T extends RouteDefinition<infer Q, infer B, infer R, infer _P, infer _Ctx> ? (options?: BuildOptions<Path, SafeInferSchema<Q>, SafeInferSchema<B>, Extra>) => Promise<R> : T extends ((...args: never[]) => unknown) ? (options?: BuildOptions<Path, {}, {}, Extra>) => Promise<ExtractReturn<T>> : never;
132
132
  /** Helper to extract return type for implicit GET calls. */
133
- type ImplicitGetCall<T extends RouterRoutes, Extra, Path extends string[] = []> = 'get' extends keyof T ? ExtractMethod<T['get']> extends RouteDefinition<infer _Q, infer _B, infer R, any, any> ? HasParams<Path> extends true ? (options: {
134
- path: Record<string, string>;
133
+ type ImplicitGetCall<T extends RouterRoutes, Extra, Path extends string[] = []> = 'get' extends keyof T ? ExtractMethod<T['get']> extends RouteDefinition<infer _Q, infer _B, infer R, infer _P, infer _Ctx> ? HasParams<Path> extends true ? (options: {
134
+ path: CollectPathParams<Path>;
135
135
  } & {
136
136
  query?: Record<string, unknown>;
137
- } & Extra) => Promise<R> : (options?: RequestOptions<Extra>) => Promise<R> : ExtractMethod<T['get']> extends ((...args: unknown[]) => unknown) ? HasParams<Path> extends true ? (options: {
138
- path: Record<string, string>;
137
+ } & Extra) => Promise<R> : (options?: RequestOptions<Extra>) => Promise<R> : ExtractMethod<T['get']> extends ((...args: never[]) => unknown) ? HasParams<Path> extends true ? (options: {
138
+ path: CollectPathParams<Path>;
139
139
  } & {
140
140
  query?: Record<string, unknown>;
141
141
  } & Extra) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: RequestOptions<Extra>) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: RequestOptions<Extra>) => Promise<unknown> : (options?: RequestOptions<Extra>) => Promise<unknown>;
@@ -146,7 +146,7 @@ type ImplicitGetCall<T extends RouterRoutes, Extra, Path extends string[] = []>
146
146
  * params are always optional and untyped, since `$url` is method-agnostic.
147
147
  */
148
148
  type UrlMethod<Path extends string[]> = HasParams<Path> extends true ? (options: {
149
- path: Record<string, string>;
149
+ path: CollectPathParams<Path>;
150
150
  query?: Record<string, unknown>;
151
151
  }) => string : (options?: {
152
152
  query?: Record<string, unknown>;
@@ -154,7 +154,7 @@ type UrlMethod<Path extends string[]> = HasParams<Path> extends true ? (options:
154
154
  /** Client type for a router. */
155
155
  type RouterClient<T extends RouterRoutes, Extra, Path extends string[] = []> = {
156
156
  $url: UrlMethod<Path>;
157
- } & { [K in keyof RemoveIndex<T> as K extends LowercaseMethods ? PrefixedMethod<K> : never]: ExtractMethod<T[K]> extends infer M ? M extends RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown) ? MethodClient<M, Extra, HasParams<Path>> : never : never } & { [K in keyof RemoveIndex<T>]: IsAny<T[K]> extends true ? never : Extract<T[K], Router<any>> extends infer R ? R extends Router<infer Routes> ? RouterClient<Routes, Extra, [...Path, K & string]> & ImplicitGetCall<Routes, Extra, [...Path, K & string]> : never : never } & ImplicitGetCall<T, Extra, Path>;
157
+ } & { [K in keyof RemoveIndex<T> as K extends LowercaseMethods ? PrefixedMethod<K> : never]: MethodClient<ExtractMethod<T[K]>, Extra, Path> } & { [K in keyof RemoveIndex<T>]: IsAny<T[K]> extends true ? never : Extract<T[K], Router<RouterRoutes>> extends infer R ? R extends Router<infer Routes> ? RouterClient<Routes, Extra, [...Path, K & string]> & ImplicitGetCall<Routes, Extra, [...Path, K & string]> : never : never } & ImplicitGetCall<T, Extra, Path>;
158
158
  //#endregion
159
159
  //#region src/http-client.d.ts
160
160
  /** HTTP client configuration. */
@@ -211,6 +211,18 @@ type HttpClient<T extends Router<RouterRoutes>> = {
211
211
  * // GET /api/get
212
212
  * await client.api.get.$get();
213
213
  * ```
214
+ *
215
+ * @example Router built by a dependency-injected factory:
216
+ * ```typescript
217
+ * import type { createServer } from './server';
218
+ * import { createHttpClient } from '@fresho/router';
219
+ *
220
+ * type Api = ReturnType<typeof createServer>['api'];
221
+ *
222
+ * const client = createHttpClient<Api>({
223
+ * baseUrl: 'https://api.example.com',
224
+ * });
225
+ * ```
214
226
  */
215
227
  declare function createHttpClient<T extends Router<RouterRoutes>>(config?: HttpClientConfig): HttpClient<T>;
216
228
  //#endregion
@@ -260,10 +272,14 @@ declare function createLocalClient<T extends Router<RouterRoutes>>(routerDef: T)
260
272
  * ```typescript
261
273
  * import { router, sseResponse, streamJsonLines } from '@fresho/router';
262
274
  *
275
+ * interface Events {
276
+ * tick: { count: number };
277
+ * }
278
+ *
263
279
  * const api = router({
264
280
  * // SSE for real-time updates
265
281
  * events: router({
266
- * get: async () => sseResponse(async (send, close) => {
282
+ * get: async () => sseResponse<Events>(async (send, close) => {
267
283
  * for (let i = 0; i < 10; i++) {
268
284
  * send({ event: 'tick', data: { count: i } });
269
285
  * await sleep(1000);
@@ -294,27 +310,77 @@ interface SSEOptions {
294
310
  keepAliveInterval?: number;
295
311
  }
296
312
  /**
297
- * Server-Sent Event message structure.
313
+ * Data supported by an SSE message.
298
314
  */
299
- interface SSEMessage {
300
- /** Event type (optional). */
301
- event?: string;
302
- /** Event data. */
303
- data: string | object;
315
+ type SSEData = string | object;
316
+ /**
317
+ * Untyped map of SSE event names to their payloads.
318
+ *
319
+ * Define a narrower map and pass it to {@link sseResponse} to type-check event
320
+ * names and their corresponding data.
321
+ */
322
+ type SSEEventMap = Record<string, SSEData>;
323
+ type ValidSSEEventMap<Events$1> = { [Name in keyof Events$1]: SSEData };
324
+ interface SSEMessageMetadata {
304
325
  /** Event ID (optional). */
305
326
  id?: string;
306
327
  /** Retry interval hint for client (optional). */
307
328
  retry?: number;
308
329
  }
330
+ /**
331
+ * Server-Sent Event message structure without a typed event map.
332
+ */
333
+ interface SSEMessage extends SSEMessageMetadata {
334
+ /** Event type (optional). */
335
+ event?: string;
336
+ /** Event data. */
337
+ data: SSEData;
338
+ }
339
+ type NamedSSEMessage<Events$1> = { [Name in Exclude<keyof Events$1 & string, 'message'>]: {
340
+ event: Name;
341
+ data: Events$1[Name];
342
+ } }[Exclude<keyof Events$1 & string, 'message'>];
343
+ type DefaultSSEMessage<Events$1> = 'message' extends keyof Events$1 ? {
344
+ /** Omit the event name to dispatch the default `message` event. */
345
+ event?: 'message';
346
+ data: Events$1['message'];
347
+ } : never;
348
+ /**
349
+ * Server-Sent Event message structure.
350
+ *
351
+ * For a typed event map, each event name is coupled to its payload type. Use
352
+ * the reserved `message` key to type messages that omit the `event` field.
353
+ */
354
+ type SSEEventMessage<Events$1 extends ValidSSEEventMap<Events$1>> = (string extends keyof Events$1 ? SSEMessage : NamedSSEMessage<Events$1> | DefaultSSEMessage<Events$1>) & SSEMessageMetadata;
355
+ declare const SSE_EVENTS: unique symbol;
356
+ /**
357
+ * Response carrying its SSE event map at the type level.
358
+ */
359
+ type SSEResponse<Events$1 extends ValidSSEEventMap<Events$1> = SSEEventMap> = Response & {
360
+ readonly [SSE_EVENTS]: Events$1;
361
+ };
362
+ /**
363
+ * Extracts the event map carried by an SSE response or typed client method.
364
+ *
365
+ * @example
366
+ * ```typescript
367
+ * type Events = SSEEventsOf<ReturnType<typeof client.events>>;
368
+ * ```
369
+ */
370
+ type SSEEventsOf<T> = Awaited<T> extends SSEResponse<infer Events> ? Events : never;
309
371
  /**
310
372
  * Creates a Server-Sent Events (SSE) response.
311
373
  *
312
374
  * @example
313
375
  * ```typescript
376
+ * interface CounterEvents {
377
+ * tick: { count: number };
378
+ * }
379
+ *
314
380
  * const handler = async (c) => {
315
- * return sseResponse(async (send, close) => {
381
+ * return sseResponse<CounterEvents>(async (send, close) => {
316
382
  * for (let i = 0; i < 5; i++) {
317
- * await send({ data: { count: i } });
383
+ * send({ event: 'tick', data: { count: i } });
318
384
  * await new Promise(r => setTimeout(r, 1000));
319
385
  * }
320
386
  * close();
@@ -322,7 +388,7 @@ interface SSEMessage {
322
388
  * };
323
389
  * ```
324
390
  */
325
- declare function sseResponse(handler: (send: (message: SSEMessage) => void, close: () => void) => void | Promise<void>, options?: SSEOptions): Response;
391
+ declare function sseResponse<Events$1 extends ValidSSEEventMap<Events$1> = SSEEventMap>(handler: (send: (message: SSEEventMessage<Events$1>) => void, close: () => void) => void | Promise<void>, options?: SSEOptions): SSEResponse<Events$1>;
326
392
  /**
327
393
  * Creates a streaming JSON response where each line is a JSON object.
328
394
  *
@@ -345,5 +411,5 @@ declare function streamJsonLines(handler: (send: (data: object) => void, close:
345
411
  headers?: HeadersInit;
346
412
  }): Response;
347
413
  //#endregion
348
- export { type CollectPathParams, type CompiledSchema, type Context, type ExecutionContext, type FetchHandler, type HttpClient, type HttpClientConfig, type HttpRequestOptions, type InferSchema, type LocalClient, type LocalClientConfig, type LocalRequestOptions, type Method, type MethodEntry, type Middleware, type MiddlewareContext, type MiddlewareNext, type RouteDefinition, type Router, type RouterBrand, type RouterRoutes, type SSEMessage, type SSEOptions, type SchemaDefinition, type SchemaType, type SchemaTypeMap, type TypedHandler, type TypedResponse, type ValidationResult, compileSchema, createHttpClient, createLocalClient, generateDocs, isFunction, isRoute, isRouter, route, router, runMiddleware, sseResponse, streamJsonLines };
414
+ export { type CollectPathParams, type CompiledSchema, type Context, type ExecutionContext, type FetchHandler, type HttpClient, type HttpClientConfig, type HttpRequestOptions, type InferSchema, type LocalClient, type LocalClientConfig, type LocalRequestOptions, type Method, type MethodEntry, type Middleware, type MiddlewareContext, type MiddlewareNext, type RouteDefinition, type Router, type RouterBrand, type RouterRoutes, type SSEData, type SSEEventMap, type SSEEventMessage, type SSEEventsOf, type SSEMessage, type SSEOptions, type SSEResponse, type SchemaDefinition, type SchemaType, type SchemaTypeMap, type ToolAnnotations, type TypedHandler, type TypedResponse, type ValidationResult, compileSchema, createHttpClient, createLocalClient, generateDocs, isFunction, isRoute, isRouter, route, router, runMiddleware, sseResponse, streamJsonLines };
349
415
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/docs.ts","../src/client-types.ts","../src/http-client.ts","../src/local-client.ts","../src/streaming.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/docs.ts","../src/client-types.ts","../src/http-client.ts","../src/local-client.ts","../src/streaming.ts"],"sourcesContent":[],"mappings":"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"}