import { QueryParamConfig } from './types'; /** * Wrap a given parameter with a default value when undefined or null (optionally, default includes null) * @param param QueryParamConfig - { encode, decode} to serialize a parameter * @param defaultValue A default value * @param includeNull */ export function withDefault( param: QueryParamConfig, defaultValue: DefaultType, includeNull?: false | undefined ): QueryParamConfig | DefaultType>; export function withDefault( param: QueryParamConfig, defaultValue: DefaultType, includeNull?: true ): QueryParamConfig | DefaultType>; export function withDefault( param: QueryParamConfig, defaultValue: DefaultType, includeNull: boolean = true ): QueryParamConfig { const decodeWithDefault = ( ...args: Parameters ): Exclude | Exclude | DefaultType => { const decodedValue = param.decode(...args); if (decodedValue === undefined) { return defaultValue; } if (includeNull) { if (decodedValue === null) { return defaultValue; } else { return decodedValue as Exclude; } } return decodedValue as Exclude; }; // note we add `default` into the param for other tools to introspect return { ...param, default: defaultValue, decode: decodeWithDefault }; } export default withDefault;