import { ConstrainValidator, Method, ServerFnTypeOrTypeFn } from './createServerFn.js'; import { Assign, Constrain, Expand, IntersectAssign, ResolveValidatorInput, ResolveValidatorOutput, SerializerStringify } from '@tanstack/router-core'; export type AssignAllMiddleware = TMiddlewares extends readonly [ infer TMiddleware extends AnyMiddleware, ...infer TRest ] ? AssignAllMiddleware> : TAcc; /** * Recursively resolve the client context type produced by a sequence of middleware */ export type AssignAllClientContextBeforeNext = unknown extends TClientContext ? TClientContext : Assign, TClientContext>; export type AssignAllClientSendContext = unknown extends TSendContext ? TSendContext : Assign, TSendContext>; export type AssignAllClientContextAfterNext = unknown extends TClientContext ? Assign : Assign, Assign>; /** * Recursively resolve the server context type produced by a sequence of middleware */ export type AssignAllServerContext = unknown extends TSendContext ? Assign : Assign, Assign>; export type AssignAllServerSendContext = unknown extends TSendContext ? TSendContext : Assign, TSendContext>; export type IntersectAllMiddleware = TMiddlewares extends readonly [ infer TMiddleware extends AnyMiddleware, ...infer TRest ] ? IntersectAllMiddleware> : TAcc; /** * Recursively resolve the input type produced by a sequence of middleware */ export type IntersectAllValidatorInputs = unknown extends TValidator ? TValidator : IntersectAssign, TValidator extends undefined ? undefined : ResolveValidatorInput>; /** * Recursively merge the output type produced by a sequence of middleware */ export type IntersectAllValidatorOutputs = unknown extends TValidator ? TValidator : IntersectAssign, TValidator extends undefined ? undefined : ResolveValidatorOutput>; export interface MiddlewareOptions { validateClient?: boolean; middleware?: TMiddlewares; validator?: ConstrainValidator; client?: MiddlewareClientFn; server?: MiddlewareServerFn; } export type MiddlewareServerNextFn = (ctx?: { context?: TNewServerContext; sendContext?: SerializerStringify; }) => Promise>; export interface MiddlewareServerFnOptions { data: Expand>; context: Expand>; next: MiddlewareServerNextFn; method: Method; filename: string; functionId: string; signal: AbortSignal; } export type MiddlewareServerFn = (options: MiddlewareServerFnOptions) => MiddlewareServerFnResult; export type MiddlewareServerFnResult = Promise> | ServerResultWithContext; export type MiddlewareClientNextFn = (ctx?: { context?: TNewClientContext; sendContext?: SerializerStringify; headers?: HeadersInit; }) => Promise>; export interface MiddlewareClientFnOptions { data: Expand>; context: Expand>; sendContext: Expand>; method: Method; signal: AbortSignal; next: MiddlewareClientNextFn; filename: string; functionId: string; type: ServerFnTypeOrTypeFn; } export type MiddlewareClientFn = (options: MiddlewareClientFnOptions) => MiddlewareClientFnResult; export type MiddlewareClientFnResult = Promise> | ClientResultWithContext; export type ServerResultWithContext = { 'use functions must return the result of next()': true; _types: { context: TServerContext; sendContext: TSendContext; }; context: Expand>; sendContext: Expand>; }; export type ClientResultWithContext = { 'use functions must return the result of next()': true; context: Expand>; sendContext: Expand>; headers: HeadersInit; }; export type AnyMiddleware = MiddlewareWithTypes; export interface MiddlewareTypes { middlewares: TMiddlewares; input: ResolveValidatorInput; allInput: IntersectAllValidatorInputs; output: ResolveValidatorOutput; allOutput: IntersectAllValidatorOutputs; clientContext: TClientContext; allClientContextBeforeNext: AssignAllClientContextBeforeNext; allClientContextAfterNext: AssignAllClientContextAfterNext; serverContext: TServerContext; serverSendContext: TServerSendContext; allServerSendContext: AssignAllServerSendContext; allServerContext: AssignAllServerContext; clientSendContext: TClientSendContext; allClientSendContext: AssignAllClientSendContext; validator: TValidator; } export interface MiddlewareWithTypes { _types: MiddlewareTypes; options: MiddlewareOptions; } export interface MiddlewareAfterValidator extends MiddlewareWithTypes, MiddlewareServer, MiddlewareClient { } export interface MiddlewareValidator { validator: (input: ConstrainValidator) => MiddlewareAfterValidator; } export interface MiddlewareAfterServer extends MiddlewareWithTypes { } export interface MiddlewareServer { server: (server: MiddlewareServerFn) => MiddlewareAfterServer; } export interface MiddlewareAfterClient extends MiddlewareWithTypes, MiddlewareServer { } export interface MiddlewareClient { client: (client: MiddlewareClientFn) => MiddlewareAfterClient; } export interface MiddlewareAfterMiddleware extends MiddlewareWithTypes, MiddlewareServer, MiddlewareClient, MiddlewareValidator { } export interface Middleware extends MiddlewareAfterMiddleware { middleware: (middlewares: Constrain>) => MiddlewareAfterMiddleware; } export declare function createMiddleware(options?: { validateClient?: boolean; }, __opts?: MiddlewareOptions): Middleware;