import type { Jsonify } from "./jsonify"; import type { TypedDeferredData, TypedResponse } from "./responses"; import type { ClientActionFunctionArgs, ClientLoaderFunctionArgs } from "./routeModules"; /** * 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` */ export type 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 {};