import { b as Awaitable, A as AnyCtx, a as AnyMeta, M as MergeObjectsShallow, U as UnknownValues } from './util-CHs1TI3T.js';

type ResponseHandler = (response: Response) => Awaitable<Response | undefined | void>;
type MiddlewareReturn<TCtxUpdate extends AnyCtx | void = void> = TCtxUpdate | Response | ResponseHandler | void;
type AnyMiddleware = Middleware<any, any, any, any>;
type EndMiddlewareHandler<TCtx extends AnyCtx = AnyCtx, TMetaIn extends AnyMeta = AnyMeta> = (request: Request, ctx: TCtx, meta: Readonly<TMetaIn>) => Awaitable<Response>;
type MiddlewareHandler<TCtxUpdate extends AnyCtx | void = AnyCtx, TCtx extends AnyCtx = AnyCtx, TMetaIn extends AnyMeta = AnyMeta> = (request: Request, ctx: TCtx & AnyCtx, meta: Readonly<UnknownValues<TMetaIn & AnyMeta>>) => Awaitable<MiddlewareReturn<TCtxUpdate>>;
type RequestHandler<TMeta extends AnyMeta = AnyMeta, TResult extends Response | undefined = Response> = ((request: Request) => Promise<TResult>) & {
    meta: TMeta;
};
type Middleware<TCtxUpdate extends AnyCtx | void | undefined = AnyCtx, TCtx extends AnyCtx = AnyCtx, TMetaUpdate extends AnyMeta | void = void, TMetaIn extends AnyMeta = AnyMeta> = void extends TMetaUpdate ? MiddlewareHandler<TCtxUpdate, TCtx, TMetaIn> : MiddlewareHandler<TCtxUpdate, TCtx, TMetaIn> & {
    meta: TMetaUpdate;
};
type EndMiddleware<TCtx extends AnyCtx = AnyCtx, TMetaUpdate extends AnyMeta | void = void, TMetaIn extends AnyMeta = AnyMeta> = void extends TMetaUpdate ? EndMiddlewareHandler<TCtx, TMetaIn> : EndMiddlewareHandler<TCtx, TMetaIn> & {
    meta: TMetaUpdate;
};
type MergeCtx<TUpdates extends AnyCtx | void, TCtx extends AnyCtx | void> = void extends TUpdates ? TCtx : undefined extends TUpdates ? MergeObjectsShallow<TCtx, Partial<TUpdates>> : MergeObjectsShallow<TCtx, TUpdates>;
type MergeMeta<TUpdates extends AnyMeta | void, TMeta extends AnyMeta | void> = void extends TUpdates ? TMeta : undefined extends TUpdates ? MergeObjectsShallow<TMeta, Partial<TUpdates>> : MergeObjectsShallow<TMeta, TUpdates>;

export type { AnyMiddleware as A, EndMiddlewareHandler as E, Middleware as M, ResponseHandler as R, MiddlewareReturn as a, MergeCtx as b, RequestHandler as c, EndMiddleware as d, MergeMeta as e };
