123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525 |
- import type { History, Location, Path, To } from "./history";
- import { Action as HistoryAction } from "./history";
- import type { AgnosticDataRouteMatch, AgnosticDataRouteObject, AgnosticRouteObject, DataStrategyFunction, DeferredData, DetectErrorBoundaryFunction, FormEncType, HTMLFormMethod, MapRoutePropertiesFunction, RouteData, Submission, UIMatch, AgnosticPatchRoutesOnNavigationFunction, DataWithResponseInit } from "./utils";
- /**
- * A Router instance manages all navigation and data loading/mutations
- */
- export interface Router {
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Return the basename for the router
- */
- get basename(): RouterInit["basename"];
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Return the future config for the router
- */
- get future(): FutureConfig;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Return the current state of the router
- */
- get state(): RouterState;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Return the routes for this router instance
- */
- get routes(): AgnosticDataRouteObject[];
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Return the window associated with the router
- */
- get window(): RouterInit["window"];
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Initialize the router, including adding history listeners and kicking off
- * initial data fetches. Returns a function to cleanup listeners and abort
- * any in-progress loads
- */
- initialize(): Router;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Subscribe to router.state updates
- *
- * @param fn function to call with the new state
- */
- subscribe(fn: RouterSubscriber): () => void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Enable scroll restoration behavior in the router
- *
- * @param savedScrollPositions Object that will manage positions, in case
- * it's being restored from sessionStorage
- * @param getScrollPosition Function to get the active Y scroll position
- * @param getKey Function to get the key to use for restoration
- */
- enableScrollRestoration(savedScrollPositions: Record<string, number>, getScrollPosition: GetScrollPositionFunction, getKey?: GetScrollRestorationKeyFunction): () => void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Navigate forward/backward in the history stack
- * @param to Delta to move in the history stack
- */
- navigate(to: number): Promise<void>;
- /**
- * Navigate to the given path
- * @param to Path to navigate to
- * @param opts Navigation options (method, submission, etc.)
- */
- navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Trigger a fetcher load/submission
- *
- * @param key Fetcher key
- * @param routeId Route that owns the fetcher
- * @param href href to fetch
- * @param opts Fetcher options, (method, submission, etc.)
- */
- fetch(key: string, routeId: string, href: string | null, opts?: RouterFetchOptions): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Trigger a revalidation of all current route loaders and fetcher loads
- */
- revalidate(): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Utility function to create an href for the given location
- * @param location
- */
- createHref(location: Location | URL): string;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Utility function to URL encode a destination path according to the internal
- * history implementation
- * @param to
- */
- encodeLocation(to: To): Path;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Get/create a fetcher for the given key
- * @param key
- */
- getFetcher<TData = any>(key: string): Fetcher<TData>;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Delete the fetcher for a given key
- * @param key
- */
- deleteFetcher(key: string): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Cleanup listeners and abort any in-progress loads
- */
- dispose(): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Get a navigation blocker
- * @param key The identifier for the blocker
- * @param fn The blocker function implementation
- */
- getBlocker(key: string, fn: BlockerFunction): Blocker;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Delete a navigation blocker
- * @param key The identifier for the blocker
- */
- deleteBlocker(key: string): void;
- /**
- * @internal
- * PRIVATE DO NOT USE
- *
- * Patch additional children routes into an existing parent route
- * @param routeId The parent route id or a callback function accepting `patch`
- * to perform batch patching
- * @param children The additional children routes
- */
- patchRoutes(routeId: string | null, children: AgnosticRouteObject[]): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * HMR needs to pass in-flight route updates to React Router
- * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)
- */
- _internalSetRoutes(routes: AgnosticRouteObject[]): void;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Internal fetch AbortControllers accessed by unit tests
- */
- _internalFetchControllers: Map<string, AbortController>;
- /**
- * @internal
- * PRIVATE - DO NOT USE
- *
- * Internal pending DeferredData instances accessed by unit tests
- */
- _internalActiveDeferreds: Map<string, DeferredData>;
- }
- /**
- * State maintained internally by the router. During a navigation, all states
- * reflect the the "old" location unless otherwise noted.
- */
- export interface RouterState {
- /**
- * The action of the most recent navigation
- */
- historyAction: HistoryAction;
- /**
- * The current location reflected by the router
- */
- location: Location;
- /**
- * The current set of route matches
- */
- matches: AgnosticDataRouteMatch[];
- /**
- * Tracks whether we've completed our initial data load
- */
- initialized: boolean;
- /**
- * Current scroll position we should start at for a new view
- * - number -> scroll position to restore to
- * - false -> do not restore scroll at all (used during submissions)
- * - null -> don't have a saved position, scroll to hash or top of page
- */
- restoreScrollPosition: number | false | null;
- /**
- * Indicate whether this navigation should skip resetting the scroll position
- * if we are unable to restore the scroll position
- */
- preventScrollReset: boolean;
- /**
- * Tracks the state of the current navigation
- */
- navigation: Navigation;
- /**
- * Tracks any in-progress revalidations
- */
- revalidation: RevalidationState;
- /**
- * Data from the loaders for the current matches
- */
- loaderData: RouteData;
- /**
- * Data from the action for the current matches
- */
- actionData: RouteData | null;
- /**
- * Errors caught from loaders for the current matches
- */
- errors: RouteData | null;
- /**
- * Map of current fetchers
- */
- fetchers: Map<string, Fetcher>;
- /**
- * Map of current blockers
- */
- blockers: Map<string, Blocker>;
- }
- /**
- * Data that can be passed into hydrate a Router from SSR
- */
- export type HydrationState = Partial<Pick<RouterState, "loaderData" | "actionData" | "errors">>;
- /**
- * Future flags to toggle new feature behavior
- */
- export interface FutureConfig {
- v7_fetcherPersist: boolean;
- v7_normalizeFormMethod: boolean;
- v7_partialHydration: boolean;
- v7_prependBasename: boolean;
- v7_relativeSplatPath: boolean;
- v7_skipActionErrorRevalidation: boolean;
- }
- /**
- * Initialization options for createRouter
- */
- export interface RouterInit {
- routes: AgnosticRouteObject[];
- history: History;
- basename?: string;
- /**
- * @deprecated Use `mapRouteProperties` instead
- */
- detectErrorBoundary?: DetectErrorBoundaryFunction;
- mapRouteProperties?: MapRoutePropertiesFunction;
- future?: Partial<FutureConfig>;
- hydrationData?: HydrationState;
- window?: Window;
- dataStrategy?: DataStrategyFunction;
- patchRoutesOnNavigation?: AgnosticPatchRoutesOnNavigationFunction;
- }
- /**
- * State returned from a server-side query() call
- */
- export interface StaticHandlerContext {
- basename: Router["basename"];
- location: RouterState["location"];
- matches: RouterState["matches"];
- loaderData: RouterState["loaderData"];
- actionData: RouterState["actionData"];
- errors: RouterState["errors"];
- statusCode: number;
- loaderHeaders: Record<string, Headers>;
- actionHeaders: Record<string, Headers>;
- activeDeferreds: Record<string, DeferredData> | null;
- _deepestRenderedBoundaryId?: string | null;
- }
- /**
- * A StaticHandler instance manages a singular SSR navigation/fetch event
- */
- export interface StaticHandler {
- dataRoutes: AgnosticDataRouteObject[];
- query(request: Request, opts?: {
- requestContext?: unknown;
- skipLoaderErrorBubbling?: boolean;
- dataStrategy?: DataStrategyFunction;
- }): Promise<StaticHandlerContext | Response>;
- queryRoute(request: Request, opts?: {
- routeId?: string;
- requestContext?: unknown;
- dataStrategy?: DataStrategyFunction;
- }): Promise<any>;
- }
- type ViewTransitionOpts = {
- currentLocation: Location;
- nextLocation: Location;
- };
- /**
- * Subscriber function signature for changes to router state
- */
- export interface RouterSubscriber {
- (state: RouterState, opts: {
- deletedFetchers: string[];
- viewTransitionOpts?: ViewTransitionOpts;
- flushSync: boolean;
- }): void;
- }
- /**
- * Function signature for determining the key to be used in scroll restoration
- * for a given location
- */
- export interface GetScrollRestorationKeyFunction {
- (location: Location, matches: UIMatch[]): string | null;
- }
- /**
- * Function signature for determining the current scroll position
- */
- export interface GetScrollPositionFunction {
- (): number;
- }
- export type RelativeRoutingType = "route" | "path";
- type BaseNavigateOrFetchOptions = {
- preventScrollReset?: boolean;
- relative?: RelativeRoutingType;
- flushSync?: boolean;
- };
- type BaseNavigateOptions = BaseNavigateOrFetchOptions & {
- replace?: boolean;
- state?: any;
- fromRouteId?: string;
- viewTransition?: boolean;
- };
- type BaseSubmissionOptions = {
- formMethod?: HTMLFormMethod;
- formEncType?: FormEncType;
- } & ({
- formData: FormData;
- body?: undefined;
- } | {
- formData?: undefined;
- body: any;
- });
- /**
- * Options for a navigate() call for a normal (non-submission) navigation
- */
- type LinkNavigateOptions = BaseNavigateOptions;
- /**
- * Options for a navigate() call for a submission navigation
- */
- type SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;
- /**
- * Options to pass to navigate() for a navigation
- */
- export type RouterNavigateOptions = LinkNavigateOptions | SubmissionNavigateOptions;
- /**
- * Options for a fetch() load
- */
- type LoadFetchOptions = BaseNavigateOrFetchOptions;
- /**
- * Options for a fetch() submission
- */
- type SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;
- /**
- * Options to pass to fetch()
- */
- export type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;
- /**
- * Potential states for state.navigation
- */
- export type NavigationStates = {
- Idle: {
- state: "idle";
- location: undefined;
- formMethod: undefined;
- formAction: undefined;
- formEncType: undefined;
- formData: undefined;
- json: undefined;
- text: undefined;
- };
- Loading: {
- state: "loading";
- location: Location;
- formMethod: Submission["formMethod"] | undefined;
- formAction: Submission["formAction"] | undefined;
- formEncType: Submission["formEncType"] | undefined;
- formData: Submission["formData"] | undefined;
- json: Submission["json"] | undefined;
- text: Submission["text"] | undefined;
- };
- Submitting: {
- state: "submitting";
- location: Location;
- formMethod: Submission["formMethod"];
- formAction: Submission["formAction"];
- formEncType: Submission["formEncType"];
- formData: Submission["formData"];
- json: Submission["json"];
- text: Submission["text"];
- };
- };
- export type Navigation = NavigationStates[keyof NavigationStates];
- export type RevalidationState = "idle" | "loading";
- /**
- * Potential states for fetchers
- */
- type FetcherStates<TData = any> = {
- Idle: {
- state: "idle";
- formMethod: undefined;
- formAction: undefined;
- formEncType: undefined;
- text: undefined;
- formData: undefined;
- json: undefined;
- data: TData | undefined;
- };
- Loading: {
- state: "loading";
- formMethod: Submission["formMethod"] | undefined;
- formAction: Submission["formAction"] | undefined;
- formEncType: Submission["formEncType"] | undefined;
- text: Submission["text"] | undefined;
- formData: Submission["formData"] | undefined;
- json: Submission["json"] | undefined;
- data: TData | undefined;
- };
- Submitting: {
- state: "submitting";
- formMethod: Submission["formMethod"];
- formAction: Submission["formAction"];
- formEncType: Submission["formEncType"];
- text: Submission["text"];
- formData: Submission["formData"];
- json: Submission["json"];
- data: TData | undefined;
- };
- };
- export type Fetcher<TData = any> = FetcherStates<TData>[keyof FetcherStates<TData>];
- interface BlockerBlocked {
- state: "blocked";
- reset(): void;
- proceed(): void;
- location: Location;
- }
- interface BlockerUnblocked {
- state: "unblocked";
- reset: undefined;
- proceed: undefined;
- location: undefined;
- }
- interface BlockerProceeding {
- state: "proceeding";
- reset: undefined;
- proceed: undefined;
- location: Location;
- }
- export type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;
- export type BlockerFunction = (args: {
- currentLocation: Location;
- nextLocation: Location;
- historyAction: HistoryAction;
- }) => boolean;
- export declare const IDLE_NAVIGATION: NavigationStates["Idle"];
- export declare const IDLE_FETCHER: FetcherStates["Idle"];
- export declare const IDLE_BLOCKER: BlockerUnblocked;
- /**
- * Create a router and listen to history POP navigations
- */
- export declare function createRouter(init: RouterInit): Router;
- export declare const UNSAFE_DEFERRED_SYMBOL: unique symbol;
- /**
- * Future flags to toggle new feature behavior
- */
- export interface StaticHandlerFutureConfig {
- v7_relativeSplatPath: boolean;
- v7_throwAbortReason: boolean;
- }
- export interface CreateStaticHandlerOptions {
- basename?: string;
- /**
- * @deprecated Use `mapRouteProperties` instead
- */
- detectErrorBoundary?: DetectErrorBoundaryFunction;
- mapRouteProperties?: MapRoutePropertiesFunction;
- future?: Partial<StaticHandlerFutureConfig>;
- }
- export declare function createStaticHandler(routes: AgnosticRouteObject[], opts?: CreateStaticHandlerOptions): StaticHandler;
- /**
- * Given an existing StaticHandlerContext and an error thrown at render time,
- * provide an updated StaticHandlerContext suitable for a second SSR render
- */
- export declare function getStaticContextFromError(routes: AgnosticDataRouteObject[], context: StaticHandlerContext, error: any): StaticHandlerContext;
- export declare function isDataWithResponseInit(value: any): value is DataWithResponseInit<unknown>;
- export declare function isDeferredData(value: any): value is DeferredData;
- export {};
|