@@ -37,49 +37,65 @@ export type BaseMapperFunction<QueryFunction extends BaseQueryFunction> = (
3737 result : Awaited < ReturnType < QueryFunction > > ,
3838) => unknown ;
3939
40- export type QueryAction < Handler extends BaseQueryFunction > = (
41- ...params : Parameters < Handler >
42- ) => {
43- query : ( ) => ReturnType < Handler > ;
44- run : ( ) => ReturnType < Handler > ;
45- } ;
46-
47- export type MappedAction <
48- Handler extends BaseQueryFunction ,
49- Mapper extends BaseMapperFunction < Handler > ,
50- > = ( ...params : Parameters < Handler > ) => {
51- run : ( ) => Promise < ReturnType < Mapper > > ;
52- query : ( ) => ReturnType < Handler > ;
53- map : Mapper ;
54- } ;
40+ export type BasePreProcessorFunction < QueryFunction extends BaseQueryFunction > =
41+ (
42+ ...args : any [ ]
43+ ) => Parameters < QueryFunction > | Promise < Parameters < QueryFunction > > ;
5544
5645export const actionBuilder = <
5746 Handler extends BaseQueryFunction ,
47+ PreProcessor extends
48+ | BasePreProcessorFunction < Handler >
49+ | undefined = undefined ,
5850 Mapper extends BaseMapperFunction < Handler > | undefined = undefined ,
5951> (
6052 handler : Handler ,
6153 mapper ?: Mapper ,
62- ) : ( ( ...params : Parameters < Handler > ) => Action < Handler , Mapper > ) => {
63- return ( ...params : Parameters < Handler > ) => {
54+ preProcessor ?: PreProcessor ,
55+ ) : ( (
56+ ...params : PreProcessor extends BasePreProcessorFunction < Handler >
57+ ? Parameters < PreProcessor >
58+ : Parameters < Handler >
59+ ) => Action < Handler , Mapper , PreProcessor > ) => {
60+ return ( ...params ) => {
6461 return {
65- query : ( ( ) => handler ( ...params ) ) as Handler ,
66- run : ( mapper
67- ? async ( ) => mapper ( await handler ( ...params ) )
68- : ( ) => handler ( ...params ) ) as Action < Handler , Mapper > [ "run" ] ,
62+ params,
63+ query : handler ,
64+ run : ( async ( ) => {
65+ let handlerParams = params as
66+ | ( PreProcessor extends BasePreProcessorFunction < Handler >
67+ ? Awaited < ReturnType < PreProcessor > >
68+ : Parameters < Handler > )
69+ | Parameters < Handler > ;
70+
71+ if ( preProcessor ) {
72+ handlerParams = await preProcessor ( ...params ) ;
73+ }
74+ const queryResult = await handler ( ...handlerParams ) ;
75+ return mapper ?.( queryResult ) ?? queryResult ;
76+ } ) as Action < Handler , Mapper , PreProcessor > [ "run" ] ,
6977 map : mapper ,
78+ preProcess : preProcessor ,
7079 } ;
7180 } ;
7281} ;
7382
7483export type Action <
7584 Handler extends BaseQueryFunction ,
7685 Mapper extends BaseMapperFunction < Handler > | undefined = undefined ,
86+ PreProcessor extends
87+ | BasePreProcessorFunction < Handler >
88+ | undefined = undefined ,
7789> = {
7890 query : Handler ;
7991 run : Mapper extends BaseMapperFunction < Handler >
8092 ? ( ) => Promise < ReturnType < Mapper > >
81- : ( ) => ReturnType < Handler > ;
93+ : ( ) => Promise < ReturnType < Handler > > ;
8294 map ?: Mapper ;
95+ preprocess ?: PreProcessor ;
96+ params : PreProcessor extends BasePreProcessorFunction < Handler >
97+ ? Parameters < PreProcessor >
98+ : Parameters < Handler > ;
8399} ;
84100
85101export type Result < T extends ( ...args : any ) => any > = Awaited < ReturnType < T > > ;
0 commit comments