From 6d25c26e6112c9b98484e4fa4ccff22a6a79fdef Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 14 Aug 2025 09:38:27 +0200 Subject: [PATCH] feat: expose param parser type --- packages/router/src/experimental/index.ts | 1 + .../matchers/matcher-pattern.ts | 28 +++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/router/src/experimental/index.ts b/packages/router/src/experimental/index.ts index 62b19995..8e04a942 100644 --- a/packages/router/src/experimental/index.ts +++ b/packages/router/src/experimental/index.ts @@ -40,6 +40,7 @@ export type { MatcherPatternQuery, MatcherParamsFormatted, EmptyParams, + ParamParser, } from './route-resolver/matchers/matcher-pattern' import type { RouteRecordNormalized } from '../matcher/types' diff --git a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts index e0202508..f7321d3e 100644 --- a/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts +++ b/packages/router/src/experimental/route-resolver/matchers/matcher-pattern.ts @@ -120,7 +120,7 @@ export class MatcherPatternPathStar // new MatcherPatternPathStatic('/') // new MatcherPatternPathStatic('/team') -export interface Param_GetSet< +export interface ParamParser< TOut = string | string[] | null, TIn extends string | string[] | null = string | string[] | null, > { @@ -129,8 +129,8 @@ export interface Param_GetSet< } export type ParamParser_Generic = - | Param_GetSet - | Param_GetSet + | ParamParser + | ParamParser // TODO: these are possible values for optional params // | null | undefined @@ -143,18 +143,18 @@ export type ParamParser_Generic = export function defineParamParser(parser: { get?: (value: TIn) => TOut set?: (value: TOut) => TIn -}): Param_GetSet { +}): ParamParser { return parser } const PATH_PARAM_DEFAULT_GET = (value: string | string[] | null | undefined) => value ?? null -export const PATH_PARAM_SINGLE_DEFAULT: Param_GetSet = {} +export const PATH_PARAM_SINGLE_DEFAULT: ParamParser = {} const PATH_PARAM_DEFAULT_SET = (value: unknown) => value && Array.isArray(value) ? value.map(String) : String(value) // TODO: `(value an null | undefined)` for types -export const PATH_PARAM_DEFAULT_PARSER: Param_GetSet = { +export const PATH_PARAM_DEFAULT_PARSER: ParamParser = { get: PATH_PARAM_DEFAULT_GET, set: PATH_PARAM_DEFAULT_SET, } @@ -185,7 +185,7 @@ export const PATH_PARAM_DEFAULT_PARSER: Param_GetSet = { */ export type ParamsFromParsers

> = { - [K in keyof P]: P[K] extends Param_GetSet + [K in keyof P]: P[K] extends ParamParser ? unknown extends TOut // if any or unknown, use the value of TIn, which defaults to string | string[] ? TIn : TOut @@ -195,7 +195,7 @@ export type ParamsFromParsers

> = { interface MatcherPatternPathCustomParamOptions< TIn extends string | string[] | null = string | string[] | null, TOut = string | string[] | null, -> extends Param_GetSet { +> extends ParamParser { repeat?: boolean // NOTE: not needed because in the regexp, the value is undefined if // the group is optional and not given @@ -228,33 +228,33 @@ export const PARAM_INTEGER_SINGLE = { throw miss() }, set: (value: number) => String(value), -} satisfies Param_GetSet +} satisfies ParamParser 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 Param_GetSet +} satisfies ParamParser export const PARAM_NUMBER_REPEATABLE = { get: (value: string[]) => value.map(PARAM_INTEGER_SINGLE.get), set: (value: number[]) => value.map(PARAM_INTEGER_SINGLE.set), -} satisfies Param_GetSet +} satisfies ParamParser 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 Param_GetSet +} satisfies ParamParser /** * Native Param parser for integers. * * @internal */ -export const PARAM_PARSER_INT: Param_GetSet = { +export const PARAM_PARSER_INT: ParamParser = { get: value => Array.isArray(value) ? PARAM_NUMBER_REPEATABLE.get(value) @@ -338,7 +338,7 @@ export class MatcherPatternPathCustomParams< } const paramName = this.paramsKeys[paramIndex++] const paramOptions = this.params[paramName] - const value: ReturnType> = ( + const value: ReturnType> = ( paramOptions.set || identityFn )(params[paramName]) -- 2.47.3