Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update dependency hono to v4.3.0 #74

Merged
merged 2 commits into from
May 3, 2024
Merged

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented May 3, 2024

Mend Renovate

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
hono (source) 4.2.9 -> 4.3.0 age adoption passing confidence

Release Notes

honojs/hono (hono)

v4.3.0

Compare Source

Hono v4.3.0 is now available! Let's take a look at the new features.

Improve the RPC-mode

Thanks to @​kosei28, @​nakasyou, and @​NamesMT, the RPC mode has been improved!

c.text() is typed

The response of c.text() was just a Response object, not typed.

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.

const client = hc<typeof routes>('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!

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<AppType>('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<Equal<'a-string', typeof stringRes>>
expect(stringRes).toBe('a-string')
type numberVerify = Expect<Equal<37, typeof numberRes>>
expect(numberRes).toBe(37)
type booleanVerify = Expect<Equal<true, typeof booleanRes>>
expect(booleanRes).toBe(true)
type genericVerify = Expect<Equal<number | boolean, typeof genericRes>>
expect(typeof genericRes === 'number' || typeof genericRes === 'boolean').toBe(true)

// using .text() on json endpoint should return string
type textTest = Expect<Equal<Promise<string>, ReturnType<typeof genericFetch.text>>>
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.

// 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.

// client.ts
const client = hc<AppType>('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<typeof client.posts.$get>

// { post: Post }
type ResponseType200 = InferResponseType<typeof client.posts.$get, 200>

Improve compatibility with React

The compatibility of hono/jsx/dom has been improved. Now, these React libraries work with hono/jsx/dom!

The below demo is working with hono/jsx/dom, not React.

Google Chrome

If you want to use React libraries with hono/jsx/dom, set-up tsconfig.json and vite.config.ts like the followings:

tsconfig.json:

{
  "compilerOptions": {
    "paths": {
      "react": ["./node_modules/hono/dist/jsx/dom"],
      "react-dom": ["./node_modules/hono/dist/jsx/dom"]
    }
  }
}

vite.config.ts:

import { defineConfig } from 'vite'

export default defineConfig({
  resolve: {
    alias: {
      react: 'hono/jsx/dom',
      'react-dom': 'hono/jsx/dom'
    }
  }
})

Thanks @​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:

import { createMiddleware } from 'hono/factory'

type Env = {
  Variables: {
    myVar: string
  }
}

// 1. Set the `Env` to `new Hono()`
const app = new Hono<Env>()

// 2. Set the `Env` to `createMiddleware()`
const mw = createMiddleware<Env>(async (c, next) => {
  await next()
})

app.use(mw)

By using createFactory() and createApp(), you can set the Env only in one place.

import { createFactory } from 'hono/factory'

// ...

// Set the `Env` to `createFactory()`
const factory = createFactory<Env>()

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

All Updates

New Contributors

Full Changelog: honojs/hono@v4.2.9...v4.3.0


Configuration

📅 Schedule: Branch creation - "before 4am on Monday" in timezone America/Chicago, 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.

@renovate renovate bot requested a review from a team as a code owner May 3, 2024 22:46
@renovate renovate bot requested a review from a team May 3, 2024 22:46
Copy link

github-actions bot commented May 3, 2024

FAILED  •  🕐 7s  •  🏗️ E2E / ts (#523)  •  ➡️ View in Autoblocks


🔴  typescript-e2e-test-suite-1

Evaluators            Test Cases
-------------------------------------------
has-all-substrings    3 PASSED     1 FAILED
is-friendly           4 PASSED     0 FAILED

🔴  typescript-e2e-test-suite-2

Evaluators            Test Cases
--------------------------------------------
has-all-substrings     7 PASSED     3 FAILED
is-friendly           10 PASSED     0 FAILED

Generated by Autoblocks against cbd286d

Copy link

github-actions bot commented May 3, 2024

FAILED  •  🕐 10s  •  🏗️ E2E / py (#523)  •  ➡️ View in Autoblocks


🔴  python-e2e-test-suite-1

Evaluators            Test Cases
-------------------------------------------
has-all-substrings    3 PASSED     1 FAILED
is-friendly           4 PASSED     0 FAILED

🔴  python-e2e-test-suite-2

Evaluators            Test Cases
--------------------------------------------
has-all-substrings     7 PASSED     3 FAILED
is-friendly           10 PASSED     0 FAILED

Generated by Autoblocks against cbd286d

@nicolewhite nicolewhite enabled auto-merge (squash) May 3, 2024 22:47
@nicolewhite nicolewhite merged commit 13538e8 into main May 3, 2024
8 checks passed
@nicolewhite nicolewhite deleted the renovate/hono-4.x-lockfile branch May 3, 2024 22:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant