Skip to content

Commit 7e9f2ec

Browse files
committed
chore: improve createEndpoint typing
1 parent d27ac20 commit 7e9f2ec

File tree

2 files changed

+34
-43
lines changed

2 files changed

+34
-43
lines changed

src/endpoint.ts

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { HasRequiredKeys, Prettify } from "./helper";
1+
import type { HasRequiredKeys, InferResultType, Prettify } from "./helper";
22
import { toResponse } from "./to-response";
33
import type { Middleware } from "./middleware";
44
import {
@@ -368,52 +368,18 @@ export const createEndpoint = <Path extends string, Options extends EndpointOpti
368368
}
369369
type Context = InputContext<Path, Options>;
370370

371-
type ResultType<
372-
AsResponse extends boolean,
373-
ReturnHeaders extends boolean,
374-
ReturnStatus extends boolean,
375-
> = AsResponse extends true
376-
? Response
377-
: ReturnHeaders extends true
378-
? ReturnStatus extends true
379-
? {
380-
headers: Headers;
381-
status: number;
382-
response: Awaited<R>;
383-
}
384-
: {
385-
headers: Headers;
386-
response: Awaited<R>;
387-
}
388-
: ReturnStatus extends true
389-
? {
390-
status: number;
391-
response: Awaited<R>;
392-
}
393-
: Awaited<R>;
394-
395371
const internalHandler = async <
396372
AsResponse extends boolean = false,
397373
ReturnHeaders extends boolean = false,
398374
ReturnStatus extends boolean = false,
399375
>(
400-
...inputCtx: HasRequiredKeys<Context> extends true
401-
? [
402-
Context & {
403-
asResponse?: AsResponse;
404-
returnHeaders?: ReturnHeaders;
405-
returnStatus?: ReturnStatus;
406-
},
407-
]
408-
: [
409-
(Context & {
410-
asResponse?: AsResponse;
411-
returnHeaders?: ReturnHeaders;
412-
returnStatus?: ReturnStatus;
413-
})?,
414-
]
415-
): Promise<ResultType<AsResponse, ReturnHeaders, ReturnStatus>> => {
416-
const context = (inputCtx[0] || {}) as InputContext<any, any>;
376+
input?: Context & {
377+
asResponse?: AsResponse;
378+
returnHeaders?: ReturnHeaders;
379+
returnStatus?: ReturnStatus;
380+
},
381+
): Promise<InferResultType<AsResponse, ReturnHeaders, ReturnStatus, R>> => {
382+
const context = (input ?? {}) as InputContext<any, any>;
417383
const internalContext = await createInternalContext(context, {
418384
options,
419385
path,
@@ -453,7 +419,7 @@ export const createEndpoint = <Path extends string, Options extends EndpointOpti
453419
: context.returnStatus
454420
? { response, status }
455421
: response
456-
) as ResultType<AsResponse, ReturnHeaders, ReturnStatus>;
422+
) as InferResultType<AsResponse, ReturnHeaders, ReturnStatus, R>;
457423
};
458424
internalHandler.options = options;
459425
internalHandler.path = path;

src/helper.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,28 @@ export type InferParamWildCard<Path> = Path extends
4545
: Path extends `${infer _Start}/${infer Rest}`
4646
? InferParamWildCard<Rest>
4747
: {};
48+
49+
export type InferResultType<
50+
AsResponse extends boolean,
51+
ReturnHeaders extends boolean,
52+
ReturnStatus extends boolean,
53+
R,
54+
> = AsResponse extends true
55+
? Response
56+
: ReturnHeaders extends true
57+
? ReturnStatus extends true
58+
? {
59+
headers: Headers;
60+
status: number;
61+
response: Awaited<R>;
62+
}
63+
: {
64+
headers: Headers;
65+
response: Awaited<R>;
66+
}
67+
: ReturnStatus extends true
68+
? {
69+
status: number;
70+
response: Awaited<R>;
71+
}
72+
: Awaited<R>;

0 commit comments

Comments
 (0)