@@ -51,11 +51,13 @@ export type Mod<
5151 ModArgsValidator extends PropertyValidators ,
5252 ModCtx extends Record < string , any > ,
5353 ModMadeArgs extends Record < string , any > ,
54+ ExtraArgs extends Record < string , any > = Record < string , any > ,
5455> = {
5556 args : ModArgsValidator ;
5657 input : (
5758 ctx : Ctx ,
5859 args : ObjectType < ModArgsValidator > ,
60+ extra : ExtraArgs ,
5961 ) =>
6062 | Promise < { ctx : ModCtx ; args : ModMadeArgs } >
6163 | { ctx : ModCtx ; args : ModMadeArgs } ;
@@ -70,12 +72,13 @@ export type Mod<
7072export function customCtx <
7173 InCtx extends Record < string , any > ,
7274 OutCtx extends Record < string , any > ,
75+ ExtraArgs extends Record < string , any > = Record < string , any > ,
7376> (
74- mod : ( original : InCtx ) => Promise < OutCtx > | OutCtx ,
75- ) : Mod < InCtx , Record < string , never > , OutCtx , Record < string , never > > {
77+ mod : ( original : InCtx , extra : ExtraArgs ) => Promise < OutCtx > | OutCtx ,
78+ ) : Mod < InCtx , Record < string , never > , OutCtx , Record < string , never > , ExtraArgs > {
7679 return {
7780 args : { } ,
78- input : async ( ctx ) => ( { ctx : await mod ( ctx ) , args : { } } ) ,
81+ input : async ( ctx , _ , extra ) => ( { ctx : await mod ( ctx , extra ) , args : { } } ) ,
7982 } ;
8083}
8184
@@ -147,17 +150,25 @@ export function customQuery<
147150 ModMadeArgs extends Record < string , any > ,
148151 Visibility extends FunctionVisibility ,
149152 DataModel extends GenericDataModel ,
153+ ExtraArgs extends Record < string , any > = Record < string , any > ,
150154> (
151155 query : QueryBuilder < DataModel , Visibility > ,
152- mod : Mod < GenericQueryCtx < DataModel > , ModArgsValidator , ModCtx , ModMadeArgs > ,
156+ mod : Mod <
157+ GenericQueryCtx < DataModel > ,
158+ ModArgsValidator ,
159+ ModCtx ,
160+ ModMadeArgs ,
161+ ExtraArgs
162+ > ,
153163) {
154164 return customFnBuilder ( query , mod ) as CustomBuilder <
155165 "query" ,
156166 ModArgsValidator ,
157167 ModCtx ,
158168 ModMadeArgs ,
159169 GenericQueryCtx < DataModel > ,
160- Visibility
170+ Visibility ,
171+ ExtraArgs
161172 > ;
162173}
163174
@@ -219,13 +230,15 @@ export function customMutation<
219230 ModMadeArgs extends Record < string , any > ,
220231 Visibility extends FunctionVisibility ,
221232 DataModel extends GenericDataModel ,
233+ ExtraArgs extends Record < string , any > = Record < string , any > ,
222234> (
223235 mutation : MutationBuilder < DataModel , Visibility > ,
224236 mod : Mod <
225237 GenericMutationCtx < DataModel > ,
226238 ModArgsValidator ,
227239 ModCtx ,
228- ModMadeArgs
240+ ModMadeArgs ,
241+ ExtraArgs
229242 > ,
230243) {
231244 return customFnBuilder ( mutation , mod ) as CustomBuilder <
@@ -234,7 +247,8 @@ export function customMutation<
234247 ModCtx ,
235248 ModMadeArgs ,
236249 GenericMutationCtx < DataModel > ,
237- Visibility
250+ Visibility ,
251+ ExtraArgs
238252 > ;
239253}
240254
@@ -298,44 +312,55 @@ export function customAction<
298312 ModMadeArgs extends Record < string , any > ,
299313 Visibility extends FunctionVisibility ,
300314 DataModel extends GenericDataModel ,
315+ ExtraArgs extends Record < string , any > = Record < string , any > ,
301316> (
302317 action : ActionBuilder < DataModel , Visibility > ,
303- mod : Mod < GenericActionCtx < DataModel > , ModArgsValidator , ModCtx , ModMadeArgs > ,
318+ mod : Mod <
319+ GenericActionCtx < DataModel > ,
320+ ModArgsValidator ,
321+ ModCtx ,
322+ ModMadeArgs ,
323+ ExtraArgs
324+ > ,
304325) : CustomBuilder <
305326 "action" ,
306327 ModArgsValidator ,
307328 ModCtx ,
308329 ModMadeArgs ,
309330 GenericActionCtx < DataModel > ,
310- Visibility
331+ Visibility ,
332+ ExtraArgs
311333> {
312334 return customFnBuilder ( action , mod ) as CustomBuilder <
313335 "action" ,
314336 ModArgsValidator ,
315337 ModCtx ,
316338 ModMadeArgs ,
317339 GenericActionCtx < DataModel > ,
318- Visibility
340+ Visibility ,
341+ ExtraArgs
319342 > ;
320343}
321344
322345function customFnBuilder (
323346 builder : ( args : any ) => any ,
324- mod : Mod < any , any , any , any > ,
347+ mod : Mod < any , any , any , any , any > ,
325348) {
326349 // Looking forward to when input / args / ... are optional
327350 const inputMod = mod . input ?? NoOp . input ;
328351 const inputArgs = mod . args ?? NoOp . args ;
329352 return function customBuilder ( fn : any ) : any {
330- const handler = fn . handler ?? fn ;
331- if ( "args" in fn ) {
353+ // N.B.: This is fine if it's a function
354+ const { args, handler = fn , returns, ...extra } = fn ;
355+ if ( args ) {
332356 return builder ( {
333- args : addArgs ( fn . args , inputArgs ) ,
334- returns : fn . returns ,
357+ args : addArgs ( args , inputArgs ) ,
358+ returns,
335359 handler : async ( ctx : any , allArgs : any ) => {
336360 const added = await inputMod (
337361 ctx ,
338362 pick ( allArgs , Object . keys ( inputArgs ) ) as any ,
363+ extra ,
339364 ) ;
340365 const args = omit ( allArgs , Object . keys ( inputArgs ) ) ;
341366 return handler ( { ...ctx , ...added . ctx } , { ...args , ...added . args } ) ;
@@ -351,7 +376,7 @@ function customFnBuilder(
351376 return builder ( {
352377 returns : fn . returns ,
353378 handler : async ( ctx : any , args : any ) => {
354- const added = await inputMod ( ctx , args ) ;
379+ const added = await inputMod ( ctx , args , extra ) ;
355380 return handler ( { ...ctx , ...added . ctx } , { ...args , ...added . args } ) ;
356381 } ,
357382 } ) ;
@@ -430,6 +455,7 @@ export type CustomBuilder<
430455 ModMadeArgs extends Record < string , any > ,
431456 InputCtx ,
432457 Visibility extends FunctionVisibility ,
458+ ExtraArgs extends Record < string , any > ,
433459> = {
434460 <
435461 ArgsValidator extends PropertyValidators | void | Validator < any , any , any > ,
@@ -439,14 +465,18 @@ export type CustomBuilder<
439465 ArgsArrayForOptionalValidator < ArgsValidator > = DefaultArgsForOptionalValidator < ArgsValidator > ,
440466 > (
441467 func :
442- | {
468+ | ( {
443469 args ?: ArgsValidator ;
444470 returns ?: ReturnsValidator ;
445471 handler : (
446472 ctx : Overwrite < InputCtx , ModCtx > ,
447473 ...args : ArgsForHandlerType < OneOrZeroArgs , ModMadeArgs >
448474 ) => ReturnValue ;
449- }
475+ } & {
476+ [ key in keyof ExtraArgs as key extends "args" | "returns" | "handler"
477+ ? never
478+ : key ] : ExtraArgs [ key ] ;
479+ } )
450480 | {
451481 (
452482 ctx : Overwrite < InputCtx , ModCtx > ,
@@ -474,9 +504,10 @@ export type CustomCtx<Builder> =
474504 infer ModCtx ,
475505 any ,
476506 infer InputCtx ,
507+ any ,
477508 any
478509 >
479510 ? Overwrite < InputCtx , ModCtx >
480511 : never ;
481512
482- type Overwrite < T , U > = Omit < T , keyof U > & U ;
513+ type Overwrite < T , U > = keyof U extends never ? T : Omit < T , keyof U > & U ;
0 commit comments