honojs/hono (hono)
### [`v4.3.2`](https://togithub.com/honojs/hono/releases/tag/v4.3.2)
[Compare Source](https://togithub.com/honojs/hono/compare/v4.3.1...v4.3.2)
#### What's Changed
- fix(types): correct inferring when Method has Endponts as Union by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2610](https://togithub.com/honojs/hono/pull/2610)
**Full Changelog**: https://github.com/honojs/hono/compare/v4.3.1...v4.3.2
### [`v4.3.1`](https://togithub.com/honojs/hono/releases/tag/v4.3.1)
[Compare Source](https://togithub.com/honojs/hono/compare/v4.3.0...v4.3.1)
#### What's Changed
- fix(types): `ToSchema` compatibility by [@NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/2605](https://togithub.com/honojs/hono/pull/2605)
**Full Changelog**: https://github.com/honojs/hono/compare/v4.3.0...v4.3.1
### [`v4.3.0`](https://togithub.com/honojs/hono/releases/tag/v4.3.0)
[Compare Source](https://togithub.com/honojs/hono/compare/v4.2.9...v4.3.0)
Hono v4.3.0 is now available! Let's take a look at the new features.
#### Improve the RPC-mode
Thanks to [@kosei28](https://togithub.com/kosei28), [@nakasyou](https://togithub.com/nakasyou), and [@NamesMT](https://togithub.com/NamesMT), the RPC mode has been improved!
##### `c.text()` is typed
The response of `c.text()` was just a `Response` object, not typed.
```ts
const routes = app.get('/about/me', (c) => {
return c.text('Me!') // the response is not typed
})
```
With this release, it will be a `TypedResponse` and you can get the type within the client created by `hc`.
```ts
const client = hc('http://localhost:8787')
const res = await client.about.me.$get()
const text = await res.text() // text is typed as "Me!"
const json = await res.json() // json is never!
```
##### Support all JSON primitives
We added the tests for the responses of `c.json()` to have the correct types and support inferring all primitives. The all tests below are passed!
```ts
const app = new Hono()
const route = app
.get('/api/string', (c) => c.json('a-string'))
.get('/api/number', (c) => c.json(37))
.get('/api/boolean', (c) => c.json(true))
.get('/api/generic', (c) => c.json(Math.random() > 0.5 ? Boolean(Math.random()) : Math.random()))
type AppType = typeof route
const client = hc('http://localhost')
const stringFetch = await client.api.string.$get()
const stringRes = await stringFetch.json()
const numberFetch = await client.api.number.$get()
const numberRes = await numberFetch.json()
const booleanFetch = await client.api.boolean.$get()
const booleanRes = await booleanFetch.json()
const genericFetch = await client.api.generic.$get()
const genericRes = await genericFetch.json()
type stringVerify = Expect>
expect(stringRes).toBe('a-string')
type numberVerify = Expect>
expect(numberRes).toBe(37)
type booleanVerify = Expect>
expect(booleanRes).toBe(true)
type genericVerify = Expect>
expect(typeof genericRes === 'number' || typeof genericRes === 'boolean').toBe(true)
// using .text() on json endpoint should return string
type textTest = Expect, ReturnType>>
```
##### Status code type
If you explicitly specify the status code, such as `200` or `404`, in `c.json()`. It will be added as a type for passing to the client.
```ts
// server.ts
const app = new Hono().get(
'/posts',
zValidator(
'query',
z.object({
id: z.string()
})
),
async (c) => {
const { id } = c.req.valid('query')
const post: Post | undefined = await getPost(id)
if (post === undefined) {
return c.json({ error: 'not found' }, 404) // Specify 404
}
return c.json({ post }, 200) // Specify 200
}
)
export type AppType = typeof app
```
You can get the data by the status code.
```ts
// client.ts
const client = hc('http://localhost:8787/')
const res = await client.posts.$get({
query: {
id: '123'
}
})
if (res.status === 404) {
const data: { error: string } = await res.json()
console.log(data.error)
}
if (res.ok) {
const data: { post: Post } = await res.json()
console.log(data.post)
}
// { post: Post } | { error: string }
type ResponseType = InferResponseType
// { post: Post }
type ResponseType200 = InferResponseType
```
#### Improve compatibility with React
The compatibility of `hono/jsx/dom` has been improved. Now, these React libraries work with `hono/jsx/dom`!
- [react-toastify](https://togithub.com/fkhadra/react-toastify)
- [spinners-react](https://togithub.com/adexin/spinners-react)
- [Radix UI Primitives](https://www.radix-ui.com/primitives)
The below demo is working with `hono/jsx/dom`, not React.
![Google Chrome](https://togithub.com/honojs/hono/assets/10682/b2f93c52-d1b6-40ea-b075-22c49d18a723)
If you want to use React libraries with `hono/jsx/dom`, set-up `tsconfig.json` and `vite.config.ts` like the followings:
`tsconfig.json`:
```json
{
"compilerOptions": {
"paths": {
"react": ["./node_modules/hono/dist/jsx/dom"],
"react-dom": ["./node_modules/hono/dist/jsx/dom"]
}
}
}
```
`vite.config.ts`:
```ts
import { defineConfig } from 'vite'
export default defineConfig({
resolve: {
alias: {
react: 'hono/jsx/dom',
'react-dom': 'hono/jsx/dom'
}
}
})
```
Thanks [@usualoma](https://togithub.com/usualoma)!
#### `createApp()` in Factory Helper
`createApp()` method is added to Factory Helper. If you use this method with `createFactory()`, you can avoid redundancy in the definition of the `Env` type.
If your application is like this, you have to set the `Env` in two places:
```ts
import { createMiddleware } from 'hono/factory'
type Env = {
Variables: {
myVar: string
}
}
// 1. Set the `Env` to `new Hono()`
const app = new Hono()
// 2. Set the `Env` to `createMiddleware()`
const mw = createMiddleware(async (c, next) => {
await next()
})
app.use(mw)
```
By using `createFactory()` and `createApp()`, you can set the Env only in one place.
```ts
import { createFactory } from 'hono/factory'
// ...
// Set the `Env` to `createFactory()`
const factory = createFactory()
const app = factory.createApp()
// factory also has `createMiddleware()`
const mw = factory.createMiddleware(async (c, next) => {
await next()
})
```
#### Deprecate `serveStatic` for Cloudflare Workers
`serveStatic` exported by `hono/cloudflare-workers` has been deprecated. If you create an application which serves static asset files, use Cloudflare Pages instead.
#### Other features
- Cookie Helper - delete cookie returns the deleted value [https://github.com/honojs/hono/pull/2512](https://togithub.com/honojs/hono/pull/2512)
- Bearer Authenticate - add `headerName` option [https://github.com/honojs/hono/pull/2514](https://togithub.com/honojs/hono/pull/2514)
- JSX/DOM - preserve the state of element even if it is repeatedly evaluated by children [https://github.com/honojs/hono/pull/2563](https://togithub.com/honojs/hono/pull/2563)
- Mimes utility - expose built-in MIME types [https://github.com/honojs/hono/pull/2516](https://togithub.com/honojs/hono/pull/2516)
- Serve Static - expose serve-static builder [https://github.com/honojs/hono/pull/2515](https://togithub.com/honojs/hono/pull/2515)
- Secure Headers - enable to set nonce in CSP [https://github.com/honojs/hono/pull/2577](https://togithub.com/honojs/hono/pull/2577)
- Server-Timing - allow `crossOrigin` in TimingOptions to be a function [https://github.com/honojs/hono/pull/2359](https://togithub.com/honojs/hono/pull/2359)
- Client - add `init` option [https://github.com/honojs/hono/pull/2592](https://togithub.com/honojs/hono/pull/2592)
#### All Updates
- fix(request): infer params in a path includes one or more optional parameter by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2576](https://togithub.com/honojs/hono/pull/2576)
- feat(rpc): Add status code to response type by [@kosei28](https://togithub.com/kosei28) in [https://github.com/honojs/hono/pull/2499](https://togithub.com/honojs/hono/pull/2499)
- feat(helper/cookie): delete cookie returns the deleted value by [@sor4chi](https://togithub.com/sor4chi) in [https://github.com/honojs/hono/pull/2512](https://togithub.com/honojs/hono/pull/2512)
- feat(bearer-auth): add `headerName` option by [@eliasbrange](https://togithub.com/eliasbrange) in [https://github.com/honojs/hono/pull/2514](https://togithub.com/honojs/hono/pull/2514)
- feat(jsx/dom): improve compatibility with React by [@usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/2553](https://togithub.com/honojs/hono/pull/2553)
- fix(jsx): preserve the state of element even if it is repeatedly evaluated by children by [@usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/2563](https://togithub.com/honojs/hono/pull/2563)
- feat: expose built-in MIME types by [@cometkim](https://togithub.com/cometkim) in [https://github.com/honojs/hono/pull/2516](https://togithub.com/honojs/hono/pull/2516)
- feat: expose serve-static builder by [@cometkim](https://togithub.com/cometkim) in [https://github.com/honojs/hono/pull/2515](https://togithub.com/honojs/hono/pull/2515)
- feat(secure-headers): enable to set nonce in CSP by [@usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/2577](https://togithub.com/honojs/hono/pull/2577)
- chore(pr_template): Use Bun instead of yarn by [@nakasyou](https://togithub.com/nakasyou) in [https://github.com/honojs/hono/pull/2582](https://togithub.com/honojs/hono/pull/2582)
- feat(cloudflare-workers): deprecate `serveStatic` by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2583](https://togithub.com/honojs/hono/pull/2583)
- feat(types): improve response types flow by [@NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/2581](https://togithub.com/honojs/hono/pull/2581)
- docs(readme): remove Benchmarks section by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2591](https://togithub.com/honojs/hono/pull/2591)
- feat: improve `ToSchema` & `WebSocket Helper` types by [@NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/2588](https://togithub.com/honojs/hono/pull/2588)
- feat(factory): add `createApp()` by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2573](https://togithub.com/honojs/hono/pull/2573)
- feat(hc): add `init` option by [@NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/2592](https://togithub.com/honojs/hono/pull/2592)
- feat(timing): allow crossOrigin in TimingOptions to be a function by [@jonahsnider](https://togithub.com/jonahsnider) in [https://github.com/honojs/hono/pull/2359](https://togithub.com/honojs/hono/pull/2359)
- Next by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2600](https://togithub.com/honojs/hono/pull/2600)
#### New Contributors
- [@kosei28](https://togithub.com/kosei28) made their first contribution in [https://github.com/honojs/hono/pull/2499](https://togithub.com/honojs/hono/pull/2499)
- [@NamesMT](https://togithub.com/NamesMT) made their first contribution in [https://github.com/honojs/hono/pull/2581](https://togithub.com/honojs/hono/pull/2581)
- [@jonahsnider](https://togithub.com/jonahsnider) made their first contribution in [https://github.com/honojs/hono/pull/2359](https://togithub.com/honojs/hono/pull/2359)
**Full Changelog**: https://github.com/honojs/hono/compare/v4.2.9...v4.3.0
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
â™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
[ ] If you want to rebase/retry this PR, check this box
This PR has been generated by Mend Renovate. View repository job log here.
This PR contains the following updates:
~4.2.0
->~4.3.0
Release Notes
honojs/hono (hono)
### [`v4.3.2`](https://togithub.com/honojs/hono/releases/tag/v4.3.2) [Compare Source](https://togithub.com/honojs/hono/compare/v4.3.1...v4.3.2) #### What's Changed - fix(types): correct inferring when Method has Endponts as Union by [@yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/2610](https://togithub.com/honojs/hono/pull/2610) **Full Changelog**: https://github.com/honojs/hono/compare/v4.3.1...v4.3.2 ### [`v4.3.1`](https://togithub.com/honojs/hono/releases/tag/v4.3.1) [Compare Source](https://togithub.com/honojs/hono/compare/v4.3.0...v4.3.1) #### What's Changed - fix(types): `ToSchema` compatibility by [@NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/2605](https://togithub.com/honojs/hono/pull/2605) **Full Changelog**: https://github.com/honojs/hono/compare/v4.3.0...v4.3.1 ### [`v4.3.0`](https://togithub.com/honojs/hono/releases/tag/v4.3.0) [Compare Source](https://togithub.com/honojs/hono/compare/v4.2.9...v4.3.0) Hono v4.3.0 is now available! Let's take a look at the new features. #### Improve the RPC-mode Thanks to [@kosei28](https://togithub.com/kosei28), [@nakasyou](https://togithub.com/nakasyou), and [@NamesMT](https://togithub.com/NamesMT), the RPC mode has been improved! ##### `c.text()` is typed The response of `c.text()` was just a `Response` object, not typed. ```ts const routes = app.get('/about/me', (c) => { return c.text('Me!') // the response is not typed }) ``` With this release, it will be a `TypedResponse` and you can get the type within the client created by `hc`. ```ts const client = hcConfiguration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
â™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate. View repository job log here.