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