| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2025-12-13 | 5.6 kB | |
| v4.11.0 source code.tar.gz | 2025-12-13 | 1.6 MB | |
| v4.11.0 source code.zip | 2025-12-13 | 1.8 MB | |
| Totals: 3 Items | 3.4 MB | 0 | |
Release Notes
Hono v4.11.0 is now available!
This release includes new features for the Hono client, middleware improvements, and an important type system fix.
Type System Fix for Middleware
We've fixed a bug in the type system for middleware. Previously, app did not have the correct type with pathless handlers:
:::ts
const app = new Hono()
.use(async (c, next) => {
await next()
})
.get('/a', async (c, next) => {
await next()
})
.get((c) => {
return c.text('Hello')
})
// app's type was incorrect
This has now been fixed.
Thanks @kosei28!
Typed URL for Hono Client
You can now pass the base URL as the second type parameter to hc to get more precise URL types:
:::ts
const client = hc<typeof app, 'http://localhost:8787'>(
'http://localhost:8787/'
)
const url = client.api.posts.$url()
// url is TypedURL with precise type information
// including protocol, host, and path
This is useful when you want to use the URL as a type-safe key for libraries like SWR.
Thanks @miyaji255!
Custom NotFoundResponse Type
You can now customize the NotFoundResponse type using module augmentation. This allows c.notFound() to return a typed response:
:::ts
import { Hono, TypedResponse } from 'hono'
declare module 'hono' {
interface NotFoundResponse
extends Response,
TypedResponse<{ error: string }, 404, 'json'> {}
}
const app = new Hono()
.get('/posts/:id', async (c) => {
const post = await getPost(c.req.param('id'))
if (!post) {
return c.notFound()
}
return c.json({ post }, 200)
})
.notFound((c) => c.json({ error: 'not found' }, 404))
Now the client can correctly infer the 404 response type.
Thanks @miyaji255!
tryGetContext Helper
The new tryGetContext() helper in the Context Storage middleware returns undefined instead of throwing an error when the context is not available:
:::ts
import { tryGetContext } from 'hono/context-storage'
const context = tryGetContext<Env>()
if (context) {
// Context is available
console.log(context.var.message)
}
Thanks @AyushCoder9!
Custom Query Serializer
You can now customize how query parameters are serialized using the buildSearchParams option:
:::ts
const client = hc<AppType>('http://localhost', {
buildSearchParams: (query) => {
const searchParams = new URLSearchParams()
for (const [k, v] of Object.entries(query)) {
if (v === undefined) continue
if (Array.isArray(v)) {
v.forEach((item) => searchParams.append(`${k}[]`, item))
} else {
searchParams.set(k, v)
}
}
return searchParams
},
})
Thanks @bolasblack!
New features
- feat(types): make Hono client's $url return the exact URL type https://github.com/honojs/hono/pull/4502
- feat(types): enhance NotFoundHandler to support custom NotFoundResponse type https://github.com/honojs/hono/pull/4518
- feat(timing): add wrapTime to simplify usage https://github.com/honojs/hono/pull/4519
- feat(pretty-json): support force option https://github.com/honojs/hono/pull/4531
- feat(client): add buildSearchParams option to customize query serialization https://github.com/honojs/hono/pull/4535
- feat(context-storage): add optional tryGetContext helper https://github.com/honojs/hono/pull/4539
- feat(secure-headers): add CSP report-to and report-uri directive support https://github.com/honojs/hono/pull/4555
- fix(types): replace schema-based path tracking with CurrentPath parameter https://github.com/honojs/hono/pull/4552
All changes
- chore: update esbuild to version 0.27.1 by @kosei28 in https://github.com/honojs/hono/pull/4571
- fix(hono/jsx): display blank when children is nullish by @techfish-11 in https://github.com/honojs/hono/pull/4573
- feat(types): make Hono client's $url return the exact URL type by @miyaji255 in https://github.com/honojs/hono/pull/4502
- feat(types): enhance NotFoundHandler to support custom NotFoundResponse type by @miyaji255 in https://github.com/honojs/hono/pull/4518
- feat(timing): add wrapTime to simplify usage by @PassiDel in https://github.com/honojs/hono/pull/4519
- feat(pretty-json): support force option by @missinglink in https://github.com/honojs/hono/pull/4531
- feat(context-storage): Add optional tryGetContext helper to context-storage middleware by @AyushCoder9 in https://github.com/honojs/hono/pull/4539
- feat(client): add buildSearchParams option to customize query serialization by @bolasblack in https://github.com/honojs/hono/pull/4535
- feat(secure-headers): Add CSP report-to and report-uri directive support by @cruzz77 in https://github.com/honojs/hono/pull/4555
- fix(types): replace schema-based path tracking with CurrentPath parameter by @kosei28 in https://github.com/honojs/hono/pull/4552
- Next by @yusukebe in https://github.com/honojs/hono/pull/4574
New Contributors
- @missinglink made their first contribution in https://github.com/honojs/hono/pull/4531
- @bolasblack made their first contribution in https://github.com/honojs/hono/pull/4535
- @cruzz77 made their first contribution in https://github.com/honojs/hono/pull/4555
Full Changelog: https://github.com/honojs/hono/compare/v4.10.8...v4.11.0