From ebd893cb1a5e9a00888700824d6aa321d8fb167d Mon Sep 17 00:00:00 2001 From: remorses Date: Sun, 28 Jul 2024 21:11:40 +0200 Subject: [PATCH 1/2] fix object object on validation errors --- src/errors.ts | 13 +++-- src/treaty2/types.ts | 14 ++--- test/treaty2.test.ts | 17 ++++++ test/types/treaty2.ts | 129 +++++++++--------------------------------- 4 files changed, 60 insertions(+), 113 deletions(-) diff --git a/src/errors.ts b/src/errors.ts index 167b751..8ddcdda 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -1,8 +1,13 @@ export class EdenFetchError< - Status extends number = number, - Value = unknown + Status = number, + Value extends any = any > extends Error { - constructor(public status: Status, public value: Value) { - super(value + '') + value: Value + constructor( + public status: Status, + public passedValue: Value + ) { + super(String((passedValue as any)?.message || passedValue)) + this.value = passedValue } } diff --git a/src/treaty2/types.ts b/src/treaty2/types.ts index 07b96f3..d1f0928 100644 --- a/src/treaty2/types.ts +++ b/src/treaty2/types.ts @@ -2,6 +2,7 @@ import type { Elysia } from 'elysia' import { EdenWS } from './ws' import type { IsNever, Not, Prettify } from '../types' +import { EdenFetchError } from '../errors' type Files = File | FileList @@ -198,15 +199,12 @@ export namespace Treaty { | { data: null error: Exclude extends never - ? { - status: unknown - value: unknown - } + ? EdenFetchError : { - [Status in keyof Res]: { - status: Status - value: Res[Status] - } + [Status in keyof Res]: EdenFetchError< + Status, + Res[Status] + > }[Exclude] response: Response status: number diff --git a/test/treaty2.test.ts b/test/treaty2.test.ts index 0b0de43..7520dd7 100644 --- a/test/treaty2.test.ts +++ b/test/treaty2.test.ts @@ -90,6 +90,16 @@ const app = new Elysia() 420: t.Literal('Snoop Dogg') } }) + // @ts-expect-error + .get('/validationError', () => { + return 'this errors because validation is wrong' + }, { + response: { + 200: t.Object({ + x: t.String() + }), + } + }) .get( '/headers', ({ headers: { username, alias } }) => ({ username, alias }), @@ -512,6 +522,13 @@ describe('Treaty2', () => { const data = await Promise.all([client.id.get(), client.id({ id: 'salty' }).get()]) expect(data.map(x => x.data)).toEqual(['unknown', 'salty']) }) + it('error is not [object Object] when there is a validation error', async () => { + const { error } = await client.validationError.get() + expect(error?.message).toBeTypeOf('string') + expect(error?.message).toBe('Expected object') + expect(error?.value).toBeTypeOf('object') + expect(error?.value?.message).toBe('Expected object') + }) }) diff --git a/test/types/treaty2.ts b/test/types/treaty2.ts index 1bb6668..1626cdf 100644 --- a/test/types/treaty2.ts +++ b/test/types/treaty2.ts @@ -1,5 +1,6 @@ import { Elysia, t } from 'elysia' import { treaty } from '../../src' +import { EdenFetchError } from '../../src/errors' import { expectTypeOf } from 'expect-type' const plugin = new Elysia({ prefix: '/level' }) @@ -165,10 +166,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -203,10 +201,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -241,10 +236,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -279,10 +271,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -317,10 +306,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -354,10 +340,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -391,10 +374,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -434,10 +414,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -473,10 +450,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -514,10 +488,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -555,10 +526,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -596,10 +564,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -635,14 +600,9 @@ type Result = T extends (...args: any[]) => infer R | { data: null error: - | { - status: 418 - value: 'Kirifuji Nagisa' - } - | { - status: 420 - value: 'Snoop Dogg' - } + | EdenFetchError<418, 'Kirifuji Nagisa'> + | EdenFetchError<420, 'Snoop Dogg'> + response: Response status: number headers: HeadersInit | undefined @@ -680,10 +640,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -721,10 +678,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -765,10 +719,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -809,10 +760,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -856,10 +804,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -895,14 +840,8 @@ type Result = T extends (...args: any[]) => infer R | { data: null error: - | { - status: 401 - value: 'Himari' - } - | { - status: 418 - value: 'Nagisa' - } + | EdenFetchError<401, 'Himari'> + | EdenFetchError<418, 'Nagisa'> response: Response status: number headers: HeadersInit | undefined @@ -934,10 +873,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -962,10 +898,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -992,10 +925,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -1021,10 +951,7 @@ type Result = T extends (...args: any[]) => infer R } | { data: null - error: { - status: unknown - value: unknown - } + error: EdenFetchError response: Response status: number headers: HeadersInit | undefined @@ -1113,7 +1040,7 @@ type Result = T extends (...args: any[]) => infer R // ? Return both actual value and generator if yield and return { - const app = new Elysia().get('', async function* () { + const app = new Elysia().get('', async function* () { if (Math.random() > 0.5) return 'a' yield 1 From 4f04203203727ed70101c5996ee04d25a8ef7304 Mon Sep 17 00:00:00 2001 From: remorses Date: Tue, 30 Jul 2024 15:09:58 +0200 Subject: [PATCH 2/2] handle error objects that don't have a message field --- src/errors.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/errors.ts b/src/errors.ts index 8ddcdda..1179d43 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -7,7 +7,15 @@ export class EdenFetchError< public status: Status, public passedValue: Value ) { - super(String((passedValue as any)?.message || passedValue)) + let message = String((passedValue as any)?.message || '') + if (!message) { + if (typeof passedValue === 'object') { + message = JSON.stringify(passedValue) + } else { + message = String(passedValue || '') + } + } + super(message) this.value = passedValue } }