import { StartInstanceOptions } from './createStart.js'; import { AnyServerFn, ConstrainValidator, Method } from './createServerFn.js'; import { AnyContext, Assign, Constrain, Expand, IntersectAssign, Register, ResolveValidatorInput, ResolveValidatorOutput, ValidateSerializableInput } from '@tanstack/router-core'; export type CreateMiddlewareFn = (options?: { type?: TType; }, __opts?: FunctionMiddlewareOptions) => CreateMiddlewareResult; export declare const createMiddleware: CreateMiddlewareFn<{}>; export type MiddlewareType = 'request' | 'function'; export type CreateMiddlewareResult = 'request' extends TType ? RequestMiddleware : FunctionMiddleware; export interface FunctionMiddleware extends FunctionMiddlewareAfterMiddleware { middleware: (middlewares: Constrain>) => FunctionMiddlewareAfterMiddleware; } export interface FunctionMiddlewareAfterMiddleware extends FunctionMiddlewareWithTypes, FunctionMiddlewareServer, FunctionMiddlewareClient, FunctionMiddlewareValidator { } export interface FunctionMiddlewareWithTypes { _types: FunctionMiddlewareTypes; options: FunctionMiddlewareOptions; } export interface FunctionMiddlewareTypes { type: 'function'; middlewares: TMiddlewares; input: ResolveValidatorInput; allInput: IntersectAllValidatorInputs; output: ResolveValidatorOutput; allOutput: IntersectAllValidatorOutputs; clientContext: TClientContext; allClientContextBeforeNext: AssignAllClientContextBeforeNext; allClientContextAfterNext: AssignAllClientContextAfterNext; serverContext: TServerContext; serverSendContext: TServerSendContext; allServerSendContext: AssignAllServerSendContext; allServerContext: AssignAllServerFnContext; clientSendContext: TClientSendContext; allClientSendContext: AssignAllClientSendContext; inputValidator: TInputValidator; } /** * Recursively resolve the input type produced by a sequence of middleware */ export type IntersectAllValidatorInputs = unknown extends TInputValidator ? TInputValidator : TInputValidator extends undefined ? IntersectAllMiddleware : IntersectAssign, ResolveValidatorInput>; export type IntersectAllMiddleware = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest] ? TMiddleware extends AnyFunctionMiddleware | AnyRequestMiddleware | AnyServerFn ? IntersectAllMiddleware> : TAcc : TAcc; export type AnyFunctionMiddleware = FunctionMiddlewareWithTypes; /** * Recursively merge the output type produced by a sequence of middleware */ export type IntersectAllValidatorOutputs = unknown extends TInputValidator ? TInputValidator : TInputValidator extends undefined ? IntersectAllMiddleware : IntersectAssign, ResolveValidatorOutput>; /** * Recursively resolve the client context type produced by a sequence of middleware */ export type AssignAllClientContextBeforeNext = unknown extends TClientContext ? TClientContext : Assign, TClientContext>; export type AssignAllMiddleware = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest] ? TMiddleware extends AnyFunctionMiddleware | AnyRequestMiddleware | AnyServerFn ? AssignAllMiddleware> : TAcc : TAcc; export type AssignAllClientContextAfterNext = unknown extends TClientContext ? Assign : Assign, Assign>; export type AssignAllServerSendContext = unknown extends TSendContext ? TSendContext : Assign, TSendContext>; export type AssignAllServerRequestContext = Assign, __AssignAllServerRequestContext>>; export type GlobalFetchRequestContext = Register extends { server: { requestContext: infer TRequestContext; }; } ? TRequestContext : AnyContext; export type GlobalServerRequestContext = TRegister extends { config: StartInstanceOptions; } ? AssignAllMiddleware : AnyContext; type __AssignAllServerRequestContext = unknown extends TSendContext ? Assign : Assign, Assign>; export type AssignAllServerFnContext = Assign, // TODO: This enabled global middleware Assign, // TODO: This enabled global middleware __AssignAllServerFnContext>>>; type GlobalServerFnContext = TRegister extends { config: StartInstanceOptions; } ? AssignAllMiddleware : AnyContext; type __AssignAllServerFnContext = unknown extends TSendContext ? Assign : Assign, Assign>; export type AssignAllClientSendContext = unknown extends TSendContext ? TSendContext : Assign, TSendContext>; export interface FunctionMiddlewareOptions { middleware?: TMiddlewares; inputValidator?: ConstrainValidator; client?: FunctionMiddlewareClientFn; server?: FunctionMiddlewareServerFn; } export type FunctionMiddlewareClientNextFn = (ctx?: { context?: TNewClientContext; sendContext?: ValidateSerializableInput; headers?: HeadersInit; }) => Promise>; export interface FunctionMiddlewareServer { server: (server: FunctionMiddlewareServerFn) => FunctionMiddlewareAfterServer; } export type FunctionMiddlewareServerFn = (options: FunctionMiddlewareServerFnOptions) => FunctionMiddlewareServerFnResult; export type FunctionMiddlewareServerNextFn = (ctx?: { context?: TNewServerContext; sendContext?: ValidateSerializableInput; }) => Promise>; export type FunctionServerResultWithContext = { 'use functions must return the result of next()': true; _types: { context: TServerContext; sendContext: TSendContext; }; context: Expand>; sendContext: Expand>; }; export interface FunctionMiddlewareServerFnOptions { data: Expand>; context: Expand>; next: FunctionMiddlewareServerNextFn; method: Method; filename: string; functionId: string; signal: AbortSignal; } export type FunctionMiddlewareServerFnResult = Promise> | FunctionServerResultWithContext; export interface FunctionMiddlewareAfterServer extends FunctionMiddlewareWithTypes { } export interface FunctionMiddlewareClient { client: (client: FunctionMiddlewareClientFn) => FunctionMiddlewareAfterClient; } export type FunctionMiddlewareClientFn = (options: FunctionMiddlewareClientFnOptions) => FunctionMiddlewareClientFnResult; export interface FunctionMiddlewareClientFnOptions { data: Expand>; context: Expand>; sendContext: Expand>; method: Method; signal: AbortSignal; next: FunctionMiddlewareClientNextFn; filename: string; functionId: string; } export type FunctionMiddlewareClientFnResult = Promise> | FunctionClientResultWithContext; export type FunctionClientResultWithContext = { 'use functions must return the result of next()': true; context: Expand>; sendContext: Expand>; headers: HeadersInit; }; export interface FunctionMiddlewareAfterClient extends FunctionMiddlewareWithTypes, FunctionMiddlewareServer { } export interface FunctionMiddlewareValidator { inputValidator: (inputValidator: ConstrainValidator) => FunctionMiddlewareAfterValidator; } export interface FunctionMiddlewareAfterValidator extends FunctionMiddlewareWithTypes, FunctionMiddlewareServer, FunctionMiddlewareClient { } export interface RequestMiddleware extends RequestMiddlewareAfterMiddleware { middleware: (middlewares: Constrain>) => RequestMiddlewareAfterMiddleware; } export type AnyRequestMiddleware = RequestMiddlewareWithTypes; export interface RequestMiddlewareWithTypes { _types: RequestMiddlewareTypes; options: RequestMiddlewareOptions; } export interface RequestMiddlewareOptions { middleware?: TMiddlewares; server?: RequestServerFn; } export interface RequestMiddlewareTypes { type: 'request'; allInput: undefined; allOutput: undefined; middlewares: TMiddlewares; serverContext: TServerContext; allServerContext: AssignAllServerRequestContext; } export interface RequestMiddlewareAfterMiddleware extends RequestMiddlewareWithTypes, RequestMiddlewareServer { } export interface RequestMiddlewareServer { server: (fn: RequestServerFn) => RequestMiddlewareAfterServer; } export type RequestServerFn = (options: RequestServerOptions) => RequestMiddlewareServerFnResult; export interface RequestServerOptions { request: Request; pathname: string; context: Expand>; next: RequestServerNextFn; } export type RequestServerNextFn = (options?: RequestServerNextFnOptions) => RequestServerNextFnResult; export interface RequestServerNextFnOptions { context?: TServerContext; } export type RequestServerNextFnResult = Promise> | RequestServerResult; export type RequestMiddlewareServerFnResult = Promise | Response> | RequestServerResult | Response; export interface RequestServerResult { request: Request; pathname: string; context: Expand>; response: Response; } export interface RequestMiddlewareAfterServer extends RequestMiddlewareWithTypes { } export {};