123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 |
- import type { Location, Path, To } from "./history";
- /**
- * Map of routeId -> data returned from a loader/action/error
- */
- export interface RouteData {
- [routeId: string]: any;
- }
- export declare enum ResultType {
- data = "data",
- deferred = "deferred",
- redirect = "redirect",
- error = "error"
- }
- /**
- * Successful result from a loader or action
- */
- export interface SuccessResult {
- type: ResultType.data;
- data: unknown;
- statusCode?: number;
- headers?: Headers;
- }
- /**
- * Successful defer() result from a loader or action
- */
- export interface DeferredResult {
- type: ResultType.deferred;
- deferredData: DeferredData;
- statusCode?: number;
- headers?: Headers;
- }
- /**
- * Redirect result from a loader or action
- */
- export interface RedirectResult {
- type: ResultType.redirect;
- response: Response;
- }
- /**
- * Unsuccessful result from a loader or action
- */
- export interface ErrorResult {
- type: ResultType.error;
- error: unknown;
- statusCode?: number;
- headers?: Headers;
- }
- /**
- * Result from a loader or action - potentially successful or unsuccessful
- */
- export type DataResult = SuccessResult | DeferredResult | RedirectResult | ErrorResult;
- type LowerCaseFormMethod = "get" | "post" | "put" | "patch" | "delete";
- type UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;
- /**
- * Users can specify either lowercase or uppercase form methods on `<Form>`,
- * useSubmit(), `<fetcher.Form>`, etc.
- */
- export type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;
- /**
- * Active navigation/fetcher form methods are exposed in lowercase on the
- * RouterState
- */
- export type FormMethod = LowerCaseFormMethod;
- export type MutationFormMethod = Exclude<FormMethod, "get">;
- /**
- * In v7, active navigation/fetcher form methods are exposed in uppercase on the
- * RouterState. This is to align with the normalization done via fetch().
- */
- export type V7_FormMethod = UpperCaseFormMethod;
- export type V7_MutationFormMethod = Exclude<V7_FormMethod, "GET">;
- export type FormEncType = "application/x-www-form-urlencoded" | "multipart/form-data" | "application/json" | "text/plain";
- type JsonObject = {
- [Key in string]: JsonValue;
- } & {
- [Key in string]?: JsonValue | undefined;
- };
- type JsonArray = JsonValue[] | readonly JsonValue[];
- type JsonPrimitive = string | number | boolean | null;
- type JsonValue = JsonPrimitive | JsonObject | JsonArray;
- /**
- * @private
- * Internal interface to pass around for action submissions, not intended for
- * external consumption
- */
- export type Submission = {
- formMethod: FormMethod | V7_FormMethod;
- formAction: string;
- formEncType: FormEncType;
- formData: FormData;
- json: undefined;
- text: undefined;
- } | {
- formMethod: FormMethod | V7_FormMethod;
- formAction: string;
- formEncType: FormEncType;
- formData: undefined;
- json: JsonValue;
- text: undefined;
- } | {
- formMethod: FormMethod | V7_FormMethod;
- formAction: string;
- formEncType: FormEncType;
- formData: undefined;
- json: undefined;
- text: string;
- };
- /**
- * @private
- * Arguments passed to route loader/action functions. Same for now but we keep
- * this as a private implementation detail in case they diverge in the future.
- */
- interface DataFunctionArgs<Context> {
- request: Request;
- params: Params;
- context?: Context;
- }
- /**
- * Arguments passed to loader functions
- */
- export interface LoaderFunctionArgs<Context = any> extends DataFunctionArgs<Context> {
- }
- /**
- * Arguments passed to action functions
- */
- export interface ActionFunctionArgs<Context = any> extends DataFunctionArgs<Context> {
- }
- /**
- * Loaders and actions can return anything except `undefined` (`null` is a
- * valid return value if there is no data to return). Responses are preferred
- * and will ease any future migration to Remix
- */
- type DataFunctionValue = Response | NonNullable<unknown> | null;
- type DataFunctionReturnValue = Promise<DataFunctionValue> | DataFunctionValue;
- /**
- * Route loader function signature
- */
- export type LoaderFunction<Context = any> = {
- (args: LoaderFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
- } & {
- hydrate?: boolean;
- };
- /**
- * Route action function signature
- */
- export interface ActionFunction<Context = any> {
- (args: ActionFunctionArgs<Context>, handlerCtx?: unknown): DataFunctionReturnValue;
- }
- /**
- * Arguments passed to shouldRevalidate function
- */
- export interface ShouldRevalidateFunctionArgs {
- currentUrl: URL;
- currentParams: AgnosticDataRouteMatch["params"];
- nextUrl: URL;
- nextParams: AgnosticDataRouteMatch["params"];
- formMethod?: Submission["formMethod"];
- formAction?: Submission["formAction"];
- formEncType?: Submission["formEncType"];
- text?: Submission["text"];
- formData?: Submission["formData"];
- json?: Submission["json"];
- actionStatus?: number;
- actionResult?: any;
- defaultShouldRevalidate: boolean;
- }
- /**
- * Route shouldRevalidate function signature. This runs after any submission
- * (navigation or fetcher), so we flatten the navigation/fetcher submission
- * onto the arguments. It shouldn't matter whether it came from a navigation
- * or a fetcher, what really matters is the URLs and the formData since loaders
- * have to re-run based on the data models that were potentially mutated.
- */
- export interface ShouldRevalidateFunction {
- (args: ShouldRevalidateFunctionArgs): boolean;
- }
- /**
- * Function provided by the framework-aware layers to set `hasErrorBoundary`
- * from the framework-aware `errorElement` prop
- *
- * @deprecated Use `mapRouteProperties` instead
- */
- export interface DetectErrorBoundaryFunction {
- (route: AgnosticRouteObject): boolean;
- }
- export interface DataStrategyMatch extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {
- shouldLoad: boolean;
- resolve: (handlerOverride?: (handler: (ctx?: unknown) => DataFunctionReturnValue) => DataFunctionReturnValue) => Promise<DataStrategyResult>;
- }
- export interface DataStrategyFunctionArgs<Context = any> extends DataFunctionArgs<Context> {
- matches: DataStrategyMatch[];
- fetcherKey: string | null;
- }
- /**
- * Result from a loader or action called via dataStrategy
- */
- export interface DataStrategyResult {
- type: "data" | "error";
- result: unknown;
- }
- export interface DataStrategyFunction {
- (args: DataStrategyFunctionArgs): Promise<Record<string, DataStrategyResult>>;
- }
- export type AgnosticPatchRoutesOnNavigationFunctionArgs<O extends AgnosticRouteObject = AgnosticRouteObject, M extends AgnosticRouteMatch = AgnosticRouteMatch> = {
- signal: AbortSignal;
- path: string;
- matches: M[];
- fetcherKey: string | undefined;
- patch: (routeId: string | null, children: O[]) => void;
- };
- export type AgnosticPatchRoutesOnNavigationFunction<O extends AgnosticRouteObject = AgnosticRouteObject, M extends AgnosticRouteMatch = AgnosticRouteMatch> = (opts: AgnosticPatchRoutesOnNavigationFunctionArgs<O, M>) => void | Promise<void>;
- /**
- * Function provided by the framework-aware layers to set any framework-specific
- * properties from framework-agnostic properties
- */
- export interface MapRoutePropertiesFunction {
- (route: AgnosticRouteObject): {
- hasErrorBoundary: boolean;
- } & Record<string, any>;
- }
- /**
- * Keys we cannot change from within a lazy() function. We spread all other keys
- * onto the route. Either they're meaningful to the router, or they'll get
- * ignored.
- */
- export type ImmutableRouteKey = "lazy" | "caseSensitive" | "path" | "id" | "index" | "children";
- export declare const immutableRouteKeys: Set<ImmutableRouteKey>;
- type RequireOne<T, Key = keyof T> = Exclude<{
- [K in keyof T]: K extends Key ? Omit<T, K> & Required<Pick<T, K>> : never;
- }[keyof T], undefined>;
- /**
- * lazy() function to load a route definition, which can add non-matching
- * related properties to a route
- */
- export interface LazyRouteFunction<R extends AgnosticRouteObject> {
- (): Promise<RequireOne<Omit<R, ImmutableRouteKey>>>;
- }
- /**
- * Base RouteObject with common props shared by all types of routes
- */
- type AgnosticBaseRouteObject = {
- caseSensitive?: boolean;
- path?: string;
- id?: string;
- loader?: LoaderFunction | boolean;
- action?: ActionFunction | boolean;
- hasErrorBoundary?: boolean;
- shouldRevalidate?: ShouldRevalidateFunction;
- handle?: any;
- lazy?: LazyRouteFunction<AgnosticBaseRouteObject>;
- };
- /**
- * Index routes must not have children
- */
- export type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {
- children?: undefined;
- index: true;
- };
- /**
- * Non-index routes may have children, but cannot have index
- */
- export type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {
- children?: AgnosticRouteObject[];
- index?: false;
- };
- /**
- * A route object represents a logical route, with (optionally) its child
- * routes organized in a tree-like structure.
- */
- export type AgnosticRouteObject = AgnosticIndexRouteObject | AgnosticNonIndexRouteObject;
- export type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {
- id: string;
- };
- export type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {
- children?: AgnosticDataRouteObject[];
- id: string;
- };
- /**
- * A data route object, which is just a RouteObject with a required unique ID
- */
- export type AgnosticDataRouteObject = AgnosticDataIndexRouteObject | AgnosticDataNonIndexRouteObject;
- export type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>;
- type _PathParam<Path extends string> = Path extends `${infer L}/${infer R}` ? _PathParam<L> | _PathParam<R> : Path extends `:${infer Param}` ? Param extends `${infer Optional}?` ? Optional : Param : never;
- /**
- * Examples:
- * "/a/b/*" -> "*"
- * ":a" -> "a"
- * "/a/:b" -> "b"
- * "/a/blahblahblah:b" -> "b"
- * "/:a/:b" -> "a" | "b"
- * "/:a/b/:c/*" -> "a" | "c" | "*"
- */
- export type PathParam<Path extends string> = Path extends "*" | "/*" ? "*" : Path extends `${infer Rest}/*` ? "*" | _PathParam<Rest> : _PathParam<Path>;
- export type ParamParseKey<Segment extends string> = [
- PathParam<Segment>
- ] extends [never] ? string : PathParam<Segment>;
- /**
- * The parameters that were parsed from the URL path.
- */
- export type Params<Key extends string = string> = {
- readonly [key in Key]: string | undefined;
- };
- /**
- * A RouteMatch contains info about how a route matched a URL.
- */
- export interface AgnosticRouteMatch<ParamKey extends string = string, RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject> {
- /**
- * The names and values of dynamic parameters in the URL.
- */
- params: Params<ParamKey>;
- /**
- * The portion of the URL pathname that was matched.
- */
- pathname: string;
- /**
- * The portion of the URL pathname that was matched before child routes.
- */
- pathnameBase: string;
- /**
- * The route object that was used to match.
- */
- route: RouteObjectType;
- }
- export interface AgnosticDataRouteMatch extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {
- }
- export declare function convertRoutesToDataRoutes(routes: AgnosticRouteObject[], mapRouteProperties: MapRoutePropertiesFunction, parentPath?: string[], manifest?: RouteManifest): AgnosticDataRouteObject[];
- /**
- * Matches the given routes to a location and returns the match data.
- *
- * @see https://reactrouter.com/v6/utils/match-routes
- */
- export declare function matchRoutes<RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject>(routes: RouteObjectType[], locationArg: Partial<Location> | string, basename?: string): AgnosticRouteMatch<string, RouteObjectType>[] | null;
- export declare function matchRoutesImpl<RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject>(routes: RouteObjectType[], locationArg: Partial<Location> | string, basename: string, allowPartial: boolean): AgnosticRouteMatch<string, RouteObjectType>[] | null;
- export interface UIMatch<Data = unknown, Handle = unknown> {
- id: string;
- pathname: string;
- params: AgnosticRouteMatch["params"];
- data: Data;
- handle: Handle;
- }
- export declare function convertRouteMatchToUiMatch(match: AgnosticDataRouteMatch, loaderData: RouteData): UIMatch;
- /**
- * Returns a path with params interpolated.
- *
- * @see https://reactrouter.com/v6/utils/generate-path
- */
- export declare function generatePath<Path extends string>(originalPath: Path, params?: {
- [key in PathParam<Path>]: string | null;
- }): string;
- /**
- * A PathPattern is used to match on some portion of a URL pathname.
- */
- export interface PathPattern<Path extends string = string> {
- /**
- * A string to match against a URL pathname. May contain `:id`-style segments
- * to indicate placeholders for dynamic parameters. May also end with `/*` to
- * indicate matching the rest of the URL pathname.
- */
- path: Path;
- /**
- * Should be `true` if the static portions of the `path` should be matched in
- * the same case.
- */
- caseSensitive?: boolean;
- /**
- * Should be `true` if this pattern should match the entire URL pathname.
- */
- end?: boolean;
- }
- /**
- * A PathMatch contains info about how a PathPattern matched on a URL pathname.
- */
- export interface PathMatch<ParamKey extends string = string> {
- /**
- * The names and values of dynamic parameters in the URL.
- */
- params: Params<ParamKey>;
- /**
- * The portion of the URL pathname that was matched.
- */
- pathname: string;
- /**
- * The portion of the URL pathname that was matched before child routes.
- */
- pathnameBase: string;
- /**
- * The pattern that was used to match.
- */
- pattern: PathPattern;
- }
- /**
- * Performs pattern matching on a URL pathname and returns information about
- * the match.
- *
- * @see https://reactrouter.com/v6/utils/match-path
- */
- export declare function matchPath<ParamKey extends ParamParseKey<Path>, Path extends string>(pattern: PathPattern<Path> | Path, pathname: string): PathMatch<ParamKey> | null;
- export declare function decodePath(value: string): string;
- /**
- * @private
- */
- export declare function stripBasename(pathname: string, basename: string): string | null;
- /**
- * Returns a resolved path object relative to the given pathname.
- *
- * @see https://reactrouter.com/v6/utils/resolve-path
- */
- export declare function resolvePath(to: To, fromPathname?: string): Path;
- /**
- * @private
- *
- * When processing relative navigation we want to ignore ancestor routes that
- * do not contribute to the path, such that index/pathless layout routes don't
- * interfere.
- *
- * For example, when moving a route element into an index route and/or a
- * pathless layout route, relative link behavior contained within should stay
- * the same. Both of the following examples should link back to the root:
- *
- * <Route path="/">
- * <Route path="accounts" element={<Link to=".."}>
- * </Route>
- *
- * <Route path="/">
- * <Route path="accounts">
- * <Route element={<AccountsLayout />}> // <-- Does not contribute
- * <Route index element={<Link to=".."} /> // <-- Does not contribute
- * </Route
- * </Route>
- * </Route>
- */
- export declare function getPathContributingMatches<T extends AgnosticRouteMatch = AgnosticRouteMatch>(matches: T[]): T[];
- export declare function getResolveToMatches<T extends AgnosticRouteMatch = AgnosticRouteMatch>(matches: T[], v7_relativeSplatPath: boolean): string[];
- /**
- * @private
- */
- export declare function resolveTo(toArg: To, routePathnames: string[], locationPathname: string, isPathRelative?: boolean): Path;
- /**
- * @private
- */
- export declare function getToPathname(to: To): string | undefined;
- /**
- * @private
- */
- export declare const joinPaths: (paths: string[]) => string;
- /**
- * @private
- */
- export declare const normalizePathname: (pathname: string) => string;
- /**
- * @private
- */
- export declare const normalizeSearch: (search: string) => string;
- /**
- * @private
- */
- export declare const normalizeHash: (hash: string) => string;
- export type JsonFunction = <Data>(data: Data, init?: number | ResponseInit) => Response;
- /**
- * This is a shortcut for creating `application/json` responses. Converts `data`
- * to JSON and sets the `Content-Type` header.
- *
- * @deprecated The `json` method is deprecated in favor of returning raw objects.
- * This method will be removed in v7.
- */
- export declare const json: JsonFunction;
- export declare class DataWithResponseInit<D> {
- type: string;
- data: D;
- init: ResponseInit | null;
- constructor(data: D, init?: ResponseInit);
- }
- /**
- * Create "responses" that contain `status`/`headers` without forcing
- * serialization into an actual `Response` - used by Remix single fetch
- */
- export declare function data<D>(data: D, init?: number | ResponseInit): DataWithResponseInit<D>;
- export interface TrackedPromise extends Promise<any> {
- _tracked?: boolean;
- _data?: any;
- _error?: any;
- }
- export declare class AbortedDeferredError extends Error {
- }
- export declare class DeferredData {
- private pendingKeysSet;
- private controller;
- private abortPromise;
- private unlistenAbortSignal;
- private subscribers;
- data: Record<string, unknown>;
- init?: ResponseInit;
- deferredKeys: string[];
- constructor(data: Record<string, unknown>, responseInit?: ResponseInit);
- private trackPromise;
- private onSettle;
- private emit;
- subscribe(fn: (aborted: boolean, settledKey?: string) => void): () => boolean;
- cancel(): void;
- resolveData(signal: AbortSignal): Promise<boolean>;
- get done(): boolean;
- get unwrappedData(): {};
- get pendingKeys(): string[];
- }
- export type DeferFunction = (data: Record<string, unknown>, init?: number | ResponseInit) => DeferredData;
- /**
- * @deprecated The `defer` method is deprecated in favor of returning raw
- * objects. This method will be removed in v7.
- */
- export declare const defer: DeferFunction;
- export type RedirectFunction = (url: string, init?: number | ResponseInit) => Response;
- /**
- * A redirect response. Sets the status code and the `Location` header.
- * Defaults to "302 Found".
- */
- export declare const redirect: RedirectFunction;
- /**
- * A redirect response that will force a document reload to the new location.
- * Sets the status code and the `Location` header.
- * Defaults to "302 Found".
- */
- export declare const redirectDocument: RedirectFunction;
- /**
- * A redirect response that will perform a `history.replaceState` instead of a
- * `history.pushState` for client-side navigation redirects.
- * Sets the status code and the `Location` header.
- * Defaults to "302 Found".
- */
- export declare const replace: RedirectFunction;
- export type ErrorResponse = {
- status: number;
- statusText: string;
- data: any;
- };
- /**
- * @private
- * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies
- *
- * We don't export the class for public use since it's an implementation
- * detail, but we export the interface above so folks can build their own
- * abstractions around instances via isRouteErrorResponse()
- */
- export declare class ErrorResponseImpl implements ErrorResponse {
- status: number;
- statusText: string;
- data: any;
- private error?;
- private internal;
- constructor(status: number, statusText: string | undefined, data: any, internal?: boolean);
- }
- /**
- * Check if the given error is an ErrorResponse generated from a 4xx/5xx
- * Response thrown from an action/loader
- */
- export declare function isRouteErrorResponse(error: any): error is ErrorResponse;
- export {};
|