import { MakeOptions, Maker, ValidationError } from './make'; export type { RedirectStatus } from './redirect'; export interface Response> { status: Status; value: { contentType: ContentType; value: Value; }; headers: Headers; } export interface RequestBody { contentType: string; value: A; } export type Params = object; export type Headers = object; export type Query = object; export type RequestContext = any; export interface EndpointArg | void> { path: string; method: Methods; servers: string[]; op?: string; headers: H; params: P; query: Q; body: Body; signal?: AbortSignal; } export type ServerEndpointArg | void, RC extends RequestContext> = EndpointArg & { readonly requestContext: RC; readonly signal?: AbortSignal; }; export type Endpoint | void, R extends Response>, RC extends RequestContext> = (ctx: ServerEndpointArg) => Promise; export type SafeEndpoint = Endpoint | undefined, Response>, RequestContext>; export interface MethodHandlers { get?: SafeEndpoint; post?: SafeEndpoint; put?: SafeEndpoint; delete?: SafeEndpoint; patch?: SafeEndpoint; options?: SafeEndpoint; head?: SafeEndpoint; } export interface Endpoints { [opOrUrl: string]: MethodHandlers; } export declare class RequestValidationError extends Error { tag: string; errors: ValidationError[]; readonly name = "RequestValidationError"; constructor(tag: string, errors: ValidationError[]); } export declare class ResponseValidationError extends Error { tag: string; originalResponse: any; errors: ValidationError[]; readonly name = "ResponseValidationError"; constructor(tag: string, originalResponse: any, errors: ValidationError[]); } export declare function safe, R extends Response>, RC extends RequestContext>(headers: Maker, params: Maker, query: Maker, body: Maker, response: Maker, endpoint: Endpoint, { validationOptions, mode }?: HandlerOptions & InternalHandlerOptions): Endpoint, Response>, RequestContext>; export type Methods = keyof MethodHandlers; export declare const supportedMethods: Methods[]; type AnyMaker = Maker; export interface Handler { op?: string; path: string; servers: string[]; method: Methods; headers: AnyMaker; query: AnyMaker; body: AnyMaker; params: AnyMaker; response: AnyMaker; } export type HandlerFactory = (adapter: ServerAdapter) => (spec: Spec) => void; export declare function assertMethod(method: string): Methods; export type ServerAdapter = (path: string, op: string, method: Methods, handler: SafeEndpoint, servers: string[]) => void; type Mode = 'client' | 'server'; export interface InternalHandlerOptions { /** whether we are calling this on client side or in server side. * This may have effect on eg network <-> ts property mapping. * This value is set automatically by oats. * */ mode: Mode; } export interface HandlerOptions { /** * Options for request schema validation. */ validationOptions?: { query?: MakeOptions; params?: MakeOptions; body?: MakeOptions; }; } export declare function createHandlerFactory>(handlers: Handler[], opts?: HandlerOptions): HandlerFactory;