import type { Jsonify } from "type-fest"; import type { AppData } from "./data"; import type { TypedDeferredData, TypedResponse } from "./responses"; type Fn = (...args: any[]) => any; /** * Infer JSON serialized data type returned by a loader or action. * * For example: * `type LoaderData = SerializeFrom` */ export type SerializeFrom = T extends (...args: any[]) => infer Output ? Awaited extends TypedResponse ? Jsonify : Awaited 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]; }> : Jsonify> : Jsonify>; type DeferValue = T extends undefined ? undefined : T extends Promise ? Promise>> : Jsonify; export {};