Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/treaty2/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ type IsSuccessCode<S extends number> = S extends SuccessCodeRange ? true : false
type MaybeArray<T> = T | T[]
type MaybePromise<T> = T | Promise<T>

type SerializeQueryParams<T> = T extends Record<string, any>
? {
[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
Expand All @@ -76,7 +86,7 @@ export namespace Treaty {
: K]: K extends 'subscribe' // ? Websocket route
? MaybeEmptyObject<Route['subscribe']['headers'], 'headers'> &
MaybeEmptyObject<
Route['subscribe']['query'],
SerializeQueryParams<Route['subscribe']['query']>,
'query'
> extends infer Param
? (options?: Param) => EdenWS<Route['subscribe']>
Expand All @@ -89,7 +99,7 @@ export namespace Treaty {
response: infer Res extends Record<number, unknown>
}
? MaybeEmptyObject<Headers, 'headers'> &
MaybeEmptyObject<Query, 'query'> extends infer Param
MaybeEmptyObject<SerializeQueryParams<Query>, 'query'> extends infer Param
? {} extends Param
? undefined extends Body
? K extends 'get' | 'head'
Expand Down
35 changes: 35 additions & 0 deletions test/types/treaty2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down Expand Up @@ -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<Route>().parameter(0).toEqualTypeOf<{
headers?: Record<string, unknown> | undefined
query: {
since: string
}
fetch?: RequestInit | undefined
}>()

expectTypeOf<Route>().parameter(1).toBeUndefined()

type Res = Result<Route>

expectTypeOf<Res>().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']
Expand Down