diff --git a/.changeset/hot-pumas-destroy.md b/.changeset/hot-pumas-destroy.md new file mode 100644 index 00000000..cb05cfe4 --- /dev/null +++ b/.changeset/hot-pumas-destroy.md @@ -0,0 +1,5 @@ +--- +'@hono/effect-validator': minor +--- + +format errors with array formatting for improved readability diff --git a/packages/effect-validator/src/index.ts b/packages/effect-validator/src/index.ts index 0b670061..e1eda41c 100644 --- a/packages/effect-validator/src/index.ts +++ b/packages/effect-validator/src/index.ts @@ -1,3 +1,4 @@ +import { ArrayFormatter } from '@effect/schema' import * as S from '@effect/schema/Schema' import { Either } from 'effect' import type { Env, Input, MiddlewareHandler, ValidationTargets } from 'hono' @@ -45,7 +46,8 @@ export const effectValidator = < const result = S.decodeUnknownEither(schema)(value) 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) => { c.req.addValidatedData(target, data as object) return data diff --git a/packages/effect-validator/test/index.test.ts b/packages/effect-validator/test/index.test.ts index fa7212c1..185fc725 100644 --- a/packages/effect-validator/test/index.test.ts +++ b/packages/effect-validator/test/index.test.ts @@ -1,3 +1,4 @@ +import type { ArrayFormatter } from '@effect/schema' import { Schema as S } from '@effect/schema' import { Hono } from 'hono' import type { StatusCode } from 'hono/utils/http-status' @@ -103,8 +104,10 @@ describe('Basic', () => { expect(res).not.toBeNull() 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.error[0].path).toEqual(['age']) + expect(data.error[0].message).toBeDefined() }) })