import type { ParamParser } from './types'
-// TODO: these are possible values for optional params
-// | null | undefined
/**
* Type safe helper to define a param parser.
*
* @param parser - the parser to define. Will be returned as is.
*/
/*! #__NO_SIDE_EFFECTS__ */
-
export function defineParamParser<TOut, TIn extends string | string[]>(parser: {
get?: (value: TIn) => TOut
set?: (value: TOut) => TIn
}): ParamParser<TOut, TIn> {
return parser
}
+
export const PATH_PARAM_DEFAULT_GET = (
value: string | string[] | null | undefined
) => value ?? null
-export const PATH_PARAM_SINGLE_DEFAULT: ParamParser<string, string> = {}
export const PATH_PARAM_DEFAULT_SET = (
value: string | string[] | null | undefined
) => (value && Array.isArray(value) ? value.map(String) : String(value)) // TODO: `(value an null | undefined)` for types
+export const PATH_PARAM_SINGLE_DEFAULT: ParamParser<string, string> = {}
export const PATH_PARAM_DEFAULT_PARSER: ParamParser = {
get: PATH_PARAM_DEFAULT_GET,
set: PATH_PARAM_DEFAULT_SET,
}
-export { ParamParser }
+export type { ParamParser }
export { PARAM_PARSER_INT } from './numbers'
import { miss } from '../errors'
import { ParamParser } from './types'
+/**
+ * @internal
+ */
+const IS_INTEGER_RE = /^-?\d+$/
+
export const PARAM_INTEGER_SINGLE = {
get: (value: string) => {
if (IS_INTEGER_RE.test(value)) {
},
set: (value: number) => String(value),
} satisfies ParamParser<number, string>
-export const IS_INTEGER_RE = /^-?\d+$/
+
export const PARAM_NUMBER_OPTIONAL = {
get: (value: string | null) =>
value == null ? null : PARAM_INTEGER_SINGLE.get(value),
set: (value: number | null) =>
value != null ? PARAM_INTEGER_SINGLE.set(value) : null,
} satisfies ParamParser<number | null, string | null>
+
export const PARAM_NUMBER_REPEATABLE = {
get: (value: string[]) => value.map(PARAM_INTEGER_SINGLE.get),
set: (value: number[]) => value.map(PARAM_INTEGER_SINGLE.set),
} satisfies ParamParser<number[], string[]>
+
export const PARAM_NUMBER_REPEATABLE_OPTIONAL = {
get: (value: string[] | null) =>
value == null ? null : PARAM_NUMBER_REPEATABLE.get(value),
set: (value: number[] | null) =>
value != null ? PARAM_NUMBER_REPEATABLE.set(value) : null,
-} satisfies ParamParser<number[] | null, string[] | null> /**
+} satisfies ParamParser<number[] | null, string[] | null>
+
+/**
* Native Param parser for integers.
*
* @internal
*/
-
export const PARAM_PARSER_INT: ParamParser<number | number[] | null> = {
get: value =>
Array.isArray(value)