diff --git a/src/endpoint.ts b/src/endpoint.ts index 50a9fb9..a3434b7 100644 --- a/src/endpoint.ts +++ b/src/endpoint.ts @@ -1,4 +1,4 @@ -import type { HasRequiredKeys, Prettify } from "./helper"; +import type { HasRequiredKeys, InferResultType, Prettify } from "./helper"; import { toResponse } from "./to-response"; import type { Middleware } from "./middleware"; import { @@ -368,52 +368,18 @@ export const createEndpoint = ; - type ResultType< - AsResponse extends boolean, - ReturnHeaders extends boolean, - ReturnStatus extends boolean, - > = AsResponse extends true - ? Response - : ReturnHeaders extends true - ? ReturnStatus extends true - ? { - headers: Headers; - status: number; - response: Awaited; - } - : { - headers: Headers; - response: Awaited; - } - : ReturnStatus extends true - ? { - status: number; - response: Awaited; - } - : Awaited; - const internalHandler = async < AsResponse extends boolean = false, ReturnHeaders extends boolean = false, ReturnStatus extends boolean = false, >( - ...inputCtx: HasRequiredKeys extends true - ? [ - Context & { - asResponse?: AsResponse; - returnHeaders?: ReturnHeaders; - returnStatus?: ReturnStatus; - }, - ] - : [ - (Context & { - asResponse?: AsResponse; - returnHeaders?: ReturnHeaders; - returnStatus?: ReturnStatus; - })?, - ] - ): Promise> => { - const context = (inputCtx[0] || {}) as InputContext; + input?: Context & { + asResponse?: AsResponse; + returnHeaders?: ReturnHeaders; + returnStatus?: ReturnStatus; + }, + ): Promise> => { + const context = (input ?? {}) as InputContext; const internalContext = await createInternalContext(context, { options, path, @@ -453,7 +419,7 @@ export const createEndpoint = ; + ) as InferResultType; }; internalHandler.options = options; internalHandler.path = path; diff --git a/src/helper.ts b/src/helper.ts index 9c5ff44..9362292 100644 --- a/src/helper.ts +++ b/src/helper.ts @@ -45,3 +45,28 @@ export type InferParamWildCard = Path extends : Path extends `${infer _Start}/${infer Rest}` ? InferParamWildCard : {}; + +export type InferResultType< + AsResponse extends boolean, + ReturnHeaders extends boolean, + ReturnStatus extends boolean, + R, +> = AsResponse extends true + ? Response + : ReturnHeaders extends true + ? ReturnStatus extends true + ? { + headers: Headers; + status: number; + response: Awaited; + } + : { + headers: Headers; + response: Awaited; + } + : ReturnStatus extends true + ? { + status: number; + response: Awaited; + } + : Awaited;