import {Serializer, ListOptions, RequiredOptions} from "./types"; export const defaultDecoder = JSON.parse; export const defaultEncoder = JSON.stringify; export const stringSerializer: Serializer = { encode: (value: string) => value, decode: (value: string) => value, } export const numberSerializer: Serializer = { encode: (value: number) => value.toString(), decode: (value: string) => parseInt(value) } export const booleanSerializer: Serializer = { encode: (value: boolean) => value ? "true" : "false", decode: (value: string) => value === "true", } export const datetimeSerializer: Serializer = { encode: (value: Date) => value.toISOString(), decode: (value: string) => new Date(value), } export const dateSerializer: Serializer = { encode: (value: Date) => value.toISOString().split('T')[0] || "", decode: (value: string) => new Date(`${value}T00:00:00Z`), } export const decodeParam = (param: string, decoder: (value: string) => T = defaultDecoder) => { return decoder(decodeURIComponent(param)) as T; } export const encodeParam = (param: T, encoder: (value: T) => string = defaultEncoder) => { return encodeURIComponent(encoder(param)); } type BuilderLike = { state: RequiredOptions } export const createListSerializer = ({separator , item}: ListOptions) => { return { encode: (value: unknown[]) => { const builder = item as unknown as BuilderLike; const {encode} = builder.state; return value.map((item) => encode(item)).join(separator); }, decode: (value: string) => { const builder = item as unknown as BuilderLike; const {encode} = builder.state; if (!value) { return [] } return value.split(separator || ",").map((item) => encode(item)) } } }