diff --git a/src/treaty2/types.ts b/src/treaty2/types.ts index bd21178..2e83bc0 100644 --- a/src/treaty2/types.ts +++ b/src/treaty2/types.ts @@ -58,6 +58,16 @@ type IsSuccessCode = S extends SuccessCodeRange ? true : false type MaybeArray = T | T[] type MaybePromise = T | Promise +type SerializeQueryParams = T extends Record + ? { + [K in keyof T]: T[K] extends Date + ? string + : T[K] extends Date | undefined + ? string | undefined + : T[K] + } + : T + export namespace Treaty { interface TreatyParam { fetch?: RequestInit @@ -76,7 +86,7 @@ export namespace Treaty { : K]: K extends 'subscribe' // ? Websocket route ? MaybeEmptyObject & MaybeEmptyObject< - Route['subscribe']['query'], + SerializeQueryParams, 'query' > extends infer Param ? (options?: Param) => EdenWS @@ -89,7 +99,7 @@ export namespace Treaty { response: infer Res extends Record } ? MaybeEmptyObject & - MaybeEmptyObject extends infer Param + MaybeEmptyObject, 'query'> extends infer Param ? {} extends Param ? undefined extends Body ? K extends 'get' | 'head' diff --git a/test/types/treaty2.ts b/test/types/treaty2.ts index 16eff2b..6c19106 100644 --- a/test/types/treaty2.ts +++ b/test/types/treaty2.ts @@ -31,6 +31,11 @@ const app = new Elysia() username: t.String() }) }) + .get('/date/query', ({ query }) => query, { + query: t.Object({ + since: t.Date() + }) + }) .get('/queries', ({ query }) => query, { query: t.Object({ username: t.String(), @@ -499,6 +504,36 @@ type ValidationError = { >() } +// ? Get should have 1 parameter with type string (for the underlying `t.Date` in the schema) +{ + type Route = api['date']['query']['get'] + + expectTypeOf().parameter(0).toEqualTypeOf<{ + headers?: Record | undefined + query: { + since: string + } + fetch?: RequestInit | undefined + }>() + + expectTypeOf().parameter(1).toBeUndefined() + + type Res = Result + + expectTypeOf().toEqualTypeOf< + | { + data: { + since: Date + } + error: null + response: Response + status: number + headers: HeadersInit | undefined + } + | ValidationError + >() +} + // ? Get should have 1 parameter and is required when query is defined { type Route = api['queries']['get']