import { z, type ZodType } from 'zod'; // Explicit return type structures capturing the .schema attachment export type WrappedFn any> = (( input: z.input ) => ReturnType) & { schema: Arg1 }; export type WrappedDoubleFn< Arg1 extends ZodType, Arg2 extends ZodType, Callback extends (...args: any[]) => any > = ((input1: z.input, input2: z.input) => ReturnType) & { schemas: [Arg1, Arg2]; }; // Single Argument Function export function fn) => any>( arg1: Arg1, cb: Callback ): WrappedFn { const result = Object.assign( function (input: z.input): ReturnType { const parsed = arg1.parse(input); return cb(parsed); }, { schema: arg1 } ); return result; } // Double Argument Function export function doublefn< Arg1 extends ZodType, Arg2 extends ZodType, Callback extends (arg1: z.output, arg2: z.output) => any >(arg1: Arg1, arg2: Arg2, cb: Callback): WrappedDoubleFn { const result = Object.assign( function (input: z.input, input2: z.input): ReturnType { const parsed = arg1.parse(input); const parsed2 = arg2.parse(input2); return cb(parsed, parsed2); }, { schemas: [arg1, arg2] as [Arg1, Arg2] } ); return result; }