export interface StartSerializer { stringify: (obj: unknown) => string; parse: (str: string) => unknown; encode: (value: T) => T; decode: (value: T) => T; } export type SerializerStringifyBy = T extends TSerializable ? T : T extends (...args: Array) => any ? 'Function is not serializable' : { [K in keyof T]: SerializerStringifyBy; }; export type SerializerParseBy = T extends TSerializable ? T : unknown extends SerializerExtensions['ReadableStream'] ? { [K in keyof T]: SerializerParseBy; } : T extends SerializerExtensions['ReadableStream'] ? ReadableStream : { [K in keyof T]: SerializerParseBy; }; export interface DefaultSerializerExtensions { ReadableStream: unknown; } export interface SerializerExtensions extends DefaultSerializerExtensions { } export type Serializable = Date | undefined | Error | FormData | bigint; export type SerializerStringify = SerializerStringifyBy; export type SerializerParse = SerializerParseBy;