UNPKG

923 BTypeScriptView Raw
1import type { Jsonify } from "type-fest";
2import type { AppData } from "./data";
3import type { TypedDeferredData, TypedResponse } from "./responses";
4type Fn = (...args: any[]) => any;
5/**
6 * Infer JSON serialized data type returned by a loader or action.
7 *
8 * For example:
9 * `type LoaderData = SerializeFrom<typeof loader>`
10 */
11export type SerializeFrom<T extends AppData | Fn> = T extends (...args: any[]) => infer Output ? Awaited<Output> extends TypedResponse<infer U> ? Jsonify<U> : Awaited<Output> extends TypedDeferredData<infer U> ? {
12 [K in keyof U as K extends symbol ? never : Promise<any> extends U[K] ? K : never]: DeferValue<U[K]>;
13} & Jsonify<{
14 [K in keyof U as Promise<any> extends U[K] ? never : K]: U[K];
15}> : Jsonify<Awaited<Output>> : Jsonify<Awaited<T>>;
16type DeferValue<T> = T extends undefined ? undefined : T extends Promise<unknown> ? Promise<Jsonify<Awaited<T>>> : Jsonify<T>;
17export {};