import { AnyResponseSchema, PossibleResponses } from "./response.js";
import { AfterRoute, BeforeRoute, ContextExtra } from "./middleware.js";
import { ZodSchema } from "zod";
import { Grace } from "../grace.js";
export type Context<Body = any, Query = Record<string, string>, Params = Record<string, string>, Headers = Record<string, string>, Extras = Record<string, unknown>> = {
    request: Request;
    body: Body;
    query: Query;
    params: Params;
    headers: Headers;
    extras: Extras;
    app: Grace;
} & Extras;
export type Route<Body, Query, Params, Response extends AnyResponseSchema, Before extends Array<BeforeRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, After extends Array<AfterRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, Headers = Record<string, string>, ContextExtras = ContextExtra, ContextSchema = Context<Body, Query, Params, Headers, ContextExtras>> = {
    method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
    format?: 'json' | 'multipart' | 'text';
    path?: string;
    schema?: {
        body?: ZodSchema<Body>;
        query?: ZodSchema<Query>;
        params?: ZodSchema<Params>;
        headers?: ZodSchema<Headers>;
        response?: Response;
    };
    before?: Before;
    after?: After;
    handler: (context: ContextSchema) => Promise<PossibleResponses<Response>>;
};
export type AnyRoute = Route<any, any, any, any, any, any, any, any, any>;
export type InferContext<R extends AnyRoute> = R extends Route<any, any, any, any, any, any, any, any, infer ContextSchema> ? ContextSchema : never;
export type InferResponse<R extends AnyRoute> = R extends Route<any, any, any, infer Response, any, any, any, any, any> ? Response : never;
export declare function createRoute<Body, Query, Params, Headers, Response extends AnyResponseSchema, ContextExtras extends ContextExtra, Before extends Array<BeforeRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>, After extends Array<AfterRoute<Route<Body, Query, Params, any, any, any, Headers, ContextExtras>>>>(route: Route<Body, Query, Params, Response, Before, After, Headers, ContextExtras>): Route<Body, Query, Params, Response, Before, After, Headers, ContextExtras>;
export declare function createRouteWithExtras<ContextExtras extends ContextExtra>(): <Body_1, Query, Params, Headers_1, Response_1 extends AnyResponseSchema, Before extends BeforeRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[], After extends AfterRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[]>(route: Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>) => Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>;
export declare function createRouteTemplate<ContextExtras extends ContextExtra>({ before, after, schema, }?: {
    before?: Array<BeforeRoute<Route<any, any, any, any, any, any, any, ContextExtras>>>;
    after?: Array<AfterRoute<Route<any, any, any, any, any, any, any, ContextExtras>>>;
    schema?: {
        body?: ZodSchema;
        query?: ZodSchema;
        params?: ZodSchema;
        headers?: ZodSchema | Record<string, string>;
        response?: AnyResponseSchema;
    };
}): <Body_1, Query, Params, Headers_1, Response_1 extends AnyResponseSchema, Before extends BeforeRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[], After extends AfterRoute<Route<Body_1, Query, Params, any, any, any, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>>[]>(route: Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>) => Route<Body_1, Query, Params, Response_1, Before, After, Headers_1, ContextExtras, Context<Body_1, Query, Params, Headers_1, ContextExtras>>;
//# sourceMappingURL=route.d.ts.map