ts-observe
Version:
A simple library to create wrapping middlewares for all sort of functions, classes, methods and accessors. This library enables you to decorate (wrap for standalone functions) with before and after middlewares. This approach let's you abstract from the co
32 lines (31 loc) • 2.21 kB
TypeScript
export declare function observe<TArgs extends any[], TReturn>(fn: (...args: TArgs) => TReturn, executeBefore?: ((context: MiddlewareContext, ...args: TArgs) => TArgs)[], executeAfter?: ((context: MiddlewareContext, result: TReturn) => TReturn)[], context?: MiddlewareContext): (...args: TArgs) => TReturn;
export interface MiddlewareContext {
/** The kind of element being decorated ('function', 'method', 'getter', 'setter', 'class'). */
kind: 'function' | 'method' | 'getter' | 'setter' | 'class';
/** The name of the method, accessor, or class. */
name: string | symbol;
/** The target object (prototype for instance members, constructor for static members/class). */
target: Function | Object;
}
export type MethodArgsMiddleware<TArgs extends any[]> = (this: any, context: MiddlewareContext, ...args: TArgs) => TArgs;
export type MethodResultMiddleware<TReturn> = (this: any, context: MiddlewareContext, result: TReturn) => TReturn;
export type ConstructorArgsMiddleware<TArgs extends any[]> = (this: null, context: MiddlewareContext, ...args: TArgs) => TArgs;
export type ConstructorInstanceMiddleware<TInstance> = (this: TInstance, context: MiddlewareContext, instance: TInstance) => TInstance | void;
export type AccessorGetArgMiddleware = (MethodArgsMiddleware<any>);
export type AccessorGetResultMiddleware<TReturn> = (this: any, context: MiddlewareContext, result: TReturn) => TReturn;
export type AccessorSetArgMiddleware<TVal> = (this: any, context: MiddlewareContext, value: TVal) => TVal;
export type AccessorSetResultMiddleware = MethodResultMiddleware<void>;
export declare function ObserveMethod(config?: {
beforeArgs?: MethodArgsMiddleware<any[]>[];
afterResult?: MethodResultMiddleware<any>[];
}): MethodDecorator;
export declare function ObserveAccessor(config?: {
beforeGet?: AccessorGetArgMiddleware[];
afterGet?: AccessorGetResultMiddleware<any>[];
beforeSet?: AccessorSetArgMiddleware<any>[];
afterSet?: AccessorSetResultMiddleware[];
}): MethodDecorator;
export declare function ObserveClass(config?: {
beforeArgs?: ConstructorArgsMiddleware<any[]>[];
afterInstance?: ConstructorInstanceMiddleware<any>[];
}): ClassDecorator;