setup: Type the error argument in onError as Error instead of unknown. Non-Error values are wrapped with new Error(String(error), { cause: error }) to preserve the original value.
setup: c.input is now only available on routes that define at least one request schema (params, query, or body). This ensures validated input is the only typed path to request data.
0.3.1
Bug Fixes
setup: Wrap input extraction and validation in error handling so unexpected failures route through onError instead of crashing the server with an unhandled exception (#40).
0.3.0
Bug Fixes
cors: Only emit CORS headers when the request origin is allowed.
cors: Reflect requested headers in preflight responses when allowHeaders is not configured.
query: Handle malformed percent-encoding gracefully instead of throwing.
setup: Ensure onResponse runs after onRequest and onNotFound errors.
setup: Merge app.request() query option with query params already in the path.
cors: Reflect request origin when credentials: true is used with a wildcard origin.
query: Decode + as space in query string keys and values.
setup: Accept empty request bodies for optional body schemas.
Improvements
setup: app.request() now accepts string[] values in the query option.
Dependencies
Upgrade rou3 to 0.8.x.
Migrate to Zod v4 (zod/v4). Minimum peer dependency is now ^3.25.0.