import { Middleware } from './compose.ts';import { HookManager, HookContextData, HookContext, HookContextConstructor, HookOptions} from './base.ts';import { functionHooks, hookDecorator, objectHooks, HookMap } from './hooks.ts';
export * from './hooks.ts';export * from './compose.ts';export * from './base.ts';
export interface WrapperAddon<F> { original: F; Context: HookContextConstructor; createContext: (data?: HookContextData) => HookContext;}
export type WrappedFunction<F, T> = F&((...rest: any[]) => Promise<T>|Promise<HookContext>)&WrapperAddon<F>;
export type MiddlewareOptions = { params?: any; defaults?: any; props?: any;};
export function middleware (mw?: Middleware[], options?: MiddlewareOptions) { const manager = new HookManager().middleware(mw);
if (options) { if (options.params) { manager.params(...options.params); }
if (options.defaults) { manager.defaults(options.defaults); }
if (options.props) { manager.props(options.props); } }
return manager;}
export function hooks<F, T = any> ( fn: F&(() => void), manager?: HookManager): WrappedFunction<F, T>;
export function hooks<O> (obj: O|(new (...args: any[]) => O), hookMap: HookMap<O>|Middleware[]): O;
export function hooks<T = any> ( manager?: HookOptions): any;
export function hooks (...args: any[]) { const [ target, _hooks ] = args;
if (typeof target === 'function' && (_hooks instanceof HookManager || Array.isArray(_hooks) || args.length === 1)) { return functionHooks(target, _hooks); }
if (args.length === 2) { return objectHooks(target, _hooks); }
return hookDecorator(target);}