UNPKG

95.8 kBTypeScriptView Raw
1
2import * as React from "react";
3import { CookieParseOptions, CookieParseOptions as CookieParseOptions$1, CookieSerializeOptions, CookieSerializeOptions as CookieSerializeOptions$1 } from "cookie-es";
4import { BrowserRouter, Form, HashRouter, Link, Links, MemoryRouter, Meta, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, StaticRouter, StaticRouterProvider, unstable_HistoryRouter } from "react-router/internal/react-server-client";
5
6//#region lib/router/history.d.ts
7/**
8 * Actions represent the type of change to a location value.
9 */
10declare enum Action {
11 /**
12 * A POP indicates a change to an arbitrary index in the history stack, such
13 * as a back or forward navigation. It does not describe the direction of the
14 * navigation, only that the current index changed.
15 *
16 * Note: This is the default action for newly created history objects.
17 */
18 Pop = "POP",
19 /**
20 * A PUSH indicates a new entry being added to the history stack, such as when
21 * a link is clicked and a new page loads. When this happens, all subsequent
22 * entries in the stack are lost.
23 */
24 Push = "PUSH",
25 /**
26 * A REPLACE indicates the entry at the current index in the history stack
27 * being replaced by a new one.
28 */
29 Replace = "REPLACE"
30}
31/**
32 * The pathname, search, and hash values of a URL.
33 */
34interface Path {
35 /**
36 * A URL pathname, beginning with a /.
37 */
38 pathname: string;
39 /**
40 * A URL search string, beginning with a ?.
41 */
42 search: string;
43 /**
44 * A URL fragment identifier, beginning with a #.
45 */
46 hash: string;
47}
48/**
49 * An entry in a history stack. A location contains information about the
50 * URL path, as well as possibly some arbitrary state and a key.
51 */
52interface Location<State = any> extends Path {
53 /**
54 * A value of arbitrary data associated with this location.
55 */
56 state: State;
57 /**
58 * A unique string associated with this location. May be used to safely store
59 * and retrieve data in some other storage API, like `localStorage`.
60 *
61 * Note: This value is always "default" on the initial location.
62 */
63 key: string;
64 /**
65 * The masked location displayed in the URL bar, which differs from the URL the
66 * router is operating on
67 */
68 mask?: Path;
69}
70/**
71 * A change to the current location.
72 */
73interface Update {
74 /**
75 * The action that triggered the change.
76 */
77 action: Action;
78 /**
79 * The new location.
80 */
81 location: Location;
82 /**
83 * The delta between this location and the former location in the history stack
84 */
85 delta: number | null;
86}
87/**
88 * A function that receives notifications about location changes.
89 */
90interface Listener {
91 (update: Update): void;
92}
93/**
94 * Describes a location that is the destination of some navigation used in
95 * {@link Link}, {@link useNavigate}, etc.
96 */
97type To = string | Partial<Path>;
98/**
99 * A history is an interface to the navigation stack. The history serves as the
100 * source of truth for the current location, as well as provides a set of
101 * methods that may be used to change it.
102 *
103 * It is similar to the DOM's `window.history` object, but with a smaller, more
104 * focused API.
105 */
106interface History {
107 /**
108 * The last action that modified the current location. This will always be
109 * Action.Pop when a history instance is first created. This value is mutable.
110 */
111 readonly action: Action;
112 /**
113 * The current location. This value is mutable.
114 */
115 readonly location: Location;
116 /**
117 * Returns a valid href for the given `to` value that may be used as
118 * the value of an <a href> attribute.
119 *
120 * @param to - The destination URL
121 */
122 createHref(to: To): string;
123 /**
124 * Returns a URL for the given `to` value
125 *
126 * @param to - The destination URL
127 */
128 createURL(to: To): URL;
129 /**
130 * Encode a location the same way window.history would do (no-op for memory
131 * history) so we ensure our PUSH/REPLACE navigations for data routers
132 * behave the same as POP
133 *
134 * @param to Unencoded path
135 */
136 encodeLocation(to: To): Path;
137 /**
138 * Pushes a new location onto the history stack, increasing its length by one.
139 * If there were any entries in the stack after the current one, they are
140 * lost.
141 *
142 * @param to - The new URL
143 * @param state - Data to associate with the new location
144 */
145 push(to: To, state?: any): void;
146 /**
147 * Replaces the current location in the history stack with a new one. The
148 * location that was replaced will no longer be available.
149 *
150 * @param to - The new URL
151 * @param state - Data to associate with the new location
152 */
153 replace(to: To, state?: any): void;
154 /**
155 * Navigates `n` entries backward/forward in the history stack relative to the
156 * current index. For example, a "back" navigation would use go(-1).
157 *
158 * @param delta - The delta in the stack index
159 */
160 go(delta: number): void;
161 /**
162 * Sets up a listener that will be called whenever the current location
163 * changes.
164 *
165 * @param listener - A function that will be called when the location changes
166 * @returns unlisten - A function that may be used to stop listening
167 */
168 listen(listener: Listener): () => void;
169}
170//#endregion
171//#region lib/router/utils.d.ts
172type MaybePromise<T> = T | Promise<T>;
173/**
174 * Map of routeId -> data returned from a loader/action/error
175 */
176interface RouteData {
177 [routeId: string]: any;
178}
179type LowerCaseFormMethod = "get" | "post" | "put" | "patch" | "delete";
180type UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;
181/**
182 * Users can specify either lowercase or uppercase form methods on `<Form>`,
183 * useSubmit(), `<fetcher.Form>`, etc.
184 */
185type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;
186/**
187 * Active navigation/fetcher form methods are exposed in uppercase on the
188 * RouterState. This is to align with the normalization done via fetch().
189 */
190type FormMethod = UpperCaseFormMethod;
191type FormEncType = "application/x-www-form-urlencoded" | "multipart/form-data" | "application/json" | "text/plain";
192type JsonObject = { [Key in string]: JsonValue } & { [Key in string]?: JsonValue | undefined };
193type JsonArray = JsonValue[] | readonly JsonValue[];
194type JsonPrimitive = string | number | boolean | null;
195type JsonValue = JsonPrimitive | JsonObject | JsonArray;
196/**
197 * @private
198 * Internal interface to pass around for action submissions, not intended for
199 * external consumption
200 */
201type Submission = {
202 formMethod: FormMethod;
203 formAction: string;
204 formEncType: FormEncType;
205 formData: FormData;
206 json: undefined;
207 text: undefined;
208} | {
209 formMethod: FormMethod;
210 formAction: string;
211 formEncType: FormEncType;
212 formData: undefined;
213 json: JsonValue;
214 text: undefined;
215} | {
216 formMethod: FormMethod;
217 formAction: string;
218 formEncType: FormEncType;
219 formData: undefined;
220 json: undefined;
221 text: string;
222};
223/**
224 * A context instance used as the key for the `get`/`set` methods of a
225 * {@link RouterContextProvider}. Accepts an optional default
226 * value to be returned if no value has been set.
227 */
228interface RouterContext<T = unknown> {
229 defaultValue?: T;
230}
231/**
232 * Creates a type-safe {@link RouterContext} object that can be used to
233 * store and retrieve arbitrary values in [`action`](../../start/framework/route-module#action)s,
234 * [`loader`](../../start/framework/route-module#loader)s, and [middleware](../../how-to/middleware).
235 * Similar to React's [`createContext`](https://react.dev/reference/react/createContext),
236 * but specifically designed for React Router's request/response lifecycle.
237 *
238 * If a `defaultValue` is provided, it will be returned from `context.get()`
239 * when no value has been set for the context. Otherwise, reading this context
240 * when no value has been set will throw an error.
241 *
242 * ```tsx filename=app/context.ts
243 * import { createContext } from "react-router";
244 *
245 * // Create a context for user data
246 * export const userContext =
247 * createContext<User | null>(null);
248 * ```
249 *
250 * ```tsx filename=app/middleware/auth.ts
251 * import { getUserFromSession } from "~/auth.server";
252 * import { userContext } from "~/context";
253 *
254 * export const authMiddleware = async ({
255 * context,
256 * request,
257 * }) => {
258 * const user = await getUserFromSession(request);
259 * context.set(userContext, user);
260 * };
261 * ```
262 *
263 * ```tsx filename=app/routes/profile.tsx
264 * import { userContext } from "~/context";
265 *
266 * export async function loader({
267 * context,
268 * }: Route.LoaderArgs) {
269 * const user = context.get(userContext);
270 *
271 * if (!user) {
272 * throw new Response("Unauthorized", { status: 401 });
273 * }
274 *
275 * return { user };
276 * }
277 * ```
278 *
279 * @public
280 * @category Utils
281 * @mode framework
282 * @mode data
283 * @param defaultValue An optional default value for the context. This value
284 * will be returned if no value has been set for this context.
285 * @returns A {@link RouterContext} object that can be used with
286 * `context.get()` and `context.set()` in [`action`](../../start/framework/route-module#action)s,
287 * [`loader`](../../start/framework/route-module#loader)s, and [middleware](../../how-to/middleware).
288 */
289declare function createContext<T>(defaultValue?: T): RouterContext<T>;
290/**
291 * Provides methods for writing/reading values in application context in a
292 * type-safe way. Primarily for usage with [middleware](../../how-to/middleware).
293 *
294 * @example
295 * import {
296 * createContext,
297 * RouterContextProvider
298 * } from "react-router";
299 *
300 * const userContext = createContext<User | null>(null);
301 * const contextProvider = new RouterContextProvider();
302 * contextProvider.set(userContext, getUser());
303 * // ^ Type-safe
304 * const user = contextProvider.get(userContext);
305 * // ^ User
306 *
307 * @public
308 * @category Utils
309 * @mode framework
310 * @mode data
311 */
312declare class RouterContextProvider {
313 #private;
314 /**
315 * Create a new `RouterContextProvider` instance
316 * @param init An optional initial context map to populate the provider with
317 */
318 constructor(init?: Map<RouterContext, unknown>);
319 /**
320 * Access a value from the context. If no value has been set for the context,
321 * it will return the context's `defaultValue` if provided, or throw an error
322 * if no `defaultValue` was set.
323 * @param context The context to get the value for
324 * @returns The value for the context, or the context's `defaultValue` if no
325 * value was set
326 */
327 get<T>(context: RouterContext<T>): T;
328 /**
329 * Set a value for the context. If the context already has a value set, this
330 * will overwrite it.
331 *
332 * @param context The context to set the value for
333 * @param value The value to set for the context
334 * @returns {void}
335 */
336 set<C extends RouterContext>(context: C, value: C extends RouterContext<infer T> ? T : never): void;
337}
338type DefaultContext = Readonly<RouterContextProvider>;
339/**
340 * @private
341 * Arguments passed to route loader/action functions. Same for now but we keep
342 * this as a private implementation detail in case they diverge in the future.
343 */
344interface DataFunctionArgs<Context> {
345 /** A {@link https://developer.mozilla.org/en-US/docs/Web/API/Request Fetch Request instance} which you can use to read headers (like cookies, and {@link https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams URLSearchParams} from the request. */
346 request: Request;
347 /**
348 * A URL instance representing the application location being navigated to or
349 * fetched.
350 *
351 * In Framework mode, this is a normalized URL with React-Router-specific
352 * implementation details removed (`.data` suffixes, `index`/`_routes` search
353 * params). For the raw incoming URL, use `request.url`.
354 */
355 url: URL;
356 /**
357 * Matched un-interpolated route pattern for the current path (i.e., /blog/:slug).
358 * Mostly useful as a identifier to aggregate on for logging/tracing/etc.
359 */
360 pattern: string;
361 /**
362 * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the current route.
363 * @example
364 * // app/routes.ts
365 * route("teams/:teamId", "./team.tsx"),
366 *
367 * // app/team.tsx
368 * export function loader({
369 * params,
370 * }: Route.LoaderArgs) {
371 * params.teamId;
372 * // ^ string
373 * }
374 */
375 params: Params;
376 /**
377 * This is the context passed in to your server adapter's getLoadContext() function.
378 * It's a way to bridge the gap between the adapter's request/response API with your React Router app.
379 * It is only applicable if you are using a custom server adapter.
380 */
381 context: Context;
382}
383/**
384 * Route middleware `next` function to call downstream handlers and then complete
385 * middlewares from the bottom-up
386 */
387interface MiddlewareNextFunction<Result = unknown> {
388 (): Promise<Result>;
389}
390/**
391 * Route middleware function signature. Receives the same "data" arguments as a
392 * `loader`/`action` (`request`, `params`, `context`) as the first parameter and
393 * a `next` function as the second parameter which will call downstream handlers
394 * and then complete middlewares from the bottom-up
395 */
396type MiddlewareFunction<Result = unknown> = (args: DataFunctionArgs<Readonly<RouterContextProvider>>, next: MiddlewareNextFunction<Result>) => MaybePromise<Result | void>;
397/**
398 * Arguments passed to loader functions
399 */
400interface LoaderFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {}
401/**
402 * Arguments passed to action functions
403 */
404interface ActionFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {}
405/**
406 * Loaders and actions can return anything
407 */
408type DataFunctionValue = unknown;
409type DataFunctionReturnValue = MaybePromise<DataFunctionValue>;
410/**
411 * Route loader function signature
412 */
413type LoaderFunction<Context = DefaultContext> = {
414 (args: LoaderFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
415} & {
416 hydrate?: boolean;
417};
418/**
419 * Route action function signature
420 */
421interface ActionFunction<Context = DefaultContext> {
422 (args: ActionFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
423}
424/**
425 * Arguments passed to shouldRevalidate function
426 */
427interface ShouldRevalidateFunctionArgs {
428 /** This is the url the navigation started from. You can compare it with `nextUrl` to decide if you need to revalidate this route's data. */
429 currentUrl: URL;
430 /** These are the {@link https://reactrouter.com/start/framework/routing#dynamic-segments dynamic route params} from the URL that can be compared to the `nextParams` to decide if you need to reload or not. Perhaps you're using only a partial piece of the param for data loading, you don't need to revalidate if a superfluous part of the param changed. */
431 currentParams: DataRouteMatch["params"];
432 /** In the case of navigation, this the URL the user is requesting. Some revalidations are not navigation, so it will simply be the same as currentUrl. */
433 nextUrl: URL;
434 /** In the case of navigation, these are the {@link https://reactrouter.com/start/framework/routing#dynamic-segments dynamic route params} from the next location the user is requesting. Some revalidations are not navigation, so it will simply be the same as currentParams. */
435 nextParams: DataRouteMatch["params"];
436 /** The method (probably `"GET"` or `"POST"`) used in the form submission that triggered the revalidation. */
437 formMethod?: Submission["formMethod"];
438 /** The form action (`<Form action="/somewhere">`) that triggered the revalidation. */
439 formAction?: Submission["formAction"];
440 /** The form encType (`<Form encType="application/x-www-form-urlencoded">) used in the form submission that triggered the revalidation*/
441 formEncType?: Submission["formEncType"];
442 /** The form submission data when the form's encType is `text/plain` */
443 text?: Submission["text"];
444 /** The form submission data when the form's encType is `application/x-www-form-urlencoded` or `multipart/form-data` */
445 formData?: Submission["formData"];
446 /** The form submission data when the form's encType is `application/json` */
447 json?: Submission["json"];
448 /** The status code of the action response */
449 actionStatus?: number;
450 /**
451 * When a submission causes the revalidation this will be the result of the action—either action data or an error if the action failed. It's common to include some information in the action result to instruct shouldRevalidate to revalidate or not.
452 *
453 * @example
454 * export async function action() {
455 * await saveSomeStuff();
456 * return { ok: true };
457 * }
458 *
459 * export function shouldRevalidate({
460 * actionResult,
461 * }) {
462 * if (actionResult?.ok) {
463 * return false;
464 * }
465 * return true;
466 * }
467 */
468 actionResult?: any;
469 /**
470 * By default, React Router doesn't call every loader all the time. There are reliable optimizations it can make by default. For example, only loaders with changing params are called. Consider navigating from the following URL to the one below it:
471 *
472 * /projects/123/tasks/abc
473 * /projects/123/tasks/def
474 * React Router will only call the loader for tasks/def because the param for projects/123 didn't change.
475 *
476 * It's safest to always return defaultShouldRevalidate after you've done your specific optimizations that return false, otherwise your UI might get out of sync with your data on the server.
477 */
478 defaultShouldRevalidate: boolean;
479}
480/**
481 * Route shouldRevalidate function signature. This runs after any submission
482 * (navigation or fetcher), so we flatten the navigation/fetcher submission
483 * onto the arguments. It shouldn't matter whether it came from a navigation
484 * or a fetcher, what really matters is the URLs and the formData since loaders
485 * have to re-run based on the data models that were potentially mutated.
486 */
487interface ShouldRevalidateFunction {
488 (args: ShouldRevalidateFunctionArgs): boolean;
489}
490interface DataStrategyMatch extends RouteMatch<string, DataRouteObject> {
491 /**
492 * @private
493 */
494 _lazyPromises?: {
495 middleware: Promise<void> | undefined;
496 handler: Promise<void> | undefined;
497 route: Promise<void> | undefined;
498 };
499 /**
500 * @deprecated Deprecated in favor of `shouldCallHandler`
501 *
502 * A boolean value indicating whether this route handler should be called in
503 * this pass.
504 *
505 * The `matches` array always includes _all_ matched routes even when only
506 * _some_ route handlers need to be called so that things like middleware can
507 * be implemented.
508 *
509 * `shouldLoad` is usually only interesting if you are skipping the route
510 * handler entirely and implementing custom handler logic - since it lets you
511 * determine if that custom logic should run for this route or not.
512 *
513 * For example:
514 * - If you are on `/parent/child/a` and you navigate to `/parent/child/b` -
515 * you'll get an array of three matches (`[parent, child, b]`), but only `b`
516 * will have `shouldLoad=true` because the data for `parent` and `child` is
517 * already loaded
518 * - If you are on `/parent/child/a` and you submit to `a`'s [`action`](https://reactrouter.com/docs/start/data/route-object#action),
519 * then only `a` will have `shouldLoad=true` for the action execution of
520 * `dataStrategy`
521 * - After the [`action`](https://reactrouter.com/docs/start/data/route-object#action),
522 * `dataStrategy` will be called again for the [`loader`](https://reactrouter.com/docs/start/data/route-object#loader)
523 * revalidation, and all matches will have `shouldLoad=true` (assuming no
524 * custom `shouldRevalidate` implementations)
525 */
526 shouldLoad: boolean;
527 /**
528 * Arguments passed to the `shouldRevalidate` function for this `loader` execution.
529 * Will be `null` if this is not a revalidating loader {@link DataStrategyMatch}.
530 */
531 shouldRevalidateArgs: ShouldRevalidateFunctionArgs | null;
532 /**
533 * Determine if this route's handler should be called during this `dataStrategy`
534 * execution. Calling it with no arguments will leverage the default revalidation
535 * behavior. You can pass your own `defaultShouldRevalidate` value if you wish
536 * to change the default revalidation behavior with your `dataStrategy`.
537 *
538 * @param defaultShouldRevalidate `defaultShouldRevalidate` override value (optional)
539 */
540 shouldCallHandler(defaultShouldRevalidate?: boolean): boolean;
541 /**
542 * An async function that will resolve any `route.lazy` implementations and
543 * execute the route's handler (if necessary), returning a {@link DataStrategyResult}
544 *
545 * - Calling `match.resolve` does not mean you're calling the
546 * [`action`](https://reactrouter.com/docs/start/data/route-object#action)/[`loader`](https://reactrouter.com/docs/start/data/route-object#loader)
547 * (the "handler") - `resolve` will only call the `handler` internally if
548 * needed _and_ if you don't pass your own `handlerOverride` function parameter
549 * - It is safe to call `match.resolve` for all matches, even if they have
550 * `shouldLoad=false`, and it will no-op if no loading is required
551 * - You should generally always call `match.resolve()` for `shouldLoad:true`
552 * routes to ensure that any `route.lazy` implementations are processed
553 * - See the examples below for how to implement custom handler execution via
554 * `match.resolve`
555 */
556 resolve: (handlerOverride?: (handler: (ctx?: unknown) => DataFunctionReturnValue) => DataFunctionReturnValue) => Promise<DataStrategyResult>;
557}
558interface DataStrategyFunctionArgs<Context = DefaultContext> extends DataFunctionArgs<Context> {
559 /**
560 * Matches for this route extended with Data strategy APIs
561 */
562 matches: DataStrategyMatch[];
563 runClientMiddleware: (cb: DataStrategyFunction<Context>) => Promise<Record<string, DataStrategyResult>>;
564 /**
565 * The key of the fetcher we are calling `dataStrategy` for, otherwise `null`
566 * for navigational executions
567 */
568 fetcherKey: string | null;
569}
570/**
571 * Result from a loader or action called via dataStrategy
572 */
573interface DataStrategyResult {
574 type: "data" | "error";
575 result: unknown;
576}
577interface DataStrategyFunction<Context = DefaultContext> {
578 (args: DataStrategyFunctionArgs<Context>): Promise<Record<string, DataStrategyResult>>;
579}
580type PatchRoutesOnNavigationFunctionArgs = {
581 signal: AbortSignal;
582 path: string;
583 matches: RouteMatch[];
584 fetcherKey: string | undefined;
585 patch: (routeId: string | null, children: RouteObject[]) => void;
586};
587type PatchRoutesOnNavigationFunction = (opts: PatchRoutesOnNavigationFunctionArgs) => MaybePromise<void>;
588/**
589 * Function provided to set route-specific properties from route objects
590 */
591interface MapRoutePropertiesFunction {
592 (route: DataRouteObject): Partial<DataRouteObject>;
593}
594/**
595 * Keys we cannot change from within a lazy object. We spread all other keys
596 * onto the route. Either they're meaningful to the router, or they'll get
597 * ignored.
598 */
599type UnsupportedLazyRouteObjectKey = "lazy" | "caseSensitive" | "path" | "id" | "index" | "children";
600/**
601 * Keys we cannot change from within a lazy() function. We spread all other keys
602 * onto the route. Either they're meaningful to the router, or they'll get
603 * ignored.
604 */
605type UnsupportedLazyRouteFunctionKey = UnsupportedLazyRouteObjectKey | "middleware";
606/**
607 * lazy object to load route properties, which can add non-matching
608 * related properties to a route
609 */
610type LazyRouteObject<R extends RouteObject> = { [K in keyof R as K extends UnsupportedLazyRouteObjectKey ? never : K]?: () => Promise<R[K] | null | undefined> };
611/**
612 * lazy() function to load a route definition, which can add non-matching
613 * related properties to a route
614 */
615interface LazyRouteFunction<R extends RouteObject> {
616 (): Promise<Omit<R, UnsupportedLazyRouteFunctionKey> & Partial<Record<UnsupportedLazyRouteFunctionKey, never>>>;
617}
618type LazyRouteDefinition<R extends RouteObject> = LazyRouteObject<R> | LazyRouteFunction<R>;
619/**
620 * Base RouteObject with common props shared by all types of routes
621 * @internal
622 */
623type BaseRouteObject = {
624 /**
625 * Whether the path should be case-sensitive. Defaults to `false`.
626 */
627 caseSensitive?: boolean;
628 /**
629 * The path pattern to match. If unspecified or empty, then this becomes a
630 * layout route.
631 */
632 path?: string;
633 /**
634 * The unique identifier for this route (for use with {@link DataRouter}s)
635 */
636 id?: string;
637 /**
638 * The route middleware.
639 * See [`middleware`](../../start/data/route-object#middleware).
640 */
641 middleware?: MiddlewareFunction[];
642 /**
643 * The route loader.
644 * See [`loader`](../../start/data/route-object#loader).
645 */
646 loader?: LoaderFunction | boolean;
647 /**
648 * The route action.
649 * See [`action`](../../start/data/route-object#action).
650 */
651 action?: ActionFunction | boolean;
652 /**
653 * The route shouldRevalidate function.
654 * See [`shouldRevalidate`](../../start/data/route-object#shouldRevalidate).
655 */
656 shouldRevalidate?: ShouldRevalidateFunction;
657 /**
658 * The route handle.
659 */
660 handle?: any;
661 /**
662 * A function that returns a promise that resolves to the route object.
663 * Used for code-splitting routes.
664 * See [`lazy`](../../start/data/route-object#lazy).
665 */
666 lazy?: LazyRouteDefinition<BaseRouteObject>;
667 /**
668 * The React Component to render when this route matches.
669 * Mutually exclusive with `element`.
670 */
671 Component?: React.ComponentType | null;
672 /**
673 * The React element to render when this Route matches.
674 * Mutually exclusive with `Component`.
675 */
676 element?: React.ReactNode | null;
677 /**
678 * The React Component to render at this route if an error occurs.
679 * Mutually exclusive with `errorElement`.
680 */
681 ErrorBoundary?: React.ComponentType | null;
682 /**
683 * The React element to render at this route if an error occurs.
684 * Mutually exclusive with `ErrorBoundary`.
685 */
686 errorElement?: React.ReactNode | null;
687 /**
688 * The React Component to render while this router is loading data.
689 * Mutually exclusive with `hydrateFallbackElement`.
690 */
691 HydrateFallback?: React.ComponentType | null;
692 /**
693 * The React element to render while this router is loading data.
694 * Mutually exclusive with `HydrateFallback`.
695 */
696 hydrateFallbackElement?: React.ReactNode | null;
697};
698/**
699 * Index routes must not have children
700 */
701type IndexRouteObject = BaseRouteObject & {
702 /**
703 * Child Route objects - not valid on index routes.
704 */
705 children?: undefined;
706 /**
707 * Whether this is an index route.
708 */
709 index: true;
710};
711/**
712 * Non-index routes may have children, but cannot have `index` set to `true`.
713 */
714type NonIndexRouteObject = BaseRouteObject & {
715 /**
716 * Child Route objects.
717 */
718 children?: RouteObject[];
719 /**
720 * Whether this is an index route - must be `false` or undefined on non-index routes.
721 */
722 index?: false;
723};
724/**
725 * A route object represents a logical route, with (optionally) its child
726 * routes organized in a tree-like structure.
727 */
728type RouteObject = IndexRouteObject | NonIndexRouteObject;
729type DataIndexRouteObject = IndexRouteObject & {
730 id: string;
731};
732type DataNonIndexRouteObject = NonIndexRouteObject & {
733 children?: DataRouteObject[];
734 id: string;
735};
736/**
737 * A data route object, which is just a RouteObject with a required unique ID
738 */
739type DataRouteObject = DataIndexRouteObject | DataNonIndexRouteObject;
740type RouteManifest<R = DataRouteObject> = Record<string, R | undefined>;
741/**
742 * The parameters that were parsed from the URL path.
743 */
744type Params<Key extends string = string> = { readonly [key in Key]: string | undefined };
745/**
746 * A RouteMatch contains info about how a route matched a URL.
747 */
748interface RouteMatch<ParamKey extends string = string, RouteObjectType extends RouteObject = RouteObject> {
749 /**
750 * The names and values of dynamic parameters in the URL.
751 */
752 params: Params<ParamKey>;
753 /**
754 * The portion of the URL pathname that was matched.
755 */
756 pathname: string;
757 /**
758 * The portion of the URL pathname that was matched before child routes.
759 */
760 pathnameBase: string;
761 /**
762 * The route object that was used to match.
763 */
764 route: RouteObjectType;
765}
766interface DataRouteMatch extends RouteMatch<string, DataRouteObject> {}
767/**
768 * Matches the given routes to a location and returns the match data.
769 *
770 * @example
771 * import { matchRoutes } from "react-router";
772 *
773 * let routes = [{
774 * path: "/",
775 * Component: Root,
776 * children: [{
777 * path: "dashboard",
778 * Component: Dashboard,
779 * }]
780 * }];
781 *
782 * matchRoutes(routes, "/dashboard"); // [rootMatch, dashboardMatch]
783 *
784 * @public
785 * @category Utils
786 * @param routes The array of route objects to match against.
787 * @param locationArg The location to match against, either a string path or a
788 * partial {@link Location} object
789 * @param basename Optional base path to strip from the location before matching.
790 * Defaults to `/`.
791 * @returns An array of matched routes, or `null` if no matches were found.
792 */
793declare function matchRoutes<RouteObjectType extends RouteObject = RouteObject>(routes: RouteObjectType[], locationArg: Partial<Location> | string, basename?: string): RouteMatch<string, RouteObjectType>[] | null;
794interface UIMatch<Data = unknown, Handle = unknown> {
795 id: string;
796 pathname: string;
797 /**
798 * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the matched route.
799 */
800 params: RouteMatch["params"];
801 /**
802 * The return value from the matched route's loader or clientLoader. This might
803 * be `undefined` if this route's `loader` (or a deeper route's `loader`) threw
804 * an error and we're currently displaying an `ErrorBoundary`.
805 */
806 loaderData: Data | undefined;
807 /**
808 * The {@link https://reactrouter.com/start/framework/route-module#handle handle object}
809 * exported from the matched route module
810 */
811 handle: Handle;
812}
813interface RouteMeta<RouteObjectType extends RouteObject = RouteObject> {
814 relativePath: string;
815 caseSensitive: boolean;
816 childrenIndex: number;
817 route: RouteObjectType;
818 matcher?: RegExp;
819 compiledParams?: CompiledPathParam[];
820}
821/**
822 * @private
823 * PRIVATE - DO NOT USE
824 *
825 * A "branch" of routes that match a given route pattern.
826 * This is an internal interface not intended for direct external usage.
827 */
828interface RouteBranch<RouteObjectType extends RouteObject = RouteObject> {
829 path: string;
830 score: number;
831 routesMeta: RouteMeta<RouteObjectType>[];
832}
833type CompiledPathParam = {
834 paramName: string;
835 isOptional?: boolean;
836};
837declare class DataWithResponseInit<D> {
838 type: string;
839 data: D;
840 init: ResponseInit | null;
841 constructor(data: D, init?: ResponseInit);
842}
843/**
844 * Create "responses" that contain `headers`/`status` without forcing
845 * serialization into an actual [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
846 *
847 * @example
848 * import { data } from "react-router";
849 *
850 * export async function action({ request }: Route.ActionArgs) {
851 * let formData = await request.formData();
852 * let item = await createItem(formData);
853 * return data(item, {
854 * headers: { "X-Custom-Header": "value" }
855 * status: 201,
856 * });
857 * }
858 *
859 * @public
860 * @category Utils
861 * @mode framework
862 * @mode data
863 * @param data The data to be included in the response.
864 * @param init The status code or a `ResponseInit` object to be included in the
865 * response.
866 * @returns A {@link DataWithResponseInit} instance containing the data and
867 * response init.
868 */
869declare function data<D>(data: D, init?: number | ResponseInit): DataWithResponseInit<D>;
870type RedirectFunction = (url: string, init?: number | ResponseInit) => Response;
871/**
872 * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response).
873 * Sets the status code and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
874 * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
875 *
876 * This utility accepts absolute URLs and can navigate to external domains, so
877 * the application should validate any user-supplied inputs to redirects.
878 *
879 * @example
880 * import { redirect } from "react-router";
881 *
882 * export async function loader({ request }: Route.LoaderArgs) {
883 * if (!isLoggedIn(request))
884 * throw redirect("/login");
885 * }
886 *
887 * // ...
888 * }
889 *
890 * @public
891 * @category Utils
892 * @mode framework
893 * @mode data
894 * @param url The URL to redirect to.
895 * @param init The status code or a `ResponseInit` object to be included in the
896 * response.
897 * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
898 * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
899 * header.
900 */
901declare const redirect$1: RedirectFunction;
902/**
903 * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
904 * that will force a document reload to the new location. Sets the status code
905 * and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
906 * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
907 *
908 * This utility accepts absolute URLs and can navigate to external domains, so
909 * the application should validate any user-supplied inputs to redirects.
910 *
911 * ```tsx filename=routes/logout.tsx
912 * import { redirectDocument } from "react-router";
913 *
914 * import { destroySession } from "../sessions.server";
915 *
916 * export async function action({ request }: Route.ActionArgs) {
917 * let session = await getSession(request.headers.get("Cookie"));
918 * return redirectDocument("/", {
919 * headers: { "Set-Cookie": await destroySession(session) }
920 * });
921 * }
922 * ```
923 *
924 * @public
925 * @category Utils
926 * @mode framework
927 * @mode data
928 * @param url The URL to redirect to.
929 * @param init The status code or a `ResponseInit` object to be included in the
930 * response.
931 * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
932 * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
933 * header.
934 */
935declare const redirectDocument$1: RedirectFunction;
936/**
937 * A redirect [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
938 * that will perform a [`history.replaceState`](https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState)
939 * instead of a [`history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState)
940 * for client-side navigation redirects. Sets the status code and the [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
941 * header. Defaults to [`302 Found`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302).
942 *
943 * @example
944 * import { replace } from "react-router";
945 *
946 * export async function loader() {
947 * return replace("/new-location");
948 * }
949 *
950 * @public
951 * @category Utils
952 * @mode framework
953 * @mode data
954 * @param url The URL to redirect to.
955 * @param init The status code or a `ResponseInit` object to be included in the
956 * response.
957 * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
958 * object with the redirect status and [`Location`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Location)
959 * header.
960 */
961declare const replace$2: RedirectFunction;
962type ErrorResponse = {
963 status: number;
964 statusText: string;
965 data: any;
966};
967/**
968 * Check if the given error is an {@link ErrorResponse} generated from a 4xx/5xx
969 * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
970 * thrown from an [`action`](../../start/framework/route-module#action) or
971 * [`loader`](../../start/framework/route-module#loader) function.
972 *
973 * @example
974 * import { isRouteErrorResponse } from "react-router";
975 *
976 * export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
977 * if (isRouteErrorResponse(error)) {
978 * return (
979 * <>
980 * <p>Error: `${error.status}: ${error.statusText}`</p>
981 * <p>{error.data}</p>
982 * </>
983 * );
984 * }
985 *
986 * return (
987 * <p>Error: {error instanceof Error ? error.message : "Unknown Error"}</p>
988 * );
989 * }
990 *
991 * @public
992 * @category Utils
993 * @mode framework
994 * @mode data
995 * @param error The error to check.
996 * @returns `true` if the error is an {@link ErrorResponse}, `false` otherwise.
997 */
998declare function isRouteErrorResponse(error: any): error is ErrorResponse;
999//#endregion
1000//#region lib/router/instrumentation.d.ts
1001type ServerInstrumentation = {
1002 handler?: InstrumentRequestHandlerFunction;
1003 route?: InstrumentRouteFunction;
1004};
1005type ClientInstrumentation = {
1006 router?: InstrumentRouterFunction;
1007 route?: InstrumentRouteFunction;
1008};
1009type InstrumentRequestHandlerFunction = (handler: InstrumentableRequestHandler) => void;
1010type InstrumentRouterFunction = (router: InstrumentableRouter) => void;
1011type InstrumentRouteFunction = (route: InstrumentableRoute) => void;
1012type InstrumentationHandlerResult = {
1013 status: "success";
1014 error: undefined;
1015} | {
1016 status: "error";
1017 error: Error;
1018};
1019type InstrumentFunction<T> = (handler: () => Promise<InstrumentationHandlerResult>, info: T) => Promise<void>;
1020type ReadonlyRequest = {
1021 method: string;
1022 url: string;
1023 headers: Pick<Headers, "get">;
1024};
1025type ReadonlyContext = Pick<RouterContextProvider, "get">;
1026type InstrumentableRoute = {
1027 id: string;
1028 index: boolean | undefined;
1029 path: string | undefined;
1030 instrument(instrumentations: RouteInstrumentations): void;
1031};
1032type RouteInstrumentations = {
1033 lazy?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1034 "lazy.loader"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1035 "lazy.action"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1036 "lazy.middleware"?: InstrumentFunction<RouteLazyInstrumentationInfo>;
1037 middleware?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1038 loader?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1039 action?: InstrumentFunction<RouteHandlerInstrumentationInfo>;
1040};
1041type RouteLazyInstrumentationInfo = undefined;
1042type RouteHandlerInstrumentationInfo = Readonly<{
1043 request: ReadonlyRequest;
1044 params: LoaderFunctionArgs["params"];
1045 pattern: string;
1046 context: ReadonlyContext;
1047}>;
1048type InstrumentableRouter = {
1049 instrument(instrumentations: RouterInstrumentations): void;
1050};
1051type RouterInstrumentations = {
1052 navigate?: InstrumentFunction<RouterNavigationInstrumentationInfo>;
1053 fetch?: InstrumentFunction<RouterFetchInstrumentationInfo>;
1054};
1055type RouterNavigationInstrumentationInfo = Readonly<{
1056 to: string | number;
1057 currentUrl: string;
1058 formMethod?: HTMLFormMethod;
1059 formEncType?: FormEncType;
1060 formData?: FormData;
1061 body?: any;
1062}>;
1063type RouterFetchInstrumentationInfo = Readonly<{
1064 href: string;
1065 currentUrl: string;
1066 fetcherKey: string;
1067 formMethod?: HTMLFormMethod;
1068 formEncType?: FormEncType;
1069 formData?: FormData;
1070 body?: any;
1071}>;
1072type InstrumentableRequestHandler = {
1073 instrument(instrumentations: RequestHandlerInstrumentations): void;
1074};
1075type RequestHandlerInstrumentations = {
1076 request?: InstrumentFunction<RequestHandlerInstrumentationInfo>;
1077};
1078type RequestHandlerInstrumentationInfo = Readonly<{
1079 request: ReadonlyRequest;
1080 context: ReadonlyContext | undefined;
1081}>;
1082//#endregion
1083//#region lib/router/router.d.ts
1084/**
1085 * A Router instance manages all navigation and data loading/mutations
1086 */
1087interface Router$1 {
1088 /**
1089 * @private
1090 * PRIVATE - DO NOT USE
1091 *
1092 * Return the basename for the router
1093 */
1094 get basename(): RouterInit["basename"];
1095 /**
1096 * @private
1097 * PRIVATE - DO NOT USE
1098 *
1099 * Return the future config for the router
1100 */
1101 get future(): FutureConfig;
1102 /**
1103 * @private
1104 * PRIVATE - DO NOT USE
1105 *
1106 * Return the current state of the router
1107 */
1108 get state(): RouterState;
1109 /**
1110 * @private
1111 * PRIVATE - DO NOT USE
1112 *
1113 * Return the routes for this router instance
1114 */
1115 get routes(): DataRouteObject[];
1116 /**
1117 * @private
1118 * PRIVATE - DO NOT USE
1119 *
1120 * Return the route branches for this router instance
1121 */
1122 get branches(): RouteBranch<DataRouteObject>[] | undefined;
1123 /**
1124 * @private
1125 * PRIVATE - DO NOT USE
1126 *
1127 * Return the manifest for this router instance
1128 */
1129 get manifest(): RouteManifest;
1130 /**
1131 * @private
1132 * PRIVATE - DO NOT USE
1133 *
1134 * Return the window associated with the router
1135 */
1136 get window(): RouterInit["window"];
1137 /**
1138 * @private
1139 * PRIVATE - DO NOT USE
1140 *
1141 * Initialize the router, including adding history listeners and kicking off
1142 * initial data fetches. Returns a function to cleanup listeners and abort
1143 * any in-progress loads
1144 */
1145 initialize(): Router$1;
1146 /**
1147 * @private
1148 * PRIVATE - DO NOT USE
1149 *
1150 * Subscribe to router.state updates
1151 *
1152 * @param fn function to call with the new state
1153 */
1154 subscribe(fn: RouterSubscriber): () => void;
1155 /**
1156 * @private
1157 * PRIVATE - DO NOT USE
1158 *
1159 * Enable scroll restoration behavior in the router
1160 *
1161 * @param savedScrollPositions Object that will manage positions, in case
1162 * it's being restored from sessionStorage
1163 * @param getScrollPosition Function to get the active Y scroll position
1164 * @param getKey Function to get the key to use for restoration
1165 */
1166 enableScrollRestoration(savedScrollPositions: Record<string, number>, getScrollPosition: GetScrollPositionFunction, getKey?: GetScrollRestorationKeyFunction): () => void;
1167 /**
1168 * @private
1169 * PRIVATE - DO NOT USE
1170 *
1171 * Navigate forward/backward in the history stack
1172 * @param to Delta to move in the history stack
1173 */
1174 navigate(to: number): Promise<void>;
1175 /**
1176 * Navigate to the given path
1177 * @param to Path to navigate to
1178 * @param opts Navigation options (method, submission, etc.)
1179 */
1180 navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;
1181 /**
1182 * @private
1183 * PRIVATE - DO NOT USE
1184 *
1185 * Trigger a fetcher load/submission
1186 *
1187 * @param key Fetcher key
1188 * @param routeId Route that owns the fetcher
1189 * @param href href to fetch
1190 * @param opts Fetcher options, (method, submission, etc.)
1191 */
1192 fetch(key: string, routeId: string, href: string | null, opts?: RouterFetchOptions): Promise<void>;
1193 /**
1194 * @private
1195 * PRIVATE - DO NOT USE
1196 *
1197 * Trigger a revalidation of all current route loaders and fetcher loads
1198 */
1199 revalidate(): Promise<void>;
1200 /**
1201 * @private
1202 * PRIVATE - DO NOT USE
1203 *
1204 * Utility function to create an href for the given location
1205 * @param location
1206 */
1207 createHref(location: Location | URL): string;
1208 /**
1209 * @private
1210 * PRIVATE - DO NOT USE
1211 *
1212 * Utility function to URL encode a destination path according to the internal
1213 * history implementation
1214 * @param to
1215 */
1216 encodeLocation(to: To): Path;
1217 /**
1218 * @private
1219 * PRIVATE - DO NOT USE
1220 *
1221 * Get/create a fetcher for the given key
1222 * @param key
1223 */
1224 getFetcher<TData = any>(key: string): Fetcher<TData>;
1225 /**
1226 * @internal
1227 * PRIVATE - DO NOT USE
1228 *
1229 * Reset the fetcher for a given key
1230 * @param key
1231 */
1232 resetFetcher(key: string, opts?: {
1233 reason?: unknown;
1234 }): void;
1235 /**
1236 * @private
1237 * PRIVATE - DO NOT USE
1238 *
1239 * Delete the fetcher for a given key
1240 * @param key
1241 */
1242 deleteFetcher(key: string): void;
1243 /**
1244 * @private
1245 * PRIVATE - DO NOT USE
1246 *
1247 * Cleanup listeners and abort any in-progress loads
1248 */
1249 dispose(): void;
1250 /**
1251 * @private
1252 * PRIVATE - DO NOT USE
1253 *
1254 * Get a navigation blocker
1255 * @param key The identifier for the blocker
1256 * @param fn The blocker function implementation
1257 */
1258 getBlocker(key: string, fn: BlockerFunction): Blocker;
1259 /**
1260 * @private
1261 * PRIVATE - DO NOT USE
1262 *
1263 * Delete a navigation blocker
1264 * @param key The identifier for the blocker
1265 */
1266 deleteBlocker(key: string): void;
1267 /**
1268 * @private
1269 * PRIVATE DO NOT USE
1270 *
1271 * Patch additional children routes into an existing parent route
1272 * @param routeId The parent route id or a callback function accepting `patch`
1273 * to perform batch patching
1274 * @param children The additional children routes
1275 * @param unstable_allowElementMutations Allow mutation or route elements on
1276 * existing routes. Intended for RSC-usage
1277 * only.
1278 */
1279 patchRoutes(routeId: string | null, children: RouteObject[], unstable_allowElementMutations?: boolean): void;
1280 /**
1281 * @private
1282 * PRIVATE - DO NOT USE
1283 *
1284 * HMR needs to pass in-flight route updates to React Router
1285 * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)
1286 */
1287 _internalSetRoutes(routes: RouteObject[]): void;
1288 /**
1289 * @private
1290 * PRIVATE - DO NOT USE
1291 *
1292 * Cause subscribers to re-render. This is used to force a re-render.
1293 */
1294 _internalSetStateDoNotUseOrYouWillBreakYourApp(state: Partial<RouterState>): void;
1295 /**
1296 * @private
1297 * PRIVATE - DO NOT USE
1298 *
1299 * Internal fetch AbortControllers accessed by unit tests
1300 */
1301 _internalFetchControllers: Map<string, AbortController>;
1302}
1303/**
1304 * State maintained internally by the router. During a navigation, all states
1305 * reflect the "old" location unless otherwise noted.
1306 */
1307interface RouterState {
1308 /**
1309 * The action of the most recent navigation
1310 */
1311 historyAction: Action;
1312 /**
1313 * The current location reflected by the router
1314 */
1315 location: Location;
1316 /**
1317 * The current set of route matches
1318 */
1319 matches: DataRouteMatch[];
1320 /**
1321 * Tracks whether we've completed our initial data load
1322 */
1323 initialized: boolean;
1324 /**
1325 * Tracks whether we should be rendering a HydrateFallback during hydration
1326 */
1327 renderFallback: boolean;
1328 /**
1329 * Current scroll position we should start at for a new view
1330 * - number -> scroll position to restore to
1331 * - false -> do not restore scroll at all (used during submissions/revalidations)
1332 * - null -> don't have a saved position, scroll to hash or top of page
1333 */
1334 restoreScrollPosition: number | false | null;
1335 /**
1336 * Indicate whether this navigation should skip resetting the scroll position
1337 * if we are unable to restore the scroll position
1338 */
1339 preventScrollReset: boolean;
1340 /**
1341 * Tracks the state of the current navigation
1342 */
1343 navigation: Navigation;
1344 /**
1345 * Tracks any in-progress revalidations
1346 */
1347 revalidation: RevalidationState;
1348 /**
1349 * Data from the loaders for the current matches
1350 */
1351 loaderData: RouteData;
1352 /**
1353 * Data from the action for the current matches
1354 */
1355 actionData: RouteData | null;
1356 /**
1357 * Errors caught from loaders for the current matches
1358 */
1359 errors: RouteData | null;
1360 /**
1361 * Map of current fetchers
1362 */
1363 fetchers: Map<string, Fetcher>;
1364 /**
1365 * Map of current blockers
1366 */
1367 blockers: Map<string, Blocker>;
1368}
1369/**
1370 * Data that can be passed into hydrate a Router from SSR
1371 */
1372type HydrationState = Partial<Pick<RouterState, "loaderData" | "actionData" | "errors">>;
1373/**
1374 * Future flags to toggle new feature behavior
1375 */
1376interface FutureConfig {}
1377/**
1378 * Initialization options for createRouter
1379 */
1380interface RouterInit {
1381 routes: RouteObject[];
1382 history: History;
1383 basename?: string;
1384 getContext?: () => MaybePromise<RouterContextProvider>;
1385 instrumentations?: ClientInstrumentation[];
1386 mapRouteProperties?: MapRoutePropertiesFunction;
1387 future?: Partial<FutureConfig>;
1388 hydrationRouteProperties?: string[];
1389 hydrationData?: HydrationState;
1390 window?: Window;
1391 dataStrategy?: DataStrategyFunction;
1392 patchRoutesOnNavigation?: PatchRoutesOnNavigationFunction;
1393}
1394/**
1395 * State returned from a server-side query() call
1396 */
1397interface StaticHandlerContext {
1398 basename: Router$1["basename"];
1399 location: RouterState["location"];
1400 matches: RouterState["matches"];
1401 loaderData: RouterState["loaderData"];
1402 actionData: RouterState["actionData"];
1403 errors: RouterState["errors"];
1404 statusCode: number;
1405 loaderHeaders: Record<string, Headers>;
1406 actionHeaders: Record<string, Headers>;
1407 _deepestRenderedBoundaryId?: string | null;
1408}
1409/**
1410 * A StaticHandler instance manages a singular SSR navigation/fetch event
1411 */
1412interface StaticHandler {
1413 /**
1414 * The set of data routes managed by this handler
1415 */
1416 dataRoutes: DataRouteObject[];
1417 /**
1418 * @private
1419 * PRIVATE - DO NOT USE
1420 *
1421 * The route branches derived from the data routes, used for internal route
1422 * matching in Framework Mode
1423 */
1424 _internalRouteBranches: RouteBranch<DataRouteObject>[];
1425 /**
1426 * Perform a query for a given request - executing all matched route
1427 * loaders/actions. Used for document requests.
1428 *
1429 * @param request The request to query
1430 * @param opts Optional query options
1431 * @param opts.dataStrategy Alternate dataStrategy implementation
1432 * @param opts.filterMatchesToLoad Predicate function to filter which matches should be loaded
1433 * @param opts.generateMiddlewareResponse To enable middleware, provide a function
1434 * to generate a response to bubble back up the middleware chain
1435 * @param opts.requestContext Context object to pass to loaders/actions
1436 * @param opts.skipLoaderErrorBubbling Skip loader error bubbling
1437 * @param opts.skipRevalidation Skip revalidation after action submission
1438 * @param opts.normalizePath Normalize the request path
1439 */
1440 query(request: Request, opts?: {
1441 requestContext?: unknown;
1442 filterMatchesToLoad?: (match: DataRouteMatch) => boolean;
1443 skipLoaderErrorBubbling?: boolean;
1444 skipRevalidation?: boolean;
1445 dataStrategy?: DataStrategyFunction<unknown>;
1446 generateMiddlewareResponse?: (query: (r: Request, args?: {
1447 filterMatchesToLoad?: (match: DataRouteMatch) => boolean;
1448 }) => Promise<StaticHandlerContext | Response>) => MaybePromise<Response>;
1449 normalizePath?: (request: Request) => Path;
1450 }): Promise<StaticHandlerContext | Response>;
1451 /**
1452 * Perform a query for a specific route. Used for resource requests.
1453 *
1454 * @param request The request to query
1455 * @param opts Optional queryRoute options
1456 * @param opts.dataStrategy Alternate dataStrategy implementation
1457 * @param opts.generateMiddlewareResponse To enable middleware, provide a function
1458 * to generate a response to bubble back up the middleware chain
1459 * @param opts.requestContext Context object to pass to loaders/actions
1460 * @param opts.routeId The ID of the route to query
1461 * @param opts.normalizePath Normalize the request path
1462 */
1463 queryRoute(request: Request, opts?: {
1464 routeId?: string;
1465 requestContext?: unknown;
1466 dataStrategy?: DataStrategyFunction<unknown>;
1467 generateMiddlewareResponse?: (queryRoute: (r: Request) => Promise<Response>) => MaybePromise<Response>;
1468 normalizePath?: (request: Request) => Path;
1469 }): Promise<any>;
1470}
1471type ViewTransitionOpts = {
1472 currentLocation: Location;
1473 nextLocation: Location;
1474};
1475/**
1476 * Subscriber function signature for changes to router state
1477 */
1478interface RouterSubscriber {
1479 (state: RouterState, opts: {
1480 deletedFetchers: string[];
1481 newErrors: RouteData | null;
1482 viewTransitionOpts?: ViewTransitionOpts;
1483 flushSync: boolean;
1484 }): void;
1485}
1486/**
1487 * Function signature for determining the key to be used in scroll restoration
1488 * for a given location
1489 */
1490interface GetScrollRestorationKeyFunction {
1491 (location: Location, matches: UIMatch[]): string | null;
1492}
1493/**
1494 * Function signature for determining the current scroll position
1495 */
1496interface GetScrollPositionFunction {
1497 (): number;
1498}
1499/**
1500 * - "route": relative to the route hierarchy so `..` means remove all segments
1501 * of the current route even if it has many. For example, a `route("posts/:id")`
1502 * would have both `:id` and `posts` removed from the url.
1503 * - "path": relative to the pathname so `..` means remove one segment of the
1504 * pathname. For example, a `route("posts/:id")` would have only `:id` removed
1505 * from the url.
1506 */
1507type RelativeRoutingType = "route" | "path";
1508type BaseNavigateOrFetchOptions = {
1509 preventScrollReset?: boolean;
1510 relative?: RelativeRoutingType;
1511 flushSync?: boolean;
1512 defaultShouldRevalidate?: boolean;
1513};
1514type BaseNavigateOptions = BaseNavigateOrFetchOptions & {
1515 replace?: boolean;
1516 state?: any;
1517 fromRouteId?: string;
1518 viewTransition?: boolean;
1519 mask?: To;
1520};
1521type BaseSubmissionOptions = {
1522 formMethod?: HTMLFormMethod;
1523 formEncType?: FormEncType;
1524} & ({
1525 formData: FormData;
1526 body?: undefined;
1527} | {
1528 formData?: undefined;
1529 body: any;
1530});
1531/**
1532 * Options for a navigate() call for a normal (non-submission) navigation
1533 */
1534type LinkNavigateOptions = BaseNavigateOptions;
1535/**
1536 * Options for a navigate() call for a submission navigation
1537 */
1538type SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;
1539/**
1540 * Options to pass to navigate() for a navigation
1541 */
1542type RouterNavigateOptions = LinkNavigateOptions | SubmissionNavigateOptions;
1543/**
1544 * Options for a fetch() load
1545 */
1546type LoadFetchOptions = BaseNavigateOrFetchOptions;
1547/**
1548 * Options for a fetch() submission
1549 */
1550type SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;
1551/**
1552 * Options to pass to fetch()
1553 */
1554type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;
1555/**
1556 * Potential states for state.navigation
1557 */
1558type NavigationStates = {
1559 Idle: {
1560 state: "idle";
1561 location: undefined;
1562 matches: undefined;
1563 historyAction: undefined;
1564 formMethod: undefined;
1565 formAction: undefined;
1566 formEncType: undefined;
1567 formData: undefined;
1568 json: undefined;
1569 text: undefined;
1570 };
1571 Loading: {
1572 state: "loading";
1573 location: Location;
1574 matches: DataRouteMatch[];
1575 historyAction: Action;
1576 formMethod: Submission["formMethod"] | undefined;
1577 formAction: Submission["formAction"] | undefined;
1578 formEncType: Submission["formEncType"] | undefined;
1579 formData: Submission["formData"] | undefined;
1580 json: Submission["json"] | undefined;
1581 text: Submission["text"] | undefined;
1582 };
1583 Submitting: {
1584 state: "submitting";
1585 location: Location;
1586 matches: DataRouteMatch[];
1587 historyAction: Action;
1588 formMethod: Submission["formMethod"];
1589 formAction: Submission["formAction"];
1590 formEncType: Submission["formEncType"];
1591 formData: Submission["formData"];
1592 json: Submission["json"];
1593 text: Submission["text"];
1594 };
1595};
1596type Navigation = NavigationStates[keyof NavigationStates];
1597type RevalidationState = "idle" | "loading";
1598/**
1599 * Potential states for fetchers
1600 */
1601type FetcherStates<TData = any> = {
1602 /**
1603 * The fetcher is not calling a loader or action
1604 *
1605 * ```tsx
1606 * fetcher.state === "idle"
1607 * ```
1608 */
1609 Idle: {
1610 state: "idle";
1611 formMethod: undefined;
1612 formAction: undefined;
1613 formEncType: undefined;
1614 text: undefined;
1615 formData: undefined;
1616 json: undefined;
1617 /**
1618 * If the fetcher has never been called, this will be undefined.
1619 */
1620 data: TData | undefined;
1621 };
1622 /**
1623 * The fetcher is loading data from a {@link LoaderFunction | loader} from a
1624 * call to {@link FetcherWithComponents.load | `fetcher.load`}.
1625 *
1626 * ```tsx
1627 * // somewhere
1628 * <button onClick={() => fetcher.load("/some/route") }>Load</button>
1629 *
1630 * // the state will update
1631 * fetcher.state === "loading"
1632 * ```
1633 */
1634 Loading: {
1635 state: "loading";
1636 formMethod: Submission["formMethod"] | undefined;
1637 formAction: Submission["formAction"] | undefined;
1638 formEncType: Submission["formEncType"] | undefined;
1639 text: Submission["text"] | undefined;
1640 formData: Submission["formData"] | undefined;
1641 json: Submission["json"] | undefined;
1642 data: TData | undefined;
1643 };
1644 /**
1645 The fetcher is submitting to a {@link LoaderFunction} (GET) or {@link ActionFunction} (POST) from a {@link FetcherWithComponents.Form | `fetcher.Form`} or {@link FetcherWithComponents.submit | `fetcher.submit`}.
1646 ```tsx
1647 // somewhere
1648 <input
1649 onChange={e => {
1650 fetcher.submit(event.currentTarget.form, { method: "post" });
1651 }}
1652 />
1653 // the state will update
1654 fetcher.state === "submitting"
1655 // and formData will be available
1656 fetcher.formData
1657 ```
1658 */
1659 Submitting: {
1660 state: "submitting";
1661 formMethod: Submission["formMethod"];
1662 formAction: Submission["formAction"];
1663 formEncType: Submission["formEncType"];
1664 text: Submission["text"];
1665 formData: Submission["formData"];
1666 json: Submission["json"];
1667 data: TData | undefined;
1668 };
1669};
1670type Fetcher<TData = any> = FetcherStates<TData>[keyof FetcherStates<TData>];
1671interface BlockerBlocked {
1672 state: "blocked";
1673 reset: () => void;
1674 proceed: () => void;
1675 location: Location;
1676}
1677interface BlockerUnblocked {
1678 state: "unblocked";
1679 reset: undefined;
1680 proceed: undefined;
1681 location: undefined;
1682}
1683interface BlockerProceeding {
1684 state: "proceeding";
1685 reset: undefined;
1686 proceed: undefined;
1687 location: Location;
1688}
1689type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;
1690type BlockerFunction = (args: {
1691 currentLocation: Location;
1692 nextLocation: Location;
1693 historyAction: Action;
1694}) => boolean;
1695interface CreateStaticHandlerOptions {
1696 basename?: string;
1697 mapRouteProperties?: MapRoutePropertiesFunction;
1698 instrumentations?: Pick<ServerInstrumentation, "route">[];
1699 future?: Partial<FutureConfig>;
1700}
1701/**
1702 * Create a static handler to perform server-side data loading
1703 *
1704 * @example
1705 * export async function handleRequest(request: Request) {
1706 * let { query, dataRoutes } = createStaticHandler(routes);
1707 * let context = await query(request);
1708 *
1709 * if (context instanceof Response) {
1710 * return context;
1711 * }
1712 *
1713 * let router = createStaticRouter(dataRoutes, context);
1714 * return new Response(
1715 * ReactDOMServer.renderToString(<StaticRouterProvider ... />),
1716 * { headers: { "Content-Type": "text/html" } }
1717 * );
1718 * }
1719 *
1720 * @public
1721 * @category Data Routers
1722 * @mode data
1723 * @param routes The {@link RouteObject | route objects} to create a static
1724 * handler for
1725 * @param opts Options
1726 * @param opts.basename The base URL for the static handler (default: `/`)
1727 * @param opts.future Future flags for the static handler
1728 * @returns A static handler that can be used to query data for the provided
1729 * routes
1730 */
1731declare function createStaticHandler(routes: RouteObject[], opts?: CreateStaticHandlerOptions): StaticHandler;
1732//#endregion
1733//#region lib/router/links.d.ts
1734type Primitive = null | undefined | string | number | boolean | symbol | bigint;
1735type LiteralUnion<LiteralType, BaseType extends Primitive> = LiteralType | (BaseType & Record<never, never>);
1736interface HtmlLinkProps {
1737 /**
1738 * Address of the hyperlink
1739 */
1740 href?: string;
1741 /**
1742 * How the element handles crossorigin requests
1743 */
1744 crossOrigin?: "anonymous" | "use-credentials";
1745 /**
1746 * Relationship between the document containing the hyperlink and the destination resource
1747 */
1748 rel: LiteralUnion<"alternate" | "dns-prefetch" | "icon" | "manifest" | "modulepreload" | "next" | "pingback" | "preconnect" | "prefetch" | "preload" | "prerender" | "search" | "stylesheet", string>;
1749 /**
1750 * Applicable media: "screen", "print", "(max-width: 764px)"
1751 */
1752 media?: string;
1753 /**
1754 * Integrity metadata used in Subresource Integrity checks
1755 */
1756 integrity?: string;
1757 /**
1758 * Language of the linked resource
1759 */
1760 hrefLang?: string;
1761 /**
1762 * Hint for the type of the referenced resource
1763 */
1764 type?: string;
1765 /**
1766 * Referrer policy for fetches initiated by the element
1767 */
1768 referrerPolicy?: "" | "no-referrer" | "no-referrer-when-downgrade" | "same-origin" | "origin" | "strict-origin" | "origin-when-cross-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
1769 /**
1770 * Sizes of the icons (for rel="icon")
1771 */
1772 sizes?: string;
1773 /**
1774 * Potential destination for a preload request (for rel="preload" and rel="modulepreload")
1775 */
1776 as?: LiteralUnion<"audio" | "audioworklet" | "document" | "embed" | "fetch" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "serviceworker" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt", string>;
1777 /**
1778 * Color to use when customizing a site's icon (for rel="mask-icon")
1779 */
1780 color?: string;
1781 /**
1782 * Whether the link is disabled
1783 */
1784 disabled?: boolean;
1785 /**
1786 * The title attribute has special semantics on this element: Title of the link; CSS style sheet set name.
1787 */
1788 title?: string;
1789 /**
1790 * Images to use in different situations, e.g., high-resolution displays,
1791 * small monitors, etc. (for rel="preload")
1792 */
1793 imageSrcSet?: string;
1794 /**
1795 * Image sizes for different page layouts (for rel="preload")
1796 */
1797 imageSizes?: string;
1798}
1799interface HtmlLinkPreloadImage extends HtmlLinkProps {
1800 /**
1801 * Relationship between the document containing the hyperlink and the destination resource
1802 */
1803 rel: "preload";
1804 /**
1805 * Potential destination for a preload request (for rel="preload" and rel="modulepreload")
1806 */
1807 as: "image";
1808 /**
1809 * Address of the hyperlink
1810 */
1811 href?: string;
1812 /**
1813 * Images to use in different situations, e.g., high-resolution displays,
1814 * small monitors, etc. (for rel="preload")
1815 */
1816 imageSrcSet: string;
1817 /**
1818 * Image sizes for different page layouts (for rel="preload")
1819 */
1820 imageSizes?: string;
1821}
1822/**
1823 * Represents a `<link>` element.
1824 *
1825 * WHATWG Specification: https://html.spec.whatwg.org/multipage/semantics.html#the-link-element
1826 */
1827type HtmlLinkDescriptor = (HtmlLinkProps & Pick<Required<HtmlLinkProps>, "href">) | (HtmlLinkPreloadImage & Pick<Required<HtmlLinkPreloadImage>, "imageSizes">) | (HtmlLinkPreloadImage & Pick<Required<HtmlLinkPreloadImage>, "href"> & {
1828 imageSizes?: never;
1829});
1830interface PageLinkDescriptor extends Omit<HtmlLinkDescriptor, "href" | "rel" | "type" | "sizes" | "imageSrcSet" | "imageSizes" | "as" | "color" | "title"> {
1831 /**
1832 * A [`nonce`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/nonce)
1833 * attribute to render on the [`<link>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link)
1834 * element. If not provided in Framework Mode, it will default to any
1835 * {@link ServerRouter | `<ServerRouter nonce>`} prop.
1836 */
1837 nonce?: string | undefined;
1838 /**
1839 * The absolute path of the page to prefetch, e.g. `/absolute/path`.
1840 */
1841 page: string;
1842}
1843type LinkDescriptor = HtmlLinkDescriptor | PageLinkDescriptor;
1844//#endregion
1845//#region lib/server-runtime/single-fetch.d.ts
1846type Serializable = undefined | null | boolean | string | symbol | number | Array<Serializable> | {
1847 [key: PropertyKey]: Serializable;
1848} | bigint | Date | URL | RegExp | Error | Map<Serializable, Serializable> | Set<Serializable> | Promise<Serializable>;
1849//#endregion
1850//#region lib/types/utils.d.ts
1851type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
1852type IsAny<T> = 0 extends 1 & T ? true : false;
1853type Func = (...args: any[]) => unknown;
1854//#endregion
1855//#region lib/types/serializes-to.d.ts
1856/**
1857 * A brand that can be applied to a type to indicate that it will serialize
1858 * to a specific type when transported to the client from a loader.
1859 * Only use this if you have additional serialization/deserialization logic
1860 * in your application.
1861 */
1862type unstable_SerializesTo<T> = {
1863 unstable__ReactRouter_SerializesTo: [T];
1864};
1865//#endregion
1866//#region lib/types/route-data.d.ts
1867type Serialize<T> = T extends unstable_SerializesTo<infer To> ? To : T extends Serializable ? T : T extends ((...args: any[]) => unknown) ? undefined : T extends Promise<infer U> ? Promise<Serialize<U>> : T extends Map<infer K, infer V> ? Map<Serialize<K>, Serialize<V>> : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<Serialize<K>, Serialize<V>> : T extends Set<infer U> ? Set<Serialize<U>> : T extends ReadonlySet<infer U> ? ReadonlySet<Serialize<U>> : T extends [] ? [] : T extends readonly [infer F, ...infer R] ? [Serialize<F>, ...Serialize<R>] : T extends Array<infer U> ? Array<Serialize<U>> : T extends readonly unknown[] ? readonly Serialize<T[number]>[] : T extends Record<any, any> ? { [K in keyof T]: Serialize<T[K]> } : undefined;
1868type VoidToUndefined<T> = Equal<T, void> extends true ? undefined : T;
1869type DataFrom<T> = IsAny<T> extends true ? undefined : T extends Func ? VoidToUndefined<Awaited<ReturnType<T>>> : undefined;
1870type ClientData<T> = T extends Response ? never : T extends DataWithResponseInit<infer U> ? U : T;
1871type ServerData<T> = T extends Response ? never : T extends DataWithResponseInit<infer U> ? Serialize<U> : Serialize<T>;
1872type ServerDataFrom<T> = ServerData<DataFrom<T>>;
1873type ClientDataFrom<T> = ClientData<DataFrom<T>>;
1874type ClientDataFunctionArgs<Params> = {
1875 /**
1876 * A {@link https://developer.mozilla.org/en-US/docs/Web/API/Request Fetch Request instance} which you can use to read the URL, the method, the "content-type" header, and the request body from the request.
1877 *
1878 * @note Because client data functions are called before a network request is made, the Request object does not include the headers which the browser automatically adds. React Router infers the "content-type" header from the enc-type of the form that performed the submission.
1879 **/
1880 request: Request;
1881 /**
1882 * A URL instance representing the application location being navigated to or
1883 * fetched.
1884 *
1885 * In Framework mode, this is a normalized URL with React-Router-specific
1886 * implementation details removed (`.data` suffixes, `index`/`_routes` search
1887 * params). For the raw incoming URL, use `request.url`.
1888 */
1889 url: URL;
1890 /**
1891 * {@link https://reactrouter.com/start/framework/routing#dynamic-segments Dynamic route params} for the current route.
1892 * @example
1893 * // app/routes.ts
1894 * route("teams/:teamId", "./team.tsx"),
1895 *
1896 * // app/team.tsx
1897 * export function clientLoader({
1898 * params,
1899 * }: Route.ClientLoaderArgs) {
1900 * params.teamId;
1901 * // ^ string
1902 * }
1903 **/
1904 params: Params;
1905 /**
1906 * Matched un-interpolated route pattern for the current path (i.e., /blog/:slug).
1907 * Mostly useful as a identifier to aggregate on for logging/tracing/etc.
1908 */
1909 pattern: string;
1910 /**
1911 * An instance of `RouterContextProvider` that can be used to access context
1912 * values from your route middlewares. You may pass in initial context values
1913 * in your `<HydratedRouter getContext>` prop.
1914 */
1915 context: Readonly<RouterContextProvider>;
1916};
1917type SerializeFrom<T> = T extends ((...args: infer Args) => unknown) ? Args extends [ClientLoaderFunctionArgs | ClientActionFunctionArgs | ClientDataFunctionArgs<unknown>] ? ClientDataFrom<T> : ServerDataFrom<T> : T;
1918//#endregion
1919//#region lib/dom/ssr/routeModules.d.ts
1920/**
1921 * A function that handles data mutations for a route on the client
1922 */
1923type ClientActionFunction = (args: ClientActionFunctionArgs) => ReturnType<ActionFunction>;
1924/**
1925 * Arguments passed to a route `clientAction` function
1926 */
1927type ClientActionFunctionArgs = ActionFunctionArgs & {
1928 serverAction: <T = unknown>() => Promise<SerializeFrom<T>>;
1929};
1930/**
1931 * A function that loads data for a route on the client
1932 */
1933type ClientLoaderFunction = ((args: ClientLoaderFunctionArgs) => ReturnType<LoaderFunction>) & {
1934 hydrate?: boolean;
1935};
1936/**
1937 * Arguments passed to a route `clientLoader` function
1938 */
1939type ClientLoaderFunctionArgs = LoaderFunctionArgs & {
1940 serverLoader: <T = unknown>() => Promise<SerializeFrom<T>>;
1941};
1942type HeadersArgs = {
1943 loaderHeaders: Headers;
1944 parentHeaders: Headers;
1945 actionHeaders: Headers;
1946 errorHeaders: Headers | undefined;
1947};
1948/**
1949 * A function that returns HTTP headers to be used for a route. These headers
1950 * will be merged with (and take precedence over) headers from parent routes.
1951 */
1952interface HeadersFunction {
1953 (args: HeadersArgs): Headers | HeadersInit;
1954}
1955/**
1956 * A function that defines `<link>` tags to be inserted into the `<head>` of
1957 * the document on route transitions.
1958 *
1959 * @see https://reactrouter.com/start/framework/route-module#meta
1960 */
1961interface LinksFunction {
1962 (): LinkDescriptor[];
1963}
1964interface MetaMatch<RouteId extends string = string, Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown> {
1965 id: RouteId;
1966 pathname: DataRouteMatch["pathname"];
1967 loaderData: Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown;
1968 handle?: RouteHandle;
1969 params: DataRouteMatch["params"];
1970 meta: MetaDescriptor[];
1971 error?: unknown;
1972}
1973type MetaMatches<MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> = Array<{ [K in keyof MatchLoaders]: MetaMatch<Exclude<K, number | symbol>, MatchLoaders[K]> }[keyof MatchLoaders]>;
1974interface MetaArgs<Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown, MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> {
1975 loaderData: (Loader extends LoaderFunction | ClientLoaderFunction ? SerializeFrom<Loader> : unknown) | undefined;
1976 params: Params;
1977 location: Location;
1978 matches: MetaMatches<MatchLoaders>;
1979 error?: unknown;
1980}
1981/**
1982 * A function that returns an array of data objects to use for rendering
1983 * metadata HTML tags in a route. These tags are not rendered on descendant
1984 * routes in the route hierarchy. In other words, they will only be rendered on
1985 * the route in which they are exported.
1986 *
1987 * @param Loader - The type of the current route's loader function
1988 * @param MatchLoaders - Mapping from a parent route's filepath to its loader
1989 * function type
1990 *
1991 * Note that parent route filepaths are relative to the `app/` directory.
1992 *
1993 * For example, if this meta function is for `/sales/customers/$customerId`:
1994 *
1995 * ```ts
1996 * // app/root.tsx
1997 * const loader = () => ({ hello: "world" })
1998 * export type Loader = typeof loader
1999 *
2000 * // app/routes/sales.tsx
2001 * const loader = () => ({ salesCount: 1074 })
2002 * export type Loader = typeof loader
2003 *
2004 * // app/routes/sales/customers.tsx
2005 * const loader = () => ({ customerCount: 74 })
2006 * export type Loader = typeof loader
2007 *
2008 * // app/routes/sales/customers/$customersId.tsx
2009 * import type { Loader as RootLoader } from "../../../root"
2010 * import type { Loader as SalesLoader } from "../../sales"
2011 * import type { Loader as CustomersLoader } from "../../sales/customers"
2012 *
2013 * const loader = () => ({ name: "Customer name" })
2014 *
2015 * const meta: MetaFunction<typeof loader, {
2016 * "root": RootLoader,
2017 * "routes/sales": SalesLoader,
2018 * "routes/sales/customers": CustomersLoader,
2019 * }> = ({ loaderData, matches }) => {
2020 * const { name } = loaderData
2021 * // ^? string
2022 * const { customerCount } = matches.find((match) => match.id === "routes/sales/customers").loaderData
2023 * // ^? number
2024 * const { salesCount } = matches.find((match) => match.id === "routes/sales").loaderData
2025 * // ^? number
2026 * const { hello } = matches.find((match) => match.id === "root").loaderData
2027 * // ^? "world"
2028 * }
2029 * ```
2030 */
2031interface MetaFunction<Loader extends LoaderFunction | ClientLoaderFunction | unknown = unknown, MatchLoaders extends Record<string, LoaderFunction | ClientLoaderFunction | unknown> = Record<string, unknown>> {
2032 (args: MetaArgs<Loader, MatchLoaders>): MetaDescriptor[] | undefined;
2033}
2034type MetaDescriptor = {
2035 charSet: "utf-8";
2036} | {
2037 title: string;
2038} | {
2039 name: string;
2040 content: string;
2041} | {
2042 property: string;
2043 content: string;
2044} | {
2045 httpEquiv: string;
2046 content: string;
2047} | {
2048 "script:ld+json": LdJsonObject | LdJsonObject[];
2049} | {
2050 tagName: "meta" | "link";
2051 [name: string]: string;
2052} | {
2053 [name: string]: unknown;
2054};
2055type LdJsonObject = { [Key in string]: LdJsonValue } & { [Key in string]?: LdJsonValue | undefined };
2056type LdJsonArray = LdJsonValue[] | readonly LdJsonValue[];
2057type LdJsonPrimitive = string | number | boolean | null;
2058type LdJsonValue = LdJsonPrimitive | LdJsonObject | LdJsonArray;
2059/**
2060 * A React component that is rendered for a route.
2061 */
2062/**
2063 * An arbitrary object that is associated with a route.
2064 *
2065 * @see https://reactrouter.com/how-to/using-handle
2066 */
2067type RouteHandle = unknown;
2068//#endregion
2069//#region lib/components.d.ts
2070interface AwaitResolveRenderFunction<Resolve = any> {
2071 (data: Awaited<Resolve>): React.ReactNode;
2072}
2073/**
2074 * @category Types
2075 */
2076interface AwaitProps<Resolve> {
2077 /**
2078 * When using a function, the resolved value is provided as the parameter.
2079 *
2080 * ```tsx [2]
2081 * <Await resolve={reviewsPromise}>
2082 * {(resolvedReviews) => <Reviews items={resolvedReviews} />}
2083 * </Await>
2084 * ```
2085 *
2086 * When using React elements, {@link useAsyncValue} will provide the
2087 * resolved value:
2088 *
2089 * ```tsx [2]
2090 * <Await resolve={reviewsPromise}>
2091 * <Reviews />
2092 * </Await>
2093 *
2094 * function Reviews() {
2095 * const resolvedReviews = useAsyncValue();
2096 * return <div>...</div>;
2097 * }
2098 * ```
2099 */
2100 children: React.ReactNode | AwaitResolveRenderFunction<Resolve>;
2101 /**
2102 * The error element renders instead of the `children` when the [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
2103 * rejects.
2104 *
2105 * ```tsx
2106 * <Await
2107 * errorElement={<div>Oops</div>}
2108 * resolve={reviewsPromise}
2109 * >
2110 * <Reviews />
2111 * </Await>
2112 * ```
2113 *
2114 * To provide a more contextual error, you can use the {@link useAsyncError} in a
2115 * child component
2116 *
2117 * ```tsx
2118 * <Await
2119 * errorElement={<ReviewsError />}
2120 * resolve={reviewsPromise}
2121 * >
2122 * <Reviews />
2123 * </Await>
2124 *
2125 * function ReviewsError() {
2126 * const error = useAsyncError();
2127 * return <div>Error loading reviews: {error.message}</div>;
2128 * }
2129 * ```
2130 *
2131 * If you do not provide an `errorElement`, the rejected value will bubble up
2132 * to the nearest route-level [`ErrorBoundary`](../../start/framework/route-module#errorboundary)
2133 * and be accessible via the {@link useRouteError} hook.
2134 */
2135 errorElement?: React.ReactNode;
2136 /**
2137 * Takes a [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
2138 * returned from a [`loader`](../../start/framework/route-module#loader) to be
2139 * resolved and rendered.
2140 *
2141 * ```tsx
2142 * import { Await, useLoaderData } from "react-router";
2143 *
2144 * export async function loader() {
2145 * let reviews = getReviews(); // not awaited
2146 * let book = await getBook();
2147 * return {
2148 * book,
2149 * reviews, // this is a promise
2150 * };
2151 * }
2152 *
2153 * export default function Book() {
2154 * const {
2155 * book,
2156 * reviews, // this is the same promise
2157 * } = useLoaderData();
2158 *
2159 * return (
2160 * <div>
2161 * <h1>{book.title}</h1>
2162 * <p>{book.description}</p>
2163 * <React.Suspense fallback={<ReviewsSkeleton />}>
2164 * <Await
2165 * // and is the promise we pass to Await
2166 * resolve={reviews}
2167 * >
2168 * <Reviews />
2169 * </Await>
2170 * </React.Suspense>
2171 * </div>
2172 * );
2173 * }
2174 * ```
2175 */
2176 resolve: Resolve;
2177}
2178/**
2179 * Used to render promise values with automatic error handling.
2180 *
2181 * **Note:** `<Await>` expects to be rendered inside a [`<React.Suspense>`](https://react.dev/reference/react/Suspense)
2182 *
2183 * @example
2184 * import { Await, useLoaderData } from "react-router";
2185 *
2186 * export async function loader() {
2187 * // not awaited
2188 * const reviews = getReviews();
2189 * // awaited (blocks the transition)
2190 * const book = await fetch("/api/book").then((res) => res.json());
2191 * return { book, reviews };
2192 * }
2193 *
2194 * function Book() {
2195 * const { book, reviews } = useLoaderData();
2196 * return (
2197 * <div>
2198 * <h1>{book.title}</h1>
2199 * <p>{book.description}</p>
2200 * <React.Suspense fallback={<ReviewsSkeleton />}>
2201 * <Await
2202 * resolve={reviews}
2203 * errorElement={
2204 * <div>Could not load reviews 😬</div>
2205 * }
2206 * children={(resolvedReviews) => (
2207 * <Reviews items={resolvedReviews} />
2208 * )}
2209 * />
2210 * </React.Suspense>
2211 * </div>
2212 * );
2213 * }
2214 *
2215 * @public
2216 * @category Components
2217 * @mode framework
2218 * @mode data
2219 * @param props Props
2220 * @param {AwaitProps.children} props.children n/a
2221 * @param {AwaitProps.errorElement} props.errorElement n/a
2222 * @param {AwaitProps.resolve} props.resolve n/a
2223 * @returns React element for the rendered awaited value
2224 */
2225declare function Await$1<Resolve>({
2226 children,
2227 errorElement,
2228 resolve
2229}: AwaitProps<Resolve>): React.JSX.Element;
2230//#endregion
2231//#region lib/rsc/server.rsc.d.ts
2232declare function getRequest(): Request;
2233declare const redirect: typeof redirect$1;
2234declare const redirectDocument: typeof redirectDocument$1;
2235declare const replace$1: typeof replace$2;
2236declare const Await: typeof Await$1;
2237type RSCRouteConfigEntryBase = {
2238 action?: ActionFunction;
2239 clientAction?: ClientActionFunction;
2240 clientLoader?: ClientLoaderFunction;
2241 ErrorBoundary?: React.ComponentType<any>;
2242 handle?: any;
2243 headers?: HeadersFunction;
2244 HydrateFallback?: React.ComponentType<any>;
2245 Layout?: React.ComponentType<any>;
2246 links?: LinksFunction;
2247 loader?: LoaderFunction;
2248 meta?: MetaFunction;
2249 shouldRevalidate?: ShouldRevalidateFunction;
2250};
2251type RSCRouteConfigEntry = RSCRouteConfigEntryBase & {
2252 id: string;
2253 path?: string;
2254 Component?: React.ComponentType<any>;
2255 lazy?: () => Promise<RSCRouteConfigEntryBase & ({
2256 default?: React.ComponentType<any>;
2257 Component?: never;
2258 } | {
2259 default?: never;
2260 Component?: React.ComponentType<any>;
2261 })>;
2262} & ({
2263 index: true;
2264} | {
2265 children?: RSCRouteConfigEntry[];
2266});
2267type RSCRouteConfig = Array<RSCRouteConfigEntry>;
2268type RSCRouteManifest = {
2269 clientAction?: ClientActionFunction;
2270 clientLoader?: ClientLoaderFunction;
2271 element?: React.ReactElement | false;
2272 errorElement?: React.ReactElement;
2273 handle?: any;
2274 hasAction: boolean;
2275 hasComponent: boolean;
2276 hasLoader: boolean;
2277 hydrateFallbackElement?: React.ReactElement;
2278 id: string;
2279 index?: boolean;
2280 links?: LinksFunction;
2281 meta?: MetaFunction;
2282 parentId?: string;
2283 path?: string;
2284 shouldRevalidate?: ShouldRevalidateFunction;
2285};
2286type RSCRouteMatch = RSCRouteManifest & {
2287 params: Params;
2288 pathname: string;
2289 pathnameBase: string;
2290};
2291type RSCRenderPayload = {
2292 type: "render";
2293 actionData: Record<string, any> | null;
2294 basename: string | undefined;
2295 errors: Record<string, any> | null;
2296 loaderData: Record<string, any>;
2297 location: Location;
2298 routeDiscovery: RouteDiscovery;
2299 matches: RSCRouteMatch[];
2300 patches?: Promise<RSCRouteManifest[]>;
2301 nonce?: string;
2302 formState?: unknown;
2303};
2304type RSCManifestPayload = {
2305 type: "manifest";
2306 patches: Promise<RSCRouteManifest[]>;
2307};
2308type RSCActionPayload = {
2309 type: "action";
2310 actionResult: Promise<unknown>;
2311 rerender?: Promise<RSCRenderPayload | RSCRedirectPayload>;
2312};
2313type RSCRedirectPayload = {
2314 type: "redirect";
2315 status: number;
2316 location: string;
2317 replace: boolean;
2318 reload: boolean;
2319 actionResult?: Promise<unknown>;
2320};
2321type RSCPayload = RSCRenderPayload | RSCManifestPayload | RSCActionPayload | RSCRedirectPayload;
2322type RSCMatch = {
2323 statusCode: number;
2324 headers: Headers;
2325 payload: RSCPayload;
2326};
2327type DecodeActionFunction = (formData: FormData) => Promise<() => Promise<unknown>>;
2328type DecodeFormStateFunction = (result: unknown, formData: FormData) => unknown;
2329type DecodeReplyFunction = (reply: FormData | string, options: {
2330 temporaryReferences: unknown;
2331}) => Promise<unknown[]>;
2332type LoadServerActionFunction = (id: string) => Promise<Function>;
2333type RouteDiscovery = {
2334 mode: "lazy";
2335 manifestPath?: string | undefined;
2336} | {
2337 mode: "initial";
2338};
2339/**
2340 * Matches the given routes to a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)
2341 * and returns an [RSC](https://react.dev/reference/rsc/server-components)
2342 * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2343 * encoding an {@link unstable_RSCPayload} for consumption by an [RSC](https://react.dev/reference/rsc/server-components)
2344 * enabled client router.
2345 *
2346 * @example
2347 * import {
2348 * createTemporaryReferenceSet,
2349 * decodeAction,
2350 * decodeReply,
2351 * loadServerAction,
2352 * renderToReadableStream,
2353 * } from "@vitejs/plugin-rsc/rsc";
2354 * import { unstable_matchRSCServerRequest as matchRSCServerRequest } from "react-router";
2355 *
2356 * matchRSCServerRequest({
2357 * createTemporaryReferenceSet,
2358 * decodeAction,
2359 * decodeFormState,
2360 * decodeReply,
2361 * loadServerAction,
2362 * request,
2363 * routes: routes(),
2364 * generateResponse(match) {
2365 * return new Response(
2366 * renderToReadableStream(match.payload),
2367 * {
2368 * status: match.statusCode,
2369 * headers: match.headers,
2370 * }
2371 * );
2372 * },
2373 * });
2374 *
2375 * @name unstable_matchRSCServerRequest
2376 * @public
2377 * @category RSC
2378 * @mode data
2379 * @param opts Options
2380 * @param opts.allowedActionOrigins Origin patterns that are allowed to execute actions.
2381 * @param opts.basename The basename to use when matching the request.
2382 * @param opts.createTemporaryReferenceSet A function that returns a temporary
2383 * reference set for the request, used to track temporary references in the [RSC](https://react.dev/reference/rsc/server-components)
2384 * stream.
2385 * @param opts.decodeAction Your `react-server-dom-xyz/server`'s `decodeAction`
2386 * function, responsible for loading a server action.
2387 * @param opts.decodeFormState A function responsible for decoding form state for
2388 * progressively enhanceable forms with React's [`useActionState`](https://react.dev/reference/react/useActionState)
2389 * using your `react-server-dom-xyz/server`'s `decodeFormState`.
2390 * @param opts.decodeReply Your `react-server-dom-xyz/server`'s `decodeReply`
2391 * function, used to decode the server function's arguments and bind them to the
2392 * implementation for invocation by the router.
2393 * @param opts.generateResponse A function responsible for using your
2394 * `renderToReadableStream` to generate a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2395 * encoding the {@link unstable_RSCPayload}.
2396 * @param opts.loadServerAction Your `react-server-dom-xyz/server`'s
2397 * `loadServerAction` function, used to load a server action by ID.
2398 * @param opts.onError An optional error handler that will be called with any
2399 * errors that occur during the request processing.
2400 * @param opts.request The [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)
2401 * to match against.
2402 * @param opts.requestContext An instance of {@link RouterContextProvider}
2403 * that should be created per request, to be passed to [`action`](../../start/data/route-object#action)s,
2404 * [`loader`](../../start/data/route-object#loader)s and [middleware](../../how-to/middleware).
2405 * @param opts.routeDiscovery The route discovery configuration, used to determine how the router should discover new routes during navigations.
2406 * @param opts.routes Your {@link unstable_RSCRouteConfigEntry | route definitions}.
2407 * @returns A [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
2408 * that contains the [RSC](https://react.dev/reference/rsc/server-components)
2409 * data for hydration.
2410 */
2411declare function matchRSCServerRequest({
2412 allowedActionOrigins,
2413 createTemporaryReferenceSet,
2414 basename,
2415 decodeReply,
2416 requestContext,
2417 routeDiscovery,
2418 loadServerAction,
2419 decodeAction,
2420 decodeFormState,
2421 onError,
2422 request,
2423 routes,
2424 generateResponse
2425}: {
2426 allowedActionOrigins?: string[];
2427 createTemporaryReferenceSet: () => unknown;
2428 basename?: string;
2429 decodeReply?: DecodeReplyFunction;
2430 decodeAction?: DecodeActionFunction;
2431 decodeFormState?: DecodeFormStateFunction;
2432 requestContext?: RouterContextProvider;
2433 loadServerAction?: LoadServerActionFunction;
2434 onError?: (error: unknown) => void;
2435 request: Request;
2436 routes: RSCRouteConfigEntry[];
2437 routeDiscovery?: RouteDiscovery;
2438 generateResponse: (match: RSCMatch, {
2439 onError,
2440 temporaryReferences
2441 }: {
2442 onError(error: unknown): string | undefined;
2443 temporaryReferences: unknown;
2444 }) => Response;
2445}): Promise<Response>;
2446//#endregion
2447//#region lib/types/register.d.ts
2448/**
2449 * Apps can use this interface to "register" app-wide types for React Router via interface declaration merging and module augmentation.
2450 * React Router should handle this for you via type generation.
2451 *
2452 * For more on declaration merging and module augmentation, see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation .
2453 */
2454interface Register {}
2455type AnyParams = Record<string, string | undefined>;
2456type AnyPages = Record<string, {
2457 params: AnyParams;
2458}>;
2459type Pages = Register extends {
2460 pages: infer Registered extends AnyPages;
2461} ? Registered : AnyPages;
2462//#endregion
2463//#region lib/href.d.ts
2464type Args = { [K in keyof Pages]: ToArgs<Pages[K]["params"]> };
2465type ToArgs<Params extends Record<string, string | undefined>> = Equal<Params, {}> extends true ? [] : Partial<Params> extends Params ? [Params] | [] : [Params];
2466/**
2467 Returns a resolved URL path for the specified route.
2468
2469 ```tsx
2470 const h = href("/:lang?/about", { lang: "en" })
2471 // -> `/en/about`
2472
2473 <Link to={href("/products/:id", { id: "abc123" })} />
2474 ```
2475 */
2476declare function href<Path extends keyof Args>(path: Path, ...args: Args[Path]): string;
2477//#endregion
2478//#region lib/server-runtime/cookies.d.ts
2479interface CookieSignatureOptions {
2480 /**
2481 * An array of secrets that may be used to sign/unsign the value of a cookie.
2482 *
2483 * The array makes it easy to rotate secrets. New secrets should be added to
2484 * the beginning of the array. `cookie.serialize()` will always use the first
2485 * value in the array, but `cookie.parse()` may use any of them so that
2486 * cookies that were signed with older secrets still work.
2487 */
2488 secrets?: string[];
2489}
2490type CookieOptions = CookieParseOptions & CookieSerializeOptions & CookieSignatureOptions;
2491/**
2492 * A HTTP cookie.
2493 *
2494 * A Cookie is a logical container for metadata about a HTTP cookie; its name
2495 * and options. But it doesn't contain a value. Instead, it has `parse()` and
2496 * `serialize()` methods that allow a single instance to be reused for
2497 * parsing/encoding multiple different values.
2498 *
2499 * @see https://remix.run/utils/cookies#cookie-api
2500 */
2501interface Cookie {
2502 /**
2503 * The name of the cookie, used in the `Cookie` and `Set-Cookie` headers.
2504 */
2505 readonly name: string;
2506 /**
2507 * True if this cookie uses one or more secrets for verification.
2508 */
2509 readonly isSigned: boolean;
2510 /**
2511 * The Date this cookie expires.
2512 *
2513 * Note: This is calculated at access time using `maxAge` when no `expires`
2514 * option is provided to `createCookie()`.
2515 */
2516 readonly expires?: Date;
2517 /**
2518 * Parses a raw `Cookie` header and returns the value of this cookie or
2519 * `null` if it's not present.
2520 */
2521 parse(cookieHeader: string | null, options?: CookieParseOptions): Promise<any>;
2522 /**
2523 * Serializes the given value to a string and returns the `Set-Cookie`
2524 * header.
2525 */
2526 serialize(value: any, options?: CookieSerializeOptions): Promise<string>;
2527}
2528/**
2529 * Creates a logical container for managing a browser cookie from the server.
2530 */
2531declare const createCookie: (name: string, cookieOptions?: CookieOptions) => Cookie;
2532type IsCookieFunction = (object: any) => object is Cookie;
2533/**
2534 * Returns true if an object is a Remix cookie container.
2535 *
2536 * @see https://remix.run/utils/cookies#iscookie
2537 */
2538declare const isCookie: IsCookieFunction;
2539//#endregion
2540//#region lib/server-runtime/sessions.d.ts
2541/**
2542 * An object of name/value pairs to be used in the session.
2543 */
2544interface SessionData {
2545 [name: string]: any;
2546}
2547/**
2548 * Session persists data across HTTP requests.
2549 *
2550 * @see https://reactrouter.com/explanation/sessions-and-cookies#sessions
2551 */
2552interface Session<Data = SessionData, FlashData = Data> {
2553 /**
2554 * A unique identifier for this session.
2555 *
2556 * Note: This will be the empty string for newly created sessions and
2557 * sessions that are not backed by a database (i.e. cookie-based sessions).
2558 */
2559 readonly id: string;
2560 /**
2561 * The raw data contained in this session.
2562 *
2563 * This is useful mostly for SessionStorage internally to access the raw
2564 * session data to persist.
2565 */
2566 readonly data: FlashSessionData<Data, FlashData>;
2567 /**
2568 * Returns `true` if the session has a value for the given `name`, `false`
2569 * otherwise.
2570 */
2571 has(name: (keyof Data | keyof FlashData) & string): boolean;
2572 /**
2573 * Returns the value for the given `name` in this session.
2574 */
2575 get<Key extends (keyof Data | keyof FlashData) & string>(name: Key): (Key extends keyof Data ? Data[Key] : undefined) | (Key extends keyof FlashData ? FlashData[Key] : undefined) | undefined;
2576 /**
2577 * Sets a value in the session for the given `name`.
2578 */
2579 set<Key extends keyof Data & string>(name: Key, value: Data[Key]): void;
2580 /**
2581 * Sets a value in the session that is only valid until the next `get()`.
2582 * This can be useful for temporary values, like error messages.
2583 */
2584 flash<Key extends keyof FlashData & string>(name: Key, value: FlashData[Key]): void;
2585 /**
2586 * Removes a value from the session.
2587 */
2588 unset(name: keyof Data & string): void;
2589}
2590type FlashSessionData<Data, FlashData> = Partial<Data & { [Key in keyof FlashData as FlashDataKey<Key & string>]: FlashData[Key] }>;
2591type FlashDataKey<Key extends string> = `__flash_${Key}__`;
2592type CreateSessionFunction = <Data = SessionData, FlashData = Data>(initialData?: Data, id?: string) => Session<Data, FlashData>;
2593/**
2594 * Creates a new Session object.
2595 *
2596 * Note: This function is typically not invoked directly by application code.
2597 * Instead, use a `SessionStorage` object's `getSession` method.
2598 */
2599declare const createSession: CreateSessionFunction;
2600type IsSessionFunction = (object: any) => object is Session;
2601/**
2602 * Returns true if an object is a React Router session.
2603 *
2604 * @see https://reactrouter.com/api/utils/isSession
2605 */
2606declare const isSession: IsSessionFunction;
2607/**
2608 * SessionStorage stores session data between HTTP requests and knows how to
2609 * parse and create cookies.
2610 *
2611 * A SessionStorage creates Session objects using a `Cookie` header as input.
2612 * Then, later it generates the `Set-Cookie` header to be used in the response.
2613 */
2614interface SessionStorage<Data = SessionData, FlashData = Data> {
2615 /**
2616 * Parses a Cookie header from a HTTP request and returns the associated
2617 * Session. If there is no session associated with the cookie, this will
2618 * return a new Session with no data.
2619 */
2620 getSession: (cookieHeader?: string | null, options?: CookieParseOptions$1) => Promise<Session<Data, FlashData>>;
2621 /**
2622 * Stores all data in the Session and returns the Set-Cookie header to be
2623 * used in the HTTP response.
2624 */
2625 commitSession: (session: Session<Data, FlashData>, options?: CookieSerializeOptions$1) => Promise<string>;
2626 /**
2627 * Deletes all data associated with the Session and returns the Set-Cookie
2628 * header to be used in the HTTP response.
2629 */
2630 destroySession: (session: Session<Data, FlashData>, options?: CookieSerializeOptions$1) => Promise<string>;
2631}
2632/**
2633 * SessionIdStorageStrategy is designed to allow anyone to easily build their
2634 * own SessionStorage using `createSessionStorage(strategy)`.
2635 *
2636 * This strategy describes a common scenario where the session id is stored in
2637 * a cookie but the actual session data is stored elsewhere, usually in a
2638 * database or on disk. A set of create, read, update, and delete operations
2639 * are provided for managing the session data.
2640 */
2641interface SessionIdStorageStrategy<Data = SessionData, FlashData = Data> {
2642 /**
2643 * The Cookie used to store the session id, or options used to automatically
2644 * create one.
2645 */
2646 cookie?: Cookie | (CookieOptions & {
2647 name?: string;
2648 });
2649 /**
2650 * Creates a new record with the given data and returns the session id.
2651 */
2652 createData: (data: FlashSessionData<Data, FlashData>, expires?: Date) => Promise<string>;
2653 /**
2654 * Returns data for a given session id, or `null` if there isn't any.
2655 */
2656 readData: (id: string) => Promise<FlashSessionData<Data, FlashData> | null>;
2657 /**
2658 * Updates data for the given session id.
2659 */
2660 updateData: (id: string, data: FlashSessionData<Data, FlashData>, expires?: Date) => Promise<void>;
2661 /**
2662 * Deletes data for a given session id from the data store.
2663 */
2664 deleteData: (id: string) => Promise<void>;
2665}
2666/**
2667 * Creates a SessionStorage object using a SessionIdStorageStrategy.
2668 *
2669 * Note: This is a low-level API that should only be used if none of the
2670 * existing session storage options meet your requirements.
2671 */
2672declare function createSessionStorage<Data = SessionData, FlashData = Data>({
2673 cookie: cookieArg,
2674 createData,
2675 readData,
2676 updateData,
2677 deleteData
2678}: SessionIdStorageStrategy<Data, FlashData>): SessionStorage<Data, FlashData>;
2679//#endregion
2680//#region lib/server-runtime/sessions/cookieStorage.d.ts
2681interface CookieSessionStorageOptions {
2682 /**
2683 * The Cookie used to store the session data on the client, or options used
2684 * to automatically create one.
2685 */
2686 cookie?: SessionIdStorageStrategy["cookie"];
2687}
2688/**
2689 * Creates and returns a SessionStorage object that stores all session data
2690 * directly in the session cookie itself.
2691 *
2692 * This has the advantage that no database or other backend services are
2693 * needed, and can help to simplify some load-balanced scenarios. However, it
2694 * also has the limitation that serialized session data may not exceed the
2695 * browser's maximum cookie size. Trade-offs!
2696 */
2697declare function createCookieSessionStorage<Data = SessionData, FlashData = Data>({
2698 cookie: cookieArg
2699}?: CookieSessionStorageOptions): SessionStorage<Data, FlashData>;
2700//#endregion
2701//#region lib/server-runtime/sessions/memoryStorage.d.ts
2702interface MemorySessionStorageOptions {
2703 /**
2704 * The Cookie used to store the session id on the client, or options used
2705 * to automatically create one.
2706 */
2707 cookie?: SessionIdStorageStrategy["cookie"];
2708}
2709/**
2710 * Creates and returns a simple in-memory SessionStorage object, mostly useful
2711 * for testing and as a reference implementation.
2712 *
2713 * Note: This storage does not scale beyond a single process, so it is not
2714 * suitable for most production scenarios.
2715 */
2716declare function createMemorySessionStorage<Data = SessionData, FlashData = Data>({
2717 cookie
2718}?: MemorySessionStorageOptions): SessionStorage<Data, FlashData>;
2719//#endregion
2720export { Await, BrowserRouter, type Cookie, type CookieOptions, type CookieParseOptions, type CookieSerializeOptions, type CookieSignatureOptions, type FlashSessionData, Form, HashRouter, type IsCookieFunction, type IsSessionFunction, Link, Links, MemoryRouter, Meta, type MiddlewareFunction, type MiddlewareNextFunction, NavLink, Navigate, Outlet, Route, Router, type RouterContext, RouterContextProvider, RouterProvider, Routes, ScrollRestoration, type Session, type SessionData, type SessionIdStorageStrategy, type SessionStorage, StaticRouter, StaticRouterProvider, createContext, createCookie, createCookieSessionStorage, createMemorySessionStorage, createSession, createSessionStorage, createStaticHandler, data, href, isCookie, isRouteErrorResponse, isSession, matchRoutes, redirect, redirectDocument, replace$1 as replace, type DecodeActionFunction as unstable_DecodeActionFunction, type DecodeFormStateFunction as unstable_DecodeFormStateFunction, type DecodeReplyFunction as unstable_DecodeReplyFunction, unstable_HistoryRouter, type LoadServerActionFunction as unstable_LoadServerActionFunction, type RSCManifestPayload as unstable_RSCManifestPayload, type RSCMatch as unstable_RSCMatch, type RSCPayload as unstable_RSCPayload, type RSCRenderPayload as unstable_RSCRenderPayload, type RSCRouteConfig as unstable_RSCRouteConfig, type RSCRouteConfigEntry as unstable_RSCRouteConfigEntry, type RSCRouteManifest as unstable_RSCRouteManifest, type RSCRouteMatch as unstable_RSCRouteMatch, getRequest as unstable_getRequest, matchRSCServerRequest as unstable_matchRSCServerRequest };
\No newline at end of file