import type { CacheScope } from "../cache/cache-scope.js"; import type { EntryData, InterceptEntry, InterceptSelectorContext, MetricsStore } from "../server/context.js"; import type { HandlerContext, ResolvedSegment, ShouldRevalidateFn } from "../types.js"; import type { RouteMatchResult } from "./pattern-matching.js"; /** * Revalidation context passed to segment resolution */ export interface RevalidationContext { clientSegmentIds: Set; prevParams: Record; request: Request; prevUrl: URL; nextUrl: URL; routeKey: string; actionContext?: { actionId?: string; actionUrl?: URL; actionResult?: any; formData?: FormData; }; stale: boolean; } /** * Result from intercept lookup */ export interface InterceptResult { intercept: InterceptEntry; entry: EntryData; } /** * Router context available via AsyncLocalStorage * * Contains closure functions from createRouter() that middleware needs access to. * Instead of passing 20+ parameters, middleware calls getRouterContext() to access them. */ export interface RouterContext { findMatch: (pathname: string) => RouteMatchResult | null; loadManifest: (entry: any, routeKey: string, pathname: string, metricsStore?: MetricsStore, isSSR?: boolean) => Promise; traverseBack: (entry: EntryData) => Generator; createHandlerContext: (params: Record, request: Request, searchParams: URLSearchParams, pathname: string, url: URL, bindings?: any, routeMap?: Record, routeName?: string) => HandlerContext; setupLoaderAccess: (ctx: HandlerContext, loaderPromises: Map>) => void; setupLoaderAccessSilent: (ctx: HandlerContext, loaderPromises: Map>) => void; getContext: () => { getOrCreateStore: (key: string) => any; runWithStore: (store: any, namespace: string, parent: any, fn: () => T) => T; }; getMetricsStore: () => MetricsStore | undefined; createCacheScope: (cacheConfig: any, parent: CacheScope | null) => CacheScope | null; findInterceptForRoute: (routeKey: string, parentEntry: EntryData | null, selectorContext: InterceptSelectorContext, isAction: boolean) => InterceptResult | null; resolveAllSegmentsWithRevalidation: (entries: EntryData[], routeKey: string, params: Record, handlerContext: HandlerContext, clientSegmentSet: Set, prevParams: Record, request: Request, prevUrl: URL, nextUrl: URL, loaderPromises: Map>, actionContext: any | undefined, interceptResult: InterceptResult | null, localRouteName: string, pathname: string) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[]; }>; resolveAllSegmentsWithRevalidationGenerator?: (entries: EntryData[], routeKey: string, params: Record, handlerContext: HandlerContext, clientSegmentSet: Set, prevParams: Record, request: Request, prevUrl: URL, nextUrl: URL, loaderPromises: Map>, actionContext?: any) => AsyncGenerator; resolveInterceptEntry: (intercept: InterceptEntry, entry: EntryData, params: Record, handlerContext: HandlerContext, belongsToRoute: boolean, revalidationContext?: RevalidationContext) => Promise; collectWithMarkers?: (gen: AsyncGenerator) => Promise<{ items: T[]; matchedIds: string[]; }>; evaluateRevalidation: (params: { segment: ResolvedSegment; prevParams: Record; getPrevSegment: (() => Promise) | null; request: Request; prevUrl: URL; nextUrl: URL; revalidations: Array<{ name: string; fn: any; }>; routeKey: string; context: HandlerContext; actionContext?: any; stale?: boolean; }) => Promise; getRequestContext: () => { waitUntil: (fn: () => Promise) => void; _handleStore?: any; } | undefined; resolveAllSegments: (entries: EntryData[], routeKey: string, params: Record, handlerContext: HandlerContext, loaderPromises: Map>) => Promise; resolveAllSegmentsGenerator?: (entries: EntryData[], routeKey: string, params: Record, handlerContext: HandlerContext, loaderPromises: Map>) => AsyncGenerator; collectSegmentsFromGenerator?: (gen: AsyncGenerator) => Promise; createHandleStore: () => any; resolveLoadersOnly?: (entries: EntryData[], handlerContext: HandlerContext) => Promise; resolveLoadersOnlyWithRevalidation?: (entries: EntryData[], handlerContext: HandlerContext, clientSegmentSet: Set, prevParams: Record, request: Request, prevUrl: URL, nextUrl: URL, routeKey: string, actionContext?: any) => Promise<{ segments: ResolvedSegment[]; matchedIds: string[]; }>; buildEntryRevalidateMap?: (entries: EntryData[]) => Map; resolveInterceptLoadersOnly?: (intercept: InterceptEntry, entry: EntryData, params: Record, handlerContext: HandlerContext, belongsToRoute: boolean, revalidationContext: { clientSegmentIds: Set; prevParams: Record; request: Request; prevUrl: URL; nextUrl: URL; routeKey: string; actionContext?: any; stale?: boolean; }) => Promise<{ loaderDataPromise: Promise | any[]; loaderIds: string[]; } | null>; } /** * Get router dependencies from AsyncLocalStorage context * * @throws Error if called outside of router context (runWithRouterContext) */ export declare function getRouterContext(): RouterContext; /** * Run a function with router dependencies available via getRouterContext() * * All async code within fn() can call getRouterContext() to access router closures. * This works across async boundaries thanks to AsyncLocalStorage. * * @param deps Router dependencies to make available * @param fn Function to run with dependencies available * @returns Result of fn() */ export declare function runWithRouterContext(deps: RouterContext, fn: () => T): T; //# sourceMappingURL=router-context.d.ts.map