import type { Jsonify } from "./jsonify"; import type { TypedDeferredData, TypedResponse } from "./responses"; import type { ClientActionFunctionArgs, ClientLoaderFunctionArgs } from "./routeModules"; import { type SerializeFrom as SingleFetch_SerializeFrom } from "./single-fetch"; import type { Future } from "./future"; type SingleFetchEnabled = Future extends { v3_singleFetch: infer T extends boolean; } ? T : false; /** * Infer JSON serialized data type returned by a loader or action, while * avoiding deserialization if the input type if it's a clientLoader or * clientAction that returns a non-Response * * For example: * `type LoaderData = SerializeFrom` * * @deprecated SerializeFrom is deprecated and will be removed in React Router * v7. Please use the generics on `useLoaderData`/etc. instead of manually * deserializing in Remix v2. You can convert to the generated types once you * migrate to React Router v7. */ export type SerializeFrom = SingleFetchEnabled extends true ? SingleFetch_SerializeFrom : T extends (...args: any[]) => infer Output ? Parameters extends [ClientLoaderFunctionArgs | ClientActionFunctionArgs] ? SerializeClient> : Serialize> : Jsonify>; type SerializeClient = Output extends TypedDeferredData ? { [K in keyof U as K extends symbol ? never : Promise extends U[K] ? K : never]: DeferValueClient; } & { [K in keyof U as Promise extends U[K] ? never : K]: U[K]; } : Output extends TypedResponse ? Jsonify : Awaited; type DeferValueClient = T extends undefined ? undefined : T extends Promise ? Promise> : T; type Serialize = Output extends TypedDeferredData ? { [K in keyof U as K extends symbol ? never : Promise extends U[K] ? K : never]: DeferValue; } & Jsonify<{ [K in keyof U as Promise extends U[K] ? never : K]: U[K]; }> : Output extends TypedResponse ? Jsonify : Jsonify; type DeferValue = T extends undefined ? undefined : T extends Promise ? Promise>> : Jsonify; export {};