feat(effect-validator): use array formatting for errors (#718)

* feat(effect-validator): use array formatting for errors

* add test for `error`

* make it as `minor`

---------

Co-authored-by: Yusuke Wada <yusuke@kamawada.com>
pull/759/head
Shoki 2024-10-02 09:14:14 +02:00 committed by GitHub
parent 1ed5c7d7fa
commit 80da4aa50a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 12 additions and 2 deletions

View File

@ -0,0 +1,5 @@
---
'@hono/effect-validator': minor
---
format errors with array formatting for improved readability

View File

@ -1,3 +1,4 @@
import { ArrayFormatter } from '@effect/schema'
import * as S from '@effect/schema/Schema' import * as S from '@effect/schema/Schema'
import { Either } from 'effect' import { Either } from 'effect'
import type { Env, Input, MiddlewareHandler, ValidationTargets } from 'hono' import type { Env, Input, MiddlewareHandler, ValidationTargets } from 'hono'
@ -45,7 +46,8 @@ export const effectValidator = <
const result = S.decodeUnknownEither(schema)(value) const result = S.decodeUnknownEither(schema)(value)
return Either.match(result, { return Either.match(result, {
onLeft: (error) => c.json({ success: false, error: JSON.parse(JSON.stringify(error)) }, 400), onLeft: (error) =>
c.json({ success: false, error: ArrayFormatter.formatErrorSync(error) }, 400),
onRight: (data) => { onRight: (data) => {
c.req.addValidatedData(target, data as object) c.req.addValidatedData(target, data as object)
return data return data

View File

@ -1,3 +1,4 @@
import type { ArrayFormatter } from '@effect/schema'
import { Schema as S } from '@effect/schema' import { Schema as S } from '@effect/schema'
import { Hono } from 'hono' import { Hono } from 'hono'
import type { StatusCode } from 'hono/utils/http-status' import type { StatusCode } from 'hono/utils/http-status'
@ -103,8 +104,10 @@ describe('Basic', () => {
expect(res).not.toBeNull() expect(res).not.toBeNull()
expect(res.status).toBe(400) expect(res.status).toBe(400)
const data = (await res.json()) as { success: boolean } const data = await res.json<{ success: boolean; error: ArrayFormatter.Issue[] }>()
expect(data.success).toBe(false) expect(data.success).toBe(false)
expect(data.error[0].path).toEqual(['age'])
expect(data.error[0].message).toBeDefined()
}) })
}) })